--- gcc-3.4-3.4.2.orig/debian/fixincludes.in +++ gcc-3.4-3.4.2/debian/fixincludes.in @@ -0,0 +1,8 @@ +#! /bin/sh + +PATH="/@LIBEXECDIR@/install-tools:$PATH" + +TARGET_MACHINE=`dpkg-architecture -qDEB_HOST_GNU_TYPE` +export TARGET_MACHINE + +exec fixinc.sh "$@" --- gcc-3.4-3.4.2.orig/debian/rules2 +++ gcc-3.4-3.4.2/debian/rules2 @@ -0,0 +1,1166 @@ +#! /usr/bin/make -f +# -*- makefile -*- + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +include debian/rules.defs +include debian/rules.parameters + +# some tools +SHELL = /bin/bash -e # brace expansion in rules file +IR = install -m 644 # Install regular file +IP = install -m 755 # Install program +IS = install -m 755 # Install script + +#number of jobs to run for build +ifneq ($(USE_NJOBS),) + NJOBS = -j$(shell if [ -f /proc/cpuinfo ]; \ + then echo `cat /proc/cpuinfo | grep 'processor' | wc -l`; \ + else echo 1; fi) +endif + +# kernel-specific ulimit hack +ifeq ($(DEB_HOST_GNU_SYSTEM),linux) + ULIMIT = if [ -e /proc/meminfo ]; then \ + m=`awk '/^((Mem|Swap)Free|Cached)/{m+=$$2}END{print int(m*.9)}' \ + /proc/meminfo`; \ + else \ + m=`vmstat --free --swap-free --kilobytes|awk '{m+=$$2}END{print int(m*.9)}'`; \ + fi; \ + ulimit -m $$m; \ + echo "Limited memory for test runs to `ulimit -m`kB" +else + ULIMIT = true +endif + +# the recipient for the test summaries. Send with: debian/rules mail-summary +S_EMAIL = gcc@packages.debian.org gcc-testresults@gcc.gnu.org + +CPPFLAGS = +CFLAGS = -g -O2 $(CPPFLAGS) +LDFLAGS = +BOOT_CFLAGS = -O2 $(CPPFLAGS) +ifeq ($(with_ada),yes) + CC = gnatgcc $(CPPFLAGS) +else + CC = cc $(CPPFLAGS) +endif + +ifeq ($(DEB_HOST_ARCH), $(findstring $(DEB_HOST_ARCH),m68k)) + STAGE1_CFLAGS = STAGE1_CFLAGS="-g -O" +endif + +ifdef DEB_CROSS + CFLAGS = $(BOOT_CFLAGS) +endif + +docdir = usr/share/doc + +# PF is the installation prefix for the package without the leading slash. +# It's "usr" for gcc releases +PF = usr + +ifeq ($(with_multiarch),yes) + libdir = lib/$(DEB_TARGET_GNU_TYPE) +else + libdir = lib +endif +# /usr/libexec doesn't follow the FHS +libexecdir = $(PF)/$(libdir) +buildlibdir = $(builddir)/$(TARGET_ALIAS) +gcc_lib_dir = $(PF)/$(libdir)/gcc/$(TARGET_ALIAS)/$(VER) +gcc_lexec_dir = $(libexecdir)/gcc/$(TARGET_ALIAS)/$(VER) + +ifndef DEB_CROSS + cxx_inc_dir = $(PF)/include/c++/$(BASE_VERSION) +else + cxx_inc_dir = $(PF)/$(TARGET_ALIAS)/include/c++/$(BASE_VERSION) +endif + +CONFARGS = -v \ + --enable-languages=$(shell echo $(enabled_languages) | tr -s ' ' ',') \ + --prefix=/$(PF) \ + --libexecdir=/$(libexecdir) \ + --with-gxx-include-dir=/$(cxx_inc_dir) \ + --enable-shared \ + --with-system-zlib \ + --enable-nls \ + --without-included-gettext + +ifeq ($(versioned_packages),yes) + CONFARGS += --program-suffix=-$(BASE_VERSION) +endif + +ifneq ($(with_sysroot),) + CONFARGS += --with-sysroot=$(with_sysroot) +endif + +ifeq ($(with_cxa_atexit),yes) + CONFARGS += --enable-__cxa_atexit +else + CONFARGS += --disable-__cxa_atexit +endif + +ifeq ($(with_cxx),yes) + CONFARGS += --enable-libstdcxx-allocator=mt # auto pool new mt + ifeq ($(force_gnu_locales),yes) + CONFARGS += --enable-clocale=gnu + endif + ifeq ($(with_debug),yes) + CONFARGS += --enable-libstdcxx-debug + endif +endif + +ifeq ($(with_java),yes) + CONFARGS += --enable-java-gc=boehm --enable-java-awt=gtk +endif +with_nls := yes + +ifeq ($(with_objc)-$(with_objc_gc),yes-yes) + CONFARGS += --enable-objc-gc +endif + +ifneq ($(with_libnof),yes) + ifeq ($(DEB_TARGET_GNU_TYPE),powerpc-linux) + ifeq ($(biarch),yes) + CONFARGS += --disable-nof + else + CONFARGS += --disable-multilib + endif + endif +endif + +ifeq ($(DEB_TARGET_GNU_CPU),$(findstring $(DEB_TARGET_GNU_CPU),m68k)) + CONFARGS += --disable-werror +endif + +ifeq ($(with_treelang),yes) + CONFARGS += --disable-werror +endif + +ifeq ($(DEB_TARGET_GNU_CPU)-$(biarch),sparc-yes) + CONFARGS += --with-cpu=v7 +endif + +ifeq ($(DEB_TARGET_GNU_CPU)-$(biarch),powerpc-yes) + CONFARGS += --with-cpu=default32 +endif + +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),powerpc64)) + CONFARGS += --disable-multilib +endif + +ifndef DEB_CROSS + CONFARGS += $(TARGET_ALIAS) +else + CONFARGS += \ + --program-prefix=$(TARGET_ALIAS)- \ + --includedir=/$(PF)/$(DEB_TARGET_GNU_TYPE)/include \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --host=$(DEB_HOST_GNU_TYPE) \ + --target=$(TARGET_ALIAS) +endif + +bootstrap_target = profiledbootstrap + +# no profiledbootstrap on the following architectures +# - m68k: we're happy that it builds at all +# - ia64: doesn't work, see PR16108 +no_profiled_bs_archs := ia64 m68k +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),$(no_profiled_bs_archs))) + bootstrap_target = bootstrap-lean +endif + +bootstrap_target = bootstrap-lean + +# Increase the timeout for one testrun on slow architectures +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),arm hppa m68k)) + DEJAGNU_TIMEOUT=600 +else + DEJAGNU_TIMEOUT=450 +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),gnu) + DEJAGNU_TIMEOUT=900 +endif + +default: build + +configure: $(configure_dependencies) + +$(configure_dummy_stamp): + touch $(configure_dummy_stamp) + +$(configure_stamp): + dh_testdir + : # give information about the build process + @echo "-------------------------- Build process variables --------------------------" + @echo "Package source: $(PKGSOURCE)" + @echo "Version: $(VER)" + @echo "Base Debian version: $(DPKGVER)" + @echo -e "Configured with: $(foreach i,$(CONFARGS),$(i)\n\t)" +ifdef DEB_CROSS + @echo "Building cross compiler for $(DEB_TARGET_ARCH)" +endif + @echo "Using shell $(SHELL)" + @echo "Architecture: $(DEB_TARGET_ARCH) (GNU: $(TARGET_ALIAS))" + @echo "CPPFLAGS: $(CPPFLAGS)" + @echo "CFLAGS: $(CFLAGS)" + @echo "LDFLAGS: $(LDFLAGS)" + @echo "BOOT_CFLAGS: $(BOOT_CFLAGS)" + @echo "DEBIAN_BUILDARCH: $(DEBIAN_BUILDARCH)" + @echo "Install prefix: /$(PF)" +ifeq ($(with_cxx),yes) + @echo "Will build the C++ compiler" +else + @echo "Will not build the C++ compiler: $(with_cxx)" +endif +ifeq ($(with_objc),yes) + @echo "Will build the ObjC compiler." + ifeq ($(with_objc_gc),yes) + @echo "Will build the extra ObjC runtime for garbage collection." + else + @echo "Will not build the extra ObjC runtime for garbage collection." + endif +else + @echo "Will not build the ObjC compiler: $(with_objc)" +endif +ifeq ($(with_fortran),yes) + @echo "Will build the Fortran77 compiler." +else + @echo "Will not build the Fortran77 compiler: $(with_fortran)" +endif +ifeq ($(with_java),yes) + @echo "Will build the Java compiler." +else + @echo "Will not build the Java compiler: $(with_java)" +endif +ifeq ($(with_libffi),yes) + @echo "Will build the FFI library." +else + @echo "Will not build the FFI library: $(with_libffi)" +endif +ifeq ($(with_pascal),yes) + @echo "Will build the Pascal compiler." +else + @echo "Will not build the Pascal compiler: $(with_pascal)" +endif +ifeq ($(with_ada),yes) + @echo "Will build the Ada compiler." + ifeq ($(with_libgnat),yes) + @echo "Will build the shared Ada libraries." + else + @echo "Will not build the shared Ada libraries." + endif +else + @echo "Will not build the Ada compiler: $(with_ada)" +endif +ifeq ($(with_treelang),yes) + @echo "Will build the Treelang compiler." +else + @echo "Will not build the Treelang compiler: $(with_treelang)" +endif +ifeq ($(with_check),yes) + @echo "Will run the testsuite." +else + @echo "Will not run the testsuite: $(with_check)" +endif + @echo "-----------------------------------------------------------------------------" + @echo "" + rm -f $(configure_stamp) $(build_stamp) + : # generate debian/README.Debian + cat debian/README $(patch_stamp) > debian/README.Debian + + -chmod 755 $(srcdir)/gcc/p/mk_lang_opt + + rm -rf $(builddir) + mkdir $(builddir) + +# the echo "" | ... needed for the gpc question + : # configure + cd $(builddir) \ + && echo "" | PATH=$(PWD)/bin:$$PATH CC="$(CC)" \ + ../src/configure $(CONFARGS) + +#ifeq ($(with_ada),yes) +# cd $(srcdir)/gcc/ada && touch treeprs.ads [es]info.h nmake.ad[bs] +#endif +ifeq ($(with_ada)-$(with_ada_bootstrap_workaround),yes-yes) + cd $(srcdir); \ + uudecode $(PWD)/debian/patches/ada-generated.uue; \ + tar xvfj ada-generated.tar.bz2; \ + rm ada-generated.tar.bz2; \ + for f in gcc/ada/{nmake.ads,nmake.adb,treeprs.ads,sinfo.h,einfo.h}; \ + do \ + touch $$f; \ + done +endif + +ifndef DEB_CROSS + ifneq ($(with_java),yes) + ifeq ($(with_fastjar),yes) + rm -rf $(builddir)/fastjar + mkdir -p $(builddir)/fastjar + cd $(builddir)/fastjar \ + && CC="$(CC)" CFLAGS="$(CFLAGS)" \ + ../../src/fastjar/configure $(CONFARGS) + endif + endif +endif + touch $(configure_stamp) + +build: $(build_dependencies) + +$(build_dummy_stamp): + touch $(build_dummy_stamp) + +$(build_stamp): $(configure_stamp) + dh_testdir + rm -f bootstrap-protocol +ifndef DEB_CROSS + : # build native compiler + ( \ + set +e; \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir) $(NJOBS) $(bootstrap_target) \ + CC="$(CC)" \ + CFLAGS="$(CFLAGS)" \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + $(STAGE1_CFLAGS) \ + ; \ + echo $$? > status; \ + ) 2>&1 | tee bootstrap-protocol + s=`cat status`; rm -f status; test $$s -eq 0 + +#ifneq (,$(findstring $(DEB_HOST_ARCH),i386)) +# : # build libstdc++ optimized for i486 and above +# mv $(buildlibdir)/libstdc++-v3 $(buildlibdir)/libstdc++-v3-default +# $(MAKE) -C $(builddir) $(NJOBS) \ +# CFLAGS_FOR_TARGET='-O2 -march=i486 $$(CFLAGS)' \ +# CXXFLAGS='-g -O2 -march=i486' \ +# configure-target-libstdc++-v3 +# $(MAKE) -C $(builddir) $(NJOBS) \ +# CFLAGS_FOR_TARGET='-O2 -march=i486 $$(CFLAGS)' \ +# CXXFLAGS='-g -O2 -march=i486' \ +# all-target-libstdc++-v3 +# mv $(buildlibdir)/libstdc++-v3 $(buildlibdir)/libstdc++-v3-i486 +# mv $(buildlibdir)/libstdc++-v3-default $(buildlibdir)/libstdc++-v3 +#endif + + : # fix '*.la' and '*.lai' files + for i in $$(find $(buildlibdir) -name '*.la' -o -name '*.lai'); do \ + libdir=$$(sed -n "s,^libdir='\(.*\)'.*,\1,p" $$i); \ + [ -z "$$libdir" ] && continue; \ + libdir=$$(realpath -s $$libdir); \ + sed "s,^libdir='\(.*\)'.*,libdir='$$libdir'," $$i > $$i.new; \ + if diff -u $$i $$i.new; then \ + rm -f $$i.new; \ + else \ + echo "$$i: path normalized"; \ + touch -r $$i $$i.new; \ + mv -f $$i.new $$i; \ + fi; \ + done + + ifeq ($(with_java),yes) + : # work around libtool bug including /usr/lib/. in rpath + sed 's/^hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=/' \ + $(buildlibdir)/libjava/libtool > $(buildlibdir)/libjava/libtool.new + mv $(buildlibdir)/libjava/libtool $(buildlibdir)/libjava/libtool.old + mv $(buildlibdir)/libjava/libtool.new $(buildlibdir)/libjava/libtool + chmod 755 $(buildlibdir)/libjava/libtool + touch -r $(buildlibdir)/libjava/libtool.old \ + $(buildlibdir)/libjava/libtool + sed "s,^libdir=.*,libdir='/usr/lib'," $(buildlibdir)/libjava/libgcj.la \ + > $(buildlibdir)/libjava/libgcj.la.new + mv $(buildlibdir)/libjava/libgcj.la \ + $(buildlibdir)/libjava/libgcj.la.old + mv $(buildlibdir)/libjava/libgcj.la.new \ + $(buildlibdir)/libjava/libgcj.la + touch -r $(buildlibdir)/libjava/libgcj.la.old \ + $(buildlibdir)/libjava/libgcj.la + rm -f $(buildlibdir)/libjava{/,/.libs/}{gij,jv-convert,rmic,rmiregistry} + $(MAKE) -C $(buildlibdir)/libjava + endif + + ifneq ($(with_java),yes) + ifeq ($(with_fastjar),yes) + $(MAKE) -C $(builddir)/fastjar + endif + endif +else + : # build cross compiler for $(TARGET_ALIAS) + ( \ + set +e; \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir) $(NJOBS) \ + CC="$(CC)" \ + CFLAGS="$(CFLAGS)" \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + ; \ + echo $$? > status; \ + ) 2>&1 | tee bootstrap-protocol + s=`cat status`; rm -f status; test $$s -eq 0 +endif + -chmod 755 $(srcdir)/contrib/warn_summary + if [ -x $(srcdir)/contrib/warn_summary ]; then \ + rm -f bootstrap-summary; \ + $(srcdir)/contrib/warn_summary bootstrap-protocol \ + > bootstrap-summary; \ + fi + +ifeq ($(with_ada),yes) + ifeq ($(with_libgnat),yes) + # In 3.3, the Ada part of GCC does not support parallel builds, + # don't pass the \$(NJOBS) parameter from the make command lines. + + # Build the static and shared libraries + rm -f $(builddir)/gcc/ada/rts/*.{o,ali} + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(builddir)/gcc:$(builddir)/gcc/ada/rts \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir)/gcc gnatlib-shared \ + LIBRARY_VERSION=$(GNAT_SONAME) + mkdir -p $(builddir)/gcc/ada/rts/obj + + # Move the object files away lest the tools include them in their + # executables. We want to link against libgnat.so instead. + mv $(builddir)/gcc/ada/rts/*.o $(builddir)/gcc/ada/rts/obj + ln -sf libgnat-$(BASE_VERSION).so.1 \ + $(builddir)/gcc/ada/rts/libgnat-$(BASE_VERSION).so + ln -sf libgnarl-$(BASE_VERSION).so.1 \ + $(builddir)/gcc/ada/rts/libgnarl-$(BASE_VERSION).so + ln -sf libgnat-$(BASE_VERSION).so.1 $(builddir)/gcc/ada/rts/libgnat.so + ln -sf libgnarl-$(BASE_VERSION).so.1 $(builddir)/gcc/ada/rts/libgnarl.so + + # Build gnatmake and gnatlink. + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(builddir)/gcc:$(builddir)/gcc/ada/rts \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir)/gcc/ada \ + ADA_INCLUDES="-I- -I../rts" \ + CC="../../xgcc -B../../" \ + CFLAGS="-O2" \ + GNATMAKE="../../gnatmake" \ + GNATLINK="../../gnatlink" \ + GNATBIND="../../gnatbind -C" \ + STAGE_PREFIX="../../" \ + LIBGNAT="-L../rts -lgnat" \ + LN_S="ln -sf" \ + gnattools1 + + # Use gnatmake, gnatbind and gnatlink to build the other tools. + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(builddir)/gcc:$(builddir)/gcc/ada/rts \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir)/gcc/ada \ + ADA_INCLUDES="-I- -I../rts" \ + CC="../../xgcc -B../../" \ + CFLAGS="-O2" \ + GNATMAKE="../../gnatmake" \ + GNATLINK="../../gnatlink" \ + GNATBIND="../../gnatbind" \ + STAGE_PREFIX="../../" \ + LIBGNAT="-L../rts -lgnat" \ + LN_S="ln -sf" \ + gnattools2 + else + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(builddir)/gcc:$(builddir)/gcc/ada/rts \ + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir)/gcc $(NJOBS) gnatlib gnattools + endif +endif + + touch $(build_stamp) + +$(configure_hppa64_stamp): $(build_stamp) + dh_testdir + rm -f $(configure_hppa64_stamp) $(build_hppa64_stamp) + rm -rf $(builddir_hppa64) + mkdir $(builddir_hppa64) + : # configure + cd $(builddir_hppa64) && \ + PATH=$(PWD)/bin:$$PATH \ + CC="$(builddir)/gcc/xgcc -B$(builddir)/gcc/" \ + ../src/configure \ + --enable-languages=c \ + --prefix=/$(PF) \ + --libexecdir=/$(libexecdir) \ + --disable-shared \ + --disable-nls \ + --disable-threads \ + --with-as=/usr/bin/hppa64-linux-as \ + --with-ld=/usr/bin/hppa64-linux-ld \ + --includedir=/$(PF)/hppa64-linux/include \ + --host=hppa-linux \ + --build=hppa-linux \ + --target=hppa64-linux + touch $(configure_hppa64_stamp) + +$(build_hppa64_stamp): $(configure_hppa64_stamp) + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir_hppa64) $(NJOBS) \ + CC="$(builddir)/gcc/xgcc -B$(builddir)/gcc/" \ + CFLAGS="$(CFLAGS)" \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(LDFLAGS)" + touch $(build_hppa64_stamp) + +MANUALS = \ + $(srcdir)/gcc/doc/cpp.texi \ + $(srcdir)/gcc/doc/cppinternals.texi \ + $(srcdir)/gcc/doc/gcc.texi \ + $(srcdir)/gcc/doc/gccint.texi +ifeq ($(with_fortran),yes) + MANUALS += $(srcdir)/gcc/f/g77.texi +endif +ifeq ($(with_java),yes) + MANUALS += $(srcdir)/gcc/java/gcj.texi +endif +ifeq ($(with_treelang),yes) + MANUALS += $(srcdir)/gcc/treelang/treelang.texi +endif +ifeq ($(with_ada),yes) + MANUALS += \ + $(builddir)/gcc/doc/gnat_ugn_unw.texi \ + $(srcdir)/gcc/ada/gnat_rm.texi \ + $(srcdir)/gcc/ada/gnat-style.texi +endif +ifeq ($(with_pascal),yes) + MANUALS += \ + $(srcdir)/gcc/p/doc/en/gpc.texi \ + $(srcdir)/gcc/p/doc/en/gpcs.texi +endif + +html-docs: $(build_html_stamp) +#$(build_html_stamp): html-texi2html +#$(build_html_stamp): html-makeinfo +$(build_html_stamp): html-makeinfo-nosplit + +html-texi2html: + rm -rf html + mkdir html + for manual in $(MANUALS); do \ + outname=`basename $${manual} .texi`; \ + echo "generating $$outname ..."; \ + texi2html -number -split chapter \ + -I $(srcdir)/gcc/doc/include \ + -I $(srcdir)/gcc/p/doc \ + -I $(srcdir)/gcc/p/doc/generated \ + -I `dirname $${manual}` \ + -subdir html \ + $${manual}; \ + done + +html-makeinfo: + rm -rf html + mkdir html + cd html && \ + for manual in $(MANUALS); do \ + manual=`find $(srcdir) -name $${file}.texi`; \ + outname=`basename $${manual} .texi`; \ + echo "generating $$outname ..."; \ + if [ "$${manual}" ]; then \ + makeinfo --html --number-sections \ + -I $(srcdir)/gcc/doc/include -I `dirname $${manual}` \ + -I $(srcdir)/gcc/p/doc \ + -I $(srcdir)/gcc/p/doc/generated \ + -o $${outname} \ + $${manual}; \ + fi; \ + done + +html-makeinfo-nosplit: + rm -rf html + mkdir html + cd html && \ + for manual in $(MANUALS); do \ + outname=`basename $${manual} .texi`.html; \ + echo "generating $$outname ..."; \ + makeinfo --html --number-sections --no-split \ + -I $(srcdir)/gcc/doc/include -I `dirname $${manual}` \ + -I $(srcdir)/gcc/p/doc \ + -I $(srcdir)/gcc/p/doc/generated \ + -o $${outname} \ + $${manual}; \ + done + +# start the script only on architectures known to have slow autobilders ... +logwatch_archs := arm m68k mips mipsel sparc +ifeq ($(DEB_HOST_GNU_CPU), $(findstring $(DEB_HOST_GNU_CPU),$(logwatch_archs))) + start_logwatch = yes +endif +ifeq ($(DEB_HOST_GNU_SYSTEM),gnu) + start_logwatch = yes +endif + +#ifeq ($(biarch),yes) +# uname_m := $(shell uname -m) +# ifeq ($(uname_m), $(findstring $(uname_m),x86_64 ppc64 sparc64 s390x)) +# DEJAGNU_RUNTESTFLAGS = RUNTESTFLAGS="--target_board 'unix unix/-m64'" +# endif +#endif +#ifeq ($(biarch_ia32),yes) +# uname_m := $(shell uname -m) +# # should check with ia64 as well. +# ifeq ($(uname_m), $(findstring $(uname_m),x86_64)) +# DEJAGNU_RUNTESTFLAGS = RUNTESTFLAGS="--target_board 'unix unix/-m32'" +# endif +#endif + +check: $(check_stamp) #$(check_inst_stamp) +$(check_stamp): $(build_stamp) + rm -f test-protocol + + : # build locales needed by libstdc++ testsuite + rm -rf locales + mkdir locales + chmod +x debian/locale-gen + debian/locale-gen + +ifeq ($(start_logwatch),yes) + : # start logwatch script for regular output during test runs + chmod +x debian/logwatch.sh + -debian/logwatch.sh -t 900 -p $(builddir)/logwatch.pid \ + -m '\ntestsuite still running ...\n' \ + test-protocol \ + $(builddir)/gcc/testsuite/{gcc,g++,g77,objc}.log \ + $(builddir)/gcc/p/test/test_log \ + $(buildlibdir)/libstdc++-v3/testsuite/libstdc++-v3.log \ + $(buildlibdir)/libjava/testsuite/libjava.log \ + $(buildlibdir)/libmudflap/testsuite/libmudflap.log \ + & +endif + + echo "Running testsuite ..." + -$(ULIMIT) ; EXTRA_TEST_PFLAGS=-g0 \ + $(DEJAGNU_RUNTESTFLAGS) \ + DEJAGNU_TIMEOUT=$(DEJAGNU_TIMEOUT) \ + LOCPATH=$(PWD)/locales \ + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(builddir)/gcc:$(builddir)/gcc/ada/rts \ + $(MAKE) -C $(builddir) -k check 2>&1 | tee test-protocol + + -ps aux | fgrep logwatch | fgrep -v fgrep + if [ -f $(builddir)/logwatch.pid ]; then \ + kill -1 `cat $(builddir)/logwatch.pid`; \ + else \ + true; \ + fi + -ps aux | fgrep logwatch | fgrep -v fgrep + + -chmod 755 $(srcdir)/contrib/test_summary + if [ -x $(srcdir)/contrib/test_summary ]; then \ + rm -f test-summary; \ + ( \ + cd $(builddir); \ + echo '' > ts-include; \ + echo '' >> ts-include; \ + if [ -f $(builddir)/gcc/.bad_compare ]; then \ + echo 'Bootstrap comparision failure:' >> ts-include; \ + cat $(builddir)/gcc/.bad_compare >> ts-include; \ + echo '' >> ts-include; \ + echo '' >> ts-include; \ + fi; \ + echo "Build Dependencies:" >> ts-include; \ + dpkg -l binutils `echo '$(LIBC_DEP)' | awk '{print $$1}'` \ + >> ts-include; \ + echo '' >> ts-include; \ + cat ../$(patch_stamp) >> ts-include; \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" \ + $(srcdir)/contrib/test_summary \ + -i ts-include -m "$(S_EMAIL)" \ + ) > raw-test-summary; \ + if [ -n "$(testsuite_tarball)" ]; then \ + echo "Test suite used: $(testsuite_srcdir)" > test-summary; \ + echo " Do not interpret the results on its own" >> test-summary; \ + echo " but compare them with the results from" >> test-summary; \ + echo " the gcc-snapshot package." >> test-summary; \ + fi; \ + sed -n '/^Mail/s/.*"\([^"][^"]*\)".*/\1/p' raw-test-summary \ + >> test-summary; \ + awk '/^cat/, /^EOF/' raw-test-summary | grep -v EOF >> test-summary; \ + if [ -f bootstrap-summary -a "$(bootstrap_target)" != profiledbootstrap ]; then \ + echo '' >> test-summary; \ + cat bootstrap-summary >> test-summary; \ + fi; \ + echo 'BEGIN test-summary'; \ + cat test-summary; \ + echo 'END test-summary'; \ + fi + + touch $(check_stamp) + +$(check_inst_stamp): $(check_stamp) + rm -f test-inst-protocol + +ifeq ($(start_logwatch),yes) + : # start logwatch script for regular output during test runs + chmod +x debian/logwatch.sh + -debian/logwatch.sh -t 900 -p $(builddir)/logwatch-inst.pid \ + -m '\ntestsuite (3.3) still running ...\n' \ + test-inst-protocol \ + check-inst/{gcc,g++,g77,objc}.log \ + & +endif + + rm -rf check-inst + mkdir check-inst + + echo "Running testsuite ..." + -$(ULIMIT) ; \ + DEJAGNU_TIMEOUT=$(DEJAGNU_TIMEOUT) \ + LOCPATH=$(PWD)/locales \ + cd check-inst && $(srcdir)/contrib/test_installed \ + --with-gcc=gcc-3.3 --with-g++=g++-3.3 --with-g77=g77-3.3 \ + 2>&1 | tee test-inst-protocol + + -ps aux | fgrep logwatch | fgrep -v fgrep + if [ -f $(builddir)/logwatch-inst.pid ]; then \ + kill -1 `cat $(builddir)/logwatch-inst.pid`; \ + else \ + true; \ + fi + -ps aux | fgrep logwatch | fgrep -v fgrep + + -chmod 755 $(srcdir)/contrib/test_summary + if [ -x $(srcdir)/contrib/test_summary ]; then \ + rm -f test-inst-summary; \ + ( \ + cd check-inst; \ + echo '' > ts-include; \ + echo '' >> ts-include; \ + echo "Build Dependencies:" >> ts-include; \ + dpkg -l g++-3.3 binutils `echo '$(LIBC_DEP)' | awk '{print $$1}'` \ + >> ts-include; \ + echo '' >> ts-include; \ + echo 'Results for the installed GCC-3.3 compilers' >> ts-include; \ + $(srcdir)/contrib/test_summary \ + -i ts-include -m "$(S_EMAIL)" \ + ) > raw-test-inst-summary; \ + sed -n '/^Mail/s/.*"\([^"][^"]*\)".*/\1/p' raw-test-inst-summary \ + >> test-inst-summary; \ + awk '/^cat/, /^EOF/' raw-test-inst-summary \ + | grep -v EOF >> test-inst-summary; \ + echo 'BEGIN test-installed-summary'; \ + cat test-inst-summary; \ + echo 'END test-installed-summary'; \ + fi + + chmod 755 debian/reduce-test-diff.awk + if diff -u test-inst-summary test-summary \ + | debian/reduce-test-diff.awk > diff-summary; \ + then \ + mv -f diff-summary testsuite-comparision; \ + else \ + ( \ + echo "WARNING: New failures in gcc-3.4 compared to gcc-3.3"; \ + echo ''; \ + cat diff-summary; \ + ) > testsuite-comparision; \ + rm -f diff-summary; \ + fi + touch $(check_inst_stamp) + +clean: debian/control + dh_testdir + rm -f pxxx status + rm -f *-summary *-protocol testsuite-comparision summary-diff +ifeq ($(with_pascal),yes) + -rm -f $(srcdir)/gcc/p/doc/*info + rm -f $(srcdir)/gcc/p/test/{fjf51,fjf141aa,fjf199aa,magic,?,knownbugs/a.out} +endif + if [ -f $(srcdir)/gcc/p/config-lang.in.debian ]; then \ + mv -f $(srcdir)/gcc/p/config-lang.in.debian $(srcdir)/gcc/p/config-lang.in; \ + else true; fi + rm -f $(srcdir)/gcc/po/*.gmo + rm -f debian/lib{ffi,g2c,gcc,gcj,objc,stdc++}{-v3,[0-9]}*.{{pre,post}{inst,rm},shlibs} + for f in debian/*-BV*; do \ + f2=$$(echo $$f \ + | sed 's/BV/$(BASE_VERSION)/;s/PV/$(GPC_BASE_VERSION)/'); \ + rm -f $$f2; \ + done + rm -f debian/shlibs.local + rm -f debian/*.debhelper + -[ -d debian/bugs ] && $(MAKE) -C debian/bugs clean + rm -f debian/README.libstdc++-baseline + rm -rf bin locales + rm -rf check-inst + dh_clean + +# ----------------------------------------------------------------------------- +# some abbrevations for the package names and directories; +# p_XXX is the package name, d_XXX is the package directory +# these macros are only used in the binary-* targets. + +ifeq ($(versioned_packages),yes) + pkg_ver := -$(BASE_VERSION) + gpc_pkg_ver := -$(GPC_BASE_VERSION)$(pkg_ver) +endif + +ifndef DEB_CROSS + p_base = gcc$(pkg_ver)-base + p_gcc = gcc$(pkg_ver) + p_cpp = cpp$(pkg_ver) + p_cppd = cpp$(pkg_ver)-doc + p_cxx = g++$(pkg_ver) + p_doc = gcc$(pkg_ver)-doc +else + p_base = gcc$(pkg_ver)-base + p_gcc = gcc$(pkg_ver)$(cross_bin_arch) + p_cxx = g++$(pkg_ver)$(cross_bin_arch) +endif +p_hppa64 = gcc$(pkg_ver)-hppa64 + +d = debian/tmp +d_base = debian/$(p_base) +d_gcc = debian/$(p_gcc) +d_cpp = debian/$(p_cpp) +d_cppd = debian/$(p_cppd) +d_cxx = debian/$(p_cxx) +d_doc = debian/$(p_doc) +d_hppa64= debian/$(p_hppa64) + +# --------------------------------------------------------------------------- + +ifndef DEB_CROSS +# ---------------------------------------- +# native target + +include debian/rules.d/binary-base.mk +ifeq ($(with_libgcc),yes) + include debian/rules.d/binary-libgcc.mk +endif + +ifeq ($(with_cdev),yes) + include debian/rules.d/binary-cpp.mk +endif + +ifeq ($(with_proto),yes) + include debian/rules.d/binary-proto.mk +endif + +ifeq ($(with_fixincl),yes) + include debian/rules.d/binary-fixincl.mk +endif + +ifeq ($(with_objc),yes) + include debian/rules.d/binary-objc.mk +endif +ifeq ($(with_libobjc),yes) + include debian/rules.d/binary-libobjc.mk +endif + +# include before cxx +include debian/rules.d/binary-java.mk +ifeq ($(with_fastjar),yes) + include debian/rules.d/binary-fastjar.mk +endif + +ifeq ($(with_libffi),yes) + include debian/rules.d/binary-libffi.mk +endif + +ifeq ($(with_cxxdev),yes) + include debian/rules.d/binary-cxx.mk +endif +ifeq ($(with_cxx),yes) + include debian/rules.d/binary-libstdcxx.mk +endif + +ifeq ($(with_fortran),yes) + include debian/rules.d/binary-fortran.mk +endif + +ifeq ($(with_ada),yes) + include debian/rules.d/binary-ada.mk +endif + +ifeq ($(with_treelang),yes) + include debian/rules.d/binary-treelang.mk +endif + +ifeq ($(with_pascal),yes) + include debian/rules.d/binary-pascal.mk +endif + +ifeq ($(with_libnof),yes) + ifeq ($(DEB_TARGET_GNU_CPU),powerpc) + include debian/rules.d/binary-nof.mk + endif +endif + +# gcc must be moved/built after g77 and g++ +ifeq ($(with_cdev),yes) + include debian/rules.d/binary-gcc.mk +endif + +ifeq ($(with_hppa64),yes) + include debian/rules.d/binary-hppa64.mk +endif + +else +# ---------------------------------------- +# cross target + +ifeq ($(with_libgcc),yes) + include debian/rules.d/binary-libgcc-cross.mk +endif + +ifeq ($(with_cxxdev),yes) + include debian/rules.d/binary-cxx-cross.mk +endif +ifeq ($(with_cxx),yes) + include debian/rules.d/binary-libstdcxx-cross.mk +endif + +ifeq ($(DEB_TARGET_GNU_CPU),powerpc) + include debian/rules.d/binary-nof-cross.mk +endif + +ifeq ($(with_cdev),yes) + include debian/rules.d/binary-gcc-cross.mk +endif + +endif + +# ---------------------------------------------------------------------- +install: $(install_dependencies) + +$(install_dummy_stamp): $(build_dummy_stamp) + touch $(install_dummy_stamp) + +$(install_stamp): $(build_stamp) + dh_testdir + dh_testroot + dh_clean -k -N$(p_hppa64) + if [ -f $(binary_stamp)-hppa64 ]; then \ + mv $(binary_stamp)-hppa64 saved-stamp; \ + rm -f $(binary_stamp)*; \ + mv saved-stamp $(binary_stamp)-hppa64; \ + else \ + rm -f $(binary_stamp)*; \ + fi + +#ifeq ($(with_java),yes) +# : # a "fix" +# [ -f $(buildlibdir)/boehm-gc/.libs/libgcjgc.lai ] \ +# || sed -e 's/^installed=no/installed=yes/' \ +# $(buildlibdir)/boehm-gc/libgcjgc.la \ +# > $(buildlibdir)/boehm-gc/.libs/libgcjgc.lai +# [ -f $(buildlibdir)/libjava/.libs/libgcj.lai ] \ +# || sed -e 's/^installed=no/installed=yes/' \ +# $(buildlibdir)/libjava/libgcj.la \ +# > $(buildlibdir)/libjava/.libs/libgcj.lai +#endif + + : # Install directories + rm -rf $(d) + mkdir -p $(d)/$(libdir) $(d)/$(PF) + +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),powerpc64)) + : # link lib to lib64 and usr/lib to usr/lib64 + : # (this works when CONFARGS contains '--disable-multilib') + ln -s lib $(d)/lib64 + mkdir -p $(d)/usr/lib + ln -s lib $(d)/usr/lib64 +endif + + : # Install everything + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir) \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" \ + DESTDIR=$(PWD)/$(d) \ + infodir=/$(PF)/share/info \ + mandir=/$(PF)/share/man \ + install + +# wondering, why this is necessary, the installation of the gnat tools +# is tried from the general install above, but fails with: +# install: cannot create regular file `/debian/tmp/usr/bin/gnatbl': No such file or directory +#ifeq ($(with_ada),yes) +# : # Install Ada components +# PATH=$(PWD)/bin:$$PATH \ +# $(MAKE) -C $(builddir)/gcc \ +# CFLAGS="$(CFLAGS)" \ +# LDFLAGS="$(LDFLAGS)" \ +# BOOT_CFLAGS="$(BOOT_CFLAGS)" \ +# INSTALL="$(INSTALL)" \ +# prefix=$(PWD)/$(d)/$(PF) \ +# infodir=$(PWD)/$(d)/$(PF)/share/info \ +# mandir=$(PWD)/$(d)/$(PF)/share/man \ +# gxx_include_dir=$(PWD)/$(d)/$(cxx_inc_dir) \ +# ada.install-common +#endif + +ifneq ($(with_java),yes) + ifeq ($(with_fastjar),yes) + : # Install fastjar + $(MAKE) -C $(builddir)/fastjar DESTDIR=$(PWD)/$(d) install + endif +endif + + : # fix '*.la' and '*.lai' files + for i in $$(find $(d) -name '*.la' -o -name '*.lai'); do \ + libdir=$$(sed -n "s,^libdir='\(.*\)'.*,\1,p" $$i); \ + [ -z "$$libdir" ] && continue; \ + libdir=$$(realpath -s $$libdir); \ + sed "s,^libdir='\(.*\)'.*,libdir='$$libdir'," $$i > $$i.new; \ + if diff -u $$i $$i.new; then \ + rm -f $$i.new; \ + else \ + echo "$$i: path normalized"; \ + touch -r $$i $$i.new; \ + mv -f $$i.new $$i; \ + fi; \ + done + +ifneq ($(with_libgnat),yes) + rm -f $(d)/$(gcc_lib_dir)/adalib/lib*.so* +endif + +ifeq ($(GFDL_INVARIANT_FREE),yes) + for i in gcc gcov; do \ + I=`echo $$i | tr a-z A-Z`; \ + sed -e "s/@NAME@/$$I$(pkg_ver)/g" -e "s/@name@/$$i$(pkg_ver)/g" \ + debian/dummy-man.1 > $(d)/$(PF)/share/man/man1/$$i.1; \ + done + cp -p debian/gccbug.1 $(d)/$(PF)/share/man/man1/$(TP)gccbug$(pkg_ver) + + ifeq ($(with_fortran),yes) + for i in g77; do \ + I=`echo $$i | tr a-z A-Z`; \ + sed -e "s/@NAME@/$$I$(pkg_ver)/g" -e "s/@name@/$$i$(pkg_ver)/g" \ + debian/dummy-man.1 > $(d)/$(PF)/share/man/man1/$$i.1; \ + done + endif + ifeq ($(with_java),yes) + for i in gcj gcjh gij jv-convert jv-scan jcf-dump rmic rmiregistry; \ + do \ + I=`echo $$i | tr a-z A-Z`; \ + sed -e "s/@NAME@/$$I$(pkg_ver)/g" -e "s/@name@/$$i$(pkg_ver)/g" \ + debian/dummy-man.1 > $(d)/$(PF)/share/man/man1/$$i.1; \ + done + endif +endif + +ifeq ($(with_pascal),yes) + : # gpc is already versioned with the gcc version. + mv $(d)/$(PF)/bin/gpc$(pkg_ver) $(d)/$(PF)/bin/gpc + mv $(d)/$(PF)/share/man/man1/gpc$(pkg_ver).1 \ + $(d)/$(PF)/share/man/man1/gpc.1 +endif +ifeq ($(versioned_packages),yes) + ifeq ($(with_pascal),yes) + ifeq ($(GFDL_INVARIANT_FREE),yes-XXXX) + for i in binobj gpc gpc-run gpidump; do \ + I=`echo $$i | tr a-z A-Z`; \ + sed -e "s/@NAME@/$$I$(gpc_pkg_ver)/g" \ + -e "s/@name@/$$i$(gpc_pkg_ver)/g" \ + debian/dummy-man.1 > $(d)/$(PF)/share/man/man1/$$i.1; \ + done + endif + ifeq ($(with_gpidump),yes) + : # rename files (versioned gpc binaries) + for i in binobj gpc gpc-run gpidump; do \ + mv $(d)/$(PF)/bin/$$i $(d)/$(PF)/bin/$$i$(gpc_pkg_ver); \ + done + : # rename files (versioned gpc man pages) + for i in binobj gpc gpc-run gpidump; do \ + mv $(d)/$(PF)/share/man/man1/$$i.1 \ + $(d)/$(PF)/share/man/man1/$$i$(gpc_pkg_ver).1; \ + done + else + : # rename files (versioned gpc binaries) + for i in binobj gpc gpc-run; do \ + mv $(d)/$(PF)/bin/$$i $(d)/$(PF)/bin/$$i$(gpc_pkg_ver); \ + done + : # rename files (versioned gpc man pages) + for i in binobj gpc gpc-run; do \ + mv $(d)/$(PF)/share/man/man1/$$i.1 \ + $(d)/$(PF)/share/man/man1/$$i$(gpc_pkg_ver).1; \ + done + endif + endif +endif + +# ifeq ($(with_ada),yes) +# : # rename files (versioned ada binaries) +# for i in ; do \ +# mv $(d)/$(PF)/bin/$$i $(d)/$(PF)/bin/$$i-$(GNAT_VERSION); \ +# mv $(d)/$(PF)/share/man/man1/$$i.1 \ +# $(d)/$(PF)/share/man/man1/$$i-$(GNAT_VERSION).1; \ +# done +# for i in $(GNAT_TOOLS); do \ +# mv $(d)/$(PF)/bin/$$i $(d)/$(PF)/bin/$$i-$(GNAT_VERSION); \ +# done +# endif + +ifneq ($(with_libgcc),yes) + : # needed for dependency of other shared libs + echo 'libgcc_s $(GCC_SONAME) $(p_lgcc) (>= $(DEB_SOVERSION))' \ + > debian/shlibs.local +endif + + chmod 755 debian/dh_* + touch $(install_stamp) + +$(install_hppa64_stamp): $(build_hppa64_stamp) + dh_testdir + dh_testroot + rm -rf $(d_hppa64) + mkdir -p $(d_hppa64)/$(PF) + + PATH=$(PWD)/bin:$$PATH \ + $(MAKE) -C $(builddir_hppa64) \ + CC="$(CC)" \ + CFLAGS="$(CFLAGS)" \ + BOOT_CFLAGS="$(BOOT_CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + DESTDIR=$(PWD)/$(d_hppa64) \ + install + +# TODO: multiarch support ... + : # provide as and ld links + ln -sf ../../../../bin/hppa64-linux-as \ + $(d_hppa64)/$(PF)/lib/gcc/hppa64-linux/$(VER)/as + ln -sf ../../../../bin/hppa64-linux-ld \ + $(d_hppa64)/$(PF)/lib/gcc/hppa64-linux/$(VER)/ld + + rm -f $(d_hppa64)/$(PF)/bin/hppa64-linux-gcc-$(VER) + mv $(d_hppa64)/$(PF)/bin/hppa64-linux-gcc \ + $(d_hppa64)/$(PF)/bin/hppa64-linux-gcc$(pkg_ver) + mv $(d_hppa64)/$(PF)/bin/hppa64-linux-cpp \ + $(d_hppa64)/$(PF)/bin/hppa64-linux-cpp$(pkg_ver) + + : # remove files not needed + rm -rf $(d_hppa64)/$(PF)/info + rm -rf $(d_hppa64)/$(PF)/man + rm -f $(d_hppa64)/$(PF)/lib/libiberty.a + rm -f $(d_hppa64)/$(PF)/bin/*{protoize,gcov,gccbug} + + rm -rf $(d_hppa64)/$(PF)/hppa64-linux/include + rm -rf $(d_hppa64)/$(PF)/hppa64-linux/lib + -rmdir $(d_hppa64)/$(PF)/hppa64-linux + + touch $(install_hppa64_stamp) + +# ---------------------------------------------------------------------- +# Build architecture-dependent files here. +#binary-arch: build install $(foreach i,$(arch_binaries),$(binary_stamp)-$(i)) +binary-arch: $(foreach i,$(arch_binaries),$(binary_stamp)-$(i)) +ifeq ($(with_check),yes) + @echo Done +# : # Send Email about sucessfull build. +# # cat raw-test-summary | sh; echo "Sent mail to $(S_EMAIL)" +endif + +# ---------------------------------------------------------------------- +# Build architecture-independent files here. +#binary-indep: build install $(foreach i,$(indep_binaries),$(binary_stamp)-$(i)) +binary-indep: $(foreach i,$(indep_binaries),$(binary_stamp)-$(i)) + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary --- gcc-3.4-3.4.2.orig/debian/gij-wrapper.1 +++ gcc-3.4-3.4.2/debian/gij-wrapper.1 @@ -0,0 +1,22 @@ +.TH GIJ-WRAPPER 1 "August 11, 2001" gij-wrapper "Java User's Manual" +.SH NAME +gij-wrapper \- a wrapper around gij + +.SH SYNOPSIS +gij-wrapper [\fB\s-1OPTION\s0\fR] ... \fI\s-1JARFILE\s0\fR [\fI\s-1ARGS\s0\fR...] +.PP +gij-wrapper [\fB\-jar\fR] [\fB\s-1OPTION\s0\fR] ... \fI\s-1CLASS\s0\fR [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgij-wrapper\fR is a wrapper around gij(1) to be called as the java +interpreter. Options different for java(1) and gij(1) are translated, +options unknown to gij(1) are silently ignored. + +.SH OPTIONS +See gij-3.3(1) for a list of options that gij understands. + +.SH "SEE ALSO" +.BR gij-3.3(1) +, +.BR java(1) --- gcc-3.4-3.4.2.orig/debian/rules.conf +++ gcc-3.4-3.4.2/debian/rules.conf @@ -0,0 +1,242 @@ +# -*- makefile -*- +# rules.conf +# - used to build debian/control and debian/rules.parameters +# - assumes unpacked sources + +include debian/rules.defs + +# The binutils version needed. +# The oldest suitable versions for the various platforms can be found in +# INSTALL/specific.html ; we take a tighter dependency if possible to be on +# the safe side (something like newest( version in stable, versions for the +# various platforms in INSTALL/specific.html) ). +BINUTILSV = 2.15 +BINUTILS_BUILD_DEP = binutils (>= 2.15) +BINUTILSV = 2.14.90.0.7-8 +BINUTILS_BUILD_DEP = binutils (>= 2.14.90.0.7-8) + +# libc-dev dependencies +libc_ver := 2.3.2.ds1-16 +libc_ver := 2.3.2.ds1-13ubuntu1 +ifeq ($(DEB_TARGET_GNU_SYSTEM),linux) + ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),alpha ia64)) + LIBC_DEP = libc6.1-dev (>= $(libc_ver)) + else + LIBC_DEP = libc6-dev (>= $(libc_ver)) + endif +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),gnu) + LIBC_DEP = libc0.3-dev +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),kfreebsd-gnu) + LIBC_DEP = libc0.1-dev +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),knetbsd-gnu) + LIBC_DEP = libc0.1-dev +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),netbsd-elf-gnu) + LIBC_DEP = libc12-dev +endif +LIBC_BUILD_DEP = libc6.1-dev (>= $(libc_ver)) [alpha ia64] | libc0.3-dev (>= $(libc_ver)) | libc0.1-dev (>= $(libc_ver)) | libc12-dev (>= $(libc_ver)) | libc6-dev (>= $(libc_ver)) + +SOURCE_VERSION := $(shell dpkg-parsechangelog | awk '/^Version:/ {print $$NF}') +DEB_VERSION := $(shell echo $(SOURCE_VERSION) \ + | sed -e 's/.*://' -e 's/ds[0-9]*//') +# epoch used for gcc versions up to 3.3.x, now used for some remaining +# libraries: libgcc1, libobjc1, libffi2, libffi2-dev, libg2c0 +EPOCH := 1 +DEB_EVERSION := $(EPOCH):$(DEB_VERSION) +BASE_VERSION := $(shell echo $(DEB_VERSION) | sed -e 's/\([1-9]\.[0-9]\).*-.*/\1/') + +# The version number can be found in gcc/version.c e.g. +# char *version_string = "2.95 19990710 (prerelease)"; +VER := $(strip $(shell grep version_string $(srcdir)/gcc/version.c \ + | sed -e 's/^.*= *"//' -e 's/ .*$$//' -e 's/".*$$//')) +# The numeric part of the gcc version number (x.yy.zz) +NEXTVER := $(shell echo $(VER) | \ + awk -F. '{OFS="."; if (NF==2) $$3=1; else $$NF += 1; print}') +GPC_DATE := $(shell sed -n 's/^.define GPC_VERSION_STRING "\(.*\)"/\1/p' $(srcdir)/gcc/p/version.h || true) +DEB_GPC_VERSION := $(shell echo $(DEB_VERSION) \ + | sed 's/.*:\(.*\)-\(.*\)/2:\1.$(GPC_DATE)-\2/') +# semiautomatic ... +DEB_SOVERSION := $(VER)-1 +DEB_SOVERSION := $(DEB_VERSION) +DEB_SOVERSION := 3.4.1-3 +DEB_SOEVERSION := $(EPOCH):3.4.1-3 +DEB_STDCXX_SOVERSION := $(DEB_SOVERSION) +DEB_FFI_SOVERSION := $(DEB_SOVERSION) + +# manual ... +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),hppa m68k)) + GCC_SONAME := 2 + DEB_LIBGCC_SOVERSION := $(DEB_SOVERSION) + DEB_LIBGCC_VERSION := $(DEB_VERSION) +else + GCC_SONAME := 1 + DEB_LIBGCC_SOVERSION := $(DEB_SOEVERSION) + DEB_LIBGCC_VERSION := $(DEB_EVERSION) +# DEB_LIBGCC_SOVERSION := $(EPOCH):3.3.4-9ubuntu1 +# DEB_LIBGCC_VERSION := $(EPOCH):3.3.4-9ubuntu1 +endif + +CXX_SONAME := $(strip $(shell awk -F= \ + '/^libtool_VERSION/ {split($$2,v,":"); print v[1]}' \ + $(srcdir)/libstdc++-v3/configure.ac)) + +OBJC_SONAME := $(strip $(shell awk '/^LIBOBJC_VERSION/ \ + {split($$3,v,":"); print v[1]}' \ + $(srcdir)/libobjc/Makefile.in)) + +F77_SONAME := $(strip $(shell awk -F= \ + '/^VERSION_MAJOR/ {split($$2,v,":"); print v[1]}' \ + $(srcdir)/libf2c/Makefile.in)) + +GCJ_SONAME := $(strip $(shell tail -1 $(srcdir)/libjava/libtool-version \ + | awk -F: '{ print $$1 }' )) + +FFI_SONAME := $(strip $(shell tail -1 $(srcdir)/libffi/libtool-version \ + | awk -F: '{ print $$1 }' )) + +GNAT_SONAME := $(strip $(shell \ + grep '[^_]Library_Version.*:' $(srcdir)/gcc/ada/gnatvsn.ads \ + | sed -e 's/.*"\([^"]*\)".*/\1/')) + +GNAT_VERSION := $(BASE_VERSION) + +GPC_BASE_VERSION := 2.1 + +pkg_ver := -$(BASE_VERSION) +gpc_pkg_ver := -$(GPC_BASE_VERSION)$(pkg_ver) + +ctrl_flags = \ + -DCV=$(DEB_VERSION) \ + -DNV=$(NEXTVER) \ + -DCEV=$(DEB_EVERSION) \ + -DNEV=1:$(NEXTVER) \ + -DGPC_CV=$(DEB_GPC_VERSION) \ + -DLIBGCC_CV=$(DEB_LIBGCC_VERSION) \ + -DBINUTILSV=$(BINUTILSV) \ + -DSRCNAME=$(PKGSOURCE) \ + -D__$(DEB_TARGET_GNU_CPU)__ \ + -DARCH=$(DEB_TARGET_ARCH) +ifeq ($(with_objc)-$(with_objc_gc),yes-yes) + ctrl_flags += -DOBJC_GC +endif +ctrl_flags += -DG2C_CEV=1:3.3.4-4 + +ifeq ($(with_oldarmabi),yes) +ctrl_flags += \ + -DOLDARMABI=yes +endif + +# hack to rename the amd64 libstdc++ packages ... +ifeq ($(with_oldcxxabi),yes) +ctrl_flags += \ + -DOLDARMABI=yes +endif + +ctrl_flags += \ + -DLIBC_DEP="$(LIBC_DEP)" \ + -DBINUTILS_BUILD_DEP="$(BINUTILS_BUILD_DEP)" \ + -DLIBC_BUILD_DEP="$(LIBC_BUILD_DEP)" + +ifdef DEB_CROSS + ctrl_flags += \ + -DTARGET=$(DEB_TARGET_ARCH) \ + -DTP=$(TP) \ + -DTS=$(TS) \ + -DPRI=optional +else + # XXX change when 3.4 becomes the default compiler + ctrl_flags += \ + -DPRI=optional +endif + +ifeq ($(with_base_only),yes) + ctrl_flags += \ + -DBASE_ONLY=yes +endif + +control: control-file parameters-file versioned-files + +ifdef DEB_CROSS + languages = c c++ + addons = libgcc libcxx cdev c++dev +else + languages = ada c c++ f77 java objc pascal treelang + addons = cdev c++dev fastjar fdev fixincl javadev libcxx libg2c \ + libgcc libffi libgcj libgnat libnof libobjc libs \ + lib64gcc lib64cxx lib64ffi lib64gcj lib64gnat \ + lib64objc lib64g2c libnof objcdev proto +endif + +control-file: + echo "addons: $(addons)"; \ + m4 $(ctrl_flags) \ + -DPV=$(pkg_ver) \ + -DGPC_PV=$(gpc_pkg_ver) \ + -DCXX_SO=$(CXX_SONAME) \ + -DGCC_SO=$(GCC_SONAME) \ + -DOBJC_SO=$(OBJC_SONAME) \ + -DG2C_SO=$(F77_SONAME) \ + -DGCJ_SO=$(GCJ_SONAME) \ + -DGNAT_SO=$(GNAT_SONAME) \ + -DGNAT_V=$(GNAT_VERSION) \ + -DFFI_SO=$(FFI_SONAME) \ + -Denabled_languages="$(languages) $(addons)" \ + -Dada_no_archs="$(foreach arch,$(ada_no_cpus) $(ada_no_systems),!$(arch))" \ + -Djava_no_archs="$(foreach arch,$(java_no_cpus) $(java_no_systems),!$(arch))" \ + -Dpascal_no_archs="$(foreach arch,$(pascal_no_cpus) $(pascal_no_systems),!$(arch))" \ + -Dlibgc_no_archs="$(foreach arch,$(libgc_no_cpus) $(libgc_no_systems),!$(arch))" \ + -Dcheck_no_archs="$(foreach arch,$(check_no_cpus) $(check_no_systems),!$(arch))" \ + -Dlocale_no_archs="$(foreach arch,$(locale_no_cpus) $(locale_no_systems),!$(arch))" \ + debian/control.m4 > debian/control.tmp2 + uniq debian/control.tmp2 > debian/control.tmp + rm -f debian/control.tmp2 + [ -e debian/control ] \ + && cmp -s debian/control debian/control.tmp \ + && rm -f debian/control.tmp && exit 0; \ + mv debian/control.tmp debian/control; touch $(control_stamp) + +parameters-file: + rm -f debian/rules.parameters.tmp + ( \ + echo '# configuration parameters taken from upstream source files'; \ + echo 'VER := $(VER)'; \ + echo 'BASE_VERSION := $(BASE_VERSION)'; \ + echo 'SOURCE_VERSION := $(SOURCE_VERSION)'; \ + echo 'DEB_VERSION := $(DEB_VERSION)'; \ + echo 'DEB_EVERSION := $(DEB_EVERSION)'; \ + echo 'GPC_BASE_VERSION := $(GPC_BASE_VERSION)'; \ + echo 'DEB_GPC_VERSION := $(DEB_GPC_VERSION)'; \ + echo 'DEB_SOVERSION := $(DEB_SOVERSION)'; \ + echo 'DEB_SOEVERSION := $(DEB_SOEVERSION)'; \ + echo 'DEB_LIBGCC_SOVERSION := $(DEB_LIBGCC_SOVERSION)'; \ + echo 'DEB_LIBGCC_VERSION := $(DEB_LIBGCC_VERSION)'; \ + echo 'DEB_STDCXX_SOVERSION := $(DEB_STDCXX_SOVERSION)'; \ + echo 'DEB_FFI_SOVERSION := $(DEB_FFI_SOVERSION)'; \ + echo 'GCC_SONAME := $(GCC_SONAME)'; \ + echo 'CXX_SONAME := $(CXX_SONAME)'; \ + echo 'F77_SONAME := $(F77_SONAME)'; \ + echo 'OBJC_SONAME := $(OBJC_SONAME)'; \ + echo 'GCJ_SONAME := $(GCJ_SONAME)'; \ + echo 'GNAT_VERSION := $(GNAT_VERSION)'; \ + echo 'GNAT_SONAME := $(GNAT_SONAME)'; \ + echo 'FFI_SONAME := $(FFI_SONAME)'; \ + echo 'LIBC_DEP := $(LIBC_DEP)'; \ + ) > debian/rules.parameters.tmp + [ -e debian/rules.parameters ] \ + && cmp -s debian/rules.parameters debian/rules.parameters.tmp \ + && rm -f debian/rules.parameters.tmp && exit 0; \ + mv debian/rules.parameters.tmp debian/rules.parameters; \ + touch $(control_stamp) + +versioned-files: + for f in debian/*-BV*; do \ + f2=$$(echo $$f \ + | sed 's/BV/$(BASE_VERSION)/;s/PV/$(GPC_BASE_VERSION)/'); \ + sed -e 's/@BV@/$(BASE_VERSION)/g' \ + -e 's/@PV@/$(GPC_BASE_VERSION)/g' \ + $$f > $$f2; \ + touch -r $$f $$f2; \ + done --- gcc-3.4-3.4.2.orig/debian/changelog +++ gcc-3.4-3.4.2/debian/changelog @@ -0,0 +1,4029 @@ +gcc-3.4 (3.4.2-2ubuntu1) warty; urgency=low + + * Built from the gcc-3.4.2 release tarball. + * lib64stdc++6: Fix versioned dependency on lib64gcc1. + + -- Matthias Klose Tue, 7 Sep 2004 20:06:40 +0000 + +gcc-3.4 (3.4.1ds1-7ubuntu4) warty; urgency=low + + * debian/rules2: Fix realpath usage. + + -- Matthias Klose Sun, 29 Aug 2004 09:37:05 +0000 + +gcc-3.4 (3.4.1ds1-7ubuntu3) warty; urgency=low + + * debian/rules2: Fix realpath usage. + + -- Matthias Klose Sun, 29 Aug 2004 09:37:05 +0000 + +gcc-3.4 (3.4.1ds1-7ubuntu2) warty; urgency=low + + * Fix dependencies on libgcc1 and ia32-libs. + * Updated to gcc-3.4 CVS 20040829 (3.4.2 release candidate): + - adding updated libstdc++-v3 baseline files for 3.4.0. + - C++ updates + - Fix references in cpp-3.4(1) and gcc-3.4(1) manpages. + * Normalize pathes in .la and .lai files. + * Fix building libffi without libgcj. + + -- Matthias Klose Sun, 29 Aug 2004 09:37:05 +0000 + +gcc-3.4 (3.4.1ds1-7ubuntu1) warty; urgency=low + + * Revert change to binutils dependencies. + * Depend and build depend on warty's glibc version. + * Set the C++ ABI version to 1 (compatible with gcc-3.3), rename + libstdc++ packages to libstdc++6-0{,-dev,-dbg}. + + -- Matthias Klose Thu, 19 Aug 2004 16:19:58 +0200 + +gcc-3.4 (3.4.1ds1-7) unstable; urgency=medium + + * Updated to gcc-3.4 CVS 20040819. + * On amd64, build a biarch compiler defaulting to 64 bit. + - build lib32gcc1 and lib32stdc++6 packages (closes: #257906). + * On i386, build a biarch compiler defaulting to 32bit (Dan Jacobowitz). + * Add proposed patch for 3.4 regression PR16706 (closes: #261051). + * Remove superfluous ')' in debian/rules.def (closes: #263951). + * debian/rules2: Correct typo for cross builds (closes: #263928). + * Update cross-configure.dpatch (closes: #263925). + * Tighten binutils build-dependency/dependency to (>= 2.15-2). + Closes: #263019. + * Tighten glibc dependency, needed at least for m68k to avoid + regressions with new binutils. + * libgcj.pc is included in libgcj5-dev package (closes: #264129). + * Replace 'lib64' hack by setting proper MULTILIB_OSDIRNAMES + (Andreas Metzler). Closes: #262892. + * Reenable the complete build of the libgcj5-awt package. + * Add /lib64 link to /lib for architecture powerpc64 (closes: #264857). + * Fix libgcj5-common doc dir symlink (closes: #265652). + + -- Matthias Klose Thu, 19 Aug 2004 11:35:04 +0200 + +gcc-3.4 (3.4.1ds1-4sarge1) testing-proposed-updates; urgency=low + + * Upload to testing-proposed-updates to avoid the dependency on + binutils-2.15. + * Add path of newly built libgcc to LD_LIBRARY_PATH for building the + shared gnat libraries (closes: #262860). + * Really fix build-dependencies for hurd systems (closes: #262459). + * Fix locations of Ada docs in gnat-doc's doc-base (closes: #262911). + * Fix build with java disabled, but libffi enabled (closes: #263013). + * Add epoch to libg2c-dev's version number (closes: #262884). + * On amd64, do not build-depend on g77-3.3, gobjc3.3, g++-3.3. + Closes: #262898. The dependencies only needed for running the testsuite + with the installed compilers. + * Build an empty libgcj5-awt package. + + -- Matthias Klose Wed, 4 Aug 2004 22:56:35 +0200 + +gcc-3.4 (3.4.1ds1-5) unstable; urgency=high + + * Fix gpc build failures on alpha, mips, mipsel (closes: #262208). + * Fix gcc-hppa64 build failure (closes: #262249). + * Don't build the GTK+ based peers to avoid dependency on libtiff. + * Fix build-dependencies for hurd systems (closes: #262459). + * Disable the testsuite, locales is currently not installable while + libc and libc-dev are out of date on many architectures. + + -- Matthias Klose Sat, 31 Jul 2004 06:34:04 +0200 + +gcc-3.4 (3.4.1ds1-4) unstable; urgency=high + + * Update gpc to gpc-2.1 20040516. + - Fixing about 1200 gpc testsuite failures on mips. + * Update to gcc-3.4 CVS 20040728. + * Remove --enable-threads=posix from the configure options, it's + the default for *-linux, but not for other archs (closes: #261361). + * Fix libgnat symlinks (closes: #261004). + + -- Matthias Klose Wed, 28 Jul 2004 08:04:34 +0200 + +gcc-3.4 (3.4.1-3) unstable; urgency=medium + + * Add missing closing parantheses in build dependencies. + * Fix libstdc++.so symlink (closes: #260523). + * Install language files with versioned package name. + + -- Matthias Klose Wed, 21 Jul 2004 23:54:06 +0200 + +gcc-3.4 (3.4.1-2) unstable; urgency=low + + * Update to gcc-3.4 CVS 20040717. + * Update the stack protector patch to 3.4-2, but don't apply it by default. + * On arm, build packages libstdc++6-0, libstdc++6-0-dev, ... gcc-3.5 + changes the ABI on arm, but likely keeping the soname. + + -- Matthias Klose Sat, 17 Jul 2004 10:54:41 +0200 + +gcc-3.4 (3.4.1-1) unstable; urgency=medium + + * gcc-3.4.1 final release. + - configured with --enable-libstdcxx-allocator=mt. + * Update to gcc-3.4 CVS 20040710. + * Fixes for generating cross compiler packages (Jeff Bailey). + * Make gccbug script POSIX compliant (David Weinehall). + * Disable the build of the libobjc, libg2c, libffi, libgcj-common, + fixincludes and protoize packages (still built from the gcc-3.3 package). + * Build fastjar, implemented -u option (closes: #116145). + * Integrated multiarch support. + * Lower priorities of all packages except libgcc1 to optional. + * Add notes on GCC 3.3 / 3.4 incompatinilities (NEWS.Debian, README.Debian). + * Split out the gcj-3.4 jar file to it's own binary indep package. + + -- Matthias Klose Sat, 10 Jul 2004 11:21:26 +0200 + +gcc-3.4 (3.4.0-4) experimental; urgency=low + + * gcc-3.4.1 release candidate 1. + * Add logic to build biarch compiler on powerpc (disabled, needs lib64c). + * Don't build the libg2c0 package on mipsel-linux (no clear answer on + debian-mips, if the libg2c0's built by gcc-3.3 and gcc-3.4 are compatible + (post-sarge issue). + * Don't use gcc-2.95 as bootstrap compiler on m68k anymore. + + -- Matthias Klose Sat, 26 Jun 2004 22:40:20 +0200 + +gcc-3.4 (3.4.0-3) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040613. + * On sparc, set the the build target to sparc64-linux, build with + switch defaulting to code generation for v7. To generate code for + sparc64, use the -m64 switch. + * Add missing doc-base files to -doc packages. + * Add portability patches and kbsd-gnu patch (Robert Millan). + Closes: #251293, #251294. + * Apply fixes for cross build (Nikita V. Youshchenko). + * Do not include the precompiled libstdc++ header files into the -dev + package (still experimental). Closes: #251707. + * Reflect renaming of Ada user's guide. + * Move AWT peer libraries for libgcj into it's own package (fixes: #247791). + + -- Matthias Klose Mon, 14 Jun 2004 00:03:18 +0200 + +gcc-3.4 (3.4.0-2) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040516. + * Do not provide the /usr/hppa64-linux/include in the gcc-hppa64 package, + migrated to libc6-dev. Adjust dependencies. + * Integrate gpc test results into the GCC test summary. + * gnatchop calls gcc-3.4 (closes: #245438). + * debian/locale-gen.sh: Update for recent libstdc+++ testsuite. + * debian/copyright: Add libstdc++-v3's exception clause. + * Add libffi update for mips (Thiemo Seufer). + * Reference Debian specific bug reporting instructions. + * Update README.Bugs. + * Fix FTBFS for libstdc++-doc. + * Update libjava patch for hppa (Randolph Chung). + * Fix installation of ffitarget.h header file. + * On amd64-linux, configure --without-multilib, disable Ada. + + -- Matthias Klose Sun, 16 May 2004 07:53:39 +0200 + +gcc-3.4 (3.4.0-1) experimental; urgency=low + + * gcc-3.4.0 final release. + + * Why experimental? + - Do not interfer with packages currently built from gcc-3.3 sources, + i.e. libgcc1, libobjc1, libffi2, libffi2-dev, libg2c0. + - Biarch sparc compiler doesn't built yet. + - Use of configure flags affecting binary ABI's not yet determined. + - Several ABI bugs have been fixed. Unfortunately, these changes will break + binary compatibility with earlier releases on several architectures: + alpha, mips, sparc, + - hppa and m68k changed sjlj based exception handling to dwarf2 based + exception handling. + + See NEWS.html or http://gcc.gnu.org/gcc-3.4/changes.html for more + specific information. + + -- Matthias Klose Tue, 20 Apr 2004 20:54:56 +0200 + +gcc-3.4 (3.4ds3-0pre4) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040403. + * Add gpc tarball, gpc patches for 3.4 (Waldek Hebisch). + * Reenable sparc-biarch patches (closes: #239856). + * Build the shared libgnat library, needed to fix FTBFS for some + Ada library packages (Ludovic Brenta). + Currently enabled for hppa, i386, ia64. + + -- Matthias Klose Sat, 3 Apr 2004 08:47:55 +0200 + +gcc-3.4 (3.4ds1-0pre2) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040320. + * For libstdc++6-doc, add a conflict to libstdc++5-3.3-doc (closes: #236560). + * For libstdc++6-dbg, add a conflict to libstdc++5-3.3-dbg (closes: #236798). + * Reenable s390-biarch patches. + * Update the cross compiler build files (Nikita V. Youshchenko). + + -- Matthias Klose Sat, 20 Mar 2004 09:15:10 +0100 + +gcc-3.4 (3.4ds0-0pre1) experimental; urgency=low + + * Start gcc-3.4 packaging, get rid of the epoch for most of the + packages. + + -- Matthias Klose Sun, 22 Feb 2004 16:00:03 +0100 + +gcc-3.3 (1:3.3.3ds6-6) unstable; urgency=medium + + * Update to gcc-3_3-branch CVS 20040401. + - Fixed ICE in emit_move_insn_1 on legal code (closed: #223215). + - Fix PR 14755, miscompilation of loops with bitfield counter. + Closes: #241255. + - Fix PR 16040, crash in function initializing const data with + reinterpret_cast-ed pointer-to-member function crashes (closes: #238621). + - Remove patches integrated upstream. + * Reenable build of gpidump on powerpc and s390. + + -- Matthias Klose Thu, 1 Apr 2004 23:51:54 +0200 + +gcc-3.3 (1:3.3.3ds6-5) unstable; urgency=medium + + * Update to gcc-3_3-branch CVS 20040321. + - Fix PR target/13889 (ICE on valid code on m68k). + * Fix FTFBS on s390. Do not build gpc's gpidump on s390. + * Reenable gpc on arm. + + -- Matthias Klose Mon, 22 Mar 2004 07:37:26 +0100 + +gcc-3.3 (1:3.3.3ds6-4) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040320. + - Revert patch for PR14640 (with this, at least mozilla-firefox was + miscompiled on x86 (closes: #238621). + * Update the gpc tarball (there were two releases with the same name ...). + * Reenable gpc on alpha and ia64. + + -- Matthias Klose Sat, 20 Mar 2004 07:39:24 +0100 + +gcc-3.3 (1:3.3.3ds5-3) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040314. + - Fixes miscompilation with -O -funroll-loops on powerpc (closes: #229567). + - Fix ICE in dwarf-2 on code using altivec (closes: #203835). + * Update hurd-changes patch. + * Add libgcj4-dev as a recommendation for gcj (closes: #236547). + * debian/copyright: Added exemption to static linking of libgcc. + + * Phil Blundell: + - debian/patches/arm-ldm.dpatch, debian/patches/arm-gotoff.dpatch: Update. + + -- Matthias Klose Sun, 14 Mar 2004 09:56:06 +0100 + +gcc-3.3 (1:3.3.3ds5-2) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040306. + - Fixes bootstrap comparision error on ia64. + - Allows ghc build with gcc-3.3. + - On amd64, don't imply 3DNow! for -m64 by default. + - Some arm specific changes + - Fix C++/13944: exception in constructor of a class to be thrown is not + caught. Closes: #228099. + * Enable the build of gcc-3.3-hppa64 on hppa. + Add symlinks for as and ld to point to hppa64-linux-{as,ld}. + * gcj-3.3 depends on g++-3.3, recommends gij-3.3. gij-3.3 suggests gcj-3.3. + * Fix libgc2c-pic compatibility links (closes: #234333). + The link will be removed for gcc-3.4. + * g77-3.3: Conflict with other g77-x.y packages. + * Tighten shlibs dependencies to latest released versions. + + * Phil Blundell: + - debian/patches/arm-233633.dpatch: New Fixes problems with half-word + loads on ARMv3 architecture. (Closes: #233633) + - debian/patches/arm-ldm.dpatch: New. Avoids inefficient epilogue for + leaf functions in PIC code on ARM. + + -- Matthias Klose Sat, 6 Mar 2004 10:57:14 +0100 + +gcc-3.3 (1:3.3.3ds5-1) unstable; urgency=medium + + * gcc-3.3.3 final release. + See /usr/share/doc/gcc-3.3/NEWS.{gcc,html}. + + -- Matthias Klose Mon, 16 Feb 2004 08:59:52 +0100 + +gcc-3.3 (1:3.3.3ds4-0pre4) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20040214 (2nd gcc-3.3.3 prerelease). + * Fix title of libstdc++'s html main index (closes: #196381). + * Move libg2c libraray files out of the gcc specific libdir to /usr/lib. + For g77-3.3 add conflicts to other g77 packages. Closes: #224848. + * Update the stack protector patch to 3.3-7, but don't apply it by default. + Closes: #230338. + * On arm, use arm6 as the cpu default (backport from mainline, PR12527). + * Add libffi and libjava support for hppa (Randolph Chung). Closes: #232615. + + -- Matthias Klose Sat, 14 Feb 2004 09:26:15 +0100 + +gcc-3.3 (1:3.3.3ds3-0pre3) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20040125. + - Fixed PR11350, undefined labels with -Os -fPIC (closes: #195911). + - Fixed PR11793, ICE in extract_insn, at recog.c (closes: #203835). + - Fixed PR13544, removed backport for PR12862. + - Integrated backport for PR12441. + * Fixed since 3.3: java: not implemented interface methods of abstract + classes not found (closes: #225438). + * Disable pascal on arm architecture (currently broken). + * Update the build files to build a cross compiler (Nikita V. Youshchenko). + See debian/README.cross in the source package. + * Apply revised patch to make -mieee the default on alpha-linux, + and add -mieee-disable switch to turn the default off (closes: #212912). + (Tyson Whitehead) + + -- Matthias Klose Sun, 25 Jan 2004 17:41:04 +0100 + +gcc-3.3 (1:3.3.3ds2-0pre2) unstable; urgency=medium + + * Update to gcc-3.3.3 CVS 20040110. + - Fixes compilation not terminating at -O1 on hppa (closes: #207516). + * Add backport to fix PR12441 (closes: #224576). + * Revert backport to 3.3 branch to fix PR12862, which introduced another + regression (PR13544). Closes: #225663. + * Tighten dependency of gnat-3.3 on gcc-3.3 (closes: #226273). + * Disable treelang build for cross compiler build. + * Disable pascal on alpha and ia64 architectures (currently broken). + + -- Matthias Klose Sat, 10 Jan 2004 12:33:59 +0100 + +gcc-3.3 (1:3.3.3ds1-0pre1) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20031229. + - Fixes bootstrap error on ia64-linux. + - Fix -pthread on mips{,el}-linux (closes: #224875). + - Fix -Wformat for C++ (closes: #217075). + * Backport from mainline: Preserve inline-ness when redeclaring + a function template (closes: #195264). + * Add missing intrinsics headers on ix86 (closes: #224593). + * Fix location of libg2c libdir in libg2c.la file (closes: #224848). + + -- Matthias Klose Mon, 29 Dec 2003 10:36:29 +0100 + +gcc-3.3 (1:3.3.3ds0-0pre0.1) unstable; urgency=high + + * NMU + * Fixed mips(el) spec file for -pthread: (Closes: #224875) + * [debian/patches/mips-pthread.dpatch] New. + * [debian/rules.patch] Added it to debian_patches. + + -- J.H.M. Dassen (Ray) Sat, 27 Dec 2003 15:51:47 +0100 + +gcc-3.3 (1:3.3.3ds0-0pre0) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20031206. + - Fixes ICE in verify_local_live_at_start (hppa). Closes: #201550. + - Fixes miscompilation of linux-2.6/sound/core/oss/rate.c. + Closes: #219949. + * Add missing unwind.h to gcc package (closes: #220846). + * Regenerate control file to fix build dependencies for m68k. + * More gpc only patches to fix test failures on m68k. + * Reenable gpc for the Hurd (closes: #189851). + + -- Matthias Klose Sat, 6 Dec 2003 10:29:07 +0100 + +gcc-3.3 (1:3.3.2ds5-4) unstable; urgency=low + + * Update libffi-dev package description (closes: #219508). + * For gij and libgcj fix dependency on the libstdc++ package, if + the latter isn't installed during the build. + * Apply patch to emit .note.GNU-stack section on linux arches + which by default need executable stack. + * Prefer gnat-3.3 over gnat-3.2 as a build dependency. + * Update the pascal tarball (different version released with the + same name). + * Add pascal patches to address various gpc testsuite failures. + On alpha and ia64, build gpc from the 20030830 version. Reenable + the build on m68k. + Remove the 20030507 gpc version from the tarball. + * Apply patch to build the shared ada libs and link the ada tools + against the shared libs. Not enabled by default, because gnat + and gnatlib are rebuilt during install. (Ludovic Brenta) + + -- Matthias Klose Sun, 9 Nov 2003 22:34:33 +0100 + +gcc-3.3 (1:3.3.2ds4-3) unstable; urgency=low + + * Fix rules to omit inclusion of gnatpsta in mips(el) gnat package. + + -- Matthias Klose Sun, 2 Nov 2003 14:29:59 +0100 + +gcc-3.3 (1:3.3.2ds4-2) unstable; urgency=medium + + * s390-ifcvt patch added. Fixes gcl miscompilation (closes: #217240). + (Gerhard Tonn) + * Fix an infinite loop in g++ compiling lufs, regression from 3.3.1. + * Fix a wrong code generation bug on alpha. + (Falk Hueffner) + * Update NEWS files. + * Add Falk Hueffner to the Debian GCC maintainers. + * Enable ada on mips and mipsel, but don't build the gnatpsta tool. + + -- Matthias Klose Wed, 29 Oct 2003 00:12:37 +0100 + +gcc-3.3 (1:3.3.2ds4-1) unstable; urgency=medium + + * Update to gcc-3.3.2. + * Update NEWS files. + * Miscompilation in the pari package at -O3 fixed (closes: #198172). + * On alpha-linux, revert -mieee as the default (Falk Hueffner). + Reopens: #212912. + * Add ia64-unwind patch (Jeff Bailey). + * Closed reports reported against gcc-2.96 (ia64), fixed at least in gcc-3.3: + - ICE in verify_local_live_at_start, at flow.c:2733 (closes: #135404). + - Compilation failure of stlport (closes: #135224). + - Infinite loop compiling cssc's pfile.cc with -O2 (closes: #115390). + - Added missing some string::compare() members (closes: #141199). + - header declares std::pow (closes: #161853). + - does have at() method (closes: #59776). + - Fixed error in stl_deque.h (closes: #69530). + - Fixed problem with bastring (closes: #75759, #96539). + - bad_alloc and std:: namespace problem (closes: #75120). + - Excessive warnings from headers with -Weffc++ (closes: #76827). + + -- Matthias Klose Fri, 17 Oct 2003 08:07:01 +0200 + +gcc-3.3 (1:3.3.2ds3-0pre5) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20031005. + - Fixes cpp inserting a spurious newline (closes: #210478, #210482). + - Fixes generation of unrecognizable insn compiling kernel source + on alpha (closes: #202762). + - Fixes ICE in add_abstract_origin_attribute (closes: #212406). + - Fixes forward declaration in libstdc++ (closes: #209386). + - Fixes ICE in in extract_insn, at recog.c on alpha (closes: #207564). + * Make libgcj-common architecture all (closes: #211909). + * Build depend on: flex-old | flex (<< 2.5.31). + * Fix spec linking libraries with -pthread on powerpc (closes: #211054). + * debian/patches/arm-gotoff.dpatch: fix two kinds of PIC lossage. + (Phil Blundell) + * debian/patches/arm-common.dpatch: fix excessive alignment of common + blocks causing binutils testsuite failures. + (Phil Blundell) + * Update priorities in debian/control to match the archive. + (Ryan Murray) + * s390-nonlocal-goto patch added. Fixes some pascal testcase failures. + (Gerhard Tonn) + * On alpha-linux, make -mieee default and add -mieee-disable switch + to turn default off (closes: #212912). + (Tyson Whitehead) + * Add gpc upstream patch for memory corruption fix. + + -- Matthias Klose Sun, 5 Oct 2003 19:53:49 +0200 + +gcc-3.3 (1:3.3.2ds2-0pre4) unstable; urgency=low + + * Add gcc-unsharing_lhs patch (closes: #210848) + + -- Ryan Murray Fri, 19 Sep 2003 22:51:19 -0600 + +gcc-3.3 (1:3.3.2ds2-0pre3) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20030908. + * PR11716 (Michael Eager, Dan Jacobowitz): + Make GCC think that the maximum length of a short branch is + 64K instead of 128K. It's a big hammer, but it works. + Closes: #207915. + * Downgrade gpc to 20030507 on alpha and ia64 (closes: #208717). + + -- Matthias Klose Mon, 8 Sep 2003 21:49:52 +0200 + +gcc-3.3 (1:3.3.2ds1-0pre2) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20030831. + - Fix java NullPointerException detection with 2.6 kernels. + Closes: #206377. + - Fix bug in C++ typedef handling (closes: #205402). + - Fix -Wunreachable-code giving false complaints (closes: #196600). + * Update to gpc-20030830. + * Don't include /usr/share/java/repository into the class path according + to the new version of th Debian Java policy (closes: #205643). + * Build-Depend/Depend on libgc-dev. + + -- Matthias Klose Sun, 31 Aug 2003 08:56:53 +0200 + +gcc-3.3 (1:3.3.2ds0-0pre1) unstable; urgency=low + + * Remove the build dependency on locales for now. + + -- Matthias Klose Fri, 15 Aug 2003 07:48:18 +0200 + +gcc-3.3 (1:3.3.2ds0-0pre0) unstable; urgency=medium + + * Update to gcc-3.3.2 CVS 20030812. + - Fixes generation of wrong code for XDM-AUTHORIZATION-1 key generation + and/or validation. Closes: #196090. + * Update NEWS files. + * Change ix86 default CPU type for code generation: + - i386-linux -> i486-linux + - i386-gnu -> i586-gnu + - i386-freebsd-gnu -> i486-freebsd-gnu + Use -march=i386 to target i386 CPUs. + + -- Matthias Klose Tue, 12 Aug 2003 10:31:28 +0200 + +gcc-3.3 (1:3.3.1ds3-1) unstable; urgency=low + + * gcc-3.3.1 (taken from CVS 20030805). + - C++: Fix declaration conflicts (closes: #203351). + - Fix ICE on ia64 (closes: #203840). + + -- Matthias Klose Tue, 5 Aug 2003 20:38:02 +0200 + +gcc-3.3 (1:3.3.1ds2-0rc2) unstable; urgency=low + + * Update to gcc-3.3.1 CVS 20030728. + - Fix ICE in extract_insn, at recog.c:2148 on m68k. + Closes: #177840, #180375, #190818. + - Fix ICE while building libquicktime on alpha (closes: #192576). + - Fix failure to deal with using and private inheritance (closes: #202696). + * On sparc, /usr/lib was added to the library search path. Fix it. + * Closed reports reported against gcc-3.2.x and fixed in gcc-3.3: + - Fix error building the gcl package on arm (closes: #199835). + + -- Matthias Klose Mon, 28 Jul 2003 20:39:07 +0200 + +gcc-3.3 (1:3.3.1ds1-0rc1) unstable; urgency=low + + * Update to gcc-3.3.1 CVS 20030722 (3.3.1 release candidate 1). + - Fix ICE in copy_to_mode_reg on 64-bit targets (closes: #189365). + - Remove documentation about multi-line strings (closes: #194391). + - Correctly document -falign-* parameters (closes: #198269). + - out-of-class specialization of a private nested template class. + Closes: #193830. + - Tighten shlibs dependency due to new symbols in libgcc. + * README.Debian for libg2c0, describing the need for g77-x.y when + working with the g2c header and library (closes: #189059). + * Call make with -j, if USE_NJOBS is set and non-empty + in the environment. + * Add another two m68k patches, partly replacing the workarounds provided + by Roman Zippel. + * Add the stack protector patch, but don't apply it by default. Edit + debian/rules.patch to apply it (closes: #171699, #189494). + * Remove wrong symlinks from gnat package (closes: #201882). + * Closed reports reported against gcc-2.95 and fixed in newer versions: + - SMP kernel compilation on alpha (closes: #134197, #146883). + - ICE on arm while building imagemagick (closes: #173475). + * Closed reports reported against gcc-3.2.x and fixed in gcc-3.3: + - Miscompilation of octave2.1 on hppa (closes: #192296, #193804). + + -- Matthias Klose Sun, 13 Jul 2003 10:26:30 +0200 + +gcc-3.3 (1:3.3.1ds0-0pre0) unstable; urgency=medium + + * Update to gcc-3.3.1 CVS 20030626. + - Fix ICE on arm compiling xfree86 (closes: #195424). + - Fix ICE on arm compiling fftw (closes: #186185). + - Fix ICE on arm in change_address_1, affecting a few packages. + Closes: #197099. + - Fix ICE in merge_assigned_reloads building Linux 2.4.2x sched.c. + Closes: #195237. + - Do not warn about failing to inline functions declared in system headers. + Closes: #193049. + - Fix ICE on mips{,el} in propagate_one_insn (closes: #194330, #196091). + - Fix ICE on m68k in reg_overlap_mentioned_p (closes: #194749). + - Build crtbeginT.o on m68k (closes: #197613). + * Fix g++ man page symlink (closes: #196271). + * mips/mipsel: Depend on binutils (>= 2.14.90.0.4). Closes: #196744. + * Disable treelang on powerpc (again). Closes: #196915. + * Pass -encoding in gcj-wrapper. + + -- Matthias Klose Fri, 27 Jun 2003 00:14:43 +0200 + +gcc-3.3 (1:3.3ds9-3) unstable; urgency=low + + * Closing more reports, fixed in 3.2/3.3: + - ICE building texmacs on m68k (closes: #177433). + - libstdc++: doesn't define trunc(...) (closes: #105285). + - libstdc++: setw is ignored for strings output (closes: #52382, #76645). + * Add build support to omit the manual pages and info docs from the + packages, disabled by default. Wait for a Debian statement, which can + be cited. Adresses: #193787. + * Reenable the m68k-const patch, don't run the g77 testsuite on m68k. + Addresses ICEs (#177840, #190818). + * Update arm-xscale patch. + * libstdc++: use __attribute__(__unknown__), instead of (unknown). + Closes: #195796. + * Build-Depend on glibc (>= 2.3.1) to prevent incorrect builds on woody. + Request from Adrian Bunk. + * Add treelang-update patch (Tim Josling), reenable treelang on powerpc. + * Add -{cpp,gcc,g++,gcj,g77} symlinks (addresses: #189466). + * Make sure not to build using binutils-2.14.90.0.[12]. + + -- Matthias Klose Mon, 2 Jun 2003 22:35:45 +0200 + +gcc-3.3 (1:3.3ds9-2) unstable; urgency=medium + + * Correct autoconf-related snafu in newly added ARM patches (Phil Blundell). + * Correct libgcc1 dependency (closes: #193689). + * Work around ldd/dpkg-shlibs failure on s390x. + + -- Matthias Klose Sun, 18 May 2003 09:40:15 +0200 + +gcc-3.3 (1:3.3ds9-1) unstable; urgency=low + + * gcc-3.3 final release. + See /usr/share/doc/gcc-3.3/NEWS.{gcc,html}. + * First merge of i386/x86-64 biarch support (Arnd Bergmann). + Disabled by default. Closes: #190066. + * New gpc-20030507 version. + * Upstream gpc update to fix netbsd build failure (closes: #191407). + * Add arm-xscale.dpatch, arm-10730.dpatch, arm-tune.dpatch, copied + from gcc-3.2 (Phil Blundell). + * Closing bug reports reported against older gcc versions (some of them + still present in Debian, but not anymore as the default compiler). + Usually, forwarded bug reports are linked to + http://gcc.gnu.org/PR + The upstream bug number usually can be found in the Debian reports. + + * Closed reports reported against gcc-3.1.x, gcc-3.2.x and fixed in gcc-3.3: + - General: + + GCC accepts multi-line strings without \ or " " &c (closes: #2910). + + -print-file-name sometimes fails (closes: #161615). + + ICE: reporting routines re-entered (closes: #179597, #180937). + + Misplaced paragraph in gcc documentation (closes: #179363). + + Error: suffix or operands invalid for `div' (closes: #150558). + + builtin memcmp() could be optimised (closes: #85535). + - Ada: + + Preelaborate, exceptions, and -gnatN (closes: #181679). + - C: + + Duplicate loop conditions even with -Os (closes: #94701). + + ICE (signal 11) (closes: #65686). + - C++: + + C++ error on virtual function which uses ... (closes: #165829). + + ICE when warning about cleanup nastiness in switch statements + (closes: #184108). + + Fails to compile virtual inheritance with variable number of + argument method (closes: #151357). + + xmmintrin.h broken for c++ (closes: #168310). + + Stack corruption with variable-length automatic arrays and virtual + destructors (closes: #188527). + + ICE on illegal code (closes: #184862). + + _attribute__((unused)) is ignored in C++ (closes: #45440). + + g++ handles &(void *)foo bizzarely (closes: #79225). + + ICE (with wrong code, though) (closes: #81122). + - Java: + + Broken zip file handling (closes: #180567). + - ObjC: + + @protocol forward definitions do not work (closes: #80468). + - Architecture specific: + - alpha + + va_start is off by one (closes: #186139). + + ICE while building kseg/ddd (closes: #184753). + + g++ -O2 optimization error (closes: #70743). + - arm + + ICE with -O2 in change_address_1 (closes: #180750). + + gcc optimization error with -O2, affecting bison (closes: #185903). + - hppa + + ICE in insn_default_length (closes: #186447). + - ia64 + + gcc-3.2 fails w/ optimization (closes: #178830). + - i386 + + unnecessary generation of instruction cwtl (closes: #95318). + + {athlon} ICE building mplayer (closes: #184800). + + {pentium4} ICE while compiling mozilla with -march=pentium4 + (closes: #187910). + + i386 optimisation: joining tests (closes: #105309). + - m68k + + ICE in instantiate_virtual_regs_1 (closes: #180493). + + gcc optimizer bug on m68k (closes: #64832). + - powerpc + + ICE in extract_insn, at recog.c:2175 building php3 (closes: #186299). + + ICE with -O -Wunreachable-code (closes: #189702). + - s390 + + Operand out of range at assembly time when using -O2 + (closes: #178596). + - sparc + + gcc-3.2 regression (wrong code) (closes: #176387). + + ICE in mem_loc_descriptor when optimizing (closes: #178909). + + ICE in gen_reg_rtx when optimizing (closes: #178965). + + Optimisation leads to unaligned access in memcpy (closes: #136659). + + * Closed reports reported against gcc-3.0 and fixed in gcc-3.2.x: + - General: + + Use mkstemp instead of mktemp (closed: #127802). + - Preprocessor: + + Fix redundant error message from cpp (closed: #100722). + - C: + + Optimization issue on ix86 (pointless moving) (closed: #97904). + + Miscompilation of allegro on ix86 (closed: #105741). + + Fix generation of ..ng references for static aliases (alpha-linux). + (closed: #108036). + + ICE compiling pari on hppa (closed: #111613). + + ICE on ia64 in instantiate_virtual_regs_1 (closed: #121668). + + ICE in c-typeck.c (closed: #123687). + + ICE in gen_subprogram_die on alpha (closed: #127890). + + SEGV in initialization of flexible char array member (closed: #131399). + + ICE on arm compiling lapack (closed: #135967). + + ICE in incomplete_type_error (closed: #140606). + + Fix -Wswitch (also part of -Wall) (closed: #140995). + + Wrong code in mke2fs on hppa (closed: #150232). + + sin(a) * sin(b) gives wrong result (closed: #164135). + - C++: + + Error in std library headers on arm (closed: #107633). + + ICE nr. 19970302 (closed: #119635). + + std::wcout does not perform encoding conversions (closed: #128026). + + SEGV, when compiling iostream.h with -fPIC (closed: #134315). + + Fixed segmentation fault in included code for (closed: #137017). + + Fix with exception handling and -O (closed: #144232). + + Fix octave-2.1 build failure on ia64 (closed: #144584). + + nonstandard overloads in num_get facet (closed: #155900). + + ICE in expand_end_loop with -O (closed: #158371). + - Fortran: + + Fix blas build failure on arm (closed: #137959). + - Java: + + Interface members are public by default (closed: #94974). + + Strange message with -fno-bounds-check in combination with -W. + (closed: #102353). + + Crash in FileWriter using IOException (closed: #116128). + + Fix ObjectInputStream.readObject() calling constructors. + (closed: #121636). + + gij: better error reporting on `class not found' (closed: #125649). + + Lockup during .java->.class compilation (closed: #141899). + + Compile breaks using temporary inner class instance (closed: #141900). + + Default constructor for inner class causes broken bytecode. + (closed: #141902). + + gij-3.2 linked against libgcc1 (closed: #165180). + + gij-wrapper understands -classpath parameter (closed: #146634). + + gij-3.2 doesn't ignore -jar when run as "java" (closed: #167673). + - ObjC: + + ICE on alpha (closed: #172353). + + * Closed reports reported against gcc-2.95 and fixed in newer versions: + - General: + + Undocumented option -pthread (closes: #165110). + + stdbool.h broken (closes: #167439). + + regparm/profiling breakage (closes: #20695). + + another gcc optimization error (closes: #51456). + + ICE in `output_fix_trunc' (closes: #55967). + + Fix "Unable to generate reloads for" (closes: #58219, #131890). + + gcc -c -MD x/y.c -o x/y.o leaves y.d in cwd (closes: #59232). + + Compiler error with -O2 (closes: #67631). + + ICE (unrecognizable insn) compiling php4 (closes: #83550, #84969). + + Another ICE (closes: #90666). + + man versus info inconsistency (-W and -Wall) (closes: #93708). + + ICE on invalid extended asm (closes: #136630). + + ICE in `emit_no_conflict_block' compiling perl (closes: #154599). + + ICE in `gen_tagged_type_instantiation_die'(closes: #166766). + + ICE on __builtin_memset(s, 0, -1) (closes: #170994). + + -Q option to gcc appears twice in the documentation (closes: #137382). + + New options for specifying targets:- -MQ and -MT (closes: #27878). + + Configure using --enable-nls (closes: #51651). + + gcc -dumpspecs undocumented (closes: #65406). + - Preprocessor: + + cpp fails to parse macros with varargs correctly(closes: #154767). + + __VA_ARGS__ stringification crashes preprocessor if __VA_ARGS__ is + empty (closes: #152709). + + gcc doesn't handle empty args in macro function if there is only + one arg(closes: #156450). + - C: + + Uncaught floating point exception causes ICE (closes: #33786). + + gcc -fpack-struct doesn't pack structs (closes: #64628). + + ICE in kernel (matroxfb) code (closes: #151196). + + gcc doesn't warn about unreachable code (closes: #158704). + + Fix docs for __builtin_return_address(closes: #165992). + + C99 symbols in limits.h not defined (closes: #168346). + + %zd printf spec generates warning, even in c9x mode (closes: #94891). + + Update GCC attribute syntax (closes: #12253, #43119). + - C++ & libstdc++-v3: + + template and virtual inheritance bug (closes: #152315). + + g++ has some troubles with nested templates (closes: #21255). + + vtable thunks implementation is broken (closes: #34876, #35477). + + ICE for templated friend (closes: #42662). + + ICE compiling mnemonic (closes: #42989). + + Deprecated: result naming doesn't work for functions defined in a + class (closes: #43170). + + volatile undefined ... (closes: #50529). + + ICE concerning templates (closes: #53698). + + Program compiled -O3 -malign-double segfaults in ofstream::~ofstream + (closes: #56867). + + __attribute__ ((constructor)) doesn't work with C++ (closes: #61806). + + Another ICE (closes: #65687). + + ICE in `const_hash' (closes: #72933). + + ICE on illegal code (closes: #83221). + + Wrong code with -O2 (closes: #83363). + + ICE on template class (closes: #85934). + + No warning for missing return in non-void member func (closes: #88260). + + Not a bug/fixed in libgcc1: libgcc.a symbols end up exported by + shared libraries (closes: #118670). + + ICE using nested templates (closes: #118781). + + Another ICE with templates (closes: #127489). + + More ICEs (closes: #140427, #141797). + + ICE when template declared after use(closes: #148603). + + template function default arguments are not handled (closes: #157292). + + Warning when including stl.h (closes: #162074). + + g++ -pedantic-errors -D_GNU_SOURCE cannot #include + (closes: #151671). + + c++ error message improvement suggestion (closes: #46181). + + Compilation error in stl_alloc.h with -fhonor-std (closes: #59005). + + libstdc++ has no method at() in stl_= (closes: #68963). + - Fortran: + + g77 crash (closes: #130415). + - ObjC: + + ICE: program cc1obj got fatal signal 11 (closes: #62309). + + Interface to garbage collector is undocumented. (closes: #68987). + - Architecture specific: + - alpha + + Can't compile with define gnu_source with stdio and curses + (closes: #97603). + + Header conflicts on alpha (closes: #134558). + + lapack-dev: cannot link on alpha (closes: #144602). + + ICE `fixup_var_refs_1' (closes: #43001). + + Mutt segv on viewing list of attachments (closes: #47981). + + ICE building open-amulet (closes: #48530). + + ICE compiling hatman (closes: #55291). + + dead code removal in switch() broken (closes: #142844). + - arm + + Miscompilation using -fPIC on arm (closes: #90363). + + infinite loop with -O on arm (closes: #151675). + - i386 + + ICE when using -mno-ieee-fp and -march=i686 (closes: #87540). + - m68k + + Optimization (-O2) broken on m68k (closes: #146006). + - mips + + g++ exception catching does not work... (closes: #105569). + + update-menus gets Bus Error (closes: #120333). + - mipsel + + aspell: triggers ICE on mipsel (closes: #128367). + - powerpc + + -O2 produces wrong code (gnuchess example) (closes: #131454). + - sparc + + Misleading documentation for -malign-{jump,loop,function}s + (closes: #114029). + + Sparc GCC issue with -mcpu=ultrasparc (closes: #172956). + + flightgear: build failure on sparc (closes: #88694). + + -- Matthias Klose Fri, 16 May 2003 07:13:57 +0200 + +gcc-3.3 (1:3.3ds8-0pre9) unstable; urgency=high + + * gcc-3.3 second prerelease. + - Fixing exception handling on s390 (urgency high). + * Reenabled gpc build (I had it disabled ...). Closes: #192347. + + -- Matthias Klose Fri, 9 May 2003 07:32:14 +0200 + +gcc-3.3 (1:3.3ds8-0pre8) unstable; urgency=low + + * gcc-3.3 prerelease. + - Fixes gcj ICE (closes: #189545). + * For libstdc++ use the i486 atomicity implementation, introduced with + 0pre6, left out in 0pre7 (closes: #191684). + * Add README.Debian for treelang (closes: #190812). + * Apply NetBSD changes (Joel Baker). Closes: #191551. + * New symbols in libgcc1, tighten the shlibs dependency. + * Disable testsuite run on mips/mipsel because of an outdated libc-dev + package. + * Do not build libffi with debug information, although configuring + with --enable-debug. + + -- Matthias Klose Tue, 6 May 2003 06:53:49 +0200 + +gcc-3.3 (1:3.3ds7-0pre7) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030429). + * Revert upstream libstdc++ change (closes: #191145, #191147, #191148, + #191149, #149159, #149151, and other reports). + Sorry for not detecting this before the upload, seems to be + broken on i386 "only". + * hurd-i386: Use /usr/include, not /include. + * Disable gpc on hurd-i386 (closes: #189851). + * Disable building the debug version of libstdc++ on powerpc-linux + (fixes about 200 java test cases). + * Install libstdc++v3 man pages (closes: #127263). + + -- Matthias Klose Tue, 29 Apr 2003 23:28:44 +0200 + +gcc-3.3 (1:3.3ds6-0pre6) unstable; urgency=high + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030426). + * libstdc++-doc: Fix index.html link (closes: #189424). + * Revert back to the i486 atomicity implementation, that was used + for gcc-3.2 as well. Reopens: #184446, #185662. Closes: #189983. + For this reason, tighten the libstdc++5 shlibs dependency. See + http://lists.debian.org/debian-devel/2003/debian-devel-200304/msg01895.html + Don't build the ix86 specfic libstdc++ libs anymore. + + -- Matthias Klose Sun, 27 Apr 2003 19:47:54 +0200 + +gcc-3.3 (1:3.3ds5-0pre5) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030415). + * Disable treelang on powerpc. + * Disable gpc on m68k. + * Install locale data. Conflict with gcc-3.2 (<= 1:3.2.3-0pre8). + * Fix generated bits/atomicity.h (closes: #189183). + * Tighten libgcc1 shlibs dependency (new symbol _Unwind_Backtrace). + + -- Matthias Klose Wed, 16 Apr 2003 00:37:05 +0200 + +gcc-3.3 (1:3.3ds4-0pre4) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030412). + * Avoid sparc64 dependencies for libgcc1 on sparc (Clint Adams). + * Make the default sparc 32bit target v8 instead of v7. This mainly + enables hardmul, which should speed up v8 and v9 systems by a large + margin (Ben Collins). + * Tighten binutils dependency for sparc. + * On i386, build libstdc++ optimized for i486 and above. The library + in /usr/lib is built for i386. Closes: #184446, #185662. + * Add gpc build (from gcc-snapshot package). + * debian/control: Include all packages, that _can_ be built from + this source package (except the cross packages). + * Add m68k patches: m68k-const, m68k-subreg, m68k-loop. + * Run the 3.3 testsuite a second time with the installed gcc-3.2 + to check for regressions (promised, only this time, and for the + final release ;). Add build dependencies (gobjc-3.2, g77-3.2, g++-3.2). + + -- Matthias Klose Sat, 12 Apr 2003 10:11:11 +0200 + +gcc-3.3 (1:3.3ds3-0pre3) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030331). + * Reenable java on arm. + * Build-Depend on binutils-2.13.90.0.18-1.3 on m68k. Fixes all + bprob/gcov testsuite failures. + * Enable C++ build on arm. + * Enable the sparc64 build. + + -- Matthias Klose Mon, 31 Mar 2003 23:24:54 +0200 + +gcc-3.3 (1:3.3ds2-0pre2) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030317). + * Disable building the gcc-3.3-nof package. + * Disable Ada on mips and mipsel. + * Remove the workaround to build Ada on powerpc. + * Add GNU Free documentation license to copyright file. + * Update the sparc64 build patches (Clint Adams). Not yet enabled. + * Disable C++ on arm (Not yet tested). + * Add fix for ICE on powerpc (see: #184684). + + -- Matthias Klose Sun, 16 Mar 2003 21:40:57 +0100 + +gcc-3.3 (1:3.3ds1-0pre1) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030310). + * Add gccbug manpage. + * Don't build libgnat package (no shared library). + * Configure with --enable-sjlj-exceptions on hppa and m68k for + binary compatibility with libstdc++ built with gcc-3.2. + * Disable Java on arm-linux (never seen it sucessfully bootstrap). + * Install non-conflicting baseline README. + * multilib *.so and *.a moved to /usr/lib/gcc-lib/... , so that several + compiler versions can be installed concurrently. + * Remove libstdc++-incdir patch applied upstream. + * libstdc++ 64 bit development files now handled in -dev target. + (Gerhard Tonn) + * Drop build dependencies for gpc (tetex-bin, help2man, libncurses5-dev). + * Add libstdc++5-3.3-dev confict to libstdc++5-dev (<= 1:3.2.3-0pre3). + * Enable builds on m68k (all but C++ for the moment). gcc-3.3 bootstraps, + while gcc-3.2 doesn't. + + -- Matthias Klose Mon, 10 Mar 2003 23:41:00 +0100 + +gcc-3.3 (1:3.3ds0-0pre0) unstable; urgency=low + + * First gcc-3.3 package, built for s390 only. All other architectures + build the gcc-3.3-base package only. + To build the package on other architectures, edit debian/rules.defs + (macro no_dummy_archs). + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030301). + * Don't include the gcc locale files (would conflict with 3.2). + * Remove libffi-install-fix patch. + * Fix netbsd-i386 patches. + * Change priority of libstdc++5 and gcc-3.2-base to important. + * Install gcjh-wrapper for javah. + * gij suggests fastjar, gcj recommends fastjar. + * Allow builds using automake1.4 | automake (<< 1.5). + * Backport fix for to output more correct line numbers. + * Add help2man to build dependencies needed for some gpc man pages. + * gpc: Install binobj and gpidump binaries and man pages. + * Apply cross compilation patches submitted by Bastian Blank. + * Replace s390-biarch patch and copy s390-config-ml patch from 3.2 + (Gerhard Tonn). + * Configure using --enable-debug. + * Add infrastructure to only build a subset of binary packages. + * Rename libstdc++-{dev,dbg,pic,doc} packages. + * Build treelang compiler. + + -- Matthias Klose Sat, 1 Mar 2003 12:56:42 +0100 + +gcc-3.2 (1:3.2.3ds2-0pre3) unstable; urgency=low + + * gcc-3.2.3 prerelease (CVS 20030228) + - Fixes bootstrap failure on alpha-linux. + - Fixes ICE on m68k (closes: #177016). + * Build Pascal with -O1 on powerpc, disable Pascal on arm, m68k and + sparc (due to wrong code generation for fwrite in glibc, + see PR optimization/9279). + * Apply cross compilation patches submitted by Bastian Blank. + + -- Matthias Klose Fri, 28 Feb 2003 20:26:30 +0100 + +gcc-3.2 (1:3.2.3ds1-0pre2) unstable; urgency=medium + + * gcc-3.2.3 prerelease (CVS 20030221) + - Fixes ICE on hppa (closes: #181813). + * Patch for ffitest in s390-java.dpatch deleted, since already fixed + upstream. (Gerhard Tonn) + * Build crtbeginT.o on m68k-linux (closes: #179807). + * Install gcjh-wrapper for javah (closes: #180218). + * gij suggests fastjar, gcj recommends fastjar (closes: #179298). + * Allow builds using automake1.4 | automake (<< 1.5) (closes: #180048). + * Backport fix for to output more correct line numbers (closes: #153965). + * Add help2man to build dependencies needed for some gpc man pages. + * gpc: Install binobj and gpidump binaries and man pages. + * Disable gpc on arm due to wrong code generation for fwrite in + glibc (see PR optimization/9279). + + -- Matthias Klose Sat, 22 Feb 2003 19:58:20 +0100 + +gcc-3.2 (1:3.2.3ds0-0pre1) unstable; urgency=low + + * gcc-3.2.3 prerelease (CVS 20030210) + - Fixes long millicode calls on hppa (closes: #180520) + * New gpc-20030209 version. Remove gpc-update.dpatch and gpc-testsuite.dptch + as they are no longer needed. + * Fix netbsd-i386 patches (closes: #180129, #179931) + * m68k-bootstrap.dpatch: backport gcse.c changes from 3.3/MAIN to 3.2 + * Change priority of libstdc++5 and gcc-3.2-base to important. + + -- Ryan Murray Tue, 11 Feb 2003 06:18:09 -0700 + +gcc-3.2 (1:3.2.2ds8-1) unstable; urgency=low + + * gcc-3.2.2 release. + - Fixes ICE, regression from 2.95 (closes: #176117). + - Fixes ICE, regression from 2.95 (closes: #179161). + * libstdc++ for biarch installs now upstream to usr/lib64, + therefore mv usr/lib/64 usr/lib64 no longer necessary. (Gerhard Tonn) + + -- Ryan Murray Wed, 5 Feb 2003 01:35:29 -0700 + +gcc-3.2 (1:3.2.2ds7-0pre8) unstable; urgency=low + + * gcc-3.2.2 prerelease (CVS 20030130). + * update s390 libffi patch + * debian/control: add myself to uploaders and change libc12-dev depends to + libc-dev on i386 (closes: #179128) + * Build-Depend on procps so that ps is available for logwatch + + -- Ryan Murray Fri, 31 Jan 2003 04:00:15 -0700 + +gcc-3.2 (1:3.2.2ds6-0pre7) unstable; urgency=low + + * gcc-3.2.2 prerelease (CVS 20030128). + - Update needed for hppa. + - Fixes ICE on arm, regression from 2.95.x (closes: #168086). + - Can use default bison (1.875). + * Apply netbsd build patches (closes: #177674, #178328, #178325, + #178326, #178327). + * Run the logwatch script on "slow" architectures (arm, m68k) only. + * autoreconf.dpatch: Only update libtool.m4, which is newer conceptually + than libtool 1.4 (Ryan Murray). + * Apply autoreconf patch universally (Ryan Murray). + * More robust gij/gcj wrapper scripts, include /usr/lib/jni in default + JNI search path (Ben Burton). Closes: #167932. + * Build crtbeginT.o on m68k (closes: #177036). + * Fixed libc-dev source dependency (closes: #178602). + * Tighten shlib dependency to the current package version; should be + 1:3.2.2-1 for the final release (closes: #178867). + + -- Matthias Klose Tue, 28 Jan 2003 21:59:30 +0100 + +gcc-3.2 (1:3.2.2ds5-0pre6) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20030123). + * Build locales needed by the libstdc++ testsuite. + * Update config.{guess,sub} files from autotools-dev (closes: #177674). + * Disable Ada and Java on netbsd-i386 (closes: #177679). + * gnat: Add suggests for gnat-doc and ada-reference-manual. + + -- Matthias Klose Thu, 23 Jan 2003 22:16:53 +0100 + +gcc-3.2 (1:3.2.2ds4-0pre5.1) unstable; urgency=low + + * Readd build dependency `locales' on arm. locales is now installable + * Add autoreconf patch for mips{,el}. (closes: #176311) + + -- Ryan Murray Wed, 22 Jan 2003 14:31:14 -0800 + +gcc-3.2 (1:3.2.2ds4-0pre5) unstable; urgency=low + + * Remove build dependency `libc6-dev-sparc64 [sparc]' for now. + * Remove build dependency `locales' on arm. locales is uninstallable + on arm due to the missing glibc-2.3. + * Use bison-1.35. bison-1.875 causes an hard error on the reduce/reduce + conflict in objc-parse.y. + + -- Matthias Klose Fri, 10 Jan 2003 10:10:43 +0100 + +gcc-3.2 (1:3.2.2ds4-0pre4) unstable; urgency=low + + * Try building with gcc-2.95 on m68k-linux. Building gcc-3.2 with gcc-3.2 + does not work for me. m68k-linux doesn't look good at all ... + * Fix s390 build error. + * Add locales to build dependencies. A still unsolved issue is the + presence of the locales de_DE, en_PH, en_US, es_MX, fr_FR and it_IT, + or else some tests in the libstdc++ testsuite will fail. + * Put all -nof files in the -nof package (closes: #175253). + * Correctly exit logwatch script (closes: #175251). + * Install linker-map.gnu file for libstdc++_pic (closes: #175144). + * Install versioned gpcs docs only (closes: #173844). + * Include gpc test results in gpc package. + * Link local libstdc++ documentation to local source-level documentation. + * Clarify libstdc++ description (so version and library version). + Closes: #175799. + * Include library in libstdc++-dbg package (closes: #176005). + + -- Matthias Klose Wed, 8 Jan 2003 23:39:50 +0100 + +gcc-3.2 (1:3.2.2ds3-0pre3) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021231). + - Fix loop count computation for preconditioned unrolled loops. + Closes: #162919. + - Fix xmmintrin.h (_MM_TRANSPOSE4_PS) CVS 20021027 (closes: #163647). + - Fix [PR 8601] strlen/template interaction causes ICE CVS 20021201. + Closes: #166143. + * Watch the log files, which are written during the testsuite runs and print + out a message, if there is still activity. No more buildd timeouts on arm + and m68k ... + * Remove gpc's reference to librx1g-dev package (closes: #172953). + * Remove trailing dots on package descriptions. + * Fix external reference to cpp.info in gcc.info (closes: #174598). + + -- Matthias Klose Tue, 31 Dec 2002 13:47:52 +0100 + +gcc-3.2 (1:3.2.2ds2-0pre2) unstable; urgency=medium + + * Friday, 13th upload, so what do you expect ... + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021212). + * Fix gnat build (autobuild maintainers: please revert back to gnat-3.2 + (<= 1:3.2.1ds6-1) for building gnat-3.2, if the build fails building + gnatlib and gnattools). + * Really disable sparc64 support. + + -- Matthias Klose Fri, 13 Dec 2002 00:26:37 +0100 + +gcc-3.2 (1:3.2.2ds1-0pre1) unstable; urgency=low + + * A candidate for the transition ... + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021210). + - doc/invoke.texi: Remove last reference to -a (closes: #171748). + * Disable sparc64 support. For now please use egcs64 to build sparc64 + kernels. + * Disable Pascal on the sparc architecture (doesn't bootstrap). + + -- Matthias Klose Tue, 10 Dec 2002 22:33:13 +0100 + +gcc-3.2 (1:3.2.2ds0-0pre0) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021202). + - Should fix _Pragma expansion within macros (closes: #157416). + * New gpc-20021128 version. Run check using EXTRA_TEST_PFLAGS=-g0 + * Add tetex-bin to build dependencies (gpc needs it). Closes: #171203. + + -- Matthias Klose Tue, 3 Dec 2002 08:22:33 +0100 + +gcc-3.2 (1:3.2.1ds6-1) unstable; urgency=low + + * gcc-3.2.1 final release. + * Build gpc-20021111 for all architectures. hppa and i386 are + known to work. For the other architectures, send the usual FTBFS ... + WARNING: this gpc version is an alpha version, especially debug info + doesn't work well, so use -g0 for compiling. If you need a stable + gpc compiler, use gpc-2.95. + * Encode the gpc upstream version in the package name, the gpc release + date in the version number (requested by gpc upstream). + * Added libncurses5-dev and libgmp3-dev as build dependencies for the + gpc tests and runtime. + * Clean CVS files as well (closes: #169101). + * s390-biarch.dpatch added, backported from CVS (Gerhard Tonn). + * s390-config-ml.dpatch added, disables biarch for java, + libffi and boehm-gc on s390. They need a 64 bit runtime + during build which is not yet available on s390 (Gerhard Tonn). + * Biarch support for packaging adapted (Gerhard Tonn). + biarch variable added and with-sparc64 variable substituted in + most places by biarch. + dh_shlibdeps is applied only to 32 bit libraries on s390, since + ldd for 64 bit libraries don't work on 32 bit runtime. + Build dependency to libc6-dev-s390x added. + + -- Matthias Klose Wed, 20 Nov 2002 00:20:58 +0100 + +gcc-3.2 (1:3.2.1ds5-0pre6) unstable; urgency=medium + + * gcc-3.2.1 prerelease. + * Removed arm patch integrated upstream. + * Adjust gnat build dependency (closes: #167116). + * Always configure with --enable-clocale=gnu. The autobuilders do have + locales installed, but not generated the "de_DE" locale needed for + the autoconf test in libstdcc++-v3/aclocal.m4. + * libstdc++ documentaion: Don't compresss '*.txt' referenced by html pages. + + -- Matthias Klose Tue, 12 Nov 2002 07:19:44 +0100 + +gcc-3.2 (1:3.2.1ds4-0pre5) unstable; urgency=medium + + * gcc-3.2.1 snapshot (CVS 20021103). + * sparc64-build.dpatch: Updated. Lets sparc boostrap again. + * s390-loop.dpatch removed, already fixed upstream (Gerhard Tonn). + * bison.dpatch: Removed, patch submitted upstream. + * backport-java-6865.dpatch: Apply again during build. + * Tighten glibc dependency (closes: #166703). + + -- Matthias Klose Sun, 3 Nov 2002 12:22:02 +0100 + +gcc-3.2 (1:3.2.1ds3-0pre4) unstable; urgency=high + + * gcc-3.2.1 snapshot (CVS 20021020). + - Expansion of _Pragma within macros fixed (closes: #157416). + * FTBFS: With the switch to bison-1.50 (and 1.75), gcc-3.2 fails to build from + source on Debian unstable systems. This is fixed in gcc HEAD, but not on + the current release branch. + HELP NEEDED: + - check what is missing from the patches in debian/patches/bison.dpatch. + This is a backport of the bison related patches, but showing regressions + in the gcc testsuite, so it cannot be applied. + - build gcc using byacc (bootstrap currently fails using byacc). + - build bison-1.35 in it's own package (the current 1.35-3 package fails + to build form source). + - and finally ask upstream to backport the patch to the branch. It's not + helpful not beeing able to follow the stable branch. Maybe we should + just switch to gcc HEAD as BSD does ... + As a terrible workaround, build the sources from CVS first on a machine, + with bison-1.35 installed, then package the tarball, so the bison + generated files are not rebuilt. + + * re-add lost patch: configure with --enable-__cxa_atexit (closes: #163422), + Therefore urgency high. + * gcj-wrapper, gij-wrapper: Accept names starting with `.' (closes: #163172, + #164009). + * Point g++ manpage to correct g++ version (closes: #162843). + * Support for i386-freebsd-gnu (closes: #163883). + * s390-java.dpatch replaced with backport from cvs head (Gerhard Tonn). + * Disable the testsuite run on the Hurd (closes: #159650). + * s390-loop.dpatch added, fixes runtime problem (Gerhard Tonn). + * debian/patches/bison.dpatch: Backport for bison-1.75 compatibility. + Don't use it due to regressions. + * debian/patches/backport-java-6865.dpatch: Directly applied in the + included tarball because of bison problems. + * Make fixincludes priority optional, so linda can depend on it. + * Tighten binutils dependency. + + -- Matthias Klose Sun, 20 Oct 2002 10:52:49 +0200 + +gcc-3.2 (1:3.2.1ds2-0pre3) unstable; urgency=low + + * gcc-3.2.1 snapshot (CVS 20020923). + * Run the libstdc++ check-abi script. Results are put into the file + /usr/share/doc/libstdc++5/README.libstdc++-baseline in the libstdc++5-dev + package. This file contains a new baseline, if no baseline for this + architecture is included in the gcc sources. + * gcj-wrapper: Accept files starting with an underscore, accept + path names (closes: #160859, #161517). + * Explicitely call automake-1.4 when rebuilding Makefiles (closes: #161438). + * Let installed fixincludes script find files in /usr/lib/fixincludes. + * debian/rules.patch: Add .NOTPARALLEL as target, so that patches are + applied sequentially (closes: #159395). + + -- Matthias Klose Tue, 24 Sep 2002 07:36:56 +0200 + +gcc-3.2 (1:3.2.1ds1-0pre2) unstable; urgency=low + + * gcc-3.2.1 snapshot (CVS 20020913). Welcome back m68k in bootstrap land! + * Fix arm-tune.dpatch (closes: #159354). + * Don't overwrite LD_LIBRARY_PATH in build (closes: #158459). + * --disable-__cxa_atexit on NetBSD (closes: #159620). + * Reenable installation of message catalogs (disabled in 3.2-0pre2). + Closes: #160175. + * Ben Collins + - Re-enable sparc64 build. This time, it's part of the default compiler. + I have disabled 64/alt libraries as they are too much overhead. All + libraries build 64bit, but currently only libgcc/libstdc++ include the + 64bit libraries. + Closes: #160404. + * Depend on autoconf2.13, instead of autoconf. + * Phil Blundell + - debian/patches/arm-update.dpatch: Fix python2.2 build failure. + + -- Matthias Klose Sat, 7 Sep 2002 08:05:02 +0200 + +gcc-3.2 (1:3.2.1ds0-0pre1) unstable; urgency=medium + + * gcc-3.2.1 snapshot (CVS 20020829). + New g++ option -Wabi: + Warn when G++ generates code that is probably not compatible with the + vendor-neutral C++ ABI. Although an effort has been made to warn about + all such cases, there are probably some cases that are not warned about, + even though G++ is generating incompatible code. There may also be + cases where warnings are emitted even though the code that is generated + will be compatible. + The current version of the ABI is 102, defined by the __GXX_ABI_VERSION + macro. + * debian/NEWS.*: Updated. + * Fix libstdc++-dev dependency on libc-dev for the Hurd (closes: #157004). + * Add versioned expect build dependency. + * Tighten binutils dependency to 2.13.90.0.4. + * debian/patches/arm-tune.dpatch: Increase stack limit for configure. + * 3.2-0pre4 did build gnat-3.2 compilers for all architectures. Build-Depend + on gnat-3.2 now (closes: #156734). + * Remove bashism's in gcj-wrapper (closes: #157982). + * Add -cp and -classpath options to gij(1). Backport from HEAD (#146634). + * Add fastjar documentation. + + -- Matthias Klose Fri, 30 Aug 2002 10:35:00 +0200 + +gcc-3.2 (1:3.2ds0-0pre4) unstable; urgency=low + + * Correct build dependency on gnat-3.1. + + -- Matthias Klose Mon, 12 Aug 2002 01:21:58 +0200 + +gcc-3.2 (1:3.2ds0-0pre3) unstable; urgency=low + + * gcc-3.2 upstream prerelease. + * Disable all configure options, which are standard: + --enable-threads=posix --enable-long-long, --enable-clocale=gnu + + -- Matthias Klose Fri, 9 Aug 2002 21:59:08 +0200 + +gcc-3.2 (1:3.2ds0-0pre2) unstable; urgency=low + + * gcc-3.2 snapshot (CVS 20020802). + * Fix g++-include dir. + * Don't install the locale files (temporarily, until we don't build + gcc-3.1 anymore). + * New package libgcj-common to avoid conflict with classpath package. + + -- Matthias Klose Sat, 3 Aug 2002 09:08:34 +0200 + +gcc-3.2 (1:3.2ds0-0pre1) unstable; urgency=low + + * gcc-3.2 snapshot (CVS 20020729). + + -- Matthias Klose Mon, 29 Jul 2002 20:36:54 +0200 + +gcc-3.1 (1:3.1.1ds3-1) unstable; urgency=low + + * gcc-3.1.1 release. Following this release we will have a gcc-3.2 + release soon, which is gcc-3.1.1 plus some C++ ABI changes. Once + gcc-3.2 hits the archives, gcc-3.1.1 will go away. + * Don't build the sparc64 compiler. The packaging/patches are + currently broken. + * Add missing headers on m68k and powerpc. + * Install libgcc_s_nof on powerpc. + * Install libffi's copyright and doc files (closes: #152198). + * Remove dangling symlink (closes: #149002). + * libgcj3: Add a conflict to the classpath package (closes: #148664). + * README.C++: Fix URLs. + * libstdc++-dbg: Install into /usr/lib/debug, document it. + * backport-java-6865.dpatch: backport from HEAD. + * Fix typo in gcj docs (closes: #148890). + * Change libstdc++ include dir: /usr/include/c++/3.1. + * libstdc++-codecvt.dpatch: New patch (closes: #149776). + * Build libstdc++-pic package. + * Move 64bit libgcc in its own package libgcc1-64 (closes: #147249). + * Tighten glibc dependency. + + -- Matthias Klose Mon, 29 Jul 2002 00:34:49 +0200 + +gcc-3.1 (1:3.1.1ds2-0pre3) unstable; urgency=low + + * Updated to CVS 2002-06-06 (gcc-3_1-branch). + * Updated s390-java patch (Gerhard Tonn). + * Don't use -O in STAGE1_FLAGS on m68k. + * Fix `-classpath' option in gcj-wrapper script (closes: #150142). + * Remove g++-cxa-atexit patch, use --enable-__cxa_atexit configure option. + + -- Matthias Klose Wed, 3 Jul 2002 23:52:58 +0200 + +gcc-3.1 (1:3.1.1ds1-0pre2) unstable; urgency=low + + * Updated to CVS 2002-06-06 (gcc-3_1-branch), fixing an ObjC regression. + * Welcome m68k to bootstrap land (thanks to Andreas Schwab). + * Add javac wrapper for gcj-3.1 (Michael Koch). + * Remove dangling symlink in /usr/share/doc/gcc-3.1 (closes: #149002). + + -- Matthias Klose Fri, 7 Jun 2002 00:26:05 +0200 + +gcc-3.1 (1:3.1.1ds0-0pre1) unstable; urgency=low + + * Updated to CVS 2002-05-31 (gcc-3_1-branch). + * Change priorities from fastjar and gij-wrapper-3.1 from 30 to 31. + * Update arm-tune patch. + * Install xmmintrin.h header on i386 (closes: #148181). + * Install altivec.h header on powerpc. + * Call correct gij in gij-wrapper (closes: #148662, #148682). + + -- Matthias Klose Wed, 29 May 2002 22:47:40 +0200 + +gcc-3.1 (1:3.1ds2-2) unstable; urgency=low + + * Tighten binutils dependency. + * Fix libstdc include dir for multilibs (Dan Jacobowitz). + + -- Matthias Klose Tue, 21 May 2002 08:03:49 +0200 + +gcc-3.1 (1:3.1ds2-1) unstable; urgency=low + + * GCC 3.1 release. + * Ada cannot be built by the autobuilders for the first time. Do it by hand. + gnatgcc and gnatbind need to be in the PATH. + * Build with CC=gnatgcc, when building the Ada compiler. + * Hurd fixes. + * Don't build the sparc64 compiler; the hack isn't up to date and glibc + isn't converted to use /lib64 and /usr/lib64. + * m68k-linux shows bootstrap comparision failures. If you want to build + the compiler anyway and ignore the bootstrap comparision failure, edit + debian/rules.patch and uncomment the patch to ignore the failure. See + /usr/share/doc/gcc-3.1/BOOTSTRAP_COMPARISION_FAILURE for the differences. + + -- Matthias Klose Wed, 15 May 2002 09:53:00 +0200 + +gcc-3.1 (1:3.1ds1-0pre6) unstable; urgency=low + + * Build from the "final prerelease" tarball (gcc-3.1-20020508.tar.gz). + * Build gnat-3.1-doc package. + * Build fastjar package without building java packages. + * Hurd fixes. + * Updated sparc64-build patch. + * Add s390-ada patch (Gerhard Tonn). + * Undo the dwarf2 support for hppa from -0pre5. + + -- Matthias Klose Thu, 9 May 2002 17:21:09 +0200 + +gcc-3.1 (1:3.1ds0-0pre5) unstable; urgency=low + + * Use /usr/include/g++-v3-3.1 as C++ include dir. + * Update s390-java patch (Gerhard Tonn). + * Tighten binutils dependency (gas patch for m68k-linux). + * Use gnat-3.1 as the gnat package name (as found in gcc/ada/gnatvsn.ads). + * dwarf2 support hppa: a snapshot of the gcc/config/pa directory + from the trunk dated 2002-05-02. + + -- Matthias Klose Fri, 3 May 2002 22:51:37 +0200 + +gcc-3.1 (1:3.1ds0-0pre4) unstable; urgency=low + + * Use gnat-5.00w as the gnat package name (as found in gcc/ada/gnatvsn.ads). + * Don't build the shared libgnat library. It assumes an existing shared + libiberty library. + * Don't install the libgcjgc library. + + -- Matthias Klose Thu, 25 Apr 2002 08:48:04 +0200 + +gcc-3.1 (1:3.1ds0-0pre3) unstable; urgency=low + + * Build fastjar on all architectures. + * Update m68k patches. + * Update s390-java patch (Gerhard Tonn). + + -- Matthias Klose Sun, 14 Apr 2002 15:34:47 +0200 + +gcc-3.1 (1:3.1ds0-0pre2) unstable; urgency=low + + * Add Ada support. To successfully build, a working gnatbind and gcc + driver with Ada support is needed. + * Apply needed arm patches from 3.0.4. + + -- Matthias Klose Sat, 6 Apr 2002 13:17:08 +0200 + +gcc-3.1 (1:3.1ds0-0pre1) unstable; urgency=low + + * First try for gcc-3.1. + + -- Matthias Klose Mon, 1 Apr 2002 23:39:30 +0200 + +gcc-3.0 (1:3.0.4ds3-6) unstable; urgency=medium + + * Second try at fixing sparc build problems. + + -- Phil Blundell Sun, 24 Mar 2002 14:49:26 +0000 + +gcc-3.0 (1:3.0.4ds3-5) unstable; urgency=medium + + * Enable java on ARM. + * Create missing directory to fix sparc build. + + -- Phil Blundell Fri, 22 Mar 2002 20:21:59 +0000 + +gcc-3.0 (1:3.0.4ds3-4) unstable; urgency=low + + * Link with system zlib (closes: #136359). + + -- Matthias Klose Tue, 12 Mar 2002 20:47:59 +0100 + +gcc-3.0 (1:3.0.4ds3-3) unstable; urgency=low + + * Build libf2c (pic and non-pic) with -mieee on alpha-linux. + + -- Matthias Klose Sun, 10 Mar 2002 00:37:24 +0100 + +gcc-3.0 (1:3.0.4ds3-2) unstable; urgency=medium + + * Apply hppa-build patch (Randolph Chung). Closes: #136731. + * Make libgcc1 conflict/replace with libgcc1-sparc64. Closes: #135709. + * gij-3.0 provides the `java' command. Closes: #128947. + * Depend on binutils (>= 2.11.93.0.2-2), allows stripping of libgcj.a + again. Closes: #99307. + * Update README.cross pointing to the README of the toolchain-source + package. + + -- Matthias Klose Wed, 6 Mar 2002 21:53:34 +0100 + +gcc-3.0 (1:3.0.4ds3-1) unstable; urgency=low + + * Final gcc-3.0.4 release. + * debian/rules.d/binary-java.mk: Fix dormant typo, exposed by removing the + duplicate libgcj dependency and adding the gij-3.0 package. + Closes: #134005. + * New patch by Phil Blundell to fix scalapack build error on m68k. + + -- Matthias Klose Wed, 20 Feb 2002 23:59:43 +0100 + +gcc-3.0 (1:3.0.4ds2-0pre020210) unstable; urgency=low + + * Make the base package dependent on the binary-arch target. Closes: #133433. + * Get libstdc++ on arm woring (define _GNU_SOURCE). Closes: #133435. + + -- Matthias Klose Mon, 11 Feb 2002 20:31:12 +0100 + +gcc-3.0 (1:3.0.4ds2-0pre020209) unstable; urgency=high + + * Update to CVS sources (20020209 gcc-3_0-branch). + * Apply patch to fix bootstrap error on arm-linux (submitted upstream + by Phil Blundell). Closes: #130422. + * Make base package architecture any. + * Decouple versioned shlib dependencies from release number for + libobjc as well. + + -- Matthias Klose Sat, 9 Feb 2002 01:30:11 +0100 + +gcc-3.0 (1:3.0.4ds1-0pre020203) unstable; urgency=medium + + * One release critical bug outstanding: + - bootstrap error on arm. + * Update to CVS sources (20020203 gcc-3_0-branch). + * Fixed upstream: PR c/3504: Correct documentation of __alignof__. + Closes: #85445. + * Remove libgcc-powerpc patch, integrated upstream (closes: #131977). + * Tighten binutils build dependency (to address #126162). + * Move jv-convert to gcj package (closes: #131985). + + -- Matthias Klose Sun, 3 Feb 2002 14:47:14 +0100 + +gcc-3.0 (1:3.0.4ds0-0pre020127) unstable; urgency=low + + * Two release critical bugs outstanding: + - bootstrap error on arm. + - bus errors for C++ and java executables on sparc (see the testsuite + results). + * Update to CVS sources (20020125 gcc-3_0-branch). + * Enable java support for s390 architecture (patch from Gerhard Tonn). + * Updated NEWS file for 3.0.3. + * Disable building the gcc-sparc64, but build a multilibbed compiler + for sparc as the default. + * Disabled the subreg-byte patch for sparc (request from Ben Collins). + * Fixed reference to libgcc1 package in README (closes: #126218). + * Do recommend libc-dev, not depend on it. For low-end or embedded systems + the dependency on libc-dev can make the difference between + having enough or having too little space to build a kernel. + * README.cross: Updated by Hakan Ardo. + * Decouple versioned shlib dependencies from release number. Closes: #118391. + * Fix diversions for gcc-3.0-sparc64 package (closes: #128178), + unconditionally remove `sparc64-linux-gcc' alternative. + * g77/README.libg2c.Debian: New file mentioning `libg2c-pic'. The next + g77 version (3.1) does build a static and shared library (closes: #104250). + * Fix formatting errors in the synopsis of the java man pages. Maybe the + reason for #127571. Closes: #127571. + * fastjar: Fail for the (currently incorrect) -u option. Addresses: #116145. + Add alternative for `jar' using priority 30 (closes: #118648). + * jv-convert: Add --help option and man page. Backport from HEAD branch. + * libgcj2-dev: Remove duplicate dependency (closes: #127805). + * Giving up and make just another new package gij-X.Y with only the gij-X.Y + binary for policy conformance (closes: #127111). + * gij: Provides an alternative for `java' (priority 30) using a wrapper + script (Stephen Zander) (closes: #128974). Added simple manpage. + + -- Matthias Klose Sun, 27 Jan 2002 13:33:41 +0100 + +gcc-3.0 (1:3.0.3ds3-1) unstable; urgency=low + + * Final gcc-3.0.3 release. + * Do not compress .txt files in libstdc++ docs referenced from html + pages (closes: #124136). + * libstdc++-dev suggests libstdc++-doc. + * debian/patches/gcc-ia64-NaT.dpatch: Update (closes: #123685). + + -- Matthias Klose Fri, 21 Dec 2001 02:54:11 +0100 + +gcc-3.0 (1:3.0.3ds2-0pre011215) unstable; urgency=low + + * Update to CVS sources (011215). + * libstdc++ documentation updated upstream (closes: #123790). + * debian/patches/gcc-ia64-NaT.dpatch: Disable. Fixes bootstrap error + on ia64 (#123685). + + -- Matthias Klose Sat, 15 Dec 2001 14:43:21 +0100 + +gcc-3.0 (1:3.0.3ds1-0pre011210) unstable; urgency=medium + + * Update to CVS sources (011208). + * Supposed to fix powerpc build error (closes: #123155). + + -- Matthias Klose Thu, 13 Dec 2001 07:26:05 +0100 + +gcc-3.0 (1:3.0.3ds0-0pre011209) unstable; urgency=medium + + * Update to CVS sources (011208). Frozen for upstream 3.0.3 release. + * Apply contrib/PR3145.patch, a backport of Nathan Sidwell's patch to + fix PR c++/3145, the infamous "virtual inheritance" bug. This affected + especially KDE2 (eg. artsd). Franz Sirl + * cc1plus segfault in strength reduction fixed upstream. Closes: #122547. + * debian/patches/gcc-ia64-NaT.dpatch: Add patch to avoid a bug that can + cause miscompiled userapps to crash the kernel. Closes: #121924. + * Reenable shared libgcc for powerpc. Fixed upstream. + http://gcc.gnu.org/ml/gcc-patches/2001-11/msg00340.html + debian/patches/libgcc-powerpc.dpatch: New patch. + * Add upstream changelogs. + * Remove gij alternative. Move to gij package. + + -- Matthias Klose Sun, 9 Dec 2001 09:36:48 +0100 + +gcc-3.0 (1:3.0.2ds4-4) unstable; urgency=medium + + * Disable building of libffi on mips and mipsel. + (closes: #117503). + * Enable building of shared libgcc on s390 + (closes: #120452). + + -- Christopher C. Chimelis Sat, 1 Dec 2001 06:15:29 -0500 + +gcc-3.0 (1:3.0.2ds4-3) unstable; urgency=medium + + * Fix logic to build libffi without java (closes: #117503). + + -- Matthias Klose Sun, 4 Nov 2001 14:34:50 +0100 + +gcc-3.0 (1:3.0.2ds4-2) unstable; urgency=medium + + * Enable java for ia64 (Jeff Licquia). Closes: #116798. + * Allow building of libffi without gcj (Jeff Licquia). + New libffi packages for arm hurd-i386 mips mipsel, + still missing: hppa, s390. + * debian/NEWS.gcc: Add 3.0.2 release notes. + * debian/patches/hppa-align.dpatch: New patch from Alan Modra, + submitted by Randolph Tausq. + + -- Matthias Klose Thu, 25 Oct 2001 23:59:31 +0200 + +gcc-3.0 (1:3.0.2ds4-1) unstable; urgency=medium + + * Final gcc-3.0.2 release. The source tarball is not the released + tarball, but taken from CVS 011024). + * Remove patch for s390, included upstream. + + -- Matthias Klose Wed, 24 Oct 2001 00:49:40 +0200 + +gcc-3.0 (1:3.0.2ds3-0pre011014) unstable; urgency=low + + * Update to CVS sources (011014). Frozen for upstream 3.0.2 release. + Closes: #109351, #114099, #114216, #105741 (allegro3938). + * Added debian/patches/fastjar.dpatch, which makes fastjar extract + filenames correctly (previously, some had incorrect names on extract). + Closes: #113236. + * Priorities fixed in the past (closes: #94404). + + -- Matthias Klose Sun, 14 Oct 2001 13:19:43 +0200 + +gcc-3.0 (1:3.0.2ds2-0pre010923) unstable; urgency=low + + * Bootstraps on powerpc again (closes: #112777). + + -- Matthias Klose Sun, 23 Sep 2001 01:32:11 +0200 + +gcc-3.0 (1:3.0.2ds2-0pre010922) unstable; urgency=low + + * Update to CVS sources (010922). + * Fixed upstream (closes: #111801). #105569 on hppa. + * Update hppa patch (Matt Taggart). + * Fix libstdc++-dev package description (closes: #112758). + * debian/rules.d/binary-objc.mk: Fix build error (closes: #112462). + * Make gobjc-3.0 conflict with gcc-3.0-sparc64 (closes: #111772). + + -- Matthias Klose Sat, 22 Sep 2001 09:34:49 +0200 + +gcc-3.0 (1:3.0.2ds1-0pre010908) unstable; urgency=low + + * Update to CVS sources (010908). + * Update hppa patch (Matt Taggart). + * Depend on libgc6-dev, not libgc5-dev, which got obsolete (during + the freeze ...). However adds s390 support (closes: #110189). + * debian/patches/m68k-reload.dpatch: New patch (Roman Zippel). + Fixes #89023. + * debian/patches/gcc-sparc.dpatch: New patch ("David S. Miller"). + Fixes libstdc++ testsuite failures on sparc. + + -- Matthias Klose Sat, 8 Sep 2001 14:26:20 +0200 + +gcc-3.0 (1:3.0.2ds0-0pre010826) unstable; urgency=low + + * gcc-3.0-nof: Fix symlink to gcc-3.0-base doc directory. + * debian/patches/gcj-without-rpath: New patch. + * Remove self dependency on libgcj package. + * Handle diversions for upgrades from 3.0 and 3.0.1 -> 3.0.2 + in gcc-3.0-sparc64 package. + * Build libg2c.a with -fPIC -DPIC and name the result libg2c-pic.a. + Link with this library to avoid linking with non-pic code. + Use this library when building dynamically loadable objects (python + modules, gimp plugins, ...), which need to be linked against g2c or + a library which is linked against g2c (i.e. lapack). + Packages needing '-lg2c-pic' must have a build dependency on + 'g77-3.0 (>= 1:3.0.2-0pre010826). + + -- Matthias Klose Sun, 26 Aug 2001 13:59:03 +0200 + +gcc-3.0 (1:3.0.2ds0-0pre010825) unstable; urgency=low + + * Update to CVS sources (010825). + * Add libc6-dev-sparc64 to gcc-3.0-sparc64 and to sparc build dependencies. + * Remove conflicts on egcc package (closes: #109718). + * Fix gcc-3.0-nof dependency. + * s390 patches against gcc-3.0.1 (Gerhard Tonn). + * debian/control: Require binutils (>= 2.11.90.0.27) + + -- Matthias Klose Sat, 25 Aug 2001 10:59:15 +0200 + +gcc-3.0 (1:3.0.1ds3-1) unstable; urgency=low + + * Final gcc-3.0.1 release. + * Changed upstream: default of -flimit-inline is 600 (closes: #106716). + * Add fastjar man page (submitted by "The Missing Man Pages Project", + http://www.netmeister.org/misc/m2p2i/) (closes: #103051). + * Fixed in last upload as well: #105246. + * debian/patches/cpp-memory-leak.dpatch: New patch + * Disable installation of shared libgcc on s390 (Gerhard Tonn). + + -- Matthias Klose Mon, 20 Aug 2001 20:47:13 +0200 + +gcc-3.0 (1:3.0.1ds2-0pre010811) unstable; urgency=high + + * Update to CVS sources (010811). Includes s390 support. + * Add xlibs-dev to Build-Depends (libgcj). + * Enable java for powerpc, disable java for ia64. + * Enable ObjC garbage collection for all archs, which have a libgc5-dev + package. + * New patch libstdc++-codecvt (Michael Piefel) (closes: #104614). + * Don't strip static libgcj library (work around binutils bug #107812). + * Handle diversions for upgrade 3.0 -> 3.0.1 in gcc-3.0-sparc64 package + (closes: #107569). + + -- Matthias Klose Sat, 11 Aug 2001 20:42:15 +0200 + +gcc-3.0 (1:3.0.1ds1-0pre010801) unstable; urgency=high + + * Update to CVS sources (010801). (closes: #107012). + * Remove build dependency on non-free graphviz and include pregenerated + docs (closes: #107124). + * Fixed in 3.0.1 (closes: #99307). + * Updated m68k-updates patch (Roman Zippel). + * Another fix for ia64 packaging bits (Randolph Chung). + + -- Matthias Klose Tue, 31 Jul 2001 21:52:55 +0200 + +gcc-3.0 (1:3.0.1ds0-0pre010727) unstable; urgency=high + + * Update to CVS sources (010727). + * Add epoch to source version. Change '.dsx' to 'dsx', so that + 3.1.1ds0 gt 3.1ds7 (closes: #106538). + + -- Matthias Klose Sat, 28 Jul 2001 09:56:29 +0200 + +gcc-3.0 (3.0.1.ds0-0pre010723) unstable; urgency=high + + * ia64 packaging bits (Randolph Chung) (closes: #106252). + + -- Matthias Klose Mon, 23 Jul 2001 23:02:03 +0200 + +gcc-3.0 (3.0.1.ds0-0pre010721) unstable; urgency=high + + * Update to CVS sources (010721). + - Remove patches applied upstream: libstdc++-limits.dpatch, + objc-data-references + - Updated other patches. + * Fix gij alternative (closes: #103468, #103883). + * Patch to fix bootstrap on sparc (closes: #103568). + * Corrected (closes: #105371) and updated README.Debian. + * m68k patches for sucessful bootstrap (Roman Zippel). + * Add libstdc++v3 porting hints to README.Debian and README.C++. + * m68k md fix (#105622) (Roman Zippel). + * debian/rules2: Disable non-functional ulimit on Hurd (#105884). + * debian/control: Require binutils (>= 2.11.90.0.24) + * Java is enabled for alpha (closes: #87300). + + -- Matthias Klose Sun, 22 Jul 2001 08:24:04 +0200 + +gcc-3.0 (3.0.ds9-4) unstable; urgency=high + + * Move this version to testing ASAP. testing still has a prerelease + version with now incompatible ABI's. If sparc doesn't build, + then IMHO it's better to remove it from testing. + * debian/control.m4: Set uploaders field. Adjust description of + gcc-3.0 (binary) package (closes: #102271, #102620). + * Separate gij.1 in it's own pseudo man page (closes: #99523). + * debian/patches/java-manpages.dpatch: New patch. + * libgcj: Install unversioned gij. + + -- Matthias Klose Tue, 3 Jul 2001 07:38:08 +0200 + +gcc-3.0 (3.0.ds9-3) unstable; urgency=high + + * Reenable configuration with posix threads on i386 (lost in hurd-i386 + merge). + + -- Matthias Klose Sun, 24 Jun 2001 22:21:45 +0200 + +gcc-3.0 (3.0.ds9-2) unstable; urgency=medium + + * Move this version to testing ASAP. testing still has a prerelease + version with now incompatible ABI's. + * Add libgcc0 and libgcc300 to the build conflicts (#102041). + * debian/README.FIRST: Removed (#101534). + * Updated subreg-byte patch (doc files). + * Disable java for the Hurd, mips and mipsel (#101570). + * Patch for building on the Hurd (#101708) (Jeff Bailey ). + * Packaging fixes for the Hurd (#101711) (Jeff Bailey ). + * Include pregenerated doxygen (1.2.6) docs for libstdc++-v3 (#101557). + The current doxygen-1.2.8.1 segaults. + * C++: Enable -fuse-cxa-atexit by default (#101901). + * Correct mail address in gccbug (#101743). + * Make rules resumable after failure in binary-xxx targets (#101637). + + -- Matthias Klose Sun, 24 Jun 2001 16:04:53 +0200 + +gcc-3.0 (3.0.ds9-1) unstable; urgency=low + + * Final 3.0 release. + * Update libgcc version number (#100983, #100988, #101069, #101115, #101328). + * Updated hppa-build patch (Matt Taggart ). + * Disable java for hppa. + * Updated subreg-byte patch for sparc (Ben Collins). + + -- Matthias Klose Mon, 18 Jun 2001 18:26:04 +0200 + +gcc-3.0 (3.0.ds8-0pre010613) unstable; urgency=low + + * Update patches for recent (010613 23:13 +0200) CVS sources. + * Fix packaging bugs (#100459, #100447, #100483). + * Build-Depend on gawk, mawk doesn't work well with test_summary. + + -- Matthias Klose Wed, 13 Jun 2001 23:13:38 +0200 + +gcc-3.0 (3.0.ds7-0pre010609) unstable; urgency=low + + * Fix build dependency for the hurd (#99164). + * Update patches for recent (010609) CVS sources. + * Disable java on powerpc (link error in libjava). + * gcc-3.0-base.postinst: Don't prompt for non-interactive installs (#100110). + + -- Matthias Klose Sun, 10 Jun 2001 09:45:57 +0200 + +gcc-3.0 (3.0.ds6-0pre010526) unstable; urgency=high + + * Urgency "high" for replacing the gcc-3.0 snapshots in testing, which + now are incompatile due to the changed ABIs. + * Upstream begins tagging with "gcc-3_0_pre_2001mmdd". + * Tighten dependencies to install only binary packages derived from + one source (#98851). Tighten libc6-dev dependency to match libc6. + + -- Matthias Klose Sun, 27 May 2001 11:35:31 +0200 + +gcc-3.0 (3.0.ds6-0pre010525) unstable; urgency=low + + * ATTENTION: The ABI (exception handling) changed. No upgrade path from + earlier snapshots (you had been warned in the postinst ...) + Closing #93597, #94576, #96448, #96461. + You have to rebuild + * HELP is appreciated for scanning the Debian BTS and sending followups + to bug reports!!! + * Should we name debian gcc uploads? What about a "still seeking + g++ maintainer" upload? + * Fixed in gcc-3.0: #97030 + * Update patches for recent (010525) CVS sources. + * Make check depend on build target (fakeroot problmes). + * debian/rules.d/binary-libgcc.mk: new file, build first. + * Free memory detection on the hurd for running the testsuite. + * Update debhelper build dependency. + * libstdc++-doc: Include doxygen generated docs. + * Fix boring packaging bugs, too tired for appropriate changelogs ... + #93343, #96348, #96262, #97134, #97905, #96451, #95812, #93157 + * Fixed bugs: #87000. + + -- Matthias Klose Sat, 26 May 2001 23:10:42 +0200 + +gcc-3.0 (3.0.ds5-0pre010510) unstable; urgency=low + + * Update patches for recent (010506) CVS sources. + * New version of source, as of 2001-05-10 + * New version of gpc source, as of 2001-05-06 (disabled by default). + * Make gcc-3.0-sparc64 provide an alternative for sparc64-linux-gcc, + since it can build kernels just fine (it seems) + * Add hppa patch from Matt Taggart + * Fix objc info inclusion...now merged with gcc info + * Do not install the .la for libstdc++, since it confuses libtool linked + applications when libstdc++3-dev and libstdc++2.10-dev are both + installed (closes #97905). + * Fixed gcc-base and libgcc section/prio to match overrides + + -- Ben Collins Mon, 7 May 2001 00:08:52 +0200 + +gcc-3.0 (3.0.ds5-0pre010427) unstable; urgency=low + + * Fixed priority for fastjar from optional to extra + * New version of source, as of 2001-04-27 + * Fix description of libgcj-dev + * libffi-install: Make libffi installable + * Add libffi and libffi-dev packages. libffi is only enabled for java + targets right now. Perhaps more will be enabled later. + * Fixes to build cross compiler package (for avr) + (Hakan Ardo ). + * Better fixincludes description (#93157). + * Remove all remnants of libg++ + * Remove all hacks around libstdc++ version. Since we are strictly v3 now, + we can treat it like a normal shared lib, and not worry about all those + ABI changes. + * Remove all cruft control scripts. Note, debhelper will create scripts + that it needs to. It will do the doc link stuff and the ldconfig stuff + explicitly. + * Clean up the SONAME parsing stuff, make it a little more cleaner over + all the lib packages + * Make libffi install when built (IOW, whenever java is enabled). This + should obsolete the libffi package, which is old and broken + * Revert to normal sonames, except for ia64 (for now) + * Remove all references to dh_testversion, since they are deprecated for + Build-Depends + * Fix powerpc nof build + * Remove all references to the MULTILIB stuff, since the arches are + using specialized builds anyway (nof, softfloat). + * Added 64bit sparc64 package (gcc-3.0-sparc64, libgcc0-sparc64) + * Removed obsolete shlibs.local file + + -- Ben Collins Sun, 15 Apr 2001 21:33:15 -0400 + +gcc-3.0 (3.0.ds4-0pre010403) unstable; urgency=low + + * debian/README: Updated for gcc-3.0 + * debian/rules.patch: Added subreg-byte patch for sparc + * debian/rules.unpack: Update to current CVS for gcc tarball name + * debian/patches/subreg-byte.dpatch: sparc subreg-byte support + * debian/patches/gcc-rawhide.dpatch: Removed + debian/patches/gpc-2.95.dpatch: Removed + debian/patches/sparc32-rfi.dpatch: Removed + debian/patches/temporary.dpatch: Removed + * Moving to unstable now + * debian/patches/gcc-ppc-disable-shared-libgcc.dpatch: New patch, + disables shared libgcc for powerpc target, since it isn't compatible + with the EABI objects. + * Create $(with_shared_libgcc) var + * debian/rules.d/binary-gcc.mk: Use this new variable to determine if + the libgcc package actually has any files + + -- Ben Collins Tue, 3 Apr 2001 23:00:55 -0400 + +gcc-3.0 (3.0.ds2-0pre010223) experimental; urgency=low + + * New snapshot. Use distinct shared object names for shared libraries: + we don't know if binary API's still change until the final release. + * Versioned package names. + * debian/control.m4: New file. Add gcc-base, libgcc0, libobjc1, + libstdc++-doc, libgcj1, libgcj1-dev, fastjar, fixincludes packages. + Remove gcc-docs package. + * debian/gcov.1: Remove. + * debian/*: Remove 2.95.x support. Prepare for 3.0. + * debian/patches: Remove 2.95.x patches. + * Changed source package name. It's not allowed anymore to overwrite + source packages with different content. Introducing a 'debian source + element' (.ds), which is stripped again from the version number + for the binary packages. + * Fixed bugs and added functionality: + #26436, #27878, #33786, #34876, #35477, #42662, #46181, #42989, + #47981, #48530, #50529, #51227, #51456, #51651, #52382, #53698, + #55291, #55967, #56867, #58219, #59005, #59232, #59776, #64628, + #65687, #67631, #68632, #68963, #68987, #69530, #72933, #75120, + #75759, #76645, #76827, #83221, #87540 + * libgcj fixes: 42894, #51266, #68560, #71187, #79984 + + -- Matthias Klose Sat, 24 Feb 2001 13:41:11 +0100 + +gcc-2.95 (2.95.3-2.001222) experimental; urgency=low + + * New upstream version 2.95.3 experimental (CVS 20001222). + * debian/control.in: Versioned package names, removal of snapshot logic. + Remove fake gcc-docs package. + * Reserve -1 release numbers for woody. + * Updated to gpc-20001218. + + -- Matthias Klose Fri, 22 Dec 2000 19:53:03 +0100 + +gcc (2.95.2-20) unstable; urgency=low + + * Apply patch from gcc-2_95-branch; remove ulimit for make check. + + -- Matthias Klose Sun, 10 Dec 2000 17:01:13 +0100 + +gcc (2.95.2-19) unstable; urgency=low + + * Added testsuite-20001207 from current snapshots. We'll need results + for 2.95.2 to make sure there are no regressions against that release. + Dear build daemons and porters to other architectures, please send an + email to gcc-testresults@gcc.gnu.org. + You can do this by running "debian/rules mail-summary". + * Updated to gpc-20001206. + * Added S/390 patch prepared by Chu-yeon Park (#78983). + * debian/patches/libio.dpatch: Fix iostream doc (fixes #77647). + * debian/patches/gcc-doc.dpatch: Update URL (fixes #77542). + * debian/patches/gcc-reload1.dpatch Patch from the gcc-bug list which + fixes a problem in "long long" on i[345]86 (i686 was not affected). + + -- Matthias Klose Sat, 9 Dec 2000 12:30:32 +0100 + +gcc (2.95.2-18) unstable; urgency=low + + * debian/control.in: Fix syntax errors (fixes #76146, #76458). + Disable gpc on the hurd by request (#75686). + * debian/patches/arm-various.dpatch: Patches from Philip Blundell + for ARM arch (fixes #75801). + * debian/patches/gcc-alpha-mi-thunk.dpatch: Patches from Chris Chimelis + for alpha arch. + * debian/patches/g77-docs.dpatch: Adjust g77 docs (fixes #72594). + * Update gpc to gpc-20001118. + * Reenable gpc for alpha. + * debian/README.C++: Merge debian/README.libstdc++ and C++ FAQ information + provided by Matt Zimmermann. + * Build gcj only on architectures, where libgcj-2.95.1 can be built as well. + Probably needs some adjustments ... + * Conditionalize for chill, fortran, java, objc and chill. + + * NOT APPLIED: + debian/patches/libstdc++-bastring.dpatch: Apply fix (fixes #75759). + + -- Matthias Klose Sun, 19 Nov 2000 10:40:41 +0100 + +gcc (2.95.2-17) unstable; urgency=low + + * Disable gpc for alpha. + * Include gpc-cpp in gpc package (fixes #74492). + * Don't build gcc-docs compatibility package anymore. + + -- Matthias Klose Wed, 11 Oct 2000 06:16:53 +0200 + +gcc (2.95.2-16) unstable; urgency=low + + * Applied the emdebian/cross compiler patch and documentation + (Frank Smith ). + * Applied patch for avr target (Hakan Ardo ). + * debian/control.in: Add awk to Build-Depends. + Tighten libc6-dev dependency for libstdc++-dev (fixes #73031, + #72531, #72534). + * Disable libobjc_gc for m68k again (fixes #74380). + * debian/patches/arm-namespace.dpatch: Apply patch from Philip + Blundell to fix name space pollution on arm + (fixes #70937). + * Fix more warnings in STL headers (fixes #69352, #71943). + + -- Matthias Klose Mon, 9 Oct 2000 21:51:41 +0200 + +gcc (2.95.2-15) unstable; urgency=low + + * debian/control.in: Add libgc5-dev to build depends (fixes #67015). + * debian/rules.def: Build GC enabled ObjC runtime for sparc. + * Bug #58741 fixed (in some version since 2.95.2-5). + * debian/control.in: Recommend librx1g-dev, libgmp2-dev, libncurses5-dev + (unit dependencies). + * Patches from Marcus Brinkmann for the hurd (fixes #67763): + - debian/rules.defs: Disable objc_gc on hurd-i386. + Disable libg++ on GNU systems. + - debian/rules2: Set correct names of libstdc++/libg++ + libraries on GNU systems. + Write out correct shlibs and shlibs.local file content. + - Keep _G_config.h for the Hurd. + * Apply patch for ObjC linker warnings. + * Don't apply gcj backport patch for sparc. + * Apply libio compatability patch + * debian/glibcver.sh: generate appropriate version for glibc + * debian/rules.conf: for everything after glibc 2.1, we always append + "-glibc$(ver)" to the C++ libs for linux. + * Back down gpc to -13 version (-14 wont compile on anything but i386 + and m68k becuase of gpc). + * Remove extraneous and obsolete sparc64 patches/files from debian/* + + -- Ben Collins Thu, 21 Sep 2000 08:08:35 -0400 + +gcc-snapshot (20000901-2.2) experimental; urgency=low + + * New snapshot. + * debian/rules2: Move tradcpp0 to cpp package. + + -- Matthias Klose Sat, 2 Sep 2000 01:14:28 +0200 + +gcc-snapshot (20000802-2.1) experimental; urgency=low + + * New snapshot. + * debian/rules2: Fixes. tradcpp0 is in gcc package, not cpp. + + -- Matthias Klose Thu, 3 Aug 2000 07:40:05 +0200 + +gcc-snapshot (20000720-2) experimental; urgency=low + + * New snapshot. + * Enable libstdc++-v3. + * debian/rules2: Don't use -D for /usr/bin/install. + + -- Matthias Klose Thu, 20 Jul 2000 22:33:37 +0200 + +gcc (2.95.2-14) unstable; urgency=low + + * Update gpc patch. + + -- Matthias Klose Wed, 5 Jul 2000 20:51:16 +0200 + +gcc (2.95.2-13) frozen unstable; urgency=low + + * Update debian/README: document how to compile 2.0.xx kernels; don't + register gcc272 as an alternative for gcc (closes #62419). + Clarify compiler setup (closes #65548). + * debian/control.in: Make libstdc++-dev depend on current version of g++. + * Undo CVS update from release -8 (problems on alpha, #55263). + + -- Matthias Klose Mon, 19 Jun 2000 23:06:48 +0200 + +gcc (2.95.2-12) frozen unstable; urgency=low + + * debian/gpc.postinst: Correct typo introduced with -11 (fixes #64193). + * debian/patches/gcc-rs600.dpatch: ppc codegen fix (fixes #63933). + + -- Matthias Klose Sun, 21 May 2000 15:56:05 +0200 + +gcc (2.95.2-11) frozen unstable; urgency=medium + + * Upload to unstable again (fixes critical #63784). + * Fix doc-base files (fixes important #63810). + * gpc wasn't built in -10 (fixes #63977). + * Make /usr/bin/pc an alternative (fixes #63888). + * Add SYSCALLS.c.X to gcc package. + + -- Matthias Klose Sun, 14 May 2000 22:17:44 +0200 + +gcc (2.95.2-10) frozen; urgency=low + + * debian/control.in: make gcc conflict on any version of egcc + (slink to potato upgrade problem, fixes grave #62084). + * Build protoize programs, separate out in new package (fixes #59436, + #62911). + * Create dummy gcc-docs package for smooth update from slink (fixes #62537). + * Add doc-base support for all -doc packages (fixes #63380). + + -- Matthias Klose Mon, 1 May 2000 22:24:28 +0200 + +gcc (2.95.2-9) frozen unstable; urgency=low + + * Disable the sparc-bi-arch.dpatch (patch from Ben Collins, built + for sparc as NMU 8.1) (fixes critical #61529 and #61511). + "Seems that when you compile gcc 2.95.x for sparc64-linux and compile + sparc32 programs, the code is not the same as sparc-linux compile for + sparc32 (this is a bug, and is fixed in gcc 2.96 CVS)." + * debian/patches/gcj-vs-iconv.dpatch: Option '--encoding' for + encoding of input files. Patch from Tom Tromey + backported to 2.95.2 (fixes #42895). + Compile a Latin-1 encoded file with `gcj --encoding=Latin1 ...'. + * debian/control.in: gcc, g++ and gobjc suggest their corresponding + task packages (fixes #59623). + + -- Matthias Klose Sat, 8 Apr 2000 20:19:15 +0200 + +gcc (2.95.2-8) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000313. + * debian/rules2: configure with --enable-java-gc=no for sparc. Fixes + gcj side of #60535. + * debian/rules.patch: Disable gcc-emit-rtl patch for all archs but + alpha. Disable g++-is-tree patch ("just for 2.95.1"). + * debian/README: Update for gcc-2.95. + + -- Matthias Klose Mon, 27 Mar 2000 00:03:16 +0200 + +gcc (2.95.2-7) frozen unstable; urgency=low + + * debian/patches/gcc-empty-struct-init.dpatch; Apply patch from + http://gcc.gnu.org/ml/gcc-patches/2000-02/msg00637.html. Fixes + compilation of 2.3.4x kernels. + * debian/patches/gcc-emit-rtl.dpatch: Apply patch from David Huggins-Daines + (backport from 2.96 CVS to fix #55263). + * debian/patches/gcc-pointer-arith.dpatch: Apply patch from Jim Kingdon + (backport from 2.96 CVS to fix #54951). + + -- Matthias Klose Thu, 2 Mar 2000 23:16:43 +0100 + +gcc (2.95.2-6) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000220. + * Remove dangling symlink probably left over from libstdc++2.9 + package (fixes #53661). + * debian/patches/gcc-alpha-complex-float.dpatch: Fixed patch by + David Huggins-Daines (fixes #58486). + * debian/g++.{postinst,prerm}: Remove outdated g++FAQ registration + (fixes #58253). + * debian/control.in: gcc-doc replaces gcc-docs (fixes #58108). + * debian/rules2: Include some fixed headers (asm, bits, linux, ...). + * debian/patches/{gcc-alpha-ev5-fix,libstdc++-valarray}.dpatch: Remove. + Applied upstream. + * debian/patches/libstdc++-bastring.dpatch: Add patch from + sicard@bigruth.solsoft.fr (fixes #56715). + + -- Matthias Klose Sun, 20 Feb 2000 15:08:13 +0100 + +gcc (2.95.2-5) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000116. + * Add more build dependencies (fixes #53204). + * debian/patches/gcc-alpha-complex-float.dpatch: Patch from + Joel Klecker to compile glibc correctly on alpha. + "Should fix the g77 problems too." + * debian/patches/{libio,libstdc++-wall2}.dpatch. Remove patches + applied upstream. + + -- Matthias Klose Sun, 16 Jan 2000 19:16:54 +0100 + +gcc (2.95.2-4) unstable; urgency=low + + * debian/patches/libio.dpatch: Patch from Martin v. Loewis. + (fixes: #35628). + * debian/patches/libstdc++-deque.dpatch: Patch from Martin v. Loewis. + (fixes: #52689). + * debian/control.in: Updated Build-Depends, removed outdated README.build. + Fixes #51246. + * Tighten dependencies to cpp (>= 2.95.2-4) (closes: #50294). + * debian/rules.patch: Really do not apply patches/gcj-backport.dpatch. + Fixes #51636. + * Apply updated sparc-bi-arch.dpatch from Ben Collins. + * libstdc++: Define wstring type, if __ENABLE_WSTRING is defined. Request + from the author of the War FTP Daemon for Linux ("Jarle Aase" + ). + * debain/g++.preinst: Remove dangling sysmlinks (fixes #52359). + + -- Matthias Klose Sun, 19 Dec 1999 21:53:48 +0100 + +gcc (2.95.2-3) unstable; urgency=low + + * debian/rules2: Don't install $(gcc_lib_dir)/include/asm; these are + headers fixed for glibc-1.x (closes: #49434). + * debian/patches/cpp-dos-newlines.dpatch: Keep CR's without + following LF (closes: #49186). + * Bug #37358 (internal compiler errors when building vdk_0.6.0-5) + fixed in gcc-2.95.? (closes: #37358). + * Apply patch gcc-alpha-ev5-fix from Richard Henderson + (should fix #48527 and #46963). + * debian/README.Bugs: Documented non bug #44554. + * Applied patch from Alexandre Oliva to fix gpc boostrap on alpha. + Reenabled gpc on all architectures. + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 19991108. + * Explicitely generate postinst/prerm chunks for usr/doc transition. + debhelper currently doesn't handle generation for packages with + symlinked directories. + * debian/patches/libstdc++-wall3.dpatch: Fix warnings in stl_deque.h + and stl_rope.h (closes: #46444, #46720). + * debian/patches/gcj-backport.dpatch: Add file, don't apply (yet). + + -- Matthias Klose Wed, 10 Nov 1999 18:58:45 +0100 + +gcc (2.95.2-2) unstable; urgency=low + + * New gpc-19991030 snapshot. + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 19991103. + * Reintegrated sparc patches (bcollins@debian.org), which were lost + in 2.95.2-1. + * debian/rules2: Only install $(gcc_lib_dir)/include/asm, when existing. + * debian/patches/gpc-2.95.{dpatch,diff}: updated patch to drop + initialization in stor-layout.c. + * debian/NEWS.gcc: Updated for gcc-2.95.2. + * debian/bugs/bug-...: Removed testcases for fixed bugs. + * debian/patches/...dpatch: Removed patches applied upstream. + * debian/{rules2,g++.postinst,g++.prerm}: Handle c++ alternative. + * debian/changelog: Merged gcc272, egcs and snapshot changelogs. + + -- Matthias Klose Tue, 2 Nov 1999 23:09:23 +0200 + +gcc (2.95.2-1.1) unstable; urgency=low + + * Most of the powerpc patches have been applied upstream. Remove all + but ppc-ice, ppc-andrew-dwarf-eh, and ppc-descriptions. + * mulilib-install.dpatch was definitely a bad idea. Fix it properly + by using install -D. + * Also, don't make directories before installing any more. Simplifies + rules a (tiny) bit. + * Do not build with LDFLAGS=-s. Everything gets stripped out anyway by + dh_strip -a -X_debug; so leave the binaries in the build tree with + debugging symbols for simplified debugging of the packages. + + -- Daniel Jacobowitz Sat, 30 Oct 1999 12:40:12 -0400 + +gcc (2.95.2-1) unstable; urgency=low + + * gcc-2.95.2 release (taken from the CVS archive). -fstrict-aliasing + is disabled upstream. + + -- Matthias Klose Mon, 25 Oct 1999 10:26:19 +0200 + +gcc (2.95.2-0pre4) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19991021. + * Updated gpc to gpc-19991018 snapshot (closes: #33037, #47453). + Enable gpc for all architectures ... + * Document gcc exit codes (closes: #43863). + * According to the bug submitter (Sergey V Kovalyov ) + the original source of these CERN librarties is outdated now. The latest + version of cernlibs compiles and works fine with slink (closes #31546). + * According to the bug submitter (Gergely Madarasz ), + the problem triggered on i386 cannot be reproduced with the current + jade and php3 versions anymore (closes: #35215). + * Replace corrupted m68k-pic.dpatch (from Roman Hodek and Andreas Schwab + and apply to + all architectures (closes: #48011). + * According to the bug submitter (Herbert Xu ) + this bug "probably has been fixed". Setting it to severity "fixed" + (fixes: #39616), will close it later ... + * debian/README.Bugs: Document throwing C++ exceptions "through" C + libraries (closes: #22769). + + -- Matthias Klose Fri, 22 Oct 1999 20:33:00 +0200 + +gcc (2.95.2-0pre3) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19991019. + * Apply NMU patches (closes: #46217). + * debian/control.in: Fix egcs64 conflict-dependency for sparc + architecture (closes: #47088). + * debian/rules2: dbg-packages share doc dir with lib packages + (closes #45067). + * debian/patches/gcj-debian-policy.dpatch: Patch from Stephane + Bortzmeyer to conform to Debian policy (closes: #44463). + * debian/bugs/bug-*: Added test cases for new bug reports. + * debian/patches/libstdc++-bastring.dpatch: Patch by Richard Kettlewell + (closes #46550). + * debian/rules.patch: Apply libstdc++-wall2 patch (closes #46609). + * debian/README: Fix typo (closes: #45253). + * debian/control.in: Remove primary/secondary distinction; + dbg-packages don't provide their normal counterparts (closes #45206). + * debian/rules.patch: gcc-combine patch applied upstream. + * debian/rules2: Only use mail if with_check is set (off by default). + * debian/rules.conf: Tighten binutils dependency to 2.9.5.0.12. + + -- Matthias Klose Tue, 19 Oct 1999 20:33:00 +0200 + +gcc (2.95.2-0pre2.0.2) unstable; urgency=HIGH (for m68k) + + * Binary-only NMU for m68k as quick fix for another bug; the patch + is in CVS already, too. + * Applied another patch by Andreas Schwab to fix %a5 restauration in + some cases. + + -- Roman Hodek Thu, 30 Sep 1999 16:09:15 +0200 + +gcc (2.95.2-0pre2.0.1) unstable; urgency=HIGH (for m68k) + + * Binary-only NMU for m68k as quick fix for serious bugs; the patches + are already checked into gcc CVS and should be in the next official + version, too. + * Applied two patches by Andreas Schwab to fix -fpic and loop optimization. + + -- Roman Hodek Mon, 27 Sep 1999 15:32:49 +0200 + +gcc (2.95.2-0pre2) unstable; urgency=low + + * Fixed in 2.95.2 (closes: #43478). + * Previous version had Pascal examples missing in doc directory. + + -- Matthias Klose Wed, 8 Sep 1999 22:18:17 +0200 + +gcc (2.95.2-0pre1) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19990828. + * Apply work around memory corruption (just for 2.95.1) by + Daniel Jacobowitz . + * debian/patches/libstdc++-wall2.dpatch: Patch from Franck Sicard + to fix some warnings (closes: #44670). + * debian/patches/libstdc++-valarray.dpatch: Patch from Hideaki Fujitani + to fix a bug in valarray_array.h. + * Applied NMU from Jim Pick minus the jump.c and fold-const.c patches + already in the gcc-2_95-branch (closes: #44690). + * Conform to debian-java policy (closes: #44463). + * Move docs to /usr/share/doc (closes: #44782). + * Remove debian/patches/gcc-align.dpatch applied upstream. + * debian/*.postinst: Call install-info only, when configuring. + * debian/*.{postinst,prerm}: Add #DEBHELPER# comments to handle + /usr/doc -> /usr/share/doc transition. + + -- Matthias Klose Wed, 8 Sep 1999 22:18:17 +0200 + +gcc (2.95.1-2.1) unstable; urgency=low + + * Non-maintainer upload. + * ARM platform no longer needs library-prefix patch. + * Updated patches from Philip Blundell. + + -- Jim Pick Wed, 8 Sep 1999 20:14:07 -0700 + +gcc (2.95.1-2) unstable; urgency=low + + * debian/gcc.{postinst,prerm}: gcc provides an alternative for + sparc64-linux-gcc. + * Applied patch from Ben Collins to enable bi-architecture (32/64) + support for sparc. + * Rebuild debian/control and debian/rules.parameters after unpacking. + * debian/rules2: binary-indep. Conditionalize on with_pascal. + + -- Matthias Klose Sat, 4 Sep 1999 13:47:30 +0200 + +gcc (2.95.1-1) unstable; urgency=low + + * Updated to release gcc-2.95.1 and cvs updates of the gcc-2_95-branch + until 19990828. + * debian/README.gcc: Updated NEWS file to include 2.95 and 2.95.1 news. + * debian/README.java: New file. + * debian/rules.defs: Disabled gpc for alpha, arm. Disabled ObjC-GC + for alpha. + * debian/rules [clean]: Remove debian/rules.parameters. + * debian/rules2 [binary-arch]: Call dh_shlibdeps with LD_LIBRARY_PATH set + to installation dir of libstdc++. Why isn't this the default? + * debian/control.in: *-dev packages do not longer conflict with + libg++272-dev package. + * Apply http://egcs.cygnus.com/ml/gcc-patches/1999-08/msg00599.html. + * Only define BAD_THROW_ALLOC, when using exceptions (fixes #43462). + * For ObjC (when configured with GC) recommend libgc4-dev, not libgc4. + * New version of 68060 build patch. + * debian/rules.conf: For m68k, depend on binutils version 2.9.1. + + -- Matthias Klose Sat, 28 Aug 1999 18:16:31 +0200 + +gcc (2.95.1-0pre2) unstable; urgency=medium + + * gpc is back again (fixes grave #43022). + * debian/patches/gpc-updates.dpatch: Patches sent to upstream authors. + * Work around the fatal dependtry assertion failure bug in dpkg (hint + from "Antti-Juhani Kaijanaho" , fixes important #43072). + + -- Matthias Klose Mon, 16 Aug 1999 19:34:14 +0200 + +gcc (2.95.1-0pre1) unstable; urgency=low + + * Updated to cvs 19990815 gcc-2_95-branch; included install docs and + FAQ from 2.95 release; upload source package as well. + * Source package contains tarballs only (gcc, libg++, installdocs). + * debian/rules: Splitted into debian/rules{,.unpack,.patch,.conf,2}. + * debian/gcc.postinst: s/any key/RETURN; warn only when upgrading from + pre 2.95 version; reference /usr/doc, not /usr/share/doc. + * Checked syntax for attributes of functions; checked for #35068; + checked for bad gmon.out files (at least with libc6 2.1.2-0pre5 and + binutils 2.9.1.0.25-2 the problem doesn't show up anymore). + * debian/patches/cpp-macro-doc.dpatch: Document macro varargs in cpp.texi. + * gcc is primary compiler for all platforms but m68k. Setting + severity of #22513 to fixed. + * debian/patches/gcc-default-arch.dpatch: New patch to enable generation + of i386 instruction as default (fixes #42743). + * debian/rules: Removed outdated gcc NEWS file (fixes #42742). + * debian/patches/libstdc++-out-of-mem.dpatch: Throw exception instead + of aborting when out of memory (fixes #42622). + * debian/patches/cpp-dos-newlines.dpatch: Handle ibackslashes after + DOS newlines (fixes #29240). + * Fixed in gcc-2.95.1: #43001. + * Bugs closed in this version: + Closes: #11525, #12253, #22513, #29240, #35068, #36182, #42584, #42585, + #42602, #42622, #42742 #42743, #43001, #43002. + + -- Matthias Klose Sun, 15 Aug 1999 10:31:50 +0200 + +gcc (2.95-3) unstable; urgency=high + + * Provide /lib/cpp again (fixes important bug #42524). + * Updated to cvs 19990805 gcc-2_95-branch. + * Build with the default scheduler. + * Apply install-multilib patch from Dan Jacobowitz. + * Apply revised cpp-A- patch from Dan Jacobowitz. + + -- Matthias Klose Fri, 6 Aug 1999 07:25:19 +0200 + +gcc (2.95-2) unstable; urgency=low + + * Remove /lib/cpp. This driver uses files from /usr/lib/gcc-lib anyway. + * The following bugs are fixed (compared to egcs-1.1.2). + Closes: #4429, #20889, #21122, #26369, #28417, #28261, #31416, #35261, + #35900, #35906, #38246, #38872, #39098, #39526, #40659, #40991, #41117, + #41290, #41302, #41313. + * The following by Joel Klecker: + - Adopt dpkg-architecture variables. + - Go back to SHELL = bash -e or it breaks where /bin/sh is not bash. + - Disabled the testsuite, it is not included in the gcc 2.95 release. + + -- Matthias Klose Sat, 31 Jul 1999 18:00:42 +0200 + +gcc (2.95-1) unstable; urgency=low + + * Update for official gcc-2.95 release. + * Built without gpc. + * debian/rules: Remove g++FAQ from rules, which is outdated. + For ix86, build for i386, not i486. + * Apply patch from Jim Pick for building multilib package on arm. + + -- Matthias Klose Sat, 31 Jul 1999 16:38:21 +0200 + +gcc (2.95-0pre10) unstable; urgency=low + + * Use ../builddir-gcc-$(VER) by default instead of ./builddir; upstream + strongly advises configuring outside of the source tree, and it makes + some things much easier. + * Add patch to prevent @local branches to weak symbols on powerpc (fixes + apt compilation). + * Add patch to make cpp -A- work as expected. + * Renamed debian/patches/ppc-library-prefix.dpatch to library-prefix.dpatch; + apply on all architectures. + * debian/control.in: Remove snapshot dependencies. + * debian/*.postinst: Reflect use of /usr/share/{info,man}. + + -- Daniel Jacobowitz Thu, 22 Jul 1999 19:27:12 -0400 + +gcc (2.95-0pre9) unstable; urgency=low + + * The following bugs are fixed (compared to egcs-1.1.2): #4429, #20889, + #21122, #26369, #28417, #28261, #35261, #38246, #38872, #39526, #40659, + #40991, #41117, #41290. + * Updated to CVS gcc-19990718 snapshot. + * debian/control.in: Removed references to egcs in descriptions. + Changed gcj's Recommends libgcj-dev to Depends. + * debian/rules: Apply ppc-library-prefix for alpha as well. + * debian/patches/arm-config.dpatch: Updated patch sent by Jim Pick. + + -- Matthias Klose Sun, 18 Jul 1999 12:21:07 +0200 + +gcc (2.95-0pre8) unstable; urgency=low + + * Updated CVS. + * debian/copyright: s%doc/copyright%share/common-licenses% + * debian/README.Bugs: s/egcs.cygnus.com/gcc.gnu.org/ s/egcs-bugs/gcc-bugs/ + * debian/patches/reporting.dpatch: Remake diff for current sources. + * debian/libstdc++-dev.postinst: It's /usr/share/info/iostream.info. + * debian/rules: Current dejagnu snapshot reports a framework version + of 1.3.1. + + -- Joel Klecker Sun, 18 Jul 1999 02:09:57 -0700 + +gcc-snapshot (19990714-0pre6) experimental; urgency=low + + * Updated to CVS gcc-19990714 snapshot. + * Applied ARM patch (#40515). + * Converted DOS style linefeeds in debian/patches/ppc-* files. + * debian/rules: Reflect change in gcc/version.c; use sh -e as shell: + for some obscure reason, bash -e doesn't work. + * Reflect version change for libstdc++ (2.10). Remove libg++-name + patch; libg++ now has version 2.8.1.3. Removed libc version from + the package name. + + -- Matthias Klose Wed, 14 Jul 1999 18:43:57 +0200 + +gcc-snapshot (19990625-0pre5.1) experimental; urgency=low + + * Non-maintainer upload. + * Added ARM specific patch. + + -- Jim Pick Tue, 29 Jun 1999 22:36:08 -0700 + +gcc-snapshot (19990625-0pre5) experimental; urgency=low + + * Updated to CVS gcc-19990625 snapshot. + + -- Matthias Klose Fri, 25 Jun 1999 16:11:53 +0200 + +gcc-snapshot (19990609-0pre4.1) experimental; urgency=low + + * Added and re-added a few last PPC patches. + + -- Daniel Jacobowitz Sat, 12 Jun 1999 16:48:01 -0500 + +gcc-snapshot (19990609-0pre4) experimental; urgency=low + + * Updated to CVS egcs-19990611 snapshot. + + -- Matthias Klose Fri, 11 Jun 1999 10:20:09 +0200 + +gcc-snapshot (19990609-0pre3) experimental; urgency=low + + * CVS gcc-19990609 snapshot. + * New gpc-19990607 snapshot. + + -- Matthias Klose Wed, 9 Jun 1999 19:40:44 +0200 + +gcc-snapshot (19990524-0pre1) experimental; urgency=low + + * egcs-19990524 snapshot. + * First snapshot of the gcc-2_95-branch. egcs-1.2 is renamed to gcc-2.95, + which is now the "official" successor to gcc-2.8.1. The full version + name is: gcc-2.95 19990521 (prerelease). + * debian/control.in: Changed maintainers to `Debian GCC maintainers'. + * Moved all version numbers to epoch 1. + * debian/rules: Major changes. The support for secondary compilers + was already removed for the egcs-1.2 snapshots. Many fixes by + Joel Klecker . + - Send mail to Debian maintainers for successful builds. + - Fix VER and VERNO sed expressions. + - Replace remaining GNUARCH occurrences. + * New gpc snapshot (but don't build). + * debian/patches/valarray.dpatch: Backport from libstdc++-v3. + * debian/gcc-doc.*: Info is now gcc.info* (Joel Klecker ). + * Use cpp driver provided by the package. + * New script c89 (fixes #28261). + + -- Matthias Klose Sat, 22 May 1999 16:10:36 +0200 + +egcs (1.1.2-2) unstable; urgency=low + + * Integrate NMU's for arm and sparc (fixes #37582, #36857). + * Apply patch for the Hurd (fixes #37753). + * Describe open bugs in TODO.Debian. Please have a look if you can help. + * Update README / math functions section (fixes #35906). + * Done by J.H.M. Dassen (Ray) : + - At Richard Braakman's request, made -dbg packages for libstdc++ + and libg++. + - Provide egcc(1) (fixes lintian error). + + -- Matthias Klose Sun, 16 May 1999 14:30:56 +0200 + +egcs-snapshot (19990502-1) experimental; urgency=low + + * New snapshot. + + -- Matthias Klose Thu, 6 May 1999 11:51:02 +0200 + +egcs-snapshot (19990418-2) experimental; urgency=low + + * Merged Rays changes to build debug packages. + + -- Matthias Klose Wed, 21 Apr 1999 16:54:56 +0200 + +egcs-snapshot (19990418-1) experimental; urgency=low + + * New snapshot. + * Disable cpplib. + + -- Matthias Klose Mon, 19 Apr 1999 11:32:19 +0200 + +egcs (1.1.2-1.2) unstable; urgency=low + + * NMU for arm + * Added arm-optimizer.dpatch with optimizer workaround for ARM + + -- Jim Pick Mon, 19 Apr 1999 06:17:13 -0700 + +egcs (1.1.2-1.1) unstable; urgency=low + + * NMU for sparc + * Included dpatch to modify the references to gcc/crtstuff.c so that + __register_frame_info is not a weak reference. This allows potato to + remain binary compatible with slink, while still retaining compatibility + with other sparc/egcs1.1.2 distributions. Diff in .dpatch format has + been sent to the maintainer with a note it may not be needed for 1.1.3. + + -- Ben Collins Tue, 27 Apr 1999 10:15:03 -0600 + +egcs (1.1.2-1) unstable; urgency=low + + * Final egcs-1.1.2 release built for potato as primary compiler + for all architectures except m68k. + + -- J.H.M. Dassen (Ray) Thu, 8 Apr 1999 13:14:29 +0 200 + +egcs-snapshot (19990321-1) experimental; urgency=low + + * New snapshot. + * Disable gpc. + * debian/rules: Simplified (no secondary compiler, bumped all versions + to same epoch, libapi patch is included upstream). + * Separated out cpp documentation to cpp-doc package. + * Fixed in this version: #28417. + + -- Matthias Klose Tue, 23 Mar 1999 02:11:18 +0100 + +egcs (1.1.2-0slink2) stable; urgency=low + + * Applied H.J.Lu's egcs-19990315.linux patch. + * Install faq.html and egcs-1.1.2 announcment. + + -- Matthias Klose Tue, 23 Mar 1999 01:14:54 +0100 + +egcs (1.1.2-0slink1) stable; urgency=low + + * Final egcs-1.1.2 release; compiled with glibc-2.0 for slink on i386. + * debian/control.in: gcc provides egcc, when FIRST_PRIMARY defined. + * Fixes #30767, #32278, #34252, #34352. + * Don't build the libstdc++.so.2.9 library on architectures, which have + switched to glibc-2.1. + + -- Matthias Klose Wed, 17 Mar 1999 12:55:59 +0100 + +egcs (1.1.1.63-2.2) unstable; urgency=low + + * Non-maintainer upload. + * Incorporate patch from Joel Klecker to fix snapshot packages + by moving/removing the application of libapi. + * Disable the new libstdc++-dev-config and the postinst message in + glibc 2.1 versions. + + -- Daniel Jacobowitz Mon, 12 Mar 1999 14:16:02 -0500 + +egcs (1.1.1.63-2.1) unstable; urgency=low + + * Non-maintainer upload. + * Compile with glibc 2.1 release version. + * New upstream version egcs-1.1.2 pre3. + * Miscellaneous rules updates (see changelog.snapshot). + * New set of powerpc-related patches from Franz Sirl, + . + * Disable libgcc.dpatch (new solution implemented upstream). Remove it. + * Also pass $target to config.if. + * Enable Dwarf2 EH for powerpc. Bump the C++ binary version. No + loss in -backwards- compatibility as far as I can tell, so add a + compatibility symlink, and add to shlibs file. + * Add --no-backup-if-mismatch to the debian/patches/*.dpatch files, + to prevent bogus .orig's in diffs. + * Merged with (unreleased) 1.1.1.62-1 and 1.1.1.63-{1,2} packages from + Matthias Klose . + * Stop adding a backwards compatibility link for egcs-nof on powerpc. + To my knowledge, nothing uses it. Do add the libstdc++ API change + link, though. + + -- Daniel Jacobowitz Mon, 8 Mar 1999 14:24:01 -0500 + +egcs (1.1.1.63-2) stable; urgency=low + + * Provide a libstdc++ with a shared object name, which is compatible + to other distributions. Documented the change in README.Debian, + the libstdc++-2.9.postinst and the libstdc++-dev-config script. + + -- Matthias Klose Fri, 12 Mar 1999 00:36:20 +0100 + +egcs (1.1.1.63-1.1) unstable; urgency=low + + * Non-Maintainer release. + * Build against glibc 2.1. + * Make egcs the primary compiler on i386. + * Also confilct with egcc (<< FIRST_PRIMARY) + if FIRST_PRIMARY is defined. + (this tells dpkg that gcc completely obsoletes egcc) + * Remove hjl-12 patch again, HJL says it should not be + necessary with egcs 1.1.2. + (as per forwarded reply from Christopher Chimelis) + * Apply libapi patch in clean target before regenerating debian/control + and remove the patch afterward. Otherwise, the libstdc++ and libg++ + package names are generated wrong on a glibc 2.1 system. + + -- Joel Klecker Tue, 9 Mar 1999 15:31:02 -0800 + +egcs (1.1.1.63-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre3. + * Applied improved libstdc++ warning patch from Rob Browning. + + -- Matthias Klose Tue, 9 Mar 1999 16:14:07 +0100 + +egcs (1.1.1.62-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre2. + * New upstream version libg++-2.8.1.3. + * Readded ARM support + * Readded hjl-12 per request from Christopher C Chimelis + + + -- Matthias Klose Fri, 26 Feb 1999 09:54:01 +0100 + +egcs-snapshot (19990224-0.1) experimental; urgency=low + + * New snapshot. + * Add the ability to disable CPPLIB by setting CPPLIB=no in + the environment. + * Disable gpc for powerpc; I spent a long time getting it to + make correctly, and then it goes and ICEs. + + -- Daniel Jacobowitz Tue, 24 Feb 1999 23:34:12 -0500 + +egcs (1.1.1.61-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre1. + * debian/control.in: Applied patch from bug report #32987. + * Split up H.J.Lu's hjl-19990115-linux patch into several small + chunks: libapi, arm-mips, libgcc, hjl-other. The changelog.Linux + aren't included in the separate chunks. Please refer to the + unmodified hjl-19990115-linux patch file in the egcs source pkg. + * Apply warning patch to fix the annoying spew you get if you try to + use ropes or deques with -Wall (which makes -Wall mostly useless for + spotting errors in your own code). Fixes #32996. + * debian/rules: Unapply patches in the exact reverse order they were + applied. + + -- Matthias Klose Sat, 20 Feb 1999 22:06:21 +0100 + +egcs (1.1.1-5) frozen unstable; urgency=medium + + * Move libgcc.map file to g++ package, where gcc is the secondary + compiler (fixes #32329, #32605, #32631). + * Prepare to rename libstdc++2.9 package for glibc-2.1 (fixes #32148). + * Apply NMU patch for arm architecure (fixes #32367). + * Don't apply hjl-12 patch for alpha architectures (requested by the + alpha developers, Christopher C Chimelis ). + * Call makeinfo with --no-validate to fix obscure build failure on alpha. + * Build gpc info files in doc subdirectory. + * Remove c++filt diversion (C++ name demangling patch is now in binutils, + fixes #30820 and #32502). + + -- Matthias Klose Sun, 31 Jan 1999 23:19:35 +0100 + +egcs (1.1.1-4.1) unstable; urgency=low + + * Non-maintainer upload. + * Pascal doesn't build for ARM. + + -- Jim Pick Sun, 24 Jan 1999 16:13:34 -0800 + +egcs (1.1.1-4) frozen unstable; urgency=high + + * Don't strip compiler libraries libgcc.a libobjc.a libg2c.a libgpc.a + * Move Pascal examples to the right place (fixes #32149, part 1). + * Add dependencies for switching from secondary to primary compiler, + if FIRST_PRIMARY is defined (fixes #32149, part 2). + + -- Matthias Klose Wed, 20 Jan 1999 16:51:30 +0100 + +egcs (1.1.1-3) frozen unstable; urgency=low + + * Updated with the H.J.Lu's hjl-19990115-linux patch (fixes the + __register_frame_info problems, mips and arm port included). + * Update gpc to 19990118 (beta release candidate). + * Strip static libraries (fixes #31247 and #31248). + * Changed maintainer address. + + -- Matthias Klose Tue, 19 Jan 1999 16:34:28 +0100 + +egcs (1.1.1-2) frozen unstable; urgency=low + + * Moved egcs-docs, g77-doc and gpc-doc packages to doc section. + * Downgraded Recommends: egcs-docs to Suggests: egcs-docs dependencies + (for archs, where egcs is the primary compiler). + * Add 'Suggests: stl-manual' dependency to libstdc++2.9-dev. + * Applied one more alpha patch: + ftp://ftp.yggdrasil.com/private/hjl/egcs/1.1.1/egcs-1.1.1.diff.12.gz + * Applied PPro optimization patch. + * Apply emit-rtl-nan patch. + * Upgraded to libg++-2.8.1.2a-19981218.tar.gz. + * Upgraded to gpc-19981218. + * Make symlinks for gobjc, libstdc++2.9-dev and libg++2.8.2 doc directories. + + -- Matthias Klose Wed, 23 Dec 1998 18:04:53 +0200 + +egcs-snapshot (19981211-1) experimental; urgency=low + + * New snapshot. + * Adapted gpc to egcs-2.92.x (BOOT_CFLAGS must include -g). + * New libg++-2.8.1.2a-19981209.tar.gz. + * debian/rules: new target mail-summary. + + -- Matthias Klose Fri, 11 Dec 1998 18:14:53 +0200 + +egcs (1.1.1-1) frozen unstable; urgency=high + + * Final egcs-1.1.1 release. + * The last version depended on a versioned libc6 again. + * Add lost dependency for libg++ on libstdc++. + * Added debian-libstdc++.sh script to generate a libstdc++ on a Linux + system, which doesn't use the libapi patch. + + -- Matthias Klose Wed, 2 Dec 1998 12:06:15 +0200 + +egcs (1.1.0.91.59-2) frozen unstable; urgency=high + + * Fixes bugs from libc6 2.0.7u-6 upload without dependency line + Conflicts: libstdc++-2.9 (<< 2.91.59): #30019, #30066, #30078. + * debian/copyright: Updated URLs. + * gcc --help now mentions /usr/doc/debian/bug-reporting.txt. + * Install README.Debian and include information about patches applied. + * Depend on unversioned libc6 on i386, such that libstdc++2.9 can be used + on a hamm system. + + -- Matthias Klose Fri, 27 Nov 1998 18:32:02 +0200 + +egcs (1.1.0.91.59-1) frozen unstable; urgency=low + + * This is egcs-1.1.1 prerelease #3, compiled with libc6 2.0.7u-6. + * Added dependency for libstdc++2.9-dev on g++ (fixes #29631). + * Package g77 provides f77 (fixes #29817). + * Already fixed in earlier egcs-1.1 releases: #2493, #25271, #10620. + * Bugs reported for gcc-2.7.x and fixed in the egcs version of gcc: + #2493, #4430, #4954, #5367, #6047, #10612, #12375, #20606, #24788, #26100. + * Upgraded libg++ to libg++-2.8.1.2a-19981114. + * Upgraded gpc to gpc-19981124. + * Close #25869: egcs and splay maintainers are unable to reproduce this + bug with the current Debian packages. Bug submitter doesn't respond. + * Close #25407: egcs maintainer cannot reproduce this bug with the current + Debian compiler. Bug submitter doesn't respond. + * Use debhelper 1.2.7 for building. + * Replace the libstdc++ and libg++ compatibility links with fake libraries. + + -- Matthias Klose Wed, 25 Nov 1998 12:11:42 +0200 + +egcs (1.1.0.91.58-5) frozen unstable; urgency=low + + * Applied patch to build on the m68060. + * Added c++filt and c++filt.1 to the g++ package. + * Updated gpc to gpc-981105; fixes some regressions compared to egcs-1.1. + * Separated out g77 and gpc doumentation to new packages g77-doc and gpc-doc. + * Closed bugs (#22158). + * Close #20248; on platforms where gas and gld are the default versions, + it makes no difference to configure with or without enable-ld. + * Close #24349. The bugs are in the amulet source. + See http://www.cs.cmu.edu/afs/cs/project/amulet/www/FAQ.html#GCC28x + * Rename gcc.info* files to egcs.info* (fixes #24088). + * Documented known bugs (and workarounds) in BUGS.Debian. + * Fixed demangling of C++ names (fixes #28787). + * Applied patch form aspell to libstdc++/stl/stl_rope.h. + * Updated from cvs 16 Nov 1998. + + -- Matthias Klose Tue, 17 Nov 1998 09:41:24 +0200 + +egcs-snapshot (19981115-2) experimental; urgency=low + + * New snapshot. Disabled gpc. + * New packages g77-doc and gpc-doc. + + -- Matthias Klose Mon, 16 Nov 1998 12:48:09 +0200 + +egcs (1.1.0.91.58-3) frozen unstable; urgency=low + + * Previous version installed in potato, not slink. + * Updated from cvs 3 Nov 1998. + + -- Matthias Klose Tue, 3 Nov 1998 18:34:44 +0200 + +egcs (1.1.0.91.58-2) unstable; urgency=low + + * [debian/rules]: added targets to apply and unapply patches. + * [debian/README.patches]: New file. + * Moved patches dir to debian/patches. debian/rules has to select + the patches to apply. + * Manual pages for genclass and gcov (fixes #5995, #20950, #22196). + * Apply egcs-1.1-reload patch needed for powerpc architecture. + * Fixed bugs (#17768, #20252, #25508, #27788). + * Reapplied alpha patch (#20875). + * Fixes first part of #22513, extended README.Debian (combining C & C++). + * Already fixed in earlier egcs-1.1 releases: #17963, #20252, #20524, + #20640, #22450, #24244, #24288, #28520. + + -- Matthias Klose Fri, 30 Oct 1998 13:41:45 +0200 + +egcs (1.1.0.91.58-1) experimental; urgency=low + + * New upstream version. That's the egcs-1.1.1 prerelease plus patches from + the cvs archive upto 29 Oct 1998. + * Merged files from the egcs and snapshot packages. + * Updated libg++ to libg++-2.8.1.2 (although the Debian package name is still + 2.8.2). + * Moved patches dir to patches-1.1. + * Dan Jacobowitz: + * This is a snapshot from the egcs_1_1_branch, with + libapi, reload, builtin-apply, and egcs patches from + the debian/patches/ dir applied, along with the egcs-gpc-patches + and gcc/p/diffs/gcc-egcs-2.91.55.diff. + * Conditionalize gcj and chill (since they aren't in this branch). + * Fake snapshots drop the -snap-main. + + -- Matthias Klose Thu, 29 Oct 1998 15:15:19 +0200 + +egcs-snapshot (1.1-19981019-5.1) experimental; urgency=low + + * This is a snapshot from the egcs_1_1_branch, with + libapi, reload, builtin-apply, and egcs patches from + the debian/patches/ dir applied, along with the egcs-gpc-patches + and gcc/p/diffs/gcc-egcs-2.91.55.diff. + * Conditionalize gcj and chill (since they aren't in this + branch). + * Fake snapshots drop the -snap-main. + + -- Daniel Jacobowitz Mon, 19 Oct 1998 22:19:23 -0400 + +egcs (1.1b-5) unstable; urgency=low + + * [debian/control.in] Fixed typo in dependencies (#28076, #28087, #28092). + + -- J.H.M. Dassen (Ray) Sun, 18 Oct 1998 22:56:51 +0200 + +egcs (1.1b-4) unstable; urgency=low + + * Strengthened g++ dependency on libstdc++_LIB_SO_-dev from + `Recommends' to `Depends'. + * Updated README.Debian for egcs-1.1. + * Updated TODO. + + -- Matthias Klose Thu, 15 Oct 1998 12:38:47 +0200 + +egcs-snapshot (19981005-0.1) experimental; urgency=low + + * Make libstdc++2.9-snap-main and libg++-snap-main provide + their mainstream equivalents and put those equivalents into + their shlibs file. + * Package gcj, the GNU Compiler for Java(TM). + + * New upstream version of egcs (The -regcs_latest_snapshot branch). + * Build without libg++ entirely. + * Leave out gpc for now - the internals are sufficiently different + that it does not trivially compile. + * Include an experimental reload patch for powerpc - this is, + in the words of its author, not release quality, but it allows + powerpc linuxthreads to function. + * On architectures where we are the primary compiler, let snapshots + build with --prefix=/usr and conflict with the stable versions. + * Package chill, a front end for the language Chill. + * Other applied patches from debian/patches/: egcs-patches and + builtin-apply-patch. + * Use reload.c revision 1.43 to avoid a nasty bug. + + -- Daniel Jacobowitz Wed, 7 Oct 1998 00:27:42 -0400 + +egcs (1.1b-3.1) unstable; urgency=low + + * NMU to fix the egcc -> gcc link once and for all + + -- Christopher C. Chimelis Tue, 22 Sep 1998 16:11:19 -0500 + +egcs (1.1b-3) unstable; urgency=low + + * Oops. The egcc -> gcc link on archs where gcc is egcc was broken. + Thanks to Chris Chimelis for pointing this out. + + -- J.H.M. Dassen (Ray) Mon, 21 Sep 1998 20:51:35 +0200 + +egcs (1.1b-2) unstable; urgency=low + + * New upstream spellfix release (Debian revision is 2 as the internal + version numbers didn't change). + * Added egcc -> gcc symlink on architectures where egcc is the primary C + compiler. Thus, maintainers of packages that require egcc, can now + simply use "egcc" without conditionals. + * Porters: we hope/plan to make egcs's gcc the default C compiler on all + platforms once the 2.2.x kernels are available. Please test this version + thoroughly, and give us a GO / NO GO for your architecture. + * Some symbols cpp used to predefine were removed upstream in order to clean + up the cpp namespace, but imake requires them for determining the proper + settings for LinuxMachineDefines (see /usr/X11R6/lib/X11/{Imake,linux}.cf), + thus we put them back. Thanks to Paul Slootman for reporting his imake + problems on Alpha. + * [gcc/config/alpha/linux.h] Added -D__alpha to CPP_PREDEFINES . + Thanks to Chris Chimelis for the alpha-only 1.1a-1.1 NMU which fixed + this already. + * [gcc/config/i386/linux.h] Added -D__i386__ to CPP_PREDEFINES . + * [gcc/config/sparc/linux.h] Has -Dsparc in CPP_PREDEFINES . + * [gcc/config/sparc/linux64.h] Has -Dsparc in CPP_PREDEFINES . + * [gcc/config/m68k/linux.h] Has -Dmc68000 in CPP_PREDEFINES . + * [gcc/config/rs6000/linux.h] Has -Dpowerpc in CPP_PREDEFINES . + * [gcc/config/arm/linux.h] Has -Darm in CPP_PREDEFINES . + * [gcc/config/i386/gnu.h] Has -Di386 in CPP_PREDEFINES . + * Small fixes and updates in README. + * Changes affecting the source package only: + * [gcc/Makefile.in, gcc/cp/Make-lang.in, gcc/p/Make-lang.in] + Daniel Jacobowitz: Ugly hacks of various kinds to make cplib2.txt get + properly regenerated with multilib. + * [debian/TODO] Created. + * [INSTALL/index.html] Fixed broken link. + + -- J.H.M. Dassen (Ray) Sun, 20 Sep 1998 14:05:15 +0200 + +egcs (1.1a-1) unstable; urgency=low + + * New upstream release. + * Added README.libstdc++ . + * Updated Standards-Version. + * Matthias: + * Downgraded gobjc dependency on egcs-docs from Recommends: to Suggests: . + * [libg++/Makefile.in] Patched not to rely on a `-f' flag of `ln'. + + -- J.H.M. Dassen (Ray) Wed, 2 Sep 1998 19:57:43 +0200 + +egcs (1.1-1) unstable; urgency=low + + * egcs-1.1 prerelease (from the last Debian package only the version file + changed). + * "Final" gpc Beta 2.1 gpc-19980830. + * Included libg++ and gpc in the .orig tarball. so that diffs are getting + smaller. + * debian/control.in: Changed maintainer address to galenh-egcs@debian.org. + * debian/copyright: Updated URLs. + + -- Matthias Klose Mon, 31 Aug 1998 12:43:13 +0200 + +egcs (1.0.99.56-0.1) unstable; urgency=low + + * New upstream snapshot 19980830 from CVS (called egcs-1.1 19980830). + * New libg++ snapshot 980828. + * Put all patches patches subdirectory; see patches/README in the source. + * debian/control.in: readded for libg++2.8.2-dev: + Replaces: libstdc++2.8-dev (<= 2.90.29-0.5) + * Renamed libg++2.9 package to libg++2.8.2. + * gcc/p/gpc-decl.c: Fix from Peter@Gerwinski.de; fixes optimization errors. + * patches/gpc-patch2: Fix from Peter@Gerwinski.de; fixes alpha errors. + * debian/rules: New configuration flag for building with and without + libstdc++api patch; untested without ... + + -- Matthias Klose Sun, 30 Aug 1998 12:04:22 +0200 + +egcs (1.0.99-0.6) unstable; urgency=low + + * PowerPC fixes. + * On powerpc, generate the -msoft-float libs and package them + as egcs-nof. + * Fix signed char error in gpc. + * Create a libg++.so.2.9 compatibility symlink. + + -- Daniel Jacobowitz Tue, 25 Aug 1998 11:44:09 -0400 + +egcs (1.0.99-0.5) unstable; urgency=low + + * New upstream snapshot 19980824. + * New gpc snapshot gpc-980822; reenabled gpc for alpha. + + -- Matthias Klose Tue, 25 Aug 1998 01:21:08 +0200 + +egcs (1.0.99-0.4) unstable; urgency=low + + * New upstream snapshot 19980819. Should build glibc 2.0.9x on PPC. + + -- Matthias Klose Wed, 19 Aug 1998 14:18:07 +0200 + +egcs (1.0.99-0.3) unstable; urgency=low + + * New upstream snapshot 19980816. + * debian/rules: build correct debian/control and debian/*.shlibs + * Enabled Haifa scheduler for ix86. + + -- Matthias Klose Mon, 17 Aug 1998 16:29:35 +0200 + +egcs (1.0.99-0.2) unstable; urgency=low + + * New upstream snapshot: egcs-19980812, minor changes only. + * Fixes for building on `primary' targets. + * Disabled gpc on `alpha' architecture. + * Uses debhelper 1.1.6 + * debian/control.in: Replace older snapshot versions in favor of newer + normal versions. + * debian/rules: Fixes building of binary-arch target only. + + -- Matthias Klose Thu, 13 Aug 1998 11:59:41 +0200 + +egcs (1.0.99-0.1) unstable; urgency=low + + * New upstream version: pre egcs-1.1 version. + * Many changes ... for details see debian/changelog.snapshot in the + source package. + * New packages libstdc++2.9 and libstdc++2.9-dev. + * New libg++ snapshot 980731: new packages libg++2.9 and libg++2.9-dev. + * New gpc snapshot gpc-980729: new package gpc. + * Uses debhelper 1.1 + + -- Matthias Klose Mon, 10 Aug 1998 13:00:27 +0200 + +egcs-snapshot (19980803-4) experimental; urgency=low + + * rebuilt debian/control. + + -- Matthias Klose Wed, 5 Aug 1998 08:51:47 +0200 + +egcs-snapshot (19980803-3) experimental; urgency=low + + * debian/rules: fix installation locations of NEWS, header and + `undocumented' files. + * man pages aren't compressed for the snapshot package. + + -- Matthias Klose Tue, 4 Aug 1998 17:34:31 +0200 + +egcs-snapshot (19980803-2) experimental; urgency=low + + * debian/rules: Uses debhelper. Old in debian/rules.old. + renamed postinst, prerm files for use with debhelper. + * debian/{libg++2.9,libstdc++2.9}/postinst: call ldconfig only, + when called for configure. + * egcs-docs is architecture independent package. + * new libg++ snapshot 980731. + * installed libstdc++ api patch (still buggy). + + -- Matthias Klose Mon, 3 Aug 1998 13:20:59 +0200 + +egcs-snapshot (19980729-1) experimental; urgency=low + + * New snapshot version 19980729 from CVS archive. + * New gpc snapshot gpc-980729. + * Let gcc/configure decide about using the Haifa scheduler. + * Remove -DDEBIAN. That was needed for the security improvements with + regard to the /tmp problem. egcs-1.1 chooses another approach. + * Save test-protocol and extract gpc errors to gpc-test-summary. + * Tighten binutils dependency to 2.9.1. + * debian/rules: new build-info target + * debian/{control.in,rules}: _SO_ and BINUTILSV substitution. + * debian/rules: add dependency for debian/control. + * debian/rules: remove bin/c++filt + * TODO: next version will use debhelper; the unorganized moving of + files becomes unmanageable ... + * TODO: g++ headers in stdc++ package? check! + + -- Matthias Klose Thu, 30 Jul 1998 12:10:20 +0200 + +egcs-snapshot (19980721-1) experimental; urgency=low + + * Unreleased. Infinite loops in executables made by gpc. + + -- Matthias Klose Wed, 22 Jul 1998 18:07:20 +0200 + +egcs-snapshot (19980715-1) experimental; urgency=low + + * New snapshot version from CVS archive. + * New gpc snapshot gpc-980715. + * New libg++ version libg++-2.8.2-980708. Changed versioning + schema for library. The major versions of libc, libstdc++ and the + g++ interface are coded in the library name. Use this new schema, + but provide a symlink to our previous schema, since the library + seems to be binary compatible. + * [debian/rules]: Fixed bug in build target, when bootstrap returns + with an error + + -- Matthias Klose Wed, 15 Jul 1998 10:55:05 +0200 + +egcs-snapshot (19980701-1) experimental; urgency=low + + * New snapshot version from CVS archive. + Two check programs in libg++ had to be manually killed to finish the + testsuite (tBag and tSet). + * New gpc snapshot gpc-980629. + * Incorporated debian/rules changes from egcs-1.0.3a-0.5 (but don't remove + gcc/cp/parse.c gcc/c-parse.c gcc/c-parse.y gcc/objc/objc-parse.c + gcc/objc/objc-parse.y, since these files are part of the release). + * Disable the -DMKTEMP_EACH_FILE -DHAVE_MKSTEMP -DDEBIAN flags for the + snapshot. egcs-1.1 will have another solution. + * Don't bootstrap the snapshot with -fno-force-mem. Internal compiler + error :-( + * libf2c.a and f2c.h have changed names to libg2c.a and g2c.h and + have moved again into the gcc-lib dir. They are installed under + libg2c.a and g2c.h. Is it necessary to provide links f2c -> g2c ? + * debian/rules: reflect change of build dir of libraries. + + -- Matthias Klose Wed, 2 Jul 1998 13:15:28 +0200 + +egcs-snapshot (19980628-0.1) experimental; urgency=low + + * New upstream snapshot version. + * Non-maintainer upload; Matthias appears to be absent currently. + * Updated shlibs. + * Merged changes from regular egcs: + * [debian/control] Tightened dependency on binutils to 2.8.1.0.23 or + newer, as according to INSTALL/SPECIFIC PowerPC (and possibly Sparc) + need this. + * [debian/rules] Clean up some generated files outside builddir, + so the .diff.gz becomes smaller. + * [debian/rules] Partial sync/update with the one for the regular egcs + version. + * [debian/rules] Make gcc/p/configure executable. + + -- J.H.M. Dassen (Ray) Wed, 1 Jul 1998 07:12:15 +0200 + +egcs (1.0.3a-0.6) frozen unstable; urgency=low + + * Some libg++ development files were in libstdc++2.8-dev rather than + libg++2.8-dev. Fixed this and dealt with upgrading from the earlier + versions (fixes #23908; this bug is not marked release-critical, but + is annoying and can be quite confusing for users. Therefore, I think + this fix should go in 2.0). + + -- J.H.M. Dassen (Ray) Tue, 30 Jun 1998 11:10:14 +0200 + +egcs (1.0.3a-0.5) frozen unstable; urgency=low + + * Fixed location of .hP files (Fixes #23448). + * [debian/rules] simplified extraction of the files for libg++2.8-dev. + + -- J.H.M. Dassen (Ray) Wed, 17 Jun 1998 09:33:41 +0200 + +egcs (1.0.3a-0.4) frozen unstable; urgency=low + + * [gcc/gcc.c] There is one call to choose_temp_base for determining the + tempdir to be used only; #ifdef HAVE_MKSTEMP delete the tempfile created + as a side effect. (fixes #23123 for egcs). + * [gcc/collect2.c] There's still a vulnerability here; I don't see how + I can fix it without leaving behind tempfiles though. + * [debian/control] Tightened dependency on binutils to 2.8.1.0.23 or + newer, as according to INSTALL/SPECIFIC PowerPC (and possibly Sparc) + need this. + * [debian/rules] Clean up some generated files outside builddir, so the + .diff.gz becomes smaller. + + -- J.H.M. Dassen (Ray) Sat, 13 Jun 1998 09:06:52 +0200 + +egcs-snapshot (19980608-1) experimental; urgency=low + + * New snapshot version. + + -- Matthias Klose Tue, 9 Jun 1998 14:07:44 +0200 + +egcs (1.0.3a-0.3) frozen unstable; urgency=high (security fixes) + + * [gcc/toplev.c] set flag_force_mem to 1 at optimisation level 3 or higher. + This works around #17768 which is considered release-critical. + * Changes by Matthias: + * [debian/README] Documentation of the compiler situation for Objective C. + * [debian/rules, debian/control.*] Generate control file from a master + file. + * [debian/rules] Updates for Pascal and Fortran parts; brings it in sync + with the one for the egcs snapshots. + * Use the recommended settings LDFLAGS=-s CFLAGS= BOOT_CFLAGS='-O2'. + * Really compile -DMKTEMP_EACH_FILE -DHAVE_MKSTEMP (really fixes #19453 + for egcs). + * [gcc/gcc.c] A couple of temp files weren't marked for deletion. + + -- J.H.M. Dassen (Ray) Sun, 31 May 1998 22:56:22 +0200 + +egcs (1.0.3a-0.2) frozen unstable; urgency=high (security fixes) + + * Security improvements with regard to the /tmp problem + (gcc opens predictably named files in TMPDIR which can be abused via + symlinks) (Fixes #19453 for egcs). + * Compile -DMKTEMP_EACH_FILE to ensure the %u name is generated randomly + every time; affects gcc/gcc.c . + * [gcc/choose-temp.c, libiberty/choose-temp.c]: use mktemp(3) if compiled + -DUSE_MKSTEMP . + * Security improvements: don't use the result of choose_temp_base in a + predictable fashion. + [gcc/gcc.c]: + * @c, @objective-c: use random name rather then tempbasename.i for + intermediate preprocessor output (%g.i -> %d%u). + * @c, @objective-c: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @c, @objective-c, @cpp-output, @assembler-with-cpp: switched + "as [-o output file] " to + "as [-o output file]". + * @c, @objective-c, @assembler-with-cpp: use previous random name + (cc1|cpp output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U) + [gcc/f/lang-specs.h]: + * @f77-cpp-input: use random name rather then tempbasename.i for + intermediate cpp output (%g.i -> %d%u). + * @f77-cpp-input: use previous random name (cpp output) rather than + tempbasename.i for f771 input (%g.i -> %U). + * @f77-cpp-input: switched + "as [-o output file] " to + "as [-o output file]". + * @f77-cpp-input: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: use random name rather then tempbasename.i for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @f77: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %U). + * Run the testsuite (this requires the dejagnu package in experimental; + unfortunately, it is difficult to distinguish this version from the one + in frozen). + if possible, and log the results in warn_summary and bootstrap-summary. + * [gcc/choose-temp.c, libiberty/choose-temp.c]: s|returh|return| in + comment. + * Added notes on the Debian compiler setup [debian/README] to the + development packages. + * Matthias: + * [libg++/etc/lf/Makefile.in] Replaced "-ltermcap" by "-lncurses". + * [debian/rules] Updated so it can be used for both egcs releases and + snapshots easily; added support for the GNU Pascal Compiler gpc. + * [contrib/test_summary, contrib/warn_summary] Added from CVS. + * Run compiler checks and include results in /usr/doc/. + * Updates to the README. + * [debian/rules] Use assignments to speed up startup. + * [debian/rules] Show the important variables at the start of the build + process. + * [debian/control.secondary] Added a dependency of gobjc on egcc on + architectures where egcs provides the secondary compiler, as + /usr/bin/egcc is the compiler driver for gobjc. (Fixes #22829). + * [debian/control.*] Bumped Standards-Version; used shorter version + numbers in the dependency relationships (esthetic difference only); + fixed typo. + + -- J.H.M. Dassen (Ray) Tue, 26 May 1998 21:47:41 +0200 + +egcs-snapshot (19980525-1) experimental; urgency=low + + * New snapshot version. + + -- Matthias Klose Tue, 26 May 1998 18:04:06 +0200 + +egcs-snapshot (19980517-1) experimental; urgency=low + + * "Initial" release of the egcs-snapshot package; many debian/* files + derived from the egcs-1.0.3a-0.1 package (maintained by Galen Hazelwood + , NMU's by J.H.M. Dassen (Ray) ) + * The egcs-snapshot packages can coexist with the packages of the + egcs release. Package names have a '-ss' appended. + * All packages are installed in a separate tree (/usr/lib/egcs-ss following + the FHSS). + * Made all snapshot packages extra, all snapshot packages conflict + with correspondent egcs packages, which are newer than the snapshot. + * Included libg++-2.8.1-980505. + * Included GNU Pascal (gpc-980511). + * Haifa scheduler enabled for all snapshot packages. + * Run compiler checks and include results in /usr/doc/. + * Further information in /usr/doc//README.snapshot. + + -- Matthias Klose Wed, 20 May 1998 11:14:06 +0200 + +egcs (1.0.3a-0.1) frozen unstable; urgency=low + + * New upstream release egcs-2.90.29 980515 (egcs-1.0.3 release) + (we were using 1.0.3-prerelease). This includes the Haifa patches + we had since 1.0.3-0.2 and the gcc/objc/thr-posix.c patch we had + since 1.0.3-0.1; the differences with 1.0.3-prerelease + patches + we had is negligable. + * iostream info documentation was in the wrong package (libg++2.8-dev). + Now it's in libstdc++2.8-dev. (Thanks to Jens Rosenboom for bringing + this to my attention). As 1.0.3-0.3 didn't make it out of Incoming, + I'm not adding "Replaces:" for this; folks who had 1.0.3-0.3 installed + already know enough to use --force-overwrite. + * [gcc/objc/objc-act.c] Applied patch Matthias Klose supplied me with that + demangles Objective C method names in gcc error messages. + * Explicitly disable Haifa scheduling on Alpha, to make it easier to use + this package's diff with egcs snapshots, which may turn on Haifa + scheduling even though it is still unstable. (Requested by Chris Chimelis) + * Don't run "configure" again if builddir already exists (makes it faster + to restart builds in case one is hacking internals). Requested by + Johnnie Ingram. + * [gcc/gbl-ctors.h] Don't use extern declaration for atexit on glibc 2.1 + and higher (the prototype has probably changed; having the declaration + broke Sparc compiles). + * [debian/rules] Determine all version number automatically (from the + version string in gcc/version.c). + * [debian/copyright] Updated FTP locations; added text about libg++ (fixes + #22465). + + -- J.H.M. Dassen (Ray) Sat, 16 May 1998 17:41:44 +0200 + +egcs (1.0.3-0.3) frozen unstable; urgency=low + + * Made an "egcs-doc" package containing documentation for egcs (e)gcc, + g++, gobjc, so that administrators can choose whether to have this + documenation or the documentation that comes with the GNU gcc package. + Dependency on this is Recommends: on architectures where egcs provides + the primary C compiler; Suggests: on the others (where GNU gcc is still + the primary C compiler). + * Use the g++ FAQ from gcc/cp rather than libg++, as that version is more + up to date. + * Added iostream info documentation to libstdc++2.8-dev. + + -- J.H.M. Dassen (Ray) Wed, 13 May 1998 08:46:10 +0200 + +egcs (1.0.3-0.2) frozen unstable; urgency=low + + * Added libg++ that works with egcs, found at + ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.1-980505.tar.gz + (fixes #20587 (Severity: important)). + * The "libg++" and "libg++-dev" virtual packages now refer to the GNU + extensions. + * Added the g++ FAQ that comes with libg++ to the g++ package. + * libg++/Makefile.in: added $(srcdir) to rule for g++FAQ.info so that it + builds OK in builddir. + * Added -D__i386__ to the cpp predefines on intel. + * Patches Matthias supplied me with: + * Further 1.0.3 prerelease patches from CVS. + This includes patches to the Haifa scheduler. Alpha porters, please + check if this makes the Haifa scheduler OK again. + * Objective C patches from CVS. + + -- J.H.M. Dassen (Ray) Fri, 8 May 1998 14:43:20 +0200 + +egcs (1.0.3-0.1) frozen unstable; urgency=low (high for maintainers that use objc) + + * bug fixes only in new upstream version + * Applied patches from egcs CVS archive (egcs_1_03_prerelease) + (see gcc/ChangeLog in the egcs source package). + * libstdc++2.8-dev no longer Provides: libg++-dev (fixes #21153). + * libstdc++2.8-dev now Conflicts: libg++27-dev (bo), + libg++272-dev (hamm) [regular packages] rather than + Conflicts: libg++-dev [virtual package] to prepare the way for "libg++" + to be used as a virtual package for a new libg++ package (i.e. an up to + date one, which not longer contains libstdc++, but only the GNU + extensions) that is compatible with the egcs g++ packages. Such a package + isn't available yet. Joel Klecker tried building libg++2.8.1.1a within + egcs's libstdc++ setup, but it appears to need true gcc 2.8.1 . + * Filed Severity: important bugs against wxxt1-dev (#21707) because these + still depend on libg++-dev, which is removed in this version. + A fixed libsidplay1-dev has already been uploaded. + * libstdc++2.8 is now Section: base and Priority: required (as dselect is + linked against it). + * Disabled Haifa scheduling on Alpha again; Chris Chimelis reported + that this caused problems on some machines. + * [gcc/extend.texi] + ftp://maya.idiap.ch/pub/tmb/usenix88-lexic.ps.Z is no longer available; + use http://master.debian.org/~karlheg/Usenix88-lexic.pdf . + (fixes the egcs part of #20002). + * Updated Standards-Version. + * Changed chmod in debian/rules at Johnie Ingram's request. + * Rather than hardwire the Debian part of the packages' version number, + extract it from debian/changelog . + * Use gcc/objc/thr-posix.c from 980418 egcs snapshot to make objc work. + (Fixes #21192). + * Applied workaround for the GNUstep packages on sparc systems. + See README.sparc (on sparc packages only) in the doc directory. + This affects the other compilers as well. + * Already done in 1.0.2-0.7: the gobjc package now provides a virtual + package objc-compiler. + + -- J.H.M. Dassen (Ray) Tue, 28 Apr 1998 12:05:28 +0200 + -- Matthias Klose Tue, 28 Apr 1998 14:13:23 +0200 + +egcs (1.0.2-0.7) frozen unstable; urgency=low + + * Separated out Objective-C compiler. + * Applied patch from http://www.cygnus.com/ml/egcs/1998-Apr/0614.html + + -- Matthias Klose Fri, 17 Apr 1998 10:25:48 +0200 + +egcs (1.0.2-0.6) frozen unstable; urgency=low + + * Due to upstream changes (libg++ is now only the GNU specific C++ + classes, and is no longer maintained; libstdc++ contains the C++ + standard library, including STL), the virtual "libg++-dev" + package's meaning has become confusing. Therefore, new or updated + packages should no longer use the virtual "libg++-dev" package. + * Corrected g++'s Recommends to libstdc++2.8-dev (>=2.90.27-0.1). + The previous version had Recommends: libstdc++-dev (>=2.90.27-0.1) + which doesn't work, as libstc++-dev is a virtual package. + * Bumped Standards-Version. + + -- J.H.M. Dassen (Ray) Tue, 14 Apr 1998 11:52:08 +0200 + +egcs (1.0.2-0.5) frozen unstable; urgency=low (high for maintainers of packages that use libstdc++) + + * Modified shlibs file for libstdc++ to generate versioned dependencies, + as it is not link compatible with the 1.0.1-x versions in + project/experimental. (Fixes #20247, #20033) + Packages depending on libstd++ should be recompiled to fix their + dependencies. + * Strenghtened g++'s Recommends: libstdc++-dev to the 1.0.2 version or + newer. + * Fixed problems with the unknown(7) symlink for gcov. + * Reordering links now works. + + -- Adam Heath Sun, 12 Apr 1998 13:09:30 -0400 + +egcs (1.0.2-0.4) frozen unstable; urgency=low + + * Unreleased. This is the version Adam Heath received from me. + * Replaces: gcc (<= 2.7.2.3-3) so that the overlap with the older gcc + packages (including bo's gcc_2.7.2.1-8) is handled properly + (fixes #19931, #19672, #20217, #20593). + * Alpha architecture (fixes #20875): + * Patched gcc/config/alpha/linux.h for the gmon functions to operate + properly. + * Made egcs the primary C compiler. + * Enabled Hafia scheduling. + * Lintian-detected problems: + * E: libstdc++2.8: ldconfig-symlink-before-shlib-in-deb usr/lib/libstdc++.so.2.8 + * E: egcc: binary-without-manpage gcov + Reported as wishlist bug; added link to undocumented(7). + * W: libstdc++2.8: non-standard-executable-perm usr/lib/libstdc++.so.2.8.0 0555 + * E: libstdc++2.8: shlib-with-executable-bit usr/lib/libstdc++.so.2.8.0 0555 + + -- J.H.M. Dassen (Ray) Fri, 10 Apr 1998 14:46:46 +0200 + +egcs (1.0.2-0.3) frozen unstable; urgency=low + + * Really fixed dependencies. + + -- J.H.M. Dassen (Ray) Mon, 30 Mar 1998 11:30:26 +0200 + +egcs (1.0.2-0.2) frozen unstable; urgency=low + + * Fixed dependencies. + + -- J.H.M. Dassen (Ray) Sat, 28 Mar 1998 13:58:58 +0100 + +egcs (1.0.2-0.1) frozen unstable; urgency=low + + * New upstream version; it now has -Di386 in CPP_PREDEFINES. + * Only used the debian/* patches from 1.0.1-2; the rest of it appears + to be in 1.0.2 already. + + -- J.H.M. Dassen (Ray) Fri, 27 Mar 1998 11:47:14 +0100 + +egcs (1.0.1-2) unstable; urgency=low + + * Integrated pre-release 1.0.2 patches + * Split out g++ + * egcs may now provide either the primary or secondary C compiler + + -- Galen Hazelwood Sat, 14 Mar 1998 14:15:32 -0700 + +egcs (1.0.1-1) unstable; urgency=low + + * New upstream version + * egcs is now the standard Debian gcc! + * gcc now provides c-compiler (#15248 et al.) + * g77 now provides fortran77-compiler + * g77 dependencies now correct (#16991) + * /usr/doc/gcc/changelog.gz now has correct permissions (#16139) + + -- Galen Hazelwood Sat, 7 Feb 1998 19:22:30 -0700 + +egcs (1.0-1) experimental; urgency=low + + * First official release + + -- Galen Hazelwood Thu, 4 Dec 1997 16:30:11 -0700 + +From late September until the release, I was unable to get any snapshot to +compile... + +egcs (970917-1) experimental; urgency=low + + * New upstream snapshot (There's a lot of stuff here as well, including + a new libstdc++, but it _still_ won't build...) + * eg77 driver now works properly + + -- Galen Hazelwood Wed, 17 Sep 1997 20:44:29 -0600 + +egcs (970904-1) experimental; urgency=low + + * New upstream snapshot + + -- Galen Hazelwood Sun, 7 Sep 1997 18:25:06 -0600 + +egcs (ss-970814-1) experimental; urgency=low + + * Initial packaging (of initial snapshot!) + + -- Galen Hazelwood Wed, 20 Aug 1997 00:36:28 +0000 + +gcc272 (2.7.2.3-12) unstable; urgency=low + + * Compiled on a glibc-2.0 based system. + * Reflect move of manpage to /usr/share in gcc.postinst as well. + * Moved gcc272-docs to section doc, priority optional. + + -- Matthias Klose Sat, 28 Aug 1999 13:42:13 +0200 + +gcc272 (2.7.2.3-11) unstable; urgency=low + + * Follow Debian policy for GNU system type (fixes #42657). + * config/i386/linux.h: Remove %[cpp_cpu] from CPP_SPEC. Stops gcc-2.95 + complaining about obsolete spec operators (using gcc -V 2.7.2.3). + Patch suggested by Zack Weinberg . + + -- Matthias Klose Sun, 15 Aug 1999 20:12:21 +0200 + +gcc272 (2.7.2.3-10) unstable; urgency=low + + * Renamed source package to gcc272. The egcs source package is renamed + to gcc, because it's now the "official" GNU C compiler. + * Changed maintainer address to "Debian GCC maintainers". + * Install info and man stuff to /usr/share. + + -- Matthias Klose Thu, 27 May 1999 12:29:23 +0200 + +gcc (2.7.2.3-9) unstable; urgency=low + + * debian/{postinst,prerm}-doc: handle gcc272.info, not gcc.info. + Fixes #36306. + + -- Matthias Klose Tue, 20 Apr 1999 07:32:58 +0200 + +gcc (2.7.2.3-8) unstable; urgency=low + + * Make gcc-2.7 the secondary compiler. Rename gcc package to gcc272. + On i386, sparc and m68k, this package is compiled against glibc2.0. + * The cpp package is built from the egcs source package. + + -- Matthias Klose Mon, 29 Mar 1999 22:48:50 +0200 + +gcc (2.7.2.3-7) frozen unstable; urgency=low + + * Separated out ObjC compiler to gobjc27 package. + * Changed maintainer address. + * Synchronized README.Debian with egcs-1.1.1-3. + + -- Matthias Klose Tue, 29 Dec 1998 19:05:26 +0100 + +gcc (2.7.2.3-6) frozen unstable; urgency=low + + * Link with -lc on i386, m68k, sparc, when building shared libraries + (fixes #25122). + + -- Matthias Klose Thu, 3 Dec 1998 12:12:12 +0200 + +gcc (2.7.2.3-5) frozen unstable; urgency=low + + * Updated maintainer info. + * Updated Standards-Version; made lintian-clean. + * gcc-docs can coexist with the latest egcs-docs, so added (<= version) to + the Conflicts. + * Updated the README and renamed it to README.Debian . + * Put a reference to /usr/doc/gcc/README.Debian in the info docs. + * Updated description of g++272 . + * Clean up generated info files, to keep the diff small. + + -- J.H.M. Dassen (Ray) Tue, 17 Nov 1998 20:05:59 +0100 + +gcc (2.7.2.3-4.8) frozen unstable; urgency=high + + * Non-maintainer release + * Fix type in extended description + * Removed wrong test in postinst + * Add preinst to clean up some stuff from an older gcc package properly + and stop man complaining about dangling symlinks + + -- Wichert Akkerman Fri, 17 Jul 1998 18:48:32 +0200 + +gcc (2.7.2.3-4.7) frozen unstable; urgency=high + + * Really fixed gcc-docs postinst (Fixes #23470), so that `gcc-docs' + becomes installable. + + -- J.H.M. Dassen (Ray) Mon, 15 Jun 1998 07:53:40 +0200 + +gcc (2.7.2.3-4.6) frozen unstable; urgency=high + + * [gcc.c] There is one call to choose_temp_base for determining the + tempdir to be used only; + #ifdef HAVE_MKSTEMP delete the tempfile created as a side effect. + (fixes #23123 for gcc). + * gcc-docs postinst was broken (due to a broken line) (fixes #23391, #23401). + * [debian/control] description for gcc-docs said `egcs' where it should have + said `gcc' (fixes #23396). + + -- J.H.M. Dassen (Ray) Thu, 11 Jun 1998 12:48:50 +0200 + +gcc (2.7.2.3-4.5) frozen unstable; urgency=high + + * The previous version left temporary files behind, as they were not + marked for deletion afterwards. + + -- J.H.M. Dassen (Ray) Sun, 31 May 1998 22:49:14 +0200 + +gcc (2.7.2.3-4.4) frozen unstable; urgency=high (security fixes) + + * Security improvements with regard to the /tmp problem + (gcc opens predictably named files in TMPDIR which can be abused via + symlinks) (Fixes #19453 for gcc): + * Compile -DMKTEMP_EACH_FILE to ensure the %u name is generated randomly + every time; affects gcc/gcc.c . + * [cp/g++.c, collect2.c, gcc.c] If compiled -DHAVE_MKSTEMP use mkstemp(3) + rather than mktemp(3). + * Security improvements: don't use the result of choose_temp_base in a + predictable fashion. + [gcc.c]: + * @c, @objective-c: use random name rather then tempbasename.i for + intermediate preprocessor output (%g.i -> %d%u). + * @c, @objective-c: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @c, @objective-c, @cpp-output, @assembler-with-cpp: switched + "as [-o output file] " to + "as [-o output file]". + * @c, @objective-c, @assembler-with-cpp: use previous random name + (cc1|cpp output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U) + [f/lang-specs.h]: + * @f77-cpp-input: use random name rather then tempbasename.i for + intermediate cpp output (%g.i -> %d%u). + * @f77-cpp-input: use previous random name (cpp output) rather than + tempbasename.i for f771 input (%g.i -> %U). + * @f77-cpp-input: switched + "as [-o output file] " to + "as [-o output file]". + * @f77-cpp-input: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: use random name rather then tempbasename.i for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @f77: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %U). + + -- J.H.M. Dassen (Ray) Sat, 30 May 1998 17:27:03 +0200 + +gcc (2.7.2.3-4.3) frozen unstable; urgency=high + + * The "alpha" patches from -4 affected a lot more than alpha support, + and in all likeliness broke compilation of libc6 2.0.7pre3-1 + and 2.0.7pre1-4 . I removed them by selective application of the + diff between -4 and -4. (should fix #22292). + * Fixed reference to the trampolines paper (fixes #20002 for Debian; + this still needs to be forwarded). + * This is for frozen too. (obsoletes #22390 (request to move -4.2 to + frozen)). + * Split of gcc-docs package, so that the gcc can be succesfully installed + on systems that have egcs-docs installed. + * Added the README on the compiler situation that's already in the egcs + packages. + * Use the recommended settings LDFLAGS=-s CFLAGS= BOOT_CFLAGS='-O2'. + + -- J.H.M. Dassen (Ray) Thu, 28 May 1998 20:03:59 +0200 + +gcc (2.7.2.3-4.2) unstable; urgency=low + + * Still for unstable, as I have received no feedback about the g++272 + package yet. + * gcc now Provides: objc-compiler . + * Clean up /etc/alternatives/{g++,g++.1.gz} if they are dangling. + (fixes #19765, #20563) + + -- J.H.M. Dassen (Ray) Wed, 22 Apr 1998 12:40:45 +0200 + +gcc (2.7.2.3-4.1) unstable; urgency=low + + * Bumped Standards-Version. + * Forked off a g++272 package (e.g. for code that uses the GNU extensions + in libg++); for now this is in "unstable" only; feedback appreciated. + * Some cleanup (lintian): permissions, absolute link, gzip manpage. + + -- J.H.M. Dassen (Ray) Fri, 17 Apr 1998 13:05:25 +0200 + +gcc (2.7.2.3-4) unstable; urgency=low + + * Added alpha patches + * Only build C and objective-c compilers, split off g++ + + -- Galen Hazelwood Sun, 8 Mar 1998 21:16:39 -0700 + +gcc (2.7.2.3-3) unstable; urgency=low + + * Added patches for m68k + * Added patches for sparc (#13968) + + -- Galen Hazelwood Fri, 17 Oct 1997 18:25:21 -0600 + +gcc (2.7.2.3-2) unstable; urgency=low + + * Added g77 support (g77 0.5.21) + + -- Galen Hazelwood Wed, 10 Sep 1997 18:44:54 -0600 + +gcc (2.7.2.3-1) unstable; urgency=low + + * New upstream version + * Now using pristine source + * Removed misplaced paragraph in cpp.texi (#10877) + * Fix security bug for temporary files (#5298) + * Added Suggests: libg++-dev (#12335) + * Patched objc/thr-posix.c to support conditions (#12502) + + -- Galen Hazelwood Mon, 8 Sep 1997 12:20:07 -0600 + +gcc (2.7.2.2-7) unstable; urgency=low + + * Made cc and c++ managed through alternates mechanism (for egcs) + + -- Galen Hazelwood Tue, 19 Aug 1997 22:37:03 +0000 + +gcc (2.7.2.2-6) unstable; urgency=low + + * Tweaked Objective-C thread support (#11069) + + -- Galen Hazelwood Wed, 9 Jul 1997 11:56:57 -0600 + +gcc (2.7.2.2-5) unstable; urgency=low + + * More updated m68k patches + * Now conflicts with libc5-dev (#10006, #10112) + * More strict Depends: cpp, prevents version mismatch (#9954) + + -- Galen Hazelwood Thu, 19 Jun 1997 01:29:02 -0600 + +gcc (2.7.2.2-4) unstable; urgency=low + + * Moved to unstable + * Temporarily removed fortran support (waiting for new g77) + * Updated m68k patches + + -- Galen Hazelwood Fri, 9 May 1997 13:35:14 -0600 + +gcc (2.7.2.2-3) experimental; urgency=low + + * Built against libc6 (fixes bug #8511) + + -- Galen Hazelwood Fri, 4 Apr 1997 13:30:10 -0700 + +gcc (2.7.2.2-2) experimental; urgency=low + + * Fixed configure to build crt{begin,end}S.o on i386 + + -- Galen Hazelwood Tue, 11 Mar 1997 16:15:02 -0700 + +gcc (2.7.2.2-1) experimental; urgency=low + + * Built for use with libc6-dev (experimental purposes only!) + * Added m68k patches from Andreas Schwab + + -- Galen Hazelwood Fri, 7 Mar 1997 12:44:17 -0700 + +gcc (2.7.2.1-7) unstable; urgency=low + + * Patched to support g77 0.5.20 + + -- Galen Hazelwood Thu, 6 Mar 1997 22:20:23 -0700 + +gcc (2.7.2.1-6) unstable; urgency=low + + * Added (small) manpage for protoize/unprotoize (fixes bug #6904) + * Removed -lieee from specs file (fixes bug #7741) + * No longer builds aout-gcc + + -- Galen Hazelwood Mon, 3 Mar 1997 11:10:20 -0700 + +gcc (2.7.2.1-5) unstable; urgency=low + + * debian/control now lists cpp in section "interpreters" + * Re-added Objective-c patches for unstable + + -- Galen Hazelwood Wed, 22 Jan 1997 10:27:52 -0700 + +gcc (2.7.2.1-4) stable unstable; urgency=low + + * Changed original source file so dpkg-source -x works + * Removed Objective-c patches (unsafe for stable) + * Built against rex's libc, so fixes placed in -3 are available to + those still using rex + + -- Galen Hazelwood Tue, 21 Jan 1997 11:11:53 -0700 + +gcc (2.7.2.1-3) unstable; urgency=low + + * New (temporary) maintainer + * Updated to new standards and source format + * Integrated aout-gcc into gcc source package + * Demoted aout-gcc to Priority "extra" + * cpp package description more clear (fixes bug #5428) + * Removed cpp "Replaces: gcc" (fixes bug #5762) + * Minor fix to invoke.texi (fixes bug #2909) + * Added latest Objective-C patches for GNUstep people (fixes bug #4657) + + -- Galen Hazelwood Sun, 5 Jan 1997 09:57:36 -0700 --- gcc-3.4-3.4.2.orig/debian/logwatch.sh +++ gcc-3.4-3.4.2/debian/logwatch.sh @@ -0,0 +1,104 @@ +#! /bin/sh + +# script to trick the build daemons and output something, if there is +# still test/build activity + +# $1: primary file to watch. if there is activity on this file, we do nothing +# $2+: files to watch to look for activity despite no output in $1 +# if the files are modified or are newly created, then the message +# is printed on stdout. +# if nothing is modified, don't output anything (so the buildd timeout +# hits). + +pidfile=logwatch.pid +timeout=3600 +message='\nlogwatch still running\n' + +usage() +{ + echo >&2 "usage: `basename $0` [-p ] [-t ] [-m ]" + echo >&2 " [ ...]" + exit 1 +} + +while [ $# -gt 0 ]; do + case $1 in + -p) + pidfile=$2 + shift + shift + ;; + -t) + timeout=$2 + shift + shift + ;; + -m) + message="$2" + shift + shift + ;; + -*) + usage + ;; + *) + break + esac +done + +[ $# -gt 0 ] || usage + +logfile="$1" +shift +otherlogs="$@" + +cleanup() +{ + rm -f $pidfile + exit 0 +} + +trap cleanup 0 1 3 15 + +echo $$ > $pidfile + +update() +{ + _logvar=$1 + _othervar=$2 + + # logfile may not exist yet + if [ -r $logfile ]; then + _logtail="`tail -10 $logfile | md5sum` $f" + else + _logtail="does not exist: $logfile" + fi + eval $_logvar="'$_logtail'" + + _othertails='' + for f in $otherlogs; do + if [ -r $f ]; then + _othertails="$_othertails `tail -10 $f | md5sum` $f" + else + _othertails="$_othertails does not exist: $f" + fi + done + eval $_othervar="'$_othertails'" +} + +update logtail othertails +while true; do + sleep $timeout + update newlogtail newothertails + if [ "$logtail" != "$newlogtail" ]; then + # there is still action in the primary logfile. do nothing. + logtail="$newlogtail" + elif [ "$othertails" != "$newothertails" ]; then + # there is still action in the other log files, so print the message + /bin/echo -e $message + othertails="$newothertails" + else + # nothing changed in the other log files. maybe a timeout ... + : + fi +done --- gcc-3.4-3.4.2.orig/debian/control.m4 +++ gcc-3.4-3.4.2/debian/control.m4 @@ -0,0 +1,800 @@ +divert(-1) + +define(`checkdef',`ifdef($1, , `errprint(`error: undefined macro $1 +')m4exit(1)')') +define(`errexit',`errprint(`error: undefined macro `$1' +')m4exit(1)') + +dnl The following macros must be defined, when called: +dnl ifdef(`SRCNAME', , errexit(`SRCNAME')) +dnl ifdef(`CV', , errexit(`CV')) +dnl ifdef(`NV', , errexit(`NV')) +dnl ifdef(`PV', , errexit(`PV')) +dnl ifdef(`ARCH', , errexit(`ARCH')) + +dnl The architecture will also be defined (-D__i386__, -D__powerpc__, etc.) + +define(`PN', `$1') +ifdef(`PRI', `', ` + define(`PRI', `$1') +') +define(`MAINTAINER', `Debian GCC maintainers ') +ifdef(`TARGET', ` + define(`LS', `-'TARGET`-cross') +', ` + define(`TS') + define(`LS') +') + +define(`ifenabled', `ifelse(index(enabled_languages, `$1'), -1, `dnl', `$2')') + +divert`'dnl +dnl -------------------------------------------------------------------------- +Source: SRCNAME +Section: devel +Priority: PRI(standard) +Maintainer: MAINTAINER +Uploaders: Matthias Klose , Gerhard Tonn +Standards-Version: 3.6.1 +ifdef(`TARGET',`dnl cross +Build-Depends: LIBC_BUILD_DEP, m4, autoconf2.13, automake1.7, libtool, autotools-dev, gawk, dpkg-cross (>= 1.14.5), binutils`'TS +',`dnl native +Build-Depends: LIBC_BUILD_DEP, libc6-dev-sparc64 [sparc], libc6-dev-s390x [s390], amd64-libs-dev [i386], ia32-libs-dev [amd64], m4, autoconf2.13, autoconf, automake1.4, automake1.7, libtool, autotools-dev, gawk, dejagnu (>= 1.4.3) [check_no_archs], expect (>= 5.38.0) [check_no_archs], bzip2, BINUTILS_BUILD_DEP, binutils-hppa64 [hppa], debhelper (>= 4.1), gperf (>= 2.7-3), bison (>= 1:1.875a-1) | bison (<< 1:1.50), flex, gettext, texinfo (>= 4.3), zlib1g-dev, libgc-dev [libgc_no_archs], xlibs-dev, gnat-3.3 [ada_no_archs] | gnat-3.4 [ada_no_archs] | gnat [i386 powerpc sparc], libncurses5-dev [pascal_no_archs], libgmp3-dev, tetex-bin [pascal_no_archs], locales [locale_no_archs !hurd-i386], procps [check_no_archs], help2man [pascal_no_archs], sharutils, libgtk2.0-dev (>= 2.4.4-2) [java_no_archs], libart-2.0-dev [java_no_archs], g++-3.3 [!amd64], g77-3.3 [!amd64], gobjc-3.3 [!amd64], realpath (>= 1.9.12) +Build-Depends-Indep: doxygen (>= 1.3.7) +')dnl + +ifdef(`TARGET', `', ` +Package: gcc`'PV-base +Architecture: any +Section: devel +Priority: PRI(required) +Description: The GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). +ifdef(`BASE_ONLY', `dnl + . + This version of GCC is not yet available for this architecture. + Please use the compilers from the gcc-snapshot package for testing. +')`'dnl +')`'dnl native + +ifenabled(`libgcc',` +Package: libgcc1`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',required) +Depends: ${shlibs:Depends} +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture architecture, + for use in cross-compile environment. +')`'dnl + +Package: libgcc2`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(required)) +Depends: ${shlibs:Depends} +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture architecture, + for use in cross-compile environment. +')`'dnl +')`'dnl libgcc + +ifenabled(`lib64gcc',` +Package: lib64gcc`'GCC_SO`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: ${shlibs:Depends} +Conflicts: libgcc`'GCC_SO`'LS (<= 1:3.3-0pre9) +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (64bit) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib64gcc + +Package: lib32gcc`'GCC_SO +Architecture: any +Section: libs +Priority: optional +Depends: ia32-libs (>= 0.5ubuntu2) +Description: GCC support library (ia32) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. + +ifenabled(`cdev',` +Package: gcc`'PV`'TS +Architecture: any +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(standard)') +Depends: gcc`'PV-base, libgcc`'GCC_SO`'LS (>= LIBGCC_CV), ${shlibs:Depends}, ifdef(`TARGET',`',`cpp`'PV (>= CV), cpp`'PV (<< NV)'), binutils`'TS (>= BINUTILSV) +Recommends: ifdef(`TARGET',`libc6-dev`'LS | libc-dev`'LS',`LIBC_DEP') +Conflicts: gcc-3.2 (<= 1:3.2.3-0pre8) +Suggests: gcc`'PV-doc (>= CV)ifelse(ARCH,`i386',`, amd64-libs-dev',ARCH,`amd64',`, lib32gcc1') +Provides: c-compiler`'TS +Description: The GNU C compiler`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C compiler, a fairly portable optimizing compiler for C. + . + ABIs changed between gcc-3.3 and gcc-3.4 on some architectures (hppa, m68k, + mips, mipsel, sparc). Please read /usr/share/doc/gcc-3.4/README.Debian + for more details. +ifdef(`TARGET', `dnl + . + This package contains C cross-compiler for TARGET architecture. +')`'dnl +')`'dnl cdev + +ifenabled(`cdev',` +ifdef(`TARGET', `', ` +Package: gcc`'PV-hppa64 +Architecture: hppa +Section: devel +Priority: PRI(optional) +Depends: gcc`'PV-base (>= CV), gcc`'PV-base (<< NV), libc6-dev (>= 2.3.2.ds1-12), ${shlibs:Depends} +Conflicts: gcc-3.3-hppa64 (<= 1:3.3.4-5), gcc-3.5-hppa64 (<= 3.5-0pre1) +Description: The GNU C compiler (cross compiler for hppa64) + This is the GNU C compiler, a fairly portable optimizing compiler for C. +')`'dnl native +')`'dnl cdev + +ifenabled(`cdev',` +ifdef(`TARGET', `', ` +Package: cpp`'PV +Architecture: any +Section: interpreters +Priority: ifdef(`TARGET',`extra',`PRI(standard)') +Depends: gcc`'PV-base (>= CV), gcc`'PV-base (<< NV), ${shlibs:Depends} +Description: The GNU C preprocessor + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. + +Package: cpp`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Replaces: cpp (<= 1:2.93.12) +Description: Documentation for the GNU C preprocessor (cpp) + Documentation for the GNU C preprocessor in info `format'. +')`'dnl native +')`'dnl cdev + +ifenabled(`c++',` +ifenabled(`c++dev',` +Package: g++`'PV`'TS +Architecture: any +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(standard)') +ifdef(`OLDARMABI',`dnl +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV`'TS (>= CV), gcc`'PV`'TS (<< NV), libstdc++6-0-dev`'LS (>= CV) +',`dnl new arm abi +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV`'TS (>= CV), gcc`'PV`'TS (<< NV), libstdc++CXX_SO-dev`'LS (>= CV) +')`'dnl +Replaces: gcc`'TS (<= 2.7.2.3-3) +Provides: c++-compiler`'TS +Suggests: gcc`'PV-doc (>= CV)ifelse(ARCH,`amd64',`, lib32stdc++6-0') +Description: The GNU C++ compiler`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. + . + ABIs changed between gcc-3.3 and gcc-3.4 on some architectures (hppa, m68k, + mips, mipsel, sparc). Please read /usr/share/doc/gcc-3.4/README.Debian + for more details. Do not mix code compiled with g++-3.3 and g++-3.4. +ifdef(`TARGET', `dnl + . + This package contains C++ cross-compiler for TARGET architecture. +')`'dnl +')`'dnl c++dev +')`'dnl c++ + +ifenabled(`proto',` +Package: protoize +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Description: Create/remove ANSI prototypes from C code + "protoize" can be used to add prototypes to a program, thus converting + the program to ANSI C in one respect. The companion program "unprotoize" + does the reverse: it removes argument types from any prototypes + that are found. +')`'dnl proto + +ifenabled(`objc',` +ifenabled(`objcdev',` +Package: gobjc`'PV +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, libobjc`'OBJC_SO (>= 1:3.3.4-4), gcc`'PV (>= CV), gcc`'PV (<< NV) +Suggests: gcc`'PV-doc (>= CV) +Provides: objc-compiler +ifdef(`OBJC_GC',`Recommends: libgc-dev', `dnl') +ifdef(`__sparc__',`Conflicts: gcc`'PV-sparc64', `dnl') +Description: The GNU Objective-C compiler + This is the GNU Objective-C compiler, which compiles + Objective-C on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. +')`'dnl objcdev + +ifenabled(`libobjc',` +Package: libobjc`'OBJC_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Objective-C applications + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libobjc + +ifenabled(`lib64objc',` +Package: lib64objc`'OBJC_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Objective-C applications (64bit) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl lib64objc +')`'dnl objc + +ifenabled(`f77',` +ifenabled(`fdev',` +Package: g77`'PV +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, libg2c`'G2C_SO-dev (>= 1:3.3.4-4), ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Provides: fortran77-compiler +Suggests: g77`'PV-doc +Conflicts: g77-2.95 (<= 1:2.95.4-19), g77-3.0 (<= 1:3.0.4-16), g77-3.2 (<= 1:3.2.3-9), g77-3.3 (<= 1:3.3.4-3) +Description: The GNU Fortran 77 compiler + This is the GNU g77 Fortran compiler, which compiles + Fortran 77 on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +Package: g77`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Replaces: g77 (<= 1:2.91.58-3) +Description: Documentation for the GNU Fortran compiler (g77) + Documentation for the GNU Fortran 77 compiler in info `format'. +')`'dnl fdev + +ifenabled(`libg2c',` +Package: libg2c`'G2C_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Fortran 77 applications + Library needed for GNU Fortran 77 applications linked against the + shared library. + +Package: libg2c`'G2C_SO-dev +Section: libdevel +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, libg2c`'G2C_SO (>= CEV), ${shlibs:Depends} +Conflicts: g77-2.95 (<= 1:2.95.4-19), g77-3.0 (<= 1:3.0.4-16), g77-3.2 (<= 1:3.2.3-9), g77-3.3 (<= 1:3.3.3-0pre3) +Description: GNU Fortran 77 library development + Headers and static libraries for g2c. +')`'dnl libg2c + +ifenabled(`lib64g2c',` +Package: lib64g2c`'G2C_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Fortran 77 applications (64bit) + Library needed for GNU Fortran 77 applications linked against the + shared library. +')`'dnl lib64g2c +')`'dnl f77 + +ifenabled(`java',` +ifenabled(`javadev',` +Package: gcj`'PV +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, libgcj`'GCJ_SO-common (>= CV), java-common, g++`'PV (>= CV), g++`'PV (<< NV) +Recommends: fastjar, gij`'PV (>= CV), libgcj`'GCJ_SO-dev (>= CV) +Provides: java-compiler +Suggests: libgcj`'GCJ_SO-awt (>= CV) +Description: The GNU compiler for Java(TM) + GCJ is a front end to the GCC compiler which can natively compile both + Java(tm) source and bytecode files. The compiler can also generate class + files. +')`'dnl javadev + +ifenabled(`libgcj',` +Package: gij`'PV +Priority: optional +Architecture: any +Depends: gcc`'PV-base, libgcj`'GCJ_SO (>= CV), ${shlibs:Depends} +Suggests: fastjar, gcj`'PV (>= CV), libgcj-awt`'GCJ_SO (>= CV) +Provides: java-virtual-machine, java1-runtime +Description: The GNU Java bytecode interpreter + GIJ is not limited to interpreting bytecode. It includes a class loader which + can dynamically load shared objects, so it is possible to give it the name + of a class which has been compiled and put into a shared library on the + class path. + +Package: libgcj-common +Section: libs +Architecture: all +Priority: PRI(optional) +Depends: gcc`'PV-base +Conflicts: classpath (<= 0.04-4), libgcj3 (<< 1:3.2-0pre2) +Description: Java runtime library (common files) + This package contains files shared by classpath and libgcj libraries. + +Package: libgcj`'GCJ_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: libgcj-common, ${shlibs:Depends} +Recommends: libgcj`'GCJ_SO-common (>= CV) +Description: Java runtime library for use with gcj + This is the runtime that goes along with the gcj front end to + gcc. libgcj includes parts of the Java Class Libraries, plus glue to + connect the libraries to the compiler and the underlying OS. + +Package: libgcj`'GCJ_SO-common +Section: libs +Architecture: all +Priority: PRI(optional) +Depends: libgcj`'GCJ_SO +Conflicts: libgcj5 (<< 3.4.0-1) +Replaces: libgcj5 (<< 3.4.0-1) +Description: Java runtime library for use with gcj (jar files) + This is the jar file that goes along with the gcj front end to gcc. + +Package: libgcj`'GCJ_SO-awt +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: libgcj`'GCJ_SO (>= CV), ${shlibs:Depends} +Conflicts: libgcj5 (<< 3.4.0-2), libgcj-awt5 +Replaces: libgcj5 (<< 3.4.0-2), libgcj-awt5 +Description: AWT peer runtime libraries for use with gcj + These are runtime libraries holding the AWT peer implementations + for libgcj (currently only the GTK based peer library). +')`'dnl libgcj + +ifenabled(`lib64gcj',` +Package: lib64gcj`'GCJ_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: libgcj-common, ${shlibs:Depends} +Description: Java runtime library for use with gcj (64bit) + This is the runtime that goes along with the gcj front end to + gcc. libgcj includes parts of the Java Class Libraries, plus glue to + connect the libraries to the compiler and the underlying OS. + +Package: lib64gcj`'GCJ_SO-awt +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: libgcj`'GCJ_SO (>= CV), ${shlibs:Depends} +Conflicts: lib64gcj5 (<< 3.4.0-2), lib64gcj-awt5 +Replaces: lib64gcj5 (<< 3.4.0-2), lib64gcj-awt5 +Description: AWT peer runtime libraries for use with gcj (64bit) + These are runtime libraries holding the AWT peer implementations + for libgcj (currently only the GTK based peer library). +')`'dnl libgcj + +ifenabled(`javadev',` +Package: libgcj`'GCJ_SO-dev +Section: libdevel +Architecture: any +Priority: PRI(optional) +Depends: gcj`'PV (>= CV), libgcj`'GCJ_SO (>= CV), libgcj`'GCJ_SO-common (>= CV), libgcj`'GCJ_SO-awt (>= CV), LIBC_DEP, zlib1g-dev, ${shlibs:Depends} +Conflicts: libgcj2-dev, libgcj3-dev, libgcj4-dev +Provides: libgcj-dev +Description: Java development headers and static library for use with gcj + This is the development headers and static libraries that go along + with the gcj front end to gcc. libgcj includes parts of the Java Class + Libraries, plus glue to connect the libraries to the compiler and the + underlying OS. +')`'dnl javadev +')`'dnl java + +ifenabled(`fastjar',` +Package: fastjar +Section: devel +Architecture: any +Priority: PRI(optional) +Depends: ${shlibs:Depends} +Description: Jar creation utility + Replacement for Suns .jar creation program. It is written in C + instead of java and is tons faster. It is currently not complete. +')`'dnl fastjar + +ifenabled(`libffi',` +Package: libffi`'FFI_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV`'-base, ${shlibs:Depends} +Description: Foreign Function Interface library runtime + A foreign function interface is the popular name for the interface that + allows code written in one language to call code written in another + language. + +Package: lib64ffi`'FFI_SO +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV`'-base, ${shlibs:Depends} +Description: Foreign Function Interface library runtime (64bit) + A foreign function interface is the popular name for the interface that + allows code written in one language to call code written in another + language. + +Package: libffi`'FFI_SO-dev +Section: libdevel +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV`'-base, libffi`'FFI_SO (>= CEV), LIBC_DEP +Recommends: gcc-3.4 +Conflicts: libffi1-dev, libffi2-dev +Description: Foreign Function Interface library (development files) + This package contains the headers and static library files necessary for + building building programs which use libffi. + . + Use this package together with gcc-3.4. + . + A foreign function interface is the popular name for the interface that + allows code written in one language to call code written in another + language. +')`'dnl libffi + +ifenabled(`c++',` +ifenabled(`libcxx',` +Package: libstdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`base') +Priority: ifdef(`TARGET',`extra',PRI(required)) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: The GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libstdc++6-0`'LS +Architecture: amd64 arm +Section: base +Priority: PRI(required) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: The GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: lib32stdc++6-0 +Architecture: any +Section: libs +Priority: optional +Depends: gcc`'PV-base, lib32gcc`'GCC_SO +Description: The GNU Standard C++ Library v3 (ia32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + +Package: lib32stdc++CXX_SO +Architecture: any +Section: libs +Priority: optional +Depends: gcc`'PV-base, lib32gcc`'GCC_SO +Description: The GNU Standard C++ Library v3 (ia32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. +')`'dnl libcxx + +ifenabled(`lib64cxx',` +Package: lib64stdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`base') +Priority: ifdef(`TARGET',`extra',PRI(important)) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: The GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (64bit) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib64cxx + +ifenabled(`c++dev',` +Package: libstdc++CXX_SO-dev`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(standard)) +ifdef(`TARGET',`dnl cross +Depends: gcc`'PV-base, libstdc++CXX_SO`'LS (>= CV), libc6-dev`'LS, g++`'PV`'TS (>= CV) +',`dnl native +Depends: gcc`'PV-base, libstdc++CXX_SO (>= CV), LIBC_DEP, g++`'PV (>= CV) +Conflicts: libg++27-dev, libg++272-dev (<< 2.7.2.8-1), libstdc++2.8-dev, libg++2.8-dev, libstdc++2.9-dev, libstdc++2.9-glibc2.1-dev, libstdc++2.10-dev (<< 1:2.95.3-2), libstdc++3.0-dev +Suggests: libstdc++CXX_SO-doc, stl-manual +')`'dnl native +Provides: libstdc++-dev`'LS +Description: The GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. Be advised that this only works + with the GNU C++ compiler (version 3.0), and no earlier library will work it. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile environment. +')`'dnl + +Package: libstdc++6-0-dev`'LS +Architecture: amd64 arm +Section: libdevel +Priority: PRI(standard) +Depends: gcc`'PV-base, libstdc++6-0 (>= CV), LIBC_DEP, g++`'PV (>= CV) +Conflicts: libg++27-dev, libg++272-dev (<< 2.7.2.8-1), libstdc++2.8-dev, libg++2.8-dev, libstdc++2.9-dev, libstdc++2.9-glibc2.1-dev, libstdc++2.10-dev (<< 1:2.95.3-2), libstdc++3.0-dev, libstdc++6-dev (<< 3.4.1-2) +Suggests: libstdc++CXX_SO-doc, stl-manual +Provides: libstdc++-dev`'LS +Description: The GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. Be advised that this only works + with the GNU C++ compiler (version 3.0), and no earlier library will work it. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libstdc++CXX_SO-pic`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: extra +Depends: gcc`'PV-base, libstdc++CXX_SO`'LS (>= CV), libstdc++CXX_SO-dev`'LS (>= CV) +Description: The GNU Standard C++ Library v3 (shared library subset kit)`'ifdef(`TARGET)',` (TARGET)', `') + This is used to develop subsets of the libstdc++ shared libraries for + use on custom installation floppies and in embedded systems. + . + Unless you are making one of those, you will not need this package. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libstdc++6-0-pic`'LS +Architecture: amd64 arm +Section: libdevel +Priority: extra +Depends: gcc`'PV-base, libstdc++6-0`'LS (>= CV), libstdc++6-0-dev`'LS (>= CV) +Description: The GNU Standard C++ Library v3 (shared library subset kit)`'ifdef(`TARGET)',` (TARGET)', `') + This is used to develop subsets of the libstdc++ shared libraries for + use on custom installation floppies and in embedded systems. + . + Unless you are making one of those, you will not need this package. + +Package: libstdc++CXX_SO-dbg`'LS +Architecture: ifdef(`TARGET',`all',`any') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: extra +Depends: gcc`'PV-base, libstdc++CXX_SO`'LS (>= CV) +Recommends: libstdc++CXX_SO-dev`'LS (>= CV) +Conflicts: libstdc++5-dbg`'LS, libstdc++5-3.3-dbg`'LS +Description: The GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libstdc++6-0-dbg`'LS +Architecture: amd64 arm +Section: libdevel +Priority: extra +Depends: gcc`'PV-base, libstdc++6-0`'LS (>= CV) +Recommends: libstdc++6-0-dev`'LS (>= CV) +Conflicts: libstdc++5-dbg`'LS, libstdc++5-3.3-dbg`'LS, libstdc++6-dbg`'LS (<< 3.4.1-2) +Description: The GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +ifdef(`TARGET', `', ` +Package: libstdc++CXX_SO-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Conflicts: libstdc++5-doc, libstdc++5-3.3-doc +Description: The GNU Standard C++ Library v3 (documentation files) + This package contains documentation files for the GNU stdc++ library. + . + One set is the distribution documentation, the other set is the + source documentation including a namespace list, class hierarchy, + alphabetical list, compound list, file list, namespace members, + compound members and file members. +')`'dnl native +')`'dnl c++dev +')`'dnl c++ + +ifenabled(`ada',` +Package: gnat`'-GNAT_V +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Suggests: gnat`'PV-doc, ada-reference-manual +Provides: ada-compiler +Conflicts: gnat, gnat-3.1, gnat-3.2, gnat-3.3 +Provides: gnat +Description: The GNU Ada compiler + This is the GNU Ada compiler, which compiles Ada on platforms supported + by the gcc compiler. It uses the gcc backend to generate optimized code. + +ifenabled(`libgnat',` +Package: libgnat`'-GNAT_V +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Ada applications + Library needed for GNU Ada applications linked against the shared library. +')`'dnl libgnat + +ifenabled(`lib64gnat',` +Package: lib64gnat`'-GNAT_V +Section: libs +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends} +Description: Runtime library for GNU Ada applications + Library needed for GNU Ada applications linked against the shared library. +')`'dnl libgnat + +Package: gnat`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Suggests: gnat`'PV +Description: Documentation for the GNU Ada compiler (gnat) + Documentation for the GNU Ada compiler in info `format'. +')`'dnl ada + +ifenabled(`pascal',` +Package: gpc`'GPC_PV +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Recommends: libgmp3-dev, libncurses5-dev +Suggests: gpc`'GPC_PV-doc (>= GPC_CV) +Provides: pascal-compiler +Description: The GNU Pascal compiler + This is the GNU Pascal compiler, which compiles Pascal on platforms supported + by the gcc compiler. It uses the gcc backend to generate optimized code. + . + WARNING: the integration of gpc into gcc-3.x is still in an experimental + stage. For production use, please use gpc or gpc-2.95. + +Package: gpc`'GPC_PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Replaces: gpc (<= 2.91.58-3) +Suggests: gpc`'GPC_PV +Description: Documentation for the GNU Pascal compiler (gpc) + Documentation for the GNU Pascal compiler in info `format'. + . + WARNING: the integration of gpc into gcc-3.x is still in an experimental + stage. For production use, please use gpc or gpc-2.95. +')`'dnl pascal + +ifenabled(`treelang',` +Package: treelang`'PV +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Description: The GNU Treelang compiler + Treelang is a sample language, useful only to help people understand how + to implement a new language front end to GCC. It is not a useful + language in itself other than as an example or basis for building a new + language. Therefore only language developers are likely to have an + interest in it. +')`'dnl treelang + +ifdef(`TARGET',`',`dnl +ifenabled(`libs',` +Package: gcc`'PV-soft-float +Architecture: arm +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}ifenabled(`cdev',`, gcc`'PV (>= CV), gcc`'PV (<< NV)') +Replaces: gcc-soft-float-ss (<< NV) +Description: The soft-floating-point gcc libraries (arm) + These are versions of basic static libraries such as libgcc.a compiled + with the -msoft-float option, for CPUs without a floating-point unit. +')`'dnl commonlibs +')`'dnl + +ifenabled(`fixincl',` +Package: fixincludes +Architecture: any +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}, gcc`'PV (>= CV), gcc`'PV (<< NV) +Description: Fix non-ANSI header files + FixIncludes was created to fix non-ANSI system header files. Many + system manufacturers supply proprietary headers that are not ANSI compliant. + The GNU compilers cannot compile non-ANSI headers. Consequently, the + FixIncludes shell script was written to fix the header files. + . + Not all packages with header files are installed at gcc's build time, so + we make fixincludes available at build time of other packages, such that + checking tools like lintian can make use of it. +')`'dnl proto + +ifenabled(`cdev',` +ifdef(`TARGET', `', ` +Package: gcc`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base +Conflicts: gcc-docs (<< 2.95.2) +Replaces: gcc (<=2.7.2.3-4.3), gcc-docs (<< 2.95.2) +Description: Documentation for the GNU compilers (gcc, gobjc, g++) + Documentation for the GNU compilers in info `format'. +')`'dnl native +')`'dnl cdev + +ifdef(`TARGET',`',`dnl +ifenabled(`libnof',` +Package: gcc`'PV-nof +Architecture: powerpc +Priority: PRI(optional) +Depends: gcc`'PV-base, ${shlibs:Depends}ifenabled(`cdev',`, gcc`'PV (>= CV), gcc`'PV (<< NV)') +Conflicts: gcc-3.2-nof +Description: The no-floating-point gcc libraries (powerpc) + These are versions of basic static libraries such as libgcc.a compiled + with the -msoft-float option, for CPUs without a floating-point unit. +')`'dnl libnof +')`'dnl +dnl +dnl last line in file --- gcc-3.4-3.4.2.orig/debian/gcj-wrapper +++ gcc-3.4-3.4.2/debian/gcj-wrapper @@ -0,0 +1,89 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java compiler. +# +# Command-line arguments should be in the style of Sun's Java compiler; +# these will be converted to gcj arguments before being passed to the +# gcj itself. +# +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gcj-wrapper-3.2 shell script. + +use strict; + +# The real Java compiler: +my $javaCompiler = '/usr/bin/gcj-3.4'; + +# The command-line arguments to pass to the real Java compiler: +my @commandLine; + +# The warning flags to pass to the GNU Java compiler: +my $warnings = '-Wall'; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; +my $copyNextArg = 0; +my $ignoreNextArg = 0; +my $appendNextArg = ''; +foreach my $arg (@ARGV) { + # See if we already know what to do with this argument. + if ($ignoreNextArg) { + # Throw it away. + $ignoreNextArg = 0; + next; + } elsif ($copyNextArg or not $parsingOptions) { + # Copy it directly. + push @commandLine, $arg; + $copyNextArg = 0; + next; + } elsif ($appendNextArg) { + # Append it to $appendNextArg and then copy directly. + push @commandLine, ($appendNextArg . $arg); + $appendNextArg = ''; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-classpath' or $arg eq '--classpath' or $arg eq '--cp') { + $appendNextArg = '--classpath='; + } elsif ($arg eq '-encoding' or $arg eq '-bootclasspath' or + $arg eq '-extdirs') { + $appendNextArg = '-' . $arg . '='; + } elsif ($arg eq '-d') { + push @commandLine, '-d'; + $copyNextArg = 1; + } elsif ($arg eq '-nowarn') { + $warnings = ''; + } elsif ($arg =~ /^-g/) { + # Some kind of debugging option - just switch debugging on. + push @commandLine, '-g' if ($arg ne '-g:none'); + } elsif ($arg eq '-O') { + push @commandLine, '-O2'; + } elsif ($arg =~ /^-X/) { + # An extended Sun option (which we don't support). + push @commandLine, '--help' if ($arg eq '-X'); + } elsif ($arg eq '-source' or $arg eq '-sourcepath' or $arg eq '-target') { + # An unsupported option with a following argument. + $ignoreNextArg = 1; + } elsif ($arg =~ /^-/) { + # An unsupported standalone option. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Was there a partial argument that was never completed? +push @commandLine, $appendNextArg if ($appendNextArg); + +# Call the real Java compiler. +my @fullCommandLine = ( $javaCompiler, '-C' ); +push @fullCommandLine, $warnings if ($warnings); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-3.4-3.4.2.orig/debian/rename-pkgs.sh +++ gcc-3.4-3.4.2/debian/rename-pkgs.sh @@ -0,0 +1,32 @@ +#! /bin/bash + +rename_pkg() +{ + src=$1 + dest=$2 + for ext in preinst postinst prerm postrm doc-base; do + if [ -f $src.$ext ]; then + if [ -f $dest.ext ]; then + echo already exists: $dest.$ext + else + echo "$src.$ext --> $dest.$ext" + svn rename $src.$ext $dest.$ext + #mv $src.$ext $dest.$ext + fi + fi + done +} + +v_new=3.4 +v_old=3.3 + +for p in chill cpp gcc g++ g77 gpc gij gcj gobjc protoize treelang; do + rename_pkg $p-$v_old $p-$v_new +done + +for p in cpp gcc g77 gnat; do + rename_pkg $p-$v_old-doc $p-$v_new-doc +done + +rename_pkg gcc-$v_old-base gcc-$v_new-base +rename_pkg gcc-$v_old-sparc64 gcc-$v_new-sparc64 --- gcc-3.4-3.4.2.orig/debian/rules.patch +++ gcc-3.4-3.4.2/debian/rules.patch @@ -0,0 +1,182 @@ +# -*- makefile -*- +# rules to patch the unpacked files in the source directory +# --------------------------------------------------------------------------- +# various rules to unpack addons and (un)apply patches. +# - patch / apply-patches +# - unpatch / reverse-patches + +.NOTPARALLEL: + +patchdir = debian/patches + +# which patches should be applied? +debian_patches = \ + gcc-version \ + gcc-textdomain \ + rename-info-files \ + libstdc++-pic \ + libstdc++-doclink \ + amd64-specs \ + gccbug \ + gccbug-posix \ + hppa-toplevel hppa-libffi hppa-libjava hppa-libjava-update \ + fastjar-update \ + java-gui-branch \ + libltdl \ + pr17186 \ + +# cvs-updates \ + +ifeq ($(with_oldcxxabi),yes) + debian_patches += arm-libstdc++-soname cxx-abi-version-1 +endif + +ifeq ($(with_multiarch),yes) + debian_patches += multiarch-include +endif + +ifeq ($(with_java),yes) + debian_patches += gcj-without-rpath +endif + +debian_patches += libffi-soversion # package disabled, but patch needed +ifeq ($(with_libffi),yes) + #debian_patches += libffi-soversion + ifneq ($(with_java),yes) + debian_patches += libffi-without-libgcj + endif +endif + +ifeq ($(with_proto),yes) + debian_patches += deb-protoize +endif + +ifeq ($(with_objc),yes) + debian_patches += # libobjc +endif + +ifeq ($(with_ada),yes) + ifeq ($(with_libgnat),yes) + debian_patches += ada-link-lib + endif + debian_patches += ada-gcc-name #ada-names +endif + +ifeq ($(with_pascal),yes) + debian_patches += gpc-3.x gpc-updates gpc-parse + debian_patches += gpc-names gpc-profiled gpc-lang-update + ifneq ($(with_gpidump),yes) + debian_patches += gpc-no-gpidump + endif +endif + +ifeq ($(DEB_TARGET_GNU_SYSTEM),gnu) + debian_patches += hurd-changes +endif + +ifeq ($(DEB_TARGET_ARCH),amd64) + debian_patches += amd64-biarch # amd64-multilib +endif +ifeq ($(DEB_TARGET_GNU_CPU),alpha) + debian_patches += # alpha-ieee +endif + +ifeq ($(DEB_TARGET_GNU_CPU),arm) + debian_patches += arm-libstdc++-soname +endif +ifeq ($(DEB_TARGET_GNU_CPU),i386) + ifeq ($(DEB_TARGET_GNU_SYSTEM),gnu) + debian_patches += cpu-default-i586 + else + debian_patches += cpu-default-i486 + endif +endif +ifeq ($(DEB_TARGET_GNU_CPU),ia64) + debian_patches += +endif +ifeq ($(DEB_TARGET_GNU_CPU), $(findstring $(DEB_TARGET_GNU_CPU),mips mipsel)) + debian_patches += libffi-mips libjava-mips #autoreconf +endif +ifeq ($(DEB_TARGET_GNU_CPU)-$(biarch),i386-yes) + debian_patches += i386-biarch +endif +ifeq ($(DEB_TARGET_GNU_CPU),powerpc) + debian_patches += #powerpc-biarch +endif +ifeq ($(DEB_TARGET_GNU_CPU)-$(biarch),s390-yes) + debian_patches += s390-biarch s390-config-ml +endif +ifeq ($(DEB_TARGET_GNU_CPU),sparc) + ifeq ($(biarch),yes) + debian_patches += sparc64-build sparc-config-ml + endif +endif + +ifeq ($(DEB_TARGET_GNU_SYSTEM),kfreebsd-gnu) + debian_patches += kbsd-gnu +endif +ifeq ($(DEB_TARGET_GNU_SYSTEM),knetbsd-gnu) + debian_patches += kbsd-gnu +endif + +ifeq ($(DEB_TARGET_GNU_SYSTEM),netbsd-elf-gnu) + debian_patches += # netbsd-all-gcc netbsd-archs-gcc +endif + +ifdef DEB_CROSS + debian_patches += cross-configure +endif + +# not applied by default +#debian_patches += protector + +debian_patches += link-libs reporting + + +patch: $(patch_stamp) +$(patch_stamp): $(unpack_stamp) pre-patch \ + $(foreach p,$(debian_patches),$(patch_stamp)-$(p)) + echo -e "\nPatches that Debian applied in this version:" > pxxx + for i in $(debian_patches); do \ + echo -e "\n$$i:" >> pxxx; \ + sed -n 's/^# *DP: */ /p' $(patchdir)/$$i.dpatch >> pxxx; \ + done + mv -f pxxx $@ + +pre-patch: + @if [ -x /usr/bin/automake-1.4 ]; then \ + : ; \ + else \ + mkdir -p $(PWD)/bin; \ + ln -sf /usr/bin/automake $(PWD)/bin/automake-1.4; \ + fi + +unpatch: + for stamp in none `ls -1t $(patch_stamp)-*`; do \ + case "$$stamp" in none|patched-stamp|patched-\*) continue; esac; \ + patch=`echo $$stamp | sed -e 's,$(patch_stamp)-,,'`; \ + echo "trying to revert patch $$patch ..."; \ + if [ -x $(patchdir)/$$patch.dpatch ]; then true; else \ + chmod +x $(patchdir)/$$patch.dpatch; fi; \ + if $(patchdir)/$$patch.dpatch -unpatch -d $(srcdir); then \ + echo "reverted $$patch patch."; \ + rm -f $$stamp; \ + else \ + echo "error in reverting $$patch patch."; \ + exit 1; \ + fi; \ + done + rm -f patched-stamp + +# debian/rules.conf isn't yet sourced +SOURCE_VERSION := $(shell dpkg-parsechangelog | awk '/^Version:/ {print $$NF}') +DEB_VERSION := $(shell echo $(SOURCE_VERSION) | sed 's/ds[0-9]*//') + +$(patch_stamp)-%: $(patchdir)/%.dpatch + if [ -x $< ]; then true; else chmod +x $<; fi + if [ -f $@ ]; then \ + echo "$* patches already applied."; exit 1; \ + fi + DEB_VERSION='$(DEB_VERSION)'; export DEB_VERSION; \ + $< -patch -d $(srcdir) + echo "$* patches applied." > $@ --- gcc-3.4-3.4.2.orig/debian/compat +++ gcc-3.4-3.4.2/debian/compat @@ -0,0 +1 @@ +4 --- gcc-3.4-3.4.2.orig/debian/gcjh-wrapper.1 +++ gcc-3.4-3.4.2/debian/gcjh-wrapper.1 @@ -0,0 +1,20 @@ +.TH GCJH-WRAPPER 1 "June 6, 2002" gcjh-wrapper "Java User's Manual" +.SH NAME +gcjh-wrapper \- a wrapper around gcjh + +.SH SYNOPSIS +gcjh-wrapper [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgcjh-wrapper\fR is a wrapper around gcjh(1) to be called as the java header +compiler. Options different for javah(1) and gcjh(1) are translated, +options unknown to gcjh(1) are silently ignored. + +.SH OPTIONS +See gcjh-3.3(1) for a list of options that gcj understands. + +.SH "SEE ALSO" +.BR gcjh-3.3(1) +, +.BR javah(1) --- gcc-3.4-3.4.2.orig/debian/gnat.1 +++ gcc-3.4-3.4.2/debian/gnat.1 @@ -0,0 +1,39 @@ +.\" Hey, Emacs! This is an -*- nroff -*- source file. +.\" +.\" Copyright (C) 1996 Erick Branderhorst +.\" +.\" This is free software; you can redistribute it and/or modify it under +.\" the terms of the GNU General Public License as published by the Free +.\" Software Foundation; either version 2, or (at your option) any later +.\" version. +.\" +.\" This is distributed in the hope that it will be useful, but WITHOUT +.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +.\" for more details. +.\" +.\" You should have received a copy of the GNU General Public License with +.\" your Debian GNU/Linux system, in /usr/doc/copyright/GPL, or with the +.\" dpkg source package as the file COPYING. If not, write to the Free +.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +.\" +.\" +.TH "GNAT TOOLBOX" 1 "Jun 2002" "Debian Project" "Debian Linux" +.SH NAME +gnat, gnatbind, gnatbl, gnatchop, gnatfind, gnatkr, gnatlink, +gnatls, gnatmake, gnatprep, gnatpsta, gnatpsys, gnatxref \- +GNAT toolbox +.SH DESCRIPTION +Those programs are part of GNU GNAT 3.4, a freely available Ada 95 compiler. +.PP +For accessing the full GNAT manuals, use +.B info gnat-ug-3.4 +and +.B info gnat-rm-3.4 +for the sections related to the reference manual. If those sections cannot +be found, you will have to install the gnat-3.4-doc package as well. +.SH SEE ALSO +.BR gcc-3.4 (1) +.SH AUTHOR +This manpage has been written by Samuel Tardieu , for the +Debian GNU/Linux project. --- gcc-3.4-3.4.2.orig/debian/dh_rmemptydirs +++ gcc-3.4-3.4.2/debian/dh_rmemptydirs @@ -0,0 +1,10 @@ +#! /bin/sh -e + +pkg=`echo $1 | sed 's/^-p//'` + +: # remove empty directories, when all components are in place +for d in `find debian/$pkg -depth -type d -empty 2> /dev/null`; do \ + while rmdir $d 2> /dev/null; do d=`dirname $d`; done; \ +done + +exit 0 --- gcc-3.4-3.4.2.orig/debian/README.libf2c +++ gcc-3.4-3.4.2/debian/README.libf2c @@ -0,0 +1,8 @@ +Building libraries and executables dependent on libg2c +====================================================== + +The header file for the g2c library is specific to the compiler +version used and therefore is included in the g77-X.Y package. + +If you use the g2c header and libraries without using g77, +make sure you have the g77 package installed. --- gcc-3.4-3.4.2.orig/debian/README.C++ +++ gcc-3.4-3.4.2/debian/README.C++ @@ -0,0 +1,47 @@ +libstdc++ is an implementation of the Standard C++ Library, including the +Standard Template Library (i.e. as specified by ANSI and ISO). + +Some notes on porting applications from libstdc++-2.90 (or earlier versions) +to libstdc++-v3 can be found in the libstdc++3-doc package. After the +installation of the package, look at: + +file://usr/share/doc/gcc-3.4-base/libstdc++/html/17_intro/porting-howto.html + +On Debian GNU/Linux you find additional documentation in the +libstdc++6-doc and stl-manual packages. After installing these packages, +point your browser to + + file://localhost/usr/share/doc/libstdc++6-doc/libstdc++/html/index.html + + file://localhost/usr/share/doc/stl-manual/html/index.html + +Other documentation can be found: + + http://www.cs.rpi.edu/~musser/stl.html + http://www.sgi.com/tech/stl/ + http://www.dinkumware.com/htm_cpl/ + +with a good, recent, book on C++. + +A great deal of useful C++ documentation can be found in the C++ FAQ-Lite, +maintained by Marshall Cline . It can be found at the +following locations (this list was last updated on 2000/11/19): + +USA: http://www.cerfnet.com/~mpcline/c++-faq-lite/ + +Canada: http://new-brunswick.net/workshop/c++/faq + +Finland: http://www.utu.fi/~sisasa/oasis/cppfaq/ + +France: http://caor.ensmp.fr/FAQ/c++-faq-lite/ + +Germany: http://www.informatik.uni-konstanz.de/~kuehl/cpp/cppfaq.htm + +Spain: http://geneura.ugr.es/~jmerelo/c++-faq/ + +Taiwan: http://www.cis.nctu.edu.tw/c++/C++FAQ-English/ + +U.K.: http://www.cs.bham.ac.uk/~jdm/CPP/index.html + + +Please send updates to this list as bug report for the g++ package. --- gcc-3.4-3.4.2.orig/debian/protoize.1 +++ gcc-3.4-3.4.2/debian/protoize.1 @@ -0,0 +1,42 @@ +.TH PROTOIZE 1 +.\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection +.\" other parms are allowed: see man(7), man(1) +.SH NAME +protoize, unprotoize \- create/remove ANSI prototypes from C code +.SH SYNOPSIS +.B protoize +.I "[options] files ...." +.br +.B unprotoize +.I "[options] files ...." +.SH "DESCRIPTION" +This manual page documents briefly the +.BR protoize , +and +.B unprotoize +commands. +This manual page was written for the Debian GNU/Linux distribution +(but may be used by others), because the original program does not +have a manual page. +Instead, it has documentation in the GNU Info format; see below. +.PP +.B protoize +is an optional part of GNU C. You can use it to add prototypes to a +program, thus converting the program to ANSI C in one respect. The companion +program `unprotoize' does the reverse: it removes argument types from +any prototypes that are found. +.PP +When you run these programs, you must specify a set of source files +as command line arguments. +.SH OPTIONS +These programs are non-trivial to operate, and it is neither possible nor +desirable to properly summarize options in this man page. Read the info +documentation for more information. +.SH "SEE ALSO" +The programs are documented fully by +.IR "Gcc: The use and the internals of the GNU compiler", +available via the Info system. The documentation for protoize/unprotoize +can be found in the subsection "Invoking GCC", under "Running Protoize." +.SH AUTHOR +This manual page was written by Galen Hazelwood, +for the Debian GNU/Linux system. --- gcc-3.4-3.4.2.orig/debian/gcjh-wrapper +++ gcc-3.4-3.4.2/debian/gcjh-wrapper @@ -0,0 +1,86 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java header generator. +# +# Command-line arguments should be in the style of Sun's javah command; +# these will be converted to gcjh arguments before being passed to the +# gcjh itself. +# +# Copyright (C) 2003 by Peter Hawkins +# Haphazardly hacked up based on the gcj-wrapper perl script. +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gcj-wrapper-3.2 shell script. + +use strict; + +# The real Java header generator: +my $javaHeaderGen = '/usr/bin/gcjh-3.4'; + +# The command-line arguments to pass to the real Java compiler: +my @commandLine; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; +my $copyNextArg = 0; +my $ignoreNextArg = 0; +my $appendNextArg = ''; +foreach my $arg (@ARGV) { + # See if we already know what to do with this argument. + if ($ignoreNextArg) { + # Throw it away. + $ignoreNextArg = 0; + next; + } elsif ($copyNextArg or not $parsingOptions) { + # Copy it directly. + push @commandLine, $arg; + $copyNextArg = 0; + next; + } elsif ($appendNextArg) { + # Append it to $appendNextArg and then copy directly. + push @commandLine, ($appendNextArg . $arg); + $appendNextArg = ''; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-verbose') { + push @commandLine, '--verbose'; + } elsif ($arg eq '-classpath' or $arg eq '--classpath' or $arg eq '--cp') { + $appendNextArg = '--classpath='; + } elsif ($arg eq '-encoding' or $arg eq '-bootclasspath' or + $arg eq '-extdirs') { + $appendNextArg = "-".$arg . '='; + } elsif ($arg eq '-d') { + push @commandLine, '-d'; + $copyNextArg = 1; + } elsif ($arg eq '-o') { + push @commandLine, '-o'; + $copyNextArg = 1; + } elsif ($arg eq '-stubs') { + push @commandLine, '-stubs'; + } elsif ($arg eq '-jni') { + push @commandLine, '-jni'; + } elsif ($arg =~ /^-old/) { + # An extended Sun option (which we don't support). + push @commandLine, '--help' if ($arg eq '-old'); + } elsif ($arg =~ /^-/) { + # An unsupported standalone option. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Was there a partial argument that was never completed? +push @commandLine, $appendNextArg if ($appendNextArg); + +# Call the real Java header generator. +my @fullCommandLine = ( $javaHeaderGen ); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-3.4-3.4.2.orig/debian/rules.unpack +++ gcc-3.4-3.4.2/debian/rules.unpack @@ -0,0 +1,96 @@ +# -*- makefile -*- +# rules to unpack the source tarballs in $(srcdir); if the source dir already +# exists, the rule exits with an error to prevent deletion of modified +# source files. It has to be deleted manually. + +gcc_srcdir := gcc-3.4.2 +#gcc_srcdir := gcc-20040403 +gcc_tarball := $(gcc_srcdir).tar.bz2 + +gpc_srcdir := gpc-20030830 +gpc_tarball := gpc-20030830-minimal.tar.bz2 +gpc_tarball := gpc-20030830.tar.gz +gpc_srcdir := gpc-20040516 +gpc_tarball := gpc-20040516.tar.gz + +#testsuite_srcdir := testsuite-3.3-20030118 +#testsuite_tarball := $(testsuite_srcdir).tar.bz2 + +tarballs = $(gcc_tarball) +ifeq ($(with_check),yes) + tarballs += $(testsuite_tarball) +endif +ifeq ($(with_pascal),yes) + tarballs += $(gpc_tarball) +endif + +unpack_stamps = $(foreach i,$(tarballs),$(unpack_stamp)-$(i)) + +unpack: stamp-dir $(unpack_stamp) debian-chmod +$(unpack_stamp): $(unpack_stamps) +$(unpack_stamp): $(foreach p,$(debian_tarballs),unpacked-$(p)) + echo -e "\nBuilt from Debian source package $(PKGSOURCE)-$(SOURCE_VERSION)" \ + > pxxx + echo -e "Integrated upstream packages in this version:\n" >> pxxx + for i in $(tarballs); do echo " $$i" >> pxxx; done + mv -f pxxx $@ + +debian-chmod: + @chmod 755 debian/dh_* + +# --------------------------------------------------------------------------- +$(unpack_stamp)-$(gcc_tarball): $(gcc_tarball) + : # unpack gcc tarball + -mkdir $(stampdir) + if [ -d $(srcdir) ]; then \ + echo >&2 "Source directory $(srcdir) exists. Delete by hand"; \ + false; \ + fi + rm -rf $(gcc_srcdir) + case $(gcc_tarball) in \ + *.bz2) tar -x --bzip2 -f $(gcc_tarball);; \ + *.gz) tar -x --gzip -f $(gcc_tarball);; \ + *) false; \ + esac + mv $(gcc_srcdir) $(srcdir) + echo "$(gcc_tarball) unpacked." > $@ + +# --------------------------------------------------------------------------- +$(unpack_stamp)-$(gpc_tarball): $(gpc_tarball) + : # unpack gpc tarball + -mkdir $(stampdir) + if [ -d $(srcdir)/gcc/p ]; then \ + echo >&2 "Source directory $(srcdir)/gcc/p exists. Delete by hand";\ + false; \ + fi + #rm -rf $(gpc_srcdir) + rm -rf p + case $(gpc_tarball) in \ + *.bz2) tar -x --bzip2 -f $(gpc_tarball);; \ + *.gz) tar -x --gzip -f $(gpc_tarball);; \ + *) false; \ + esac + if [ -d p ]; then \ + mv p $(srcdir)/gcc/. ; \ + else \ + mv $(gpc_srcdir)/p $(srcdir)/gcc/. ; \ + rmdir $(gpc_srcdir); \ + fi + echo "$(gpc_tarball) unpacked." > $@ + +# --------------------------------------------------------------------------- +$(unpack_stamp)-$(testsuite_tarball): $(testsuite_tarball) + : # unpack testsuite tarball + -mkdir $(stampdir) + rm -rf $(testsuite_srcdir) + case $(testsuite_tarball) in \ + *.bz2) tar -x -p --bzip2 -f $(testsuite_tarball);; \ + *.gz) tar -x -p --gzip -f $(testsuite_tarball);; \ + *) false; \ + esac + for t in gcc libjava libstdc++-v3; do \ + rm -rf $(srcdir)/$$t/testsuite; \ + mv $(testsuite_srcdir)/$$t/testsuite $(srcdir)/$$t/.; \ + done + rm -rf $(testsuite_srcdir) + echo "$(testsuite_tarball) unpacked." > $@ --- gcc-3.4-3.4.2.orig/debian/reduce-test-diff.awk +++ gcc-3.4-3.4.2/debian/reduce-test-diff.awk @@ -0,0 +1,33 @@ +#! /usr/bin/gawk -f + +BEGIN { + skip=0 + warn=0 +} + +/^-(FAIL|ERROR|UNRESOLVED|WARNING)/ { + next +} + +# only compare gcc, g++, g77 and objc results +/=== treelang tests ===/ { + skip=1 +} + +# omit extra files appended to test-summary +/^\+Compiler version/ { + skip=1 +} + +skip == 0 { + print + next +} + +/^\+(FAIL|ERROR|UNRESOLVED|WARNING)/ { + warn=1 +} + +END { + exit warn +} --- gcc-3.4-3.4.2.orig/debian/fastjar.postinst +++ gcc-3.4-3.4.2/debian/fastjar.postinst @@ -0,0 +1,15 @@ +#! /bin/sh -e + +if [ -f /usr/share/info/fastjar.info.gz ]; then + install-info --quiet --section "Development" "Development" \ + /usr/share/info/fastjar.info.gz +else + # GFDL invariant free + true +fi + +update-alternatives --quiet --install /usr/bin/jar jar /usr/bin/fastjar 33 \ + --slave /usr/share/man/man1/jar.1.gz jar.1.gz /usr/share/man/man1/fastjar.1.gz \ +|| true + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gccbug.1 +++ gcc-3.4-3.4.2/debian/gccbug.1 @@ -0,0 +1,178 @@ +.\" Automatically generated by Pod::Man v1.34, Pod::Parser v1.13 +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sh \" Subsection heading +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. | will give a +.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to +.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' +.\" expand to `' in nroff, nothing in troff, for use with C<>. +.tr \(*W-|\(bv\*(Tr +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +'br\} +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. nr % 0 +. rr F +.\} +.\" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.hy 0 +.if n .na +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "GCCBUG 1" +.TH GCCBUG 1 "2003-06-03" "gcc-3.4" "GNU" +.SH "NAME" +gccbug \- Reporting GCC Bugs +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +gccbug + [ \fB\-\-cc\fR \fImail-address\fR ] + [ \fB\-\-version\fR ] | [ \fB\-\-help\fR ] +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +\&\fBgccbug\fR is a version of \s-1GNU\s0 \s-1GNATS\s0 send-pr configured for \s-1GCC\s0 bug +reporting. +.PP +Invoking \fBgccbug\fR calls the editor named in your environment +variable \fB\s-1VISUAL\s0\fR or \fB\s-1EDITOR\s0\fR on a problem report template. +.PP +Your bug reports play an essential role in making \s-1GCC\s0 reliable. However +since the maintainers are very overloaded, please first make sure that: +.IP "\(bu" 4 +The problem is not already known. See +<\fBhttp://gcc.gnu.org/bugs.html#known\fR> for a list of known bugs. +If it isn't known, then you should report the problem. +.Sp +You can browse the bug database for bugs reported at +<\fBhttp://gcc.gnu.org/cgi\-bin/gnatsweb.pl\fR>. +.IP "\(bu" 4 +You include the information that makes for fixing the bug. See +<\fBhttp://gcc.gnu.org/bugs.html#report\fR> for bug reporting instructions. +.SH "OPTIONS" +.IX Header "OPTIONS" +.IP "\fB\-\-cc\fR \fImail-address\fR" 4 +.IX Item "--cc mail-address" +Specifies the mail-address to which the \s-1PR\s0 should be carbon\-copied. +.IP "\fB\-\-version\fR" 4 +.IX Item "--version" +Displays the \fBgccbug\fR version number and a usage summary. No mail +is sent. +.IP "\fB\-\-help\fR" 4 +.IX Item "--help" +Displays a usage summary for \fBgccbug\fR. No mail is sent. +.PP +\&\fBgccbug\fR has more (undocumented) options, which may be +unsupported by a future \s-1GCC\s0 bug tracking system. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +\&\fIgcc\fR\|(1), \fIsend\-pr\fR\|(1), \fIsend\-pr\fR\|(8), the info entries for \fIgcc\fR (node Bugs), +and the online pages at <\fBhttp://gcc.gnu.org/bugs.html\fR>. --- gcc-3.4-3.4.2.orig/debian/libffi.preinst +++ gcc-3.4-3.4.2/debian/libffi.preinst @@ -0,0 +1,9 @@ +#! /bin/sh -e + +if [ -h /usr/share/doc/libffi2 ]; then + rm -f /usr/share/doc/libffi2 +else + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcj-wrapper.1 +++ gcc-3.4-3.4.2/debian/gcj-wrapper.1 @@ -0,0 +1,20 @@ +.TH GCJ-WRAPPER 1 "June 6, 2002" gcj-wrapper "Java User's Manual" +.SH NAME +gcj-wrapper \- a wrapper around gcj + +.SH SYNOPSIS +gcj-wrapper [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgcj-wrapper\fR is a wrapper around gcj(1) to be called as the java +compiler. Options different for javac(1) and gcj(1) are translated, +options unknown to gcj(1) are silently ignored. + +.SH OPTIONS +See gcj-3.3(1) for a list of options that gcj understands. + +.SH "SEE ALSO" +.BR gcj-3.3(1) +, +.BR javac(1) --- gcc-3.4-3.4.2.orig/debian/README.patches +++ gcc-3.4-3.4.2/debian/README.patches @@ -0,0 +1,30 @@ +Patches applied to the Debian version of egcs +--------------------------------------------- + +Debian specific patches can be found in the debian/patches directory. +Each patch is accompanied by a shell script to apply and unapply the +patch: + +- The script can be found in the debian/patches directory and is called + .dpatch. +- The shell script is called by the debian/rules file with the option + '-patch' to apply the patch and and with '-unpatch' to unapply + the patch. The working directory is the source directory. +- The shell script returns 0 on success and 1 on failure when + (un)applying the patch. The patch program itself should be called with + --force to prevent questions. +- debian/rules creates a file patched- in the source + directory when applying the patch and removes this file when + unapplying the patch. + +Besides the patches, the following add-ons were included: + +- gpc (unpacked from gpc-19990118.tar.gz) + ftp://agnes.dida.physik.uni-essen.de/gnu-pascal/beta/gpc-19990118.tar.gz + +If these package(s) aren't found in the gcc source directory, it's +assumed that the tarball(s) can be found in the parent directory. See +debian/rules for more details. + +Before making a source package, these packages need to be unpacked. +You can use "debian/rules unpack-addons". --- gcc-3.4-3.4.2.orig/debian/libstdc++6-doc.doc-base +++ gcc-3.4-3.4.2/debian/libstdc++6-doc.doc-base @@ -0,0 +1,13 @@ +Document: libstdc++6-doc +Title: The GNU Standard C++ Library v3 (gcc-3.4) +Author: Various +Abstract: This package contains documentation files for the GNU stdc++ library. + One set is the distribution documentation, the other set is the + source documentation including a namespace list, class hierarchy, + alphabetical list, compound list, file list, namespace members, + compound members and file members. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/libstdc++6-doc/libstdc++/html_user/index.html +Files: /usr/share/doc/libstdc++6-doc/libstdc++/html*/* --- gcc-3.4-3.4.2.orig/debian/dh_doclink +++ gcc-3.4-3.4.2/debian/dh_doclink @@ -0,0 +1,12 @@ +#! /bin/sh + +pkg=`echo $1 | sed 's/^-p//'` +target=$2 + +[ -d debian/$pkg/usr/share/doc ] || mkdir -p debian/$pkg/usr/share/doc +if [ -d debian/$pkg/usr/share/doc/$p -a ! -h debian/$pkg/usr/share/doc/$p ] +then + echo "WARNING: removing doc directory $pkg" + rm -rf debian/$pkg/usr/share/doc/$pkg +fi +ln -sf $target debian/$pkg/usr/share/doc/$pkg --- gcc-3.4-3.4.2.orig/debian/rules +++ gcc-3.4-3.4.2/debian/rules @@ -0,0 +1,79 @@ +#! /usr/bin/make -f +# -*- makefile -*- +# Build rules for gcc (>= 2.95) and gcc-snapshot +# Targets found in this makefile: +# - unpack tarballs +# - patch sources +# - (re)create the control file +# - create a debian/rules.parameters file, which is included +# by debian/rules2 +# All other targets are passed to the debian/rules2 file + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +default: build + +include debian/rules.defs +include debian/rules.unpack +include debian/rules.patch + +control: $(control_dependencies) + -mkdir -p $(stampdir) + $(MAKE) -f debian/rules.conf $@ + +configure: $(configure_dependencies) +$(configure_stamp): control $(unpack_stamp) $(patch_stamp) + $(MAKE) -f debian/rules2 $@ +$(configure_dummy_stamp): control + $(MAKE) -f debian/rules2 $@ +$(configure_hppa64_stamp): $(build_stamp) + $(MAKE) -f debian/rules2 $@ + +build: $(build_dependencies) +$(build_stamp): $(unpack_stamp) $(patch_stamp) $(configure_stamp) + $(MAKE) -f debian/rules2 $@ +$(build_dummy_stamp): $(configure_dummy_stamp) + $(MAKE) -f debian/rules2 $@ +$(build_hppa64_stamp): $(configure_hppa64_stamp) + $(MAKE) -f debian/rules2 $@ + +check: $(build_stamp) + $(MAKE) -f debian/rules2 $@ + +clean: + rm -rf $(stampdir) +# remove temporary dirs used for unpacking + rm -rf $(gcc_srcdir) $(gpc_srcdir) p + -$(MAKE) -f debian/rules2 $@ + rm -rf $(srcdir) $(builddir)* debian/tmp* html + rm -f bootstrap-* first-move-stamp + rm -f debian/*.tmp + -find debian -name '.#*' | xargs rm -f + dh_clean + +install: $(install_dependencies) +$(install_stamp): $(build_stamp) + $(MAKE) -f debian/rules2 $@ +$(install_dummy_stamp): $(build_dummy_stamp) + $(MAKE) -f debian/rules2 $@ +$(install_hppa64_stamp): $(build_hppa64_stamp) + $(MAKE) -f debian/rules2 $@ + +html-docs doxygen-docs update-doxygen-docs xxx: + $(MAKE) -f debian/rules2 $@ + +binary-indep binary-arch binary: install + $(MAKE) -f debian/rules2 $@ + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +release: + foo=$(shell basename $(CURDIR)); \ + if [ "$$foo" != "gcc-3.4" ]; then \ + find -name CVS -o -name .cvsignore -o -name '.#*' | \ + xargs rm -rf; \ + fi + +.PHONY: build clean binary-indep binary-arch binary release --- gcc-3.4-3.4.2.orig/debian/libgcj-common.preinst +++ gcc-3.4-3.4.2/debian/libgcj-common.preinst @@ -0,0 +1,9 @@ +#! /bin/sh -e + +if [ -d /usr/share/doc/libgcj-common ]; then + rm -rf /usr/share/doc/libgcj-common +else + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcc-cross.prerm +++ gcc-3.4-3.4.2/debian/gcc-cross.prerm @@ -0,0 +1,5 @@ +#!/bin/sh + +update-alternatives --quiet --remove cross-gcc /usr/bin/cross-gcc-ver + +exit 0 --- gcc-3.4-3.4.2.orig/debian/FAQ.gcj +++ gcc-3.4-3.4.2/debian/FAQ.gcj @@ -0,0 +1,494 @@ +The GCJ FAQ +=========== + + The latest version of this document is always available at + http://gcc.gnu.org/java/faq.html. + + General Questions + + What license is used for libgcj? + How can I report a bug in libgcj? + How can I contribute to libgcj + Is libgcj part of GCC? + Will gcj and libgcj work on my machine? + How can I debug my Java program? + Can I interface byte-compiled and native java code? + + + Java Feature Support + + What Java API's are supported? How complete is + the support? + Does GCJ support using straight C native methods + ala JNI? + Why does GCJ use CNI? + What is the state of AWT support? + How about support for Swing ? + What support is there for RMI ? + Can I use any code from other OpenSource projects + to supplement libgcj's current features ? + What features of the Java language are/arn't supported + + + Build Issues + + I need something more recent than the last release; how + should I build it? + Linker bug on Solaris + Can I configure/build in the source tree? + My libgcj build fails with "invalid use of undefined type + struct sigcontext_struct" + + + Gcj Compile/Link Questions + + Why do I get undefined reference to `main' errors? + Can GCJ only handle source code? + "gcj -C" Doesn't seem to work like javac/jikes. Whats going on? + Where does GCJ look for files? + How does gcj resolve wether to compile .class or .java files? + I'm getting link errors! + I'm getting 'undefined symbol: __dso_handle' + + + Runtime Questions + + My program is dumping core! What's going on? + When I run the debugger I get a SEGV in the GC! What's going on? + I have just compiled and benchmarked my Java application + and it seems to be running slower than than XXX JIT JVM. Is there + anything I can do to make it go faster? + Can I profile Garbage Collection? + How do I increase the runtime's initial and maximum heap sizes? + How can I profile my application? + My program seems to hang and doesn't produce any output + + + Programming Issues + + Are there any examples of how to use CNI? + Is it possible to invoke GCJ compiled Java code from a + C++ application? + +General Questions +================= + + 1.1 What license is used for libgcj? + + libgcj is distributed under the GPL, with the 'libgcc exception'. + This means that linking with libgcj does not by itself cause + your program to fall under the GPL. See LIBGCJ_LICENSE in + the source tree for more details. + + 1.2 How can I report a bug in libgcj? + + libgcj has a corresponding Gnats bug database which you can + browse. You can also submit new bug reports from the Gnats + page. + + 1.3 How can I contribute to libgcj? + + You can send simple bug fixes in as patches. Please follow + the GCC guidelines for submitting patches. For more complex + changes, you must sign copyright over to the Free Software + Foundation. See the contribution page for details. + + 1.4 Is libgcj part of GCC? + + Yes, libgcj is now part of GCC. It can be downloaded, + configured and built as one single tree. + + 1.5 Will gcj and libgcj work on my machine? + + Gcj and libgcj are known to work more or less with IA-32 and + Sparc Solaris, Tru64 Unix, as well as IA-32, IA-64, Alpha, + and PowerPC Linux. They might work on other + systems. Generally speaking, porting to a new system should + not be hard. This would be a good way to volunteer. + + 1.6 How can I debug my Java program? + + gdb 5.0 includes support for debugging gcj-compiled Java + programs. For more information please read Java Debugging + with gdb. + + 1.7 Can I interface byte-compiled and native java code + + libgcj has a bytecode interpreter that allows you to mix + .class files with compiled code. It works pretty + transparently: if a compiled version of a class is not found + in the application binary or linked shared libraries, the + class loader will search for a bytecode version in your + classpath, much like a VM would. Be sure to build libgcj + with the --enable-interpreter option to enable this + functionality. + + The program "gij" provides a front end to the interpreter + that behaves much like a traditional virtual machine. You + can even use "gij" to run a shared library which is compiled + from java code and contains a main method: + + $ gcj -shared -o lib-HelloWorld.so HelloWorld.java + $ gij HelloWorld + + This works because gij uses Class.forName, which knows how + to load shared objects. + +Java Feature Support +==================== + + 2.1 What Java API's are supported? How complete is + the support? + + Matt Welsh writes: + + Just look in the 'libjava' directory of libgcj and see + what classes are there. Most GUI stuff isn't there yet, + that's true, but many of the other classes are easy to add + if they don't yet exist. + + I think it's important to stress that there is a big + difference between Java and the many libraries which Java + supports. Unfortunately, Sun's promise of "write once, run + everywhere" assumes much more than a JVM: you also need + the full set of JDK libraries. Considering that new Java + APIs come out every week, it's going to be impossible to + track everything. + + To make things worse, you can't simply run Sun's JDK + classes on any old JVM -- they assume that a bunch of + native methods are also defined. Since this native method + requirement isn't defined by the JDK specs, you're + effectively constrained to using Sun's JVMs if you want to + use Sun's JDK libraries. Oh yes -- you could also + reimplement all of those native methods yourself, and make + sure they behave exactly as Sun's do. Note that they're + undocumented! + + 2.2 Does GCJ support using straight C native methods + ala JNI? + + Yes. libgcj now has experimental support for JNI, in + addition to its native Compiled Native Interface (CNI). gcjh + will generate JNI stubs and headers using the "-jni" + option. However, we do prefer CNI: it is more efficient, + easier to write, and (at least potentially) easier to debug. + + 2.3 Why does GCJ use CNI? + + Per Bothner explains: + + We use CNI because we think it is a better solution, + especially for a Java implementation that is based on the + idea that Java is just another programming language that + can be implemented using standard compilation + techniques. Given that, and the idea that languages + implemented using Gcc should be compatible where it makes + sense, it follows that the Java calling convention should + be as similar as practical to that used for other + languages, especially C++, since we can think of Java as a + subset of C++. CNI is just a set of helper functions and + conventions built on the idea that C++ and Java have the + *same* calling convention and object layout; they are + binary compatible. (This is a simplification, but close + enough.) + + 2.4 What is the state of AWT support? + + Work is in progress to implement AWT and Java2D. We intend + to support both GTK and xlib peers written using CNI. Some + components are already working atop the xlib peers. + + 2.5 How about support for Swing? + + Once AWT support is working then Swing support can be + considered. There is at least one free-software partial + implementations of Swing that may be usable. + + 2.6 What support is there for RMI? + + RMI code exists on the CVS trunk (aka gcc 3.1), but it has + not been heavily tested. This code was donated by + Transvirtual Technologies. + + 2.7 Can I use any code from other OpenSource + projects to supplement libgcj's current features? + + Certainly. However, in many cases, if you wanted to + contribute the code back into the official libgcj + distribution, we would require that the original author(s) + assign copyright to the Free Software Foundation. As of + March 6, 2000, libgcj has been relicenced, and copyright + has been assigned to the FSF. This allows us to share and + merge much of the libgcj codebase with the Classpath + project. Our eventual goal is for Classpath to be an + upstream source provider for libgcj, however it will be + some time before this becomes reality: libgcj and Classpath + have different implementations of many core java + classes. In order to merge them, we need to select the best + (most efficient, cleanest) implementation of each + method/class/package, resolve any conflicts created by the + merge, and test the final result. Needless to say, this is + a lot of work. If you can help out, please let us know! + + 2.8 What features of the Java language are/aren't supported. + + GCJ supports all Java language constructs as per the Java + language Specification. Recent GCJ snapshots have added + support for most JDK1.1 (and beyond) language features, + including inner classes. + +Build Issues +============ + + 3.1 I need something more recent than the last release. + How should I build it? + + Please read here: http://gcc.gnu.org/java/build-snapshot.html + + 3.2 Linker bug on Solaris + + There is a known problem with the native Solaris linker when + using gcc/gcj. A good indication you've run into this + problem is if you get an error that looks like the following + when building libgcj: + +ld: warning: option -o appears more than once, first setting taken +ld: fatal: file libfoo.so: cannot open file: No such file or directory +ld: fatal: File processing errors. No output written to .libs/libfoo.so +collect2: ld returned 1 exit status + + A known workaround for this and other reported link problems + on the various releases of Solaris is to build gcc/gcj with + the latest GNU binutils instead of the native Solaris + ld. The most straightforward way to do this is to build and + install binutils, and then reference it in the configure for + gcc via --with-ld=/path_to_binutils_install/bin/ld + (--with-as may also be similarly specified but is not + believed to be required). + + Please note, gcc/gcj must be built using GNU ld prior to + doing a clean build of libgcj! + + 3.3 Can I configure/build in the source tree? + + No. You cannot configure/build in the source tree. If you + try, you'll see something like: + + $ ./configure [...] + Configuring for a i686-pc-linux-gnu host. + *** Cannot currently configure in source tree. + + Instead, you must build in another directory. E.g.: + + $ mkdir build + $ cd build + $ ../configure [...] + + 3.4 My libgcj build fails with "invalid use of undefined type + struct sigcontext_struct" + + If you're using Linux, this probably means you need to + upgrade to a newwer, glibc (libc6) based Linux + distribution. libgcj does not support the older linux libc5. + It might be possible to get a working libgcj by changing + occurances of "sigcontext_struct" to "sigcontext", however + this has not been tested. Even if it works, it is likely + that there are other issues with older libc versions that + would prevent libgcj from working correctly (threads bugs, + for example). + +Gcj Compile/Link Questions +========================== + + 4.1 Why do I get undefined reference to `main' errors? + + When using gcj to link a Java program, you must use the --main= + option to indicate the class that has the desired main method. + This is because every Java class can have a main method, thus + you have to tell gcj which one to use. + + 4.2 Can GCJ only handle source code? + + GCJ will compile both source (.java) and bytecode (.class) + files. However, in many cases the native code produced by + compiling from source is better optimized than that compiled + from .class files. + + Per Bothner explains: + + The reason is that when you compile to bytecode you lose a + lot of information about program structure etc. That + information helps in generating better code. We can in + theory recover the information we need by analysing the + structure of the bytecodes, but it is sometimes difficult + - or sometimes it just that no-one has gotten around to + it. Specific examples include loop structure (gcc + generates better code with explicit loops rather than with + the equivalent spaghetti code), array initializers, and + the JDK 1.1 `CLASS.class' syntax, all of which are + represented using more low-level constructs in bytecode. + + 4.3 "gcj -C" Doesn't seem to work like javac/jikes. Whats going on? + + The behavior of "gcj -C" is not at all like javac or jikes, + which will compile (not just scan) all .java's which are out + of date with regard to their .class's. + + 4.4 Where does GCJ look for files? + + GCJ looks for classes to compile based on the CLASSPATH + environment variable. libgcj.jar and other files are found + relative to the path of the compiler itself, so it is safe + to move the entire compiler tree to a different path, and + there is no need to include libgcj.jar in your CLASSPATH. + + 4.5 How does gcj resolve whether to compile .class or .java files? + + GCJ compiles only the files presented to it on the command + line. However, it also needs to scan other files in order to + determine the layout of other classes and check for errors + in your code. For these dependencies, GCJ will favour + .class files if they are available because it is faster to + parse a class file than source code. + + 4.6 I'm getting link errors + + If you get errors at link time that refer to 'undefined + reference to `java::lang::Object type_info function', verify + that you have compiled any CNI C++ files with the -fno-rtti + option. This is only required for versions of GCJ earlier + than 3.0. + + 4.7 I'm getting 'undefined symbol: __dso_handle' + + Some versions of the GNU linker have broken support for the + '.hidden' directive, which results in problems with shared + libraries built with recent versions of gcc. + + There are three solutions: + + - downgrade to binutils that don't support .hidden at all, + - upgrade to a recent binutils, or + - undef the HAVE_GAS_HIDDEN definition in gcc's auto-host.h + (and rebuild gcc). + +Runtime Questions +================= + + 5.1 My program is dumping core! What's going on? + + It could be any number of things. One common mistake is + having your CLASSPATH environment variable pointing at a + third party's java.lang and friends. Either unset CLASSPATH, + or make sure it does not refer to core libraries other than + those found in libgcj.jar.Note that newwer versions of GCJ + will reject the core class library if it wasn't generated by + GCJ itself. + + 5.2 When I run the debugger I get a SEGV in the GC! What's going on? + + This is "normal"; the Garbage Collector (GC) uses it to + determine stack boundaries. It is ordinarily caught and + handled by the GC -- you can see this in the debugger by + using cont to continue to the "real" segv. + + 5.3 I have just compiled and benchmarked my Java application + and it seems to be running slower than than XXX JIT JVM. Is there + anything I can do to make it go faster? + + A few things: + + - If your programs allocate many small, short lived objects, + the heap could be filling and triggering GC too + regularly. Try increasing the initial and maximum heap sizes + as per 5.5 How do I increase the runtime's initial and + maximum heap size? + - RE - array accesses. We have sub-optimal runtime checking + code, and the compiler is still not so smart about + automatically removing array checks. If your code is ready, + and it doesn't rely on them, try compiling with + --no-bounds-check. + - Try static linking. On many platforms, dynamic (PIC) + function calls are more expensive than static ones. In + particular, the interaction with boehm-gc seems to incur + extra overhead when shared libraries are used. + - If your Java application doesn't need threads, try + building libgcj using --enable-threads=none. Portions of the + libgcj runtime are still more efficient when + single-threaded. + + 5.4 Can I profile Garbage Collection? + + It is possible to turn on verbose GC output by supressing + the -DSILENT flag during build. One way to do this is to + comment out the line with #define SILENT 1 from + boehm-gc/configure before configuring libgcj. The GC will + print collection statistics to stdout. (Rebuilding boehm-gc + alone without this flag doesn't seem to work.) + + 5.5 How do I increase the runtime's initial and maximum heap sizes? + + Some programs that allocate many small, short-lived objects + can cause the default-sized heap to fill quickly and GC + often. With the 2.95.1 release there is no means to adjust + the heap at runtime. Recent snapshots provide the -ms and + -mx arguments to gij to specify the initial and maximum heap + sizes, respectively. + + 5.6 How can I profile my application? + + Currently, only single threaded Java code may be used by the + profiler (gprof). POSIX threads seem to be incompatible with + the gmon stuff. A couple of other tools that have been + mentioned on the GCJ mailing list are sprof and cprof. The + former is part of GNU libc. + + 5.7 My program seems to hang and doesn't produce any output + + Some versions had a bug in the iconv support. You can work + around it by setting LANG=en_US.UTF-8 at runtime, or give + the following option during compile time + -Dfile.encoding=UTF-8. This problem should no longer occur + as of November 1, 2000. + +Programming Issues +================== + + 6.1 Are there any examples of how to use CNI? + + Glenn Chambers has created a couple of trivial examples for + version 2.95 and version 3.0. As a comparison, here is the + same example as a JNI application using Kaffe. The same + code will work with GCJ, as shown here. + + Note that for version 2.95, you must compile the C++ files + used for CNI with the -fno-rtti option. This constraint + does not apply in version 3.0 and later. + + The primary source of documentation for CNI is at + http://gcc.gnu.org/java/papers/cni/t1.html + + 6.2 Is it possible to invoke GCJ compiled Java code from a + C++ application? + + Yes, GCJ 3.1 supports a CNI-based invocation interface as + well as the traditional JNI invocation API. See the GCJ + Manual for more details on how to use the CNI interface. + +Please send FSF & GNU inquiries & questions tognu@gnu.org.There are +also other waysto contact the FSF. + +These pages are maintained by The GCC team. + +Please send comments on these web pages and GCC to our publicmailing +list at gcc@gnu.org orgcc@gcc.gnu.org, send other questions to +gnu@gnu.org. + +Copyright (C) Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111, USA. + +Verbatim copying and distribution of this entire article is permitted +in any medium, provided this notice is preserved. + +Last modified 2003-04-30 --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-fastjar.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-fastjar.mk @@ -0,0 +1,54 @@ +arch_binaries := $(arch_binaries) fastjar + +p_jar = fastjar +d_jar = debian/$(p_jar) + +dirs_jar = \ + $(docdir)/$(p_jar) \ + $(PF)/bin \ + $(PF)/share/man/man1 \ + $(PF)/share/info + +files_jar = \ + $(PF)/bin/{fastjar,grepjar} \ + $(PF)/share/man/man1/{fastjar,grepjar}.1 \ + $(PF)/share/info/fastjar.info + +# ---------------------------------------------------------------------- +$(binary_stamp)-fastjar: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_jar) + dh_installdirs -p$(p_jar) $(dirs_jar) + +ifeq ($(versioned_packages),yes) + : # rename versioned files back to unversioned ones. + for i in jar grepjar; do \ + mv $(d)/$(PF)/bin/$$i$(pkg_ver) $(d)/$(PF)/bin/$$i; \ + mv $(d)/$(PF)/share/man/man1/$$i$(pkg_ver).1 \ + $(d)/$(PF)/share/man/man1/$$i.1; \ + done +endif + + mv $(d)/$(PF)/bin/jar $(d)/$(PF)/bin/fastjar + mv $(d)/$(PF)/share/man/man1/jar.1 $(d)/$(PF)/share/man/man1/fastjar.1 + + DH_COMPAT=2 dh_movefiles -p$(p_jar) $(files_jar) + + dh_installdocs -p$(p_jar) $(srcdir)/fastjar/{CHANGES,NEWS,README} + dh_installchangelogs -p$(p_jar) $(srcdir)/fastjar/ChangeLog + + debian/dh_rmemptydirs -p$(p_jar) + + dh_strip -p$(p_jar) + dh_compress -p$(p_jar) + dh_fixperms -p$(p_jar) + dh_shlibdeps -p$(p_jar) + dh_gencontrol -p$(p_jar) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_jar) + dh_md5sums -p$(p_jar) + dh_builddeb -p$(p_jar) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-hppa64.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-hppa64.mk @@ -0,0 +1,21 @@ +arch_binaries := $(arch_binaries) hppa64 + +# ---------------------------------------------------------------------- +$(binary_stamp)-hppa64: $(install_hppa64_stamp) + dh_testdir + dh_testroot + +# dh_installdirs -p$(p_hppa64) + debian/dh_doclink -p$(p_hppa64) $(p_base) + debian/dh_rmemptydirs -p$(p_hppa64) + + dh_strip -p$(p_hppa64) -X.o -Xlibgcc.a -Xlibgcov.a + dh_compress -p$(p_hppa64) + dh_fixperms -p$(p_hppa64) + dh_shlibdeps -p$(p_hppa64) + dh_gencontrol -p$(p_hppa64) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_hppa64) + dh_md5sums -p$(p_hppa64) + dh_builddeb -p$(p_hppa64) + + touch $@ --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libstdcxx.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libstdcxx.mk @@ -0,0 +1,426 @@ +ifeq ($(with_libcxx),yes) + arch_binaries := $(arch_binaries) libstdcxx +endif +ifeq ($(with_lib64cxx),yes) + arch_binaries := $(arch_binaries) lib64stdcxx +endif +ifeq ($(biarch_ia32),yes) + arch_binaries := $(arch_binaries) lib32stdcxx +endif + +ifeq ($(with_cxxdev),yes) + arch_binaries := $(arch_binaries) libstdcxx-dev + indep_binaries := $(indep_binaries) libstdcxx-doc +endif + +p_lib = libstdc++$(CXX_SONAME) +ifeq ($(with_oldarmabi),yes) + p_lib = libstdc++6-0 +endif +ifeq ($(with_oldcxxabi),yes) + p_lib = libstdc++6-0 +endif +p_dev = $(p_lib)-dev +p_pic = $(p_lib)-pic +p_dbg = $(p_lib)-dbg +p_lib64 = lib64stdc++$(CXX_SONAME) +p_lib32 = lib32stdc++$(CXX_SONAME) +p_libd = libstdc++$(CXX_SONAME)-doc +ifeq ($(with_oldcxxabi),yes) + p_lib64 = lib64stdc++6-0 + p_lib32 = lib32stdc++6-0 +endif + +d_lib = debian/$(p_lib) +d_lib64 = debian/$(p_lib64) +d_lib32 = debian/$(p_lib32) +d_dev = debian/$(p_dev) +d_pic = debian/$(p_pic) +d_dbg = debian/$(p_dbg) +d_libd = debian/$(p_libd) + +dirs_lib = \ + $(docdir) \ + $(PF)/$(libdir) + +dirs_lib64 = \ + $(docdir) \ + $(PF)/lib64 + +files_lib = \ + $(PF)/$(libdir)/libstdc++.so.* + +files_lib64 = \ + $(PF)/lib64/libstdc++.so.* + +dirs_dev = \ + $(docdir)/$(p_lib) \ + $(PF)/$(libdir) \ + $(gcc_lib_dir)/include \ + $(cxx_inc_dir) + +files_dev = \ + $(cxx_inc_dir)/ \ + $(gcc_lib_dir)/libstdc++.{a,so} \ + $(gcc_lib_dir)/libsupc++.a +# Not yet... +# $(PF)/$(libdir)/lib{supc,stdc}++.la + +dirs_dbg = \ + $(docdir) \ + $(PF)/$(libdir)/debug \ + $(gcc_lib_dir) +files_dbg = \ + $(PF)/$(libdir)/debug/libstdc++.* + +dirs_pic = \ + $(docdir) \ + $(gcc_lib_dir) +files_pic = \ + $(gcc_lib_dir)/libstdc++_pic.a + +ifeq ($(with_lib64cxx),yes) + dirs_dev += $(gcc_lib_dir)/64/ + files_dev += $(gcc_lib_dir)/64/libstdc++.{a,so} \ + $(gcc_lib_dir)/64/libsupc++.a + dirs_dbg += $(PF)/lib64/debug + files_dbg += $(PF)/lib64/debug/libstdc++.* + dirs_pic += $(gcc_lib_dir) + files_pic += $(gcc_lib_dir)/64/libstdc++_pic.a +endif + +# ---------------------------------------------------------------------- + +gxx_baseline_dir = $(shell \ + sed -n '/^baseline_dir *=/s,.*= *\(.*\)\$$.*$$,\1,p' \ + $(buildlibdir)/libstdc++-v3/testsuite/Makefile) +gxx_baseline_file = $(gxx_baseline_dir)/baseline_symbols.txt + +debian/README.libstdc++-baseline: + cat debian/README.libstdc++-baseline.in \ + > debian/README.libstdc++-baseline + + baseline_name=`basename $(gxx_baseline_dir)`; \ + baseline_parentdir=`dirname $(gxx_baseline_dir)`; \ + compat_baseline_name=""; \ + if [ -f "$(gxx_baseline_file)" ]; then \ + ( \ + echo "A baseline file for $$baseline_name was found."; \ + echo "Running the check-abi script ..."; \ + echo ""; \ + $(MAKE) -C $(buildlibdir)/libstdc++-v3/testsuite \ + check-abi; \ + ) >> debian/README.libstdc++-baseline; \ + else \ + ( \ + echo "No baseline file found for $$baseline_name."; \ + echo "Generating a new baseline file ..."; \ + echo ""; \ + ) >> debian/README.libstdc++-baseline; \ + mkdir $(gxx_baseline_dir); \ + $(MAKE) -C $(buildlibdir)/libstdc++-v3/testsuite new-abi-baseline; \ + cat $(gxx_baseline_file) >> debian/README.libstdc++-baseline; \ + fi + +# ---------------------------------------------------------------------- +$(binary_stamp)-libstdcxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lib) + dh_installdirs -p$(p_lib) $(dirs_lib) + DH_COMPAT=2 dh_movefiles -p$(p_lib) $(files_lib) + + dh_installdocs -p$(p_lib) + echo "See /$(docdir)/$(p_base) for more information" \ + > $(d_lib)/$(docdir)/$(p_lib)/README.Debian + + dh_installchangelogs -p$(p_lib) + debian/dh_rmemptydirs -p$(p_lib) + + dh_strip -p$(p_lib) + dh_compress -p$(p_lib) + dh_fixperms -p$(p_lib) + dh_makeshlibs -p$(p_lib) -V '$(p_lib) (>= $(DEB_STDCXX_SOVERSION))' + cat debian/$(p_lib)/DEBIAN/shlibs >> debian/shlibs.local + dh_shlibdeps \ + -L$(p_lgcc) -l:$(d)/$(PF)/lib:$(d_lgcc)/lib:\ + -p$(p_lib) + dh_gencontrol -p$(p_lib) -u-v$(DEB_VERSION) + + b=libstdc++; \ + for ext in preinst postinst prerm postrm; do \ + for t in ''; do \ + v=$(CXX_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + + dh_installdeb -p$(p_lib) + dh_md5sums -p$(p_lib) + dh_builddeb -p$(p_lib) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-lib64stdcxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lib64) + dh_installdirs -p$(p_lib64) $(dirs_lib64) + install -d $(d)/lib64 + DH_COMPAT=2 dh_movefiles -p$(p_lib64) $(files_lib64) + dh_installdocs -p$(p_lib64) + echo "See /$(docdir)/$(p_base) for more information" \ + > $(d_lib64)/$(docdir)/$(p_lib64)/README.Debian + dh_installchangelogs -p$(p_lib64) + debian/dh_rmemptydirs -p$(p_lib64) + dh_strip -p$(p_lib64) + dh_compress -p$(p_lib64) + dh_fixperms -p$(p_lib64) + dh_makeshlibs -p$(p_lib64) -V '$(p_lib64) (>= $(DEB_STDCXX_SOVERSION))' +# pass explicit dependencies to dh_shlibdeps +ifeq ($(DEB_TARGET_GNU_CPU),s390) +# dh_shlibdeps -p$(p_lib64) -L $(p_l64gcc) -l $(d_l64gcc)/lib +#/usr/bin/ldd: line 1: /lib/ld64.so.1: cannot execute binary file +#dpkg-shlibdeps: failure: ldd on `debian/lib64gcc1/lib64/libgcc_s.so.1' gave error exit status 1 + echo 'shlibs:Depends=libc6-s390x (>= 2.3.1-1), $(p_l64gcc) (>= $(DEB_LIBGCC_SOVERSION))' \ + > debian/$(p_lib64).substvars +else +ifeq ($(DEB_TARGET_GNU_CPU),i386) + echo 'shlibs:Depends=amd64-libs (>= 0.1), $(p_l64gcc) (>= $(DEB_LIBGCC_SOVERSION))' \ + > debian/$(p_lib64).substvars +else + dh_shlibdeps -p$(p_lib64) -L $(p_l64gcc) -l $(d_l64gcc)/lib +endif +endif + dh_gencontrol -p$(p_lib64) -u-v$(DEB_VERSION) + + b=lib64stdc++; \ + for ext in preinst postinst prerm postrm; do \ + for t in ''; do \ + v=$(CXX_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + + dh_installdeb -p$(p_lib64) + dh_md5sums -p$(p_lib64) + dh_builddeb -p$(p_lib64) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-lib32stdcxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lib32) + dh_installdirs -p$(p_lib32) \ + $(docdir)/$(p_lib32) \ + emul/ia32-linux/usr/lib + + mv $(d)/$(PF)/lib32/libstdc++.so.* \ + $(d_lib32)/emul/ia32-linux/usr/lib/. + + dh_installdocs -p$(p_lib32) + echo "See /$(docdir)/$(p_base) for more information" \ + > $(d_lib32)/$(docdir)/$(p_lib32)/README.Debian + dh_installchangelogs -p$(p_lib32) + debian/dh_rmemptydirs -p$(p_lib32) + dh_strip -p$(p_lib32) + dh_compress -p$(p_lib32) + dh_fixperms -p$(p_lib32) + dh_gencontrol -p$(p_lib32) -u-v$(DEB_VERSION) + + b=lib32stdc++; \ + for ext in preinst postinst prerm postrm; do \ + for t in ''; do \ + v=$(CXX_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + + dh_installdeb -p$(p_lib32) + dh_md5sums -p$(p_lib32) + dh_builddeb -p$(p_lib32) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-libstdcxx-dev: $(install_stamp) \ + $(binary_stamp)-libstdcxx debian/README.libstdc++-baseline + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_dev) $(d_pic) + dh_installdirs -p$(p_dev) $(dirs_dev) + dh_installdirs -p$(p_pic) $(dirs_pic) + dh_installdirs -p$(p_dbg) $(dirs_dbg) + + : # - correct libstdc++-v3 file locations + mv $(d)/$(PF)/$(libdir)/libsupc++.a $(d)/$(gcc_lib_dir)/ + mv $(d)/$(PF)/$(libdir)/libstdc++.{a,so} $(d)/$(gcc_lib_dir)/ + mv $(d)/$(PF)/$(libdir)/libstdc++_pic.a $(d)/$(gcc_lib_dir)/ + + rm -f $(d)/$(PF)/$(libdir)/debug/libstdc++_pic.a + rm -f $(d)/$(PF)/lib64/debug/libstdc++_pic.a + + : # remove precompiled headers + -find $(d) -type d -name '*.gch' | xargs rm -rf + +ifeq ($(biarch),yes) + mv $(d)/$(PF)/lib64/lib*c++*.{a,so} $(d)/$(gcc_lib_dir)/64/. +endif + + DH_COMPAT=2 dh_movefiles -p$(p_dev) $(files_dev) + DH_COMPAT=2 dh_movefiles -p$(p_pic) $(files_pic) + DH_COMPAT=2 dh_movefiles -p$(p_dbg) $(files_dbg) + + dh_link -p$(p_dev) \ + /$(PF)/$(libdir)/libstdc++.so.$(CXX_SONAME) \ + /$(gcc_lib_dir)/libstdc++.so +ifeq ($(biarch),yes) + dh_link -p$(p_dev) \ + /$(PF)/lib64/libstdc++.so.$(CXX_SONAME) \ + /$(gcc_lib_dir)/64/libstdc++.so +endif + + debian/dh_doclink -p$(p_dev) $(p_lib) + debian/dh_doclink -p$(p_pic) $(p_lib) + debian/dh_doclink -p$(p_dbg) $(p_lib) + cp -p $(srcdir)/libstdc++-v3/ChangeLog \ + $(d_dev)/$(docdir)/$(p_lib)/changelog + cp -p debian/README.libstdc++-baseline \ + $(d_dev)/$(docdir)/$(p_lib)/README.libstdc++$(CXX_SONAME)-baseline + if [ -f $(buildlibdir)/libstdc++-v3/testsuite/current_symbols.txt ]; \ + then \ + cp -p $(buildlibdir)/libstdc++-v3/testsuite/current_symbols.txt \ + $(d_dev)/$(docdir)/$(p_lib)/libstdc++$(CXX_SONAME)_symbols.txt; \ + fi + cp -p $(srcdir)/libstdc++-v3/config/linker-map.gnu \ + $(d_pic)/$(gcc_lib_dir)/libstdc++_pic.map + +ifeq ($(with_cxxdev),yes) + debian/dh_rmemptydirs -p$(p_dev) + debian/dh_rmemptydirs -p$(p_pic) + debian/dh_rmemptydirs -p$(p_dbg) +endif + + dh_strip -p$(p_dev) -p$(p_pic) + dh_compress -p$(p_dev) -p$(p_pic) -p$(p_dbg) -X.txt + dh_fixperms -p$(p_dev) -p$(p_pic) -p$(p_dbg) +ifeq ($(with_lib64cxx),yes) + dh_shlibdeps -p$(p_dev) -p$(p_pic) -p$(p_dbg) -Xlib64 +else + dh_shlibdeps -p$(p_dev) -p$(p_pic) -p$(p_dbg) +endif + dh_gencontrol -p$(p_dev) -p$(p_pic) -p$(p_dbg) \ + -u-v$(DEB_VERSION) + + b=libstdc++; \ + for ext in preinst postinst prerm postrm; do \ + for t in -dev -dbg -pic; do \ + v=$(CXX_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + + dh_installdeb -p$(p_dev) -p$(p_pic) -p$(p_dbg) + dh_md5sums -p$(p_dev) -p$(p_pic) -p$(p_dbg) + dh_builddeb -p$(p_dev) -p$(p_pic) -p$(p_dbg) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- + +doxygen_doc_dir = $(buildlibdir)/libstdc++-v3/docs/doxygen + +doxygen-docs: $(build_doxygen_stamp) +$(build_doxygen_stamp): + rm -rf $(doxygen_doc_dir)/html* + if dot -V; then \ + $(MAKE) -C $(buildlibdir)/libstdc++-v3 SHELL=/bin/bash doxygen; \ + else \ + true; \ + fi + $(MAKE) -C $(buildlibdir)/libstdc++-v3 SHELL=/bin/bash doxygen-man + if [ -f $(doxygen_doc_dir)/html_user/index.html ]; then \ + sed -e 's,http://gcc\.gnu\.org/onlinedocs/libstdc++,../html,g' \ + -e 's,Main Page,libstdc++-v3 Source: Main Index,' \ + $(doxygen_doc_dir)/html_user/index.html \ + > $(doxygen_doc_dir)/html_user/index.html.new; \ + mv -f $(doxygen_doc_dir)/html_user/index.html.new \ + $(doxygen_doc_dir)/html_user/index.html; \ + elif [ -f debian/patches/html_user.uue ]; then \ + mkdir -p $(doxygen_doc_dir) || true; \ + cd $(doxygen_doc_dir); \ + uudecode $(PWD)/debian/patches/html_user.uue; \ + tar -x --bzip2 -f html_user.tar.bz2; \ + rm html_user.tar.bz2; \ + else \ + echo "unable to generate doxygen docs"; \ + exit 2; \ + fi + touch $@ + +update-doxygen-docs: doxygen-docs + cd $(doxygen_doc_dir) && tar -c --bzip2 -f html_user.tar.bz2 html_user + uuencode -m $(doxygen_doc_dir)/html_user.tar.bz2 html_user.tar.bz2 \ + > debian/patches/html_user.uue + +$(binary_stamp)-libstdcxx-doc: $(install_stamp) doxygen-docs + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_libd) + dh_installdirs -p$(p_libd) \ + $(docdir)/$(p_base)/libstdc++ \ + $(PF)/share/man + +# debian/dh_doclink -p$(p_libd) $(p_base) + dh_link -p$(p_libd) /usr/share/doc/$(p_base) /usr/share/doc/$(p_libd) + dh_installdocs -p$(p_libd) + rm -f $(d_libd)/$(docdir)/$(p_base)/copyright + + cp -a $(srcdir)/libstdc++-v3/docs/html \ + $(d_libd)/$(docdir)/$(p_base)/libstdc++/. + ln -sf documentation.html \ + $(d_libd)/$(docdir)/$(p_base)/libstdc++/html/index.html + -find $(d_libd)/$(docdir)/$(p_base)/libstdc++/ -name CVS -type d \ + | xargs rm -rf + + cp -a $(doxygen_doc_dir)/html_user \ + $(d_libd)/$(docdir)/$(p_base)/libstdc++/. + cp -a $(doxygen_doc_dir)/man/man3 \ + $(d_libd)/$(PF)/share/man/. + cp -p $(srcdir)/libstdc++-v3/docs/doxygen/Intro.3 \ + $(d_libd)/$(PF)/share/man/man3/C++Intro.3 + +# mkdir -p $(d_libd)/usr/share/lintian/overrides +# cp -p debian/$(p_libd).overrides \ +# $(d_libd)/usr/share/lintian/overrides/$(p_libd) + + dh_compress -p$(p_libd) -Xhtml/17_intro -X.txt -X.tag + dh_fixperms -p$(p_libd) + dh_gencontrol -p$(p_libd) -u-v$(DEB_VERSION) + + dh_installdeb -p$(p_libd) + dh_md5sums -p$(p_libd) + dh_builddeb -p$(p_libd) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-gcc.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-gcc.mk @@ -0,0 +1,175 @@ +arch_binaries := $(arch_binaries) gcc +ifneq ($(GFDL_INVARIANT_FREE),yes) + indep_binaries := $(indep_binaries) gcc-doc +endif + +# gcc must be moved after g77 and g++ +# not all files $(PF)/include/*.h are part of gcc, +# but it becomes difficult to name all these files ... + +dirs_gcc = \ + $(docdir)/$(p_base)/gcc \ + $(PF)/bin \ + $(gcc_lexec_dir) \ + $(gcc_lib_dir)/include \ + $(PF)/share/man/man1 $(libdir) + +files_gcc = \ + $(PF)/bin/{gcc,gcov,gccbug}$(pkg_ver) \ + $(PF)/share/man/man1/{gcc,gcov,gccbug}$(pkg_ver).1 \ + $(gcc_lexec_dir)/collect2 \ + $(gcc_lib_dir)/{specs,libgcc*,libgcov.a,*.o} \ + $(gcc_lib_dir)/include/README \ + $(gcc_lib_dir)/include/{float,iso646,limits,std*,syslimits,unwind,varargs}.h \ + $(shell for d in asm bits gnu linux; do \ + test -e $(d)/$(gcc_lib_dir)/include/$$d \ + && echo $(gcc_lib_dir)/include/$$d; \ + done) + +ifeq ($(biarch),yes) + files_gcc += $(gcc_lib_dir)/64/{libgcc*,libgcov.a,*.o} +endif +ifeq ($(biarch_ia32),yes) + files_gcc += $(gcc_lib_dir)/64/{libgcc*,*.o} +endif + +ifeq ($(with_nls),yes) + files_gcc += $(PF)/share/locale/*/*/gcc*.* +endif + +files_gcc += \ + $(shell test -e $(d)/$(gcc_lib_dir)/SYSCALLS.c.X \ + && echo $(gcc_lib_dir)/SYSCALLS.c.X) + +ifeq ($(DEB_HOST_ARCH),ia64) + files_gcc += $(gcc_lib_dir)/include/ia64intrin.h +endif + +ifeq ($(DEB_HOST_ARCH),i386) + files_gcc += $(gcc_lib_dir)/include/{,e,p,x}mmintrin.h +endif + +ifeq ($(DEB_HOST_ARCH),hurd-i386) + files_gcc += $(gcc_lib_dir)/include/{,e,p,x}mmintrin.h +endif + +ifeq ($(DEB_HOST_ARCH),m68k) + files_gcc += $(gcc_lib_dir)/include/math-68881.h +endif + +ifeq ($(DEB_HOST_ARCH),powerpc) + files_gcc += $(gcc_lib_dir)/include/{altivec.h,ppc-asm.h} +endif + +usr_doc_files = debian/README.Bugs \ + $(shell test -f $(srcdir)/FAQ && echo $(srcdir)/FAQ) +ifeq ($(with_check),yes) + usr_doc_files += test-summary +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-gcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gcc) + dh_installdirs -p$(p_gcc) $(dirs_gcc) + + rm -f $(d)/$(PF)/$(libdir)/libgcc_s.so + ln -sf /$(libdir)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s.so +ifeq ($(biarch),yes) + rm -f $(d)/$(PF)/$(lib64)/libgcc_s.so + ln -sf /$(lib64)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s_64.so + ln -sf /$(lib64)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/64/libgcc_s.so +endif +ifeq ($(biarch_ia32),yes) + mkdir -p $(d_gcc)/$(gcc_lib_dir) + mv $(d)/$(gcc_lib_dir)/32 $(d_gcc)/$(gcc_lib_dir)/ + dh_link -p$(p_gcc) \ + /$(PF)/lib32/libgcc_s.so.$(GCC_SONAME) \ + /$(gcc_lib_dir)/libgcc_s_32.so \ + /$(PF)/lib32/libgcc_s.so.$(GCC_SONAME) \ + /$(gcc_lib_dir)/32/libgcc_s.so +endif + cp -p debian/gccbug.1 $(d)/$(PF)/share/man/man1/gccbug$(pkg_ver).1 + + DH_COMPAT=2 dh_movefiles -p$(p_gcc) $(files_gcc) + + ln -sf gcc$(pkg_ver) \ + $(d_gcc)/$(PF)/bin/$(DEB_TARGET_GNU_TYPE)-gcc$(pkg_ver) + ln -sf gcc$(pkg_ver).1 \ + $(d_gcc)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-gcc$(pkg_ver).1 + ln -sf gcc$(pkg_ver) \ + $(d_gcc)/$(PF)/bin/$(TARGET_ALIAS)-gcc$(pkg_ver) + ln -sf gcc$(pkg_ver).1 \ + $(d_gcc)/$(PF)/share/man/man1/$(TARGET_ALIAS)-gcc$(pkg_ver).1 + +# dh_installdebconf + debian/dh_doclink -p$(p_gcc) $(p_base) + cp -p $(usr_doc_files) $(d_gcc)/$(docdir)/$(p_base)/. + if [ -f testsuite-comparision ]; then \ + cp -p testsuite-comparision $(d_gcc)/$(docdir)/$(p_base)/. ; \ + fi + cp -p debian/NEWS.gcc $(d_gcc)/$(docdir)/$(p_base)/NEWS + cp -p debian/NEWS.html $(d_gcc)/$(docdir)/$(p_base)/NEWS.html + cp -p $(srcdir)/gcc/ChangeLog \ + $(d_gcc)/$(docdir)/$(p_base)/gcc/changelog + if [ -f $(builddir)/gcc/.bad_compare ]; then \ + ( \ + echo "The comparision of the stage2 and stage3 object files shows differences."; \ + echo "The Debian package was modified to ignore these differences."; \ + echo ""; \ + echo "The following files differ:"; \ + echo ""; \ + cat $(builddir)/gcc/.bad_compare; \ + ) > $(d_gcc)/$(docdir)/$(p_base)/BOOTSTRAP_COMPARISION_FAILURE; \ + else \ + true; \ + fi + debian/dh_rmemptydirs -p$(p_gcc) + dh_strip -p$(p_gcc) + dh_compress -p$(p_gcc) -X README.Bugs + dh_fixperms -p$(p_gcc) + dh_shlibdeps -p$(p_gcc) + dh_gencontrol -p$(p_gcc) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_gcc) + dh_md5sums -p$(p_gcc) + dh_builddeb -p$(p_gcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + + : # remove empty directories, when all components are in place + for d in `find $(d) -depth -type d -empty 2> /dev/null`; do \ + while rmdir $$d 2> /dev/null; do d=`dirname $$d`; done; \ + done + + @echo "Listing installed files not included in any package:" + -find $(d) ! -type d + +# ---------------------------------------------------------------------- +$(binary_stamp)-gcc-doc: $(build_html_stamp) $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_doc) + dh_installdirs -p$(p_doc) \ + $(docdir)/$(p_base) \ + $(PF)/share/info + DH_COMPAT=2 dh_movefiles -p$(p_doc) \ + $(PF)/share/info/gcc* + + debian/dh_doclink -p$(p_doc) $(p_base) + dh_installdocs -p$(p_doc) html/gcc.html html/gccint.html + rm -f $(d_doc)/$(docdir)/$(p_base)/copyright + debian/dh_rmemptydirs -p$(p_doc) + + dh_compress -p$(p_doc) + dh_fixperms -p$(p_doc) + dh_installdeb -p$(p_doc) + dh_gencontrol -p$(p_doc) -u-v$(DEB_VERSION) + dh_md5sums -p$(p_doc) + dh_builddeb -p$(p_doc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-nof-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-nof-cross.mk @@ -0,0 +1,46 @@ +arch_binaries := $(arch_binaries) nof + +p_nof = gcc$(pkg_arch)-nof +d_nof = debian/$(p_nof) + +dirs_nof = \ + $(docdir) \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/nof +ifeq ($(with_cdev),yes) + dirs_nof += \ + $(gcc_lib_dir)/nof +endif + +ifeq ($(with_cdev),yes) + files_nof = \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libgcc_s_nof.so.$(GCC_SONAME) \ + $(gcc_lib_dir)/libgcc_s_nof.so \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/nof \ + $(gcc_lib_dir)/nof +else + files_nof = \ + lib/libgcc_s_nof.so.$(GCC_SONAME) +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-nof: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + ln -sf /$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libgcc_s_nof.so.$(GCC_SONAME) \ + $(d)/$(gcc_lib_dir)/libgcc_s_nof.so + + rm -rf $(d_nof) + dh_installdirs -p$(p_nof) $(dirs_nof) + DH_COMPAT=2 dh_movefiles -p$(p_nof) $(files_nof) + debian/dh_doclink -p$(p_nof) $(p_base) + dh_strip -p$(p_nof) + dh_compress -p$(p_nof) + dh_fixperms -p$(p_nof) + dh_gencontrol -p$(p_nof) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_nof) + dh_md5sums -p$(p_nof) + dh_builddeb -p$(p_nof) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libstdcxx-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libstdcxx-cross.mk @@ -0,0 +1,144 @@ +arch_binaries := $(arch_binaries) libstdcxx + +ifeq ($(with_cxxdev),yes) + arch_binaries := $(arch_binaries) libstdcxx-dev +endif + +p_lib = libstdc++$(CXX_SONAME)$(cross_lib_arch) +p_dev = libstdc++$(CXX_SONAME)-dev$(cross_lib_arch) +p_pic = libstdc++$(CXX_SONAME)-pic$(cross_lib_arch) +p_dbg = libstdc++$(CXX_SONAME)-dbg$(cross_lib_arch) + +d_lib = debian/$(p_lib) +d_dev = debian/$(p_dev) +d_pic = debian/$(p_pic) +d_dbg = debian/$(p_dbg) + +dirs_lib = \ + $(docdir) \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib + +files_lib = \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libstdc++.so.* + +dirs_dev = \ + $(docdir)/$(p_lib) \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib \ + $(gcc_lib_dir)/include \ + $(cxx_inc_dir) + +files_dev = \ + $(cxx_inc_dir)/ \ + $(gcc_lib_dir)/libstdc++.{a,so} \ + $(gcc_lib_dir)/libsupc++.a +# Not yet... +# $(PF)/lib/lib{supc,stdc}++.la + +dirs_dbg = \ + $(docdir) \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/debug \ + $(gcc_lib_dir) + +files_dbg = \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/debug/libstdc++.* + +dirs_pic = \ + $(docdir) \ + $(gcc_lib_dir) +files_pic = \ + $(gcc_lib_dir)/libstdc++_pic.a + +# ---------------------------------------------------------------------- + +$(binary_stamp)-libstdcxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lib) + dh_installdirs -p$(p_lib) $(dirs_lib) + + DH_COMPAT=2 dh_movefiles -p$(p_lib) $(files_lib) + +# do this here, else the libraries get stripped, before they are copied ... + rm -rf $(d_dbg) +# dh_installdirs -p$(p_dbg) $(dirs_dbg) +# : # Copy the libraries in libstdc++ to libstdc++-dbg +# (cd $(d_lib)/$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/$(lib) ; tar cfp - .) | \ +# (cd $(d_dbg)/$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/debug ; tar xvfp -) + + dh_installdocs -p$(p_lib) + echo "See /$(docdir)/$(p_base) for more information" \ + > $(d_lib)/$(docdir)/$(p_lib)/README.Debian + + dh_installchangelogs -p$(p_lib) + debian/dh_rmemptydirs -p$(p_lib) + + PATH=/usr/$(TARGET_ALIAS)/bin:$$PATH dh_strip -p$(p_lib) + dh_compress -p$(p_lib) + dh_fixperms -p$(p_lib) + dh_makeshlibs -p$(p_lib) -V '$(p_lib) (>= $(DEB_SOVERSION))' -n + sed s/$(cross_lib_arch)//g < debian/$(p_lib)/DEBIAN/shlibs > debian/$(p_lib)/DEBIAN/shlibs.fixed + mv debian/$(p_lib)/DEBIAN/shlibs.fixed debian/$(p_lib)/DEBIAN/shlibs + : # The prefix of the following command makes dpkg-shlibdeps from dpkg-cross to process non-native binaries + ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib) + sed 's/\(lib[^ ]*\) /\1$(cross_lib_arch) /g' < debian/$(p_lib).substvars > debian/$(p_lib).substvars.new + mv debian/$(p_lib).substvars.new debian/$(p_lib).substvars + dh_gencontrol -p$(p_lib) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_lib) + dh_md5sums -p$(p_lib) + dh_builddeb -p$(p_lib) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-libstdcxx-dev: $(install_stamp) \ + $(binary_stamp)-libstdcxx + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_dev) $(d_pic) + dh_installdirs -p$(p_dev) $(dirs_dev) + dh_installdirs -p$(p_pic) $(dirs_pic) + dh_installdirs -p$(p_dbg) $(dirs_dbg) + + : # - correct libstdc++-v3 file locations + mv $(d)/$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libsupc++.a \ + $(d)/$(gcc_lib_dir)/ + mv $(d)/$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libstdc++.{a,so} \ + $(d)/$(gcc_lib_dir)/ + ln -sf ../../../../$(DEB_TARGET_GNU_TYPE)/lib/libstdc++.so.$(CXX_SONAME) \ + $(d)/$(gcc_lib_dir)/libstdc++.so + mv $(d)/$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libstdc++_pic.a \ + $(d)/$(gcc_lib_dir)/ + + DH_COMPAT=2 dh_movefiles -p$(p_dev) $(files_dev) + DH_COMPAT=2 dh_movefiles -p$(p_pic) $(files_pic) + DH_COMPAT=2 dh_movefiles -p$(p_dbg) $(files_dbg) + + debian/dh_doclink -p$(p_dev) $(p_lib) + debian/dh_doclink -p$(p_pic) $(p_lib) + debian/dh_doclink -p$(p_dbg) $(p_lib) + cp -p $(srcdir)/libstdc++-v3/ChangeLog \ + $(d_dev)/usr/share/doc/$(p_lib)/changelog + + cp -p $(srcdir)/libstdc++-v3/config/linker-map.gnu \ + $(d_pic)/$(gcc_lib_dir)/libstdc++_pic.map + +ifeq ($(with_cxxdev),yes) + debian/dh_rmemptydirs -p$(p_dev) + debian/dh_rmemptydirs -p$(p_pic) + debian/dh_rmemptydirs -p$(p_dbg) +endif + + PATH=/usr/$(TARGET_ALIAS)/bin:$$PATH dh_strip -p$(p_dev) -p$(p_pic) + dh_compress -p$(p_dev) -p$(p_pic) -p$(p_dbg) -X.txt + dh_fixperms -p$(p_dev) -p$(p_pic) -p$(p_dbg) + dh_gencontrol -p$(p_dev) -p$(p_pic) -p$(p_dbg) \ + -u-v$(DEB_VERSION) + dh_installdeb -p$(p_dev) -p$(p_pic) -p$(p_dbg) + dh_md5sums -p$(p_dev) -p$(p_pic) -p$(p_dbg) + dh_builddeb -p$(p_dev) -p$(p_pic) -p$(p_dbg) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libgcc-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libgcc-cross.mk @@ -0,0 +1,65 @@ +arch_binaries := $(arch_binaries) libgcc + +p_lgcc = libgcc$(GCC_SONAME)$(cross_lib_arch) +d_lgcc = debian/$(p_lgcc) + +dirs_lgcc = \ + $(docdir)/$(p_lgcc) \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib + +# If this is false, we basically have an empty libgcc package. This is ok, +# since that should only be temporary anyway +ifeq ($(with_shared_libgcc),yes) +files_lgcc = \ + $(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libgcc_s.so.$(GCC_SONAME) +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-libgcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lgcc) + dh_installdirs -p$(p_lgcc) $(dirs_lgcc) + +ifeq ($(with_shared_libgcc),yes) + DH_COMPAT=2 dh_movefiles -p$(p_lgcc) $(files_lgcc) +endif + + dh_installdocs -p$(p_lgcc) + dh_installchangelogs -p$(p_lgcc) + + debian/dh_rmemptydirs -p$(p_lgcc) + PATH=/usr/$(TARGET_ALIAS)/bin:$$PATH dh_strip -p$(p_lgcc) + dh_compress -p$(p_lgcc) + dh_fixperms -p$(p_lgcc) +ifeq ($(with_shared_libgcc),yes) + dh_makeshlibs -p$(p_lgcc) -V '$(p_lgcc) (>= $(DEB_LIBGCC_SOVERSION))' -n + sed s/$(cross_lib_arch)//g \ + < debian/$(p_lgcc)/DEBIAN/shlibs \ + > debian/$(p_lgcc)/DEBIAN/shlibs.fixed + mv debian/$(p_lgcc)/DEBIAN/shlibs.fixed debian/$(p_lgcc)/DEBIAN/shlibs + cat debian/$(p_lgcc)/DEBIAN/shlibs >> debian/shlibs.local +endif + : # The prefix of the following command makes dpkg-shlibdeps + : # from dpkg-cross to process non-native binaries + ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" \ + dh_shlibdeps -p$(p_lgcc) + sed 's/\(lib[^ ]*\) /\1$(cross_lib_arch) /g' \ + < debian/$(p_lgcc).substvars > debian/$(p_lgcc).substvars.new + mv debian/$(p_lgcc).substvars.new debian/$(p_lgcc).substvars + dh_gencontrol -p$(p_lgcc) -u-v$(DEB_LIBGCC_VERSION) + b=libgcc; v=$(GCC_SONAME); \ + for ext in preinst postinst prerm postrm; do \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done + dh_installdeb -p$(p_lgcc) + dh_md5sums -p$(p_lgcc) + dh_builddeb -p$(p_lgcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-treelang.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-treelang.mk @@ -0,0 +1,55 @@ +arch_binaries := $(arch_binaries) treelang + +p_tree = treelang$(pkg_ver) +d_tree = debian/$(p_tree) + +dirs_tree = \ + $(docdir)/$(p_base)/treelang \ + $(gcc_lexec_dir) \ + $(PF)/bin \ + $(PF)/share/info + +files_tree = \ + $(PF)/bin/tree1$(pkg_ver) \ + $(gcc_lexec_dir)/tree1 + +ifneq ($(GFDL_INVARIANT_FREE),yes) + files_tree += \ + $(PF)/share/info/treelang* +endif + +$(binary_stamp)-treelang: $(build_html_stamp) $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_tree) + dh_installdirs -p$(p_tree) $(dirs_tree) + DH_COMPAT=2 dh_movefiles -p$(p_tree) $(files_tree) + + debian/dh_doclink -p$(p_tree) $(p_base) +ifneq ($(GFDL_INVARIANT_FREE),yes) + dh_installdocs -p$(p_tree) + rm -f $(d_tree)/$(docdir)/$(p_base)/copyright + cp -p html/treelang.html $(d_tree)/$(docdir)/$(p_base)/treelang/ +endif + cp -p $(srcdir)/gcc/treelang/README \ + $(d_tree)/$(docdir)/$(p_base)/treelang/. + cp -p $(srcdir)/gcc/treelang/ChangeLog \ + $(d_tree)/$(docdir)/$(p_base)/treelang/changelog + cp -p debian/README.treelang \ + $(d_tree)/$(docdir)/$(p_base)/treelang/README.Debian + + debian/dh_rmemptydirs -p$(p_tree) + + dh_strip -p$(p_tree) + dh_compress -p$(p_tree) + + dh_fixperms -p$(p_tree) + dh_shlibdeps -p$(p_tree) + dh_gencontrol -p$(p_tree) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_tree) + dh_md5sums -p$(p_tree) + dh_builddeb -p$(p_tree) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-base.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-base.mk @@ -0,0 +1,24 @@ +arch_binaries := base $(arch_binaries) + +# --------------------------------------------------------------------------- +# gcc-base + +$(binary_stamp)-base: $(install_dependencies) + dh_testdir + dh_testroot + rm -rf $(d_base) + dh_installdirs -p$(p_base) + dh_installdocs -p$(p_base) + cp -p debian/NEWS.sarge $(d_base)/usr/share/doc/$(p_base)/NEWS.Debian +ifeq ($(with_base_only),yes) + dh_installchangelogs -p$(p_base) +else + dh_installchangelogs -p$(p_base) $(srcdir)/ChangeLog +endif + dh_compress -p$(p_base) + dh_fixperms -p$(p_base) + dh_gencontrol -p$(p_base) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_base) + dh_md5sums -p$(p_base) + dh_builddeb -p$(p_base) + touch $@ --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-cpp.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-cpp.mk @@ -0,0 +1,73 @@ +arch_binaries := $(arch_binaries) cpp +indep_binaries := $(indep_binaries) cpp-doc + +dirs_cpp = \ + $(docdir) \ + $(PF)/share/man/man1 \ + $(PF)/bin \ + $(gcc_lexec_dir) + +files_cpp = \ + $(PF)/bin/cpp$(pkg_ver) \ + $(PF)/share/man/man1/cpp$(pkg_ver).1 \ + $(gcc_lexec_dir)/cc1 + +# ---------------------------------------------------------------------- +$(binary_stamp)-cpp: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_cpp) + dh_installdirs -p$(p_cpp) $(dirs_cpp) + DH_COMPAT=2 dh_movefiles -p$(p_cpp) $(files_cpp) + + ln -sf cpp$(pkg_ver) \ + $(d_cpp)/$(PF)/bin/$(DEB_TARGET_GNU_TYPE)-cpp$(pkg_ver) + ln -sf cpp$(pkg_ver).1 \ + $(d_cpp)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-cpp$(pkg_ver).1 + ln -sf cpp$(pkg_ver) \ + $(d_cpp)/$(PF)/bin/$(TARGET_ALIAS)-cpp$(pkg_ver) + ln -sf cpp$(pkg_ver).1 \ + $(d_cpp)/$(PF)/share/man/man1/$(TARGET_ALIAS)-cpp$(pkg_ver).1 + + debian/dh_doclink -p$(p_cpp) $(p_base) + debian/dh_rmemptydirs -p$(p_cpp) + + dh_strip -p$(p_cpp) + dh_compress -p$(p_cpp) + dh_fixperms -p$(p_cpp) + dh_shlibdeps -p$(p_cpp) + dh_gencontrol -p$(p_cpp) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_cpp) + dh_md5sums -p$(p_cpp) + dh_builddeb -p$(p_cpp) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-cpp-doc: $(build_html_stamp) $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_cppd) + dh_installdirs -p$(p_cppd) \ + $(docdir)/$(p_base) \ + $(PF)/share/info + DH_COMPAT=2 dh_movefiles -p$(p_cppd) \ + $(PF)/share/info/cpp* + + debian/dh_doclink -p$(p_cppd) $(p_base) + dh_installdocs -p$(p_cppd) html/cpp.html html/cppinternals.html + rm -f $(d_cppd)/$(docdir)/$(p_base)/copyright + debian/dh_rmemptydirs -p$(p_cppd) + + dh_compress -p$(p_cppd) + dh_fixperms -p$(p_cppd) + dh_installdeb -p$(p_cppd) + dh_gencontrol -p$(p_cppd) -u-v$(DEB_VERSION) + dh_md5sums -p$(p_cppd) + dh_builddeb -p$(p_cppd) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-cxx-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-cxx-cross.mk @@ -0,0 +1,42 @@ +arch_binaries := $(arch_binaries) cxx + +dirs_cxx = \ + $(docdir) \ + $(PF)/bin \ + $(gcc_lib_dir) \ + $(PF)/share/man/man1 +files_cxx = \ + $(PF)/bin/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver) \ + $(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver).1 \ + $(gcc_lib_dir)/cc1plus + +# ---------------------------------------------------------------------- +$(binary_stamp)-cxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_cxx) + dh_installdirs -p$(p_cxx) $(dirs_cxx) + DH_COMPAT=2 dh_movefiles -p$(p_cxx) $(files_cxx) +# g++ man page is a .so link + rm -f $(d_cxx)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver).1 + ln -sf $(DEB_TARGET_GNU_TYPE)-gcc$(pkg_ver).1.gz \ + $(d_cxx)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver).1.gz + + debian/dh_doclink -p$(p_cxx) $(p_base) + debian/dh_rmemptydirs -p$(p_cxx) + + dh_strip -p$(p_cxx) + dh_compress -p$(p_cxx) + dh_fixperms -p$(p_cxx) + dh_shlibdeps -p$(p_cxx) + dh_gencontrol -p$(p_cxx) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_cxx) + sed 's/cross-/$(TP)/g;s/-ver/$(pkg_ver)/g;s/gcc/g++/g' < debian/gcc-cross.postinst > debian/$(p_cxx)/DEBIAN/postinst + sed 's/cross-/$(TP)/g;s/-ver/$(pkg_ver)/g;s/gcc/g++/g' < debian/gcc-cross.prerm > debian/$(p_cxx)/DEBIAN/prerm + chmod 755 debian/$(p_cxx)/DEBIAN/{postinst,prerm} + dh_md5sums -p$(p_cxx) + dh_builddeb -p$(p_cxx) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-cxx.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-cxx.mk @@ -0,0 +1,52 @@ +arch_binaries := $(arch_binaries) cxx + +dirs_cxx = \ + $(docdir)/$(p_base)/C++ \ + $(PF)/bin \ + $(PF)/share/info \ + $(gcc_lexec_dir) \ + $(PF)/share/man/man1 +files_cxx = \ + $(PF)/bin/g++$(pkg_ver) \ + $(PF)/share/man/man1/g++$(pkg_ver).1 \ + $(gcc_lexec_dir)/cc1plus + +# ---------------------------------------------------------------------- +$(binary_stamp)-cxx: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_cxx) + dh_installdirs -p$(p_cxx) $(dirs_cxx) + DH_COMPAT=2 dh_movefiles -p$(p_cxx) $(files_cxx) +# g++ man page is a .so link + rm -f $(d_cxx)/$(PF)/share/man/man1/g++$(pkg_ver).1 + ln -sf gcc$(pkg_ver).1.gz \ + $(d_cxx)/$(PF)/share/man/man1/g++$(pkg_ver).1.gz + + ln -sf g++$(pkg_ver) \ + $(d_cxx)/$(PF)/bin/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver) + ln -sf g++$(pkg_ver).1.gz \ + $(d_cxx)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-g++$(pkg_ver).1.gz + ln -sf g++$(pkg_ver) \ + $(d_cxx)/$(PF)/bin/$(TARGET_ALIAS)-g++$(pkg_ver) + ln -sf g++$(pkg_ver).1.gz \ + $(d_cxx)/$(PF)/share/man/man1/$(TARGET_ALIAS)-g++$(pkg_ver).1.gz + + debian/dh_doclink -p$(p_cxx) $(p_base) + cp -p debian/README.C++ $(d_cxx)/$(docdir)/$(p_base)/C++/ + cp -p $(srcdir)/gcc/cp/ChangeLog \ + $(d_cxx)/$(docdir)/$(p_base)/C++/changelog + debian/dh_rmemptydirs -p$(p_cxx) + + dh_strip -p$(p_cxx) + dh_compress -p$(p_cxx) + dh_fixperms -p$(p_cxx) + dh_shlibdeps -p$(p_cxx) + dh_gencontrol -p$(p_cxx) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_cxx) + dh_md5sums -p$(p_cxx) + dh_builddeb -p$(p_cxx) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-pascal.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-pascal.mk @@ -0,0 +1,100 @@ +arch_binaries := $(arch_binaries) pascal +indep_binaries := $(indep_binaries) pascal-doc + +p_gpc = gpc$(gpc_pkg_ver) +p_gpcd = gpc$(gpc_pkg_ver)-doc + +d_gpc = debian/$(p_gpc) +d_gpcd = debian/$(p_gpcd) + +dirs_gpc = \ + $(docdir)/$(p_base)/pascal \ + $(PF)/bin \ + $(gcc_lexec_dir) \ + $(gcc_lib_dir)/{include,units} \ + $(PF)/share/man/man1 +ifeq ($(with_gpidump),yes) + files_gpc = \ + $(PF)/bin/{binobj,gpc,gpc-run,gpidump}$(gpc_pkg_ver) \ + $(PF)/share/man/man1/{binobj,gpc,gpc-run,gpidump}$(gpc_pkg_ver).1 \ + $(gcc_lexec_dir)/{gpcpp,gpc1} \ + $(gcc_lib_dir)/{libgpc.a,units} \ + $(gcc_lib_dir)/include/gpc-in-c.h +else + files_gpc = \ + $(PF)/bin/{binobj,gpc,gpc-run}$(gpc_pkg_ver) \ + $(PF)/share/man/man1/{binobj,gpc,gpc-run}$(gpc_pkg_ver).1 \ + $(gcc_lexec_dir)/{gpcpp,gpc1} \ + $(gcc_lib_dir)/{libgpc.a,units} \ + $(gcc_lib_dir)/include/gpc-in-c.h +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-pascal: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gpc) + dh_installdirs -p$(p_gpc) $(dirs_gpc) + + rm -f $(d)/$(PF)/bin/pc $(d)/$(PF)/share/man/man1/pc.1 + DH_COMPAT=2 dh_movefiles -p$(p_gpc) $(files_gpc) + + debian/dh_doclink -p$(p_gpc) $(p_base) + cp -p $(srcdir)/gcc/p/{AUTHORS,FAQ,NEWS,README} \ + $(d_gpc)/$(docdir)/$(p_base)/pascal/. + cp -p $(srcdir)/gcc/p/test/README \ + $(d_gpc)/$(docdir)/$(p_base)/pascal/README.gpc-test + cp -p $(srcdir)/gcc/p/ChangeLog \ + $(d_gpc)/$(docdir)/$(p_base)/pascal/changelog + +# ln -sf ../$(p_gpc)/examples $(d_gpcd)/$(docdir)/$(p_gpcd)/examples +# ln -sf ../$(p_gpc)/docdemos $(d_gpcd)/$(docdir)/$(p_gpcd)/docdemos + + dh_strip -p$(p_gpc) + dh_compress -p$(p_gpc) + dh_fixperms -p$(p_gpc) + dh_shlibdeps -p$(p_gpc) + dh_gencontrol -p$(p_gpc) -u-v$(DEB_GPC_VERSION) + dh_installdeb -p$(p_gpc) + dh_md5sums -p$(p_gpc) + dh_builddeb -p$(p_gpc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-pascal-doc: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gpcd) + dh_installdirs -p$(p_gpcd) \ + $(docdir)/$(p_base)/pascal \ + $(PF)/share/info + DH_COMPAT=2 dh_movefiles -p$(p_gpcd) \ + $(PF)/share/info/gpc*$(gpc_pkg_ver)*info* + debian/dh_doclink -p$(p_gpcd) $(p_base) + dh_installdocs -p$(p_gpcd) + rm -f $(d_gpcd)/$(docdir)/$(p_base)/copyright + cp -p html/gpc.html html/gpcs.html \ + $(d_gpcd)/$(docdir)/$(p_base)/pascal/ + mv $(d)/$(PF)/doc/gpc/demos \ + $(d_gpcd)/$(docdir)/$(p_base)/pascal/examples + mv $(d)/$(PF)/doc/gpc/docdemos \ + $(d_gpcd)/$(docdir)/$(p_base)/pascal/. + +# -$(MAKE) -C $(builddir)/gcc gpc.ps +# cp -p $(builddir)/gcc/gpc.ps $(d_gpcd)/$(docdir)/$(p_base)/pascal/. + + debian/dh_rmemptydirs -p$(p_gpcd) + + dh_compress -p$(p_gpcd) + dh_fixperms -p$(p_gpcd) + dh_installdeb -p$(p_gpcd) + dh_gencontrol -p$(p_gpcd) -u-v$(DEB_GPC_VERSION) + dh_md5sums -p$(p_gpcd) + dh_builddeb -p$(p_gpcd) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-proto.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-proto.mk @@ -0,0 +1,43 @@ +arch_binaries := $(arch_binaries) proto + +p_proto = protoize +d_proto = debian/$(p_proto) + +dirs_proto = \ + $(docdir) \ + $(PF)/share/man/man1 \ + $(PF)/bin +files_proto = \ + $(PF)/bin/{protoize,unprotoize} \ + $(PF)/share/man/man1/{protoize,unprotoize}.1 + +# ---------------------------------------------------------------------- +$(binary_stamp)-proto: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_proto) + dh_installdirs -p$(p_proto) $(dirs_proto) + +ifeq ($(versioned_packages),yes) + : # rename versioned files back to unversioned ones. + for i in protoize unprotoize; do \ + mv $(d)/$(PF)/bin/$$i$(pkg_ver) $(d)/$(PF)/bin/$$i; \ + done +endif + $(IR) debian/protoize.1 $(d)/$(PF)/share/man/man1/ + ln -sf protoize.1 $(d)/$(PF)/share/man/man1/unprotoize.1 + DH_COMPAT=2 dh_movefiles -p$(p_proto) $(files_proto) + + debian/dh_doclink -p$(p_proto) $(p_base) + dh_strip -p$(p_proto) + dh_compress -p$(p_proto) + dh_fixperms -p$(p_proto) + dh_shlibdeps -p$(p_proto) + dh_gencontrol -p$(p_proto) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_proto) + dh_md5sums -p$(p_proto) + dh_builddeb -p$(p_proto) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-ada.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-ada.mk @@ -0,0 +1,187 @@ +arch_binaries := $(arch_binaries) ada +ifneq ($(GFDL_INVARIANT_FREE),yes) + indep_binaries := $(indep_binaries) ada-doc +endif + +ifeq ($(with_libgnat),yes) + arch_binaries := $(arch_binaries) libgnat +endif + +p_gnat = gnat-$(GNAT_VERSION) +p_lgnat = libgnat-$(GNAT_VERSION) +p_gnatd = $(p_gnat)-doc + +d_gnat = debian/$(p_gnat) +d_lgnat = debian/$(p_lgnat) +d_gnatd = debian/$(p_gnatd) + +GNAT_TOOLS = gnat gnatbind gnatbl gnatchop gnatclean gnatfind gnatkr gnatlink \ + gnatls gnatmake gnatname gnatprep gnatxref gpr2make gprcmd + +dirs_gnat = \ + $(docdir)/$(p_base)/Ada \ + $(PF)/bin \ + $(PF)/share/man/man1 \ + $(gcc_lib_dir) \ + $(gcc_lexec_dir) \ + $(PF)/$(libdir)/gnat + +files_gnat = \ + $(PF)/share/gnat \ + $(gcc_lexec_dir)/gnat1 \ + $(gcc_lib_dir)/{adalib,adainclude} \ + $(foreach i,$(GNAT_TOOLS),$(PF)/bin/$(i)) + +# $(foreach i,$(GNAT_TOOLS),$(PF)/bin/$(i)-$(GNAT_VERSION)) + +dirs_lgnat = \ + $(docdir) \ + $(PF)/lib +files_lgnat = \ + $(PF)/$(libdir)/lib{gnat,gnarl}-$(GNAT_VERSION).so.1 + +update-ada-files: + cd $(builddir) && tar cfj ada-generated.tar.bz2 \ + gcc/ada/{sinfo.h,einfo.h,nmake.ads,nmake.adb,treeprs.ads} + uuencode $(builddir)/ada-generated.tar.bz2 ada-generated.tar.bz2 \ + > debian/patches/ada-generated.uue + +$(binary_stamp)-libgnat: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lgnat) + dh_installdirs -p$(p_lgnat) $(dirs_lgnat) + + for lib in lib{gnat,gnarl}; do \ + vlib=$$lib-$(GNAT_VERSION); \ + mv $(d)/$(gcc_lib_dir)/adalib/$$vlib.so.1 $(d)/$(PF)/$(libdir)/. ; \ + rm -f $(d)/$(gcc_lib_dir)/adalib/$$lib.so.1; \ + done + + DH_COMPAT=2 dh_movefiles -p$(p_lgnat) $(files_lgnat) + + debian/dh_doclink -p$(p_lgnat) $(p_base) + + debian/dh_rmemptydirs -p$(p_lgnat) + + dh_strip -p$(p_lgnat) + dh_compress -p$(p_lgnat) + dh_fixperms -p$(p_lgnat) + b=libgnat; \ + for ext in preinst postinst prerm postrm; do \ + for t in '' -dev -dbg; do \ + v=$(GNAT_VERSION); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + + dh_makeshlibs -p$(p_lgnat) -V '$(p_lgnat) (>= $(DEB_SOVERSION))' + cat debian/$(p_lgnat)/DEBIAN/shlibs >> debian/shlibs.local + + dh_shlibdeps -p$(p_lgnat) + dh_gencontrol -p$(p_lgnat) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_lgnat) + dh_md5sums -p$(p_lgnat) + dh_builddeb -p$(p_lgnat) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +ifeq ($(with_libgnat),yes) +$(binary_stamp)-ada: $(install_stamp) $(binary_stamp)-libgnat +else +$(binary_stamp)-ada: $(install_stamp) +endif + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gnat) + dh_installdirs -p$(p_gnat) $(dirs_gnat) + + DH_COMPAT=2 dh_movefiles -p$(p_gnat) $(files_gnat) + +ifeq ($(with_libgnat),yes) + for lib in lib{gnat,gnarl}; do \ + vlib=$$lib-$(GNAT_VERSION); \ + dh_link -p$(p_gnat) \ + /$(PF)/$(libdir)/$$vlib.so.1 /$(gcc_lib_dir)/adalib/$$vlib.so \ + /$(PF)/$(libdir)/$$vlib.so.1 /$(gcc_lib_dir)/adalib/$$lib.so; \ + done +endif + + debian/dh_doclink -p$(p_gnat) $(p_base) + + cp -p $(srcdir)/gcc/ada/ChangeLog \ + $(d_gnat)/$(docdir)/$(p_base)/Ada/changelog + + for i in $(GNAT_TOOLS); do \ + case "$$i" in \ + gnat) cp -p debian/gnat.1 $(d_gnat)/$(PF)/share/man/man1/ ;; \ + *) ln -sf gnat.1 $(d_gnat)/$(PF)/share/man/man1/$$i.1; \ + esac; \ + done + + ln -sf gcc$(pkg_ver) $(d_gnat)/$(PF)/bin/gnatgcc + ln -sf gcc$(pkg_ver).1.gz $(d_gnat)/$(PF)/share/man/man1/gnatgcc.1.gz + + debian/dh_rmemptydirs -p$(p_gnat) + + dh_strip -p$(p_gnat) + dh_compress -p$(p_gnat) + dh_fixperms -p$(p_gnat) +ifeq ($(with_libgnat),yes) + dh_shlibdeps -p$(p_gnat) -L $(p_lgnat) -l $(d_lgnat)/$(PF)/$(libdir) +else + dh_shlibdeps -p$(p_gnat) +endif + dh_gencontrol -p$(p_gnat) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_gnat) + dh_md5sums -p$(p_gnat) + dh_builddeb -p$(p_gnat) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + + +ada_info_dir = $(d_gnatd)/$(PF)/share/info + +$(binary_stamp)-ada-doc: $(build_html_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gnatd) + dh_installdirs -p$(p_gnatd) \ + $(docdir)/$(p_base)/Ada \ + $(PF)/share/info + + cd $(ada_info_dir) && \ + makeinfo -I $(srcdir)/gcc/doc/include -I $(srcdir)/gcc/ada \ + -o gnat_ugn_unw-$(GNAT_VERSION).info \ + $(builddir)/gcc/doc/gnat_ugn_unw.texi + cd $(ada_info_dir) && \ + makeinfo -I $(srcdir)/gcc/doc/include -I $(srcdir)/gcc/ada \ + -o gnat_rm-$(GNAT_VERSION).info \ + $(srcdir)/gcc/ada/gnat_rm.texi + cd $(ada_info_dir) && \ + makeinfo -I $(srcdir)/gcc/doc/include -I $(srcdir)/gcc/ada \ + -o gnat-style-$(GNAT_VERSION).info \ + $(srcdir)/gcc/ada/gnat-style.texi + + debian/dh_doclink -p$(p_gnatd) $(p_base) + dh_installdocs -p$(p_gnatd) + rm -f $(d_gnatd)/$(docdir)/$(p_base)/copyright + cp -p html/gnat_ugn_unw.html html/gnat_rm.html html/gnat-style.html \ + $(d_gnatd)/$(docdir)/$(p_base)/Ada/ + + dh_compress -p$(p_gnatd) + dh_fixperms -p$(p_gnatd) + dh_installdeb -p$(p_gnatd) + dh_gencontrol -p$(p_gnatd) -u-v$(DEB_VERSION) + dh_md5sums -p$(p_gnatd) + dh_builddeb -p$(p_gnatd) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-cross.mk @@ -0,0 +1,57 @@ +arch_binaries := $(arch_binaries) gcc-cross + +dirs_gcc = \ + $(docdir)/$(p_base)/gcc \ + $(PF)/bin \ + $(gcc_lib_dir)/include \ + $(PF)/share/man/man1 + +files_gcc = \ + $(PF)/bin/{$(GCC_TARGET)-linux-gcc,$(GCC_TARGET)-linux-cpp}$(pkg_ver) \ + $(PF)/share/man/man1/{$(GCC_TARGET)-linux-gcc}$(pkg_ver).1 \ + $(gcc_lib_dir) \ + + +files_gcc += \ + $(shell test -e $(d)/$(gcc_lib_dir)/SYSCALLS.c.X \ + && echo $(gcc_lib_dir)/SYSCALLS.c.X) + +usr_doc_files = debian/README.Bugs \ + $(shell test -f $(srcdir)/FAQ && echo $(srcdir)/FAQ) +ifeq ($(with_check),yes) + usr_doc_files += test-summary +endif +ifeq ($(DEB_HOST_ARCH),sparc) + usr_doc_files += debian/README.sparc +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-gcc-cross: $(install_stamp) + dh_testdir + dh_testroot + rm -rf $(d_gcc) + dh_installdirs -p$(p_gcc) $(dirs_gcc) + $(IS) debian/c89 $(d)/$(PF)/bin/ + $(IR) debian/c89.1 $(d)/$(PF)/share/man/man1/ + + rm -f $(d)/$(PF)/$(libdir)/libgcc_s.so + ln -sf /$(libdir)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s.so + + DH_COMPAT=2 dh_movefiles -p$(p_gcc) $(files_gcc) + +# dh_installdebconf + debian/dh_doclink -p$(p_gcc) $(p_base) + cp -p $(usr_doc_files) $(d_gcc)/$(docdir)/$(p_base)/. + cp -p debian/NEWS.gcc $(d_gcc)/$(docdir)/$(p_base)/NEWS + dh_undocumented -p$(p_gcc) gccbug$(pkg_ver).1 + debian/dh_rmemptydirs -p$(p_gcc) + dh_strip -p$(p_gcc) + dh_compress -p$(p_gcc) + dh_fixperms -p$(p_gcc) + dh_shlibdeps -p$(p_gcc) + dh_gencontrol -p$(p_gcc) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_gcc) + dh_md5sums -p$(p_gcc) + dh_builddeb -p$(p_gcc) + touch $@ + --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-fixincl.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-fixincl.mk @@ -0,0 +1,47 @@ +arch_binaries := $(arch_binaries) fixincl + +p_fix = fixincludes +d_fix = debian/$(p_fix) + +dirs_fix = \ + $(docdir)/$(p_base)/fixincludes \ + $(PF)/share/man/man1 \ + $(PF)/bin \ + $(gcc_lexec_dir) \ + $(gcc_lib_dir) +files_fix = \ + $(gcc_lexec_dir)/install-tools \ + $(gcc_lib_dir)/install-tools + +# ---------------------------------------------------------------------- +$(binary_stamp)-fixincl: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_fix) + dh_installdirs -p$(p_fix) $(dirs_fix) + DH_COMPAT=2 dh_movefiles -p$(p_fix) $(files_fix) + +# $(IP) $(builddir)/gcc/fixinc/fixincl $(d_fix)/$(PF)/lib/fixincludes/ +# sed -e "s,^FIXINCL=\(.*\),FIXINCL=/$(PF)/lib/fixincludes/fixincl," \ +# $(builddir)/gcc/fixinc.sh \ +# > $(d_fix)/$(PF)/lib/fixincludes/fixinc.sh +# chmod 755 $(d_fix)/$(PF)/lib/fixincludes/fixinc.sh + $(IR) $(srcdir)/gcc/fixinc/README \ + $(d_fix)/$(docdir)/$(p_base)/fixincludes + sed -e 's,@LIBEXECDIR@,$(gcc_lexec_dir),g' debian/fixincludes.in \ + > $(d_fix)/$(PF)/bin/fixincludes + chmod 755 $(d_fix)/$(PF)/bin/fixincludes + + debian/dh_doclink -p$(p_fix) $(p_base) + dh_strip -p$(p_fix) + dh_compress -p$(p_fix) + dh_fixperms -p$(p_fix) + dh_shlibdeps -p$(p_fix) + dh_gencontrol -p$(p_fix) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_fix) + dh_md5sums -p$(p_fix) + dh_builddeb -p$(p_fix) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-gcc-cross.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-gcc-cross.mk @@ -0,0 +1,85 @@ +arch_binaries := $(arch_binaries) gcc + +# gcc must be moved after g77 and g++ +# not all files $(PF)/include/*.h are part of gcc, +# but it becomes difficult to name all these files ... + +dirs_gcc = \ + $(docdir)/$(p_base)/gcc \ + $(PF)/bin \ + $(gcc_lib_dir)/include \ + $(PF)/share/man/man1 $(libdir) + +files_gcc = \ + $(PF)/bin/$(DEB_TARGET_GNU_TYPE)-gcc$(pkg_ver) \ + $(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-gcc$(pkg_ver).1 \ + $(gcc_lib_dir)/{collect2,specs,cc1,libgcc*,*.o} \ + $(gcc_lib_dir)/include/README \ + $(gcc_lib_dir)/include/{float,iso646,limits,std*,syslimits,varargs}.h \ + $(shell for d in asm bits gnu linux; do \ + test -e $(d)/$(gcc_lib_dir)/include/$$d \ + && echo $(gcc_lib_dir)/include/$$d; \ + done) + +files_gcc += \ + $(shell test -e $(d)/$(gcc_lib_dir)/SYSCALLS.c.X \ + && echo $(gcc_lib_dir)/SYSCALLS.c.X) + +ifeq ($(DEB_TARGET_GNU_CPU),ia64) + files_gcc += $(gcc_lib_dir)/include/ia64intrin.h +endif + +ifeq ($(DEB_TARGET_GNU_CPU),i386) + files_gcc += $(gcc_lib_dir)/include/{mmintrin.h,xmmintrin.h} +endif + +ifeq ($(DEB_TARGET_GNU_CPU),m68k) + files_gcc += $(gcc_lib_dir)/include/math-68881.h +endif + +ifeq ($(DEB_TARGET_GNU_CPU),powerpc) + files_gcc += $(gcc_lib_dir)/include/{altivec.h,ppc-asm.h} +endif + +usr_doc_files = debian/README.Bugs \ + $(shell test -f $(srcdir)/FAQ && echo $(srcdir)/FAQ) +ifeq ($(with_check),yes) + usr_doc_files += test-summary +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-gcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gcc) + dh_installdirs -p$(p_gcc) $(dirs_gcc) +# $(IS) debian/c89 $(d)/$(PF)/bin/ +# $(IR) debian/c89.1 $(d)/$(PF)/share/man/man1/ + + rm -f $(d)/$(PF)/$(libdir)/libgcc_s.so + ln -sf /usr/$(libdir)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s.so + + DH_COMPAT=2 dh_movefiles -p$(p_gcc) $(files_gcc) + +# dh_installdebconf + debian/dh_doclink -p$(p_gcc) $(p_base) + debian/dh_rmemptydirs -p$(p_gcc) + dh_strip -p$(p_gcc) -Xcrt -Xlibgcc + dh_compress -p$(p_gcc) + dh_fixperms -p$(p_gcc) + dh_shlibdeps -p$(p_gcc) + dh_gencontrol -p$(p_gcc) -u-v$(DEB_VERSION) + sed 's/cross-/$(TP)/g;s/-ver/$(pkg_ver)/g' < debian/gcc-cross.postinst > debian/$(p_gcc)/DEBIAN/postinst + sed 's/cross-/$(TP)/g;s/-ver/$(pkg_ver)/g' < debian/gcc-cross.prerm > debian/$(p_gcc)/DEBIAN/prerm + chmod 755 debian/$(p_gcc)/DEBIAN/{postinst,prerm} + dh_installdeb -p$(p_gcc) + dh_md5sums -p$(p_gcc) + dh_builddeb -p$(p_gcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + + @echo "Listing installed files not included in any package:" + -find $(d) ! -type d + --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libobjc.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libobjc.mk @@ -0,0 +1,67 @@ +ifeq ($(with_objcdev),yes) + arch_binaries := $(arch_binaries) libobjc +endif + +p_lobjc = libobjc$(OBJC_SONAME) +d_lobjc = debian/$(p_lobjc) + +dirs_lobjc = \ + $(docdir)/objc \ + $(PF)/$(libdir) +files_lobjc = \ + $(PF)/$(libdir)/libobjc.so.* +ifeq ($(with_objc_gc),yes) + files_lobjc += \ + $(PF)/$(libdir)/libobjc_gc.so.* +endif + +ifeq ($(with_lib64objc),yes) + dirs_lobjc += $(PF)/$(lib64) + files_lobjc += $(PF)/$(lib64)/libobjc.so.* + ifeq ($(with_objc_gc),yes) + files_lobjc += $(PF)/$(lib64)/libobjc_gc.so.* + endif +endif + + +$(binary_stamp)-libobjc: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lobjc) + dh_installdirs -p$(p_lobjc) $(dirs_lobjc) +# mv $(d)/$(gcc_lib_dir)/libobjc.so.* $(d)/$(PF)/$(libdir)/. +#ifeq ($(with_objc_gc),yes) +# mv $(d)/$(gcc_lib_dir)/libobjc_gc.so.* $(d)/$(PF)/$(libdir)/. +#endif + DH_COMPAT=2 dh_movefiles -p$(p_lobjc) $(files_lobjc) + + dh_installdocs -p$(p_lobjc) + echo "See /$(docdir)/$(p_base) for more information" \ + > $(d_lobjc)/$(docdir)/$(p_lobjc)/README.Debian + dh_installchangelogs -p$(p_lobjc) $(srcdir)/libobjc/ChangeLog + + debian/dh_rmemptydirs -p$(p_lobjc) + + dh_strip -p$(p_lobjc) + dh_compress -p$(p_lobjc) + + dh_fixperms -p$(p_lobjc) + b=libobjc; \ + for ext in preinst postinst prerm postrm; do \ + for t in '' -dev -dbg; do \ + v=$(OBJC_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + dh_makeshlibs -p$(p_lobjc) -V '$(p_lobjc) (>= $(DEB_SOEVERSION))' + dh_shlibdeps -p$(p_lobjc) + dh_gencontrol -p$(p_lobjc) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_lobjc) + dh_md5sums -p$(p_lobjc) + dh_builddeb -p$(p_lobjc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-nof.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-nof.mk @@ -0,0 +1,56 @@ +arch_binaries := $(arch_binaries) nof + +p_nof = gcc$(pkg_ver)-nof +d_nof = debian/$(p_nof) + +dirs_nof = \ + $(docdir) \ + $(PF)/$(libdir)/nof +ifeq ($(with_cdev),yes) + dirs_nof += \ + $(gcc_lib_dir)/nof +endif + +ifeq ($(with_cdev),yes) + files_nof = \ + $(libdir)/libgcc_s_nof.so.$(GCC_SONAME) \ + $(gcc_lib_dir)/libgcc_s_nof.so \ + $(PF)/$(libdir)/nof \ + $(gcc_lib_dir)/nof +else + files_nof = \ + $(libdir)/libgcc_s_nof.so.$(GCC_SONAME) +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-nof: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + mv $(d)/$(PF)/$(libdir)/libgcc_s_nof.so.$(GCC_SONAME) $(d)/$(libdir)/. + rm -f $(d)/$(PF)/$(libdir)/libgcc_s_nof.so + ln -sf /$(libdir)/libgcc_s_nof.so.$(GCC_SONAME) \ + $(d)/$(gcc_lib_dir)/libgcc_s_nof.so + + rm -rf $(d_nof) + dh_installdirs -p$(p_nof) $(dirs_nof) + DH_COMPAT=2 dh_movefiles -p$(p_nof) $(files_nof) + debian/dh_doclink -p$(p_nof) $(p_base) + dh_strip -p$(p_nof) + dh_compress -p$(p_nof) + dh_fixperms -p$(p_nof) + dh_shlibdeps -p$(p_nof) + + dh_makeshlibs -p$(p_nof) + : # Only keep the shlibs file for the libgcc_s_nof library + fgrep libgcc_s_nof debian/$(p_nof)/DEBIAN/shlibs \ + > debian/$(p_nof)/DEBIAN/shlibs.tmp + mv -f debian/$(p_nof)/DEBIAN/shlibs.tmp debian/$(p_nof)/DEBIAN/shlibs + + dh_gencontrol -p$(p_nof) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_nof) + dh_md5sums -p$(p_nof) + dh_builddeb -p$(p_nof) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-softfloat.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-softfloat.mk @@ -0,0 +1,33 @@ +arch_binaries := $(arch_binaries) softfloat + +p_softfloat = gcc$(pkg_ver)-soft-float +d_softfloat = debian/$(p_softfloat) + +dirs_softfloat = \ + $(PF)/$(libdir)/soft-float \ + $(gcc_lib_dir)/soft-float + +files_softfloat = \ + $(PF)/$(libdir)/soft-float \ + $(gcc_lib_dir)/soft-float + +# ---------------------------------------------------------------------- +$(binary_stamp)-softfloat: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_softfloat) + dh_installdirs -p$(p_softfloat) $(dirs_softfloat) + DH_COMPAT=2 dh_movefiles -p$(p_softfloat) $(files_softfloat) + debian/dh_doclink -p$(p_softfloat) $(p_base) + dh_strip -p$(p_softfloat) -Xlibgcj.a + dh_compress -p$(p_softfloat) + dh_fixperms -p$(p_softfloat) + dh_shlibdeps -p$(p_softfloat) + dh_gencontrol -p$(p_softfloat) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_softfloat) + dh_md5sums -p$(p_softfloat) + dh_builddeb -p$(p_softfloat) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libffi.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libffi.mk @@ -0,0 +1,71 @@ +arch_binaries := $(arch_binaries) libffi + +p_ffi = libffi$(FFI_SONAME) +p_ffid = libffi$(FFI_SONAME)-dev + +d_ffi = debian/$(p_ffi) +d_ffid = debian/$(p_ffid) + +dirs_ffi = \ + $(docdir)/$(p_ffi) \ + $(PF)/$(libdir) +files_ffi = \ + $(PF)/$(libdir)/libffi.so.* + +dirs_ffid = \ + $(docdir) \ + $(PF)/include \ + $(gcc_lib_dir)/include +files_ffid = \ + $(gcc_lib_dir)/include/libffi \ + $(PF)/include/{ffi.h,ffitarget.h} \ + $(PF)/$(libdir)/libffi.{a,so,la} + +ifeq ($(with_lib64ffi),yes) + dirs_ffi += $(PF)/$(lib64) + files_ffi += $(PF)/$(lib64)/libffi.so.* + dirs_ffid += $(PF)/$(lib64) + files_ffid += $(PF)/$(lib64)/libffi.{a,so,la} +endif + +$(binary_stamp)-libffi: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_ffi) $(d_ffid) + dh_installdirs -p$(p_ffi) $(dirs_ffi) + dh_installdirs -p$(p_ffid) $(dirs_ffid) + + mv $(d)/$(gcc_lib_dir)/include/libffi/ffitarget.h $(d)/$(PF)/include/. + + DH_COMPAT=2 dh_movefiles -p$(p_ffi) $(files_ffi) + DH_COMPAT=2 dh_movefiles -p$(p_ffid) $(files_ffid) + + dh_installdocs -p$(p_ffi) $(srcdir)/libffi/README + dh_installchangelogs -p$(p_ffi) $(srcdir)/libffi/ChangeLog + cp -p $(srcdir)/libffi/LICENSE $(d_ffi)/$(docdir)/$(p_ffi)/copyright + cp -p $(srcdir)/libffi/ChangeLog.libgcj \ + $(d_ffi)/$(docdir)/$(p_ffi)/changelog.libgcj + debian/dh_doclink -p$(p_ffid) $(p_ffi) + + debian/dh_rmemptydirs -p$(p_ffi) + debian/dh_rmemptydirs -p$(p_ffid) + + dh_strip -p$(p_ffi) -p$(p_ffid) + dh_compress -p$(p_ffi) -p$(p_ffid) + dh_fixperms -p$(p_ffi) -p$(p_ffid) + dh_makeshlibs -p$(p_ffi) -V '$(p_ffi) (>= $(DEB_FFI_SOVERSION))' + dh_shlibdeps -p$(p_ffi) -p$(p_ffid) + dh_gencontrol -p$(p_ffi) -p$(p_ffid) -u-v$(DEB_EVERSION) + b=libffi; v=$(FFI_SONAME); \ + for ext in preinst postinst prerm postrm; do \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done + dh_installdeb -p$(p_ffi) -p$(p_ffid) + dh_md5sums -p$(p_ffi) -p$(p_ffid) + dh_builddeb -p$(p_ffi) -p$(p_ffid) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-fortran.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-fortran.mk @@ -0,0 +1,196 @@ +ifeq ($(with_libg2c),yes) + arch_binaries := $(arch_binaries) libg2c +endif + +ifeq ($(with_fdev),yes) + arch_binaries := $(arch_binaries) fdev + ifneq ($(GFDL_INVARIANT_FREE),yes) + indep_binaries := $(indep_binaries) fortran-doc + endif + ifeq ($(with_common_libs),yes) + arch_binaries := $(arch_binaries) libg2c-dev + endif +endif + +p_g77 = g77$(pkg_ver) +p_g77d = g77$(pkg_ver)-doc +p_g2c = libg2c$(F77_SONAME) +p_g2cd = libg2c$(F77_SONAME)-dev + +d_g77 = debian/$(p_g77) +d_g77d = debian/$(p_g77d) +d_g2c = debian/$(p_g2c) +d_g2cd = debian/$(p_g2cd) + +dirs_g77 = \ + $(docdir)/$(p_base)/fortran \ + $(PF)/bin \ + $(gcc_lexec_dir) \ + $(gcc_lib_dir)/include \ + $(PF)/include \ + $(PF)/share/man/man1 +files_g77 = \ + $(PF)/bin/g77$(pkg_ver) \ + $(gcc_lexec_dir)/f771 \ + $(PF)/share/man/man1/g77$(pkg_ver).1 + +dirs_g2c = \ + $(docdir)/$(p_base)/fortran \ + $(PF)/$(libdir) \ + +files_g2c = \ + $(PF)/$(libdir)/libg2c.so.* + +dirs_g2cd = \ + $(docdir)/$(p_base)/fortran \ + $(PF)/$(libdir) \ + +files_g2cd = \ + $(PF)/$(libdir)/libg2c.{a,la,so} \ + $(PF)/$(libdir)/libfrtbegin.a \ + $(gcc_lib_dir)/include/g2c.h + +ifeq ($(with_lib64g2c),yes) + dirs_g2c += $(PF)/$(lib64) + files_g2c += $(PF)/$(lib64)/libg2c.so.* + + dirs_g2cd += $(PF)/$(lib64) + files_g2cd += $(PF)/$(lib64)/{libg2c.{a,la,so},libfrtbegin.a} +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-libg2c: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_g2c) + dh_installdirs -p$(p_g2c) $(dirs_g2c) + DH_COMPAT=2 dh_movefiles -p$(p_g2c) $(files_g2c) + debian/dh_doclink -p$(p_g2c) $(p_base) + cp -p debian/README.libf2c \ + $(d_g2c)/$(docdir)/$(p_base)/fortran/README.Debian + + dh_strip -p$(p_g2c) + dh_compress -p$(p_g2c) + dh_fixperms -p$(p_g2c) + dh_makeshlibs -p$(p_g2c) -V '$(p_g2c) (>= $(DEB_SOEVERSION))' + dh_shlibdeps -p$(p_g2c) + dh_gencontrol -p$(p_g2c) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_g2c) + dh_md5sums -p$(p_g2c) + dh_builddeb -p$(p_g2c) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-libg2c-dev: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_g2cd) + dh_installdirs -p$(p_g2cd) $(dirs_g2cd) + dh_movefiles -p$(p_g2cd) $(files_g2cd) + debian/dh_doclink -p$(p_g2cd) $(p_base) + + dh_strip -p$(p_g2cd) + dh_compress -p$(p_g2cd) + dh_fixperms -p$(p_g2cd) + dh_shlibdeps -p$(p_g2cd) + dh_gencontrol -p$(p_g2cd) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_g2cd) + dh_md5sums -p$(p_g2cd) + dh_builddeb -p$(p_g2cd) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-fdev: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + +# sed "s,^libdir=.*,libdir='/$(gcc_lib_dir)'," \ +# $(d)/$(PF)/$(libdir)/libg2c.la > $(d)/$(gcc_lib_dir)/libg2c.la +# rm -f $(d)/$(PF)/$(libdir)/libg2c.la +# mv $(d)/$(PF)/$(libdir)/libg2c.{a,so} $(d)/$(gcc_lib_dir)/ +# ln -sf ../../../libg2c.so.$(F77_SONAME) \ +# $(d)/$(gcc_lib_dir)/libg2c.so +# mv $(d)/$(PF)/$(libdir)/libfrtbegin.a $(d)/$(gcc_lib_dir)/ + +#ifeq ($(biarch),yes) +# ifeq ($(DEB_TARGET_GNU_CPU),i386) +# mv $(d)/$(PF)/$(lib64)/libg2c.{a,la,so} $(d)/$(gcc_lib_dir)/64 +# ln -sf ../../../../lib64/libg2c.so.$(F77_SONAME) \ +# $(d)/$(gcc_lib_dir)/64/libg2c.so +# mv $(d)/$(PF)/$(lib64)/libfrtbegin.a $(d)/$(gcc_lib_dir)/64 +# endif +#endif + rm -rf $(d_g77) + dh_installdirs -p$(p_g77) $(dirs_g77) + DH_COMPAT=2 dh_movefiles -p$(p_g77) $(files_g77) + +# dh_installdirs -p$(p_g2cd) $(dirs_g2cd) +# DH_COMPAT=2 dh_movefiles -p$(p_g2cd) $(files_g2cd) + + ln -sf g77$(pkg_ver) \ + $(d_g77)/$(PF)/bin/$(DEB_TARGET_GNU_TYPE)-g77$(pkg_ver) + ln -sf g77$(pkg_ver).1 \ + $(d_g77)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-g77$(pkg_ver).1 + ln -sf g77$(pkg_ver) \ + $(d_g77)/$(PF)/bin/$(TARGET_ALIAS)-g77$(pkg_ver) + ln -sf g77$(pkg_ver).1 \ + $(d_g77)/$(PF)/share/man/man1/$(TARGET_ALIAS)-g77$(pkg_ver).1 + + debian/dh_doclink -p$(p_g77) $(p_base) +# debian/dh_doclink -p$(p_g2cd) $(p_base) + +# #cp -p $(srcdir)/gcc/f/{NEWS,BUGS} \ +# # $(d_g77)/$(docdir)/$(p_base)/fortran/. + cp -p $(srcdir)/libf2c/README \ + $(d_g77)/$(docdir)/$(p_base)/fortran/README.libf2c + cp -p $(srcdir)/gcc/f/ChangeLog \ + $(d_g77)/$(docdir)/$(p_base)/fortran/changelog + debian/dh_rmemptydirs -p$(p_g77) +# debian/dh_rmemptydirs -p$(p_g2cd) + + dh_strip -p$(p_g77) + dh_compress -p$(p_g77) + dh_fixperms -p$(p_g77) + dh_shlibdeps -p$(p_g77) + dh_gencontrol -p$(p_g77) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_g77) + dh_md5sums -p$(p_g77) + dh_builddeb -p$(p_g77) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-fortran-doc: $(build_html_stamp) $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_g77d) + dh_installdirs -p$(p_g77d) \ + $(docdir)/$(p_base)/fortran \ + $(PF)/share/info + DH_COMPAT=2 dh_movefiles -p$(p_g77d) \ + $(PF)/share/info/g77* + + debian/dh_doclink -p$(p_g77d) $(p_base) +ifneq ($(GFDL_INVARIANT_FREE),yes) + dh_installdocs -p$(p_g77d) + rm -f $(d_g77d)/$(docdir)/$(p_base)/copyright + cp -p html/g77.html $(d_g77d)/$(docdir)/$(p_base)/fortran/ +endif + + dh_compress -p$(p_g77d) + dh_fixperms -p$(p_g77d) + dh_installdeb -p$(p_g77d) + dh_gencontrol -p$(p_g77d) -u-v$(DEB_VERSION) + dh_md5sums -p$(p_g77d) + dh_builddeb -p$(p_g77d) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-objc.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-objc.mk @@ -0,0 +1,51 @@ +arch_binaries := $(arch_binaries) objc + +p_objc = gobjc$(pkg_ver) +d_objc = debian/$(p_objc) + +dirs_objc = \ + $(docdir)/$(p_base)/ObjC \ + $(gcc_lexec_dir) \ + $(gcc_lib_dir)/include + +files_objc = \ + $(gcc_lexec_dir)/cc1obj \ + $(gcc_lib_dir)/include/objc \ + $(gcc_lib_dir)/{libobjc*.a,libobjc*.la} + +$(binary_stamp)-objc: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + mv $(d)/$(PF)/$(libdir)/libobjc*.{a,la} $(d)/$(gcc_lib_dir)/ + + rm -rf $(d_objc) + dh_installdirs -p$(p_objc) $(dirs_objc) + DH_COMPAT=2 dh_movefiles -p$(p_objc) $(files_objc) + + dh_link -p$(p_objc) \ + /$(PF)/$(libdir)/libobjc.so.$(OBJC_SONAME) /$(gcc_lib_dir)/libobjc.so +ifeq ($(with_objc_gc),yes) + dh_link -p$(p_objc) \ + /$(PF)/$(libdir)/libobjc_gc.so.$(OBJC_SONAME) \ + /$(gcc_lib_dir)/libobjc_gc.so +endif + + debian/dh_doclink -p$(p_objc) $(p_base) + cp -p $(srcdir)/libobjc/{README*,THREADS*} \ + $(d_objc)/$(docdir)/$(p_base)/ObjC/. + + debian/dh_rmemptydirs -p$(p_objc) + + dh_strip -p$(p_objc) + dh_compress -p$(p_objc) + + dh_fixperms -p$(p_objc) + dh_shlibdeps -p$(p_objc) + dh_gencontrol -p$(p_objc) -u-v$(DEB_VERSION) + dh_installdeb -p$(p_objc) + dh_md5sums -p$(p_objc) + dh_builddeb -p$(p_objc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-java.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-java.mk @@ -0,0 +1,301 @@ +ifeq ($(with_java),yes) + arch_binaries := $(arch_binaries) java + indep_binaries := $(indep_binaries) gcjjar +endif + +ifeq ($(with_common_libs),yes) + indep_binaries := $(indep_binaries) libgcj-common +endif + +ifeq ($(with_javadev),yes) + arch_binaries := $(arch_binaries) javadev +endif + +p_gcj = gcj$(pkg_ver) +p_gij = gij$(pkg_ver) +p_jcom = libgcj-common +p_jlib = libgcj$(GCJ_SONAME) +p_jlibc = libgcj$(GCJ_SONAME)-common +p_jlibx = libgcj$(GCJ_SONAME)-awt +p_jdev = libgcj$(GCJ_SONAME)-dev + +d_gcj = debian/$(p_gcj) +d_gij = debian/$(p_gij) +d_jcom = debian/$(p_jcom) +d_jlib = debian/$(p_jlib) +d_jlibc = debian/$(p_jlibc) +d_jlibx = debian/$(p_jlibx) +d_jdev = debian/$(p_jdev) + +dirs_gcj = \ + $(docdir)/$(p_base)/java \ + $(PF)/bin \ + $(PF)/share/man/man1 \ + $(PF)/share/info \ + $(gcc_lexec_dir) +files_gcj = \ + $(PF)/bin/{gcj,gcjh,jv-convert,jv-scan,jcf-dump,rmic}$(pkg_ver) \ + $(PF)/share/man/man1/{gcj,gcjh,jv-convert,jv-scan,jcf-dump,rmic}$(pkg_ver).1 \ + $(gcc_lexec_dir)/{jc1,jvgenmain} + +ifneq ($(GFDL_INVARIANT_FREE),yes) + files_gcj += \ + $(PF)/share/info/gcj* +endif + +dirs_gij = \ + $(docdir)/$(p_base)/java \ + $(PF)/bin \ + $(PF)/share/man/man1 + +files_gij = \ + $(PF)/bin/{gij,rmiregistry}$(pkg_ver) \ + $(PF)/share/man/man1/{gij,rmiregistry}$(pkg_ver).1 + +dirs_jcom = \ + $(PF)/$(libdir) + +files_jcom = \ + $(PF)/$(libdir)/security + +dirs_jlib = \ + $(docdir)/$(p_jlib) \ + $(PF)/$(libdir) + +files_jlib = \ + $(PF)/$(libdir)/libgcj*.so.* \ + $(PF)/$(libdir)/lib-org-*.so.* + +dirs_jlibc = \ + $(docdir)/$(p_jlib) \ + $(PF)/share/java + +files_jlibc = \ + $(PF)/share/java/libgcj-$(VER).jar + +dirs_jlibx = \ + $(docdir)/$(p_jlib) \ + $(PF)/$(libdir) \ + $(PF)/share/java + +files_jlibx = \ + $(PF)/lib/lib-gnu-java-awt*.so.* + +dirs_jdev = \ + $(docdir)/$(p_jlib)/examples \ + $(PF)/include \ + $(PF)/$(libdir) \ + $(gcc_lib_dir)/include/gcj + +files_jdev = \ + $(PF)/include/{gcj,java,javax,jni.h,jvmpi.h} \ + $(PF)/include/gnu/{awt,classpath,gcj,java,javax} \ + $(PF)/$(libdir)/libgcj*.{a,la} \ + $(PF)/$(libdir)/{libgcj*.so,libgcj.spec} \ + $(gcc_lib_dir)/include/gcj/libgcj-config.h \ + $(PF)/$(libdir)/pkgconfig/libgcj.pc \ + $(PF)/$(libdir)/lib-gnu-*.{a,la} \ + $(PF)/$(libdir)/lib-gnu-*.so \ + $(PF)/$(libdir)/lib-org-*.{a,la} \ + $(PF)/$(libdir)/lib-org-*.so + +ifeq ($(with_lib64gcj),yes) + dirs_jlib += $(PF)/$(lib64) + files_jlib += $(PF)/$(lib64)/libgcj*.so.* \ + $(PF)/$(lib64)/lib-org-*.so.* + + dirs_jlibx += $(PF)/$(lib64) + files_jlibx += $(PF)/$(lib64)/lib-gnu-java-awt-*.so.* + + dirs_jdev += $(PF)/$(lib64) + files_jdev += $(PF)/$(lib64)/libgcj*.{a,so,la} \ + $(PF)/$(lib64)/lib-gnu-*.{a,so,la} \ + $(PF)/$(lib64)/lib-org-*.{a,so,la} +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-libgcj-common: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + dh_installdirs -p$(p_jcom) $(dirs_jcom) + [ -d $(d)/$(PF)/$(libdir)/security ] \ + || mkdir -p $(d)/$(PF)/$(libdir)/security + [ -f $(d)/$(PF)/$(libdir)/security/classpath.security ] || \ + cp $(srcdir)/libjava/java/security/*.security \ + $(d)/$(PF)/$(libdir)/security/. + DH_COMPAT=2 dh_movefiles -p$(p_jcom) $(files_jcom) + debian/dh_doclink -p$(p_jcom) $(p_base) + debian/dh_rmemptydirs -p$(p_jcom) + dh_compress -p$(p_jcom) + dh_fixperms -p$(p_jcom) + dh_gencontrol -p$(p_jcom) -u-v$(DEB_EVERSION) + dh_installdeb -p$(p_jcom) + dh_md5sums -p$(p_jcom) + dh_builddeb -p$(p_jcom) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-gcjjar: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + dh_installdirs -p$(p_jlibc) $(dirs_jlibc) + DH_COMPAT=2 dh_movefiles -p$(p_jlibc) $(files_jlibc) + debian/dh_doclink -p$(p_jlibc) $(p_base) + debian/dh_rmemptydirs -p$(p_jlibc) + dh_compress -p$(p_jlibc) + dh_fixperms -p$(p_jlibc) + dh_gencontrol -p$(p_jlibc) -u-v$(DEB_VERSION) + cp -p debian/libgcj5-common.preinst.in debian/libgcj5-common.preinst + dh_installdeb -p$(p_jlibc) + dh_md5sums -p$(p_jlibc) + dh_builddeb -p$(p_jlibc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-java: $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + dh_installdirs -p$(p_gij) $(dirs_gij) + dh_installdirs -p$(p_jlib) $(dirs_jlib) + dh_installdirs -p$(p_jlibx) $(dirs_jlibx) + + DH_COMPAT=2 dh_movefiles -p$(p_gij) $(files_gij) + DH_COMPAT=2 dh_movefiles -p$(p_jlib) $(files_jlib) + DH_COMPAT=2 dh_movefiles -p$(p_jlibx) $(files_jlibx) + + debian/dh_doclink -p$(p_gij) $(p_base) + dh_installdocs -p$(p_jlib) $(srcdir)/libjava/{NEWS,README,THANKS} + dh_installchangelogs -p$(p_jlib) + debian/dh_doclink -p$(p_jlibx) $(p_jlib) + + cp -p debian/gij-wrapper $(d_gij)/$(PF)/bin/gij-wrapper$(pkg_ver) + chmod 755 $(d_gij)/$(PF)/bin/gij-wrapper$(pkg_ver) + cp -p debian/gij-wrapper.1 \ + $(d_gij)/$(PF)/share/man/man1/gij-wrapper$(pkg_ver).1 + + debian/dh_rmemptydirs -p$(p_gij) + debian/dh_rmemptydirs -p$(p_jlib) + debian/dh_rmemptydirs -p$(p_jlibx) + + dh_makeshlibs -p$(p_jlib) -V '$(p_jlib) (>= $(DEB_SOVERSION))' + cat debian/$(p_jlib)/DEBIAN/shlibs >> debian/shlibs.local + + dh_makeshlibs -p$(p_jlibx) -V '$(p_jlibx) (>= $(DEB_SOVERSION))' + + dh_strip -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + dh_compress -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + dh_fixperms -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) +# the libstdc++ binary packages aren't built yet ... + echo 'libstdc++ $(CXX_SONAME) $(p_lib) (>= $(DEB_STDCXX_SOVERSION))' \ + >> debian/shlibs.local + dh_shlibdeps \ + -L$(p_lgcc) \ + -L$(p_jlib) \ + -l:$(d)/$(PF)/$(libdir):$(d_lib)/$(PF)/$(libdir):$(d_jlib)/$(PF)/$(libdir):$(d_lgcc)/lib \ + -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + sed -e 's/$(p_jlib)[^,]*//' -e 's/, *,/,/' debian/$(p_jlib).substvars \ + >> debian/$(p_jlib).substvars.tmp \ + && mv -f debian/$(p_jlib).substvars.tmp debian/$(p_jlib).substvars + dh_gencontrol \ + -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) \ + -u-v$(DEB_VERSION) + b=libgcj; \ + for ext in preinst postinst prerm postrm; do \ + for t in '' -awt -dev; do \ + v=$(GCJ_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + dh_installdeb -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + dh_md5sums -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + dh_builddeb -p$(p_gij) -p$(p_jlib) -p$(p_jlibx) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-javadev: $(build_html_stamp) $(install_stamp) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_gcj) + dh_installdirs -p$(p_gcj) $(dirs_gcj) + dh_installdirs -p$(p_jdev) $(dirs_jdev) + + DH_COMPAT=2 dh_movefiles -p$(p_gcj) $(files_gcj) + DH_COMPAT=2 dh_movefiles -p$(p_jdev) $(files_jdev) + + ln -sf gcj$(pkg_ver) \ + $(d_gcj)/$(PF)/bin/$(DEB_TARGET_GNU_TYPE)-gcj$(pkg_ver) + ln -sf gcj$(pkg_ver).1 \ + $(d_gcj)/$(PF)/share/man/man1/$(DEB_TARGET_GNU_TYPE)-gcj$(pkg_ver).1 + ln -sf gcj$(pkg_ver) \ + $(d_gcj)/$(PF)/bin/$(TARGET_ALIAS)-gcj$(pkg_ver) + ln -sf gcj$(pkg_ver).1 \ + $(d_gcj)/$(PF)/share/man/man1/$(TARGET_ALIAS)-gcj$(pkg_ver).1 + + debian/dh_doclink -p$(p_gcj) $(p_base) +ifneq ($(GFDL_INVARIANT_FREE),yes) + dh_installdocs -p$(p_gcj) + rm -f $(d_gcj)/$(docdir)/$(p_base)/copyright + cp -p html/gcj.html $(d_gcj)/$(docdir)/$(p_base)/java/ +endif + cp -p $(srcdir)/libjava/doc/cni.sgml $(d_jdev)/$(docdir)/$(p_jlib)/. + debian/dh_doclink -p$(p_jdev) $(p_jlib) + cp -p debian/FAQ.gcj $(d_gcj)/$(docdir)/$(p_base)/java/. + cp -p $(srcdir)/gcc/java/ChangeLog \ + $(d_gcj)/$(docdir)/$(p_base)/java/changelog + cp -p $(srcdir)/libjava/ChangeLog \ + $(d_jdev)/$(docdir)/$(p_jlib)/changelog + + cp -p $(srcdir)/libjava/gnu/java/awt/peer/gtk/Test* \ + debian/testswing.java \ + $(d_jdev)/$(docdir)/$(p_jlib)/examples + + cp -p debian/gcj-wrapper $(d_gcj)/$(PF)/bin/gcj-wrapper$(pkg_ver) + chmod 755 $(d_gcj)/$(PF)/bin/gcj-wrapper$(pkg_ver) + cp -p debian/gcj-wrapper.1 \ + $(d_gcj)/$(PF)/share/man/man1/gcj-wrapper$(pkg_ver).1 + + cp -p debian/gcjh-wrapper $(d_gcj)/$(PF)/bin/gcjh-wrapper$(pkg_ver) + chmod 755 $(d_gcj)/$(PF)/bin/gcjh-wrapper$(pkg_ver) + cp -p debian/gcjh-wrapper.1 \ + $(d_gcj)/$(PF)/share/man/man1/gcjh-wrapper$(pkg_ver).1 + + debian/dh_rmemptydirs -p$(p_gcj) + debian/dh_rmemptydirs -p$(p_jdev) + + dh_strip -p$(p_gcj) -p$(p_jdev) + dh_compress -p$(p_gcj) -p$(p_jdev) -X.java + dh_fixperms -p$(p_gcj) -p$(p_jdev) + dh_shlibdeps \ + -L$(p_lgcc) \ + -l:$(d)/$(PF)/$(libdir):$(d_lib)/$(PF)/$(libdir):$(d_jlib)/$(PF)/$(libdir):$(d_lgcc)/lib \ + -p$(p_gcj) -p$(p_jdev) + dh_gencontrol \ + -p$(p_gcj) -p$(p_jdev) \ + -u-v$(DEB_VERSION) + b=libgcj; \ + for ext in preinst postinst prerm postrm; do \ + for t in '' -dev; do \ + v=$(GCJ_SONAME); \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done; \ + done + dh_installdeb -p$(p_gcj) -p$(p_jdev) + dh_md5sums -p$(p_gcj) -p$(p_jdev) + dh_builddeb -p$(p_gcj) -p$(p_jdev) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/rules.d/binary-libgcc.mk +++ gcc-3.4-3.4.2/debian/rules.d/binary-libgcc.mk @@ -0,0 +1,157 @@ +arch_binaries := $(arch_binaries) libgcc +ifeq ($(with_lib64gcc),yes) + arch_binaries := $(arch_binaries) lib64gcc +endif +ifeq ($(biarch_ia32),yes) + arch_binaries := $(arch_binaries) lib32gcc +endif + +p_lgcc = libgcc$(GCC_SONAME) +d_lgcc = debian/$(p_lgcc) + +p_l32gcc = lib32gcc$(GCC_SONAME) +d_l32gcc = debian/$(p_l32gcc) + +p_l64gcc = lib64gcc$(GCC_SONAME) +d_l64gcc = debian/$(p_l64gcc) + +ifeq ($(with_shared_libgcc),yes) +files_lgcc = \ + $(libdir)/libgcc_s.so.$(GCC_SONAME) +files_l64gcc = \ + lib64/libgcc_s.so.$(GCC_SONAME) +endif + +# ---------------------------------------------------------------------- +$(binary_stamp)-libgcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_lgcc) + dh_installdirs -p$(p_lgcc) \ + $(docdir)/$(p_lgcc) \ + $(libdir) + +ifeq ($(with_shared_libgcc),yes) + mv $(d)/$(PF)/lib/libgcc_s.so.$(GCC_SONAME) $(d)/$(libdir)/. + DH_COMPAT=2 dh_movefiles -p$(p_lgcc) $(files_lgcc) +endif + + dh_installdocs -p$(p_lgcc) + dh_installchangelogs -p$(p_lgcc) + + debian/dh_rmemptydirs -p$(p_lgcc) + dh_strip -p$(p_lgcc) + dh_compress -p$(p_lgcc) + dh_fixperms -p$(p_lgcc) +ifeq ($(with_shared_libgcc),yes) + dh_makeshlibs -p$(p_lgcc) -V '$(p_lgcc) (>= $(DEB_LIBGCC_SOVERSION))' + cat debian/$(p_lgcc)/DEBIAN/shlibs >> debian/shlibs.local +endif + dh_shlibdeps -p$(p_lgcc) + dh_gencontrol -p$(p_lgcc) -u-v$(DEB_LIBGCC_VERSION) + b=libgcc; v=$(GCC_SONAME); \ + for ext in preinst postinst prerm postrm; do \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done + dh_installdeb -p$(p_lgcc) + dh_md5sums -p$(p_lgcc) + dh_builddeb -p$(p_lgcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- +$(binary_stamp)-lib64gcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_l64gcc) + dh_installdirs -p$(p_l64gcc) \ + $(docdir)/$(p_l64gcc) \ + lib64 + +ifeq ($(with_shared_libgcc),yes) + install -d $(d)/lib64 + mv $(d)/$(PF)/lib64/libgcc_s.so.$(GCC_SONAME) $(d)/lib64/. +endif + DH_COMPAT=2 dh_movefiles -p$(p_l64gcc) $(files_l64gcc) + + dh_installdocs -p$(p_l64gcc) + dh_installchangelogs -p$(p_l64gcc) + + debian/dh_rmemptydirs -p$(p_l64gcc) + dh_strip -p$(p_l64gcc) + dh_compress -p$(p_l64gcc) + dh_fixperms -p$(p_l64gcc) +ifeq ($(with_shared_libgcc),yes) + dh_makeshlibs -p$(p_l64gcc) \ + -V '$(p_l64gcc) (>= $(DEB_LIBGCC_SOVERSION))' +# this does not work ... shlibs.local doesn't distinguish 32/64 bit libs +# cat debian/$(p_l64gcc)/DEBIAN/shlibs >> debian/shlibs.local +endif +ifeq ($(DEB_TARGET_GNU_CPU),s390) +# dh_shlibdeps -p$(p_l64gcc) +#/usr/bin/ldd: line 1: /lib/ld64.so.1: cannot execute binary file +#dpkg-shlibdeps: failure: ldd on `debian/lib64gcc1/lib64/libgcc_s.so.1' gave error exit status 1 + echo 'shlibs:Depends=libc6-s390x (>= 2.3.1-1)' \ + > debian/$(p_l64gcc).substvars +else +ifeq ($(DEB_TARGET_GNU_CPU),i386) + echo 'shlibs:Depends=amd64-libs (>= 0.1)' \ + > debian/$(p_l64gcc).substvars +else + dh_shlibdeps -p$(p_l64gcc) +endif +endif + dh_gencontrol -p$(p_l64gcc) -u-v$(DEB_LIBGCC_VERSION) + b=lib64gcc; v=$(GCC_SONAME); \ + for ext in preinst postinst prerm postrm; do \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done + dh_installdeb -p$(p_l64gcc) + dh_md5sums -p$(p_l64gcc) + dh_builddeb -p$(p_l64gcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) + +# ---------------------------------------------------------------------- + +$(binary_stamp)-lib32gcc: $(install_dependencies) + dh_testdir + dh_testroot + mv $(install_stamp) $(install_stamp)-tmp + + rm -rf $(d_l32gcc) + dh_installdirs -p$(p_l32gcc) \ + $(docdir)/$(p_l32gcc) \ + emul/ia32-linux/usr/lib + + install -d $(d)/lib64 + mv $(d)/$(PF)/lib32/libgcc_s.so.$(GCC_SONAME) \ + $(d_l32gcc)/emul/ia32-linux/usr/lib/. + + dh_installdocs -p$(p_l32gcc) + dh_installchangelogs -p$(p_l32gcc) + + debian/dh_rmemptydirs -p$(p_l32gcc) + dh_strip -p$(p_l32gcc) + dh_compress -p$(p_l32gcc) + dh_fixperms -p$(p_l32gcc) + dh_gencontrol -p$(p_l32gcc) -u-v$(DEB_VERSION) + b=lib32gcc; v=$(GCC_SONAME); \ + for ext in preinst postinst prerm postrm; do \ + if [ -f debian/$$b$$t.$$ext ]; then \ + cp -pf debian/$$b$$t.$$ext debian/$$b$$v$$t.$$ext; \ + fi; \ + done + dh_installdeb -p$(p_l32gcc) + dh_md5sums -p$(p_l32gcc) + dh_builddeb -p$(p_l32gcc) + + trap '' 1 2 3 15; touch $@; mv $(install_stamp)-tmp $(install_stamp) --- gcc-3.4-3.4.2.orig/debian/fastjar.prerm +++ gcc-3.4-3.4.2/debian/fastjar.prerm @@ -0,0 +1,16 @@ +#! /bin/sh -e + +if [ -f /usr/share/info/fastjar.info.gz ]; then + install-info --quiet --remove fastjar +else + # GFDL invariant free + true +fi + +if [ "$1" != "upgrade" ]; then + update-alternatives --remove jar /usr/bin/fastjar >/dev/null 2>&1 || true +fi + +#DEBHELPER# + +exit 0 --- gcc-3.4-3.4.2.orig/debian/NEWS.html +++ gcc-3.4-3.4.2/debian/NEWS.html @@ -0,0 +1,1635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GCC 3.4 Release Series — Changes, New Features, and Fixes +- GNU Project - Free Software Foundation (FSF) + + + + + + + + + +

+GCC 3.4 Release Series
Changes, New Features, and Fixes +

+ +

GCC 3.4 has many improvements in the C++ +frontend. Before reporting a bug, please make sure it's really GCC, +and not your code, that is broken.

+ +

Caveats

+ +
    +
  • GNU Make is now required to build GCC.
  • +
  • With -nostdinc the preprocessor used to ignore + both standard include paths and include paths + contained in environment variables. It was neither documented + nor intended that environment variable paths be ignored, so + this has been corrected.
  • +
  • GCC no longer accepts the options -fvolatile, + -fvolatile-global and -fvolatile-static. + It is unlikely that they worked correctly in any 3.x release.
  • +
  • GCC no longer ships <varargs.h>. Use + <stdarg.h> instead.
  • +
  • Support for all the systems obsoleted in + GCC 3.3 has been removed from GCC 3.4. See below for a + list of systems which are obsoleted + in this release.
  • +
  • GCC now requires an ISO C90 (ANSI C89) C compiler to build. + K&R C compilers will not work.
  • +
  • The implementation of the MIPS ABIs has + changed. As a result, the code generated for certain MIPS + targets will not be binary compatible with earlier releases.
  • +
  • In previous releases, the MIPS port had a fake "hilo" register + with the user-visible name accum. This register + has been removed.
  • +
  • The implementation of the SPARC ABIs has + changed. As a result, the code generated will not be binary + compatible with earlier releases in certain cases.
  • +
  • The configure option --enable-threads=pthreads has + been removed; use --enable-threads=posix instead, + which should have the same effect.
  • +
  • Code size estimates used by inlining heuristics for C, Objective-C, C++ + and Java have been redesigned significantly. As a result the parameters + of -finline-insns, + --param max-inline-insns-single + and --param max-inline-insns-auto need to be + reconsidered.
  • +
  • --param max-inline-slope + and --param min-inline-insns + have been removed; they are not needed for the new bottom-up inlining + heuristics.
  • +
  • The new unit-at-a-time compilation scheme has several compatibility + issues: +
      +
    • The order in which functions, variables, and top-level + asm statements are emitted may have changed. Code + relying on some particular ordering needs to be updated. The + majority of such top-level asm statements can be replaced by section + attributes.
    • +
    • Unreferenced static variables and functions are removed. + This may result in undefined references when an asm + statement refers to the variable/function directly. In that + case either the variable/function shall be listed in asm statement + operand or in the case of top-level asm statements the attribute + used shall be used to force function/variable to be + always output and considered as a possibly used by unknown code. + +

      For variables the attribute is accepted only by GCC 3.4 and newer, + while for earlier versions it is sufficient to use + unused to silence warnings about the variables not being + referenced. + To keep code portable across different GCC versions, you can use + appropriate preprocessor conditionals.

    • +
    • Static functions now can use non-standard passing conventions that may + break asm statements calling functions directly. Again + the attribute used shall be used to prevent this + behavior.
    • +
    + As a temporary workaround, -fno-unit-at-a-time can be used, + but this scheme may not be supported by future releases of GCC. +
  • +
  • GCC 3.4 automatically places zero-initialized variables in + the .bss section on some operating systems. + Versions of GNU Emacs up to (and including) 21.3 will not work + correctly when using this optimization; you can use + -fno-zero-initialized-in-bss to disable it.
  • +
+ +

General Optimizer Improvements

+ +
    +
  • Usability of the profile feedback and coverage testing has been improved. +
      +
    • Performance of profiled programs has been improved by faster profile + merging code.
    • +
    • Better use of the profile feedback for optimization (loop unrolling + and loop peeling).
    • +
    • File locking support allowing fork() calls and parallel + runs of profiled programs.
    • +
    • Coverage file format has been redesigned.
    • +
    • gcov coverage tool has been improved.
    • +
    • make profiledbootstrap available to build a faster + compiler. + +

      Experiments made on i386 hardware showed an 11% speedup on + -O0 and a 7.5% speedup on -O2 compilation of a + large C++ + testcase.

    • +
    • New value profiling pass enabled via + -fprofile-values
    • +
    • New value profile transformations pass enabled via -fvpt + aims to optimize some code sequences by exploiting knowledge about + value ranges or other properties of the operands. At the moment a + conversion of expensive divisions into cheaper operations has been + implemented.
    • +
    • New -fprofile-generate and -fprofile-use + command line options to simplify the use of profile feedback.
    • +
    +
  • +
  • A new unit-at-a-time compilation scheme for C, Objective-C, C++ and + Java which is enabled via -funit-at-a-time (and implied by + -O2). In this scheme a whole file is parsed first and + optimized later. The following basic inter-procedural optimizations + are implemented: +
      +
    • Removal of unreachable functions and variables
    • +
    • Discovery of local functions (functions with static linkage whose + address is never taken)
    • +
    • On i386, these local functions use register parameter passing + conventions.
    • +
    • Reordering of functions in topological order of the call graph to + enable better propagation of optimizing hints (such as the stack + alignments needed by functions) in the back end.
    • +
    • Call graph based out-of-order inlining heuristics which allows to + limit overall compilation unit growth (--param + inline-unit-growth).
    • +
    + Overall, the unit-at-a-time scheme produces a 1.3% improvement for the + SPECint2000 benchmark on the i386 architecture (AMD Athlon CPU). +
  • +
  • More realistic code size estimates used by inlining for C, Objective-C, + C++ and Java. The growth of large functions can now be limited via + --param large-function-insns + and --param large-function-growth.
  • +
  • A new cfg-level loop optimizer pass replaces the old loop unrolling + pass and adds two other loop transformations -- loop peeling and loop + unswitching -- and also uses the profile feedback to limit code growth. + (The three optimizations are enabled by -funroll-loops, + -fpeel-loops and -funswitch-loops flags, + respectively). + +

    The old loop unroller still can be enabled by + -fold-unroll-loops and may produce better code in some + cases, especially when the webizer optimization pass is not + run.

  • +
  • A new web construction pass enabled via -fweb (and implied + by -O3) improves the quality of register allocation, CSE, + first scheduling pass and some other optimization passes by avoiding + re-use of pseudo registers with non-overlapping live ranges. The pass + almost always improves code quality but does make debugging difficult + and thus is not enabled by default by -O2 +

    The pass is especially effective as cleanup after code duplication + passes, such as the loop unroller or the tracer.

  • +
  • Experimental implementations of superblock or trace scheduling in the + second scheduling pass can be enabled via + -fsched2-use-superblocks and + -fsched2-use-traces, respectively.
  • +
+ + +

New Languages and Language specific improvements

+ +

Ada

+
    +
  • The Ada front end has been updated to include numerous + bug fixes and enhancements. These include: +
      +
    • Improved project file support
    • +
    • Additional set of warnings about potential wrong code
    • +
    • Improved error messages
    • +
    • Improved code generation
    • +
    • Improved cross reference information
    • +
    • Improved inlining
    • +
    • Better run-time check elimination
    • +
    • Better error recovery
    • +
    • More efficient implementation of unbounded strings
    • +
    • Added features in GNAT.Sockets, + GNAT.OS_Lib, GNAT.Debug_Pools, ...
    • +
    • New GNAT.xxxx packages (e.g. GNAT.Strings, + GNAT.Exception_Action)
    • +
    • New pragmas
    • +
    • New -gnatS switch replacing gnatpsta
    • +
    • Implementation of new Ada features (in particular limited with, + limited aggregates)
    • +
    +
  • +
+ +

C/Objective-C/C++

+ +
    + +
  • Precompiled headers are now supported. Precompiled headers + can dramatically speed up compilation of some projects. There + are some known defects in the current precompiled header + implementation that will result in compiler crashes in + relatively rare situations. Therefore, precompiled headers + should be considered a "technology preview" in this + release. Read the manual for details about how to use + precompiled headers.
  • +
  • File handling in the preprocessor has been rewritten. GCC no + longer gets confused by symlinks and hardlinks, and now has + a correct implementation of #import and + #pragma once. + These two directives have therefore been un-deprecated.
  • +
  • The undocumented extension that allowed C programs to have a + label at the end of a compound statement, which has been + deprecated since GCC 3.0, has been removed.
  • +
  • The cast-as-lvalue extension has been removed for C++ and + deprecated for C and Objective-C. In particular, + code like this: +
    +        int i;
    +        (char) i = 5;
    +        
    +

    or this:

    +
    +        char *p;
    +        ((int *) p)++;
    +        
    +

    is no longer accepted for C++ and will not be accepted for + C and Objective-C in a future version.

  • +
  • The conditional-expression-as-lvalue extension has been + deprecated for C and Objective-C. In particular, code like + this: +
    +        int a, b, c;
    +        (a ? b : c) = 2;
    +        
    +

    will not be accepted for C and Objective-C in a future + version.

  • +
  • The compound-expression-as-lvalue extension has been + deprecated for C and Objective-C. In particular, code like + this: +
    +        int a, b;
    +        (a, b) = 2;
    +        
    +

    will not be accepted for C and Objective-C in a future + version. A possible non-intrusive workaround is the following:

    +
    +        (*(a, &b)) = 2;
    +        
  • +
  • Several + + built-in functions such as __builtin_popcount + for counting bits, finding the highest and lowest bit in a + word, and parity have been added.
  • +
  • The -fwritable-strings option has been deprecated + and will be removed.
  • +
  • Many C math library functions are now recognized as built-ins and + optimized.
  • +
  • The C, C++, and Objective-C compilers can now handle source files + written in any character encoding supported by the host C library. + The default input character set is taken from the current locale, + and may be overridden with the -finput-charset command + line option. In the future we will add support for inline encoding + markers.
  • +
+ +

C++

+ +
    +
  • G++ is now much closer to full conformance to + the ISO/ANSI C++ standard. This means, among other things, that a lot + of invalid constructs which used to be accepted in previous versions + will now be rejected. It is very likely that existing C++ code will + need to be fixed. This document lists some of the most common + issues.
  • + +
  • A hand-written recursive-descent C++ parser has replaced the + YACC-derived C++ parser from previous GCC releases. The new + parser contains much improved infrastructure needed for better + parsing of C++ source codes, handling of extensions, and clean + separation (where possible) between proper semantics analysis + and parsing. The new parser fixes many bugs that were found + in the old parser.
  • + +
  • You must now use the typename and + template keywords to disambiguate dependent names, + as required by the C++ standard. + +
    +	struct K {
    +	  typedef int mytype_t;
    +	};
    +	
    +	template <class T1> struct A {
    +	  template <class T2> struct B { 
    +	      void callme(void);
    +	    };
    +
    +	  template <int N> void bar(void) 
    +	  {
    +	    // Use 'typename' to tell the parser that T1::mytype_t names
    +	    //  a type. This is needed because the name is dependent (in
    +	    //  this case, on template parameter T1).
    +	    typename T1::mytype_t x;
    +	    x = 0;
    +	  }
    +	};
    +
    +	template <class T> void template_func(void)
    +	{
    +	  // Use 'template' to prefix member templates within 
    +	  //  dependent types (a has type A<T>, which depends on
    +	  //  the template parameter T).
    +	  A<T> a;
    +	  a.template bar<0>();
    +
    +	  // Use 'template' to tell the parser that B is a nested 
    +	  //  template class (dependent on template parameter T), and 
    +	  //  'typename' because the whole A<T>::B<int> is 
    +	  //  the name of a type (again, dependent).
    +	  typename A<T>::template B<int> b;
    +	  b.callme();
    +	}
    +	
    +	void non_template_func(void)
    +	{
    +	  // Outside of any template class or function, no names can be
    +	  //  dependent, so the use of the keyword 'typename' and 'template'
    +	  //  is not needed (and actually forbidden).
    +	  A<K> a;
    +	  a.bar<0>();
    +	  A<K>::B<float> b;
    +	  b.callme();
    +	}
  • + +
  • In a template definition, unqualified names will no longer + find members of a dependent base. For example, +
    +        template <typename T> struct B {
    +	  int m;
    +	  int n;
    +	  int f ();
    +	  int g ();
    +	};
    +	int n;
    +	int g ();
    +	template <typename T> struct C : B<T> {
    +	  void g ()
    +	  {
    +	    m = 0; // error
    +	    f ();  // error
    +	    n = 0; // ::n is modified
    +	    g ();  // ::g is called
    +	  }
    +	};
    +

    You must make the names dependent by prefixing them with + this->. Here is the corrected definition of + C<T>::g,

    +
    +	template <typename T> void C<T>::g ()
    +	{
    +	  this->m = 0;
    +	  this->f ();
    +	  this->n = 0
    +	  this->g ();
    +	}
  • + +
  • In templates, all non-dependent names are now looked up and bound + at definition time (while parsing the code), instead of later when + the template is instantiated. For instance: + +
    +	void foo(int);
    +
    +	template <int> struct A {
    +	  static void bar(void){
    +	    foo('a');
    +	  }
    +	};
    +
    +	void foo(char);
    +
    +	int main()
    +	{
    +	  A<0>::bar();    // Calls foo(int), used to call foo(char).
    +	}
    +	
  • + +
  • In an explicit instantiation of a class template, you must use + class or struct before the template-id: + +
    +	template <int N>
    +	class A {};
    +	
    +	template A<0>;         // error, not accepted anymore
    +	template class A<0>;   // OK
  • + +
  • The "named return value" and "implicit typename" + extensions have been removed.
  • + +
  • Default arguments in function types have been deprecated and + will be removed.
  • + +
  • ARM-style name-injection of friend declarations has been + deprecated and will be removed. For example: + + struct S { + friend void f(); + }; + + void g() { f(); } + + will not be accepted by future versions of G++; instead a + declaration of "f" will need to be present outside of the + scope of "S".
  • + +
  • Covariant returns are implemented for all but varadic + functions that require an adjustment.
  • + +
  • When -pedantic is used, G++ now issues errors about spurious + semicolons. For example, +
    +        namespace N {}; // Invalid semicolon.
    +        void f() {}; // Invalid semicolon.
  • + +
  • G++ no longer accepts attributes for a declarator after the + initializer associated with that declarator. For example, +
    +        X x(1) __attribute__((...));
    + is no longer accepted. Instead, use: +
    +        X x __attribute__((...)) (1);
  • + +
  • Inside the scope of a template class, the name of the class + itself can be treated as either a class or a template. So + GCC used to accept the class name as argument of type template, + and template template parameter. However this is not C++ standard + compliant. Now the name is not treated as a valid template template + argument unless you qualify the name by its scope. For example, + the code below no longer compiles. +
    +        template <template <class> class TT> class X {};
    +        template <class T> class Y {
    +          X<Y> x; // Invalid, Y is always a type template parameter.
    +        };
    +

    The valid code for the above example is

    +
    +          X< ::Y> x; // Valid.
    +

    (Notice the space between < and : to + prevent GCC to interpret this as a digraph for + [.)

  • + +
  • Friend declarations that refer to template specializations are + rejected if the template has not already been declared. For example, +
    +	template <typename T>
    +	class C {
    +	  friend void f<> (C&);
    +	};
    +

    is rejected. You must first declare f as a + template,

    +
    +	template <typename T>
    +	void f(T);
  • + +
  • In case of friend declarations, every name used in the friend + declaration must be accessible at the point of that declaration. + Previous versions of G++ used to be less strict about this and + allowed friend declarations for private class members, + for example. See the ISO C++ Standard Committee's defect + report #209 for details.
  • + +
  • Declaration of member functions of class templates as friends are + supported. For example, +
    +	template <typename T> struct A {
    +	  void f();
    +	};
    +	class C {
    +	  template <typename T> friend void A<T>::f();
    +	};
  • + +
  • You must use template <> to introduce template + specializations, as required by the standard. For example, +
    +	template <typename T>
    +	struct S;
    +
    +	struct S<int> { };
    +

    is rejected. You must write,

    +
    +	template <> struct S<int> {};
  • + +
  • G++ used to accept code like this, +
    +	struct S {
    +	  int h();
    +	  void f(int i = g());
    +	  int g(int i = h());
    +	};
    +

    This behavior is not mandated by the standard. Now G++ issues + an error about this code. To avoid the error, you must move + the declaration of g before the declaration of + f. The default arguments for g must + be visible at the point where it is called.

  • + +
  • The C++ ABI Section 3.3.3 specifications for the array + construction routines __cxa_vec_new2 and + __cxa_vec_new3 were changed to return + NULL when the allocator argument returns + NULL. These changes are incorporated into the + libstdc++ runtime library.
  • + +
  • Using a name introduced by a typedef in a friend declaration or in an + explicit instantiation is now rejected, as specified by the ISO C++ + standard. +
    +	class A;
    +	typedef A B;
    +	class C { 
    +	  friend class B;      // error, no typedef name here
    +	  friend B;            // error, friend always needs class/struct/enum
    +	  friend class A;      // OK
    +	};
    +	
    +	template <int> class Q {};
    +	typedef Q<0> R;
    +	template class R;      // error, no typedef name here
    +	template class Q<0>;   // OK
  • + +
  • When allocating an array with a new expression, GCC used to allow + parentheses around the type name. This is actually ill-formed and it is + now rejected: +
    +	int* a = new (int)[10];    // error, not accepted anymore
    +	int* a = new int[10];      // OK
  • + +
  • When binding an rvalue of class type to a reference, the copy + constructor of the class must be accessible. For instance, consider + the following code: +
    +	class A 
    +	{
    +	public:
    +	  A();
    +	  
    +	private:
    +	  A(const A&);   // private copy ctor
    +	};
    +	
    +	A makeA(void);
    +	void foo(const A&);
    +	
    +	void bar(void)
    +	{
    +	  foo(A());       // error, copy ctor is not accessible
    +	  foo(makeA());   // error, copy ctor is not accessible
    +	  
    +	  A a1;
    +	  foo(a1);        // OK, a1 is a lvalue
    +	}
    + +

    This might be surprising at first sight, especially since most + popular compilers do not correctly implement this rule + (further details).

  • + +
  • When forming a pointer to member or a pointer to member function, + access checks for class visibility (public, protected, private) + are now performed using the qualifying scope of the name itself. + This is better explained with an example: + +
    +	class A
    +	{
    +	public:
    +	  void pub_func();
    +	protected:
    +	  void prot_func();
    +	private:
    +	  void priv_func();
    +	};
    +
    +	class B : public A
    +	{
    +	public:
    +	  void foo()
    +	  {
    +	    &A::pub_func;   // OK, pub_func is accessible through A
    +	    &A::prot_func;  // error, cannot access prot_func through A
    +	    &A::priv_func;  // error, cannot access priv_func through A
    +
    +	    &B::pub_func;   // OK, pub_func is accessible through B
    +	    &B::prot_func;  // OK, can access prot_func through B (within B)
    +	    &B::priv_func;  // error, cannot access priv_func through B
    +	  }
    +	};
  • +
+ +

Runtime Library (libstdc++)

+ +
    +
  • Optimization work: +
      +
    • Streamlined streambuf, filebuf, separate + synched with C Standard I/O streambuf.
    • +
    • All formatted I/O now uses cached locale information.
    • +
    • STL optimizations (memory/speed for list, red-black trees as used + by sets and maps).
    • +
    • More use of GCC builtins.
    • +
    • String optimizations (avoid contention on increment/decrement-and-test + of the reference count in the empty-string object, constructor from + input_iterators speedup).
    • +
  • +
  • Static linkage size reductions.
  • +
  • Large File Support (files larger than 2 GB on 32-bit systems).
  • +
  • Wide character and variable encoding filebuf work + (UTF-8, Unicode).
  • +
  • Generic character traits.
  • +
  • Also support wchar_t specializations on Mac OS 10.3.x, + FreeBSD 5.x, Solaris 2.7 and above, AIX 5.x, Irix 6.5.
  • +
  • The allocator class is now standard-conformant, and two additional + extension allocators have been added, mt_alloc and bitmap_allocator.
  • +
  • PCH support: -include bits/stdc++.h (2x compile speedup).
  • +
  • Rewrote __cxa_demangle with support for C++ style + allocators.
  • +
  • New debug modes for STL containers and iterators.
  • +
  • Testsuite rewrite: five times as many tests, plus increasingly + sophisticated tests, including I/O, MT, multi-locale, wide and + narrow characters.
  • +
  • Use current versions of GNU "autotools" for build/configuration.
  • +
+ +

Objective-C

+ +
    +
  • The Objective-C front end has been updated to include the numerous + bug fixes and enhancements previously available only in Apple's + version of GCC. These include: +
      +
    • Structured exception (@try... @catch... + @finally, @throw) and synchronization + (@synchronized) support. These are accessible via + the -fobjc-exceptions switch; as of this writing, + they may only be used in conjunction with -fnext-runtime + on Mac OS X 10.3 and later. See Options Controlling Objective-C Dialect for more + information.
    • +
    • An overhaul of @encode logic. The C99 _Bool + and C++ bool type may now be encoded as + 'B'. In addition, the back-end/codegen dependencies + have been removed.
    • +
    • An overhaul of message dispatch construction, ensuring that the + various receiver types (and casts thereof) are handled properly, + and that correct diagnostics are issued.
    • +
    • Support for "Zero-Link" (-fzero-link) and + "Fix-and-Continue" (-freplace-objc-classes) debugging + modes, currently available on Mac OS X 10.3 and later. See Options Controlling Objective-C Dialect for more + information.
    • +
    • Access to optimized runtime entry points (-fno-nil-receivers + ) on the assumption that message receivers are never + nil. This is currently available on Mac OS X 10.3 and + later. See Options Controlling Objective-C Dialect for more + information.
    • +
  • +
+ +

Java

+ +
    +
  • Compiling a .jar file will now cause non-.class entries to be + automatically compiled as resources.
  • +
  • libgcj has been ported to Darwin.
  • +
  • Jeff Sturm has adapted Jan Hubicka's call graph optimization + code to gcj.
  • +
  • libgcj has a new gcjlib URL type; this + lets URLClassLoader load code from shared + libraries.
  • +
  • libgcj has been much more completely merged with GNU Classpath.
  • +
  • Class loading is now much more correct; in particular the + caller's class loader is now used when that is required.
  • +
  • Eclipse 2.x will run + out of the box using gij.
  • +
  • Parts of java.nio have been implemented. + Direct and indirect buffers work, as do fundamental file and + socket operations.
  • +
  • java.awt has been improved, though it is still + not ready for general use.
  • +
  • The HTTP protocol handler now uses HTTP/1.1 and can handle + the POST method.
  • +
  • The MinGW port has matured. Enhancements include socket + timeout support, thread interruption, improved + Runtime.exec() handling and support for accented + characters in filenames.
  • +
+ +

Fortran

+ + + +

New Targets and Target Specific Improvements

+ +

Alpha

+
    +
  • Several + + built-in functions have been added such as + __builtin_alpha_zap to allow utilizing the more + obscure instructions of the CPU.
  • + +
  • Parameter passing of complex arguments has changed to match the + + ABI. This change is incompatible with previous GCC versions, but + does fix compatibility with the Tru64 compiler and several corner cases + where GCC was incompatible with itself.
  • +
+ +

ARM

+
    +
  • Nicolas Pitre has contributed his hand-coded floating-point support + code for ARM. It is both significantly smaller and faster than the + existing C-based implementation, even when building applications for + Thumb. The arm-elf configuration has been converted to use + the new code.
  • + +
  • Support for the Intel's iWMMXt architecture, a second + generation XScale processor, has been added. + Enabled at run time with the -mcpu=iwmmxt command + line switch.
  • + +
  • A new ARM target has been added: arm-wince-pe. This is + similar to the arm-pe target, but it defaults to using the + APCS32 ABI.
  • + +
  • The existing ARM pipeline description has been converted to + the use the DFA + processor pipeline model. There is not much change in code + performance, but the description is now easier + to understand.
  • + +
  • Support for the Cirrus EP9312 Maverick floating point + co-processor added. Enabled at run time with the + -mcpu=ep9312 command line switch. Note however that + the multilibs to support this chip are currently disabled in + gcc/config/arm/t-arm-elf, so if you want to enable their + production you will have to uncomment the entries in that + file.
  • +
+ +

H8/300

+
    +
  • Support for long long has been added.
  • + +
  • Support for saveall attribute has been added.
  • + +
  • Pavel Pisa contributed hand-written 32-bit-by-32-bit division + code for H8/300H and H8S, which is much faster than the previous + implementation.
  • + +
  • A lot of small performance improvements.
  • +
+ +

IA-32/AMD64 (x86-64)

+
    +
  • Tuning for K8 (AMD Opteron/Athlon64) core is available via + -march=k8 and -mcpu=k8.
  • +
  • Scalar SSE code generation carefully avoids reformatting penalties, + hidden dependencies and minimizes the number of uops generated on + both Intel and AMD CPUs.
  • +
  • Vector MMX and SSE operands are now passed in registers to improve + performance and match the argument passing convention used by the Intel + C++ Compiler. As a result it is not possible to call functions + accepting vector arguments compiled by older GCC version.
  • +
  • Conditional jump elimination is now more aggressive on modern CPUs.
  • +
  • The Athlon ports has been converted to use the DFA + processor pipeline description.
  • +
  • Optimization of indirect tail calls is now possible in a similar + fashion as direct sibcall optimization.
  • +
  • Further small performance improvements.
  • +
  • -m128bit-long-double is now less buggy.
  • +
  • __float128 support in 64-bit compilation.
  • +
  • Support for data structures exceeding 2GB in 64-bit mode.
  • +
  • -mcpu has been renamed to -mtune.
  • +
+ +

IA-64

+
    +
  • Tuning code for the Itanium 2 processor has been added. The + generation of code tuned for Itanium 2 (option + -mtune=itanium2) is enabled by default now. To + generate code tuned for Itanium 1 the option + -mtune=itanium1 should be used.
  • + +
  • DFA + processor pipeline descriptions for the IA-64 processors + have been added. This resulted in about 3% improvement on the + SPECInt2000 benchmark for Itanium 2.
  • + +
  • Instruction bundling for the IA-64 processors has been + rewritten using the DFA pipeline hazard recognizer. It + resulted in about 60% compiler speedup on the SPECInt2000 C + programs.
  • +
+ +

M32R

+
    +
  • Support for the M32R/2 processor has been added by Renesas.
  • +
  • Support for an M32R Linux target and PIC code generation has + been added by Renesas.
  • +
+ +

M68000

+
    +
  • Bernardo Innocenti (Develer S.r.l.) has contributed + the m68k-uclinux target, based on former work done + by Paul Dale (SnapGear Inc.). Code generation for the + ColdFire processors family has been enhanced and extended + to support the MCF 53xx and MCF 54xx cores, integrating + former work done by Peter Barada (Motorola).
  • +
+ +

MIPS

+

Processor-specific changes

+
    +
  • Support for the RM7000 and RM9000 processors has been added. + It can be selected using the -march compiler option + and should work with any MIPS I (mips-*) or MIPS III + (mips64-*) configuration.
  • +
  • Support for revision 2 of the MIPS32 ISA has been added. + It can be selected with the command-line option + -march=mips32r2.
  • +
  • There is a new option, -mfix-sb1, to work around + certain SB-1 errata.
  • +
+

Configuration

+
    +
  • It is possible to customize GCC using the following configure-time + options: +
      +
    • --with-arch, which specifies the default + value of the -march option.
    • +
    • --with-tune, which specifies the default + value of the -mtune option.
    • +
    • --with-abi, which specifies the default ABI.
    • +
    • --with-float=soft, which tells GCC to + use software floating point by default.
    • +
    • --with-float=hard, which tells GCC to + use hardware floating point by default.
    • +
  • +
  • A 64-bit GNU/Linux port has been added. The associated + configurations are mips64-linux-gnu and + mips64el-linux-gnu.
  • +
  • The 32-bit GNU/Linux port now supports Java.
  • +
  • The IRIX 6 configuration now supports the o32 ABI and will + build o32 multilibs by default. This support is compatible with + both binutils and the SGI tools, but note that several features, + including debugging information and DWARF2 exception handling, + are only available when using the GNU assembler. Use of the + GNU assembler and linker (version 2.15 or above) is strongly + recommended.
  • +
  • The IRIX 6 configuration now supports 128-bit long doubles.
  • +
  • There are two new RTEMS-specific configurations, + mips-rtems and mipsel-rtems.
  • +
  • There are two new *-elf configurations, + mipsisa32r2-elf and mipsisa32r2el-elf.
  • +
+

General

+
    +
  • Several ABI bugs have been fixed. + Unfortunately, these changes will break binary compatibility + with earlier releases.
  • +
  • GCC can now use explicit relocation operators when generating + -mabicalls code. This behavior is controlled by + -mexplicit-relocs and can have several performance + benefits. For example: +
      +
    • It allows for more optimization of GOT accesses, including + better scheduling and redundancy elimination.
    • +
    • It allows sibling calls to be implemented as jumps.
    • +
    • n32 and n64 leaf functions can use a call-clobbered + global pointer instead of $28.
    • +
    • The code to set up $gp can be removed from + functions that don't need it.
    • +
  • +
  • A new option, -mxgot, allows the GOT to be bigger + than 64k. This option is equivalent to the assembler's + -xgot option and should be used instead of + -Wa,-xgot.
  • +
  • Frame pointer elimination is now supported when generating 64-bit + MIPS16 code.
  • +
  • Inline block moves have been optimized to take more account of + alignment information.
  • +
  • Many internal changes have been made to the MIPS port, mostly + aimed at reducing the reliance on assembler macros.
  • +
+ +

PowerPC Darwin

+
    +
  • Support for shared/dylib gcc libraries has been added. It is + enabled by default on powerpc-apple-darwin7.0.0 + and up.
  • + +
  • Libgcj is enabled by default. On systems older than + powerpc-apple-darwin7.0.0 you need to install dlcompat. +
  • +
+ +

S/390 and zSeries

+
    +
  • New command-line options allow to specify the intended execution + environment for generated code: +
      +
    • -mesa/-mzarch allows to specify + whether to generate code running in ESA/390 mode or in + z/Architecture mode (this is applicable to 31-bit code + only).
    • +
    • -march allows to specify a minimum processor + architecture level (g5, g6, + z900, or z990).
    • +
    • -mtune allows to specify which processor to tune + for.
    • +
  • +
  • It is possible to customize GCC using the following configure-time + options: +
      +
    • --with-mode, which specifies whether to + default to assuming ESA/390 or z/Architecture mode.
    • +
    • --with-arch, which specifies the default + value of the -march option.
    • +
    • --with-tune, which specifies the default + value of the -mtune option.
    • +
  • +
  • Support for the z990 processor has been added, and can be selected + using -march=z990 or -mtune=z990. This + includes instruction scheduling tuned for the superscalar instruction + pipeline of the z990 processor as well as support for all new + instructions provided by the long-displacement facility.
  • +
  • Support to generate 31-bit code optimized for zSeries processors + (running in ESA/390 or in z/Architecture mode) has been added. + This can be selected using -march=z900 and + -mzarch respectively.
  • +
  • Instruction scheduling for the z900 and z990 + processors now uses the DFA pipeline hazard recognizer.
  • +
  • GCC no longer generates code to maintain a stack backchain, + previously used to generate stack backtraces for debugging + purposes. As replacement that does not incur runtime overhead, + DWARF-2 call frame information is provided by GCC; + this is supported by GDB 6.1. The old behavior can + be restored using the -mbackchain option.
  • +
  • The stack frame size of functions may now exceed 2 GB in 64-bit + code.
  • +
  • A port for the 64-bit IBM TPF operating system has been added; + the configuration is s390x-ibm-tpf. This + configuration is supported as cross-compilation target only.
  • +
  • Various changes to improve the generated code have been implemented, + including: +
      +
    • GCC now uses the MULTIPLY AND ADD and + MULTIPLY AND SUBTRACT instructions to + significantly speed up many floating-point applications.
    • +
    • GCC now uses the ADD LOGICAL WITH CARRY and + SUBTRACT LOGICAL WITH BORROW instructions to + speed up long long arithmetic.
    • +
    • GCC now uses the SEARCH STRING instruction to + implement strlen().
    • +
    • In many cases, function call overhead for 31-bit code has + been reduced by placing the literal pool after the function + code instead of after the function prolog.
    • +
    • Register 14 is no longer reserved in 64-bit code.
    • +
    • Handling of global register variables has been improved.
    • +
  • +
+ +

SPARC

+
    +
  • The option -mflat is deprecated.
  • + +
  • Support for large (> 2GB) frames has been added to the + 64-bit port.
  • + +
  • Several ABI bugs have been fixed. + Unfortunately, these changes will break binary compatibility with + earlier releases.
  • + +
  • The default debugging format has been switched from STABS to + DWARF-2 for 32-bit code on Solaris 7 and later. DWARF-2 is already + the default debugging format for 64-bit code on Solaris.
  • +
+ +

SuperH

+
    +
  • Support for the SH2E processor has been added. + Enabled at run time with the -m2e command line + switch, or at configure time by specifying sh2e as the machine + part of the target triple.
  • +
+ +

V850

+
    +
  • Support for the Mitsubishi V850E1 processor has been added. + This is a variant of the V850E processor with some additional + debugging instructions.
  • +
+ +

Xtensa

+
    +
  • Several ABI bugs have been fixed. Unfortunately, these changes + break binary compatibility with earlier releases. +
      +
    • For big-endian processors, the padding of aggregate return values + larger than a word has changed. If the size of an aggregate return + value is not a multiple of 32 bits, previous versions of GCC inserted + padding in the most-significant bytes of the first return value + register. Aggregates larger than a word are now padded in the + least-significant bytes of the last return value register used. + Aggregates smaller than a word are still padded in the most-significant + bytes. The return value padding has not changed for little-endian + processors.
    • +
    • Function arguments with 16-byte alignment are now properly + aligned.
    • +
    • The implementation of the va_list type has changed. + A va_list value created by va_start from a + previous release cannot be used with va_arg from this + release, or vice versa.
    • +
  • +
  • More processor configuration options for Xtensa processors are + supported: +
      +
    • the ABS instruction is now optional;
    • +
    • the ADDX* and SUBX* instructions are + now optional;
    • +
    • an experimental CONST16 instruction can be used to + synthesize constants instead of loading them from constant pools.
    • +
    + These and other Xtensa processor configuration options can no longer + be enabled or disabled by command-line options; the processor + configuration must be specified by the xtensa-config.h + header file when building GCC. Additionally, the + -mno-serialize-volatile option is no longer supported.
  • +
+ +

Obsolete Systems

+ +

Support for a number of older systems has been declared obsolete in + GCC 3.4. Unless there is activity to revive them, the next release of + GCC will have their sources permanently removed.

+ +

All configurations of the following processor architectures have + been declared obsolete:

+ +
    +
  • Mitsubishi D30V, d30v-*
  • +
  • AT&T DSP1600 and DSP1610, dsp16xx-*
  • +
  • Intel 80960, i960
  • +
+ +

Also, some individual systems have been obsoleted:

+ +
    +
  • ARM Family +
      +
    • Support for generating code for operation in APCS/26 mode + (-mapcs-26).
    • +
  • +
  • IBM ESA/390 +
      +
    • "Bigfoot" port, i370-*. (The other port, + s390-*, is actively maintained and + supported.)
    • +
  • +
  • Intel 386 family +
      +
    • MOSS, i?86-moss-msdos and + i?86-*-moss*
    • +
    • NCR 3000 running System V r.4, i?86-ncr-sysv4*
    • +
    • FreeBSD with a.out object format, i?86-*-freebsd*aout* + and i?86-*-freebsd2*
    • +
    • Linux with a.out object format, i?86-linux*aout*
    • +
    • Linux with libc5, a.k.a. glibc1, i?86-linux*libc1*
    • +
    • Interix versions before Interix 3, i?86-*-interix
    • +
    • Mach microkernel, i?86-mach*
    • +
    • SCO UnixWare with UDK, i?86-*-udk*
    • +
    • Generic System V releases 1, 2, and 3, + i?86-*-sysv[123]*
    • +
    • VSTa microkernel, i386-*-vsta
    • +
  • +
  • Motorola M68000 family +
      +
    • HPUX, m68k-hp-hpux* and + m68000-hp-hpux*
    • +
    • NetBSD with a.out object format (before NetBSD 1.4), + m68k-*-*-netbsd* except + m68k-*-*-netbsdelf*
    • +
    • Generic System V r.4, m68k-*-sysv4*
    • +
  • +
  • VAX +
      +
    • Generic VAX, vax-*-* (This is generic VAX only; + we have not obsoleted any VAX triples for specific operating + systems.)
    • +
  • +
+ + +

Documentation improvements

+ + +

Other significant improvements

+ +
    +
  • The build system has undergone several significant cleanups. + Subdirectories will only be configured if they are being built, + and all subdirectory configures are run from the make + command. The top level has been autoconfiscated.
  • +
  • Building GCC no longer writes to its source directory. This + should help those wishing to share a read-only source directory + over NFS or build from a CD. The exceptions to this feature are + if you configure with either --enable-maintainer-mode + or --enable-generated-files-in-srcdir.
  • +
  • The -W warning option has been renamed to + -Wextra, which is more easily understood. The older + spelling will be retained for backwards compatibility.
  • +
  • Substantial improvements in compile time have been made, particularly + for non-optimizing compilations.
  • +
+ +
+

GCC 3.4.0

+ +

Bug Fixes

+ +

+A vast number of bugs have been fixed in 3.4.0, too many to publish a +complete list here. +Follow +this link to query the Bugzilla database for the list of over 900 bugs +fixed in 3.4.0. This is the list of all bugs marked as resolved and fixed +in 3.4.0 that are not flagged as 3.4 regressions.

+ +
+

GCC 3.4.1

+ + +

Bug Fixes

+ +

This section lists the problem reports (PRs) from GCC's bug tracking +system that +are known to be fixed in the 3.4.1 release. This list might not be complete +(that is, it is possible that some PRs that have been fixed are not listed +here).

+ +

Bootstrap failures

+
    +
  • 10129 Ada bootstrap fails on PPC-Darwin - invalid assembler emitted - PIC related
  • +
  • 14576 [ARM] ICE in libiberty when building gcc-3.4 for arm-elf
  • +
  • 14760 A bug in configure.in prevents using both --program-suffix and --program-prefix
  • +
  • 14671 [hppa64] bootstrap fails: ICE in save_call_clobbered_regs, in caller_save.c
  • +
  • 15093 [alpha][Java] make bootstrap fails to configure libffi on Alpha
  • +
  • 15178 Solaris 9/x86 fails linking after stage 3
  • +
+

Multi-platform internal compiler errors (ICEs)

+
    +
  • 12753 (preprocessor) Memory corruption in preprocessor on bad input
  • +
  • 13985 ICE in gcc.c-torture/compile/930621-1.c
  • +
  • 14810 (c++) tree check failures with invalid code involving templates
  • +
  • 14883 (c++) ICE on invalid code, in cp_parser_lookup_name, in cp/parser.c
  • +
  • 15044 (c++) ICE on syntax error, template header
  • +
  • 15057 (c++) Compiling of conditional value throw constructs cause a segmentation violation
  • +
  • 15064 (c++) typeid of template parameter gives ICE
  • +
  • 15142 (c++) ICE when passing a string where a char* is expected in a throw statement
  • +
  • 15159 ICE in rtl_verify_flow_info_1
  • +
  • 15165 (c++) ICE in instantiate_template
  • +
  • 15193 Unary minus using pointer to V4SF vector causes -fforce-mem to exhaust all memory
  • +
  • 15209 (c++) Runs out of memory with packed structs
  • +
  • 15227 (c++) Trouble with invalid function definition
  • +
  • 15285 (c++) instantiate_type ICE when forming pointer to template function
  • +
  • 15299 (c++) ICE in resolve_overloaded_unification
  • +
  • 15329 (c++) ICE on constructor of member template
  • +
  • 15550 ICE in extract_insn, in recog.c
  • +
  • 15554 (c++) ICE in tsubst_copy, in cp/pt.c
  • +
  • 15640 (c++) ICE on invalid code in arg_assoc, in cp/name-lookup.c
  • +
  • 15666 [unit-at-a-time] Gcc abort on valid code
  • +
  • 15696 (c++) ICE with bad pointer-to-member code
  • +
  • 15701 (c++) ICE with friends and template template parameter
  • +
  • 15761 ICE in do_SUBST, in combine.c
  • +
  • 15829 (c++) ICE on Botan-1.3.13 due to -funroll-loops
  • +
+

Ada

+
    +
  • 14538 All RTEMS targets broken for gnat
  • +
+

C front end

+
    +
  • 12391 missing warning about assigning to an incomplete type
  • +
  • 14649 atan(1.0) should not be a constant expression
  • +
  • 15004 [unit-at-a-time] no warning for unused paramater in static function
  • +
  • 15749 --pedantic-errors behaves differently from --pedantic with C-compiler on GNU/Linux
  • +
+

C++ compiler and library

+
    +
  • 10646 non-const reference is incorrectly matched in a "const T" partial specialization
  • +
  • 12077 wcin.rdbuf()->in_avail() return value too high
  • +
  • 13598 enc_filebuf doesn't work
  • +
  • 14211 const_cast returns lvalue but should be rvalue
  • +
  • 14220 num_put::do_put() undesired float/double behavior
  • +
  • 14245 problem with user-defined allocators in std::basic_string
  • +
  • 14340 libstdc++ Debug mode: failure to convert iterator to const_iterator
  • +
  • 14600 __gnu_cxx::stdio_sync_filebuf should expose internal FILE*
  • +
  • 14668 no warning anymore for reevaluation of declaration
  • +
  • 14775 LFS (large file support) tests missing
  • +
  • 14821 Duplicate namespace alias declaration should not conflict
  • +
  • 14930 Friend declaration ignored
  • +
  • 14932 cannot use offsetof to get offsets of array elements in g++ 3.4.0
  • +
  • 14950 [non unit-at-a-time] always_inline does not mix with templates and -O0
  • +
  • 14962 g++ ignores #pragma redefine_extname
  • +
  • 14975 Segfault on low-level write error during imbue
  • +
  • 15002 Linewise stream input is unusably slow (std::string slow)
  • +
  • 15025 compiler accepts redeclaration of template as non-template
  • +
  • 15046 [arm] Math functions misdetected by cross configuration
  • +
  • 15069 a bit test on a variable of enum type is miscompiled
  • +
  • 15074 g++ -lsupc++ still links against libstdc++
  • +
  • 15083 spurious "statement has no effect" warning
  • +
  • 15096 parse error with templates and pointer to const member
  • +
  • 15287 combination of operator[] and operator .* fails in templates
  • +
  • 15317 __attribute__ unused in first parameter of constructor gives error
  • +
  • 15337 sizeof on incomplete type diagnostic
  • +
  • 15361 bitset<>::_Find_next fails
  • +
  • 15412 _GLIBCXX_ symbols symbols defined and used in different namespaces
  • +
  • 15427 valid code results in incomplete type error
  • +
  • 15471 Incorrect member pointer offsets in anonymous structs/unions
  • +
  • 15503 nested template problem
  • +
  • 15507 compiler hangs while laying out union
  • +
  • 15542 operator & and template definitions
  • +
  • 15565 SLES9: leading + sign for unsigned int with showpos
  • +
  • 15625 friend defined inside a template fails to find static function
  • +
  • 15629 Function templates, overloads, and friend name injection
  • +
  • 15742 'noreturn' attribute ignored in method of template functions.
  • +
  • 15775 Allocator::pointer consistently ignored
  • +
  • 15821 Duplicate namespace alias within namespace rejected
  • +
  • 15862 'enum yn' fails (confict with undeclared builtin)
  • +
  • 15875 rejects pointer to member in template
  • +
  • 15877 valid code using templates and anonymous enums is rejected
  • +
  • 15947 Puzzling error message for wrong destructor declaration in template class
  • +
  • 16020 cannot copy __gnu_debug::bitset
  • +
  • 16154 input iterator concept too restrictive
  • +
  • 16174 deducing top-level consts
  • +
+

Java

+
    +
  • 14315 Java compiler is not parallel make safe
  • +
+

Fortran

+
    +
  • 15151 [g77] incorrect logical i/o in 64-bit mode
  • +
+

Objective-C

+
    +
  • 7993 private variables cannot be shadowed in subclasses
  • +
+

Optimization bugs

+
    +
  • 15228 useless copies of floating point operands
  • +
  • 15345 [non-unit-at-a-time] unreferenced nested inline functions not optimized away
  • +
  • 15945 Incorrect floating point optimization
  • +
  • 15526 ftrapv aborts on 0 * (-1)
  • +
  • 14690 Miscompiled POOMA tests
  • +
  • 15112 GCC generates code to write to unchanging memory
  • +
+

Preprocessor

+
    +
  • 15067 Minor glitch in the source of cpp
  • +
+

Main driver program bugs

+
    +
  • 1963 collect2 interprets -oldstyle_liblookup as -o ldstyle_liblookup
  • +
+

x86-specific (Intel/AMD)

+
    +
  • 15717 Error: can't resolve `L0' {*ABS* section} - `xx' {*UND* section}
  • +
+

HPPA-specific

+
    +
  • 14782 GCC produces an unaligned data access at -O2
  • +
  • 14828 FAIL: gcc.c-torture/execute/20030408-1.c execution, -O2
  • +
  • 15202 ICE in reload_cse_simplify_operands, in postreload.c
  • +
+

IA64-specific

+
    +
  • 14610 __float80 constants incorrectly emitted
  • +
  • 14813 init_array sections are initialized in the wrong order
  • +
  • 14857 GCC segfault on duplicated asm statement
  • +
  • 15598 Gcc 3.4 ICE on valid code
  • +
  • 15653 Gcc 3.4 ICE on valid code
  • +
+

MIPS-specific

+
    +
  • 15189 wrong filling of delay slot with -march=mips1 -G0 -mno-split-addresses -mno-explicit-relocs
  • +
  • 15331 Assembler error building gnatlib on IRIX 6.5 with GNU as 2.14.91
  • +
  • 16144 Bogus reference to __divdf3 when -O1
  • +
  • 16176 Miscompilation of unaligned data in MIPS backend
  • +
+

PowerPC-specific

+
    +
  • 11591 ICE in gcc.dg/altivec-5.c
  • +
  • 12028 powerpc-eabispe produces bad sCOND operation
  • +
  • 14478 rs6000 geu/ltu patterns generate incorrect code
  • +
  • 14567 long double and va_arg complex args
  • +
  • 14715 Altivec stack layout may overlap gpr save with stack temps
  • +
  • 14902 (libstdc++) Stream checking functions fail when -pthread option is used.
  • +
  • 14924 Compiler ICE on valid code
  • +
  • 14960 -maltivec affects vector return with -mabi=no-altivec
  • +
  • 15106 vector varargs failure passing from altivec to non-altivec code for -m32
  • +
  • 16026 ICE in function.c:4804, assign_parms, when -mpowerpc64 & half-word operation
  • +
  • 15191 -maltivec -mabi=no-altivec results in mis-aligned lvx and stvx
  • +
  • 15662 Segmentation fault when an exception is thrown - even if try and catch are specified
  • +
+

s390-specific

+
    +
  • 15054 Bad code due to overlapping stack temporaries
  • +
+

SPARC-specific

+
    +
  • 15783 ICE with union assignment in 64-bit mode
  • +
  • 15626 GCC 3.4 emits "ld: warning: relocation error: R_SPARC_UA32"
  • +
+

x86-64-specific

+
    +
  • 14326 boehm-gc hardcodes to 3DNow! prefetch for x86_64
  • +
  • 14723 Backported -march=nocona from mainline
  • +
  • 15290 __float128 failed to pass to function properly
  • +
+

Cygwin/Mingw32-specific

+
    +
  • 15250 Option -mms-bitfields support on GCC 3.4 is not conformant to MS layout
  • +
  • 15551 -mtune=pentium4 -O2 with sjlj EH breaks stack probe worker on windows32 targets
  • +
+

Bugs specific to embedded processors

+
    +
  • 8309 [m68k] -m5200 produces erroneous SImode set of short varaible on stack
  • +
  • 13250 [SH] Gcc code for rotation clobbers the register, but gcc continues to use the register as if it was not clobbered
  • +
  • 13803 [coldfire] movqi operand constraints too restrictivefor TARGET_COLDFIRE
  • +
  • 14093 [SH] ICE for code when using -mhitachi option in SH
  • +
  • 14457 [m6811hc] ICE with simple c++ source
  • +
  • 14542 [m6811hc] ICE on simple source
  • +
  • 15100 [SH] cc1plus got hang-up on libstdc++-v3/testsuite/abi_check.cc
  • +
  • 15296 [CRIS] Delayed branch scheduling causing invalid code on cris-*
  • +
  • 15396 [SH] ICE with -O2 -fPIC
  • +
  • 15782 [coldfire] m68k_output_mi_thunk emits wrong code for ColdFire
  • +
+

Testsuite problems (compiler not affected)

+
    +
  • 11610 libstdc++ testcases 27_io/* don't work properly remotely
  • +
  • 15488 (libstdc++) possibly insufficient file permissions for executing test suite
  • +
  • 15489 (libstdc++) testsuite_files determined incorrectly
  • +
+

Documentation bugs

+
    +
  • 13928 (libstdc++) no whatis info in some man pages generated by doxygen
  • +
  • 14150 Ada documentation out of date
  • +
  • 14949 (c++) Need to document method visibility changes
  • +
  • 15123 libstdc++-doc: Allocators.3 manpage is empty
  • +
+ + + + +
+ +

Please send FSF & GNU inquiries & questions to +gnu@gnu.org. +There are also other ways +to contact the FSF.

+ +

These pages are maintained by +the GCC team.

+ +
For questions related to the use of GCC, please consult these web +pages and the GCC manuals. If +that fails, the gcc-help@gcc.gnu.org +mailing list might help.
+Please send comments on these web pages and the development of GCC to our +public developer mailing list at gcc@gnu.org +or gcc@gcc.gnu.org. +
+ +

Copyright (C) Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111, USA.

+ +

Verbatim copying and distribution of this entire article is +permitted in any medium, provided this notice is preserved.

+ +
+ Last modified 2004-07-02 + + + Valid XHTML 1.0 + + +
+ +
+

GCC 3.4.2

+ + +

Bug Fixes

+ +

This section lists the problem reports (PRs) from GCC's bug tracking +system that +are known to be fixed in the 3.4.2 release. This list might not be complete +(that is, it is possible that some PRs that have been fixed are not listed +here).

+ +

Bootstrap failures and issues

+
    +
  • 16469 [mips-sgi-irix5.3] bootstrap fails in libstdc++-v3/testsuite
  • +
  • 16344 [hppa-linux-gnu] libstdc++'s PCH built by profiledbootstrap does not work with the built compiler
  • +
  • 16842 [Solaris/x86] mkheaders can not find mkheaders.conf
  • +
+

Multi-platform internal compiler errors (ICEs)

+
    +
  • 12608 (c++) ICE: expected class 't', have 'x' (error_mark) in cp_parser_class_specifier, in cp/parser.c
  • +
  • 14492 ICE in loc_descriptor_from_tree, in dwarf2out.c
  • +
  • 15461 (c++) ICE due to NRV and inlining
  • +
  • 15890 (c++) ICE in c_expand_expr, in c-common.c
  • +
  • 16180 ICE: segmentation fault in RTL optimization
  • +
  • 16224 (c++) ICE in write_unscoped_name (template/namespace)
  • +
  • 16408 ICE: in delete_insn, in cfgrtl.c
  • +
  • 16529 (c++) ICE for: namespace-alias shall not be declared as the name of any other entity
  • +
  • 16698 (c++) ICE with exceptions and declaration of __cxa_throw
  • +
  • 16706 (c++) ICE in finish_member_declaration, in cp/semantics.c
  • +
  • 16810 (c++) Legal C++ program with cast gives ICE in build_ptrmemfunc
  • +
  • 16851 (c++) ICE when throwing a comma expression
  • +
  • 16870 (c++) Boost.Spirit causes ICE in tsubst, in cp/pt.c
  • +
  • 16904 (c++) ICE in finish_class_member_access_expr, in cp/typeck.c
  • +
  • 16905 (c++) ICE (segfault) with exceptions
  • +
  • 16964 (c++) ICE in cp_parser_class_specifier due to redefinition
  • +
  • 17068 (c++) ICE: tree check: expected class 'd', have 'x' (identifier_node) in dependent_template_p, in cp/pt.c
  • +
+

Preprocessor bugs

+
    +
  • 16366 Preprocessor option -remap causes memory corruption
  • +
+

Optimization

+
    +
  • 15345 unreferenced nested inline functions not optimized away
  • +
  • 16590 Incorrect execution when compiling with -O2
  • +
  • 16693 Bitwise AND is lost when used within a cast to an enum of the same precision
  • +
  • 17078 Jump into if(0) substatement fails
  • +
+

Problems in generated debug information

+
    +
  • 13956 incorrect stabs for nested local variables
  • +
+

C front end bugs

+
    +
  • 16684 GCC should not warn about redundant redeclarations of built-ins
  • +
+

C++ compiler and library

+
    +
  • 12658 Thread safety problems in locale::global() and locale::locale()
  • +
  • 13092 g++ accepts invalid pointer-to-member conversion
  • +
  • 15320 Excessive memory consumption
  • +
  • 16246 Incorrect template argument deduction
  • +
  • 16273 Memory exhausted when using nested classes and virtual functions
  • +
  • 16401 ostringstream in gcc 3.4.x very slow for big data
  • +
  • 16411 undefined reference to __gnu_cxx::stdio_sync_filebuf<char, std::char_traits::file()
  • +
  • 16489 G++ incorrectly rejects use of a null constant integral expression as a null constant pointer
  • +
  • 16618 offsetof fails with constant member
  • +
  • 16637 syntax error reported for valid input code
  • +
  • 16717 __attribute__((constructor)) broken in C++
  • +
  • 16813 compiler error in DEBUG version of range insertion std::map::insert
  • +
  • 16853 pointer-to-member initialization from incompatible one accepted
  • +
  • 16889 ambiguity is not detected
  • +
  • 16959 Segmentation fault in ios_base::sync_with_stdio
  • +
+

Java compiler and library

+
    +
  • 7587 direct threaded interpreter not thread-safe
  • +
  • 16473 ServerSocket accept() leaks file descriptors
  • +
  • 16478 Hash synchronization deadlock with finalizers
  • +
+

Alpha-specific

+
    +
  • 10695 ICE in dwarf2out_frame_debug_expr, in dwarf2out.c
  • +
  • 16974 could not split insn (ice in final_scan_insn, in final.c)
  • +
+

x86-specific

+
    +
  • 16298 ICE in output_operand
  • +
  • 17113 ICE with SSE2 intrinsics
  • +
+

x86-64 specific

+
    +
  • 14697 libstdc++ couldn't find 32bit libgcc_s
  • +
+

MIPS-specific

+
    +
  • 15869 [mips64] No NOP after LW (with -mips1 -O0)
  • +
  • 16325 [mips64] value profiling clobbers gp on mips
  • +
  • 16357 [mipsisa64-elf] ICE copying 7 bytes between extern char[]s
  • +
  • 16380 [mips64] Use of uninitialised register after dbra conversion
  • +
  • 16407 [mips64] Unaligned access to local variables
  • +
  • 16643 [mips64] verify_local_live_at_start ICE after crossjumping & cfgcleanup
  • +
+

ARM-specific

+
    +
  • 15927 THUMB -O2: strength-reduced iteration variable ends up off by 1
  • +
  • 15948 THUMB: ICE with non-commutative cbranch
  • +
  • 17019 THUMB: bad switch statement in md code for addsi3_cbranch_scratch
  • +
+

IA64-specific

+
    +
  • 16130 ICE on valid code: in bundling, in config/ia64/ia64.c (-mtune=merced)
  • +
  • 16142 ICE on valid code: in bundling, in config/ia64/ia64.c (-mtune=itanium)
  • +
  • 16278 Gcc failed to build Linux kernel with -mtune=merced
  • +
  • 16414 ICE on valid code: typo in comparison of asm_noperands result
  • +
  • 16445 ICE on valid code: don't count ignored insns
  • +
  • 16490 ICE (segfault) while compiling with -fprofile-use
  • +
  • 16683 ia64 does not honor SUBTARGET_EXTRA_SPECS
  • +
+

PowerPC-specific

+
    +
  • 16195 (ppc64): Miscompilation of GCC 3.3.x by 3.4.x
  • +
  • 16239 ICE on ppc64 (mozilla 1.7 compile, -O1 -fno-exceptions issue)
  • +
+

Sparc-specific

+
    +
  • 16199 ICE while compiling apache 2.0.49
  • +
  • 16416 -m64 doesn't imply -mcpu=v9 anymore
  • +
  • 16430 ICE when returning non-C aggregates larger than 16 bytes
  • +
+

Bugs specific to embedded processors

+
    +
  • 16379 [m32r] can't output large model function call of memcpy
  • +
  • 17093 [m32r] ICE with -msdata=use -O0
  • +
  • 17119 [m32r] ICE at switch case 0x8000
  • +
+

DJGPP-specific

+
    +
  • 15928 libstdc++ in 3.4.x doesn't cross-compile for djgpp
  • +
+

Alpha Tru64-specific

+
    +
  • 16210 libstdc++ gratuitously omits "long long" I/O
  • +
+

Testsuite, documentation issues (compiler is not affected):

+
    +
  • 15488 (libstdc++) possibly insufficient file permissions for executing test suite
  • +
  • 16250 ada/doctools runs makeinfo even in release tarball
  • +
+ + + + + --- gcc-3.4-3.4.2.orig/debian/relink +++ gcc-3.4-3.4.2/debian/relink @@ -0,0 +1,74 @@ +#! /bin/sh +# +# Relink GNAT utilities using the shared library +# + +set -e + +pwd=`pwd` + +# why? +chmod a-w build/gcc/ada/rts/*.ali + +rm -rf tmp +ln -s $pwd/build/gcc/ada/rts/libgnat.so.1 tmp/libgnat.so + +LD_LIBRARY_PATH=$pwd/tmp +export LD_LIBRARY_PATH + +PATH=$pwd/debian:$pwd/tmp:$PATH +export PATH + +echo "#! /bin/sh" > tmp/dgcc +echo "$pwd/build/gcc/xgcc -B$pwd/build/gcc/ "'"$@"' >> tmp/dgcc +chmod 755 tmp/dgcc + +echo "#! /bin/sh" > tmp/dgnatlink +echo "$pwd/build/gcc/gnatlink --GCC=dgcc "'"$@"' >> tmp/dgnatlink +chmod 755 tmp/dgnatlink + +GMCMD="$pwd/build/gcc/gnatmake -I- -Irts -I. -a -m --GNATBIND=$pwd/build/gcc/gnatbind --GNATLINK=dgnatlink --GCC=dgcc" + +#cd $pwd/build/gcc/ada +#make CFLAGS="-O2" CC="../xgcc -B../" STAGE_PREFIX=../ a-link.o a-gmem.o +#cd $pwd + +[ -f build/gcc/gnatmake.old ] || cp -p build/gcc/gnatmake build/gcc/gnatmake.old +[ -f build/gcc/gnatlink.old ] || cp -p build/gcc/gnatlink build/gcc/gnatlink.old + +make -C build/gcc/ada \ + CFLAGS='-gnatp -gnata -O2 ' \ + ADA_INCLUDES="-I." \ + CC="../xgcc -B../" \ + STAGE_PREFIX=../ \ + ../gnatmake ../gnatlink + +mv gnatmake bgnatmake +mv gnatlink bgnatlink +exit 0 + +cd build/gcc/ada +for i in ../gnatchop ../gnatcmd \ + ../gnatkr ../gnatlbr \ + ../gnatls ../gnatmake \ + ../gnatprep ../gnatpsys \ + ../gnatxref ../gnatfind +do + rm -f $i + $GMCMD -O2 -gnatp -o $i `basename $i`.adb -largs -L.. +done + +rm -f ../gnatmem +$GMCMD -O2 -gnatp -o ../gnatmem gnatmem.adb -largs -L.. a-gmem.o +$GMCMD -O2 -gnatp -o ../gnatlink gnatlink -largs -L.. a-link.o +rm -f ../gnatpsta + +make CFLAGS="-O2" CC="../xgcc -B../" a-gettty.o a-deftar.o +$GMCMD -O2 -gnatp -o ../gnatpsta gnatpsta -largs -L.. a-gettty.o a-deftar.o +rm -f ../gnatbl + +make CFLAGS="-O2" CC="../xgcc -B../" gnatbl.o +../xgcc -B../ -o ../gnatbl gnatbl.o -L.. -lgnat +rm -f ../bgnatmake ../bgnatlink ../debian/dgcc ../debian/dgnatlink + +chmod +w rts/*.ali --- gcc-3.4-3.4.2.orig/debian/patches/libstdc++-doclink.dpatch +++ gcc-3.4-3.4.2/debian/patches/libstdc++-doclink.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +# DP: adjust hrefs to point to the local documentation + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libstdc++-v3/docs/doxygen/mainpage.html~ 2004-02-21 13:49:31.000000000 +0100 ++++ libstdc++-v3/docs/doxygen/mainpage.html 2004-02-21 13:59:02.000000000 +0100 +@@ -30,8 +30,8 @@ +

There are two types of documentation for libstdc++-v3. One is the + distribution documentation, which can be read online at + http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html +- or offline from docs/html/documentation.html in the library source +- directory. ++ or offline from ++ /usr/share/doc/gcc-3.4/libstdc++/html/documentation.html. +

+ +

The other type is the source documentation, of which this is the first page. +@@ -78,7 +78,7 @@ + +

License, Copyright, and Other Lawyerly Verbosity

+

The libstdc++-v3 documentation is released under +- ++ + these terms. +

+

Part of the generated documentation involved comments and notes from --- gcc-3.4-3.4.2.orig/debian/patches/protector.dpatch +++ gcc-3.4-3.4.2/debian/patches/protector.dpatch @@ -0,0 +1,45 @@ +#! /bin/sh -e + +# DP: gcc prototector patch: http://www.trl.ibm.com/projects/security/ssp/ + +# the basename of the protector tarball. the tarball is searched in the +# top level package directory. If it's not found, a uuencoded tarball +# is searched in debian/patches. + +pbase=protector-3.4-2 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +case "$1" in + -patch) + rm -rf protector + mkdir protector + ( + cd protector; + if [ -f ../$pbase.tar.gz ]; then + tar xfz ../$pbase.tar.gz + else + uudecode ../debian/patches/protector.uue; + tar xfz $pbase.tar.gz + fi + ) + cp -p protector/protector.[ch] ${dir}gcc/. + patch $pdir -f --no-backup-if-mismatch -p0 < protector/protector.dif + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < protector/protector.dif + rm -f ${dir}gcc/protector.[ch] + rm -rf protector + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 --- gcc-3.4-3.4.2.orig/debian/patches/amd64-biarch.dpatch +++ gcc-3.4-3.4.2/debian/patches/amd64-biarch.dpatch @@ -0,0 +1,88 @@ +#! /bin/sh -e + +# DP: biarch patches for i386/x86_64 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/config/i386/t-linux64~ 2002-11-28 14:47:02.000000000 +0000 ++++ gcc/config/i386/t-linux64 2004-07-24 07:40:21.716247432 +0000 +@@ -6,7 +6,7 @@ + + MULTILIB_OPTIONS = m64/m32 + MULTILIB_DIRNAMES = 64 32 +-MULTILIB_OSDIRNAMES = ../lib64 ../lib ++MULTILIB_OSDIRNAMES = ../lib ../lib32 + + LIBGCC = stmp-multilib + INSTALL_LIBGCC = install-multilib +--- config-ml.in~ 2003-07-04 19:53:34.000000000 +0000 ++++ config-ml.in 2004-07-24 14:13:02.871407408 +0000 +@@ -500,6 +500,46 @@ + ;; + esac + ;; ++x86_64*-*-*) ++ case " $multidirs " in ++ *" 32 "*) ++ # We will not be able to create libraries with -m32 if ++ # we cannot even link a trivial program. It usually ++ # indicates the 32bit libraries are missing. ++ if echo 'main() {}' > conftest.c && ++ ${CC-gcc} -m32 conftest.c -o conftest; then ++ echo Enable only libstdc++. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *32* ) case ${ml_realsrcdir} in ++ *"libstdc++-v3" ) multidirs="${multidirs} ${x}" ;; ++ *"libf2c" ) multidirs="${multidirs} ${x}" ;; ++ *"libobjc" ) multidirs="${multidirs} ${x}" ;; ++ *"libiberty" ) multidirs="${multidirs} ${x}" ;; ++ *"zlib" ) multidirs="${multidirs} ${x}" ;; ++ *) : ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done ++ else ++ echo Could not link program with -m32, disabling it. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *m32* ) : ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done ++ fi ++ rm -f conftest.c conftest ++ ;; ++ esac ++ ;; + esac + + # Remove extraneous blanks from multidirs. --- gcc-3.4-3.4.2.orig/debian/patches/hppa-libffi.dpatch +++ gcc-3.4-3.4.2/debian/patches/hppa-libffi.dpatch @@ -0,0 +1,1132 @@ +#! /bin/sh -e + +# DP: libffi support for hppa + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libffi && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2004-03-13 Matthias Klose + + * Makefile.am: Update + * Makefile.in: Regenerate. + * src/pa/ffi.h.in: Remove. + * src/pa/ffitarget.h: New file. + +2004-02-10 Randolph Chung + + * Makefile.am: Add PA support. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * configure.in: Add PA target. + * configure: Regenerate. + * src/pa/ffi.c: New file. + * src/pa/ffi.h.in: Add PA support. + * src/pa/linux.S: New file. + * prep_cif.c: Add PA support. + +diff -urN libffi.old/Makefile.am libffi/Makefile.am +--- libffi.old/Makefile.am 2004-03-20 19:32:43.000000000 +0100 ++++ libffi/Makefile.am 2004-03-20 19:38:44.000000000 +0100 +@@ -10,6 +10,7 @@ + src/mips/ffi.c src/mips/n32.S src/mips/o32.S \ + src/mips/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ ++ src/pa/ffi.c src/pa/linux.S src/pa/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/linux64.S src/powerpc/linux64_closure.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ +@@ -95,6 +96,7 @@ + TARGET_SRC_ALPHA = src/alpha/ffi.c src/alpha/osf.S + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S ++TARGET_SRC_PA = src/pa/ffi.c src/pa/linux.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S + TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +@@ -172,6 +174,10 @@ + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH64) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH64) + endif ++if PA ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_PA) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_PA) ++endif + + AM_CFLAGS = -Wall -g -fexceptions + +diff -urN libffi.old/Makefile.in libffi/Makefile.in +--- libffi.old/Makefile.in 2003-11-24 00:52:28.000000000 +0100 ++++ libffi/Makefile.in 2004-03-20 19:47:00.000000000 +0100 +@@ -101,6 +101,7 @@ + src/mips/ffi.c src/mips/n32.S src/mips/o32.S \ + src/mips/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ ++ src/pa/ffi.c src/pa/linux.S src/pa/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/linux64.S src/powerpc/linux64_closure.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ +@@ -179,6 +180,7 @@ + TARGET_SRC_ALPHA = src/alpha/ffi.c src/alpha/osf.S + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S ++TARGET_SRC_PA = src/pa/ffi.c src/pa/linux.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S + TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +@@ -199,6 +201,7 @@ + @ALPHA_TRUE@libffi_la_SOURCES = @ALPHA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) + @IA64_TRUE@libffi_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) + @M68K_TRUE@libffi_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ++@PA_TRUE@libffi_la_SOURCES = @PA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_PA) + @POWERPC_TRUE@libffi_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) + @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) +@@ -215,6 +218,7 @@ + @ALPHA_TRUE@libffi_convenience_la_SOURCES = @ALPHA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) + @IA64_TRUE@libffi_convenience_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) + @M68K_TRUE@libffi_convenience_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ++@PA_TRUE@libffi_convenience_la_SOURCES = @PA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_PA) + @POWERPC_TRUE@libffi_convenience_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) + @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) +@@ -260,6 +264,9 @@ + @ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ++@PA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@PA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@PA_TRUE@src/pa/ffi.lo src/pa/linux.lo + @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ +@@ -316,6 +323,9 @@ + @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ + @ARM_TRUE@src/arm/ffi.lo ++@PA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ ++@PA_TRUE@src/raw_api.lo src/java_raw_api.lo src/pa/linux.lo \ ++@PA_TRUE@src/pa/ffi.lo + @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \ +@@ -608,7 +618,7 @@ + mkdir $(distdir) + -chmod 777 $(distdir) + $(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \ +- $(distdir)/src/m68k $(distdir)/src/mips \ ++ $(distdir)/src/m68k $(distdir)/src/mips $(distdir)/src/pa \ + $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \ + $(distdir)/src/sh64 $(distdir)/src/sparc $(distdir)/src/x86 + @for file in $(DISTFILES); do \ +diff -urN libffi.old/configure.in libffi/configure.in +--- libffi.old/configure.in 2004-03-20 19:32:43.000000000 +0100 ++++ libffi/configure.in 2004-03-20 19:33:57.000000000 +0100 +@@ -85,6 +85,7 @@ + x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; + sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;; + sh64-*-linux* | sh5*-*-linux*) TARGET=SH64; TARGETDIR=sh64;; ++hppa-*-linux* | parisc-*-linux*) TARGET=PA; TARGETDIR=pa;; + esac + + AC_SUBST(AM_RUNTESTFLAGS) +@@ -109,6 +110,7 @@ + AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) + AM_CONDITIONAL(SH, test x$TARGET = xSH) + AM_CONDITIONAL(SH64, test x$TARGET = xSH64) ++AM_CONDITIONAL(PA, test x$TARGET = xPA) + + case x$TARGET in + xMIPS*) TARGET=MIPS ;; +diff -urN libffi.old/src/pa/ffi.c libffi/src/pa/ffi.c +--- libffi.old/src/pa/ffi.c 1970-01-01 01:00:00.000000000 +0100 ++++ libffi/src/pa/ffi.c 2004-03-20 19:33:57.000000000 +0100 +@@ -0,0 +1,603 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - (c) 2003-2004 Randolph Chung ++ ++ HPPA Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++#define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++#define ROUND_DOWN(v, a) (((size_t)(v) - (a) + 1) & ~((a) - 1)) ++#define MIN_STACK_SIZE 64 ++#define FIRST_ARG_SLOT 9 ++#define DEBUG_LEVEL 0 ++ ++#define fldw(addr, fpreg) asm volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) ++#define fstw(fpreg, addr) asm volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) ++#define fldd(addr, fpreg) asm volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) ++#define fstd(fpreg, addr) asm volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) ++ ++#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) ++ ++static inline int ffi_struct_type(ffi_type *t) ++{ ++ size_t sz = t->size; ++ ++ /* Small structure results are passed in registers, ++ larger ones are passed by pointer. */ ++ ++ if (sz <= 1) ++ return FFI_TYPE_UINT8; ++ else if (sz == 2) ++ return FFI_TYPE_UINT16; ++ else if (sz == 3) ++ return FFI_TYPE_SMALL_STRUCT1; ++ else if (sz == 4) ++ return FFI_TYPE_UINT32; ++ else if (sz <= 6) ++ return FFI_TYPE_SMALL_STRUCT2; ++ else if (sz <= 8) ++ return FFI_TYPE_UINT64; ++ else ++ return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ ++} ++ ++/* PA has a downward growing stack, which looks like this: ++ ++ Offset ++ [ Variable args ] ++ SP = (4*(n+9)) arg word N ++ ... ++ SP-52 arg word 4 ++ [ Fixed args ] ++ SP-48 arg word 3 ++ SP-44 arg word 2 ++ SP-40 arg word 1 ++ SP-36 arg word 0 ++ [ Frame marker ] ++ ... ++ SP-20 RP ++ SP-4 previous SP ++ ++ First 4 non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23 ++ First 2 non-FP 64-bit args are passed in register pairs, starting ++ on an even numbered register (i.e. r26/r25 and r24+r23) ++ First 4 FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L ++ First 2 FP 64-bit arguments are passed in fr5 and fr7 ++ The rest are passed on the stack starting at SP-52, but 64-bit ++ arguments need to be aligned to an 8-byte boundary ++ ++ This means we can have holes either in the register allocation, ++ or in the stack. */ ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments ++ ++ The following code will put everything into the stack frame ++ (which was allocated by the asm routine), and on return ++ the asm routine will load the arguments that should be ++ passed by register into the appropriate registers ++ ++ NOTE: We load floating point args in this function... that means we ++ assume gcc will not mess with fp regs in here. */ ++ ++/*@-exportheader@*/ ++void ffi_prep_args_LINUX(UINT32 *stack, extended_cif *ecif, unsigned bytes) ++/*@=exportheader@*/ ++{ ++ register unsigned int i; ++ register ffi_type **p_arg; ++ register void **p_argv; ++ unsigned int slot = FIRST_ARG_SLOT - 1; ++ char *dest_cpy; ++ ++ debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, ecif, bytes); ++ ++ p_arg = ecif->cif->arg_types; ++ p_argv = ecif->avalue; ++ ++ for (i = 0; i < ecif->cif->nargs; i++) ++ { ++ int type = (*p_arg)->type; ++ ++ switch (type) ++ { ++ case FFI_TYPE_SINT8: ++ slot++; ++ *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ slot++; ++ *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ slot++; ++ *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ slot++; ++ *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ slot++; ++ debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), slot); ++ *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ ++ *(UINT32 *)(stack - slot) = (*(UINT64 *)(*p_argv)) >> 32; ++ *(UINT32 *)(stack - slot + 1) = (*(UINT64 *)(*p_argv)) & 0xffffffffUL; ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* First 4 args go in fr4L - fr7L */ ++ slot++; ++ switch (slot - FIRST_ARG_SLOT) ++ { ++ case 0: fldw(*p_argv, fr4); break; ++ case 1: fldw(*p_argv, fr5); break; ++ case 2: fldw(*p_argv, fr6); break; ++ case 3: fldw(*p_argv, fr7); break; ++ default: ++ /* Other ones are just passed on the stack. */ ++ debug(3, "Storing UINT32(float) in slot %u\n", slot); ++ *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); ++ break; ++ } ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ switch (slot - FIRST_ARG_SLOT + 1) ++ { ++ /* First 2 args go in fr5, fr7 */ ++ case 2: fldd(*p_argv, fr5); break; ++ case 4: fldd(*p_argv, fr7); break; ++ default: ++ debug(3, "Storing UINT64(double) at slot %u\n", slot); ++ *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); ++ break; ++ } ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ++ /* Structs smaller or equal than 4 bytes are passed in one ++ register. Structs smaller or equal 8 bytes are passed in two ++ registers. Larger structures are passed by pointer. */ ++ ++ if((*p_arg)->size <= 4) ++ { ++ slot++; ++ dest_cpy = (char *)(stack - slot); ++ dest_cpy += 4 - (*p_arg)->size; ++ memcpy((char *)dest_cpy, (char *)*p_argv, (*p_arg)->size); ++ } ++ else if ((*p_arg)->size <= 8) ++ { ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ dest_cpy = (char *)(stack - slot); ++ dest_cpy += 8 - (*p_arg)->size; ++ memcpy((char *)dest_cpy, (char *)*p_argv, (*p_arg)->size); ++ } ++ else ++ { ++ slot++; ++ *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); ++ } ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ p_arg++; ++ p_argv++; ++ } ++ ++ /* Make sure we didn't mess up and scribble on the stack. */ ++ { ++ int n; ++ ++ debug(5, "Stack setup:\n"); ++ for (n = 0; n < (bytes + 3) / 4; n++) ++ { ++ if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } ++ debug(5, "%08x ", *(stack - n)); ++ } ++ debug(5, "\n"); ++ } ++ ++ FFI_ASSERT(slot * 4 <= bytes); ++ ++ return; ++} ++ ++static void ffi_size_stack_LINUX(ffi_cif *cif) ++{ ++ ffi_type **ptr; ++ int i; ++ int z = 0; /* # stack slots */ ++ ++ for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) ++ { ++ int type = (*ptr)->type; ++ ++ switch (type) ++ { ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ z += 2 + (z & 1); /* must start on even regs, so we may waste one */ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ z += 1; /* pass by ptr, callee will copy */ ++ break; ++ ++ default: /* <= 32-bit values */ ++ z++; ++ } ++ } ++ ++ /* We can fit up to 6 args in the default 64-byte stack frame, ++ if we need more, we need more stack. */ ++ if (z <= 6) ++ cif->bytes = MIN_STACK_SIZE; /* min stack size */ ++ else ++ cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); ++ ++ debug(3, "Calculated stack size is %u bytes\n", cif->bytes); ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* For the return type we have to check the size of the structures. ++ If the size is smaller or equal 4 bytes, the result is given back ++ in one register. If the size is smaller or equal 8 bytes than we ++ return the result in two registers. But if the size is bigger than ++ 8 bytes, we work with pointers. */ ++ cif->flags = ffi_struct_type(cif->rtype); ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ cif->flags = FFI_TYPE_UINT64; ++ break; ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++ /* Lucky us, because of the unique PA ABI we get to do our ++ own stack sizing. */ ++ switch (cif->abi) ++ { ++ case FFI_LINUX: ++ ffi_size_stack_LINUX(cif); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ffi_call_LINUX(void (*)(UINT32 *, extended_cif *, unsigned), ++ /*@out@*/ extended_cif *, ++ unsigned, unsigned, ++ /*@out@*/ unsigned *, ++ void (*fn)()); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ffi_call(/*@dependent@*/ ffi_cif *cif, ++ void (*fn)(), ++ /*@out@*/ void *rvalue, ++ /*@dependent@*/ void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_LINUX: ++ /*@-usedef@*/ ++ debug(2, "Calling ffi_call_LINUX: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); ++ ffi_call_LINUX(ffi_prep_args_LINUX, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#if FFI_CLOSURES ++/* This is more-or-less an inverse of ffi_call -- we have arguments on ++ the stack, and we need to fill them into a cif structure and invoke ++ the user function. This really ought to be in asm to make sure ++ the compiler doesn't do things we don't expect. */ ++UINT32 ffi_closure_inner_LINUX(ffi_closure *closure, UINT32 *stack) ++{ ++ ffi_cif *cif; ++ void **avalue; ++ void *rvalue; ++ UINT32 ret[2]; /* function can return up to 64-bits in registers */ ++ ffi_type **p_arg; ++ char *tmp; ++ int i, avn, slot = FIRST_ARG_SLOT - 1; ++ register UINT32 r28 asm("r28"); ++ ++ cif = closure->cif; ++ ++ /* If returning via structure, callee will write to our pointer. */ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ rvalue = (void *)r28; ++ else ++ rvalue = &ret[0]; ++ ++ avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); ++ avn = cif->nargs; ++ p_arg = cif->arg_types; ++ ++ for (i = 0; i < avn; i++) ++ { ++ int type = (*p_arg)->type; ++ ++ switch (type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_POINTER: ++ slot++; ++ avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; ++ break; ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ avalue[i] = (void *)(stack - slot); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ slot++; ++ switch (slot - FIRST_ARG_SLOT) ++ { ++ case 0: fstw(fr4, (void *)(stack - slot)); break; ++ case 1: fstw(fr5, (void *)(stack - slot)); break; ++ case 2: fstw(fr6, (void *)(stack - slot)); break; ++ case 3: fstw(fr7, (void *)(stack - slot)); break; ++ } ++ avalue[i] = (void *)(stack - slot); ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ switch (slot - FIRST_ARG_SLOT + 1) ++ { ++ case 2: fstd(fr5, (void *)(stack - slot)); break; ++ case 4: fstd(fr7, (void *)(stack - slot)); break; ++ } ++ avalue[i] = (void *)(stack - slot); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* Structs smaller or equal than 4 bytes are passed in one ++ register. Structs smaller or equal 8 bytes are passed in two ++ registers. Larger structures are passed by pointer. */ ++ if((*p_arg)->size <= 4) { ++ slot++; ++ avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - ++ (*p_arg)->size; ++ } else if ((*p_arg)->size <= 8) { ++ slot += 2; ++ if (slot & 1) ++ slot++; ++ avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - ++ (*p_arg)->size; ++ } else { ++ slot++; ++ avalue[i] = (void *) *(stack - slot); ++ } ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ p_arg++; ++ } ++ ++ /* Invoke the closure. */ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ debug(3, "after calling function, ret[0] = %d, ret[1] = %d\n", ret[0], ret[1]); ++ ++ /* Store the result */ ++ switch (cif->flags) ++ { ++ case FFI_TYPE_UINT8: ++ *(stack - FIRST_ARG_SLOT) = *(UINT8 *)&ret[0]; ++ break; ++ case FFI_TYPE_SINT8: ++ *(stack - FIRST_ARG_SLOT) = *(SINT8 *)&ret[0]; ++ break; ++ case FFI_TYPE_UINT16: ++ *(stack - FIRST_ARG_SLOT) = *(UINT16 *)&ret[0]; ++ break; ++ case FFI_TYPE_SINT16: ++ *(stack - FIRST_ARG_SLOT) = *(SINT16 *)&ret[0]; ++ break; ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ *(stack - FIRST_ARG_SLOT) = *(UINT32 *)&ret[0]; ++ break; ++ case FFI_TYPE_SINT32: ++ *(stack - FIRST_ARG_SLOT) = *(SINT32 *)&ret[0]; ++ break; ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ *(stack - FIRST_ARG_SLOT) = *(UINT32 *)&ret[0]; ++ *(stack - FIRST_ARG_SLOT - 1) = *(UINT32 *)&ret[1]; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ fldd(rvalue, fr4); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ fldw(rvalue, fr4); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* Don't need a return value, done by caller. */ ++ break; ++ ++ case FFI_TYPE_SMALL_STRUCT1: ++ tmp = (void*)(stack - FIRST_ARG_SLOT); ++ tmp += 4 - cif->rtype->size; ++ memcpy((void*)tmp, &ret[0], cif->rtype->size); ++ break; ++ ++ case FFI_TYPE_SMALL_STRUCT2: ++ *(stack - FIRST_ARG_SLOT) = ret[0]; ++ *(stack - FIRST_ARG_SLOT - 1) = ret[1]; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ debug(0, "assert with cif->flags: %d\n",cif->flags); ++ FFI_ASSERT(0); ++ break; ++ } ++ return FFI_OK; ++} ++ ++/* Fill in a closure to refer to the specified fun and user_data. ++ cif specifies the argument and result types for fun. ++ The cif must already be prep'ed. */ ++ ++void ffi_closure_LINUX(void); ++ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ UINT32 *tramp = (UINT32 *)(closure->tramp); ++ ++ FFI_ASSERT (cif->abi == FFI_LINUX); ++ ++ /* Make a small trampoline that will branch to our ++ handler function. Use PC-relative addressing. */ ++ ++ tramp[0] = 0xeaa00000; /* b,l .+8, %r21 ; %r21 <- pc+8 */ ++ tramp[1] = 0xd6a01c1e; /* depi 0,31,2, %r21 ; mask priv bits */ ++ tramp[2] = 0x4aa10028; /* ldw 20(%r21), %r1 ; load plabel */ ++ tramp[3] = 0x36b53ff1; /* ldo -8(%r21), %r21 ; get closure addr */ ++ tramp[4] = 0x0c201096; /* ldw 0(%r1), %r22 ; address of handler */ ++ tramp[5] = 0xeac0c000; /* bv %r0(%r22) ; branch to handler */ ++ tramp[6] = 0x0c281093; /* ldw 4(%r1), %r19 ; GP of handler */ ++ tramp[7] = ((UINT32)(ffi_closure_LINUX) & ~2); ++ ++ /* Flush d/icache -- have to flush up 2 two lines because of ++ alignment. */ ++ asm volatile ( ++ "fdc 0(%0)\n" ++ "fdc %1(%0)\n" ++ "fic 0(%%sr4, %0)\n" ++ "fic %1(%%sr4, %0)\n" ++ "sync\n" ++ : : "r"((unsigned long)tramp & ~31), "r"(32 /* stride */)); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++#endif +diff -urN libffi.old/src/pa/ffitarget.h libffi/src/pa/ffitarget.h +--- libffi.old/src/pa/ffitarget.h 1970-01-01 01:00:00.000000000 +0100 ++++ libffi/src/pa/ffitarget.h 2004-03-20 19:33:57.000000000 +0100 +@@ -0,0 +1,57 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for hppa. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef PA ++ FFI_LINUX, ++ FFI_DEFAULT_ABI = FFI_LINUX, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++#define FFI_TRAMPOLINE_SIZE 32 ++ ++#define FFI_TYPE_SMALL_STRUCT1 -1 ++#define FFI_TYPE_SMALL_STRUCT2 -2 ++#endif ++ +diff -urN libffi.old/src/pa/linux.S libffi/src/pa/linux.S +--- libffi.old/src/pa/linux.S 1970-01-01 01:00:00.000000000 +0100 ++++ libffi/src/pa/linux.S 2004-03-20 19:33:57.000000000 +0100 +@@ -0,0 +1,281 @@ ++/* ----------------------------------------------------------------------- ++ linux.S - (c) 2003-2004 Randolph Chung ++ ++ HPPA Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .text ++ .align 4 ++ ++ /* void ffi_call_LINUX(void (*)(char *, extended_cif *), ++ extended_cif *ecif, ++ unsigned bytes, ++ unsigned flags, ++ unsigned *rvalue, ++ void (*fn)()); ++ */ ++ ++ .export ffi_call_LINUX,code ++ .import ffi_prep_args_LINUX,code ++ ++ .type ffi_call_LINUX, @function ++.LFB1: ++ffi_call_LINUX: ++ .proc ++ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 ++ .entry ++ stw %rp, -20(%sp) ++ copy %r3, %r1 ++.LCFI11: ++ ++ copy %sp, %r3 ++.LCFI12: ++ ++ /* Setup the stack for calling prep_args... ++ We want the stack to look like this: ++ ++ [ Previous stack ] <- %r3 ++ ++ [ 64-bytes register save area ] <- %r4 ++ ++ [ Stack space for actual call, passed as ] <- %arg0 ++ [ arg0 to ffi_prep_args_LINUX ] ++ ++ [ Stack for calling prep_args ] <- %sp ++ */ ++ ++ stwm %r1, 64(%sp) ++ stw %r4, 12(%r3) ++.LCFI13: ++ copy %sp, %r4 ++ ++ addl %arg2, %r4, %arg0 /* arg stack */ ++ stw %arg3, -48(%r3) /* save flags; we need it later */ ++ ++ /* Call prep_args: ++ %arg0(stack) -- set up above ++ %arg1(ecif) -- same as incoming param ++ %arg2(bytes) -- same as incoming param */ ++ bl ffi_prep_args_LINUX,%r2 ++ ldo 64(%arg0), %sp ++ ldo -64(%sp), %sp ++ ++ /* now %sp should point where %arg0 was pointing. */ ++ ++ /* Load the arguments that should be passed in registers ++ The fp args were loaded by the prep_args function. */ ++ ldw -36(%sp), %arg0 ++ ldw -40(%sp), %arg1 ++ ldw -44(%sp), %arg2 ++ ldw -48(%sp), %arg3 ++ ++ /* in case the function is going to return a structure ++ we need to give it a place to put the result. */ ++ ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ ++ ldw -56(%r3), %r22 /* %r22 <- function to call */ ++ bl $$dyncall, %r31 /* Call the user function */ ++ copy %r31, %rp ++ ++ /* Prepare to store the result; we need to recover flags and rvalue. */ ++ ldw -48(%r3), %r21 /* r21 <- flags */ ++ ldw -52(%r3), %r20 /* r20 <- rvalue */ ++ ++ /* Store the result according to the return type. */ ++ ++checksmst1: ++ comib,<>,n FFI_TYPE_SMALL_STRUCT1, %r21, checksmst2 ++ /* There is maybe a better way to handle 3 byte structs. */ ++ sh2add %ret0,0,%ret0 ++ sh2add %ret0,0,%ret0 ++ sh2add %ret0,0,%ret0 ++ sh2add %ret0,0,%ret0 ++ b done ++ stw %ret0, 0(%r20) ++ ++checksmst2: ++ comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, checkint8 ++ /* Up to now I don't have a way to handle 6/7 byte structs. ++ The values are left bounded in the registers. In the struct ++ itself they are left bounded. */ ++ stw %ret0, 0(%r20) ++ b done ++ stw %ret1, 4(%r20) ++ ++checkint8: ++ comib,<>,n FFI_TYPE_UINT8, %r21, checkint16 ++ b done ++ stb %ret0, 0(%r20) ++ ++checkint16: ++ comib,<>,n FFI_TYPE_UINT16, %r21, checkint32 ++ b done ++ sth %ret0, 0(%r20) ++ ++checkint32: ++ comib,<>,n FFI_TYPE_UINT32, %r21, checkint ++ b done ++ stw %ret0, 0(%r20) ++ ++checkint: ++ comib,<>,n FFI_TYPE_INT, %r21, checkll ++ b done ++ stw %ret0, 0(%r20) ++ ++checkll: ++ comib,<>,n FFI_TYPE_UINT64, %r21, checkdbl ++ stw %ret0, 0(%r20) ++ b done ++ stw %ret1, 4(%r20) ++ ++checkdbl: ++ comib,<>,n FFI_TYPE_DOUBLE, %r21, checkfloat ++ b done ++ fstd %fr4,0(%r20) ++ ++checkfloat: ++ comib,<>,n FFI_TYPE_FLOAT, %r21, done ++ fstw %fr4L,0(%r20) ++ ++ /* structure returns are either handled by one of the ++ INT/UINT64 cases above, or, if passed by pointer, ++ is handled by the callee. */ ++ ++done: ++ /* all done, return */ ++ copy %r4, %sp /* pop arg stack */ ++ ldw 12(%r3), %r4 ++ ldwm -64(%sp), %r3 /* .. and pop stack */ ++ ldw -20(%sp), %rp ++ bv %r0(%rp) ++ nop ++ .exit ++ .procend ++.LFE1: ++ ++ /* void ffi_closure_LINUX(void); ++ Called with closure argument in %r21 */ ++ .export ffi_closure_LINUX,code ++ .import ffi_closure_inner_LINUX,code ++ ++ .type ffi_closure_LINUX, @function ++.LFB2: ++ffi_closure_LINUX: ++ .proc ++ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 ++ .entry ++ ++ stw %rp, -20(%sp) ++.LCFI20: ++ copy %r3, %r1 ++.LCFI21: ++ copy %sp, %r3 ++.LCFI22: ++ stwm %r1, 64(%sp) ++ ++ /* Put arguments onto the stack and call ffi_closure_inner. */ ++ stw %arg0, -36(%r3) ++ stw %arg1, -40(%r3) ++ stw %arg2, -44(%r3) ++ stw %arg3, -48(%r3) ++ ++ copy %r21, %arg0 ++ bl ffi_closure_inner_LINUX, %r2 ++ copy %r3, %arg1 ++ ++ ldwm -64(%sp), %r3 ++ ldw -20(%sp), %rp ++ ldw -36(%sp), %ret0 ++ bv %r0(%r2) ++ ldw -40(%sp), %ret1 ++ ++ .exit ++ .procend ++.LFE2: ++ ++ .section ".eh_frame",EH_FRAME_FLAGS,@progbits ++.Lframe1: ++ .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry ++.LSCIE1: ++ .word 0x0 ;# CIE Identifier Tag ++ .byte 0x1 ;# CIE Version ++ .ascii "\0" ;# CIE Augmentation ++ .uleb128 0x1 ;# CIE Code Alignment Factor ++ .sleb128 4 ;# CIE Data Alignment Factor ++ .byte 0x2 ;# CIE RA Column ++ .byte 0xc ;# DW_CFA_def_cfa ++ .uleb128 0x1e ++ .uleb128 0x0 ++ .align 4 ++.LECIE1: ++.LSFDE1: ++ .word .LEFDE1-.LASFDE1 ;# FDE Length ++.LASFDE1: ++ .word .LASFDE1-.Lframe1 ;# FDE CIE offset ++ .word .LFB1 ;# FDE initial location ++ .word .LFE1-.LFB1 ;# FDE address range ++ ++ .byte 0x4 ;# DW_CFA_advance_loc4 ++ .word .LCFI11-.LFB1 ++ .byte 0x83 ;# DW_CFA_offset, column 0x3 ++ .uleb128 0x0 ++ .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] ++ .uleb128 0x2 ++ .sleb128 -5 ++ ++ .byte 0x4 ;# DW_CFA_advance_loc4 ++ .word .LCFI12-.LCFI11 ++ .byte 0xd ;# DW_CFA_def_cfa_register = r3 ++ .uleb128 0x3 ++ ++ .byte 0x4 ;# DW_CFA_advance_loc4 ++ .word .LCFI13-.LCFI12 ++ .byte 0x84 ;# DW_CFA_offset, column 0x4 ++ .uleb128 0x3 ++ ++ .align 4 ++.LEFDE1: ++ ++.LSFDE2: ++ .word .LEFDE2-.LASFDE2 ;# FDE Length ++.LASFDE2: ++ .word .LASFDE2-.Lframe1 ;# FDE CIE offset ++ .word .LFB2 ;# FDE initial location ++ .word .LFE2-.LFB2 ;# FDE address range ++ .byte 0x4 ;# DW_CFA_advance_loc4 ++ .word .LCFI21-.LFB2 ++ .byte 0x83 ;# DW_CFA_offset, column 0x3 ++ .uleb128 0x0 ++ .byte 0x11 ;# DW_CFA_offset_extended_sf ++ .uleb128 0x2 ++ .sleb128 -5 ++ ++ .byte 0x4 ;# DW_CFA_advance_loc4 ++ .word .LCFI12-.LCFI11 ++ .byte 0xd ;# DW_CFA_def_cfa_register = r3 ++ .uleb128 0x3 ++ ++ .align 4 ++.LEFDE2: +diff -urN libffi.old/src/prep_cif.c libffi/src/prep_cif.c +--- libffi.old/src/prep_cif.c 2004-03-20 19:32:43.000000000 +0100 ++++ libffi/src/prep_cif.c 2004-03-20 19:33:57.000000000 +0100 +@@ -113,7 +113,7 @@ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +-#if !defined M68K && !defined __x86_64__ && !defined S390 ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT + #ifdef SPARC +@@ -134,7 +134,7 @@ + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +-#if !defined __x86_64__ && !defined S390 ++#if !defined __x86_64__ && !defined S390 && !defined PA + #ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) --- gcc-3.4-3.4.2.orig/debian/patches/ada-generated.uue +++ gcc-3.4-3.4.2/debian/patches/ada-generated.uue @@ -0,0 +1,523 @@ +begin 644 ada-generated.tar.bz2 +M0EIH.3%!629369#XX9$!3>]_Q?_________[/___^O____H$````A``("&"2 +M_OJW%&^`7&``-Y5>5Z`EJVI,\>A1LN!7E`:N\W'N\^\=.C1N +MP=44[MUI]WIQ=.B7:KUW:HV7Q?<#??<':SUG=N`Y/660>]CCO2.V*)*J4^WS +MFMFI%H-K3:91MM'WP18[AU.T/0HH['2]:)@V7;MAV9I2AS9(VS-E)"L` +M1:VS%5;CG7;"6E6U`R:`T*T9@#%:00VU5%301LU61!54>\G8$`.GMM&VSAUY +M>M[7>)U2JNRZHTU`#5JJJJ-F2N5E;@P::!-"!`C4::$TFU3S4&IZ,J>C4_5/ +MTRH/2#;5````])H!ZF0`$IZ1"((B:*GA-&D"?JGHF9-3!#!,`CR@81H9&)@` +M@/00&JG_M55*FC`F``$P````"83$P`````31DP`$GJE%$$:1)DU/-34Q/:H' +MJ``&0:````-``````$11"`@$9`F"!H0-`!&FFH,F"8&IAID-,H>DR:::-#0* +MB1$!$T)D:$T$R:FPF0U3U'J`:`-````!D]0`#0]3_JG^O^!^7\Y]=.HU36D4 +MFR`GWOM?:?;X#VF_ +MY_VYP$W$"HM^W_H`,/^W^-3*LG^O]R;YI;'JF:,H#]6DC0I1PUIO\]EUCE)< +MK36VKPUS]R\T),A$TQ%9;7^?1C3J*TTFFZ51\[)>N]Y5T'FS_1E&?_.N=MO.==NL[Z-]] +M]]XWA>NYF.\[ZZ[V.[[TWO7?5WWU-WSOG6M9.'77"'9WWWWUUIOLZZX\[S-S +MF[[W@]WS>^3F]V2.S +M>```````@`#``,!```8``!``.K*X``':M=P&","!``!U:LX!W<``B@`!VE/= +M?>^GQ\=FM?N?2MNVWM")01.`B8$3)1?QPCETTYZ7]/IE!^%BNFWBKP)O^:'C +M]^G1N^/LW=&>2H?((Y@(=:@T3G(E04$/E2*.A$%0AT@*)$1]D41(21Y[/LPK +M9J*8XG_BPU%U'V^GU>OV>;33333V^_[?5XD$1Z^GPG3,]V]9]\[R__?E[\^/I??9 +MOP`=`AX+,+$KIJQ&KSF;]?/.GY>NSEGWYSUXG+>5S5R=DJS;2T5H*="F*P0] +M>,-=P_^NGS]WOZ^J.^N=/RV3Y+"S90>0J&@GPE1);9%&$+I@,0 +M<0MMD480N,)2$+$AB?AH]V86T.V<[G>9XR]SPUIK(?7XBY2'0/QN$[OAS\*-E4="559]-Y5#TC +M9)''36^13.6EQQP&3/2X9C-.HB(#&.DQ`,4:+NH]!D]8,2Z,6==QNHY6V!:1 +M,@_L'^@3%O-U'3.?![.B/O+U`'!$]SZ51#=QZC=E`-$T\9`< +MO3($D8R!H*E;"VHU$1:,65=:EVJ2OC6KS;7>(2RTZJM;.Q;")--VW175,&[3 +M70R4#M!AE6ELM*LK"1)#2)#Z>N-J_K5O[#2^]J7TB2;"7YR05]NW*(A`U6+X +MTW93`2*2-H)0A&62MC04@$,DF1BML:6R^^L93UC4/ZVMK*I2-`!')H#D]>L9M^V.0B:^]6`B6<+Z,C)[FPB:?..(XV$2MQ[1UC6_ +M,9\G+Y*UWJ74RA5L3>7)D]FP?.S3=5!LLAR' +MO/S6G\6+W0P+[*[_+4G$0)(7971OEP)'XGFZDFZT'M`?BIE78AR!!%G8YW?V +MR,33>K=TI^1"GAJTVL&A_A9PM:YEGIJ%Z[+WKG:,WOO>B^=X +MY.KYF7O7=[ZY-W#.C-=]M\.N<>^I?'+++CWCKK=[WSIZ>^S6KXL;D2UGN]7M +M:]F<.%O<6IA9IE3IBL8M*M%Z=V-7W +M[;S5]><.MZOON9UG6N33L]GL`HIG>=GGN:[8V8CJ\J_'IO!%=/F9UUJ^[S.: +M>\T.LU=9K;SDYR:NV]PXFWCC*5N67%K62,>-ZT#++FF+S6B":PF:NY9,)9ES +M+Q$TYI339=Z@,RQRF0))=W4NV''+Y99QY<..]0T9O1F9N\PW-8X3W0?`TOO\ +M:?-U,$[H'B9DSA3&&$@&,JL!QD+RO-7[[&@VSZ;JN8VJ#&:;1:,EJ*L:C9*DD2121D0F_O3C-VN@6!U]M,#NY +M<;SN5O+F3/*&'9`@F_*JJ?O#"%F'#"K*P=&W\LJRG4J%5(JD7?9 +M&\F&I7M+R_E7,+P>;+>RC3;AHG*ML8>XUUCGQZ9_#]+]9\IR.0\#^\R<34T- +MYDJ:[G1R[G1W.'X+F\XXD@22:;-8BU@JM- +M+-6(B.M)>L_)EKI1M#[VONOKG-8F9*MMJ/VH^-)=#2ZEC-#9U +M.LK'$/"?C:M_(Z>)",6O4HD2T513\B9W%,2-OAI9[N[U,3'E+1ZP(GZ0BPE +M@0A3^.\=79A +M7+79XX[?/],D=&D/0Q3H('^'GO\6&S[$^@VTTJ(MG1*MJ*6UOIIJVK7X1>$M +M*X8Y/I\/+;GK9MOQ@"9)H3&A37"K6*0F2MI6O6=YAG.I6P\&&C#`5:6Z[N'" +MS9AJJ5"_O[YMRQ:QM]ERUDC9*BI2BK%1/O5OOM\RBF8,4TL`1%,Q&QF8Q)4D +MDCCLZ8[+NY`??Z2 +M8:-#>3R[S+JTI16@I:'L^^N#N,HAVI]E*J=`B3<44=ZIT=YL;SHSNZRU:?!] +M+-:8#D-+K7/DJJ`)RJV24#>46*C/WFG5>R\JQ4]SW3K&,GVQMM%A[Y)75^?VX +MU9T%JV']:I&55>(`\!$OJA$WRB;<.H4PHYA.0Q-#363%LFU#!,6>3UW0R'H2 +M2.IF'XNQ$)V03T")Y0CW:PD2381/2).S:O@Z'XA.PSL>W[E-.'`ZK?DN2R55F'.[Y?# +MGGP9[GJ]/#\C@REBT20FY.`W?T70-K(UF$^VE]2@905SG=;JYS]FCXQ5S`NU55OR)OQX/%:\-3<0-\E+7 +MYTY)C)'Z'W$H[F)MO]WL]GP:WIE=C>WLR:'9V'#AGO01>BF8G)(:>^&F[) +MI/.1>U.24@N4W$?4-478@;D"ZCF6C%*&P41(!!?\K,0W=V[\E4 +M44^']+YG*.SP66!%TT5]UH@B?'PS:43=!OX!DZCVIIL^Q-G.NVZ"TL`**]:G +M$/PN7URCOHRCR?%\/LT:N3YZ^[`AU5T#QSM`VH-`<`!`AEZ&WO"",9^1D$H* +M2+/(=G9PYG,YI$V,6!T%#7*#D.@P=O3XS;8SS\4`$>SKO?H<,:#L.N89$R?Z("$`*6*:N@O +M8OW0'U\A,#J.J/*#:`H'CY:"[[@SGU>9,\SFZZ93V^+Q^+KTXG-(92)S2)A, +MIDP3CQS$63BHJXQ9!B:#7%!ZO?G,;C0-@1Z5$#A,\X$RG`I2A"!4!$B@7;\X +M)*'6G@%!RG=KS#K$^CGB=#JGV=;[FM==7.8TV.UO;0M]&EI!Y*@PR@*L`*L/FAQ*AJXG6TR;;NW!2 +MQOYTS;2;\>*QC>=&O?I3"(.6.EN3BU71K,J?R#]'Z!]K!/X_">^,-GNG"\(/ +M/MSQDZ_)Q/?W?-G_/['NVW3S<&]7+=KM\NWI_;%5/WO:U2T[;A#V45?OGS_< +M]7K_7_!^'[_W]MMMMOPF_]7M^K_=]W];>J=AW_$6V^]:."$]9G"*3ZVN'2=`=$@2C7[%@6G< +MEIX$O?.',T9YWAY)O9LM2AX5MI.67>2M)6&]:K6:MFL;+#H2 +M!B/*3C5DXG&K_S>1,X5$`\7_X?/^NWW_9_-_X_H^O]'];X?#X?#X?#W?#X>' +ML]1\E]?FJ*')\_B+^J^K=(37.#V77&QI<.LBIYSUH*'\<1$_)^7\?],/IY_) +M^+/]OY3^+^W\O]?XY_5#/Y*=']G0;^K'Y^P07HW;B?GE[/[/S+SR^K:#BWAU +MN.ISR7]CSTWG-OV/A^*:\#E5N%?$\+N^AJRXO8M.3>U97C08Y8?NU\O+:SX? +M7SJ"9OG"X,:6Y&I+];S6G)6[6''7H0M7/'"V#RSM%NO*FGPSUY3#1XX@/IU9]7JVZWM;:V/#QZVVHSKCT=8&- +MNQ':U^N^\B"Q9>+X%<^%Y=MN<6P;<-S[Z\]+W&FM5:.>^B\N?>>>-;]JZ+;3 +MI.FO*=S68G.-=^;8UQJU6?.^11Y/V;==^7&NFJ]&QOOEJV%W6,'P#=?XK1UJ +M_/*6\%MV%MNN?2`@##EOZ%\=N/+T;KX9QMX^W;.WSZ($D^=!;():DA:1"A`0 +M(B:KWB+]5[VL.['G+\])[,[-K9FX$:A:KA5VKIJ;"P-L;VVTFU3&N--EL#%L +MYQMORG:.W+.-\<3S;KRY:."N/#9VN'VC1;5TP-AY'N\VO%Z$;7FM)[[VROC"ZSRZ\+IG=K[7[9A^_;F_'&G/58/5>-%[ +M\N?5=/!A/*W(;=._CG;P7<<^VCXYD=$\6_7''CTG5.OM\-5%1^&'WO8GPP9# +MUQ/@EF(-_A6_JY.NLN[EW=XYN>+H&[+F)*(&,2TEY9C4&TJJDAC4$ +MRZE"6W>F(Y,2):42XH:$7LWDG767=R[N]\W.B\])5ZY>+O/ +M?+UNEI55)#&H)EU*$MN],1R8D2THE\5\2+V_SNQLF-I6;1J6RTLVE9J4VFIM +M*:LU-I4VEFTLVF;1K:6DU4E:5;+6:LMHVU+&U-*?2VM?!'A[N&/V)C +MEG=OQIDAI]F_[4B='S15_4BH;?N33'^V"A!8`0"+T9S8%)TN+)"XHC9!"_5Y +M64J>]7+P?>1`+FVZI'DWK!UEMU!N$VS-:^;TNV?W[ZZ:_;GH +M:TQWRN7Q,S+N99)+ME;5(6?%P;8_T[G\B&<3WWMG,WK(OHHJ$W#2C=WK^+K+ +M68T6FM(5PU?SN6IGN[YGTL/HX:?4/#<[;]9EYE;OUJ;0ALKE^*=$ZE= +M8T\OC=+6G-&AJZOJ[;D<&Y2T:;=Y0/"BN&L.&Z0VL)67>#C1@ER<'#.,29,U +M&:+&$&MY9A;#,C"3K67CUNU0<4YO=HO;U+('#:G*J@*.P"BK/QW7WNL +M1F51$1&1#6-L:UC:HQ;&"I+;&Q5B+:*Q&,=557]+6V_?5^S_+M?]4O^L>X?: +M/F^KW#\PL+@@$!$(SR$`]M^;]BGD']'BZ`^K]/V_=T;[?N\_NJI9:-W/W7B= +M\Q%Y!_GZ5F2)YQI2I3%3:L+-1=8I8K"FS7$B2ABKK$,6+FVHN0UK/T>]WN#: +M],F75%/NI=(%8R+5[[+6^$TTXTW-ZWFM]M].$``&4&J`B$"_$W\>K]JHK1: +M9:C:V)-;Q/E\+/AP#C(0D59$D20"15D&='7(3S/T79TIGC*NH'_!AP:!:*\U(4;= +M*LAPET\@8MK%<_0_0S/R[EKG5]?&HA^GRM*EQ5R=I:#2)A+^I%NNDKTYFK77 +M$H$QB\+GJ%3JBI(D\$HF[CG>F[T:;S^$XXXF[?JFGIG3O[L=4WIGT\=_^P15 +M/[SD8*UK@1/:D$.=]H/Z7XWW?)/<^M]SN=PQ1CP*'W%C!+:O=5&MRU<+6N:Y +MK5\>/MP/AW]ZS)Y//H>$T\ +MXE/X$\Z?X)\Z9.*?6XI<<2<9[).?LQCU;_)/L^WNGCVW]?U'2+*[!1&&- +MI-2<*)0V45A7KI-X6S79L+>D!07HE4'W5<)1-^0J8-8X@R?B_[_T2;DV$TUE +MX=28\NG03W*,HGO6G1Q"WWS6.\++7WUG*,TI9!2AB2*M1;#Q&(D8J\V6M\RJ +MVO/LK#QC'5_BSE[]7Y[E][V^M[OTQ=PB]S\WXQBC"09%9"-$&2H1K?_F_AKZ +M]ON>(^M7CZ;T.&I1HSXSQD:RVK%;'H@5!R0%B9522223R_JJQ.RQ^OG?BT.! +M0>K;M[=DWZ\+>E+="EA).RV2$@_=.?M83W7LOK<7WLN_H2*L)%U,1_Z_76(22=57LJDZ*I).%[MG*PH8A&0"97KPS$DF +M;6]8E+))RMS?W<;YFOUN-#(:R32V+XH=75#?59K*B+L.4H`/+:X8K..T-:N= +MJ6M1%[V5D8S;%E?"ER@4$G15%]T8CD"2$)((!)()!*$%'XK +MU\@KZ5MAM&!F=:`&J"Z@Z#F+>=2?K +M6JK':+;A5TJL[3U46QQ#=;WIPO[I'J/[Y\!]7YE]#_2P'JIFKVIX>[IV[=N[ +M^#6[]?*+K>/`8J/FJHSG'*>\6#3H^EWTG`?0-=""2FJMRNS:XY@HV=#LHQMJ-=K1S]G)N^B!=4!1)$+&8$%-(P7\UJJOI82-$ +M"X9?E6]]&A!@XW5_F-5H+U:>%"_%2UG4XLD>VUFOO-B_.RV-X"H3^N%B+=-* +MS92?UK>^^)'-!@DXQEG&-IOR>FQC"U:K1^O.,>2[>NS5Z=\VV6V,BM<7,;*F +M/+164$%00P5055E)4LH12BE2BLH89GTZ3@8)E`4)604T9LE]3;EX[-51FH;Q +M6VF;.VEZ@P??35E;S>E#^^EIX02K]I76(P],O>RQ<0%U"A_A*]N>\N?A+/.& +MG,MM&VM17P6L/MXC[#[D]WR!Q\K>H']Q;.!^84?#.G'/IT'#&._2W9JQ#K,Q +MZKVKVKX7.E[1I68?.B@(\5#U?D64\U9B2"$N+`B6MDK[=]_G?7OX\RS#WHY\ +M>>KDT43Z^I=L5QBU8IN:WR]'$+]4M,0&)-H:@]%CY+&^L.?PK'$[#$6TRS?- +M=MHF;$0#9;&_%IR1!\[+?2&0_?"L@M&HW<%?'O_3[CU@8WVQTQH-+<[;+>&K +MGG03C.96T3D1-I5Y#7$:;5L +M=:5Y%F;JLUK`<_A6(U0M'A#!D&57Z%Y`S6)#\ +M4V(A&/U+%W$\+!^^6?-K=:\/'X_:6]WK^/[/P!_9<-:R:Z>&[;\".3&?'PZ7 +M9K^D2_Y,1>CX$;0\869H8U;)N6*)=]62@"$(:O;.)BSJM1E$I\N^6)0-:^WM +MU;)<`@^MV8:JOR*[!%]I;=\Y]C3)XV6VN_&;6B^NH]]PHOX2#DU:GJYD\==: +M,76S=7AX2,*MSU[?Y]LYMIG;-G6=9TVP<1@O;G>B`/5KOZ&_`W2$CR"A1TQRYZ#;7ESYWI6O:_(4V +M/A+VOT?#JM+,WQFKYG:_($/A0)9!;/41F$4V:&F-):7T5]WP577JPS+HO':: +MUN^WOQ+V3=P^,F<(%WX[WH6(=$LXDB(PLN%>,,@5\'H/8!^7D.G?I[++\_O_ +M=S\7M?5_H=&KU/U;/U>:ZYUUFKXZ-7J=6=)H$K_C/U`PG9_$?K/#INW%54QM +M^Y_*[NK8OGQCQG\>>X6_'QLYD-SDX+?.;X>#9[#AL\EF%=&CAAV'9X.C8(5^ +MMZ.^F86<^=^OV9PZXSHLZZWUUSEOL][NX=WJJN[T8/.%)O^I5!BU%J#K5*3:E42-@P<$4'&H8*(%A]`N'`2PM(LFI0\NO+I`&F +M#L^V?HM&EI`M`8HQ1`G#T]^)T:3H^YUNK[L&Q=>-`,8/ +M)]<[6C2T@6@,48H@3D]/?E.C2='Y'6ZONP;%UY:YSRA,8N.PL(`T#BX8*'&O +MU7V?4X:+.XOR'19T>#11:M4B>S9[GA]W+;[]\U5W=UP[/N-FA`P/D^!*LP.B +MQ)\5V\N5;:59X.%6$-FS#1\>EH3A9V(GD]#1T5LQP\P(G)Z%'R?&/X0(AH(( +M^V*(`?YGD/F_`BA]"#_1/9-)].8<`\'/[@'KQSG#QZ\'#GH\'`/7[7KX!\`Y +MSA^U\O7CU\#GV?#QP````#UX^CGH`#AS]KQ]'R^!SY?#UST'BL<;5MXQMT[= +MO\9QVQCQC;^VX]O;'P#^O<\?9]7R/AS_0>/`?F#^D\?@<#Y<\<^CZ@^KU]7# +MX?#X>O7CX>CQX\>O7/`?1SG#P>C_%>O!SUSR6?NS,^UFG[VW,=0XLDY%#@9* +M$(0I%F+F8T2JC1II-*VQI4:-L*QLO*\NNO;M;M&MJ2T&FO3KK5[+=+C$P75) +M>UTFN:3,3U<,Q.7$F&#:WM*,+5HJ5I-M,:(E%:5--L74;&6E2U><>5[;K/.[ +MN5W"5Y6\NO;0*W@ZE)9>6[;EHP5BT8-2E*^FJVI:O+R2Y$NNX^+D5WQ$NEO) +M:L2ZMIHQI1J-+7"(#=")^\`(Y`$?Y_T?P_H_;_8V_1O.'1WO5UI_8FFG3KK^ +MA-$]"IG6:;T!$/[44`/L_R_+_?_)^*?SWZWU_VO\?I?/RW_X\?M[^',;`_O_ +MX_O?\[?O:C]['V3^GG7*/LC7I2V^P?SN70GICQT-KZ;7WYXC'H[=9[:8M%^> +MOV=2%7?[OK2N_/1M^_"[>'6G3])K7*-Y]ND>&G^;:^N.==?&>+&W/Q\;6VQU +M?+[;ZV]'CGC[E;.[-Y>AI[^KIXY]6=Q*)/B_AX<_';U>>X\-EZ/;R[]]:_WA +M`$"?D0>A$_5]J#^`8@?13!_2GV$T3ZZ?Y)_=J]KSM_N(RZ^BEZMD8I8L%*2U(UD +MQ.#,;I*I9(DD@;$+VW0Q>%J$B@F"U_/+"?\:9,7?6J2*I@MQ:(3=5:1`O2X* +M6]!3!$MDM0Y9G?,251(A@MXTJ!@MG*`"+\/Y^>/S`_@0`_'C[3[/PN*_11DA +ME"LI+),D&P85M@EDER%(E(E#W!;9* +M.13%4RI5+-"59%R6ZV@8"T_F*%`D1,%J+(&D5P8NMH=ER3$S1+2H!?YZ'R)A +M/+(I!DFO#"82;]1&G32KF4@:DNEL@LY5`0*17VJ[JU^)1-+A-,:E?*]GC-I) +M`)@595`XJ,JK;&6`2+@4M4PI5*J"$P2IOEA'JE7);K0H,BX&UWM6A"*R*DD( +MK(N"I*RH'=D&@1\2IH)#HA'2PPN9#2:F]SDA$C-$58 +M:4DVVFIM5E:4TI4-9(SHJI[$GAE/V/8GOIA-$ZX,($(L(E&6:@DM%_F[-KA9 +ME12V*LLL6BK:^VSQ(*?A[F?&_-J3!":4:@0"=^X;A[VA5P6YI2(`ZY&6<3M>.2D;>7=YW8> +M3O>W/)VOER;Y:==29:C6DA``XQI&TH=L-3%UH59%P6[4T9J1:+87&V:[XP73 +MMFB1I"5EE:]V#12KH:6HINU-Y:\R-QD8MB+%5*KC\;!5A$[T+D@#$^.R-(0A +M`V+4W521P3$]LXY7X:]%^?5:YOLMKDK&VBT58U1;1;%:-1:+16C:C5&J+8K) +MS\O.58M46HV-C9O';&QJ-:-C4;"[BW?:,WQ5H,BQZ*4A(!""D@+8+*/?'[(T +M2-([Y!B+8=1F'687,T8\-,EHJBT6R7A?.F5%5;"^,,S&6#\D?W(^;>Y.6=B: +M3325D&=LQ84EHM'U<&:5JID"04]Z*G:2=A4A%>R)^;]%VBZ0*,XL8[IF4\,E +MQE6>L?A'TC4@]P(D_N1@(D_5']V-Q_)V2((X"(^204@2H@80@RD'D+E@GWR0 +MR;:Y&T62HB+$L9'JM748G]8X(OQ0*\X&0(552JD5^QD1]4?KC;\P(D +MR,W0E\8/+6?ADTNKYQ![79$WB)42HWG"60_)MP-8:F&0OZU9(DH3IC40(*HQ +M@1%="WJM6<+82.3=<0D$P,L31K1('7QJG6)_D>X#4,R7\+&,8QC&,8QC&,8Q +MC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8Q +MC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8Q +MC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,8QC&,;K57YRZEIBI.!*G*6!-*A8 +MK)-\X#@34Q?"Z$]OPD'(1-`_6J1TL`=HB218!'_F*Z@`B]*?`E1!%\$^5(FB +MA<-Q_]KC8``))&'.[BXN(8`DLDT8`D``$@`$C$@D```#``````%H"22R```` +M(@````DD8FDB<&ED#<"20```!@````,262<())````)`+@DDC`%D$@`%DD`` +M```$EF@``D`F@``#@```!AB0`,"022"20!@230`"VVVVVV\`%P",Q`%Z@A&( +MP""IN(86:F9@V%EW!3(D58HN\&S6&[;DLDI2R?YP!&+A@GCD"/I(.A/>G:8[ +M,'I(*IW1?=3@2);%DDDJA*J%55B-:OQ:JI;;:T:V[*63)9-!5&SQVU?BNZ^; +MKRGE[V[6-@FE*34BM^3W">Y(GPI4RGT#5&Q7JG&>-$^[=MJ3%HK%8U%HM&HU +M&HU&HJ-1J+1J-1M%HU&HJ*BT6BK&VU46HMG=5V_<)=L;/YW3@UCT8Q+SAU:3 +M^2`_:C\D>K[>(_%'N=MKQ;%J+:*BV*P6J-OSFU[VAS(681,BVK@:N"8Z;3M) +MTQZS=16$A15BI(EE1RS).WG?R^XU&R5/(E'8 +ME(1VM,A*;%*K(HB,)$"!P+5.E.I,/H2!VIA/5JY(^\FJ=T3Q&3BBV2V2V'?& +M1%\EQ/9<5IF:S`&$"=$JS(RKEE8.#^F]6'V.D!X?@SW5U54+3YS#%DH][,^[&26R:&8?(PTNMY]^H1LB"J"34Q2R +M_EC`9UR&5)0V-62BFE&W:JUNJM;IL4J")SD1]*EL32PG*%F6$>J44M=H4RVV +ME;-K;;RU=VJ^TI9NBR+FV[Z=K7/C*Z%+51TN24J.3,Y/!(G_G*;^ +MG*83ZB`/FZGDG17J,P_'A9AGNQ&5%RX%V7$[_+-*7XY$RBR+"E%YY,TP5"C( +MHQGQA1R3">*6&"W%I`B$(**R""8+5$D$W1"NT*D(U,GOIA/ +M0F"BPA5D3I3(6R6DM%+$[,P>:F1%"*>UHW(&*+@GNA1)%D6(0L;&I+]FVES6 +MT:GQ.L?L>7G?JK0'`VNYK5BD(;B0J!8"2(2(^\G2D3FD0`RI\Q#^0_?)_4?B +MI_'_*0_20^;W\O(1W7#_9VO;VWOL&H@=UP_IW\GQ>^P$(2'E]CSR![_O?'5/ +MQG\Q_1I..[B9SB9G]9^,?R;!`DD-QJC@ZSDIN/FGX8GDN79)>#"\E5T0GBJ.K% +M7JNJ^"JV%?'2T2!1I\,PEMG4`RM'R;W&<=JKD_Z<9AM,VLS8+4M'"E6:=J[* +M[=FZNW71=?-7Q\0$M7U=1Q_T,')PKG%6KQF*MNM(Y2+)U>K<#;G@DY;;[V>, +MF6WGA;;V=5W5LFVS9L=!(+5"O3NPJ)(@2($@EW>D`DEZ#+3NOGV9_I_R535*--*B4A/%8!M$+*AY+/NRRXP +M$1N$N$LES:O;>W&,`9.OU77X]@(.4:U!@',/DVD&#&)-F!0/CQ>=SHUAIXY: +MFLJ;UGZ-&LW2:^@EV::C/)/"T.,X4MRLJU;]&WPE5QPM[5=XRXF65\&?M]/I![?O??'OL'O=".W7#.RX61669II2& +M;Q9%;/!0ATCRJ)UH55%6WXR>67A`_!'>A4 +MKG7.NW5+MKG%75\R8[EJ;[S6)TD3N;U#">K/NL\ZK:>7'?_%AYTQB=SO) +MCW+4YS-8G:1.YO6]%4A`$@4B4GUM[[OS^(1VVW7`D"#M8&?)WW9E_$JQXU%7 +M!$:VV%RTM_.ZRB]W6DYF(J"NYC>X`=7"*(.[H +M/IOF\\@]RI5Y?>]]NN72$KLKLRQ5PT5=BKNK/1LK76:&FA.`)?KSCH^/X6]S +M-+E;Z\BK?U/0&8*O`.-^&94,/C(Z&/%M^+4[JTG\;J.T\>%)*J"`$GQ!?0<+ +MAEJVQGJOOES-G:+3%G1`F$W65V94+\^Y;D/.#?Y/S??HEYAUT*K<(K[^\S"3 +MSV]N#NN'TNZ#SYOK=WO>T5LPNQ5NK$J[%7[51]B5O\&F:N[DC,S!556\5=U5 +M>-T)QUR>!6*!))())55!)'6R[%145IR059Z*,/Q?=>+7U^I[.%9T?NBK9O9= +M96J"M8:$4N]&J3IAUNZ#YM=T'Q;]_] +MZDLM;:P@QR0C3HVD==&<,$J`CRGHC4PR)8V))FTF*2LE%F9A:`PFFNZU4,2$ +MK@DMS)`,R^*_O[FUA:4L:*B*2+;>JKFN;;HS44FHT5$4D6VY5T/'L58'Y?"S1AUT*MGFM"H9@JR@9BVW2R#:?3CSEJ5[-_*W[S +MZET=CZ6GS\+?W#H^OP:8R044%=LI>M:&CD7YX6VZU9:MK:LL'H\MCO[+8X3' +M9]5!NPKP^"*^.QNQ5\_G:WPSGW0<+;LU9'-8N--W#AI,"><7`0`H$3!4S3NY +M;%.&HGO.LMY>SQL^F_*:H\E<*#Z?$`PDJ-!&IJUYY?JM>^@`"&MOSOR_7;[7 +MM?;=/>JYS$Z3UL%J3(HC!4/4<\\O:MY994+)4DD@8U=K*:I*RZ[:9Z=EM +MMJVWEQEW,\H\)PTDD]6G<5Q`CM`7J;(KX/%&Q\&DT,DC'T=%'7+ZK(G*NPUK +M4U8RM3&(C1IBW-83)=4QK(F-,M+?1AY:3PZ*YG#;)UD[2QC&,>ZZ&D-6:T*ODVZ/0<*_` +MZ^GSUK&\SKP^"+3LD%1H.;&TLLML;8W)=HJR)%D(QD15P\":">9QT+GMS*QH +M6[NR=5T+#T.&7+'4+S6M%D-%W+LG1401`&]R;E;\%@I +M)9U8K;>O)/"8,62GN[PT%XJ52JI"`02#83ZE)!'P%R[-LJM&:JS#`P2S9!0V +M!>]3,QO,J:E,-7#-&L%K-D)IC1C-Y+N.R9D-82766&QT:2OR%X,JRMTB=[%7 +MT<,.?9P9PYP5>P+KK?0TC&O?VG;=WG?8J]4$@BNBB28?I>WMY5^E7W^?J]CN +MX@U/+KAK3F3(J[VMMTL")3ZFM+;>^UZ]Y7M?"$("`D#?CG;F/?Q^;6>31%98 +M%;/9K0JNJA%8>!##9K0JY=4:,P5?5:]O/Q9PUF97=:/?$6'1:;[0+$D#(/:I +MH'`AT;:V':6XE:2L:LEW=RBVVUKKYFG*U +MJHA\7KA:&-H66U?K/JPUNIA"EF79>27*R@@EA9@A;:W,LE,A&9#,RR-]9K1F +MJCF0S+:JFBAH&DI1*::V?(86!WZ7\5_?]/%FC[7:6],^%$PA]B7EY>.33U8< +MZWKMZ[R)AAV=&-+79T0T=D(:!HU=6.:NS>^9W<[,WF2[[O&SJ[ZD[UWG99V[ +MK'G?=Z-'=W-F[ODG$#Z>8D[-1S:4ZPQJ:8N9BW&)Z*BNDW(Y:-\GJZ +M\K;?A'*\'K'K9"V2;<]CF?-I[V.KUKODT062(J]\Y&9>+9ACEPR7<9F9>>NP +M[.<%71(*KG?;Y#XJC"V*YU<5B[-JVE[[OADO2NZR;L7#!S@A00[PUG7O8J@4 +MZHA!6%5LNQ5K5`>CL]4['4TD]>O5PY!JT6E/NZ+-2)W'2XD?,BROC:!98>!3NQ>1,1$0T,JD\U +M"RZCERL9%&RXFUK6>!$&>MX#PW,ZJ3>K#3-KXE<8IW),W+11$!:=^S\_^37' +MYZET_,[C?<\%^+S.M9%3&$)\]][U??-O/?%1I41Z/K<6)&,=_$;J,+L2%@@V +MVVW=L98JW=WX.DT7@LNW+AG6K%,(0T)=1NUK62\A&9XF9INX6RX1@0\EA]0\ +M8`HJJ0DF0M(230-;;MU&,23A7(Q370Z.A6-IFT;2^U]*_@NOK5]/O`0?'VE8 +MHF8*JBK9HT9@J^M^Z^97+[WE.:S1I-Z/8<_#\))\><&2+W"*SN<81E$H?8]F +MJZA7L:JK.M"K9T?4NCY-05='JJ!'(!$`_2.+1T()4\+- +MEYUS)5[PK5,AJN;J#C'!)+0 +MB9<67+1G3?KQ9RMDVQLI=NN:8A^JG%3D#X\2/E*,&$DB`/V#H1!R:F! +MA^%/O/Y_1]>G#]9\7,^+WH(4GC\4B/2P+"BBA4HK4D6)$-[CFV5*-)&2B'2( +M?-/>@1.CG?H-46++4A/XH@ +M-6K"%5*JV0K(!1U5(-_;%!/2,9$)G=?CMM5]S63VAI3PZ#$DYD]C&))"67%*8:@BU:R0%@M4H@X"@F&I5M5#M'+R/FNI>8 +M\"<7XJ>25%8J&03[X!DDD1^=\'H28;V*Q#HJ;#QW`/@:G`$.:KWP$D4_9C?: +M+/P=X0\>WB(MA5%LBU%I9(/6(T@0YH<7LWR[LYX)$RCXA(JR$/,4#F/J#TD' +M]UWD/?$1Y^2'B.HB,/8+V@>/TSK2U\W2.?M)Z.71L/,#>'WO-Y3XC>PDFU='`T#H4I1=DA +MO0%#"=W<84?.0RO6([]N0EBR$D:4)258T&FD)BN%UPRRU?K+B+<-J&&N#0T< +M*VUU9I#(Q&*2J51528F"MUMTMNN[<[EQ8TW=TNF#7)E=W= +M+FS(0++R$IC%*1L&0D"1*P*%:MUDK<6D*1DD2PC`MM(6+E-16DU/5RL9&X+$ +MD[(5EZ7D,(R+((2BT:0"K0I&K1I+(6M%=G+==G.=KE=-VHXNFZF_,0X%B:WF +M2RVJN07\OZ9(X1&ED2/F^M/2>X?E=H.4FE8A5*%B1'K/6]?<*=,3Y8KTG,7E +M`!'*BT1SQ'"?S0DYUS;(JPJ%#A$URASLC]]%IH`CJN`1JJ#W@P#9,BI!'1IG +MMG?,5L))30C@DS"L0!&(W5A^SKO4FS+0B9EX1?JBC02K$D4L@_@.LPLG5S&J +M.BLA);(3*F6`Q*D%AM]L=B'FQ(YUUC.TNDL3$D!LQ$,2085+8SF5KF*C%YW8 +MZ5=;W56MVQ%.B*\4IP-%#D"'U!1J&2,(CC4B"P@0P#OWZ0MI(/+>^Y4L]@5@ +M>HW(N#J%V`\YN30`AQ4%@(KP%:TD4T*PC0(1)Z:@8,`P$6JI"``IVNJT8=)! +MX$%R)1$65"H9[/`74:Y`R31"=J@G=T=N3W68@R9TY0]FVUVVRLJ6M:R$V"2? +M`EJ&I'"DF1)[]DT)\_?3IRV$,@"-2D9%.Z)5`)FJ29WN*JCC-<\:V$.(DXLY +MLF]YA"T%H.;SF9K6M7:();))0B6:JI$T_9\;9W*.UUE==KE;]!B$,Q@`B$@H +M%B*TTUHC);5V]7/&\]U56YL3+*0$A041J21-DR8"(UHEL@QMI(2W=YW:R,:S +M)=%:WCA!!=DD\VV#A)76EL@M2U3$8-MEFU25MY9=+W5I1T-,D*B6"+%0546R +M*I:C>Y;,&BJ*3)%A&6*P4RV2K:M*J"RFRHF+XCB'"`W\#UP"85SHCE"E`EWH +MR*",81^&W036U9I5M58UL;35]/;AQN.ERWL:25',?U)(D74]85ZP%V*;^94X +M%3&$X\1WY@F14XD4#1^MQS'1&H2>%D.Y40U)^^/]F-N(5Z/'2XO +MOU3-&KJR6]C9LX]`;@*1#P_TOQ_I^;\/T/NU/I^.[G&XXNT8OR7T^_Y.9#(F +M,*!U:4`8`9'IPN+I@3-EP9*4]-9Y*A;C4\^N]F@TUZ:K5]^)APT51=KUYE'9 +MHAI4T[R)IE::U>6;\D=L5WN]!4//E<+&O.F>3KOK`ZZ`A-W=;.K+^_?+*P\D +MK34]>K?!YYFTMZ8AZFK$A=@1KCK(==0KAGJSCT\>GC1TVEZCW*-CCZR5GJKU +M1D,M[);+J]"@$"4**+979<-3$*@"BO'- +MZE%>>^0L\)7BHF_*8<=8D)R8[-NBM#&E3CV]O;>][WOPKJJ=A79_(8[MQDR5 +MQPM6[:RSOWSOY\=HWU68\:>LW?:*=Z$=:GJ3K0:B&(J(Z[JF,NR;7)OUQL9G +M7YO0^4K7/%E]44^X!NY1P/#10M`5T7)PKAJ+ +M$F^%A7:#V[7Q:I)-!0RLH8A2QG.F>>O7;ID +M^\]A3Z)16JFO0/<:UXTT]._!>F_3]_R?JWS))%L#OGN[ +M-N]@CE``4*(^:&BBSEB3I985V@[[[XM4DF@H1-*GA5JT&OF]\<'S]2<"B +MB*610VHTIZ[LM(K]BX:=U;I-FQ)HV&18Q.DE*E2S8:AXL+9!5D6E4BV+8 +M;14T&.[1HTI&LLM3`>'2&"5*;%-*23E21RU"1/2K422*I`6606Q$F:T:MI+6 +MHL62VU))"*H)-&X43<@YTJVVRJNB;=1)EUFJUT=7)N1PP4"C)[EFVCRH +M]%)P.[)UI5+2TJBBBBBBHHHHHJ42J6^I1U%#T%#E*/)NVPZ)T[WB98XG19:M +MMMGNT1H4=!1U@1*=RAR5;;$><68QEES,MSU\1:MEBRVU@VCPZ:&2DVB%AJRA +M01*6FFA13OY^?CWDR&8Y))88.9EXLF9)+S!DS)0!\'88(4>Y1[A2 +M4IX*;>:ZW.F54N9JZR!J:TT-FD12>:1T=F#9^.N6CW137&ITS79RY7Z3][RK +M]S,ML5(54O2+Y)"?"O/`;B/XR:DGGBO2P^`-$^5^BF5%'91V$4@JAVPD2U$C +MLB3HIW__"V2DJ#4E)Z3V62-BI!1N61/W_\OWN[??OLY\8?Z2J.)IF +M)+E+,MG[^2"AR05EEM5=O@/!AZ+(\*Z +M/*)(V#1C&+,B2_F^[**9%%8Q4$,@AZ57U(`'!,"GN1)^<(G9J?T=T(]8X0?EL +M)CV=!Y*IY0'K07D=R9$>7,-HR$8ZT*0]`M5$>40\BC!!\D5=`)ZD@.O=Y?+< +M3&+AYR)$KR(>4PIO$0R'FB0&0:2EBI2J44/X_F$3_:E^;J/T(>UJR`KO]L.) +M#V2/PEBR'X/L,F9IVG5VM)6E(J92;\-5TTO+L:HG*\C22R&)',[17 +M4]A_%(3I&BNHAU5(E63Y>".B'NZ)8_%#K$D>?_1AH8'J>IT'/PAJ +M*666)"0V/=$D1X$`-X,$GHU%\D8L%X)V]S^,/P5;;/I98JU?#,?MCU9PL35W +MM_0PK$FX8/:-R1S9":.668.8@O0K$`7B-4XZH(H8&"@A0((:=38B9(:DDW&M +M(ZR-N:+9+76*P*2)4C^>1J2:C@$3^:SA.G[[+4JR.*_?H$,A%11))]99`X2D +MQI@85;;(&6<0G]/]GU?V?V<_3))(TU#"K(_M)NJ;4M4LVU-1DC1B9_/VT_&O +MO:7`)>TT5.8)UB,`5.M-@!&J$5).>J',21.RK4D-HD.*B*"A^>,2:C=#\V1.6M-$RF3K".O4Z(X.8H9&I(=(Z=8XC3ER':01RX_ +MB_AMZIRXF*J2?A(?V][[>KK5^V=E$S&EFTPS(0C!C`%^AS#2"E6BIEX;@E:@ +M2V30BFF86!F)D0IF2G&+2:4632GXT=;(J+:B6I+%"RC8Q9-%BBP:(M)1:U?O +M_02"1;Z[4U;^/>6V^M/(I\"'N3C!^VK%[3)LN#@JOA&36F> +MYG]2'=E]$GPDB)X%4W`D]H1TC.R=B/1#C]1J*GQ5`0^H8$.GYA7B>LG02U&L +M(^@1I42(OHC]J'DR?4]S+%FS#]K5??'^,/SQ^I\7O?.1/R$^OXOPXD![V$+A +M^;[8^\(G)*(0'PAR#)W$2D*/;1,*J\A'U-4[PWGU@0[44#E.A01X"HI/')X` +MS5]55:A3.'+V?IQI)9U)J%?!))7*MOZ71 +MJ=(Z$(QG19)C'17OTO$.Z)1H[.3).B5>UEO`DW,UCU#?;BYE>](('@[R/=U= +MKL4H7]1*BV!4+2@P&(E/T!-9(K)(;XX<)_5#;V1'K2K49E1MM&*TLM"IL;&2 +MOS6V=VV5K*V-8K=-;=935FBMBQM;0RU2S5LT65JMB!31?S'910R3;&1IK&L6 +MQMJ-8&8VEFI9E*3,DF695:2J9M$M&&Q;&VHU@*E3:LR*M)D$C4S;:5-JJ*M3 +M:46VFFUBT4U26AE3%B6P6R6HKN?HTC$T_%#\A^"1/>.\1$^9858M5:7CW!2# +MYE@2T3W1#XQ^A(]3VG![W[UOE8UK)BILM%C1;:S)09!!/2=7!7)L>5]-A)&$ +MA(1^K#I17/,V;RUUPU);^.S4MOO==4`T2G$-MN9V/E'RC'15^V(=)`/B](A! +M6>I-P-34/+&$9$'])/9R>^VP581:1Q%8LD'8JST+`F2)NRU(L4A5)XC4AT[1LGQDGT(> +M3[9`_+7WU?S=&1,1%TMDI+NM3X0D^*.]+;?)&9EG%:7+BM!E9=EN-HH7-BYK +MR2MDVLK[\&%44*M)$^T0B5NR#']56KJ^=M7\0``;?SK7E\T-DP>#V;K-(2+; +M4M@6S`!"1'$3$"[E22@I4:!;L"!8VJ)`LL@E#:R[BT4T-`R1^WY8&JU4":MN +MX,"P1I$2VUA=Q'5%EA8R+,@RCHU(8TP8IM@HLABHJI$ITQ#$J)5DFK+4C)"B +ME1*U^?:NW]BW.:2BBC&[;)L-9;56PJREGD<*'],>_XT$+[_0388`<55$^57X +MN`>1.E>@0P!H)JRK;=JM]-,5O:;/M8PIBS7UCZ-:L?GBL4&@P\.Y(3LZPD]A +M]BQ9(>\\21T-))U-)'+]LAXB._T'"2=26*'"65"]GU_9(1/A4>9Z0T\1S(?P +M=?6TL2/A9*JVK5A5VUYL)HQ0==5TI^@DR1N"QD +M32R?8GS![020\O-DGT#N3M,]J>->\.[8ASY'"6MTB +MUBK;FJYJI,;;%94%J%L2V23%).U&"H_$R;DK\4KZ*W,05A+;;NWKS:M_%[9( +ME2:&$:LC(6)#5!9$85I(+"/X-\14J=1YFI(Q-I'&D +MC$9&)(C%'V221L=8IT;3AK$0Y")8CBR$ZV#523=B&[JR";+-ZQ-61INYPK8) +M86.-N-Q;;&(&(@Y(J"8T+:41&RD1<`@PFFA%$4P@",`5!LD19DFB/", +MDZ1Y6"K(="P,BA9/*+VB3N'N3CEV(XAUD$D[$^G3OFU6E805BD!&$DQC&P(1 +MR(Q@KDVMWU0B5>_*KQKG4<;YVB79D29<;D&K$)=\QOC6]\72)-#ER;)+)+(I +MV<[-1V+N".P295I;;Z8Q"HE-L>["HG::B*&B9OB30>*. +MDB0C($"*D98(D\(A43B';$B24\FYYQ9ED943#:U?2OBF5M:NU6JEF[J2%&R( +MFZ.GQ6_X3T!MU\>8^4?'WS6X61[>`_6_75JU56$JU:JJJJM"R1Z^QL1&5XQD +MB)VQ["$.U0U-"%`-6(:1.E`JJKH55JH/;DS&0"0#2T+BA20F!LO*=URC7-:4 +MN1;1N;5TL[K;D5TW+>+QH\72MSHZX$/&J\;4EI;RZVKKX=:E>=M=MVVBU:SM +MTDW,E;LJ-KJPT;7.454FT5-W;5R;44N[M)8C1M&(6Y*2Y;WZJ;8 +MQQ#H%=`:%)Y1^-^*K)8I[[GG]_&(3&*8ZM\P)\![Q\P9:8&!W1,N3(X&2-#A +MJ:F--5IT&IJII-DA^1(,D#Q(2:)VI/U(?#=[\28E++)!4&0PPI" +M^_15,10205!!@F/@/?3@;"N$4^*"@]B)Q/)) +M)!C%A\V@T%!QLKXDZTJ'@=I`[CQ?2'*I18)&`J$6"^4%#XXB@'8,;F)$9+`, +M5(2V)"3Y75(JDU2?2I)&4A:A+9-2DG:+`:L0EL@=EA!5)5B"E(.B1HA20Z'U +M-)(C29\]^0YDD2^TU:WY?2IJULUC4F1"#`A(Q@D2*R*OD'H#B>(#P40>SYB# +M]QY^2#Q(^D4>^-P]I/5N*MC1\3_?:2$8%O>FN3`PR0PF+BMP.4L^1*_;=M\\ +MXS)53,LN3@U`S!A%+!>@1W@KJD#90WIVI0?>3R1W`;S.Y?,_UXTV'UV$&?6) +MJ&:7SYMD'9Z07RAJ'@#W=RY4P`QG7N;X)S.9"$A`B213QIWHFQB#XA%-CM7Z +M@'N7N3CTIV]A@1[H#VJ]`7K$WIIZU01[#Q];1^0@.7I'M\)/<63Y_>17YE/D +MZ,G8A/8.C]1X,/BM"WD?1O8RN_SDJF"(.PQ1(0(L*$9)*(461^5C)'YG^'VJ +MG:1_.D^>NKYOG'>PM(6I%L@MB6I:-8U&K8L:E3:JI2VI+7Y.J<5(_-6*(EH2 +M<1PCR]!H=)HDVG>$/!%DGT1L1)J.UBD-I(C*M'JGO/07B>9)(YCY<23]D;Z;5E=7`^G?>\Z?IK +MJYHC5J/%KE`_.?/CN7<\1-YN1"1D`D5C$$&BT*1`:46PD1(0 +M!*AU(GM)")M#:J2615B3U6*B4R33"6UD5B8BQPS(IJZMBU=&JJIB81D+`^]^ +MZ'5W?RA[%*G@=J\X'(D)Q'D,-4]]7A[4AQP!W%<$PK[C@!R/*&P(>,1XO)U4 +M&+T`1&2,AV:@`O>B81#VC1C%5'J/*(L!13\(`C%0'[=`!&BO1-R&O%#B?6D` +M(M(*XW]HJ9%4]$42G,5,OU$?Q1]T/A%.L0/)RG1)8BI!*<(N1]"D0*EF(%1+!+$6;1JE:)82"IH>85<`(:(N5 +M@5>E.Y7FE4R$4T@(.@C$60B0B'<62O688`!`GD+K\:WN8GY,"H$``>=*B"[J +M)(4=%A`T=Y^SHJ9`EZLLH_>C=\X2KS3L(>KUO8$&@O?CDP,&E%](;LH.^[VF +MT26MQKK".(]%@%$Y$2^I$D"@$!.FQ'$`((`X$;A[Z:VR=IE[:E&UUIL,H;8B +MM-Y?(-P@*K[<]LV-K)HSC4C/.D3&HE;AY6:GMV*77KZ$F8:#UWSNBZF>OL=E +MNS7#Q"KYO+]:JOREG'DZUGE*^*.\.4--#X-#XL+NCY3=PFYW<_3LBW/-[<.I +MF2E,1D?I`A]9S)FIY8BU1:$!/3N\L/=6GUOPK7>X;C7=A=[FUR@7`DKMPN`7 +M>6/MFJD%HDF^R!LQ[B:V[,\;\7=5*'9DZH\)F^'7-5;_0-U7B1BO*F-O@8YE +M1LXL##WM,=U.J63T5S7@4Y4TE*HN,3J.[&U52R3T8X&F(Y5,:8Q6*9*55EK291I557IQW;3U4VP8<'I*PI719BX4K&"JJI@X>S-[,>*\6 +MZ:U&]+*;4Z6W1N)X::?&V;K%]K203@>9JBV`@$'GS$?;!9"\$K&K$TJ-1894 +M>O#<:GK8X1%M+9.:Q4MB[--&JE$FVDZ0HQ,U?8R`%7M5VKMJO;2[^*[\XA-D +M2J^=*G4<417&%V-Q[QT1#0^O.@UC(\&)&FO1)MWB5M4;/W^'LV6-N_6D-45; +M%5)I%2$U:U;5D%EC(J9:Y'8LC%&@M)U9S)#<;:C'GBK5OX"^R1'6>>_:0DL; +M0V8=!&K:54"Q+#ZA89(BHX,*"X1Y'*B@E'B.A)(Q.[7'EU[NM5MU7D`*]R&I +M1YGRJ2(;CMYDZ]W9.RKJ-$W.@\J"053179SA,&'#'0"<0".G'R_1^;CII$][ +M6O'-'JB%DQ?%[).K"]&DDLM0M*.Q^SRR+5:U"THTYDHM*HCVT%?J-4:$[HP^.\MW*M[R4_&6*K]%Z_DGRM&_2:YZBJY;NX>2Z+$""`=>_?Q[7S +MK6M:76RJZ.B`?!\EFAW!8HQ0(Y#)&63)8O.!H)";ZDJ +MBD%:0+7%()/G%.HVN@LA1+(-Y%HM#%/>[HV#7X=RN=78$;:2FBZ4*I94M%4L +MLNO?C*WO'K9O>#K[_?XSSTRJW\SL:[0CSOOG.NUOKONIXE4$;2(!C&,8P3BR +M#!".=E9L')`4@#.6-LW0T3&R=1>2D60D&*QB0DB"T*";D:?E* +MB47W")UD/#69`/'KU[SENE77G=YP$`Y&'H4Y#S*8W$;BD8226VZFK+W)?#<( +MQR*ZIWI&T;K9:5XNG[RBF9`LO/W3VK>WV3NLOQ9WF,D4AG:DM:[MBTI8J2QM +M%1BQMVOI4M<\VX3H**E9HQ$R<::DR12O,R$MBJ[I[SCFW=>)V31/1.)D5!(@ +M91IKLNC#-D)6&`U*55DHZUYNKO)JX-O*-8B6E0Z=%U'E7,D=%7=>JV5)E49A +MHHJZ*TXZ9HE!C;9DG%KE93E%V/3M;224B6R)825$I>&G'#'O,D:26"]K:J+? +M=-Q<598R[MLD@M1MK*V)L&J(-&C"".VU-=4CC$DM2HCA9)D+"/`?'5]W49J#OM<+.HX<6VVV&HQ4CT9-)&KZTJW,@2D.5\0:2Z.B;I!T +MJG>5E9CR]]'10\SN@FBX>(AH*Q$$(%PXU/$18@C0B\"G@)$!0Y4'L4>9HANB=P<;8L(XW),8N3&#"I"QDQ`'-&N1"*K"/ +M!0#<+P34X)3@?$B,CJZL'Z?R=[9"R60]ZHJWLB)T+A/A1].5,(FY0-_"!(O- +M5R)E%%J]@',[>O*CJ,4"20"$(DC(KYZNJ)DC:#2OJ[-HI((8Q<$C95A+6R%H +MI2"\\8`<.^G9[W;U=+%YU>7O73W:C35,:TJU+8-*TDJ62I&0V)!A#5)LZU6M +M[?'F]T*0/7>MT48R3)J[3=DTR4L)-1%H2HV4B:*0P,S,V-=>;M>`I2M38S:6 +MS3)IDI82:B+0E1J9MMW@MUMUEXBDD#!=%7FKJZV^+S5U>5[4KXO/1()#RV2V +M:FN;5>ZXUH,+I(FK:%MDS(C%A&,[:\[32:\:W+$7+;E46WVM?*"-)\=B'&A3 +M",GB#U'5]AYC4G$FV&8HXM'"C@"B$\:C(,,G$]B:0IX!TP1R(["G +M9%#N!44-A\JO9O!+8D6M18,$61411"HLG?D/7Z`[8DA(P?/!"8EL;&3L8RT4 +MQ(!@K;:/KB?$3_V)_YL?;41W^D1ZI0#F04&,59`03VE.]-D"19))4^(QVDA5 +M'J3^5AUBG\WRCNB>XX0'Y1?+S8$8(0^<34/`U5('L4(R&'1[26)W01*A*[PC +MH60^4?//9I955?[\;&T>'#V'EXC[^8D1.Y\[:D54'UB$A^U2."?C5]?:];BY +MP.;A)VU?R[:U^>IM::]J(E"0A\QXA/]4U.U(GFGPJ\1R@F[*U-Y[!?0AZ^@[ +M@ZRVX)C!)987`=1#3OXA@DDG:*26HAN+8XBFXIX/0F#9-Q9:3B,LD<2;PZ8A +MJ$LM!&;SZ!#5."L$XN@5(0^**5^>I`(&^)@$&U-Y\?0-;.0LF+)5GQYF&DN,UDQ$;;3:ADB&F,? +MH*C$-L3@K2I)B33B!=!3F66%!<+LHA"R%HA9AJO^%#8<<6\:3#*%E@R57*]Z +MELR2CET# +HB>?E'OI*J+26P6VU*JC]E@?6\>Y_-!$,@B'[8C__%W)%.%"0D/CAD0`` +` +end --- gcc-3.4-3.4.2.orig/debian/patches/gccbug.dpatch +++ gcc-3.4-3.4.2/debian/patches/gccbug.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: Use sensible-editor instead of vi as fallback editor + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/gccbug.in~ 2003-03-01 00:51:42.000000000 +0100 ++++ gcc/gccbug.in 2003-03-02 12:08:36.000000000 +0100 +@@ -134,7 +134,7 @@ + # If they don't have a preferred editor set, then use + if [ -z "$VISUAL" ]; then + if [ -z "$EDITOR" ]; then +- EDIT=vi ++ EDIT=/usr/bin/sensible-editor + else + EDIT="$EDITOR" + fi --- gcc-3.4-3.4.2.orig/debian/patches/ada-gcc-name.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-gcc-name.dpatch @@ -0,0 +1,108 @@ +#! /bin/sh -e + +# DP: use gcc-3.4 instead of gcc as the command name. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -ur gcc/ada.old/ali.adb gcc/ada/ali.adb +--- gcc/ada.old/ali.adb 2004-02-21 15:23:32.000000000 +0100 ++++ gcc/ada/ali.adb 2004-02-21 15:23:57.000000000 +0100 +@@ -260,7 +260,7 @@ + Write_Str (" is incorrectly formatted"); + Write_Eol; + Write_Str +- ("make sure you are using consistent versions of gcc/gnatbind"); ++ ("make sure you are using consistent versions of gcc-3.4/gnatbind"); + Write_Eol; + + -- Find start of line +diff -ur gcc/ada.old/comperr.adb gcc/ada/comperr.adb +--- gcc/ada.old/comperr.adb 2004-02-21 15:23:32.000000000 +0100 ++++ gcc/ada/comperr.adb 2004-02-21 15:23:57.000000000 +0100 +@@ -292,7 +292,7 @@ + End_Line; + + Write_Str +- ("| Include the exact gcc or gnatmake command " & ++ ("| Include the exact gcc-3.4 or gnatmake command " & + "that you entered."); + End_Line; + +diff -ur gcc/ada.old/gnatlink.adb gcc/ada/gnatlink.adb +--- gcc/ada.old/gnatlink.adb 2004-02-21 15:23:32.000000000 +0100 ++++ gcc/ada/gnatlink.adb 2004-02-21 15:23:57.000000000 +0100 +@@ -123,7 +123,7 @@ + + subtype chars_ptr is System.Address; + +- Gcc : String_Access := Program_Name ("gcc"); ++ Gcc : String_Access := Program_Name ("gcc-3.4"); + + Read_Mode : constant String := "r" & ASCII.Nul; + +@@ -1287,7 +1287,8 @@ + Write_Line (" -b target Compile the binder source to run on target"); + Write_Line (" -Bdir Load compiler executables from dir"); + Write_Line (" --GCC=comp Use comp as the compiler"); +- Write_Line (" --LINK=nam Use 'nam' for the linking rather than 'gcc'"); ++ Write_Line (" --LINK=nam Use 'nam' for the linking rather " & ++ "than 'gcc-3.4'"); + Write_Eol; + Write_Line (" [non-Ada-objects] list of non Ada object files"); + Write_Line (" [linker-options] other options for the linker"); +diff -ur gcc/ada.old/make.adb gcc/ada/make.adb +--- gcc/ada.old/make.adb 2004-02-21 15:23:32.000000000 +0100 ++++ gcc/ada/make.adb 2004-02-21 15:23:57.000000000 +0100 +@@ -650,7 +650,7 @@ + -- Compiler, Binder & Linker Data and Subprograms -- + ---------------------------------------------------- + +- Gcc : String_Access := Program_Name ("gcc"); ++ Gcc : String_Access := Program_Name ("gcc-3.4"); + Gnatbind : String_Access := Program_Name ("gnatbind"); + Gnatlink : String_Access := Program_Name ("gnatlink"); + -- Default compiler, binder, linker programs +diff -ur gcc/ada.old/par-ch10.adb gcc/ada/par-ch10.adb +--- gcc/ada.old/par-ch10.adb 2004-02-21 15:23:32.000000000 +0100 ++++ gcc/ada/par-ch10.adb 2004-02-21 15:23:57.000000000 +0100 +@@ -224,7 +224,7 @@ + else + Item := First (Config_Pragmas); + Error_Msg_N +- ("cannot compile configuration pragmas with gcc", Item); ++ ("cannot compile configuration pragmas with gcc-3.4", Item); + Error_Msg_N + ("use gnatchop -c to process configuration pragmas!", Item); + raise Unrecoverable_Error; +--- gcc/ada/gnatchop.adb~ 2004-01-05 16:20:44.000000000 +0100 ++++ gcc/ada/gnatchop.adb 2004-04-25 09:33:51.000000000 +0200 +@@ -43,7 +43,7 @@ + Config_File_Name : constant String_Access := new String'("gnat.adc"); + -- The name of the file holding the GNAT configuration pragmas + +- Gcc : String_Access := new String'("gcc"); ++ Gcc : String_Access := new String'("gcc-3.4"); + -- May be modified by switch --GCC= + + Gcc_Set : Boolean := False; --- gcc-3.4-3.4.2.orig/debian/patches/ada-missing-lib.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-missing-lib.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +# DP: Diable usage auf addr2line library (currently not packaged for Debian) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/ada/adaint.c~ Sat Mar 2 00:38:10 2002 ++++ src/gcc/ada/adaint.c Fri Apr 5 18:36:10 2002 +@@ -2214,7 +2214,7 @@ + } + #endif + +-#if defined (CROSS_COMPILE) \ ++#if 1 || defined (CROSS_COMPILE) \ + || (! (defined (sparc) && defined (sun) && defined (__SVR4)) \ + && ! defined (linux) \ + && ! defined (sgi) \ +--- src/gcc/ada/Makefile.in~ Thu Mar 14 12:46:04 2002 ++++ src/gcc/ada/Makefile.in Fri Apr 5 18:39:51 2002 +@@ -1169,7 +1169,7 @@ + system.ads<5lsystem.ads + + MLIB_TGT=5lml-tgt +- MISCLIB=-laddr2line -lbfd ++ MISCLIB=-lbfd + THREADSLIB=-lpthread + GNATLIB_SHARED=gnatlib-shared-dual + GMEM_LIB=gmemlib --- gcc-3.4-3.4.2.orig/debian/patches/cpu-default-i586.dpatch +++ gcc-3.4-3.4.2/debian/patches/cpu-default-i586.dpatch @@ -0,0 +1,41 @@ +#! /bin/sh -e + +# DP: generate code for architecture i586, tuned for i686 by default. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config/i386/i386.c~ 2004-03-11 07:03:59.000000000 +0100 ++++ gcc/config/i386/i386.c 2004-03-11 07:05:22.000000000 +0100 +@@ -1158,9 +1158,9 @@ + if (!ix86_tune_string && ix86_arch_string) + ix86_tune_string = ix86_arch_string; + if (!ix86_tune_string) +- ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT]; ++ ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT_pentiumpro]; + if (!ix86_arch_string) +- ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386"; ++ ix86_arch_string = TARGET_64BIT ? "x86-64" : "i586"; + + if (ix86_cmodel_string != 0) + { --- gcc-3.4-3.4.2.orig/debian/patches/libobjc.dpatch +++ gcc-3.4-3.4.2/debian/patches/libobjc.dpatch @@ -0,0 +1,31 @@ +#! /bin/sh -e + +# DP: Find gc.h header in /usr/include/gc for --enable-objc-gc enabled builds. + + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libobjc/Makefile.in~ Fri Jul 21 13:16:47 2000 ++++ libobjc/Makefile.in Fri Jul 21 13:20:23 2000 +@@ -76,7 +76,7 @@ + -I$(srcdir)/$(MULTISRCTOP)../gcc/config -I$(MULTIBUILDTOP)../../gcc \ + -I$(srcdir)/$(MULTISRCTOP)../include + +-OBJC_GCFLAGS=-DOBJC_WITH_GC=1 ++OBJC_GCFLAGS=-I/usr/include/gc -DOBJC_WITH_GC=1 + OBJC_THREAD_FILE=thr-objc + + .SUFFIXES: --- gcc-3.4-3.4.2.orig/debian/patches/libgpc-shared.dpatch +++ gcc-3.4-3.4.2/debian/patches/libgpc-shared.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +# DP: build shared libgpc (pascal runtime library) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/p/Make-lang.in~ 2003-01-13 22:37:21.000000000 +0100 ++++ gcc/p/Make-lang.in 2003-01-13 22:42:48.000000000 +0100 +@@ -98,7 +98,7 @@ + GPCSOLIBSHORTNAME=libgpc.so + GPCSOLIBNAME=$(GPCSOLIBSHORTNAME).$(gpc_major).$(gpc_minor).$(rts_version) + GPCSOLIBDIR=lib +-WITH_SHARED=@with_shared@ ++WITH_SHARED=yes + + BISON=bison + BISONFLAGS= +--- gcc/p/rts/Makefile.in~ 2002-11-14 17:23:41.000000000 +0100 ++++ gcc/p/rts/Makefile.in 2003-01-13 22:43:00.000000000 +0100 +@@ -42,7 +42,7 @@ + WITH_SHARED=@with_shared@ + VERSION_FILENAME=$(srcdir)/rts-version + gpc_major=2 +-gpc_minor=0 ++gpc_minor=1 + rts_version=`cat $(VERSION_FILENAME)` + GPCSOLIBSHORTNAME=libgpc.so + GPCSOLIBNAME=$(GPCSOLIBSHORTNAME).$(gpc_major).$(gpc_minor).$(rts_version) --- gcc-3.4-3.4.2.orig/debian/patches/gpc-names.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-names.dpatch @@ -0,0 +1,117 @@ +#! /bin/sh -e + +# DP: versioned gpc names + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src-old/gcc/p/doc/en/gpc.texi Mon Oct 9 09:32:26 2000 ++++ src-native/gcc/p/doc/en/gpc.texi Tue Dec 19 21:04:21 2000 +@@ -28,11 +28,11 @@ + + @dircategory GNU programming tools + @direntry +-* GPC: (gpc). The GNU Pascal Compiler. ++* GPC-2.1-3.3: (gpc-2.1-3.3). The GNU Pascal Compiler. + @end direntry + @dircategory Individual utilities + @direntry +-* GPC: (gpc)Invoking GPC. The GNU Pascal Compiler. ++* GPC-2.1-3.3: (gpc-2.1-3.3)Invoking GPC. The GNU Pascal Compiler. + @end direntry + + @c Version numbers appear twice: in lowercase and capitalized for headlines. + +--- src/gcc/p/Make-lang.in~ 2003-08-31 10:13:01.000000000 +0200 ++++ src/gcc/p/Make-lang.in 2003-08-31 10:20:51.000000000 +0200 +@@ -711,42 +711,42 @@ + pascal.start.encap: + pascal.rest.encap: + +-pascal.info: $(srcdir)/p/doc/info/gpc.info \ +- $(srcdir)/p/doc/info/gpcs.info \ +- $(srcdir)/p/doc/info/gpcs-de.info \ +- $(srcdir)/p/doc/info/gpc-hr.info \ +- $(srcdir)/p/doc/info/gpcs-hr.info \ +- $(srcdir)/p/doc/info/gpc-es.info \ +- $(srcdir)/p/doc/info/gpcs-es.info ++pascal.info: $(srcdir)/p/doc/info/gpc-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-de-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpc-hr-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-hr-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpc-es-2.1$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-es-2.1$(iv).info + pascal.dvi: gpc.dvi + +-$(srcdir)/p/doc/info/gpc.info: $(GPC_TEXI_EN) ++$(srcdir)/p/doc/info/gpc-2.1$(iv).info: $(GPC_TEXI_EN) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_EN) -o $(srcdir)/p/doc/info/gpc.info gpc.texi ++ $(MAKEINFO_EN) -o $(srcdir)/p/doc/info/gpc-2.1$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs.info: $(GPC_TEXI_EN) ++$(srcdir)/p/doc/info/gpcs-2.1$(iv).info: $(GPC_TEXI_EN) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_EN) --no-split -o $(srcdir)/p/doc/info/gpcs.info gpcs.texi ++ $(MAKEINFO_EN) --no-split -o $(srcdir)/p/doc/info/gpcs-2.1$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpcs-de.info: $(GPC_TEXI_DE) ++$(srcdir)/p/doc/info/gpcs-de-2.1$(iv).info: $(GPC_TEXI_DE) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_DE) --no-split -o $(srcdir)/p/doc/info/gpcs-de.info gpcs.texi ++ $(MAKEINFO_DE) --no-split -o $(srcdir)/p/doc/info/gpcs-de-2.1$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpc-hr.info: $(GPC_TEXI_HR) ++$(srcdir)/p/doc/info/gpc-hr-2.1$(iv).info: $(GPC_TEXI_HR) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_HR) -o $(srcdir)/p/doc/info/gpc-hr.info gpc.texi ++ $(MAKEINFO_HR) -o $(srcdir)/p/doc/info/gpc-hr-2.1$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs-hr.info: $(GPC_TEXI_HR) ++$(srcdir)/p/doc/info/gpcs-hr-2.1$(iv).info: $(GPC_TEXI_HR) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_HR) --no-split -o $(srcdir)/p/doc/info/gpcs-hr.info gpcs.texi ++ $(MAKEINFO_HR) --no-split -o $(srcdir)/p/doc/info/gpcs-hr-2.1$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpc-es.info: $(GPC_TEXI_ES) ++$(srcdir)/p/doc/info/gpc-es-2.1$(iv).info: $(GPC_TEXI_ES) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_ES) -o $(srcdir)/p/doc/info/gpc-es.info gpc.texi ++ $(MAKEINFO_ES) -o $(srcdir)/p/doc/info/gpc-es-2.1$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs-es.info: $(GPC_TEXI_ES) ++$(srcdir)/p/doc/info/gpcs-es-2.1$(iv).info: $(GPC_TEXI_ES) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_ES) --no-split -o $(srcdir)/p/doc/info/gpcs-es.info gpcs.texi ++ $(MAKEINFO_ES) --no-split -o $(srcdir)/p/doc/info/gpcs-es-2.1$(iv).info gpcs.texi + + gpc.dvi: $(GPC_TEXI_EN) + TEXINPUTS=$(srcdir)/p/doc:$(srcdir)/p/doc/images:$$TEXINPUTS \ +@@ -942,11 +942,11 @@ + fi + + pascal.install-info: pascal.install-info-man-dirs pascal.info +- rm -f $(DESTDIR)$(infodir)/gpc.info* $(DESTDIR)$(infodir)/gpcs.info* $(DESTDIR)$(infodir)/gpcs-de.info* $(DESTDIR)$(infodir)/gpcs-hr.info* $(DESTDIR)$(infodir)/gpcs-es.info* +- for f in `cd $(srcdir)/p/doc/info && echo gpc.info* gpcs*.info*`; do \ ++ rm -f $(DESTDIR)$(infodir)/gpc*.info* $(DESTDIR)$(infodir)/gpcs*.info* $(DESTDIR)$(infodir)/gpcs-de*.info* $(DESTDIR)$(infodir)/gpcs-hr*.info* $(DESTDIR)$(infodir)/gpcs-es*.info* ++ for f in `cd $(srcdir)/p/doc/info && echo gpc-2.1$(iv).info* gpcs*.info*`; do \ + $(INSTALL_DATA) $(srcdir)/p/doc/info/$$f $(DESTDIR)$(infodir)/$$f || exit 1; \ + done +- chmod a-x $(DESTDIR)$(infodir)/gpc.info* $(DESTDIR)$(infodir)/gpcs.info* $(DESTDIR)$(infodir)/gpcs-de.info* $(DESTDIR)$(infodir)/gpcs-hr.info* $(DESTDIR)$(infodir)/gpcs-es.info* ++ chmod a-x $(DESTDIR)$(infodir)/gpc*.info* $(DESTDIR)$(infodir)/gpcs*.info* $(DESTDIR)$(infodir)/gpcs-de*.info* $(DESTDIR)$(infodir)/gpcs-hr*.info* $(DESTDIR)$(infodir)/gpcs-es*.info* + + pascal.install-man: pascal.install-info-man-dirs $(srcdir)/p/doc/en/gpc.1 $(srcdir)/p/doc/generated/gpc-run.1 + -if [ -f gpc1$(exeext) ]; then \ --- gcc-3.4-3.4.2.orig/debian/patches/gcj-without-rpath.dpatch +++ gcc-3.4-3.4.2/debian/patches/gcj-without-rpath.dpatch @@ -0,0 +1,120 @@ +#! /bin/sh -e + +# DP: don't define runtime link path for java binaries and libraries + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/libjava/Makefile.am~ Mon Apr 1 11:29:37 2002 ++++ src/libjava/Makefile.am Mon Apr 1 11:42:55 2002 +@@ -109,6 +109,8 @@ + + ## ################################################################ + ++rpath_def = $(shell if test "$(toolexeclibdir)" != /usr/lib -a test "$(toolexeclibdir)" != /usr/lib/.; then echo -rpath $(toolexeclibdir); fi) ++ + ## + ## How to build libgcj.a and libgcj.jar + ## +@@ -423,7 +425,7 @@ + ## need this because we are explicitly using libtool to link using the + ## `.la' file. + jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + jv_convert_LINK = $(GCJLINK) + ## We explicitly link in the libraries we need. This way we don't + ## need -nodefaultlibs, so we can still rely on gcj picking up the +@@ -440,7 +442,7 @@ + ## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We + ## need this because we are explicitly using libtool to link using the + ## `.la' file. +-gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++gij_LDFLAGS = $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + gij_LINK = $(GCJLINK) + ## We explicitly link in the libraries we need. This way we don't + ## need -nodefaultlibs, so we can still rely on gcj picking up the +@@ -456,7 +458,7 @@ + ## This is a dummy definition. + EXTRA_rmic_SOURCES = $(rmi_java_source_files) + rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + rmic_LINK = $(GCJLINK) + ## We explicitly link in the libraries we need. This way we don't + ## need -nodefaultlibs, so we can still rely on gcj picking up the +@@ -472,7 +474,7 @@ + ## This is a dummy definition. + EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) + rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + rmiregistry_LINK = $(GCJLINK) + ## We explicitly link in the libraries we need. This way we don't + ## need -nodefaultlibs, so we can still rely on gcj picking up the +--- src/libjava/Makefile.in~ Mon Apr 1 11:29:37 2002 ++++ src/libjava/Makefile.in Mon Apr 1 11:44:02 2002 +@@ -195,6 +195,7 @@ + $(GCINCS) $(THREADINCS) $(INCLTDL) \ + $(GCC_UNWIND_INCLUDE) $(ZINCS) $(LIBFFIINCS) + ++rpath_def = $(shell if test "$(toolexeclibdir)" != /usr/lib -a test "$(toolexeclibdir)" != /usr/lib/.; then echo -rpath $(toolexeclibdir); fi) + + nat_files = $(nat_source_files:.cc=.lo) + x_nat_files = $(x_nat_source_files:.cc=.lo) +@@ -267,7 +268,7 @@ + jv_convert_SOURCES = + EXTRA_jv_convert_SOURCES = $(convert_source_files) + jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + + jv_convert_LINK = $(GCJLINK) + jv_convert_LDADD = libgcj.la -L$(here)/.libs +@@ -276,7 +277,7 @@ + + + gij_SOURCES = gij.cc +-gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++gij_LDFLAGS = $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + gij_LINK = $(GCJLINK) + gij_LDADD = libgcj.la -L$(here)/.libs + gij_DEPENDENCIES = libgcj.la libgcj.spec +@@ -284,7 +285,7 @@ + rmic_SOURCES = + EXTRA_rmic_SOURCES = $(rmi_java_source_files) + rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + + rmic_LINK = $(GCJLINK) + rmic_LDADD = libgcj.la -L$(here)/.libs +@@ -293,7 +294,7 @@ + rmiregistry_SOURCES = + EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) + rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(rpath_def) -shared-libgcc $(THREADLDFLAGS) + + rmiregistry_LINK = $(GCJLINK) + rmiregistry_LDADD = libgcj.la -L$(here)/.libs --- gcc-3.4-3.4.2.orig/debian/patches/ada-driver.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-driver.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: Look for gcc-3.3 as gcc with Ada support. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/aclocal.m4~ Sat Mar 2 00:37:42 2002 ++++ gcc/aclocal.m4 Sat Apr 6 13:01:36 2002 +@@ -312,6 +312,7 @@ + ${ac_tool_prefix}$user_cc $user_cc \ + ${ac_tool_prefix}gcc gcc \ + ${ac_tool_prefix}cc cc \ ++ ${ac_tool_prefix}gcc-3.3 gcc-3.3 \ + ${ac_tool_prefix}gnatgcc gnatgcc \ + ${ac_tool_prefix}gnatcc gnatcc \ + ${ac_tool_prefix}adagcc adagcc \ --- gcc-3.4-3.4.2.orig/debian/patches/libstdc++-pic.dpatch +++ gcc-3.4-3.4.2/debian/patches/libstdc++-pic.dpatch @@ -0,0 +1,72 @@ +#! /bin/sh -e + +# DP: Build and install libstdc++_pic.a library. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libstdc++-v3/src/Makefile.am~ 2003-02-28 09:21:05.000000000 +0100 ++++ libstdc++-v3/src/Makefile.am 2003-02-28 09:28:50.000000000 +0100 +@@ -224,6 +224,10 @@ + @OPT_LDFLAGS@ @SECTION_LDFLAGS@ $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCPP_BUILD_DEBUG + all-local: build_debug + +--- libstdc++-v3/src/Makefile.in~ 2004-02-21 09:55:48.000000000 +0100 ++++ libstdc++-v3/src/Makefile.in 2004-02-21 09:59:34.000000000 +0100 +@@ -585,7 +585,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -618,6 +618,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -707,6 +708,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: --- gcc-3.4-3.4.2.orig/debian/patches/sparc64-build.dpatch +++ gcc-3.4-3.4.2/debian/patches/sparc64-build.dpatch @@ -0,0 +1,58 @@ +#! /bin/sh -e +# 10_newpatch.dpatch by +# +# DP: Allows sparc64 to build more simply + +if [ $# -eq 3 ] && [ "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +diff -urNad sparc64-build.gcc-3.3.tmp/src/gcc/config/sparc/linux64.h sparc64-build.gcc-3.3/src/gcc/config/sparc/linux64.h +--- sparc64-build.gcc-3.3.tmp/src/gcc/config/sparc/linux64.h 2003-03-13 08:40:33.000000000 +0000 ++++ sparc64-build.gcc-3.3/src/gcc/config/sparc/linux64.h 2003-03-13 08:46:18.000000000 +0000 +@@ -37,8 +37,8 @@ + + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) + #endif + +-#undef ASM_CPU_DEFAULT_SPEC +-#define ASM_CPU_DEFAULT_SPEC "-Av9a" ++#undef ASM_CPU64_DEFAULT_SPEC ++#define ASM_CPU64_DEFAULT_SPEC "-Av9a" + + #ifdef SPARC_BI_ARCH + +diff -urNad sparc64-build.gcc-3.3.tmp/src/gcc/config.gcc sparc64-build.gcc-3.3/src/gcc/config.gcc +--- sparc64-build.gcc-3.3.tmp/src/gcc/config.gcc 2003-03-13 08:40:33.000000000 +0000 ++++ sparc64-build.gcc-3.3/src/gcc/config.gcc 2003-03-13 08:48:27.000000000 +0000 +@@ -2383,8 +2383,17 @@ + gnu_ld=yes + ;; + sparc-*-linux*) # SPARC's running GNU/Linux, libc6 ++ # If cpu is specified, assume we want a 32/64 compiler ++ if test x$with_cpu = x; then + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h" + tmake_file="t-slibgcc-elf-ver t-linux sparc/t-crtfm" ++ else ++ tmake_file="t-slibgcc-elf-ver t-linux sparc/t-linux64 sparc/t-crtfm" ++ tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux64.h" ++ float_format=sparc ++ fi ++ #tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h" ++ #tmake_file="t-slibgcc-elf-ver t-linux sparc/t-crtfm" + ;; + sparc-*-lynxos*) + if test x$gas = xyes + --- gcc-3.4-3.4.2.orig/debian/patches/gcc-version.dpatch +++ gcc-3.4-3.4.2/debian/patches/gcc-version.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh -e + +# DP: Add "(Debian )" to the gcc version string + +pkgversion= +if [ -n "$DEB_VERSION" ]; then + pkgversion=" $DEB_VERSION" +fi + +dir=gcc +if [ $# -eq 3 -a "$2" = '-d' ]; then + dir=$3/gcc +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + sed -e '/version_string/s/"\([^"]*\)"/"\1 (Debian'"$pkgversion"')"/' \ + $dir/version.c > $dir/version.c.new \ + && mv -f $dir/version.c.new $dir/version.c + ;; + -unpatch) + sed -e 's/ *(Debian.*)//g' -e 's/Debian *//' \ + $dir/version.c > $dir/version.c.new \ + && mv -f $dir/version.c.new $dir/version.c + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 --- gcc-3.4-3.4.2.orig/debian/patches/arm-tune.dpatch +++ gcc-3.4-3.4.2/debian/patches/arm-tune.dpatch @@ -0,0 +1,72 @@ +#! /bin/sh -e + +# DP: ARM patch for default tuning + +src=gcc +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + src=$3/gcc +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 --fuzz 10 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 --fuzz 10 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/config/arm/arm.c 2001/05/24 21:09:05 1.146 ++++ src/gcc/config/arm/arm.c 2001/06/17 19:10:22 +@@ -430,6 +430,32 @@ arm_override_options () + abort (); + + insn_flags = sel->flags; ++ ++#ifdef TARGET_TUNE_DEFAULT ++ /* If the user didn't specify tuning either, use the target's ++ preferred flags. */ ++ if (tune_flags == 0) ++ { ++ struct processors * tunesel; ++ struct cpu_default * tunedef; ++ ++ for (tunedef = cpu_defaults; tunedef->name; tunedef++) ++ if (tunedef->cpu == TARGET_TUNE_DEFAULT) ++ break; ++ ++ if (tunedef->name == NULL) ++ abort (); ++ ++ for (tunesel = all_cores; tunesel->name != NULL; tunesel++) ++ if (streq (tunedef->name, tunesel->name)) ++ break; ++ ++ if (tunesel->name == NULL) ++ abort (); ++ ++ tune_flags = tunesel->flags; ++ } ++#endif + + /* Now check to see if the user has specified some command line + switch that require certain abilities from the cpu. */ +--- src/gcc/config/arm/linux-elf.h~ 13 Dec 2001 00:27:30 -0000 1.30 ++++ src/gcc/config/arm/linux-elf.h Thu May 23 07:59:25 2002 +@@ -122,6 +122,9 @@ + #undef CC1_SPEC + #define CC1_SPEC "%{profile:-p}" + ++/* Tune for XScale. */ ++#define TARGET_TUNE_DEFAULT TARGET_CPU_xscale ++ + /* Copied from config/linux.h, needed for libstdc++v3. */ + #undef CPLUSPLUS_CPP_SPEC + #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" --- gcc-3.4-3.4.2.orig/debian/patches/sparc-config-ml.dpatch +++ gcc-3.4-3.4.2/debian/patches/sparc-config-ml.dpatch @@ -0,0 +1,58 @@ +#! /bin/sh -e + +# sparc-config-ml.dpatch by +# +# DP: disable some biarch libraries for sparc64 build + +if [ $# -eq 3 ] && [ "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +--- src/config-ml.in.bak 2002-07-02 12:36:38.000000000 +0000 ++++ src/config-ml.in 2003-03-14 21:37:47.000000000 +0000 +@@ -478,13 +478,29 @@ + ;; + sparc*-*-*) + case " $multidirs " in +- *" m64 "*) ++ *" 64 "*) + # We will not be able to create libraries with -m64 if + # we cannot even link a trivial program. It usually + # indicates the 64bit libraries are missing. + if echo 'main() {}' > conftest.c && + ${CC-gcc} -m64 conftest.c -o conftest; then +- : ++ echo Enable only libstdc++. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *64* ) case ${ml_realsrcdir} in ++ *"libstdc++-v3" ) multidirs="${multidirs} ${x}" ;; ++ *"libf2c" ) multidirs="${multidirs} ${x}" ;; ++ *"libobjc" ) multidirs="${multidirs} ${x}" ;; ++ *"libiberty" ) multidirs="${multidirs} ${x}" ;; ++ *"zlib" ) multidirs="${multidirs} ${x}" ;; ++ *) : ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done + else + echo Could not link program with -m64, disabling it. + old_multidirs="${multidirs}" + --- gcc-3.4-3.4.2.orig/debian/patches/ada-link-lib.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-link-lib.dpatch @@ -0,0 +1,66 @@ +#! /bin/sh -e + +# DP: - Install the shared Ada libraries as '.so.1', not '.so' to conform +# DP: to the Debian policy. +# DP: - Don't include a runtime link path (-rpath), when linking binaries. +# DP: - Build the shared libraries on hppa-linux. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/ada/Makefile.in~ Fri Apr 5 19:03:14 2002 ++++ src/gcc/ada/Makefile.in Sun Feb 15 16:30:14 2002 +@@ -133,7 +133,7 @@ + objext = .o + exeext = + arext = .a +-soext = .so ++soext = .so.1 + shext = + + HOST_CC=$(CC) +@@ -750,6 +750,11 @@ + LIBRARY_VERSION := $(strip $(shell grep Library_Version $(fsrcpfx)gnatvsn.ads | sed -e 's/.*GNAT Lib v\(.*\)[ "].*/\1/')) + endif + ++ifeq ($(strip $(filter-out hppa% unknown linux gnu,$(targ))),) ++ GNATLIB_SHARED = gnatlib-shared-dual ++ LIBRARY_VERSION := $(LIB_VERSION) ++endif ++ + ifeq ($(strip $(filter-out hppa% hp hpux10%,$(targ))),) + LIBGNAT_TARGET_PAIRS = \ + a-excpol.adb<4wexcpol.adb \ +--- src/gcc/ada/link.c~ 2004-03-26 00:14:55.000000000 +0100 ++++ src/gcc/ada/link.c 2004-03-26 00:17:13.000000000 +0100 +@@ -165,8 +165,8 @@ + + #elif defined (linux) + const char *object_file_option = ""; +-const char *run_path_option = "-Wl,-rpath,"; +-char shared_libgnat_default = STATIC; ++const char *run_path_option = ""; ++char shared_libgnat_default = SHARED; + int link_max = 8192; + unsigned char objlist_file_supported = 1; + unsigned char using_gnu_linker = 1; --- gcc-3.4-3.4.2.orig/debian/patches/alpha-ieee.dpatch +++ gcc-3.4-3.4.2/debian/patches/alpha-ieee.dpatch @@ -0,0 +1,55 @@ +#! /bin/sh -e + +# DP: #212912 +# DP: on alpha-linux, make -mieee default and add -mieee-disable switch +# DP: to turn default off + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- src/gcc/config/alpha/alpha.c_ 2003-12-23 15:08:11.000000000 -0500 ++++ src/gcc/config/alpha/alpha.c 2003-12-23 15:16:31.000000000 -0500 +@@ -337,4 +337,8 @@ + }; + ++ /* If not -ffinite-math-only, enable -mieee*/ ++ if (!flag_finite_math_only) ++ target_flags |= MASK_IEEE|MASK_IEEE_CONFORMANT; ++ + /* Unicos/Mk doesn't have shared libraries. */ + if (TARGET_ABI_UNICOSMK && flag_pic) +--- src/gcc/doc/invoke.texi_ 2004-01-06 10:59:19.000000000 -0500 ++++ src/gcc/doc/invoke.texi 2004-01-06 11:26:11.000000000 -0500 +@@ -8571,4 +8571,11 @@ + compilers call this option @option{-ieee_with_no_inexact}. + ++DEBIAN SPECIFIC: This option is on by default, unless ++@option{-ffinite-math-only} (which is part of the @option{-ffast-math} ++set) is specified, because the software functions in the GNU libc math ++libraries generate denormalized numbers, NaNs, and infs (all of which ++will cause a programs to SIGFPE when it attempts to use the results without ++@option{-mieee}). ++ + @item -mieee-with-inexact + @opindex mieee-with-inexact --- gcc-3.4-3.4.2.orig/debian/patches/libffi-without-libgcj.dpatch +++ gcc-3.4-3.4.2/debian/patches/libffi-without-libgcj.dpatch @@ -0,0 +1,67 @@ +#! /bin/sh -e + +# DP: build libffi without building libgcj + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- configure.in.orig 2004-08-03 00:53:36.000000000 +0200 ++++ configure.in 2004-08-03 00:52:35.000000000 +0200 +@@ -136,8 +136,7 @@ + host_tools="texinfo byacc flex bison binutils gas ld gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar" + + # libgcj represents the runtime libraries only used by gcj. +-libgcj="target-libffi \ +- target-boehm-gc \ ++libgcj="target-boehm-gc \ + target-zlib \ + target-qthreads \ + target-libjava" +@@ -150,6 +150,7 @@ + target-libstdc++-v3 \ + target-libf2c \ + ${libgcj} \ ++ target-libffi \ + target-libobjc" + + # these tools are built using the target libraries, and are intended to +--- configure~ 2004-08-28 02:31:04.000000000 +0200 ++++ configure 2004-08-28 10:55:28.000000000 +0200 +@@ -876,8 +876,7 @@ + host_tools="texinfo byacc flex bison binutils gas ld gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar" + + # libgcj represents the runtime libraries only used by gcj. +-libgcj="target-libffi \ +- target-boehm-gc \ ++libgcj="target-boehm-gc \ + target-zlib \ + target-qthreads \ + target-libjava" +@@ -891,6 +890,7 @@ + target-libstdc++-v3 \ + target-libf2c \ + ${libgcj} \ ++ target-libffi \ + target-libobjc" + + # these tools are built using the target libraries, and are intended to --- gcc-3.4-3.4.2.orig/debian/patches/amd64-specs.dpatch +++ gcc-3.4-3.4.2/debian/patches/amd64-specs.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: On x86-64 use 64bits mode assembly except with -m32. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/config/i386/x86-64.h.old 2002-11-16 14:33:38.000000000 +0100 ++++ src/gcc/config/i386/x86-64.h 2003-11-26 22:54:35.000000000 +0100 +@@ -49,7 +49,7 @@ + + #undef ASM_SPEC + #define ASM_SPEC "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \ +- %{Wa,*:%*} %{m32:--32}" ++ %{Wa,*:%*} %{m32:--32} %{!m32:--64}" + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named --- gcc-3.4-3.4.2.orig/debian/patches/html_user.uue +++ gcc-3.4-3.4.2/debian/patches/html_user.uue @@ -0,0 +1,56095 @@ +begin-base64 644 html_user.tar.bz2 +QlpoOTFBWSZTWZFBWGUESA7///////f///////////////////////////// +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 +Mm6zQiYVsdDsQUSCiKAohK6iWJmLkoJ/b4LONu/a9Y/B9zr4G0PhenptPj7N +c0Q3JzlSlsj8Oj++P8v5zwTTtR4KPl7OO3XKuWk2bKfOWouVaZdsIxNSJtmK +ueGokyzrTZyy4s2cU5HFXDxXKcV4OEesTjeVRw3jjTlu0ttsslaXKikZJByU +VFSosm3lGFxrw/qT8/5/z/m1PFkEQxL9L5dlJbMR3QZqJg0wsUHpBkreGA14 +vTBEMBqw0XuFQA1sHO8SszBCN5gWUxDOC6B+B8LlSj6j+y3PZxy7FV5ajmhz +EJ1C1GCEJBVLk+kDN0aYMcMeVRgoBCVYAxNQp6CqUhuiwiFQVKrZFg4WErew +wLAkMrk2GwrhgiHfNtWpDQSEBQMHASFg4ayw0FA4QEhAMFkZdWZmXmqt31k5 +Eca1p6pydkzeTcxrd7aNaqx91vV6d9b3k1V6ve4dpvKjc4zbect8ed5rUVUb +rNvD5q5lqIQAaj2/XGVpkLHVts6SR4FsMTipL+QGOGnDOpFARDzoffKLLJsf +O/ptGnXjSRLsd/6qNj1OjKOshMpJUmJESjX5/q79ukOcOSB798Ekp0To7WO+ +3geg5fp8uVds2J2lWXLunrt3v4dururxj4nB0+/tHs0SJ6JUk0T8L53U0bPl +xobFJ/mSPZHB70Hj82l+xpZ8zVSPlD5uuQspLgDIj4FoKSEjWqWMqX7fauvj +kdm4+XCq3689ZPn/Y7Phfa6lPjk6tm0MSHed0xKlSpullnlx7u3LdIN/1j9W +T6zW/vHQ6p2ToHkRUkM1t6zIamxLLLKPDOf5t0ZHI4E0WErny5b9D28zmS+Z +uMfkfhd2I0fR8Ocnc8o8vFEuxJ9b+Dpek49fzHptHoWlPOSr8r8U8T0EuzFV +6lScmwmtgxtrgSbcrcrWlUrNJLISxUlFi+zmY0T3Pp6/345n0fr+n0+zl3PB +47ZPlczMzM+52e5sjgerdonp6MQ/Gy8ZMbSvFi8q1H44P2qd1+vTEqEhhsG3 +SSwwQrEnElpdIdKEyRgkM6QuRkkjZZujn7rjuONojEpSH9OUcjOGigE0UGR2 +KLRduz93osVqspLVKLThFmZFkKbbAeiBnPPPXJ8wZ6Z+cQRuEHh+p948cTQB +04du78hOl3aQbfy6f7Obt3+TX4QDB0fjWPnn0tBBRkLuXQ+g1vudUKh+DjPP +Mqtv5zT7NOZCTVGJUzjVEgKuEXaAOYtwkNEDlgY2SJaUjJZJCwYQDC42EBqI +oK72czr1K+m0YyX1hMeChyqTI9TtJ1cnzyxFU3+mGQ9nwOOnU5j+DyOs1E8W +/dZSio+hiYyrJhZUVUlIsn1bezw+JvXseDo7j5zifNPhxPl7XxlPFLzsjW26 +zWpyLmbdE3wuyrlMFqxNE66l7fT85e6lLFL0HmIHQq+88e20+m8zG968e0Hw +ZayWy87b4HsiexpHr9Pj9Mu5Lzsr5MovVbaK8KMGqxKu9VEx1Nk8S9N4+3xO +ej3eXzu7GnbR4Xulwg1KvhgnjhBzxADAfl/vDikKPd059m/MTpVh8OceecPn +7cQ0dvHsemthxvtLfYk18AKjbIkG4pAzIGZm+MfFsrn06PIWfA14hOx6nnep +PD+F/KaqGbYqk7HAccTY4cB0PM6nl0H5o/VzvKqemI+HQ7D6jthos8B7fV2P +zOwVZMapfqJw1S9HpUsipBN77vK/TbcsZt16wxHRTfI/Fz33/bM+rR4r5X1r +w4xzPU5GayS08L0saT2z8dL0+OYPnEQI4BbB7526DPqaD7/rwFJL7DBgijYA +CAxFEAABoLUWMZgAIlGoNG0REUGLGjFGNGiLGgIIxgxGImMEAAAEAAAYRGMX +znZbgIjSw+10khHHHp0vma8em5wPTnpdDPP+b+Ptv+UK59nDZ8ru0cIOxOox +JQ4iA+Z1DVjQGoQ8rYlksSxzPeoysNJQ05bNqU3QGHzh8lCSAsEj6PHX3Ptb +67fb7mefccC0Gd8jxwVmr0YM2hyw5/bjmbnyPt3+PyewHuhO+I6OuasO+TWJ +2PCH1cjk4dZ5PWXVvR5pOvOoOiI9wOFLUpEyDlFcgS6yh+NkJoH2mKKsQ7G2 +/LrrQ+J8sNcyrnt8+539r0N93FOZq8/uqJ1VXXg2WZhZPZ7GeO/Q5XXfyKa5 +cPGpHWr0vZ4K+2Ux58G8U4vKfecHXbwYnNwc4WN9qJqrObVaQ1SXNu/t+HKE +5CkqoeJPROhdK2jZHjc5+k0dWVPs0fGfGojz0nd2o9vzJ3aNSm7Nbnrnnv+H +yg+UG8BwNUpcVTsZFJhNFDWfcfAb6rocMDGdj67jk8181cUgv5HDmegv4j8N +xtIAYwNo++fxHQcqdO079tjmd2u/qfMczxdt/FDrj3Jmput7j99x+TZ4dM2h +Ncx4LD8X143nZyKRtmiSqWI05W0CGxCGCTHG2iNq9/DzNoOVbVzfEvl08Pkh +JOm48RmG/WBKTezLsAqrlGeXgGDgOEtw2T1yBS+RuR55HDzeG8G3hfkeEd9I +fP4ed59OpiDrDt3c3Tz4E51ZySfVGtWvEzcrrDaQyyQWNs8EfUdDBxg6nqfd +0E/L+xweNI+CVLfmU9bUXznvvm7COF6Gc5tA4msBcnVzFcCQuoGogidI2VGj +GYZlFNh2b+IN/e+837OmfOPwDkaHnnHHl5+PoUeAp7e9WgnXtA25rng8u5Qw +1+4dgaSc0mAok/KeLhWufLcNt/s+MkYzkG8O/Fd/vajkCxznaPAcBvz6ed8N +26z5917A4UEP6o64Qcd7QMBPQd+Xh+559OxPnttttvNGp631bPb07aPKyWbv +C7NU2J2ZDWHf3lYmalPZIyZjXzb1TyzA6NEd5NPGdv0e768tcvHkZyZTip4O +x5HWHHLwp8KRv31OUhJOlLoA5YSOWGLB2CvD+BARpuGkbjoDSHo5HMnpt4eX +szxvs563XJrT13w40BesWQtRnsvFhgiwWsUKZZwrYSUEFxEJ5cmuEtYz6UtQ +agwiuE5aCDhghSE70vYapTe0+LbCnPaFatQ0KkZMzQrSMNNa95lPJPLPEnD3 +jZNjsTTj94Irqc0jlf/L4fs/tT6vu/B+pOj8Z2nwPCavqBiwaqRI2i0lb3/d +m1tdd+XuJGWtoigJS01UKKlAYDQeNZX0ODz5qIIrqfSTpW2MkikjwvCPAWeG +8ByvGzo8TCOky8IgNc9h5RsYWiPGU53rxeZZCGQlhYyHlXpnKOqiN25IuUxZ +837735+GvCV3DVUyxtWzeVf8D73yfQfZWkeyvxfvj0+djVrZrb25c5OtTptq +uNs1Cut1G2kslsBJjZE2ZtM0JJQlFxa5pyo9OWqyY9Vk2jYrNHMFcyvejMqz +VpVrDFOucmIbJhmLTidcpzraDljDLttocXMbbRuLaW5yyVGjJlixjLUNMtZW +mQyxZaJ1oE5HVOHNLsFoq4uqHFMQNTbdaRcqrsZU7GcdrNynWWynamSpi6OB +zJdMrLVOYjjQllbtypS5K1e30ixERqiBmzYq2hcp1DTuYxlHFqnDMmkmOLkr +LFYZcDISBxQnlStcpynIa/AlOGnSmu4jFlACxUJSugSTVzzzzeJegIAPmBIX +QMAkEozWtb+4emPHEDPbWpg0ayw1r7vwO1LbSSWLUaktMaJOpeE11tGNFEDK +YZkySFmTSUIs0V6/LXHhbvipxiuTFjKNZrMxllmLGZaNGBhi1jLGMMzTKzFa +1XFXVn62fIk3WvqJ9eUwyZkqkM0k2kq2VtRJtVSbQKm/lf9L/rfd/WO946dO +cNX7nOUAZMEgziQzcCb4JW/v77WdZsZeAazSi1cO+MvItJKn8HFU/mNKlcpk +la1QZaKxlsqfzepJT95noVLStkT+FxeLM0mQufJP2c+zv6d4qi0rxr9jyy/T +eLL0JX7Csqyms5JPGH5VqX6RD9kV6uuon6V0XXojeWS/Wqn8uDVZZmGZmZmZ +MDzWYlqRYqLUbza8E5k0TGMYxjGMYxjGMYxi3JjGZmiiv44mwmQam6cozrPO +dGo25Lb1ngmSoYllN5ndeOXc8uLyPS14cB1Ur3VpGSATTITISdJ3RM9oSCya +rLhFeLutHxt/ljLrdC/8lirxMPCjork+NbpwdkEZSZwJUkgE7hJeA2KghNpx +Y7eFrm5y3M347xqqfzmBtTGQLo+e2PGR9jzEcJnmcOLpAfWBBQo5FypGh8DS +Q2StjansxdiyyyYXJFHLtYyypk1ivPuaRVgoYEgkndJEQNrVgCVXswqHZpPD +2U5QdeN4vT5ObuE4JSI4pJHm4WcmaiJ/S5z57PeWSNjyOEzeM5yr9M1VP5rE +O7VLfP/rP6HMKlSFhQVoDVA4KNG+WFLBoTkDUaKeGwZOSomU8XhO7NJlzgZ5 +BiHCMNieQDbshJqXs1nSSnmyXgj+xNYhNeU1qecpOyc0WY28mrG0rFTYTj7v +N008cboXuPNqtaj6dg81osjs8/ftuq9OUCXpnJtrqc+dXncccXOObm6jrnW6 +p8PZwXs1ezXnpXppMvamnrU7UcePo7vJv6csed86i3fwzwtp6XpyZt+xgWWj +TWgpWmky7WikxBrlnl5BTiugJ0hgUqlqvdYP63K2nRGv1Gj67j6rq8Wfdry3 +Mn4v2Pm8NvT6c4t+UjxaWWMZer2XaM+TGVK8LubzY7K2aycPoZxW++DF1dzQ +ySy8+cj0I+oHw3HaOe0nXLu0fU+Z9qrv6dFMxO67sboqp4rZF1GlMzOpeaO5 +J8uccDMzLj0a/HD4M/LOM/pDrsEnFy5t5hq54Klizq4+2fIdDDBBB5TDqrRw +bMfP4MbuJvK7q5tNtKrm8GNO7NdTsujta1rWta7OPF0405eXN4vi5K8HRx4P +BjHVZWMVkzk5w5J9Cc0qeiVMTtPWeiHonZN0RhKnQnVOpaUHq60IMFoWhCHB +ciwWxSLsaPcmo0+COjsdHbxo3BJtgwgek++UDywxQh26IgiCIPSZJZ3t3t/U +jIuIhwJWI0rPYYNta5iGroiEx0sUX6LZwdqoRrRS98WLCk97B687vF3d3dep +LLVMtUy0mSyRU1empqzwprTd3dEdnOR7JGKOc6VizFmHJUm/Ed/R1UyScydp +gqwXgX6euopIkSPc9JlMdEOfWkyO6TC5F5E4LoGDuHtwIQyjSJ15x2ZmaKOE +N7GzqZGKtWZEojWiGlkrtNAvTPWpwlbVgkqlwuEaoYrUpiA5DQLUyThTtE8d +ypzjCAp3Bl0zDHKRAnDsktOFrnocQo6SKPmf20KqJ8MzN7uEDNzdESzMzMx4 +PI6qRFqVJUwQaXIcEFKWCiE8dQllDG7W9H4WAsGNjjj38JJLRdLQlBF0GKaM +JIYQW56J4lWe0VUXmTzxHlquOV3ctjjtw0e3pw3L60dvZ/TJCGRyxnrGUO+q +3362xwDfA9vizZ8DRc/FzoZi4/QHk0nPjem8cvFXHWkQM7GNNuQNjcc7Y6YZ +51t/3/6T9M++4CdMiH1s5bNpH7ZvT7dEnBYkjnIoVlTMlmopiNKu+Xo1ROl/ +RfyE6n6qejr2VPuV2cp0l0GbDYzDIXBrwRxTC+dozBguZ+OODBkEoJAwhAsp +MkYHnVVdk9sk0pVJjdj6ClT7zY5vR0caduWR0GydJ6sfU0yHEsyKytK1tiTa +6v2DgSiUsUpSlKUpSlWlKq9BdT7Wfye5slWXrNHZoZoXmdJ+Rk4Oj1rYd/oK +ulaSQOJCUIEOH4YEpSKVwqDjMWLNZWhfpvS4rNxgeFo5zeZPZrhWXBOVE2Q/ +H0ROr+TBwWXNjGKxtrTK8NSrjUvY+adk+Ac4zo7qqzYNxJ23idt3h8/pz9u+ +q5L+TRwo4vfy5Qr4ujr+SevM6FL3506T4xPjH6bZa1ow9Bk7J8kqeX5fzxcW +3GYvQKSQapTGpOGGXRiZJNTQ8XZyCRFxQWGV8TGrjbSTmg808XoqtDuqj2JM +0+eLkxPZuzh3QBi8IPQ0b9SRJSB4DDAF1lOYxoOUTWEyk4Uh2sh0pPfGbXYB +aoFR8EcSgkixN8yBixrOVWN0qLSOOR8/WJ2ieKduvXsmSLGlOidVlaKtlbxv +AIsFgD0d8ee9G9jpXK7dWumfCTImj4OUUU1Dc6eEXwh8HE83LkXjPJSmzOI7 +w08Fc/l7TqeJfjnhz5q0RzgX7jUxB3+nHakqZuWGfbQyGYPI0wzR8+10nYW2 +3tNrNatt7ez3akg8t2+qYjypo7OMx7DEkaWvfQw7QrGBOLe/5jQRMg+snjDn +VSHJhIBgwNX1I+JC+APiIruMSH5eo6bVmIDAs8Ga9WJ4Aa+QYBkzow4SBr4o +NXRJzSWGHP88w9hz/C/JJ/L6PAW29j/J4jSP9N9gY/Uz5n2qfQIhLBvqpd4g +zs3r4HPm5/Fp8zI1Oi6c1qc6GGWtMEkM45I5Ofk2bbDQ7Zw8fh/bq5Zjv9HP +fj7/Xh6W9Lzennkxhezzcwt6zXBWyXl7HK6hSEWrUERHYkpOWwmoEGK0RpSV +C9GxpYbwO4GvLwUM/Ynctt1Qzb1yR+utRwzs2DD6Jf8Eyx6y/oW8MNtnbsMs +LOg+8koSPXPsz1K8NvRb5WinX5g09xqjQZmWfJYqhwArvLOBJseNl3oTBXlc +HjMDBG3JWkeOuNs9psSJLDKhmmFpIIzTimRonEYaRU0KQsBdDpgkDDCQGUcM +4XiS3Q07MwrkrcZMuRGxHjBQkIwCJ8qB7mpbiDCS4tLislh67JPC8ebTvr83 +lGeLw/IGGvVZj8EaxebZOIeQ+0bwXTlxx9JHIUNRzso+38DIbTdmjVcP2d6o +44Z55iiOY55y+H32nZUDdptqnrcV1aaOZjncbmSJiuLpxzttNqu3H3YDWmGM +5k64+N+G3dbliyI4dvi7y72navP084xl4zN47OEsej13c4f0uoiwh7qYaSGO +tnesDe3aJsNGr9I62E7l2zdC529tph0Y8jx6S+neqM2zzuKI4jjrL4ffU7Kg +btNtU9biurTRzMb3AUejsHJGY/inO2AgA+6hd3h4+9VQWx159PPHyRr0bXp6 +eFxz4vXoaMkL8P6SRXNDMe9OQmluJ9ngEvRl6dD5HHjhm89o4yjwWfXemllO +n04vZvXeaOOY0dh+2z8tCkpzrvsnhydWzEsyXoeWBpp2hP5klFsVFnsFOw2x +nNpwHrH3CO7T5G1M9Zp12RnpVQ1A6163PXphw2cU6XzX+lfKT9xfSWamH6ix +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 +NMmBOIuGmpnM2bjQzWZpDsShhhm0+2hm1UBkuxgOxJuJoilTOQOOmZVhs0Ub +q4zeyBKhhb1SgTioVaYVaet1uSZyGnNZp9bGy9QM2pu7zbRb6G1vcDGnGYFY +OGgcubvbRlikW8onZo2bDaYpXq2arjEKtuMWXEUYaNElmjDY9wYbmyHqtzu8 +zWtvuSd0SYURi2YRhJsotOWUbNFFkq1ockspUUrWlK2sNrY7UaLIMLNGgg0o +Mcge20Xe1YMOMUUSWSYaNFmjYw5hs0pWzYYa2WQnTDGGzZQ62jEnWK1tWaW1 +tSS5ZRRJvcmx1JBJJIbNpixyhtjJyhkyYNXg5kNpbWAsBNepc0WWrHminihi +DZReGZmbEZq31rRsQwjUDiYTJDSMyiZY2IeRa0DU93uoKgkIINwWKxYKw0I2 +JxTe3IgkUBsLFsROjTiG1MElFEDGgkg2OTW7nW2iqmsrWsfe8UswMtq1ChMt +p1mPtyFFFvQPrWre7idb2a2xBF0QbKJW022MIIKio3bshZV6J3UXvdXq2sYo +gk2YbHGMHJLLJzKd3vWpaXYtrknbMzVIzY7rDY4rFoHKNmzCjQxs0bLLLNGj +Yw5F1WtQ+o1t9tk3OtmFmzRZmRRqsmpiIzTDO8UNTF45qnrW9yRujUuZtzNu +RdjyqMMNmzaobS1aYRN0KsaNbZjByTRo0RlY2yiDZZshr3s2bJNGzWxjRBss +mCiTCSxoe9RveVclkklG1uNWxo0bKKwdXgQ2aDE4QEhYaDAsNBsM3Wp3vWb3 +VRF7clmfCs28DlEmijaTkVUXgtCyEhxQKUikjSRKRgtKUikjAYKIFofH1NPD +qSi9TMIUlFlGGjQ5Zsgkc2ObMINEGxnNkBIjBEiMMvNNDxhRosqHTJoHTsmH +qZuqi73mZrTVm33RZOGtQz5WYRGtya0bZ8vWMxeDisE4ns0WotmNsMMtSMYV +AYKxbolXoGEwt1EgWLZiFqXGs0PM6TbgebYi8vcytzL00Xk4W0o0ts+XZFRW +r2+nrd6kd32tILFE0MC2761KRCQ4mCdmCfYtMKknFIs0WJ3ZrISMcuQ0QSYb +LLfEbZFtUM4ixFNMDgzyMDU8KXHHNw8VUwI2UwxFMSoDGGNpG0jEigzW9Pms +1s2MDIG2DA4YmGZJ0MAUnW1dBCxWnwNJnhDDG1igCMrDCVhYiwdmZiwdmZid +JE0KhUJwoRAQEhgYGggswwokswwo0bMjea3tSQkSkOkSkWkWkWkWkWkSkbSN +JG0jaRtI2kbSHIJKLMNDpEJEpFJFpGkjSRtI0kbSNpG0jaRsNGx33EDF0YZj +Crlzpmb8s03zK3qMvX8ciyFo9w43htOuuXJRbI1oawaM20qVznLlpBXK1zha +WM2rmKbZK3EwmCagoDRIWNQy0y423EFmaKSquC21RtjVJswk1Ka1UtjMKyZM +xtsUzVo1JpGk2lSkNppaUcYctFqYGsitpNabGZWWjWmo1WI1htsrURtU2ltE +VBZZFbaWuLikQ1g0FipUpRpU21KwNUWzZqyoik0LKoNMZLK2ho1cbXNpqytG +bjZzkbaGysmtLStLTWpYtYIqVTMzZTnFy222ZDTI2MxOIltVNswOcxwGxc0b +FampVrlcXGklc44bIuutxJkRA3VTrrgR05ijcq5tybmc5wsbmrgxrRq5zbi3 +Fuc5y9r1e1cfBlpPBbkkNz3vf66Oc3Hwvwvh0Xg4BL3eXNhQduc8HGKePvc6 +QG3ZirVtc+maW228rjW86dU4kzHzzGN58atcNlWy38kyyJlh13r7n3J6R2c5 +xw8p0jDdqB+lkfku8E/XGLPteSy/UhQMEMN2a6k4TRsrPSZLLLLLLMO2mxxW +ba0YzG6HZmdrcy06ZMmTC4KHEx2E4SYBS2WEUMPTJ4yE4wMdmJOefySw4FwL +FvTJ07cOWeDE47BY54UKoGR7oZbWygVrDxorY5N+Y32H41jeRrh+8ENx3jx1 +5q4u478cP2pjNwoqs43qIbrOxrOuPMt+qfeb4IQkHwXcakI+LIXa1CwwGGxZ +hpYK7psK1FK1JcuwjAazdeBJNBQYlhiNApHcPRJDJG2D4selD8X26sokEgOe +zfZ5rjMRzXcs1573aPdCtHXau7yzC9O76Y4mq93jtbN0wqa8rTSc25tuJog2 +ylklTWwjbF8cNEMd3dG9P4ftB2Gsb2aqcTMjtThbUHU9u1MyPyoJJCQmR6X5 +ePXvR39ixyH67x24uEMtZ4770b6LdUcUu1DZ1aQfITh5JJLIte1tF2kZ1jCL +RHep0zMzNmQqYLIbQ44Q+fF4PD1Tb3PodMc+/nzz8I1y2vXz68c+b151khfh +/WSK5oPP4+X8dWYm03U+7wCXsxo8qeNu/iGWel57t7zfs7yRvieKTY75MPvm +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 +5q4zNZWaDmi2JxqZOaHKOK3JttCmk6bmVUVuDbWuNa1b0a1tXWustllimGMG +iUjCiNNBB6e+1dUTWRViolmbJsNozJkTZtCkrSNYEo0bCNrTS2DjFUpdyqUu +/IgY2ZSWppVMalVLMwyAsVFLczw66721Mzds5iLZnEbXFcWuKrjFrja4q8OO +c1xTnK3ArmXHC4nJziG4omKA0RuRjjEKOQUZEhkTqZHxnBjFsRem2rXFtquW +2txkj3fNJV4/mnkdXVdL0+PivIT3Y2peE5O7v1TV6vY9zT+T5RPPDTSZmtjR +YNiTZLY2Wtrzq3EJzkyNdo08LPL/b3WoEw5T84yoq2ws1IMNSk1RohUipKMA +ZIoojEYyaKYhEkEC1gRFmbbGzwpx63Ijs7yuxcE99KRG9guGjaRJPuPCPoPQ +5hETzjvynjYfGTEDzIHoIH7M9VBdil/BfRlwqO8+HJ7p7J43eu08fPOHCbEc +iApAWL8vqc07xHLdkaWZkybDbUNVdddLq65cm2z28Mi6xJiySP/33N99z2d+ +WamSKsSKV/qOjUml5YiRy9y8rvtwxGSQVsuWVFVFkpRQWKkq6zFrNuI57cRp +eFGSyDQXfl19VeKXXYgex69tbbx26iIyRjGIxjGAxjGMYxGMZa1a70yiNIkk +NYtsSdeltrdrUzEbUDppzQ4NI6xW3MCc3NCblC5FzVSnNxY5rbZs2RlbbGtt +QFXOcTnOXeucjptdpZK51w543FzdbmkU7YSamhrtzdrrbmquDEQ2gwaCgnZm +VuANc1TjjbOnKnXOaRbrhOZI+PVyTLKdtjVO9d+q6RgwUYVbbcbVNzhXDwkL +iS4xTrDZwwc3LUu+iutKuGoXTrjnOa0LblzmmBznFLlzmNRdV1pucYS3i4dw +SYbUiqtInHEmSRJtCAQIrE1aVuuLrbRzC6uuRsranWI5zmm5ivA1OZFxqlRw +65jUbEuzrkjYnWhdebOuicZRduuHTUc1K4YF3mE4tTLJO3bjZVxznOrglzQj +mNksU1aul1zmquXOG3Oc2REQERESREUyJpERNImRREk20xjGEkiIjGMYxjGI +kijEZqSREYxESRETIiVIiMYprERpGMYojGMYxjGJIxkiIijFGMREkRERERjG +KKIiZKRREUkRE1mMRFFNtq8dqq2rq66xXFrcAAAAAAAAGrjjm5xabEnGi5px +lLtqDmHWeGU6yozK621R5YTvkOpJtgbZhMzMUjSZrWUgmolgRMZAzJBz7IQa +rW52q931F3IPoScVJ+Tacx+nPUNKH71TZhAP2Q5AUYA8vPmwDcCbcoOWD3IT +h1n0OxD2Qi2FRb3SCVfY/h+iqR+7OkuZ7+B/V2prXVZZCTvqUMKDN/5hcxhi +y1dsG2VUqBUJA6tKmQ+HKrLIgAMATMJJ36hoIwthVSxtTOEoig26WCAU9Ta6 +PwHqnB7JPA4nm2iQ8KFVVttLbrUZVLiD125P378Xq8uyk+xhV4JDBOgZCdJm +4xKzAAm+nogX+VTCwsQdG8wtull1gxko4ooExdToLYyQwzDCXsuk4Xm+Vn/B +zUtGGF2xaSu+Z2tAamuGp5qqvsYRhgwyGG994WRGzoGkgBqTeOjbm9GmP6Gn +K/VtVoTSpiydDAhgBMAtbsnILr+6e4jeSHutCzZLq1ylAV5AyBVEcyA4OyDK +9T5MwbZjjA0tbVGjSqJBztYGYcR1UsOO14ELQicJuDL4dWsXKgbn2wVOzqi2 ++uWeFAWB+yfee/+W858cy0v0rWatjVrFGUmqWqo4P6jicVPzU5H8ePfa1++t +q222agqWzSZvoxX5TY4NRJxgcHQdVR1VHSTVxjGLDSsamTRpFXQtRoqtMmMY +mbqulhnTgcWMMnTjW5GGZTM1Y4cWLi5dv6Nui6qWTUrDnDhhhqpjDGgrOGLN +GGYkxFKbmGMTExRhgGBgEwwMAwMKf9/df6brRfKPr1cgpDopM8yxS4coCSfC +BhH8fIiWTgdffbR1zjwtatBjrLSgFrJfwPTpYPOpP46V/Qflb3R0p6odPN0C +OikSMtKzpmLXm9LA2272KXUfK3ooWAw7QWdgX7wF4BMGaWRmsoMJhIGC4+5A +1vybPZ8Yjmrzn8ndWVFK7pLty+/SP2TnPkfZGT+m9yn8GRhMH8GViVU+ZY41 +xlrX8ofxOOlgP3Zlwhvt/g8P3ZP8X+b9b7z2+r7+cjR/LhncsSqTzCo8WE6e +CgCPr+xno78x0VQiGlpBgcUFoZrBAJpXD0l60mSvWmH779z+q7dtGmYXdWGS +KKF/UPt/9/3ef6R5HL0PGY6/c6yczz6b2zg74mSjFl8GNTGn9x/ZbRt90jIk +n8wzxoyV25crmH9iSnuMuah2+PFUuu7JdrStY2ddtNv5rVsi5mEEfvXkqyNf +hJWwv4WcIIhXhxZAKwZ6UnTDMMxs2exx+fi/jbrY9lyPjh30lXyO9Fza99tV +xqSrbvLba1wBcSUy/Srvc6pVdpI/2f/Q9Yuz31+y9p10YMkLd8qBEYQwm979 +e4GfpJt0Ti6ChOtw3M/Y+7sEuYFIFpgqc8VOMA9L+qAErBxbDshhgZhEvBxk +wcrfC8GcwXwZKTkT+mqjO6L/fAS8I6Hr9Rld/3cvJnHJBioQAX7KOcY9X0vq +z+J6LefxH320+3ygIAJ0gscrN3Rtt9z1wCPcGt59ISA/hYCLT0huAJ/2IBUC +CEvgIXapIN6Hbg4h+AL9veCgLrxTB3wmeHwqJ6KKJ3BmeFE7ibVb3szIrMh5 +zW71sVitJxOJxOCDA0EiNhGxMKhbzQqre81rbPka1QbFcbsU5et2+r3Wzbtk +8/rwzeE4ITISBCdkINhNZE2JexMqcODkqnMQtqisyt+k4jmZ/bA4ocw1FNUI +1YG0B/EaZXpvi3LIBCEjoHF4F37C9ErF6ekxAULWpinjb05G/Vvt5I9FLZ44 +yXMWpkzEzLcjDsVQpFTSKrVpqpPGFNaUJLdvcsCVgCkCygrRDlI03cXYVC7T +2nsGbywSYUPQtCawm7oVuK0rC7mxMKhXT2F1AmFVioJqt7etE2yCRPMG7jEj +xgake8DzaMlezJJCVe8wDOoFxEHMZ6hIKdEwdAVJxXnJYVcYhWCQaQ5nnu/a +h2aG10+bHbo7v3htkNQ8W37Zvq7p+NzsqBvE21T43FeO2RLnMbi9vx213nph ++ONfUuFvvQ+mcmGbrtPTbvBpaujs38RHHpfbzLabW5uPPkg7+NnGS76s35Z5 +yKI6jrnL4ffidlQN1NtU9biurTRzlbHdtNVRxHW8jbHEQ0jHTquGftXJDM0v +x27REq1aaI16zS1uzljK1FLRndO74grorgm2S2KZatBrds1t/6/0SJB3PgeH +Z9f2DE4kSDj1cWlk1sz9VFNrmc5jhTNR+G/N9h4+PiMhmAu1buOIL8r3sGO0 +I1YyEIu7kulqxwOO71HchQpVLSy0QCAQADARFAQCAQCAQCANvn6S4dRNRRNt +cNyfPeWimxbuYc1bW6TbGMq2KaxkKNEjN+b+qqNfYkGCen1ZxPSdU5S2qspb +VlVVkmpgkwYiIG8/LezLZr48NHEPDz/sYkHtDr2JOJ5JhHqfzdahPXjs4STt +4/R9vx1dsw6I9e2OaFQqZvJ5dvGvUze/tzjRSVJSVJSUpSUlSmzbAIrauq1v +GtTVZ43o11dpfB6PsHhMPSux81aqjmdCm2t8SZi25cssTGTE0dok3moxjYZq +G0HhOqp0eiyejW82vWe97AAHPCtviO/hb7LVm99rd9r1ZDYngIjJDnPxOsye +S48ttZtrMxc0VJxpraN/muDlnoYdtSdLYVVKMLBVwtZbqYxVWGS6moeaR4WW +I9GMYVVKpTOyRPj2m0kjcHd+Xkh7o4qsRPJPAfj5eO8kj1nPnatte9+XjXz2 +PDsnQvdLo7NLkfOXsFXKnVXureFzwlJHhNRPmHh7fCMzMy25WWxMYciycx7U +1PH531ldSNi96SHJGLKoqlKqlYyDofCH4PdpM90c6rf24fSewCR6iDw818sV +VzF8nmnMZAsySDDyMjxS221a/pzc8JPn33Tx7+s5Q6ZbFF62ZcuIqguRo97j +puh5evuWQ7Thc1L9nvz2doZJYLI4e5jn2VeNWvq0/r18aqrUzTDPSUoVB8mg +japJDJIf5+scQSEUBwQiKBA3JaWEKSlySluJlyrmMZmySH90j5jCPLzltt5z +ukiPi5rCycBNGKYSxENddrrfWalNEHmCXKmFNQ53pRGAKABkIRUDiXAcjWpI +Mk+MmIn23kg3eBxtzFeiySRqRxIsjd3bek3GeGuCGkjwt6W22229Hgp4a2tW +KaN/t2TFFnJbO83iakb9+vOOVJTGJTqaOvTn9qAsETZtqGkgxQ8bEn7mG53b +Tx54lSkbd7IqYVnlPXv92FMPROQ+aeJkh57jYd4DwFHKlMzlIZCDoPRfI5s7 +khKiJiRn4ixaGSIWjubBiRJFWmTIHSdum0sa5m45ctjOCl5Lyq0OUG/xt40d +qnvxbec1UpOU803TUjzBpNrN7V2l2B6hxd1HwThxGUXqskxu3ZmY7NLDTaJn +rTCZIoiHPSTgdxhhxwcci9pc9r8dSEhISEi4SCvLbrvnhbmaYxos8pyqUnjE +4d1c3nvG8FNznI23ueQJJAJdrt262+rzOivf4cemltGg+rlzVqnx97Wbxa2S +FpOuSBMlqWRj25O0+rbDJiZPPS6NQqixGCmJ7drtm2sus3ibGRZJYiiqtSpZ +XbJXVEo6q44qlY221bVbOcQ4dqlwO4dDfNceCtTWNWTeEOrGQio2GETrLEil +HpyYfBZJDaObqan3XusH8xXP4LjItWJHcF+/p5aWKTnQaWbrOXK5hTMuYUzL +x8F0Vo0mJ5eyFaKxgIf6NEBwvUw1m3dw90euwJ96E4oQjLGL4Wywetedh7Z1 +4Nj0OS8Ko2LlypHLZYnr9RcR27rOTVHT9FKYQ6bmzU5LI4bk8WnN3jhNWLVh +s4cTMxs0smm0g5l3ksjso+Pbm5ZXJ9drjebD3D3UyxtvWl0Tuae5pR7HZHIH +qWuGTxoms7eKTxPGTRvvebJhLHX1XGRa7GJ0jc5HJw0+Pzpcsl6RSxxJ4dMa +MOUmPGfCk5qyaKNg9e5VLW0ymtlpSHqepmZ4z3etj014CHl6q9+rYLXzWtbb +a+ZY23Udx1alm0yZMlMuXLmyMVsO9c5LFhLeBOjeMWcnBZaFQwhOgkdJAYkw +OUyTcmkxHCWrbYtbTEVDtvnBX5DZjr3F7EZZZZJXnlL6j4em7JG02K8ibGiz +cFKLEd/GTlC8GIzDJjWjiwj2anB3dnVQysV2WScrrip0ucowR1VJGQZF5UOV +NE2xDOImQ9p1JNQNJgqpLSy0sttstLHaWWWWllttlllpZaWWlluxmJ4yy2ck +kss4rVtsW8bZm+uO1iDrz5VTSJrQ0sjy45c42DNDNcOcJwnZcqapkNXkk2zZ +JzSb0bI2NjQphKTYpomw00MiV6Dxk7IvWcxnEq9meNcrlx7pcjlfacOqZB8B +5HEQBhWQaVKKcBxkiYWECeQUSQ6vsseXOOiSOkkyzMzmGYL0H4ICScQMISAp +Sd0O4oMWmRnTDCZx0A7kR0O+c7oq9NDvpZIsIHYRvZHZjCMF6wsexfiNoyEB +oS5F+QJhSMmIhO8BN+J9ELonjUaPvMQtnLOZ9rQDybEorsOqlXvmJNgxwGzK +DXAi3JauC1Q3HGTtGWtGxDRse+Sw41K4cNUtiK0Q07IVhrT1RoReSxqFmVsA +q9GhDkae9aeVoSHojRGXoRZawSIEYZlvYOrALB4p6kRKeyTGtppyxDqye1h2 +0TAMMzmQdnJ0pYT9u08lPyRcil3XRpduS2IOWx2NKmdxqdRDtyxG1uH4ZbEU +RORrBBJYjMZWPj5gIisp1gi8kbED0wymaENmYlmKxDmYZl4BdQsEZF5WIiYZ +lWXVgrHiatTYIi7qouCwC3q6skjpg3x+GGyR+Vx0xYQn2uRk7mOxroqpDotW +olM3ayIp9vIaQsqdGWrAuqLu7C6Lu7sCZuy7sKqKKuwmqLq7Aa7sq7Caqquw +LuqqgU1M1xBwmixyE0N2d24Q1BwaHXabY5Oavq3a92DwrWIDkUxWXZYniaoU +PFC++UBVVQqKCZqSIiCQeZkkRMz9ch4gkQ8Qc62y7cJ99+gtqXC7mVkpyB2I +OUSEd2KR2Eqd0FEddWxWitFaKorRVE8u13zcOMDyggbhdcTyOcUmCetP1e10 +DMIGzTaAbQDaAbRWNq2qtq0bQSDazk1AuCY0M8xDjcYgcwOI6nrnhgaOOjFy +pvDkHQamJ1ynKcxbTY3Z3kQ19DUKmXFHIcsPwhrt855JTCZgGZIZgQyVLgbQ +skGx05xxxDBRyI5xCo2VDvwNApN8BxwHAjfHJtR6qPuIgGSIQHwvAjo0kIF+ +gKatKOMMZOYUWo1RHPpJkg+AIitTtr6mLZOzXZx5o8H5aXyfdw/edj8Z9czY +tSLK3+dTX9hn2Be29kzH5zO9frU4LWHlhyTZLTUav5Ech+dpPuPpfNF78m/J +6rwTEwceq5I+jwico/KfSczq93uLThZG0ivwJX8qtaptL9X2Xwoe1q9dfDeq +MeUna79l8aV9fY5I5oB/g+vpfsmFwyfruPIwrL0Kj0sr0ES9w7TxLOSyNvlS +Pqx+0RlQZfrNYErtkjFkja7qVpgkO8SNaTbZkl5MmJYrWMOq/LUjjSRvJCOX +9qTchsXa1yyuGjyOg9FWjwqU7RValh8PanwWPmv7VNqmWbKk2uqbNT9ufTc3 +yMnGVlXeq9HRJ9vI2h4zwkhkk/sNjudfIeMDtkzXu3H4ZF7a4ass93G9sXR/ +FrzjWR+3Z+G2lsnCVa4rKm/gH64ZxZPD5t8sYifg/eeU/Adan3j3rtX0xUfY +apfBRP3+pPw4CHrnoNbNynNTnCSQfuo1bSS6jy9v+bUpV4K+p3PwMBV79+jj +8dEnnHTPvdq7V9r765Uk6L5+yPe1fcVSl+YqlLzT920pvWPt6mMPAetTt/cE +DVPmNQ617Z3e7lff7VdqDRjq4Xn0KUPbhg2iD+Gr8fTJLLClWx05OC4nAxZa +42m1rctsNjZy1I+Dyk8qeNHbi5m6dk+5einqQnmmZqr4jlRxKK9XXUnJxP4M +O+SrRCOIUnW3EC5DMQ0qvJujBi0X4fJ+Z4z1vh6gqsb21fIqlL5FUpdkXeX0 +JFffeqOz95Xn5+32h13LUmMNtaVm0rK0UFFJSaamtNsqzDTGLWpjUxrGjGY2 +j7VPa715R+q+e4p88eDK64Fy0RKKkD2px1+I0TST7UCfnszkMgj6jOTam1yn +KcaJXbCcerlHFpTu/kmUOVET3Inc9yRQ8p5nJfEu/zduwV3YKtkkllH39m38 +AdqlhvSa9WQ/Tv4T8XV3dPop4nKTYsMaG20e8HCfGp6UmkXcskYRrPt+ccJp +uiqeep6a1qKsWufzG7duaMIyVe8jJG7oc2oSN5NmTgZylNDaaDN0n8uy2N3b +gqLHjXsp7JefmVS5zmLc5VwuY8m79oeQ03o2sbIitio1qMhev87C954z5eU7 +1a1a9E0spTIkKlFZCtWpI2xsmYVpNlNRta2lkGaNMwqqlUUbVqR2Y2QfRPR6 +nznynr8n0VNM8CsYgZQ6YmqhhpPSg6ulAnQmSy2BxJF9+sq2RrT5NKjt+56P +zqPV8k/7/s8TVIqVKqPB+f9303N0qctuGcfue+fgpfh0exrtdrtJktFtezEy +c3hznaQcuyiQsRkwolYrEowaFbXYRCkjBDKYzmOieX6QkP0hIfd1R9Ej7vR3 +L4L4uMzO6mcfZXJ8rHc+09kdV4X305TxPEuU/FO6C8PY4F1rVsZqxmkLyNd9 +949DnXVOnuVTxKnevGNZs0q8KaS8vTdemhy5uSLMuBIi5yp2L/SWZKyzJWVH +CLN7vW8XemRcpPkkoppGasyVlmSs1XUMTJqZdJzrXLOZXSmnG0ZtUG20JiVi +pBiTaLDamSxZWfw/xt4jqn2nmZIcpHsdaWz21ts0SIkkEnjfCatVtreXJ/qc +9j4FdR+0dvGnfzbSG5eB0mUzNtuWOC3FzVtddHLnDry/FJ9tPppynx8qlecs +v2+vR6Lt8/Lh1Ven5Dy9nsRqvt4jk5k2NWpVXBef0t2cri9zwj6s+daqyzU/ +DwPWqzVTNoy2sZZaZlmFG0DZLGevPU1Pa12T57R+2vcR7keyr21O/T3DMfqK +Pcd1Ou0WV1VX3WvssfZdbOcmXMXVZVYzFirlw9kjJqaj4Q0021Isjdut3zLb +hE7lJopXFrIly40Foqrii1yW4tyVxyRZIiK6rLiKJdW5Vq3KiGUFYOcYrJIn +tMW2IoVCBgQ4JI915HeXRSIdEjhTD2PmG3Sy2WxVD0bv57jHZ+9WWucLKcuL +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 +reRWyttbdteI8BYLBhmxhlhlhlhlhrWWGMaT0mASw4DIErZC1t0HDGks2mxM +geRIJNB1Xgbo4mgw5gDoJE0vHUcEs+TewXOODW0sVpwPmt+HQcVJDEuSS6kl +/gRTNuavcIslwmHtyYIJeAZgQAXW3fnMmOtj72MtNfTu2mIK4fhQSjINn5Oc +SI1siYdIe6Y2nbyWeT29w5V3Gqy4mJd8RhJKikWu7jbt69+Nc/CcNXXiwrmb +nFdO++0OcAoIH4RxBA7FF7gIRsahsJEww6qIltane9TTQzS4zWMxjLHGiMl9 +GPuioytae9w03bFsWWhhQEBsZaGuSIeA7HISBSk6NBJBgdAbDAkGCiiDM11d +1o5a9Fd9NqWxPBeg8+13RSPqAjgRwCIR0LoFwKQXEQQqRyzU6xxmG4GVE8BX +eKt0IoCggddUdidpc9NvmOC1hQiCFA46cgOjRYQAI2YzYxZpwvZXNjfveJHW +RZFkakdMq3kWom6d+HiehKdjmeBg5x0keCWsaou163XXOcK5K25zhFcjNri7 +IMwcLNxZO8ijZMkUbSNakaxtnJbBdqaaTJXB6lyV2DtTOLU707HRO1PGcqu1 +PDm2HKcod1PA5R4J0u7qnZovSx2Gixku1p4Uw8Zg7Iec8VahGpKeOnRHIk4c +NunIKst6C22FsaiI2EjQQqtrqqbW2usbQyV1QlzHJzLW4TZc5xbGcbGjaoor +sVFLxuurIUi0bGzdoO92VeNeG1S87pxG8NxrIbXOcc0xhXGqWxxKc4Jc5y4Z +Na3HKtlVcTVjw1Txqa5mzoSZYVZ4WBysBmppthNbWazSZitGTJbaMm1G1ZaU +ayjLS1VjSpNK1WYLKsU0pOsXErKyRWwswbFo0Yo2FtIutEXDKJimZbNhhpti +o2WaRZlNpWWshqsRlMUysTKra2lktlTRqwYyndZzViwxGjKxNptmpW02BmhK +bTGhljKtDNSw1ViapZpUajENZJlpiaKNiJqZtrKpNbbspMzTJKFtNuLbjSoV +GjNllZpTbG2LaHfctNjFq5KMUdGNjEM1lk1rUDNVMq1RtWWTMiw0GqsjGTat +EhqldnfxMQOw6XgYchLAdXERyy1aDmXmeaiHynLHpre8ckZi6xw4rNrdbZtO +prmkskOmfwNYm1WrYLbbReN/K5J0TENzVuxty52RMtSyNCQAV4eDV69dW6rd +rK8159IHl7TM29IT6fWpJJCSSZYYtbGGYoOQoyOB7425ctsZOqbW783XotVb +UiqWU6tNXWtGQtWySUOvSOvOqm7g2KVRaOBdbEnDCxeAHGYYSA2cA9N2MV7n +evSy2q22LaE3UYXMzMq2KpYqC0OBnKsbTjM7IytQQQ7EhzbaqMsZ5jFjKNol +WtTCyFlFliJqKWoAwMcUswjGEiYUVBU1dLWq1oxjMaex+Wb8+cnZJ/HsyR8B +XtxKoeHo7pPj7o7UfstwdU9smcdeOq9He80hg0SY0aIjFvwHdVL0FV4R8Jqf +Q6l9fR/O+mXY6K9hD+P6Yu19P371a1ttrW2njQ9qSvNPGuIq6pPXKHf9cvOp +4Wjw7mZJ8O5zHqOPk4jV1yyOd2kRUtqTQ1qemd7hPlsRJPo6ySZTyx2iXwse +Kpp2d3G8jdpukfQ0m+DyeIkke9OyJOfefyJ57QtKYfqPblG0OyxG/E+qeedk ++x3A86YTz+r1+yt53z/xrlUL17aW5ootwOCafVwrrQbT1/gemnwPFemvAnzE +7mJ0J8Kr+Z+cuqTwpyp9pnxPjTS7+96z6j20q+w/VfqFLj1SejbE90C+qOiT +7Yi/m9MT6N46Ilh6l7E8x7vb+f9nM+wJ4553nclVKX0qPPTWZbkOVd0A/Gan +rvf7adH4qW2vD3+4q6kdqir8EeKR7sk2/H525Iij6fV2Q9x2xxbM2GzMVjbK +WwlklRKtnl8Q83xr96nF79zxMSR2btkxiqtVVW2xK+yaaP8CRxI01jaXrXZK +vdV9anzr6H3fHk8eubXXUckV89O9c7mXrxeBl0d6cd64p4p0qvhqHhGzpefw +l24u7uq6h7gYP1knnEdX3Hw3Psk59Z5JGuZkki+EkQ5icnuq2V4fVjwo5Rf0 +X47bJNTJdvUD8jSNZJ6IPQ0zayyM7x4H60nh1WWzl7oetSzPp1NSYxnr8jYa +L5PsgkkJCdXQoIoJZ8RcSwShyZ+aUTSUMyGhX9vyF6oGl5SIQEh+HNDJhpcf +R9G9uk0bK0myqqqpSq2HZXD0meU6GuOJ4rkeghUulR5eWRZZJJJLm287x0rV +matuNyTZ959D3aaT3ZZ2U8SvcGC8dqmrToYLlGnDVFw0UGxgNpS2lZpWSZJM +zMqaLJYjUyUjVFiIKjwfyMkno7/qYtJuPLxQk540tu20zbehCyfo3YPOP40c +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 +8dnhkk4ZV1eL4ytvCfITvUmX2iTHgnFXhmYZmYJjRbPSgksYhkwFGALKrUaU +yMmcgTVGE3bSQm+7CllaZadbCfaciIxN5+Cb0Xj2lU7t97UlHB9/2j3PmTPG +g9ZOhNzbZfdwe0zD48aNZ80MiThvSUREXEkUld5Fxd8rlzM235QfV1X51hos +rBlnx5xqazLej6Z82q6PIZaaMZaGXdck9FXQ4qw6eHe9Ds5IsnO8rmmSVGDV +fo22j0jw6Tg3L8WiPcmxJ0+jWn8bEMZkBNbWy8Se+pSwiwpmtGqlSbJjRHxw +5hNMrOLi5S0zIq2VLam0tjalXuo8id1reHDmcxjY1zR2jI1jJ5idyTYkYSMQ +amvWXwO5/M/6vNpPEHWuznI2ptOw7ZslMIxsfz3E6yJ3HUmaF3B0STUjyUyZ +TJ2u/NzmNsZzF36v0PavqN5j2vsh1D6PhX33CrktDUzFNGVH7qOPZvtRS9Mq +Vx19mPs0uSY2pqtsZNTI1znE91Oe1hSxhtmlrzsGVlR8ivrehCZ6n3yud56P +prtPjHd3RvCP5IyraT9iamw4xBUuLQuU+CY/PT6R5JDli3MpbFi0sjH0zwHn +N25Ej5MxvEzfeYbR0QsmSpK2iOO/zH3opsq9mI0SK+aGzJJh5x77E6p39L0p +5VMDRo4uRZL3Od5W21tupvreLFmZMlsbSZJME2Nfr/q4Q4kpwsU09P4utrWl +nKpt65JOW0Y/DmEald1rs3TWuynObkJBCAhRqALQA21AG8GtXhgdDA1dr0c6 +iPJju1lGl9UH3HsKci+ah878RR9iynLVpnBXzvR9qkYfScjxPpOVU6tJmt3o +XTqHTW1tlrcOVHNDQtSsO87Enob5Fz7OXozzOtb94t3HpWr669danB0eWq9p +3Xvp8ynfpvwS9TlT9halZixgS8nUj+suWi+K2wi2VRHXxNOIZDaHSlZFBMhd +7ytSwgxEmq5T5entS+13PnynB29Hcp3bmo+haRy7fYOqXijVlYHeUe12LSLE +4Px1PniAv6vzmX61MhH3ZrTb7CTPM9JaOwhB7vXD5fqvcp4leJ8PHlT+z/6H +8dfDykwtPjz8EzZHWQxkMdTGRakaFRKMyqkMkZVw75dlS1SOVFMwnbs7O1T8 +SmjtNV2p1T7w4Pxna8v2HMxec782cGZq0VmhGXZdHHr44Y+56DuXROxunn1T +lbnKqpyVTtC806q4LFNJI258ddrOaGjWSI2Lad+cqtak6nDjJiWMPBcnF2cO +LGMGGTGmGjQ8aY8/6c8ivweuCnoq69S493QVXz89NSn83xUUNNRXUPumCZij +Woph5e3z1jK7HkfqdPdduQeyngPVHeDHb13rFiyjG8HKsbXmcRyNOpuTGjYt +D5jpxSl0UsTouHDoca/aHOmzr7o5A0J5HEl2x0EsFF0FhYpKSgsIY6k6arPe +mOzt0G44qzsrrWxbnJmrbdSGVxJkMieHbzI8OSSRKRO7SmglgQnBEgkFRkrc +FMIQkDHUy8VkqKPZ7EivOczssZbXtyWrHsk9XXqWmcv0R7l6upE7+s2uLboe +6etciv4+qvSCfwx6Ed0OilSz4/cp6kc3efbJFliI29sNkm0RUnJ4onf4dbbe +2ZrNYuLbmrCT8Pz1PnCufEjPXrPSTeOR5n5NOa5LZKrg3o+efLPT3Oce66nt +c57eGOa98VSl4eTty47ceML8Ph8oe6oxlbbL545U4ZLRl9xOSOlvyfH60UdG +NDSZKu7uHB20ieiqfc+j5KPTPBFHcH1TivqSxT5SQk2j1ev05czldmv2ttvb +70NybXLlzM4Kn7NIbpNOOVTasxi/FZreSbRraLkl0uZDskifObT+krrWWTd2 +kzq1NGUe74+7zcpFfQlkVLKlMYmJq+/DNrPgOSR9seEdm/w488E+jnE/SeXZ +JwTuHz9PM5xtLvOT2qD+fUkmq7GQHtpJGESRtwj8Kb2UviO3lx9P1d8qvgyP +p6JPz9TkeR3+1yKVwmVVCZcgMDNVwnBXYq6IZMIZhEPBPkTPtmyeB2He2xYy +uY0q83m7daQ2saQoK7NXGuu1UrJCUzU0buSfMnJAbIlwOBdKyPF2XYDqbp2q +a7WdpyjhoCPKxJCe84cmcH8t9vzbfr/g0arwZDu6H1yPt6cubl3l/V8JNT8h +x14tv33IlJisWSSSSEhL03l8366Pd5znLh6ecRXUOrbcciFCFaE86KASSTgL +QkkkAJAkkIEkkkkmAAd/Pq3ltvC1u/lu/NbvcTp5PKXbzTzj4RPPUccJaPvo +5FlPcj1JJFL6LFUpaNPL9Z3Pmo8KSeVpd5uqSFWacs4oJWatttVTWs22uytX +sW5exwAA9GUMYxjGMYxjGMbP0FUpe4qlLjvm4+N7849vOHt/X9yvr5SiU1qW +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 +EDUsk8daty5rNYZlyWqy0uXCxkS6fqDb4/RMnBA++Y5aS8E6O9nXbbbbYcsr +006ntK/XGV/F0aPf701uYSRJcR7fKjxidYbSJ6e34cL97D+omfiI9T6/uafi ++ClHkd4yr7epKOofcW7M9j7gcUfGXTj6Ph7K+/+RNSDL6Xti7selPrU/fHZZ +ev0fTpH1ROCpCtMfjz+YgUqxMGwPtJKeeALDWXuh9jw2+/wfIY7KYvnXert0 +y0pwZgqF5xJSiZ+LSGQzCGZWPB/i/d8ajKDjwOSJ+Yz95t+QNCT90+aYsk2U +KpY+gmbU5oZlzHM66cr8E6nX6p9Fd+1+DVbLm5j0+S7r/i+HesVDzGyrRRJn +KoXMLcwbmkh+yqbL8yftE01HCzqsxSsdZrTJ88jXqteP6CesWLI/73weF6cH +DYvKueZa9NdJyke5KVdh4xfyW2uMT7Aollsj9mvKfrXLPu+6cdWu2dp3z0wp +PhHliqvp4PPzNi0vPFdeG7ZGxpJhT8pICeZZKtoILazJNEba2q2xsL3UeiP1 +T6U8O3epU8VjxGmTV5HZeh2qT7KYXVVyLlombNhVHKvTHdPCqxHw+EMTt4F6 +A9pRrqke2PDZIkRvPKd9E9w59/SeynD9iPf7OX5zmWRk1DSuXOSDJhZTaT4W +Pgt2d55Dfq26Sx2stdKcpH4/CR61+rD2Ep9MnB6GbbakV26eRFSdklHmKTeR +3h1Sih23QTfn+Zpr8Bc9MnouzcN5UlGHpy+mn54ZL6VTWV83hrc9pr3x/J+s +8jh5eU9In4WyRW7SpVfqxiZKzJPl7CHhrdkMd4nu2ezqbvT6fi4fQOUcnYdo +h0jiK44LTPZwiJMkA+n390965TqCUskmkWPr3wjSdofoHUYeCWTr46a+Ukw2 +KGfhlW+mGUBIwJFFAGXb19Zqd7442fNj5XmXFsxmxlmvvq6stKsiY1SZaKWG +GKuG5tls1tlwul6B5mHVHVPdByZv2DthMMb8doQuiSFtroCszjiwhgfmIcwz +XfRtvp7Hv/lPRuh/XCg5VIWyUqVQsWIk5CfD2PZWfTmviYZczFu1NlZhhmZm +ZMQlEKfbAZoUZ/AuUtk0ZCRAEaMYSzjl0ta21Ti45Dlxlmq5qsmQZIlFJH7f +8KWo8WzflkYKcEZmBmi40bCeVZy2yM06JocOuODBrCLWQ6w0YclUpaSmsoas +dcc7Gak4t0q3S6p405lKElS0TMtYLu5OUpd187JyTjlLCHRmtRkWpYJFtfyN +9OG2MaOFW7QyIy5MjLskjGGI2SPvxlkxqtjfYai7bRNE0opJzVtGHGo1YcKt +FzEu2TV1RltS5k2oyi11znhpc1MPkzx6hHBqVYYoabPDm1xrutbwa6WZXFxb +tNbWDLqy1tnUbhjdvJmFHFThWlJvN7GrlMRoS6GDMW224qbSxq6U4kbSNbW7 +FrDBZUXJMyHNjv2cpqZXbdtrOqcdXRdUwnS1LqWXGlmlXVMXGWMJoxR2oOUg +lwqlL1chTpSTmiDoqlLod6EuUlSSjdZrpka1lsMslzJFzIRjfFyod3NWByU1 +MdLVmvJ1BxWXZNrZoZFXEyNU1Klrc1XNuVYapMEG44cuTkWqtTlacyYXLvjr +XfUuc51qXM5kcw2S/Wcoet1Hr7T+3qR3jVUwtDJlGlHjJ+kxnvHs+HzHZLUt +NRtEbbTByHOTlDxLU/ix7e70vmqe2nFXzaVz18JOWjwqRIQ7TwrwneJCOB8m +/k3lv0Yk5z3Gq+cqHpk2vPFiTLatrKaqRtV3Jyr8yzN7jpOdpPCzN85kHRk6 +05xw5Zfx+ueWtLTMJJuee23Fbs3mRopNJVWQalNazHfxXzTDzJVDo/XfPT0R +6KdjFfSqOhyh/Eqmsdj+YHl9Zgxw5b3N62ras22vVemvVmrq45AAi222rZau +XL2pGSOkm+7DYePhDbiERvh/NV7rbaja3udrbrvysRF56POIWPb7O+0k3YsT +B+6LHudt+ZxGEGZMFIYb8zWpbS26k2dNp5QZlu/aarlXWa64uaADAAbO7h4k +/nqPNqZ5riXJiaSq6LFCpc1K8AMUV4e+p3qjVq1X2fOHp/en7sHNj1S+zxKv +IaRZiSXmTfL0x++R7Qe3qOOnOVeAznhvF1UapfCYje5M7HxnIccPhVrk5kk9 +IG6I3xB+Dyvuz3S26X9e5Lz7kj0ONlrYkiT5Pphqeiqo8boTvDinfynt90Pd +Vc3HzQr4aWzTIly6ha4p+by7PB2e/jpNYzNM2ql1WDt2RS+FIjvK7077Jza1 +i8HKda6YuYXEyGGjlWHI04uTg7ypXXelV70sT2PRPPlNuXORakhGtYyudo1V +U4tM4bk1w1jZaOFqaVDEVWJH1/v8enHjyfj325wm0EN7H63X9F05ER8gR18U +hJ+Axxj3B9IK0qUzEdOgltle1033n3a57Co2yI3UxxRtcLpFkhGtqurdGMm4 +34sztJEJrYn7fSOmukHNqYeBXftt1Hkbn0dPAsTtcWFK5MIMB0z84ndppts1 +A4SfW5rAsstcIflZreiu1aoO6VLUkdL5rq7zq0m2tNfJf3mmCl/Z1WLs00WR +ki0hai61mTU1l5deXKSI4UeZt4U2dpPkVz7YuyTtZJO0dud9OkOQpo7ac1kS +PCe2NtoPA5xEN6g3xuxmSgxMpgllEtP2p1OmpM45UZiKC0kjLMaYqcyhpo0C +zxcgjv5ZjifSnElxrINsEsABCYGXdIY/dY14l3p2ccpmpmpmpmpmpmplkVZF +3yRjaskfIfUMkaVA1rFOmUzUzKZqZqZqZqZ74gHOWT9NXRMkjOzDoZdl3Tph +RJD/Eh1Y9UVkSoTdopNNFaanpN9DKam6lElwGtn3NOD2NpqWWORHjJM0dXZ3 +Y5pG8jhIdInA0HsdtAjsc+NuENjtMSkkByMKnhRlPjPWRVd5oo/ET4va6JJ2 +ItKyq0s1tNhtLySGEJJhI0zHh3Sk7plMLpoZpafM3L9yHVzmeeMAsZBkWamm +gwJMSbQWLWQu7BRCN8yVjMzN20z5jNFYant1DTWOW+dePbbvPPXLm12ra82r +QCGISAMta7qNXw3nb2+W2uK5ry1rxZPm2g9xj5j2JQVOnXkcy86ttWxM6Nv9 +Prq8JAm3sKozpI33N0sNbSpR7mVPDO0dO1djY7VW1cae1y2tOEj4aOrFrTNT +NDjOWGUAsFSzgwZFohz2akjy+b6/D+AcUzAUgGQLST7ZjT2lYItIdALJPkUK +XaRwfh4LTvHIni8nRYnBwOh/RNE6jwPbJ1ZJHd/WbE9Ue2KiRSju1zVTaKSK +nL2Wyd6y/pZhLWXJuSSSSZI9m2pPRe5z4nv2pxYEQpu5WjgKY2B4wot+o5JS +Ute4osG7TcyPfJs10vErLlvLhLRai1N9ukggkAkAAkEACAkkkkkAEEgAAABW +t5KNtcM2onsqKLgtbFbS1JvKp5U+by+gasp4H79jPHp8R4NalRUsUk82x3k5 +8+/q9iVKlJp1WDNLNTzl7J7/jdbKImp0Y8pxvy6Kq2SMsDSvp08ZIj8rdNPH +sdYeTRwdZhcmc6PUhatds/P+OhTXFHq3yV2Ysh5R7VWd3UEghAgkkjkY5y6q +td6rx0QoaStIiId9rnONcsywqZKWbUtKttWxpZo5PlhOarnzInHoai+H14TX +tvCRXea6e9I6dAAAADzDrnDi7Oerlx4A48CAb6us2lt168H7hz2bJua/BNE9 +Y0ifYmpPEraIdfROZSrGYfuak5nsECx9Cj4zy1UXqnsok/nK5PciTxPM69p4 +KPoUqvk4Po9BITwiZJkkCyxEcr6HKkq5LNUjVIsqrSYGU5ZX53mjtOnWzkjr +oK+98wV8np1pueXhD71KpzRVPDJZr1aoVsK7duUHbReeqh3Yg+m8CvQ7rKev +SXizBqGrNSMaqMixjJMstMWl20Tay5G8jvy8WxsmnfxuHDwTJqVgMaZamksr +MrHgul3qomuzvcssuc4zwazwbqcyVSl6PCc1sMPG3Nh2qdOrqjNtVXidpY4q +c6hfR6mx6ALXoQw/MUDMxJLEpaxAsE6SA6SHw9Kq4n5T6k++nd3UndPqPvHE +qX8+/H8PGOxrvlK5quYpwymarVkzK2sysybC2KZhmBtWY2U5aXMbIY5cLjTZ +RUtMlk0pZTSWi1ltSnlfFuLmWmrYti2ti1pbU2LWhtTZNqS2U2lIccXJXHOF +tDJitqLZJzm3JznKbLjjim1XOcWMbNi4wnONyFrGYG3LnFG0tHOLOOJsmyW0 +jnOIcc5U2hxiXNDatqbTnNytzkhmrZOcd90G2wWajZURmhsNrrJcY2is0T5T +zq5q9/SjdWy4k9ZHrptkiMskDHsln3Xgj2dvvj4e3te3tei3mWiKiLFGNGiI +iKKMRiMURioyvfnzl0lwX1rUXSWYXC4uLrWauSDg4ONIgpaiqEIyEZCCgoyE +wuJdazV955w4k7IpJsem2GQn5OxyPh10dHWXKaMWlrIbOlrl+GrrE6kJxKJ0 +MW20svJFi4mlLMgsizctwIUUVhLnbJI8IUYsmoQpchKqlqqpi0QWYrSrqeGl +UxVV11Cc1SlVSt8777avGtNbOWatFGMxbc1llliyQwLCxZZbAu2eO65y2qUr +TjrdbbZmZbYteIply4g4J4LzSePG3OMaily8PHm7c6JCFmjOuvWdu0GzfQXR +7LgceKeanU6dtfmdpJOyjaSCpdiRSolHLlezta5EjW12bWtkjW12ly5NpWaz +NEhGkPKOTqg5qJ7RYkjXbwu2fi3aq+PGjUW2RydXJwuVlo4itZrSeHO+5b8v +b0XqhIIohADHhjHUgG02gEm2AA0mBAbbUAAAABtpJrTRprimmtXi311CNBPp +U6LVkPl8fHvX5HoTqak7SOfU+cxuk9RO9kiHONo8d5J8yzXnvzrSqJlcahj4 +lHEjUIMkHqooO4zdr3OfXsX7l8hIOMRhJIFQHSjHToHBOCpFngHAZdjQFYgl +hMKwhgO/3Lqtm0K7ejiH2YUvrPB2WqeOymenF8eA5zDWNEJ3O7JIc4eBkkiT +iXt2jhXpLWjz5SLva2Hr8a8u0uxDP6EZDmc3DUI4zCSTnd6JNkeJKTxruhdR +dsOdZrWIHhfD8zETc5pGQnBYLrJEnK7Sojr1XjWhxc0huJlMjGDnwiTQN+Db +iQl2YCQxDBtHnr017FTlVLpyiukl4QesHj4PSLsnW3E9ztxmHhkKB4ZI5SZu +7GEhralrm1g5aTCpLGXc0xyhdqitTg0awrjMaMpsqSrK4RkjG0t/iel+22vw +9ORHJzUqsOlYpYWFWJbOlqKayrjDNQaNFnu9rrqetw8S7RU2ZHJZFUMUaOmJ +vN5DoO1UNM+ofcQQlkgyby7NBz6dOFjNdIXerfr8Xq9fm2DbYwMydkR7oZn5 +HYU+XklFDPBz08Y24Ht03CdQeQPLkDHhAlicQgGO1rxTpKurq6T6L307rxu/ +qteG/SqKntkiu/n11tRNnvyXW+bA9B3lLkK1XbIXFhmNWbZmZpJJJJJJiSml +rabW0LVxratzWLLJJCSSSSSSSSQABc5sLnlHXz6a87JJCMltsFlsvm8yeDWz +RNnckYZSyOBxPIzjJmjHje3d4ITaDcQQDa247uO06Y35NC8nc2R4dtkHHYE4 +Kgc4ICdNCgVicNnYwD8AixcCMEI0Jo1kneObY5zItbtF1LV3Rk1icJjc7BSi +nTukihKSBMFIuCrTOyd0jQJGJHKRpI6SKSMKRsLGJNJgWAzeeGRzG2eRhLti +aq2R/gLZmJuYpW40m5ynv4crtXgKpS/33qRQ6v6n0DvB6pIOAPhJ6N7shncR +GIfBnZ1DBXVS1U1WassTUe0xIyweFb98ZmMq1bbLmMq1attLmTmkcj2uJPSa +cMQwcXl2Z5zzrvU86u22NvA8K2U8yFI0iQw9Qa0MlAcI9yUdBIsRABaXE8qZ +ZYxpmtFmO0md3LLMBsWJyKKaPKNJI6HfgnSJO2VPKppaWKOo1an0a7ety87r +liMmkxRi6l1OmJIiaXUup1tMtCLEGjyrz+vq9r7qMB/uocDyl19r3WXZYulb +I0V+J4O4zAxSRPxuL2J+awnPvv8bs8ep78hJ6+jv5KSfz9ucaSeOKO9lK7HL +g2KpdeEHvZho6+LtdmNttTH0avM2prhh0f2tHvVjHynzCB50KnvhRxUxAxMQ +NVK4qJTpU8zVPGMOcOCcM2Vsjy1K4Wir1GOxlHfdFSsPKr4au5vubeHHEthi +Ik2ZdaKlyrouVM9peHufo3WXM9YqvWKr3n6L9AZ+DDYfKfAXQl2PpD1BlTIP +syjLRK97t7pjPYmkcJVSnG3FcZtJBykaNbTZJaieFjVbQw2tNtsmVrVDGgrR +hhqNgzE2WmipqJk1MyjFBpLaqwYMymMMNTLDFoymVhlZbKWKhz0PU+c/TdOj +0jsceNVbKtWWyonvdyp5XObnnvOjzU96S7PCB+f1kakaPsISKendXwj24TQs +nB5n35P0LGYkfKNa2Sy7yPCfgsgPWj8dtQn8LxdydbzLDfeyfh9uJE3JHZk6 +++3aE8BkbNuJJvIODB2npKpbrnppcvAnknJfQPyEX0z05ccNE+rkqHzWH1Gp +LOPquS547UdTw0jdyp6Wr1fpHFPc8uh3SDsGqlI7UujocJspuTR0ZqZzM4cV +0YNYs5xdRxrU23GXGzOjodLWJVxTpODLlzppysqcplw5s51xidjrpqqe4eZS +7L2J8qn1VPUvK8tk9HNvF5zun2VQdxXSTw85e+XZ+WoJ3exZZ8fCebFbJPFP +t1zQncZGl8zlfPy4Yz767e09h4/sGzxvU7xe3KbZqq2hWwB9uEhwrDTKVJTS +1SWjYMaNig1jUFVag0mxtitFtSzbVtGxojFFBpNCW2tEQASEWKGgzYWlSRpM +aJMeOrlXJZ6pK1RDnynYpR2idB2QRyTpEiqZP5f5yifOI00Qdldov2U85V+0 +nphc+vk5ngeBKoevt2zanvzZ2l7DG3sr8w5Kqr52gpeXpLpz7MkduOTlUk+b +5pIhZ7Y1mhWF+OTw1HPhFu9a28Fydmko2IjY2qz1Hbqqu1Kxtq7LJYiI1tLJ +0ho8flOzVxfXLk9Pv9MVHlpCOcG+2H2JDp4eMyHcrLlslJiWY2xXoqvq96Ir +wxRpqR6ja1Iy1U1NKNZLaA5WWxCas+kqKX0lRS4OyJ9pWHxW2+7NRy1759Oz +c4XeuizNSRJGJc3xF5sXrXfFM0mA8fZre5WS5cuWKcZcP7b4X01Nvg5fl5Ql +8qPhpK/l9SjQymBpE+R4kffJwPZjJ4LT61ScmVX3qSnkc/cOdChivaLtTqmy +nR022bRMU2SN8wq5S0sXMq6rnACuaypa1y5tJtJtJkFttnZhHNUO0kX3T5zk +qXqfc+3gneH4TEPrPq+jhPdHQejyivl2Id5LRGmNqtingRYxS52nOvlpql/P +jfZ6AMRxRfH5i/pOou0wer3FH8w0p+L2sV89+I6TFrW3LHLs8Jdn2/Dsr7Kl +jzZKJM0VXI1JEiNo3OkdJrZ0bvrVHqaSONLrZs5Tcy2XdqdHnwvFeK2G4qxL +ZLlYTG4O0PjExIe6dcifqO3IOmp2VynuoxUPZ1pZ8E++jqDeNptG2+etLLLW +R4p8YsToWH5/WRhwOwZNyI+T3/Kv8VIsj1+Y8IjoqczYbKOS1ktTU/OsUhxN +laTJq95fx3mnVHhJjfpHqOdD5lPK81Q0OqMfD9J/I/8nxPy6W1+ir86v9b/v +e89Z4Kn01L3SstfNfj59zbJ0Wrb8rNoSdpH0k6vodP1/iFID8CeBtMMWrkwy +Z9faPFTUklRn0vJEJPAnnPiMwuT7LcMRUdo59H22JVSdY0J6NdLjs0ju2HAu +NOhkamMks7OzDOSRQJVQw6bgkqnNgYkJ4I0XPePqzeDknpxs9BQ9NSMp1RTU ++Zco9/UOEtUWNCHrHqHq/DU+79t7F6qfslePy/d1+wrqG/0z9NYt0k0tliph +IuVly0unJt0ug4pzW6cuLqpuW6ZFuSZZawZcZk2h0D7lRK/0GppPgcuLK5MP +1ZHl/DLCRq27uGcs8VHvPnlq/oDtV8Q9aLud36VO6Q1T4BkhtIwlKVjEiprv +267KeFNF2jw+rxrw98k8frp+pTnTzPBVhQFOJyApAgyEynjHEDJDGcw++8P3 +dUslDOwkH5lP4a+bk3r4uRiu1NU5TRP4T7G6aVQkbt7J9dqInh0I0mq0V2c5 +TdVOO7chLdt2jaMH1Z8Kf0HCp9uLwliQ/u2U7TS7jEHGNkQ8CSfDz91Vv4H4 +v0/zHslvu1ft7Z+o2b/XNteCVjiGtayy5D7Do3LDlN3ulayOcTaaOSo4mP4Z +kcb7Up05451cIHaJbm+UqvoyTauAdphJ2hyNSc4Vy5sxxqMk0i1HXTWsKftz +N2N6VrrOhpmNRqRMJFIkNQM0mhMmkxrwzabDKuUW5IwclmngNyd+l6I5rG03 +spuSPCu2J1uklymanQ6XldHOw5LK7LKHJ2VyJydVyuFO3DUsarNIeBvxvj+N +Kl/E80+dV6+emq+9HsKmlJ6XxS7fLC0wtKylk0lNkaxGJpiayrKZWlYtUyxM +0WqJtKrVhswsaVjVbFLaNklbSzRhio1tLDYM02LRJsi2KwmZaapRpDYaraqZ +pTQ0rUwZhmzKmWRqxsaWLYrZDWlVJXtICZAFdywT8kFapEkSQiGWdL7X7VnS +VwFOMFZM4y41V+sTPSWp2HSKPsSdKIqfbISD4vs8fxPeP8dVsTP+Wx3HR7QQ +xHsDMlUGGZBzzIZg8r4cvtTtNd31JwLecwIJtger85+Ife4fPGRH6BqW8o4H +yudh6R9nq34ZqPcc3+nH+f8bbz6flw4TXj5e28bzPlyeGdH7b0Pj8Pb6+b6h +jdZ8+HobFvedB4PBjp2/hJvT9jlR8U9LVPyZ/Bx92H+ZG2/jn+OLzvh9HJoH +Wfe5TwufuX5vkHt+u/63Ef7Dcerw7Pdyc8etv/jcvfk8Az8Z/sHg9ztYeCQ3 +VNMfIX4D1vaf3w84zN3rMOP857jdcbBzjOb7mHlnt+4f+UxMX4/Jx+EeA34T +9vvX0x8X57/1nK/0P+I7TRZP2bEn2DL9t8zsN5JoH5t+/2jowObb47bZo7k9 +PwOBkR8A9FvunKZT+Sb3Uew9aPfGZ6ethsTb6/fbjqZOuPl9tkY0c43/j9VD +2h/B6P/cP8jz/vb/G5fteR/NP7E3X3PD/4j3B6vp34Wjz6e77aP6J7bD8jWx +gfk7vaQ/lPy4/3Ie/PGb+43H1uDb5mTyTN6z6sPNG/H8Dwo5x5XO/2w0y/7O +5/r8z3/0pMg9RvOPxduf1WI+CfJ9R+lMvkHiTbF/2j4DWDx+qf1D/bafF9b6 +MnjHa6rwvwWth7HXz6lflOr3t7Sx586TU9/DxT4jf8l7/30NPH5J/n3Xk9TH +984XE7yHzDV5u06becOWXWMfn1vdw4J4Hrv653reseY3jnEbri1j/a67z/Zb +mbuj7fDv952Wtl+Mdd+d/iG//a6/JPuSdIeY2ST8U/NntOM9OmP4T/7yX7Q+ +b3XTct4EP3JeQP6eWf3BwM/fQyDfXuJCY4n1fDhWKP/v3t9ye6+lM54mb2fs +OxkgYOX5iGceJ5T/mPy9+7nN7L1/jR/VOg/A+MZHQfzQ1hweG/rkreSedt38 +s2bcI5LwH+cdu3rH0tdwoeqdhxPkQ7Q7n6b/mOy+v6//keoPU+++gdb8PXw/ +6NY2zPx8HcQ3B1vz+8/FH7p2nm6fZbaTwj5n1H2RmfW/mh+uafjtzzEbBzre +9MhLovP+PwPt2ZuLN/9Ht4aY3W74Xbxxjct1o6/E3ods550nxP/zFBWSZTWX +EYl2UGrTL///////7///////////////8EoQwQhABBAQAAgCQACAAIYe6++e ++HSmUA+gUFIQSr7MJAQECFaFMDWVKACg6oAAGgABgqqrucAdJ74+B8IKsZgA +ACIA2MAAAAAFASKpEvsAMQePF9vti7VtVn0KD1669dhupHvY76d323YXgAAA +AAAA+kPDA3u9j6nfAdAHVvt3wAfHtgD6KaGr693TXd2x3qnq3eWbxq289b29 +7uUWe7rd53XgDSbGshnY73nIFdtKQq9nc2tSOhqSqlIEUbZdbDIxhXZgkRe7 +dUj29urllTSlK2G1VWxSQquebHnvT1vb4AwB3AfQc7sxt2vtc95XtvTnPG2b +rx3G7Whs0wAgLG0+se84AKfPNO7g3btgDvsNHT33iABm3kDoF05e+uKVSvGM +Hu44aGKn2bqx9AQG933xvrfRffJUXGvgAAD5u+853y2oAFHoUEkD32OVQAoP +d7vARawyGzGzGzCQkPdwAPINN1fe197733jcwkfZ7n3e5ZmzG1izEh3vvAA5 +AJu+3e3x3e53dyzJibZkm1mTmAAAL1nezRbN2adstrZTbuAAB0b1u93adu7d +mmTS9ml2AABR7Z3s05Pp06NHp6d7AAAoU032adF2+7KKUuwAAPQp0pk0ouzS +n03sAACimmSnTpppTR77AAB9Cn0pSgMhS761toA+C9gAADbNbU+veu+mZqWy +75Pve4dKs+vbPKAAAAAfVAABQHxAYgNaGxs98yKlT7YJrHTBKlWtANt6Oidi +igEICgaW22jZ7rHEAAqIWrbduuthTa7cBtnh5zjbDUbzvEep2826AArW3du6 +27pbbYrR15F7ztbL3Pd3eAveCO3juzpvGs9w8O8WprIqQzNCg2rQxJ3ajdnL +aruaV27hLuylHLdt2nDfR15eOQ2t2aZc6znd3Oky2dO5WliMO6u1GG7bLdd1 +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 +GxebhKqsRyXj416YarOpSKs41dYcNbWEZdYqpZs9S7q1TQbuhmbeu66X9ppT +jWCjUf0LCoXerLqDg7QzUu37lJMmQjCUdXaGHYm06cy28HyzZSz7vm1874Z2 +t4rd1Q5tP7BXWyHvBwWKHYuhVrcWS+g41s+H3zLoqbvXeCcM/h+BZ3ZJ8OWG +1h2wvnKwoyx09mMPNzEy+YsdQl9avkZz46D2a8UgmXkeKptA6d1Srvt1mW5x +vc6OIbd5cx29zOOjA43LdZJiR5yLMSyb+VL7QqK4ND5xLPiPuZrF1rqoPyvt +SSrpUl8cW7LYtvKrWoy+qs3Mg6Viuns4kTNqvHzNpbdS9yst5t4u1iwlNvW+ +wK8in3sCr7C8Yp9juvu3e0180KlzT9N+99MGB9bKYNwLtpeZIJBNbyw8Ouz9 +HNlTFptBcOSvLwraYZtXBivkOliruaumjjEnMEF7sgxbNZIyjfY8cN5l0m85 +x9o0d0yXUrDtE5e8rV8d3uHaNIJq7ea1NfYxczU+evtNZXVyiGjLvo+sa7ou +iynOy3m1cN91FbYWAtMc8sXUIWaeGXWVOLFt6hQx3d2Ruau3jYQqu53NwVjQ +rYJfLDFipN7rNWqOxXrc6bqkbkncejh1BcFgkGoazhoKbUy8rEZiWu5JV1Yu +qlzkxpHBLsyaG8fZ/QangwvvqKl0sy3Wdqir4633YOfC2ZuZp7Fr6+0Pa3Wh +bJqxe/dWSvmd7KyqDpYjgKf166laKJFqvu6qy6CqG60Omc6WHCWTqxSU7js6 +mrYKq5e3t11VTG0wezFnUNwrzDyZ10xpyehYd0X27tPtUXLFaKaPYnd2jc3H +dF5W52VeZvCSZV0FfXCHuEMnB12epKq6V13dLGG6w5h3NWcbx4NN00hXE9we +XtnnlNq9mGUax5uXdVN7deLzk7tdcDkPPH26tq9zOEl4cuxsQJ2iUxPLKmTc +26qnSsPhebvcIFWy99fjvq9QC9l169uqY2to11VeJc/zGesJDZLEuJxabzEM +XaLxBsaw1meeEio2xa0icZD4L0tVg27tPIbTs3xN3Xbr27orSHtoLOGHN0Y+ +vP1dy4uFdKxWNZC/V6fHCSR15t59Wizmy7uxefXvoN28l7t3nNnqj3JZ1SoZ +i+06UNRYQ8PsXivrWS62m9955fwxfQ/P7sp/b3OdtZ8LIuZmYu5cKXTA27V1 +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 +2Pdey121O133DcUTFw32dWdUlSVJsw5IHJU72gZlUL69XkvS7FvAfQCz6AXH +7QN14IYvXl+QG9x91exzzlerr9tSqFvR7AOGh7fAOvcBr2RBY7pKac1vDJOk +kkkkkkkkkkkkkkkkkkkkkkkkkkkggb3qIaDHY+T508u3c6R67u5ju7ubJJJJ +JJJJJJJJJJJJJJJJJJJJJJJO7u7u7pJJJJ3d3d3d3d3d2zu7d2d3d27u7u7C +ZBu7t32Zmd2zu7u7ru7u5J3d3duzu7u6SSSSSSSd3d3dSquJ6SUneU009tbI +G/ne5e32wKBXt0mvFRI0Ia0wCPh4BEkAE+FXViD6fZt72uuWbV9l39vSVJeU +e5PslYvmsrw5uofYPDvWPeHw8Hz83FwSKIzosIYm002u74wrPIRookbEUXqd +O8my8XoSPQi1hjPt3qd+JiRwR5za6Ej0InaYkaEavrnD1a93aqwSNiLjIuCR +sRl71080uxI8ETFXGd/4+tqClhLmU4QN4YdxTYSxnbZ0FNRLa7LnAL0pYJtp +bg0KZiY4QypzFMhODkKcBMZ4dBTAkcCmglYm7kKaCVwxrrRbFBGwpqJJbczd +BTITNDRbobgX04B58waf7Tt/RQFD07gvrzGNP1kNizvVmWKyidQP6sJLV65x +lTVn8SRCCT3V0Q+Un2STHnPl3uFLed2G/goXGA720g8r72ZRk+P2d8e3i7N9 +xrd3tFj6RztnTulm+nw6m+r68ofcurslu18s2zm/FB186ypcjstQ08dtJrc3 +jLQ+BPvZWm6Cfvlz2XovhvXKB3X5Opud+3AaYj3T+ogP1jSTGGWh04IZIEEQ +LAkwCRH3Hx/KfUZKOYvCeOgQ1SEAsiMHni3bideeVWnTToWoPcGWarT16rjG +dDy+AKMOFAJRQB+qE+xUPz/ZajNO2beq2jh8UdXfihwAgSCAgo6wMROyAaRP +CB0SVMIqdnUQxoIgOXd38DUTsjwQEliRYIIiCAmUgiRBhpE5JtY9+Inymgdx +AHRCqZ6RKUkP5Jq+TFDcqfRjBnYSI/hYDgSqEH9bJ4IintwgdNEkyTATUMyr +BCBJGFVSVFPmiNagG/p7sYg537vT6Ouk614LUfzLQz+tNMd3O6t5Xfd0tjKt +5OvNrtl7spSSKSSSLakkk7cklTu3d3dU7hs6a6UXd3d2cOkkkkkkm7u3u7UU +Ukkgk6SSSSSSSdd3duZMkyOSSSSSSSSSSSSSSSSSTJbdSZskqS7vDmZJSva3 +NvpUoRbJuOdWnTlkvDdjePMO31Phl26tbNNO+sRZvVKd+d5nbSJJJIJJBNVF +UVVVVVUFRFQRvy5a47Gbpq6WbQZnC4T2GxcSBVFC89vnlGzm7u7s2pV4pLri +bw114kDOp1M7hl4gcy64VnFC3Y6m8naNQ0boE91ZodNi+QHDgHPTPaNG+33e +9wEAnpBJIJOqhQknb7cNVK7hKXV0mySSSSSSSSSSSSTu7ie7urpIJMkqSSTJ +JJJJIO7d3d2d0kknd3d3d0kkEkySVN3d3a3e7r7dWzuruySZJKmTZWacy5m9 +JJJJJJJIJJJJJJJJJJJJJS3d29zZJXEkkkkkkk1VVVVVVVVV5xqqqqu+de1d +NJMUhfKpL7REnuMN93Vire7scriTUVRVVFUVVVVVUFRFTVGtqqiqKvhZFUVV +VVVUDbGNtNvc5x+dPZvwkHK4am12psmrvreua761VVVVVVVVVVVVVEkkkkkk +kk8tuq+Um5Oiku7zMzOkuSpm9FrM7te1lveIlhEPE6GkQD29Pk+HcPpZ2+k+ +K/FrOtHy/fs0Y+LpZ4Er+v+H8MZvO+33x/IKEJDhkIH07bt8/z8N00L2wNyB +khPwEII0IjYZKQnenyjDKvQn9a7Ve6ADAv9evGRVDv4YJ4C+h4EUJ0EPA6CO +294D/09xsO4VNbgZUQCKDXEI6aHxAe467BUIgTrkEcJh289umbCR0nHwngYI +1njcYF/2KLAEOO3Lu0LSAVDXTNhztrp08M1uNdbkDrA4o7xmft1HbauNDGRu +AsiRuqp6+/T3gCT3wA/7+W8O5bWroHIYBa3KoDyrPd3eus+vIG0+HrCt38li +9zwSoJRDrA3/HzYzQ1v7J7OoOJohB0z3ZCOMcd4K8uuDwW524DppVTJCW7hQ +/IA41/08kxo+fo5CewHcHROsh+b7+zl9KIAKi5UK9F88evt+Y+TM2ftgfl+N +d3r+QzQ9jBO+cyk09RVi3DA/DJ92ZWMW/NHTnflrTiInABoPXAsEDLIlO+g+ +d4OyaIdIb0akbEgYvLW2xiwYMxxJYzH8KnCmm3DMfJhT38vt+U2kCR7oC3Ew +AyUUgqiANyw1qvoAYk6lAAvpVqWAiZ/mQKVLxEUdYqnh/CoEoOcQxw/QoEsY +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 +wW8IAxxqD17MDkodtnnycz7/p/BfjUO3T815WW0+v4qw1NB2SZFA+MVSUrEf +AhyLewYJKUSQpRxx6oYd1gqKcEXKeTLV7tYqbnsHCoF9XlyzDEIkg2B2ITx6 +DueQNMgkJ33Zk/SSRB98ZZzt8BhuK7GS442YK1EYlQFUKpQePwVB7yN6UCrq +BsVO5y7qquuV+PeLveyErhMMWKDbO6sg9SELLwPTuX7dKLIFVQVUFfZ679+O +Onw+H+x4H5ONcaj+v2n1wgVhG9SHVcTseslrS0i1Chru1vrPYwnhSFSaVzgB +6N9vTwIRCHDinQW6vhVQY2kcHBDFKTpf36gaJRVA9ug92umNSeWrYdbN4xzY +Au3NqjU9MOS2JeqYcN/dfpmejFxTMIAfzQeUQZPTx1TvUeeZxAUcfQ3c/kRc +EdydCJbW/8DByxRCRzlURFSxCeKoqlAHf75Axjwq/KVUcyQab4+ReJGiO4ij +AX5Lnu+menT0Vrn85dmYPUszx0KSbn1FequbEH476y8yK7BW7RA9HgFg8moH +NHZw5lsOrV2WWI7SFa6k8mZe5Yj5Jvoq+fkbpZZzb4q936Th7LG/LDzN210m +OZCouVlbL64DeB1Z91Zq8Dkopp1FipQm5DYgchlWypZ9VeesBQfTpz5OHWMe +vrm0yEYUrtfG0H65+VnPxusnEHAUliO4reu+YMqJIELBYwVZumnh9rOLQoBI ++QhTc/Nzl3Rl5yHyTwo6YTPw/C9MX4bPuqV1n1eHeR1wG5CRpvPqrQk5VkWL +IZBryBp5mGms9hdIdiHvtCO9vstG72a5GJZbsoHeu/4aGxwJstPcerDRChiF +IETuzkE7qR7fPW7kjPlS2BVdN9ihRouNnSGHWlHVbe14HbuYyoyTTW4XdNUB +TYwoa1XOKpW9ocqQpqcA4yVoqSSSD0NvRMerAipBGlEbdZzaHs/GPuSSSSct +xkP2H38K222237HO8A7x7jnmK8HnbD5O+3BuKKZsFQZPMA5Xm60YVSfrL1zb +Yo7qmYUDLqLklCUJTn8NhuvFP5qxBIPBU3PGGIck5Jz0wZYDOCY7sQLjqR5k +e8gbFD1OsbeYJCNSFo2Hjw8Jl31bxvicaMa0X8CF6X04VKJIsq8dWthBLOp+ +bAgXKWNwhmzCyIANwvoLfft5n7Odiv9zC/GQnH0dGEdyqB9Xn9JBUqCSSTVV +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 +bgT8qlVWUlJlCTIjNw0+u1WCW8ylrWTphy8VDrOdUE7cqTjtpLuzrLmDsp0c +EqVKmbgs+mzW7rpPay7blycLRJvX3DaO4yITrUxZYzee1zMdrsm96tvuEpij +IFru4bNiorfd6dXXMR0Kb25ap8oXk66Tk1S1Q6xuPJgnR0bslGsPY4FkhGPh +wrLopsigts5MVC1w2QX2xYZerbGqnpei7q/13UStrK1Q98Li0Ks2tiqiC2Pv +IP4P6iD9KJA9geXMIkov7iPzEIi7ywAmITKIg861y5QenE8wx1/0Ej+WnICW +3fdzHdfPU+MWLcrcm2b0ZdCd2VcbTSO6ut3XTpvZkvQdyyTUUgc5p9okW4Y+ +Mxzd2ueEp9M2nW4s6nN2EjTfR8LbhXYpVvnmYduydvNmEA+a95di3u26rpVW +3ElNmNtyiuP8/eCHvA+RznXd3qEQRGJpiQ15xcuku+299Xrh1rnxIwXtj5EI +Wlrquzd6ZFJJVt5tXMtbhBFXQJMQWY8lVG+zZnbu7taodSd7uy0Ra9Ter3gl +2mb3uSChiDfQHMAgom/DLx10nyVxsoH4hk5sw8+VgQXWd+CjnzOfWa27aqA9 +4+uxPIg9qeNzzwtiJzruVcmoahZWGTi1xNpWp+VQNE13mGFJsC3BGx2V/Q+2 +CQJ/XGiM+1DPOerz4Xk2IWP26oJjViag1qPP0fplDbSav6w48ZmkE3+sIfeC +Il4Zscy1zLAUhcGOhxOJoYzdCZfuBxx1sDkbG66SKdZh2EE3HGNAz0tn680i +mioY9D0nXPofeoGY9evwNZoqcKBljwHJCIIXzHbz9PSHlJfyr0q02lotQvLv +S1T3cK8XLVQ29oWKQOXTw9273KWZ0PuMna34e3q62lsWtevU4g+j6c8QMQeU +qJJksa+WkffBDhbQlJb4PvUCEdoNpCgttaHUh/P/DkPMvcUHctBeMh1IUCch +oOtuiUDSlHI3Bcr1IPJrqDdYFNctFzCdQgcjq1XUimLluZV1UCGuyf1CQT63 +u0chJr0Oh2O+/a9F+/XRarJvBLwntvnS6IiqCYNeKrTLCv9580+3um/LOk3n +XX4D03uyZq+/h4YCPH3gAhaOi7xusJ90icYTqGUCBClMTQDyA5A8qKUSILZE +/qyG+mXQ9TEAGnQ0lIhVJodIj1KPLjKsVBSGjQrBn2+b6bophEfr9OhZIphT +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 +zJwsSAeM1sPu4+YKd995rU6YfR7YaYvr+2eMxgfvsjBNg0HlD1k5I0cY0JSN +L98exHDCaq+ohY2qEtUCLLMwU3usBolyJd7MKCm4sFQ3OPszHxW9N7akhTOz +feG5G5F0QA1zvGvjmDkpQlI00jSlDo14AkDwNeA9XzHkIM3r9xmVv0qZJbsv +eFlZnkKdAbt3QQLoRNbWdUirHdHt7nQ4jnWrvcXL3RZ3O2nqLfnXnF62l014 +xRiHA0JT8y6Ep95dCU+xLp3r27+O0SUYZEXFCnkTRYvMNUPGaWVaqaIZX1NW +cEM7wEqrPXT7bhXUldjNxdW9lBGYNx+Tz68c8dbXvzmeDpaUpWlKKWgW0mwT +YhtWPEgLbo2O+Z5TzWvOrou0TumomlhvT66ausy6l7131aqxOHse3Jm5OR9O +lWQtQ4RM9i94KbQ9931V7wPhknmdIUB1spQhSlAUDSlC6CAoB9fYF9H9yO4H +yodLBu8ulgXX1XRTK3EC2EOOdnCcKlFS681du8qubrwuu5vUFnl15oDbQ2Bx +xpAxgNmmBGRoIxDYhtA2tazrNFq61cxnju7buvEbvqeu9Lv69OWqumWrvWfT +V0nNlYhvdvVnUuoni+rz2UMIxID2SU3VfbXq89y0ATsmlKQoSkKViAqqH8x6 +h5jOv4fl38gPxaa+Lkdsp2ydExa1rFYwxe4bN0UN41hyU6rayHjgQzNzr7tc +9vXFPW27z8ePDxe4Sj1Aa0ugKCSLIpI1EqKSF9wptmbGu1y5jXeXEOrB14Gd ++5ndJoaWadsUKw5bZN+5efSuGWMEx6tq1rt3Y7UFy94VcrIh+FgFOpKFpaWg +KApClohCSPgiA/cN3vg/s2GpHCd2rVs0hksdqsbQ3boPVVKy094+sju5uW72 +bnZSpqu9ue3PV48a5l9vWD3vLJ4kKWgKShYgG0mxNiG16B+7W29ePvl79XXt +y9WPlQv5Cx2xfsAPKumWh7wzzApj6fDfTuA70HDvaNGYJ7Ro0ThwkgEEEE7R +uYMl+vBKFCZMzO9fNiaHt5Q3KO1lLaUSR3FW6LlG5otk405uomo6dDaJYw9u +Pd3DYvp27WY1LO5KJvpbQqE7fVMOU642O6DnuliqvcvElVmt2qu8uq9IqnCU ++y28wlnljO612cjmUbveQVCpZzqfCriyMZmvJdWWnWwzdhd2Fcl5Hh6V0wF7 +RuAZJDKPspPFtrE7a1Gw3aI1ScClcvq2tQNL1Dd4VaMV11XvXL6513UsVOu8 +ODbZ3eRkWXDYRivqw3SKqpivFuXHhb3U2qB1ZnbbrBm6WD0xeSZglXZTWxNd +it1dCQq6jolBQZgI3EkMHF3stJXm6gaxk/e65pNtYPrn29X23HltYznThE9k +qDJXHpm5RuLMm0NQT323TrZz4Npblq6zSosVO6MRipxyaHsrttZs5EVkQx9Q +W3b19zTKWDnMrso0TVScY8WS9A0kk+d9Zm9IG97t3buJLJuupMY9JKzVwRyf +QSO++IFUxGbVEeXfe7131ua8hveeFoVmrDltVWezNEok8em9NzdHdzpWeRi5 +iGkhA0iCCcpe8UGcVIJZ2dKkkkyVYydzqszMvI665MeyZ0qr3t6dH7qE67a0 +llwoo2FJnO9Eq+NWm9Xvpbm8jDi9YkrM2mucMzrrc5zUh0+IT88Ai7E0bD2A +tEgDt8M+H4LGC7ynQOWKV1S68wW81NI02a/LBoM06dX1L14ja/HWLa3Ti5bx +aGvK29r22O4PPrbxj49+VlPL0PctIUtLRSQqDUGQCRGF8E5Bvhxdttnnitc3 +M27FZuFZrsYcdboXvzRjKfnStNrcCruv8C7hsF92ypjXsym/Vy7arw6Sh1of +hx480hQlCUBQFDQdMOgKAJ81+ASqYOsfkq7aH1UdYQd5aL+W9ZpWn+RjMyjK +fpdTqPdfVfbvWmXu9qkvlPOTvruvmt4ledVayL1wURjSbSbQNg2hsE2k2k2k +3NkFdXrm+zfm4ePs5y8zrO+25JuaNcxmYlVS6p4SKFVdMZSBzJWyXmuOlnb0 +Isvbedg7krXh9i95keJABI0hQ0NAUFIxZ0KYa3OO5z58+fEdAe29ywZkpthj +duY7ebqldXZ42cx0czr3srUcY1Nans0cIfalpulM237GgO9se8Pd5h0NIUtL +S0NDQFKAHrVewcBbFmYqxVd39jG5Hh00/OizY5G70/PB01gnFVvdk2cbjuQP +r7OwWfakDfO+83qHnh3vN2IjE2k2DaE2Da8PgiPE+8SPEgNK7PfQ19XPrvq0 +VKYxI8wHFjuqoN5Su6NB6klQpLOyxwm5mU5Zp7pGdKsgy4nKleMS1AZ8q++H +e3xsDS0BS0NDQcUCNJ4gMRQAnwo5lGgGxAN6zaO6iLvJ93HoMpOqYl8qyXps +2KNu1Gyuo9KaO4elbnU1pRunQHWkpuX0Q7UF8/RgMgAkeJ9CAisiyBeJUWRZ +FkGZGAzNMzbGNM88aHPFraxFLub3L7C63ARRs4Tv2VWLyL7BVwWL3eG4etE5 +mULGLOkeXlD7CB3q8MhpKWgaCloaWloNpzgceXDmM+26Gb12R9MxPMmU8q6C +1B01mDevNomtZprqZ6G92xm7xT05SDyYSx3TnMQXMfRQL469ess+lA7DkNLQ +FDQzE2CY0NobLkSA55mGZ3qPXPJ6t2+uba3Ed7/wh3ZK3pvw8GG9+H2+3faN +32jBnsGdujRo2d3sAy7ewc+l2yvcFnWN3Rt3yVOo8wldzzM7Nl6O2Na+wrup +JvbfVd0L3XWbZfSXlOnQmTpaEh6tPQ2b2rwGZM17lVLYoUXs5W1wd9Nxd2Xw +oank7L6mam7qvWJYBO1YrdZCFnss073Jzrmnd+5inu0+od0nBOyLOb0YuTRl +rcG08xOzFIarX3HsNb1a+5u8Qw3mTZyVAkms0bdicqvE5z4RZdXl6L53l3cb +1EXjgig6mu29XdBkenrmZqMhV5dutHHrIfacuKtG7H03odqoVVk0uKvColtV +VrcRu+zK7EgNGocexbwgN4umnKuhyNUabLEHOs6uO5ec27npu9DR29e3ciiB +lVVVJdHHVhH9/ma5ChdZF8spP4rU9v7pqW64KoU9t529tdWbz7Xvr1qcqzgd +e1XTMq7eIdHnanS6G7esUs6DqwQdSNjKnXLw6rj2w8y7afU63TpYNdIcats4 +uy1yl8p73u9mmY48W8m+mJLJJ3d27uvLx7618q6XVEb5gkTgjrNCRUC5cZrO +uXs/Z9m4Jd6izUdoG3wJV93Zki2d3S7e2s0nj18NPiCUQECAuGqdaS3dE3d2 +dyNjUjyKzrydtS5MeyZ0qr3t6CdDtVg/fvZ7r/cLNU2Z19+filhBI2Krb+Vx +8a7uWeJbF52ujdXFQq6qmzzz38p1yjnr11Y9TZSeyg3UXF3ot/XYfYRwWp7x +tg3VWlw4XgpcoNetyEVxGHnTfjvcxNldy8F+FvA0fQg0BQU0lLSUNLSV4xeC +8MHwktOxX5l3dWi5aaW93bt9+Zezgqjcyqx85Ou/aeveu8uRk+O84JfZHO9a +gcvq96zASwIwbDGiNJv/MYRibEJCEohIQkFoZGW9XziUoVTEhs3ESbvFqOod +U4lvjeK8uu7qQw3astFOz1STS4bXROPM3u0bSRrkrXvyqsvwo0QEQASBtVxp +DOpGJtDabSbCmY6Zh3w31b+Px7zw2xOPQY7zleI49SflfUsI3cxTeGkYQ+zR +sGdqGNxYGxO5dYi3XXh8/ucIOQ0NDR7QaWqSv2SaoKACRalIcKH5TBI+Pzyr +Z2d2ZrpPFu3qobZdYxdh0sqt4U3f5WK8alnhl9ouhNpW+xXqu0IJdYR/D9b8 +fDbAR9D4I+JAR8i/VQIc/OTVBR/mhowaJgoaPazfe+TeRhFG1b2cidqHBbYi +zy0xDTdFSZIFrGTRdN5mNo2e6dlXcFzelMqsybi64dmGONbWvetJ2Ol7YiVF +kSQZDNSJU8LAOTkFB0oEGgoYho21vXXs+57+PP4gT1aQjrv9BnIqDjvnrrEi +WfMINJqzfRbt31FSdldIMku9wEjeQ4EZaf6/Td61Jr1BpavjJqgpaWqCjsvB +FA+CKFqiD7vfnt2XhHy7Xqvq/Nu9pIFHEcQQ1oYymFOJk3t2rzbsVVS9XSDO +7WLNGxRy3vK8QH5f5b5AOgEQyEfI+0hR+EmkoCkpaGjuDz8/Pfv34+eufovH +tvMvrIt00wiqD384YDeplB9ldeKgapTNsaNehZUreAfbryIGq3rql+t/V3fj +148HSeIaGkpKCgYqGhK8XjEGH6O9Hw21+UOzMVIbZZ78VPjjGVW0lxpkFXSF +lObEbnb2i9oqDYKI3S2xue3PHe9o3fvuHINLS0NJQFDS0glEJQVWHhlvBd1W +FK2maqXasUGnkwRjmq6vQC/BgfWJw4Du4d3u+Akk9JBPb7d3b9IN0aOAYYb6 +aHBUupUHXgvuvuNVrD68rOugdgVYtzqd1AzzgvNFqs6g7jxI1ubnITHpE61n +ZQvlXDnemVb3UMuZo6tdlruF3m3srHtXa2W4BhtcTbW525MlIiqyq14MdXeW +ZlZrSWurEk5QbcKN1Jl63bZQom9xbnanZnbWLa6I1OPFU+fbKex1Hyzq4cDL +27PaT7Ht8r51Z6FHjVOjUu76pOrNum10o9ScFKEbed2ji6mXg566V7dWK7JX +j0BdhjVY7KcVCtC6uhnTOhSdBZtHu9Lqs0w6GzqOG+ZrLpqVDuXmDHFyTNXm +ZErzdqg/XRNK6S2xoyTq5TM1LFxpzNcsvawZE/veAFVpfH4Lb6WfuFc+uc2I +tzjOOWOrXKtg7XSc7veiR1+paNWWhdFrWc5uy8MvOVdSrLu7jYvrcySsouU6 +60T1iVuawxTkuXtjsy1ZRW60Lymshtvpsbrveo+ArSr7Zjb6ZElsnd3bu7OV +jZzC9hHh/L1/D3jmsACiObEjfUzojph5OieTw4Q2aMtK5ZO4Ztt91703Zkkb +qbl9tVWl2USaS8yBiCUaSl5fTqzYu6plZ6aLnXNkkkkkkkkkkkmt8rO7/MjP +fbc+d/t78ZzMfdv3QfhJuSUIQ9zHlraFfeHq73d4fIEe0LxSo8BeJAao02EN +Ptddb25onZzfmo+k86iTMlYN20zVVTqmGqt63QS2ZV5u1NM6nnIjTm5yYvM3 +pgzEH9V9PtvAgEfNJSUNIRBS0faHSUebz488eyAfPNzAVv5u9hJ0PDuCtf4U ++kvIcd5YPqtex5nay3Vnup6+wji82OcsrtPZipDnrlwNHmDS190mkpaCgoaB +g+3GFzHZnsG+Z3dplFy+Bt7RIx9bsKqv61DpnWRQJinb2WK28U3qvgiyK6qe +tbnfd1t9Sa9qitDY/IEY2hsftAjSbE2NIBg2A2hs116vXeZ1zRvzmXUrpxwd +Yx1n5JxpXhyrzcDCvgSbvaJTIXXuFs1ta80CXmuGLarqguZeIKj5eBPgYKC6 +waKClqkqkppCjnWKWjcjRR7HqPahZeBqLb683bVR7m2sOKq9WgFPLvsrBtHr +yH1SNAucvKUV2Wt1z0SaGhr4YNLSUlLQZh28UT4L1IvLBCGh+Uya6BaFVowU +g72M/Z6sXK93bvJyFDDxqlkMzb2DnSu/Q8K3dmVOjJeIL31TZYFkAWPeAGeJ +9XkgKMyaySaGkp+INPHYKM7JFUICkKhiJoZikgMAyZZZEYy4FzapvVjBsbUH +Zfas5au7uukMIQw4r1693j1PJyF7L2z3Zxm7uofIbqF+d+FFeICI/R8EQ00n +zJoappaWvG83G3ufPXx847vj9L3MzC8dXUgu3N3KvByq70I5uhBvrZozLzt2 +JTINiqU5erlUpGq4ttfqkj5ECi6w4koKEpKaUiGiOvI9Eo5d3jZGF39lNkWc +1bqCl1mZuZ8R1rF3LRQorauPp0Bez0t6sAtXnd68wr5c99CbJtLQUtAUlDQ0 +NLWtlQvRY3sH2sZlveoUF8NzcGnSLt8jdjLB5AvjZdx6RT7G7wvN6o+Gde7M +R0Xtbm8+vb17+ffIZ8jTQ0NAUNLSUJsTZX1G4Pcr5y+c5rZxcD4W14qvQcDu +d70HD4Du0YM8MGTRonSCentGgbo3RkEGjMmS2xlDA3tvnzGy9Fs9nFXYV9OM +yvGbdLaKU0ou8tPhXcVfLKG0WMNBkX49Ks0dsrTuWJ2tcrdjQq267ObVES6j +F3ryRS6UGCkoMMWRhBXR1OrZyqvOGbjl3nSRbD1qsB15pgOKmCuTi7MvcxK2 +8tx3x1veo2u4Xd5XcO0PiK3SS6tKMZSeuszV2XyedbwHo7xdC8yFzu3mJe46 +7Ovsmb23yldr7dzWipU9aHa8VDNt53B5zFbupTCdxBMXypXSyO3U7dtTXHBW +2vaRrz1eoPLTLWu+NWt6svpm5VVlE5u3YxZpykuWbrjkmjo30N4rxdaNMzHM +fTrlY8vuH7gDwHVIh1DIVzE2qdLKaBVfLexyDYOq7T7Lqr2pahw5OY3mZfYd +2TqHZNy8bhsrs2+iobJJD2IM8+vuFdSmcsyculcXccoJB9N7bTrcrtLdneNZ +bFt5V9Au6PwnIeFLO7JMnNtuJKSdJN3dylfZHf4PeEHvCrnRjwweGJGxF81y +9d6zRPKvLqmF6zl3ouzk2b3Hz40+7uk6SSM0rTl5x95ePu33ZNuqqrvJJUkk +Eyr552Z0kkkkkkkgkkkOZZ1ZyzJsCzZ+h8SO49t39w+n1VyHWyb+vlZadded +52+EzwNrwR0GhYu1wWLh4Cq8Rl9Y28+Or5qKroYYlpc4bbObfO12F1d7ZTBJ +DF7j4bseR6ahVWN3NY4ZKHVOc5vfmsuTXwQaAoKApaSgKBIJHiR4ksTYPz7P +x5zZts9x/JUYWBOrT0reNp69Dzsq0krpat5Kqe9K2HQeavVzCPXXL2ze56to +RgNg2JtDYDaTZRijBsTZXIuFk5hm/LrzRlxzXM855YW5WP6duVzcgQJHS+7s +Vjqjnaqtch3SiC7KKykd6U8X1S19Y8j4EgEjxIBvTRGk2hsTaTdQGtVZvrzz +rzQzfO+qFWqld1hXDvCjra6xLd8kKFDqCc21tE43KnQ40RMzI32VF7qlVSR+ +QH8KARDSFJSUBQ00tKRbcDjx0ct+G+kp9WXVdg/H3IZRIRHcbN8k8wGlqVYj +uxlXKmqpsswVCKt7bsuqkqrXUPxn3l7SFBSUNLS0NDQ1UdHg78e/27Fh4fOx +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 +AKln+8drQxJAA1Msgg/4ZsbvohcH+n/bflrK7u76vxRKzyR+1MHBIJtzwq9H +ROCyG4/AT/X6CB9pEOOFpcAkcBXMyg2/wf4Lpb8Hz0dHQzvydN8Lg4T0Ngxj +GGquQOBCwBVDl0I5c8e2X2VaFBaqpelWgw6aGdwSCCNhwLvQyFbcwgUdOoV+ +JGE5cPjlT6VdYwPEqG3EjbSeQgsUGmY2QMPM9pvp62wjPYBVrKLF0gBft6R1 +I4DXAzyEAGR0GrfeCuDJJfv7T7D7578WJsTGjnNozh9TsQYwAZx4cLWJlLCY +KT5gQX+ZWKB9QoHZM8eyrfLrixfgUEJVUMmYoGigc1A2/UEGEgiApn9b9L9H +1VPU7im4pjgk4JCn2sACzBEoUoUgn+toT1N2wpZ4KYTgphOCmE/O4TPTwU48 +FMJCaFNCkJjgkC97CJ7GFMFPFoShLIN24pQkEgpSJ45WEt/0xDuzr7c++Hl8 +4Z+nuQr+jd055/afbovL1HP7y3Od3cH9H8P3YSiL+ZA6m4wQIAdMX6Dr/PIz +0AzjCCAjL45SzxZe3w69/ltCaCWIJBsR6srfpWEr6GAymPO8kDHxW0NaNA0z +bJoZVO8qjppzb9XShyns7Hw1P7uoZcUx3I36uFI9y3oDsnilorheMjpi4F5C +dbovMUKAfpATLj5lih/H6XarlOWOtw3LLDlcY37/M45XuSLi9/5/7vs+63IW +8fZmDHCz6jsB4bb3oXTszCy4ZGuj57h1vXXsrdv6TJkC86yDAEIyLtIW7qNt ++zgefyVxbylXW4MM+j8rL4d1UPWsSlnvAfgj116vhb8vfWgUrv/Xf83q7zvf +DX4OM739MSPtX6TbXjz3trb06ex/X1PePb48vL+bfe/lfL139rBY/4/L3vPZ +/SrHx1y+uPXXK3r5fTWf+TI48MY12+/4z578uttxdo9v4vdPGLDi3u584qzf +K9eVf7Rf817bcmy4462eCz/j8a815fs/F7tZsF+5d/PEj4dvGn4UY9f3N29K +FpyPidrfHzWfLF85xLvtmOYnbv1O1Tq19bTrGpMO37UfKRni/trMyywC/6fO +f0/xzYnb4T8vf366Ry4GR8r+t6qtEdd08vf78+S7prEHQ0rP8JWHb2EfBsfB +8Y3nljPTe9i+euG+9p9fu2vrtGoyc1GPfHyPETxtB6WDZ77Ob600wM9Ss5qu +rXPnStzVtyNFLEZIrz822MrDJ61xeI0aOCGpU8DnK+ELbljTmFS3DxH17U1W +XNLz97fA2Gxi74deW4dxuYtc51CflqM4jpY4X5MZiarW9ZtQggMf7JW/k0E/ +Tnh1dVPfbTCNpbgo88n7DiLd9r+dsvaLY9IxhUaNT1jRttswxlbWWcLbwphs +eUXrZrtI5Hats/exjD2Y76xWMz2NrTQel6Kw3rmdeN5Q1TT+b1S4Bma47rvX +HXi/wxveL2a4Z9C7yYmdnU0a5Uz1Noguu561V9RRDnW6hpWKVVVEb1VZxEsz +XWxE28MuL8KnGVxi8Y3rCnFA28NsZEGB7P0TarSbYu5xPfL232UTvIOl62aG +0HEVI1sbeEYrp3OMjfWCMX0MWtX0b044vW+cc65T6WM8t25LPKufLGfPV/eu +KB1GPPVczNWgVza2qe3VbPyZlu9VLXt0z7zd6vem85iN+M19K1IzbvrPjZun +e1364UZ3Z4gYeXdlKw+miLbu+a9Hxibv1URCo7Kf4sXjVzNNDxZ1iap49z9r +NXs+bD455xmGNwtNX88tAhZM7SI8dmq1rdWh/C61ENWJuIiUNDS2XtNoMqV1 +UDnkT5bz6tTbZlt4Yjibm0RY2qmcuGp9qizPN5u7G9o+DVjDVrF4qb5W1U9r +W0xq/ctv7uLYHmZ13m2IsLbTaG52sfK0XtvExKwYZhmoxmSJPsVYqhMxM5OP +lpcNNGRend6N1s80rUKl2nnQeoFAyvR2DX53b9O+XGy6H83Xp8pgO+sil1DZ +lbu/Zb3dMWt0uKYEYG0iDiF8b6d70LXiRVQajezM79v2Wd7H1Ib/vVe/Vx4H +uuv6d4nNz8O81s2qai0t1iDM6n2Zmt8TZ4IayiCIi/g9Az38Zvdeds5e89i9 +opvkfVotNo6NAv5Wz7quJzZsWdWdVVWfhhExehHOpeca4fw21ba/Di2+9Thn +d2zeVa2JgPN5cU+bQBE2SbJH2u2a/efy57YqreOdmR1MzFOelTyqh57Xiqu0 +UM1T03Xvq7WtIep/JNpqvL8N/PE32a42rwz2m5+W9umOvjbrnv3h97VsLDyd +T4C8M/LZ4UbteaUfX4t4Tzpu0c+XdbfssbWtesdbLPrarcrZi1hNew02qMrG +2KvtNz7b11wPrv4m7rxZ3HhCxCzbaNC8Zq82FvBvw8ZbYaxzN6mqHadLRgRt +O1qhZr1atyIs87TaX/dcV7nHu44txXKpvKEqsO5V+jRENHRXmGny39fW0YMV +bvXc+E2JqLXjhbRR+zNam7TS+VO09x8Hq2z2pv9e03D29Re2sVYxmlc0/DzE +9FY1XFbkzb4+dWyOl8sLXErU7cn9k3ljSxaz00TMHlP1Q1LU0tcNEiJUPKvD +rGVlflnfeam/z3XD36NT/qWsWtt0vTx0t8sZnfr5RqZt3rk6FUz9KNp4n46i +0j9a4+l7fLs0jZY+VRwy3Omtq/wMjkrwql1rPaL8y1vO/zGbGaxeTeqnEzEw +NljMyZIeHZ6i0RDiHb77u8Q7KKZ3Ict3p3fZ/C8t/ol/0O7dTHd2I2GXacVn +MdzP3UYs8gzDYZnfZ4j+5HyRaBqGcvfq0DnMoxWlEOXLMCzq5dWqN3nvUURC ++cOw5w4u8OXLD2O7FZlpJhlxKiCIIYhjD/evmvCsXtz8YYVClcrtEGC5DBmH +uaW3jwqIhhPyQ1UoqRotDsumYtezaqbLXZZItNpeHDKpUuXf3lmG0K4KkKpo +sUi8MNQMlkaFBmYcHsYZDzMtc2tQkuCJKg5aOkaLdLWLqcHJS5FQFBEMw8tr +S6De1O4JITTiOmamr+Z6OblH8d4cc0XUbWMvWFHMmGEGxjattHg4ZMMnml+z +1lX0Z0dEMEyTplrPfOaxGzZCjYx6dpd71i3LMCGViGQgiSoL7uzkxebuM8Xr +NzI+lguyrc92X/oVrwI37l7VHvPSx1SlxzVmUEFeFYWqJ6vtIm1iQ3tIuGUV +4PTCIZYhRBEQsRQnrFGvI6k1mm6/LFsrbzzcRKwVXszMNNO5cy6vlYL4Kmuc +7RvNrewxg3m1B6l3Bx4tIkyde1bGbV31aNWt3K7HWMPYySZmIvmpEWm20LMK +xEnNYa9W53GMRF7KCDcVMK+5WTUtqlyams1Zptja8G6zRr9vz7vu57bBgUGE +WR0W93S4ZWaMzMl/xzLdGLbNnThv7Kw3pWdk3+H29+Ttls/fV2nTDps2b/k7 +f8Eoyt/ZclP4LlvMd+wmi3XU9W4ZMEly5czMtLzzoykzaZauVMl9VdrKJLKu +qX7KXFlC5vd7fLb1XkSbVMXh381jEWPsWOy2NG5oyYtLRR7V3WmtY7XtUq2T +ZjBg0YMTLz2VJm8zaYF7zajJJkuXNTPKultr3rJodq4rU8q/gNGfn48LbEGQ +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 +R6Pgej5J/f9G169pmYxepfy8/qzDXPy1/rY3j4xmZgvrjL0t3WJlZattqRv7 +HvACAIj3n5lFHfByNnDN1t9FUVRVFUVRWF5vEYH1nq8faZvuRMJHy3+H/TgB +xQhmNyMI+z/hwNHPN1nhaQ5mLukK+8i6c0H0kYBR8Xt7e+KooXvk8CtYVRVF +UV6o6OuLtDOvD50219lxDo53yB6z529o4TcIUokglCfaij49eSd5G3Mk/wsv +gZ5vAiWlXIRgSglQfqSQLFJmJKOZeu1ASBQ/4CfNnQyL2w5cQyqyhnsP8a+0 +QHDfV/OsR/NLj+QA5CfAL/e4nhFDdmGM7TOzi+vEPr92Mx1BGTfR1Sm09Xc/ +5/t1oOIRNc4yyOE6NYOSyLHmLKGVTJGRqdTHq1f+x5Yfzf1T2OkRfeOSwYVe +KivSPKQbWl7pWEGBprGkSwu3TRBM7a4xPgnzrdC9UmxEa/2appOhUdCAqT/p +ZJ5u2xqwKPLkgZPl1ZIIcYUY0fBU19/2x8kRHj3DR7et1HXrDVVmL54sw8Th +9MjVb71B9Kya5dRhlirp+iEaeRHe04ZAbRckYQxv+hw0d2+8P/MzmqFxv96e +iiSqQmTm+6w5wdcbnSm8Gt4vvwjH7FU0sKbwwjX1O2tlmlp+mv7BO7W5IxnC +Wt+/fp7NrVL+/jSR+2H8ZA/l/e+e4qqhIRCTy1MQHCA4haUm2vHfA5n4/oXc +DkczVkySHq/6tf9hAObDhm9B3+77xIg13wkkJOYH+ajT9ofxi7nHjRlrCSTj +33wcA5CSfkv1hhgHH+134LmxD/znrKDBokDrpTJwd/h51Vs94fYjIETB9/yV +B4J5+jTiWeJjDAJepAPVrWjN5J+r7KzIG2xTaFMHr7vV1vzHX53H9nYqiqKt +jVFUVbGvz85cNWxr9HSb+epP7BTHc09fYsDr5gQBpD1I5eCrzKguqfSV7A9B +6M5QVStQMgjCMi4lv8PJgRnnOYjvS6dkHrn44j+H36L2wZ5b2fnpymXdf9nM +81Vp4FvWHX9uGmtrtza84dYuCUUjQ2PZGmlSRWCifOr37k2+cJSkDxnppcPb +c9+vfaeoxMO3GEF7kjGoj1OuJ2kbgajrId4qCMJMnXfibs6jcl3lOmdF+4+b +/3bGwRsB47tUVRVFHr+H3szPh8QRbe44mc3sljtGoz0AMDoTATVpHrgEIAn6 +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 +zTbOLqNvdjpdLxin07u7sqqwzUHhpburM4d3KjvVfYOJGU7yA3hm5I+CvQb2 +HQsS0deR7nINXWb1VIdu1iOzmcWo1m8rXbLYnv9yZfrfLN+rHf7aiz+EY7qL +oPzh9tfi/cD8Y7sJmfjQc0VcuCn48/swaMX2f9N9+u++VqrVfnxz8ErvyuDW +WayZl0riZ/3fyvr+xogtZ8F9pOHFK3ctY3i8cvZv25l32E0sy3P4Cpdc1v74 +a2uyKCIXxB1TXc24tn3VXM7uVl9aos0e9Nun1KuOdOk7uamb25Ryyb3t57iG +yokkkkduos4nDL2HKZnHs7jTi0S+s58OFPb+CDuz9n1k453b9vzd9uXnyyHN +Hw2Cyq+X13v1nM3oSbzteYcoJpYn0QzhWcxBhGlTl1VDWOjmSBbwvMGvcDrr +3ekxq3gk3Hak2qw3j4trxx15ZAxTdtGLdqrpnDNfWuVvLqvVO7Tzezjzzfq7 +7auYLGqgiHVlJfXljEyj9us4sQVJDbvd66tDLzc7d0qjb721Qp90hBeXb43a +2Oxlu827vtpX0bmC4fdDBlntoHNldmWChIppt7MXXt72DMOXfZzl3dCt7ekM +5CG8xCRXbvTnNLJ3YMnZadubJXdL6LHBB2wrbfe13x3AuzpnVkeRGo9GTLLe +9Hu14qhXc9l7cI7SZlOTICnejUlk5wf9F/s/9P/tf6P8iPFdOP9/9/u2yMgd +telU2aEm3GnAvyk3Imk4lJmi82c4F2nh281Fh2qGUoMBZa3q/3flFr3T31vh +9eDLmfz2++ZzazGxW8TuU3ZLBqP4Q9njlfVz6xKdYub6PaFJrkqvrztrqKBf +WP0RY1IKv8A777817nhIp+B1w/OH251U9QIUvfum/ZVLt7JsmqIOpe72Z23d +hZm2WrzK5zRs4PrrrvRYFbgx4gjIne1X2zNPj3AgSUO++c3HqzKX2Zq7Mtyk +K7hucO3X1ybW7lSVhXbyGXxhXb/D+D3u/VBSbPnn1HM79yuBH60vBXXVbLvF ++u+/b6iQOf2j8PjQlK2JmdZvQihLzdmwVrFHpzyWMWrMYME2VvGkYcmKPllh +ygnil4xRmZnJd3raHlYkTeVZRSzUzR+V/Zfg++YR/NYYb+PCn9VDbvRsf5gX +C+m1QvR1QSNt5NbdSt1h6wycx5c6DL9sFRZ1Pbw5sbHbvXfr2lzphXFinQTa +nXcNJOq5tsuYJqF1nducG7B0lTjSD4djWwMladoXMte4gh9j1dpru24sLQm1 +XStTrbtYWCWXgdT1plZiq7rXJgol11ZNqsmbSm7Fhax3otEysvRWNRcEc/b0 +Iq/tNtTq0jsrJw2/l7oXu+b7KarrrHlZxGmRZcvtrI62dypbaV12beNBBrB1 +wcSbY3R10N2+W7neLSpRvG9fCqGjtEvOmbSL7sqM3ZfdtlBYKXCUIuLm5dHg +sjNiYNUwdMzKN7mVUhwXrt9KW29mbyTTpkk2tWLVyxLm2Sk0E5WbbzaxRc23 +xnYL37PV/lr+b3dwo9Yihr7Pw2idsfP7goJvwVMJdQII6DnUqDuvWkDhrxjK +BghA8KFfzL1QeF6NaoARAiuqAAEVmo6hFM7S2PQXalKVpSc5znOz/pH+64/O +KXOKXbGJQ980nRpZSU1VoUMoOYNbzMrJn330t/WuWbiw/EkksD6fIbVfWQj2 +g1e52PpbIzpFO69PVnHlQzaQjG2uWJ88vtvdsmL6qxI5wRs1tGyO7PiZSxuN +Gc96cnKuZRu96swyj7p/UfaK+zPhRshjJF8MN7wdx39lqbJLgJB7iGL7fgby +867zKnZ0q9nRoPegbvVYvZUYbq9pTYsO856Veb3IJKWObXXDTuYnSdvTeZPa +hdN3VvKmFE5gomtmXUlV3fnbTX3dD99mhHrO77fqOHerRKgw8y++ydrrYTVZ +yBBlVeS+NhpZmJuz2XA3xOBR9WLKzjcTZo1tPsSGgxrJfbhDNbuQdl67Odw4 +0+V6tk3qy+mUJT3Gg8tJY+VixwVThWCRCuqVoq8PZq8nMHbqoutupUF9Mzz1 +a0hauAFSqRztsrcooqt2tq+wa6eZYO4QsSSSSV5gN1Q2yEGLUg20Swr663kN +7VvbmwTVyqtnzTvhed2ULGkF/KsqblZVozabU5YTYruNOh3NWphZxanzZmLZ +fq2Ux1YkbDFiTtim26eTuWq1Wi4zANDdsWD1q4mNEWt1cf+X6/KpV+N/d+WK +f6q3+Z3C00rR/TN9srbMymiL+vv9xP6/vstLxFh39fH+v5/bV2r81fnUyqaZ +tS8+CFlv8zQULOOOnJO7ZrG9vTbq/Ss7e5JKPKm0qVHb6tchK7uN711docLp +zt4mYz2Zsom6qcsw12VW7WXgZRc15QhGKROSqPikUDkl5XbWXmtYlyvtsWMf +NyQaDQWVnLFTOwc9gikKjm1AzSO3z7Aawiydn1/XyRH2nKPdor6o9l1ePDKG +Wr2RWxLCMHXewg6hq4nVWLcpnMYOC8qbc7FC7vCfbJV4v27XxZZCzKcPD6XS +4Q60/iJoPZlLnUejoYLXZHFXU7fZydO8yq3Xqsst5XVY62uu4u/rov6t+Vfr +8hdVfb+XMf4H0uSlWs3uDZkvPbM6oEtfTNDqrxCZTj4a6reNxaTa7gjWwVHK +N125a6s61V7Svv18+juZdEXL+J5DPjzzjtUM2xv1nNIl28ZrRcW9qr/M1XXw +6/uDwN6Y/uNdu0+J29vRuk5XSM/gMrqufO0aT34H54sy9vt2Tpu82NPEhDux +Vo5uVzu1TRub28JtSc7Z65VcNUwqkle4c3qdY4K2tw5nZd3WWXnIZmTDfZDl +4jm8HRuuyzmzcVT6AhuKYQZgJJTfexwa5ZnPLQbYBBGk1TNCMrGM5bKIu20o +1WbLrEUoCzT0Z1oaWisnm0lrWsxTPn8d+81b5HTf8oRZ/C+PSfldX7LNvQZI +vfi+6C3VdcoOnh/G3LCutfV29wvLy6tqHtacJtmtBWV2SjlFOjXDZWq8KJ9V +cItXKJPKrsvSmLy4HVZr4vlFmibVUiuY5PbUva7aC4Ys17WmdxCxwIFCX1El +XXE6znVmcG0id59v+v661CsBGXLLf7ifkX1xXMuU3qrsvFjP5drpNcofuPw+ +9Yy65zmlzU/PyHT+S7xVvZHmk5bGFB/sP5D+Rnw/VZ+vx/C/sBG7T2lHs/Qm +WIa/VU1P1Tq9Gh/Hcuz9mUDRQn28TaK1mrQu9mSW01uajo6cxuM1Wt1CNbsX +WQdd24ON8BUPZVULJtu1xw1edzwYKok4uu27xY8SGpur21GZbgyrPYxnZKfi +WYDSzs0Vw7DeZd8wXfaHFOV3Guoh/7H9fx3fwiTn3IfjdU8x59uTfKj+Hi48 +VjZos7oNxvKo9mqXcC23dTsx0tp2wprN25NObWzdO5kWVYsMZiO5om5LD9Sn +PVK6zV1XV/s7u/VcBo0191dEs+jWXRxXmDcFO1XbdS+VSje3Nu03qvlK7i7v +juouZRWyWxNLFZ7W9Z7ZsP2imY6gJsOR3G+K6OPONO/b2W1y34Etdp5Stlwa +cpnkssYpm2n2rdC6889VIVsJutquk3dHXQ4Thr7CbyZV3RvNTd1WbsqntMaV +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 +a6YuvlvpqnJEXLSj61z3cNJ3w23LO4LST275NiqWIVNviJo5wt5yKyo3SveC +BHq9Re13bc1e6xW04b3mwufn6gt6jW8tuHLys7KGXjybm7U7QErW7sx6jfMZ +w4U7oKiK9Xd7QBvZa865G9sZvp6cBQoXg73eA0DQBo0bvDho32+G7mewdu7u +QTWN3bzhWBbBtuNa8F9KrTlOy+g52pVzOdJdYfTiUqvtNGOu2+PXN6azdTH0 +NW93svDW49OPXd3q7p3bgmxFUZQOqBbWGdI9F7OWSYKu6GDbl9pvVOFHWclH +quS0V2RvVmAgj09EzMy83mZvan2QZKFVd8ztRzAzIl2a9XbmnevMm9Xd193X +e707rjfdyXPs4R32DKrMvu5vd673d29qzuZm3qV9vNvu5al2qseZta+6DKGX +3Ze6XJxI5jb7KzueZd93d3d3d13dGwr3VvSd1Y30J2r3btkXHl3enBT0OYSM +f9w/mIioD5wLAqshZ5wiClEz7JT4iaos+XDDCKPzJRSYCVj7yZGKKKsUFiJm +c0DUzQ5hSFaDDR9H0/sL2jysOsghvdIIGYSQMPM8NHuK/j9k/CI+X7LOg+TL +m45DXpK+1mPzCifunb9kxvWEQ/Ue/y43v2b6aQsMvsEhIIBYpMFl4qoY/9zS +H74/Ly/TSSbLj6S43sMZzT0hpTUEqnD5hdJw6SbbsGlVHcq8xOdYgUAsASAK +BBR8gSDei2PEESEquF2cA686bDB3iBCO979ZDA67Lghrd4wnBesPW4Tz+3YN +/gKU5FfLC+CJQeinn0GgN6PJwL3V/cEhsBl3zN2H3tImCdimmWYEOWIyUENB +cTWToYP/EmKjGa0ZE0LDHea6G3uLKLQ7lvNqiSIkBwxSfKg6lnSghHFUqwuJ +6gnbSyW+s9BUDXr5Dh46P22Bybp16E8bk67iijpooo8ZMwKIxCWG2YHyg55V +3rXfhio8ohgmkxAAmUGcswdqYA4/fQwiWQjQakBS/XwBxM4nPQPuBlBvmKRy +Ad6iGFhLZxWswFmJhyYlAgAp+wpoCBcdCt6ppx+D7rzrdQCNGDMQSEBzN2uy +aTVJD6EmOI8vWw+a56lBVmJUi+/AsxCZgUMGoV+gyVgOmglEEsHwcTXlD5Av +g3WTUylJ0MWldb1jvpncGzrjHpNPLzBrLNNmFLTAMuHcU47AIgqAnIpYWqEg +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 +LsxW1kamOm/UlRwjatlsnKV+nV0yu1yzJlwxVMVkbnC9Ka1K7U5Stbto41mp +Tq1DOvoJlMbtFVihMDSvufYK6qsw7vWKJUgPDjmlXkVy+OPNvbRlVSjWR67t +0YhesvbPCsMCdqziTd6J2A73jeLnVMOQ5OzOB2ndVuutXVeuGdSsbdCp7+uv +29SzPpku8uwuGU3ejfuG5tHlYB7dv2PGcPIzweeDXvWRhrry1/qA8Lg8Fmt2 +Ca52lhgvTNZYgm1KGUN71yY04nzo3TfXX10V2uZbKNBHicla+3etZdLqcVXV +BEAX3vYrEBCFitW0ll5SewBQdq7BXJIo8MoV0ztg9/nIHvA5KFGjP1+cJXx+ +HrGV84fJVpJmrOalZSq1qydpSiMpq9QABAsiJQSSBlRJECfk8nkF01ARBsAO +KWxbBOWpdqqms5WVIIf4u0X/N2KWFkirtyA3mnCKvjjVXmJdmVe9z00bJ6mB +4P1ryJor3qLJN9/LjewP2EuUCsrJUqFSoajMcYYOJMSslwpjDEKwv3eOd63I +9zV3LpyZqvwr8V/q6mONyonrwpq3e1lfojk73cUdSpJlHee82M8PAmay8OkB +CLxJ/IQxCNJK1hpDGYkrKkrWYyY4hbSVGAMGZkXNAN9XDnO+HPfvKNPO5zvs +3nzrc6+QrQsmGpCLKu8hqx2YdmXXarALs6e1adakC7by9mOWPVMczGBhK4yK +VhbYFtkUKhWoFakrKncj5teDALIZ8EQAlefaLvhE12DXt2q+NXN2q3SYjVPM +QT0l4JeXmpdsqYdC1esYT2phZN57N0ZmRQY3zdRiM2GMhUlZUrCp+snZ0k01 +JU04kxlYVCsKyW07uPcJBmgw6Od9HfnnW3q3jVaM1g/axUJgitqWtYqi1cVV +pVO97Js0iljs+YrtngJxsskG17wJHudLzHoRphWoVhUrCsrCsKyoFtgW2eSQ +CIR8Io/IOk7G8eysMm7OxnMuhSFs9fjUJZz1HA1SezavpM3kb9hHLSLO+O2c +9mBU4TbmmhjIU7cpk0zSFQqYK7qbMNm1wsz2rmWDMGYkMYdlIDICPkQKNETG +Up1bEerqodsydgpBq7IyNSrzJaS15tbieLVmc9OCiLIb8iCazg7yPM8BzQAB +BhXXPLwMHoQiPJlZUKyV24zGBbSFtOUlcQFqiPIi0F4sZvVZ3VZ67qTkedDK +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 +i4MCPkMXll3AVrzLDKbRCvTpW5EbeIJouzMoXz4izaevt3unX1vLN1GBpMLy +BhjYqMS0Nc6Cxx1QqpWVrKgxgzGDMZjD1bcEgzBUHiCXuyMr1ZWNXRorDxjq +9HHXjIwdM2WpccvKqjyUq48vH1ZwVCHTVVcJ9QJPgSD7KC79NYs01CpWsqVh +WsrUKlfIgIoo+CSA/4hbr8UhBP504VTMumMN/ky/y+xAhBCg7vrlQxXiscs3 +hFNT5m4/bL7O7zt7wkVkDVIpmw83bgzGCuStQtsKhUbQWsFqClZiZOs5cPKD +OpWsfct3jZOpJuZYCVyD3eSxIMiiSRCSA/Q/X7Dh3u7u7tGez2DL9fZVa+3V +DwjPTU1b0zTW3gaHYrO3mPqh7RsTvTz470ysrevpCa4ubfXlDd6Zz7g7VLba +q3fOjjRrZ1k0pSEyauLV0gUOu5W9dZSYw1KClXLkJhjTTPGdLx7WGYut5QYs +ZnLpmXLFRxasq8l9d0ewFhOUz2U5uHkayBcSU3Y6HUlM0zszIsZHZXBUlV31 +5ldty7fBXUfYsdmxRafZ6jJMwXZu5MHHaS7JvCJKsbPNKqk6nzCb5XkyZYk2 +nxdipOyoTOe3Yq9q6k0ShdbU412Kq2TTDiqTeeu+p1tObMorK6J7XJZkSM3a +3JmGqt09krtOm4tQpXRR6PKMT65UUWaUUCMpydXZ3dIr6dmSZU6uBuHjOWic +1Fyi7nciErjgYTRvMGcmGaXZeAnE4OwS5TQ7deioT21ydLMclPlVvVYuDr3i +6M4s0TkEMgTy6FVtVV6Vse5m0bU2G9uc6ruj2s6Zrvm5kkWdy/mB7wb2qs78 +7+wPBpouz9rkiO9mcmcUXEqD+m52vr98+8Bf3gh4Wcx7XKSH3vCe2EeAQ94A ++HhHB4D6twfCL76UDREpquJgNkkgXHJRutrBllXayx9lzfrfI0w5ek2xeUBL +B8AvECvO5GuvVprlyLIGmYvdSIxlN8uvpJGp21/MEHv8Pr++4OTcvrZnArzt +HgxkeHcdB0rL5bc9pkghuomDZTyosAv9fZtCwo6NWrd1emiQsWFEQ2b/Sqyd +pn9nSoTNWIvQqvembVXwZQuKqNEjovFDxjmdBOXZln0lSVzyWoMGDMigwkGC +uYwYxgzMinh2bzdnp5zTi1aeUzIkV1akJWp36wV85o6u63z3TIZZ68UodIBR +9l5DEUgvHEij4RgINltCsFKhWsLbWVhbW2ClZUEhH3iIMsiDGDdIyjlIHjMU +dvMp7HRghvpcr0D7Zh3trtoJ3l5clgbl3lY3TJWKEnJZZgrioMZCArICuDHD +MFxjBmCtgJS93fQ+vXoZ6j2SkSapBW7MtpS9LnWIR1LdE3hDCKe8bFV136EB +U66lqAjXvEfltkQohFEINZylylS2ytQrVYtRag2yUzZM2xUJtK8sqhLVqjLP +WPq0Gl2B9QpZuTgZUR3q47XdXtxCHiL3qgBIIZQ9vE9ecPq3yWDGZ9lcsZ9R +hCwtBy1oLYMuenYbNMhYW4DlloCDaZ5652e1rPXD9BZy6yIFq2IaEs2/1+pM +O9Ox9fYbOw1VizV0Ls52ujYfjhXqIlZcAMK8ZFYHqW4GYOK+4C5K3Ja5Qylo +WpYWpKlUsLgS1LJmQtcplbMfmiRZED3nBv3WJt0SxaR36gqCWJtiilujclCh +Lo3CusPnnGVhfagOPbsllnYM8gkwk9TGoPvkbCz21mubBrlgzLXLC1CwtbCy +g2hZa5Zl9nCP23NLoN3DNpOhhy8sQLheCbay3FbZzMle+FaZ3Zq5rtOEjezP +EGLH7DZ9CccNlhYe4RrllrlrK5ZZYX2TdTYteZTXm2wGU15kaScFnph5V3Z9 +16sI0U69djDlNlw4tiL3rfXuVaG8lM2PIHITjL60zTiwZmcvfHfudtD5VLC2 +0LLCxjAYzGMMiLDJF5Xqm+3t32e6kI7Sd4qlgpj8f4xMmHdcoRxhWI5Q29D4 +8eazZD2p2KYJ4zbfkRtoAkkDDeMkuLIsUFigsUFBYLO285vPNa3NzTdPVWPi +e1tvU2Ng35PDzdtnZ2NjU10dC7u8uvVTbGfqsd3TdyVdlZtUIoK63jJquwZd +TVvTO7MzuG5N15ZyU1sF121Uy8G3IN4ziqFLayxkNrUJikRFINUs3deIQbVb +0o12iONmbOmYRWbfPLo9YrsMyhms4Ccx3bBOwrBsTy9qw3VjaI7LIzjfaTNU +2Wt6MdG1m7tHIrq1cvHmUIKfdigxnJvXHofdYi7Vvbp6piG3o6nWbuKrXKIZ +Zq06RxOW5Sd7Lcy+eq7wXleUVowrrvr7LozsqtGVd5V2DqNR5ZdHKvZlqHtV +vFnLFt3dsbxZu8q9lR0hBrPTNsKhukY5jj7Kt3u7XXL1rLVHc4rblh1kEVs0 +6GjrFULK1XsQdRZu1li7XHuahonW0yNDIZz3ZbpIV3ZqeH1PtttXjUV2YI6o +Pg750dq0upbhdloc7u20+WrLrcvLnaLTN5t1ddu2ojvdfZunauljCuIETqvt +5i7xTY5Z3j3FO+qqytotHK/n5kAe8OldmJbc236urfnnZVdSto7mERIjrl6P +ypn2WhTz7iYDh+My77wIADzVVi9DhQ32sQ0mZjONtASwSKGMgknt5cFVy6Pf +IvRtYcz64r1715UVw9x5+dDBtbePJebDYVzmIQvAgCeEl3JomTDR5FOTEyjj +FASvYi27rs3qb6T1jMndprq9v72bvt1PQ0NI+31j0vgPcR7vCp7+m9utxeuQ +CC2gAOYByylJspOWq4icy0kZZO4m0Hfl30qQGZjTQh1kzkH3Vu6a7RrVpXjw +l1u6DSbYVhvV/OmmCxYsFiwJ8CfEgEgP/Qg7xpN6eqYKF2PjCcN4vx5Sv8XZ +ty+TurUD9s3jwN9mEdfHa4bONEeus1vjJwMnTDd8YaYoKKCgqgoLFM+kkKGH +bt4788d98ZuaR5zaHBcm6Nov8VOtefhvilsyHuzDfGmMNesjSFZ7b1z24ycK +qdM7OGmHgwqKCrBfcNRQUFBdwhfIAyh1ze2u/injLXtxTpCoYMqtOmCVgp4t +MMENnc/RVBR7vdmnEeybRdOu1327ZDkVerLpkqgooLFBRQWKsqF51wazm7dD +OnORvLWrx5IbEIrjmVmqvXydBYNw3ZF5z2tUqcbzfbcMVivTR1bzaixQUWLF +8CfEk+SQITm16asBzCKHTwuke6w8VbOzXm9Gxpp9K0sGjHZvWd4OxdKwUq61 +MSpVrQc8rkFFigsWLFixI+A94RAZYxfGXYx8daAIUeX93VWtw70otGJxCXU5 +jqxzX2BPakLA661yj63Dml2tOsLFFFiirFiq2l3vt2qrup3ROjDZGF8phHEP +Nuijl1LDWNwuwXjYWa9uA9z22iBxacgDJLKI6ljFUWKKIxY2yl57ZvNb127Z +0nHYvSxgjbR30cRjjyhZNKCVgt9rd4urbt9by9dY9keDLedGKrjDumIo6JCl +QkFge8EEQSSCfGcn9ihj+YraD4jIoR9e8YlLuJSsWXKkBzLkQ1x0r7d6i472 +07c0w1z1rSdN4tQ13uIosUUVSQkJOzZI1nRrbNyccG2Mx8fR29NO4VPB8L2Q +BmLINgKZ56AUoJic5icJSQkJSnJIhHnETER/HXs2SdXcT3DHQxZiGW+qZsgI +dZmDXvHOvty+O33bdDB1njm3kSfEXkzrOTNXZW8ePG06UKnSRbnKns2auyZB +dk1rylaozK3NYq8xiiKUe2tSi51fZW32Vm3dkZSt1ATt53VxSems2qxdkrco +PnoRpxLcEIrWqxnavduGVebTuodax1vCHqzLvN3GM7h20N0KHcmbtMmXfVSW +F3curN9NmmSk5bL4dek3mOihubtKrrs7Zva+EedV9TFGqS417kr26oYMxTB3 +bECt6pzqU1MzfdjnR2FuqqUPB7m7vZJh7lS6tWQ5XLLKvnN3oMpCaXx8tw3j +0HKqrvXwWxLd7bqsnK5wW86NTt4HU29oE4rwdo1lF4VKxVnTVasPhgl0rD7b +yDi5nXjWS11xm+zTVVDYV8Xu1N7c0nJ5+vLoar6kQWq7p1HsvCFNjyg96CYO +2Zh7hjlOjedeb1u9zd7euDL4ysqxbyTMbPS9UzOtd1rBQuru+1ugqut2OVDe +qo83zee0BS9b7FzUnUHDnGdkL3CFCG7KPAMFDwHWrZIHhTW/UeZnbLNmO7ty +P6NY6rMFTrFmr0vfu3r26t9bizLO690x4MngUfMRDz8CI7gLncltZd9MaTw3 +enhYt+u/HQ263u65q33h4flridtT+Rn921/m5741J0qum5suoUQCtQ6BwBlH +O4GS/FPc+Cc9/o8pJgEDMPH34dTlfid5qXX3vxM4xmQW6VOurys3pF8lOeJr +htvI63uVbN63qHPanbrnDnmirOLY+tKiiiiihIJBDXkBT2faUN7E0VoyoGRp +CTQOYteh1SrF9WMG8M5di7dQrgpWwYR1W/HXFOdZiz4pUUUUUUUUUUO3HC8O +mfLijWoWNUmFA+1uOa4wflclzeq70EHWrPDoMdrqQBNtAkEkJD9dzPIcIooo +oqxRRzHWjXOOGtZnTp1xWQluGZdz53AggUteX9Qpo2dFhK6pHOuxmuhSa2c8 +c76a7W2xh4SoooqxJIJBPiQX9qG1rQtqzR9Nv6DJIGqF3d6RRdI/Zva7yz06 +uXWrxMsAmLLitCFs41Zpd2oosfmtRRYqiudiXc7DTuUaB5bVL5XEvO0MuxA5 +iy4Aagu7aXuNOr7Njuu7a5PQGZdMCAgkaQrSPlUVQVRRRQdHbZ2N65pmcpwc +71vLgRpIPHWXZdWaA6rIho8DBFNEzuyu3XXbrsac53gaRdcXHx3lMRYqiqCp +BIJRvtbIf30rrGiLRr3dSZGCVkMVJMpG6bFC0lmfcdG3yfcTFLPlSs3S9fFj +zrJ3O5AptFWKoovhKirkGL77o02PmDRq/rogF1+OWjBATpWpCoTkF/k0W06m +E91bh3AwCqaxaRQPjuMcCCaVFFiirFUWnbDm6322O+dzsvcZ1bUHBOXAmlGL +xOlLi1LKLw9vImUHmPwJF48mECUFR3W80Af9T+h+eACqz5RVjIqowRAiMkES +BxkkHtu1bPLd9/1b+WH1G4CkODj+rP0xEVGAf0rVVFjF+NLjQRFItv8f5TNT +SsSVhL3KtMCqwpJEA88QoH46PJ8pb4Ju8l7/r+v3Df6JGBE10pM7P+//TSFi +QXH5LTbP8Lfv40PvIGa001MAVMAN2+Ref7BvShoAsiNCHP8yBYhwqILIkg/E +k3VxFP2WJcNIUG9IXf93zfv3uCndlz3bbcYF/7vMP7IbIPaKNe51BTQFOw/G +JzkgyIyJCG4CGxPt9Eo2/K4K3ca/4/6P9c9fVhn/Lv/X/o541pzA/F/xXE/2 +Aqfq/z3EEBZNRKxQUJ8U/4e0GV9ncd35fL+Qg+0hgYaVcNguIXq7/WZ3/8KJ +vkJsAfou+JdhWA1OeCVWkbgPB0r2BjARNKMIsaoC2C6GLfM1amMm+Cxr+aSG +BvJEcwDW1t/du0uCGpPtONZu4XlvjkNye4ZDSSbtgWBQWMCjK7QxkcE9wJyZ +yB4DWxgajGxBw6ZnLhpm5oeOeFkTJyQzE0aBpoCioiCz8jk1LEFgpPOcyhPz +e/uAmiwDAZIjvg5dKTBlg1M8F1bE1Z5/t5MAHdQsAf6wMDHCDhgqgCIVjbpM +5LDvREDBBRgdikNsVRXdHL/gH4GzYBdMVjAxzM46hgUDxxtuu0YwJJCQRkkZ +FpiyEuGR61eHSRP4Q641C5T9whiBIj5iaqDnzk3yTyAmNiEJbdyihEQa+FFQ +BNgm0RQH7Iqo9YiiONT6cd99nezHNRCyX8j9tawOpdXfiVOcv6mYfw00ydoz +OViavFsZ/5qwpUXym7iyk2UVYPd6/trMxBFJizZtk1C0K6gRY0/zP+P/DlG/ +rcC6OrN9+1CJCfkk6v6HHtDQ+Ud5j/qqshKk2UFiMUWsCL445Z53nErJey1+ +ebe/S/4HEFGdZi0Ct9ozIgTRe8sDnRSWDsIdxyhuujBYK3X8VPvd7eyL8TOV +xj8PcqLRlBaRnHYweFynLmtCGWMp9MntRZ0WcK2JXO0OKOw6a93Y8iJaQ2Re +G62vD3lHLydzWoFN9ha0okpmYffud6R/id6rkzNCfxROSxwvNqyZjyPGkX3i +Zmb1Oh4OOVrxriV51pXKs6FNmnDjRVscKpOLlvPdRAnLVmfr2s2OputtMbad +j5NXR53lVV30pSIJDdTtSsuL2nNg5XItpSBvCiuAzXnq8ov39t4rOvGHNd70 +lFKvE8TXT76yNeatGMn68791orxWGqarrm0qHlrTMOKLJ1c166uOddKT7ysq +spa/jDvALGLqpcU4bKwfJdlZg82gvpJbc5rtK2U75NcRLSe7ww1XayjOAvJc +bGsPM7Iy5T10znOcRWb1lNkmzHsK2rCusgq7Fhcq6ibCU3ZViOkcI45LxNar +WhbqPab9eJs6w1Bgu1JWixvMa1lEtxtPV7RJQMlWyxttAd5s2Fuy4M/5abRn +ErSjn392c+L5Myiy9r2yy5ujl+yfF84fi+uufZfjHeH0ifOztL9lp8eKeber +I7wfe880TshEHrezvKjZLKDxMciFfJ2YDVbNJjZlK1aSrDLC/0Y5Fj2Ift/n +t2fnikh/kkii6beIMEWvw5I4Gb5xRfGEnSgv+EvzkSIUaHIBDV/BUZfxFJeX +6UwRfiEDxBm2p1f4GDP4Xn6l73Pc+m4cPZSfL4HO19Tjx5uRcserFGLV9XeZ +EyevJes2hJKAqkTUqrKg/meGDqMNZatea6FKFinWwXrKlKBV4m5PdRh2GV1q +f1uoIJIJkQP1MtD21pWwnIAkHCgWLdKMjWlRqwxCsTzJ8g+cLiJw6awULymQ +f7l/RoE/9Ift+oIh5qournqIkq+gyAYhdqT6u203O5oGz0rG53Ms6CQYhRdo +GdNWeSLr3TeD6zrOGF1YcSJkQD4XV/HbjH178GIsnDznGUT6U+Lgw2nDx5UO +XhBEl3KKRCqkzc0KRNUB8JtM6zWpAExytyZyQCCIVRwhi02jdXh1ZJrzXk79 +hGZ11hpjtsyKfNDYh7P3OdZfF8drth6WvvvmmnY7iY4mKAkkc55NEMqsKKsj +znkMpRZ6shLtVgHeGUgnFGigigf2Kh/hfXRoHP2RaUyCE/Y+/jd1DlsaxS85 +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 +1pq7muzUrUc3zniNvozw/uWd6QGrts5mMS7D75PGsMW3h3dm4adIfz6UL/E0 +PrpeZuscduby4VOlYXPLWijIyyzb0Bm8XWreLRazZu13xrFw529WkdWzCVvV +3W46m3kfreuz3+OHaIapXhu3B+GTsutm2lzV9KcPPbIyHPXHw9ix5Iadxxd+ +D9jLQb8l5a13uMq8h00y1jDOqwW5bWeU8M+kaxJsKOOS4nHvvLzTlmtqZZ57 +00BksuelrSXxeWeX0NxOlqt164fPt3bbO3w89fz7zxXSTnVpW1lz9dNpRD0a +f4DBiUWpJ3jg+lpyllLZ84iKb85TqVpkZvFP72aaytgs9F+Ekytu0i5/IVps +27btxbNu+FpJ2aVmird6+flpwcYe2Qtl5NO3SVuF8uXfkpFhj21e1eLChobU +WV1rx9u2W3fPBtjhnrr+vGNKZPeuKzfHzL5c6S5dUrxWFZy99fbXnSg+DvnV +679Gs+LFfmaVZziJ1fhSIofKut+yknXKynqfjlp7K4lkuXLOQy5ldc/q1tn2 +SG5d4Wnwr9URo/Q5QN2a2Ip3bTS0S55vW2XwO4OOTJxuO1lt4LSh620NslOt +ZyehwqmnHFy9KX43q2JPJeFVlWyhZrjqlLO+2L+X0XtPLKftzmH6uQZTOOKi +XGOt9NzmePL1U2uec+v7UsbUku1q8bxJq3Vci82vu68ZRidC0og2k/CIu9tz +Eztm9NfdmwNuu/yU9uW8Tz8vEtfG+FtRRrqz+bRvW/qouFzXfN48DlbnTelF +nLMrWNGsc+Os3nS7UlE/VGUljJ1FDTN4c9w5ltM+y9Oq7WyrIh3Uqi1V3fV2 +w8jTGdaVr8NEpfyw4vqsiTftym4j0Uw60+zw015XnQUbrZZrBUYIXOrScGej +Uy4zbltl20xWmHWa5OsQtmzt068tTBoqCOgp7Bp6p5rQZ8247vtWlei/RPzw +tM2NWbt16sRP34X9yvvPWfXKnWKdsvVL9fOlu6bcON+z+OX2/j+vH9PVfWlz +pm/W8uHxtWSg+iGkK7TtHrlJ4r+qf6CT6uq+j6U0uXOULrV1xL+2I00neZ7c +2nHlYdkqUc660f9FrbuZYa213h2gHILV3ZDCvINuryksH9ps2p9c4cZKdGla +Uub7u8sEKSqxRYhTusQMtcVrw503vlxrlc3hdWKkqCWVaEGlKc+34pngB/2/ +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 +tkCEfFMCQ+ddLko+g2nw4v0d889GesN6G5GZMmqrJmrZte82vqq+hKYI1yJH +5lXv319vhu9XTJNsfiEI+3a2ZjqfK5jtV8KsWh8GM7hzIXI7so4rr6fDBlqn +dp6L/oAM3Uve97fx4u78Uu/zJ+aTm7e4oPu7undukm3j+F/Ue5j7ervr3d3V +vSK5l3ZOOsV4+694neqySkmcQvcF6jhO1mzZG25Ju9vSUeabCwi5grKzL+iz +5Bu+f0uffDBgYiy4qqGzVjd3cu7zayrjOGy93cz6V6uqsvtu9k667mOlVe52 +Zna6qr41Ok2zgM7tm9kfdzvKR1jHynb17bQpvhnORFsHcehyn7rq+/kPP4S6 +d99eVif2S7+hddtG7GTlubVYjbKW0MSCvCZljI6bfcM1rLKmvamZkzcmd3Xd +3Ko3dcZlVKWszLr86E5PtreEsfW7xLXYoUMV4fgd8wEBYI9QoMYNztqpy7Ao +QRDUEBGBgigQODFAgixANDFDQKGKu6sK5cMHCb3c86958owKEGhixwpvIoDu +9mJbtvt9wsWH7TA9QPLpbWmwZslWTLdvKret0rc0u0xaztWM5nDXsa7MC9u3 +Rr41jY2bnmb3qItLXi6jVn9i9df0tWf4Oa+6qHy/tN4LtBbknK0e/CRl7djG +5d4qrJlbwl9+v2FV/g3fu/Dcb/N/KmCUuX9RX58dV3W19/eDon9IZqLzK/pS +z7TmRhfqpSKrsG0+8fyRvhvzFv4Z14J8V9glfC9qqoV3zlVeFdL0Xlbs+zJg +qoRm/M0QMveVWDD1/cqeUILW3kz7v7n5g+z8XTkd45+bKrLdzAbZ0PfzDQYr +Zurs13dcKxQ04pMtyuBycD8Bx8Bx8FVfZMyfX31dWS/Xe8e3tPw/gBP5L8uf +jqL8fV+RbWSw7l+yvyTXckkkk3MqqquMOpZwt2L7Bk5XeDu24J/kt+7FWb99 +uZ9fa7JnoMXDdK53VZNOVmmDCXsFDBlK61YSSxUqV17XXVVt1XXquqpqqbzR +GaHzWLNUdV4+Lszi6JmdCQhxI2NoSihoT9W2ho3xk6f7J5n4/DH3wafIfaBy +fEmGwif1EZD6Krcqmsj51n0Km6cn6mkaCtzElVaqQA/RCHQg4oqmX2JUTqqp +SZEpSaqoFIUlQKqqQQoQApApiFSGlCABiIFshOg6oRadbBD/znyP+nh4uv+M +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 +ef3N7JHUkcZJH5/Z8L8nqSOPY+BI7yG/b8HJI/uEj8pI+wifeor6QfyHiVPf +igdpoOKDCitqkCkxMpUIjKDCiSShKIfxcJwcIqmVAPHhRFg5SSSBc/Igw0fU +8/Gs2tNVMzWvl8/nnOcxnOc5xrWE/q++++r6+fyHYMxwgkX3LKw52dBnJLjv +2CkRvZVedxj58wjRD7tm7v3d9906rvfsn1jeRu6w/Z3z74/Dr+539s7h23t1 +XqElY/vvr7uzqPDuPd3d3I9+AV9mZv3zvs2b9hTKvcWLlczF1k2cb7szq6LN +OVq5+69vZbsjMuFjXr8sbOIidYSJrrq83c05mZ25nDd3d1ZlbpY7bdE8M2+3 +urZVuo8kkkkl71VVUbmnqWclnd3ETuCs1l9u7fwAHRZIYJopWJmSmICAkmCk +pqpWilKAIiGYqmAoKaKClGlBpWkRoQmWolWhQmmGWQZCGhCKkoklJECgaRXr +AbApkFPMSKT0klI8JiRcOng9O706T0ZBiCGCEzdYU9ACunT6BE04LqIrqgai +6CBJK4sOJCBHWqwJwhBuKBPNmsmJ5RvkcFeHcskTt1HPEegdnhzPDcWQgAOj +nLkEDYXKu/PZ5nQeqUqnYHYqHJXmacgOZijmHN11hiVnoFlISCTm/OkkhLnF +WQnWAY2QkJMBzCI7kb55hw8iPQg7J4jhBqRarBSuFluGFwhGBMOF7ykbJC2R +QbBgdGQ2DcQltvtVonai471hF0LcLLQSFKWCySOp2RrDZsnU5OTxbI4naTqd +Cd4p1yJxo7Q5eEOFkQ146FCRjOgtbhAhAbmyJsrWzSM2sJbpUbglF0BhXzcQ +G3An2i+LWANcCEtzN4SSB5EO3KPLUC3oUZeZB2x0El8LCVsXskISOQZAJHIs +lLa14aFYBFWUhhEkjv3mx5JDp58oQ5kRh4NDqKAHTiA9Ogw7vPHHxfMCk/8h +IYBS+mVcRDQgqINKLQilKpQuIzAKAA/rIdCiAwkpBLSigxlD8lEx7w/nDgOv +7gYgkWI5kR/gok2sSTUJFISYKgMqCDjMPyfiHL+V/bjFBP7DZxRdGqKQ61F/ +W4U3KZKKGKJCj5EdQ+BorqGhhMMDfsVVVUDAEklP148xjy4QwfLh8eQf7HUH +pftC9eJ830fLT1BeUtSvPMqWydoo3q0HFDkOAHHP13cD98hhE4ejuXc+9i58 +FQ1EjrUh0LSzQtBcFu4OCvNbTt7NzovbqT1dI/wxP52DP58f5VPk4Ud2l4nE +U6CFV3z0LrND2w6sZmsZ7bGWl9jgykqkPkveYeGSYiTX3baUlhQ96h9/Rvlf +Srcvo9CZXh7+teXFb793veco1o22YvnpMx6VfG3lMXKXE1czWTPWy03dcDyo +VWzitXHMfGnyxPVedJ7nDqc7dqrltJaefncwMoOmJZc4GsQ9nW6a1LzKb1rD +0WlouSrq5TMWlNy0LYq/JOCi7bY1UVTRRTem+w+T5duGUnqpgGwC3iDgYcGk +cMhZKW6Mk7wDltr4FgdNTnrykRXxyr4WBVBamNiJHwb1cVknnA20zHVNkYPx +LOs9OuS4ZjYaw4bDpGE2eaJsbSaaEompizc5tS/BYE9yfgfF13Fk8IWo83sO +HwlTb05DNc8ztq22nrWFNrYUGkWrWlKWFFbCg0i1bQ9Ie0+RjbUs9j49l8it +14fuq6AOA4GFcJcI4DYYoJBgI6RdrDm23mejWmNzVqXTgno6m9bcOYybNWxd +MYerhE6q5w5M1ErJpIycLV4V3RGlgdNW24GMVXTqWe56cTE+6ICGJiKKJKqi +b4tVHm0u8GVlqwyHjsxqRnuSJT9/EQm8ANJ3ugT9qoQmCR2V5viZHmB5SF2E +7NjAmoIHbpgE4IMi0NLSMTBAhsOFFMBIh+UcLsE7erX3/vnVPf4jCpkp4cvZ +C0Fvk3kObINWeh4yRMptEa4j4nveGEefEvPjWr5ko+hwsmCyR5yknM3sxkxG +JJiKsdo7cZmaMOIjsTlkmJjJsvrCc8HDHQ7CaxB25HWaqHTgaOdIpNNDXOMc +TZzy2Watwro8nZzU1IbHM3YRkJSKEKXmnFFDNIboSmCwFkMqJLU12IzlUwnN +MkXAnJKkkCZGmlSkKBi9uEuy0FQr75lg6Chhf02jh0mEC/uBkUS69DPUBYHg +vkVrWtS+Cta18kl7hpQIQfbf8TV6d3mYg0T2dmYtYMMrDMMMMIP7C18O7l2D +mzokPg3jnwgXvsBFGSSTtry9dKr136Rz08R+2qVUqyKvdvBejoy4vrJ1OOHL +yZNbQrIeiw/h66LUaqrEECTpTvgHU6PDcPLxdgdbQM8MxDGXI29bCoq1C1B2 +7T1MUAzbbP2AVdHsqAO/DyvZLbaUlj1GXSId/Gw5XeeDze13PeU6+GZTVctn +C+XotRq3A1noHyvkejdM1RBqDLCSo+TP9hNjmiRfohcTEkkB8ilGs89gb7fv +qvDU9tL6/O23Z0GwL1cbgWLFhpdrDMU6puMh7y5roYDMGzPsDBsFw2CAsDBc +C+9RzP8Wxo1bmGaXZ9ZJ9huq0R/SI8Okaq7B0z0a0qQCtDxfDj18uxxztDIe +2Sek9M/e9H+X6/1/r+z1Ac+n+p+v+t+r0fq35p7ffts+XQJ861VIPEP/cvu9 +8OLD+k/ie7+vW35Mp2yi+rIsbtIkb2ML2kNMlJoVMhmQO/4EJ7SacMtttst/ +t1hb2MQ7W9mjdKVUT8JxFyOQb/THWy8Pf4aUml7vfjMb40jJ9JBH9LuD1FGM +Rvtug2xRyGZQ9oTKRjD9Rk5wA5OOPjOnTf2/Zq/9liPoOgczyseoLxGEOhfv +U9vR+2qXoe4wOOyxhmcgkZxilKgtsNHr9W58MWMWMzwHbktodHg8yqo606E8 +mmp9aV27RvUjOmZZ8T2tdv1yzRsbVdAxqjYVMLVM0EMeQ//NcSQ6DgHWMfpy +BfGHiQWeJ3TNSlZ4f52gdoG8ldjkNqj2Cy1XoqvofpdfJVm+4DAPl3R6Vs7X +CgnMf5u8ioAYBBOxAcnohhjQ0dd7cxfN2Wi7h+QdHDouLSCXut8xx5c5o6PJ +5/Adh5JjremUzKzKavTP5ePdaBqHM5mHcLtxhIJkS1SeNh8LG8hRA7jiyzMM +y8RjxguKpaOS+2QDc8/sOLptnQ2wNzUi3PqdmnStfothGAklMNDKwOV9oqT/ +VIpxA2HAjw9RoPOrZNU9i9Hmf1ux3h7TcdDOI+n6M/Tu98FLnEG0BxAD+A9F +cXdokNKmqqqqIiIiqrbGKSe314Q5NeJwM22S8btqqqqqqrtQ0E8vzezLttVV +VYRDljD+NjvZxs8tZDv8xiVFfcqMR/rVkn0etY+7thrQMmHt14olDc0ZkpSi +Vw2bSijntVVVdCIjFVVgjXZHbAa6VVYB4+Tz76BqIbTwnF2GnnOXM94qdHGD +04f6fGHj3O7NPOZZptTn8TptB97fEuyx74l1dplZ2ZoZzdrk07DWYidnmvcR +NQb9K/1o9cvP/M+P6njZ6N7yXeDmuuN/otZrdyzxWPCL7+G2az247tXfknjH +LHE8YidNq/jj6Wr62zx93iavbg846nT8Lbsx21v5+BVupfrqev0OeWLfmu9G +/j3inxi8ldPTymxzYeo69Kq9/L1psN5EuT5FumnmHkams+7eo1/Hwjc0bez6 +2pidp7NyWjpx2rtfNNcvRzRu15wNqNQRksY3pssahyw1iC9YsTRjHoQsa2cz +o0f7N0a8hzbBm0ngMZObQGNnMexNtuN9h8FtHnLbTEPsai5rV+un+lvFuCXW +xxFn/T47YNsmSny2ObkHFznwzWzbXtbYgZjrvebuS2IPfRc8GOZh7k8lXgxe +83bT3yYL7d5JL3MtDMGoNQe6sFPN5Iiw+5iS9Zok/FzMHPDnTWq1GtZ+Wt52 +V9dNVbprGWvXw7+3wtvLOzdbczzxy3l3zZgveZ5+HZvHHXOc5rxzjEeWc4L4 +8Onrmp6dt9tttp/P6fp/n7V9z/obNH67dmwfyldhK/5bDdP+hUSUvLNDNDxI ++76s9rX6W6W8sGD2zvVEY/hMq97d72sFrWNh/c0wLoM/+szyJkd108I+Cb9B +Tn8fLz5HPF6ot1/w9w0ZQj/EhDDeiYSMY2C4e5fT8ThfT83lNQdcbu79grA3 +1MwzIR4sJHkY9mrbyB/kUdv9s/AkVMMpYPEXsu5H+BjvrwDy/Lt09wjtlsD+ +DB7tFior4eV2ZLlls2BLk8CNZkidCcQh/t8a9KOePWvG2D2n5kLkMGYPEszD +HvHaRz6G+xj8PJsx1aOsUUUnYQP0wfMGoHiGfT2YOMdlXvxMx8VlQoUEsxyd +n4Bwn7Hmnnq9vOb36fELiai2Aw/E29/t6hlX2OB4ipk8cZ9fZqHtKnvk+2a9 +41VOPymOt1xxQp/UIP1HyY4ph7Unl8AnqPR5YT53BtarmZU0JqZbG1uz07u9 +BVOHMC6sKRJHZ+Rj72b6R5Ue3z35+S2+s90kpYBneHtKF/wz0/kZw2HyewWt +VLDls2HvmHp2J8pE4WHuKfLnxWWxbue97lePau+faMdWHZcbdPPtBEdYb9nT +aDWl9EMQBuy8xqsOjxZh2ZEdVP0Xf4MvPotu5r93brOvLZ/mb/CZD7J9zbX0 +hKPfXvLOyieVmra5ZgeL+z5ZCPou/6PeJyPtd2CLe5mgZjoN3Y82X4enPmZN +GwOfEoDAb/IPdET9AfFT5bTtDTt18Iuxemw0XJvE3ZHb6MR77axetvEK7Q9r +V0Yu1Wv8CGBmw3pnFNr38vw+pphNNGGOH+9Sk/ra/vr78mZ9nUhSnf4hEumf +2mVhQ/LUVX/dy3+iqBjJeNHVemq6t523pa6pTDNdbLs9HHlfU3gunj8/28z4 +eT3t62btF+9x434feTDQZ1E+j4yPj1Dpm9cNcfHi+C1Zt63sWUzOaKrfT3e7 +WsU8RFYn4zwa3OllX0xznw5L8WxptFHuk6R187yXN78cv11+UV+edY6+V2GK +Zq9/uq+8yvIwcj5PHUeup9blXxLebZ63MWze00VbbOb+NyztI/kNtFnIV70o +Vy7/G1xgrkYhs+cnnbXWTviGW7ZZc7R27Ptsy1g+baw75ter2Xg76KfDOw+G +8ZbNG8s1ojqzyVEQVqSKbh+9umBizeVmmLe+7Qr8vjfBisUrsWsN1oeqdqsU +55v4nR458+Mu8PiZtNe56+6YKl+HMer0mmVk3ddPJnUXqAuXdQya76va8vd/ +NljD4a1/E+hhhhvULlwvg+vywB9boNehaeu+reymM+H1Orbpb0mXK34/b2uX +eObXlS9caOJly2jfk90+H3dd832+R8BzFbb47tor8lbN5q1+uu12G9D90cHQ +QfD4j7DRJwCz4tUX+02YeaG3JP+FB/gCEmzG0mw4OYZUzMd2QPzSXhBCx6xf +acgIazV9nxZvdx9cKiDuzcN4v/1Szk/o+7/d/hz4rf/H54/JvluEx8vNyP2J +PVAncEBEq4r0IZynIl4mUi+0uOawHEm1rOTN7sGPdt6/m+iMHVWJAvoPUnmP +RiF/HfQgPqYJc3hhJ/HB/AuWWjiAINsTpcBjOSsGTMTnY0uKoshRgwEbEGAg +1SltGtEuoSowRikwYjFiMuINBocQBUMy1lxado0atmpg0BoKTNtGNOHTrBil +UZYlhWCEEpKLFsRlGwR2i20YC2drQa0jrFjGKSnFQTNbFoNkdWwRGLTqNYia +MwWNFt/3Q+w8YBwlAOVIHTlP7rw6gSOVIyHhLwMmUljTDKtkqKkmik6R91eN +Ddd9yJpBQuIMYMfCuej7iHQiRoTdU9PMjQaVf7VHWECk8TMIQF7DpIZHaVJk +Bl4lVEta9GGH4aZdO0SDju/lQPcBuqBzjhJSX9uFoaRpEpcQP/k8MnQ+Q0mq +F00NFcbFBQXmLYoKJ1jaqjTo01WrKGCAtJzmzXQDkDoKHiwsSlBbkGjVnFp2 +q2toxRfoxq8PDp404K2IvO66K6NeG843m1VaNrWtFRRTTVNrFrFrFo7Z7RqL +Yu2q1sUbFrEdscH1iESkR+urZE6F/wmzP6mSdX92fzcRsemQjtACAkZYBZIK +UP2xU8rIj+CFuB+xfCu+D9wCRcYVBcCBQzH1lcnLD9GJf7F0aSZrOUex6pEm +jvGBMtvj6F/EekKHo+OnYmE+X9yJT5vNck1d/zkwq1uJk+o+UjNi+2LNrNfG +ONo0ck+u31xk7M8M3bGM62WECD4woxfrf394GMQyEn0BAILGDSQpmhfaZf9Y +XLbNs3WWYywdItuqe9jfQZb9PWISKExkf8sC6EH9Ry9tIW7lq4J5rxQvChm/ +y3/yoYVSeH9ZDyktVY9qJ7oP3pmVh4LgEhm/mYxzPr25EWPEXoHaIR/20O4j +wbKQzk/4SPo1JHbk7eyL9JHg8WWCkb8W8zqRfKlNMzJWTCNzqcE/o/7/k22x +48Xy4B0AOol2tKkkXt+9mcWyjEBCwUOSQAehQnbLIzug7khrDMqEwuwl1SQH +oW13xv3Bo1FFFHE4HNyF7OvZtfk8mgKcHiEjyJSRj7CvX+Lf4D6X01aeaSOx +7/R8+VDnjSH8RcQz7B4lj3AXJSuqcAJD2Kz7mqrcPQc8BIYCGSKSHg7gJuPv +ENt05Y0yel6fuGNbMLgbnNFjOXmczhV+PHecx48d8cHU1GIYhiGIewNvUjGw +Mnyj3UItiqT3n4OJxY8mPaHt8P8r/O5+/5v1vm9+5Fq2qbJ+GJpy9/s+QN/H +2fyZ3T48+50ieQbUTCfh8hzZxdjh/Sf8r6nY+nqwyDG9IJchyH7L8w4RT+gN +w3qx8PD3H9XeKAX2V6bT0b/sHaL8Zju6MWasa9sep+P3mUB4hfgLtxH+8bOr +G98MzP9LPBydIgV0kVVIFgPxtvd+KaVfjdn2qf2lnxJBBJJBEq9A1gDwdARH ++QTsjtzgZix2+iOSIjfMs1jimZvr4I38wcVAthq2lVatK9WjmSO5rs6z5iR5 +eXVvxd0CNs0xk0rAWoZSQdiHOrjl3tczZ/6/t9+y8AF+da2N1TebHh7Z+rBg +thxzHej9MHSDvbbGBo/w+EYl2MSKNve0oEfyhHpffDDMMzfzjEXPVorbWiR2 +EXW30/R9P3TM/38Zv6RH6hHU8Bd2T+XvH3ZSMe/0id/WbRx+4v+o/WkwwIYG +XAKOnxH4kk4H7afIcx92IYrSQqcpoCccCR4rRWAwZHIobS9fL6B1+SNgKnRR +T3vySJV+Jk9+Zn/a9zl1ev4L8Un6YAvuBSEH/dKGSWgpzDQhzOIo8B855Ysg +ce7IbBtReHksOZrOhhzUUMze93YLPhCpkJZTBfFwLCz9ZiZJeGMDSVFVKVUq +vXsfUyK4KmXWYthoIkKsPUQD8p/kBTCqfm/OftX6dDT/ECnRyfoBSHjT6owv +iCn1H05VD6/vBT1oviHrBT2n+p3fUKeZ0MApquk/D2Pttj2jM6hmYPFH95fQ +CQ9gpxw05/YY31PX7WYb9UaCCk/5H4P+pHUNY/3supR/FerCZu94UPDzLjMM +2mUcjk157tkbkP4AJETD7L9sT09NJfQFBKo4PA14/4jl7DsfR3MH5pGHGwFz +Z/5Ws16MuzxIRZzzsGALAUvzYfwrMMZfYkqDitI/TS2UvAZmv7/tvG2S33/s +4jnh0jHn/AEh89++fpZJGO1vjP9v7OKa3httjk/5wJGLrcFTAIY6x72k8jdt +Xqm/3IpgSOKgBFB+XrXrxq9/ICEOMfD9Btv/cSW4PP4Haup9xwTgf+gSB+jx +K8eGTDSkg/Ukgx9oJGx7CnzhgqRQbS2xPVr6OcDJ6pYXEstoHr50ah12cLAk +NMzHUE4wJvWsWl0ZlakM/4Ma7QkZ5h7bZ9ZI/MfMSNEj84jgka4Hx4iz7skz +425g5zC8GJ4gc9+1WYD3MqPm+OrWr6qn7p+34Innb8YwN+P45+p/8Xj0+xy2 +KHYd3Ga/EH9dWtJUQcMdp47SG+0PGbZlnux+NEDZ2iukY2uRaYlt31RZmZun +S+mzh0zKzH4N/j0Xvw1F5/F7MdtNF56m0Smw1MZ6VDbNUxDvUk8vqxh3rpV7 +WfpMNVRq81N/vyQT572343YsaLRU5byxvXGm365je+0VGs3pvdYNQNvvs5eX +hrVxBW74bp9lTepn2nZ5qLV36zMs7tDEQ8vO89rO1OwfgxiatalTNTNu8TVS +cMpd10drEtDwdeLWtDTTPG7eOdsXDhk8kuZpppt3sjqZ653tUDkBYFJfxaI+ +JDEPezo+Id3iMB2g8vh+LJlrG+HTgk4KdTk9zsVt8FV9jtsbAwwUSTsGO1CS +zbtG7uzPEQQzjuHP68Nkjp/ESN/S4HzHVglWS/1+lms8doqFBTB9STztPaL9 +PNUpHsz+BbR3P5AHhlIwUZiO/FsFeOAkNbs25Vw0Q3LUxTc5qnkuPvVyXONW +WPY3aw+bjmJu7G9M5je8alo4dmILUzF7SzBAJFwSLgFiL06bDND4yxxfHxxt +nM02XmFDilDqQGGQkHKyLV0I2cUriCCc5daYpZGA3ErCVhJ0J1sKUAb2SghB +Z4RhCima4hQBvcDYTkMmxgcfGMyDEdNMYXGXpwUTcfr0HkAonWDcUSyVDLRK +d5J0KiTaRwKMUhYQ1EngKkngkxKRRDZDIkyRJDHkSPBI/uyUkae857abakEH +jywHFiB8+F+PkLGCfJLwC/b9ZljNahn9g5Pb126LHoH9SixC++VYJEUE/pSo +e6oJ/QeYQpMx/ZMRFE7KcPdW1FRT1i4xuxRRFVDFVRrRWmitW4A/eSB6QKRI +AYYhIQYUmZBKBpaAKFFkkGSaBEkoahViaBSlVGhUpSJVKmJhECkRQlQ8FD0P +CehTMdkTQhlQXGXOHBiwfcCm4KfmBT/KCP3fb98mH8AHQBICRoWSkaAaKGqq +gaEFfYGBQfoQ/sHwyCn2f1qoA1OZcJFSfh+kkU3Gtkjho43l5X7fPoGhVUW4 +KTsHulyCmfqHIKZBTkCmgm0lOhYGnK/QCljUFMuRghEkOD8/BPu+3gkfg9Ik +fSSP3Pk/X+P94SP2yR8XOLmBA6HEk1JOhHTo/QjCP5Uv2mjKMpZWQyZMhnJl +GVnJnIZKgd7dg3MvszM3LaGZNZkfYeGGKo6DO7lxWFQq8F1GIOXcDMb68Qg0 +MRCnlUDvldDd6Hd7aUtsaKzhhrDYaaEobyt3V6qud2LXWCsEx6O7Ge1+x0kV +RPZ2N5y71gSrwlgdOsEWBBoT5vt89REsgp51qVV3HgupBwOxbcvZ4Yq671jL +249w9l5tS9xcdO1OabtwW/XnLM4k1zsuVu8+m8R1ZKhnXk7cd20KW8+iebmT +ocVmrW1WiqvVz3bXZyKsdwsUELrx2ddgrMzAbcSV5Jb2hZjfWllYVdidnLiH +zJxjK9bVgZSvTQuyG5ukPaxackrmK7QbwZoLRvs9XdKtDkXlhLtMsiJ3uWRE +G1UHb2S+J7EwAgPH08OvIMoXQHqDsaYNywPDbA8NPg/BZZwXsscRHrdUE29t +t77MlYIAhmYNN+O915rv3aGsxTcy7kWwqBb6Q3dW9DEfDAH5KzIXPTyzaCZa +ikXMRcuYMFQy1+4Ehx7A7XwMOaqi7qza1Q9jWycqi5mX1RcotdQRUzU41+63 +5eD/481qHCfXu7WlorGYeqxqt+kVUdOemL4HxerXyHTZAXYNnD3JLkCwtmX5 +DAUYWAoOqJzhIN9VtdXbuHU8BfsZTjH9ecQsEIX4yF9iTT6+SRs2N9P8M3p8 +Pin8NbnQkdfLAgBk5R6ZsPJEvLSwygdmt5v6POi+bGWy5aAa5U4ct0bV12dn +grQ4BMahdBUPeQAIKoFgQ/ECn+kFR9hx+/Q/R9P9P/C/Tjbvf+Jj9b5azv/e +2rjwOXfRrwtrmV1BAH8oIR/4wSGBwAUgFIBFQ/o/DAJtgBXbKgqIhAVgAiJA +FQAYxgAiJAFSAKkAVCARWEisJFYSKyEVkIrIRWQipCKkIqQipCKkIrAiIkIq +QipCKkIrIEYxIRWBERIRWEIrAiIkIvv+/AD3BIbITe2BERIRUEdsqZzkHbCo +cCkg92FB2yKv6vAUwiHnmVA2yptgEOBSFO7IptkTGMoBjGFNsiIiSC4EhhIZ +jCCIwgiMIIiSCsIIiSCoQYxhBEYQRPXgKeKKeeZRTbCm2FNuBTgQO7Cm2FNs +gBjGUTgUhE1EazIDNCRrQkYSLIDWsEjRIoGtZEkmZkRzxCcEjUhxxlBTbgU5 +Q7sijthR4FJETuwgG2AOBSRQO7K8Cko92UdsIBtkeBSQe7AI8CkD3ZFHgUlU +YFITuwo7YTbEFSQwJCkMxhBUAFQgiMILqbsmwkNhDe2EisgKyAqQwIkqHdkX +bCvApKHdlQ2yLthOBSVDuwK8Ckh3ZBTbgU5DuyqG2E4FJVDuyhtwKci92QHb +AnApAgwiQA8cYENsh69C0APoROEUhEhV9eso8IkIpCJCKSCS92FA5BIUCQSF +AhEke7ALwiQwURUDcnPOxG5I55ySMzCaEWSRrWDQiiOcEZJN7wTQiU7sC8qE +92BDlQlTuwByoSr3ZduVDl7su2XbAHChKjWtOLENySb3g0QoixCzWsIOBCAS +FCVO7Ltl25EOe7KGZohoN0TCFEUhZJveSMUJkgFkzGRUCa0QBkmtMgKhgAWT +MYrFREYqAb1JIyAa0hwrKd2V2wPKsq92A5VlTuyu3KvK92AeRZe7CO3IvCnH +GHkWQO7A96gXKeeYQ4Fk7sptlNuBeVO7DwLIHdgeBZTuwG2Q4Fk7sA8Cx3ZT +bKbZ5FgTuyHAsgd2B4FgO7G2EO8lHJ55gHgWO7Km2eUY7sA8KwJAsr3YORYE +gWBJRgSBYEkWVtNfNvkcuDsvTpaE5zFD+j9Xgykf7GH+5J1tiNBnGonA9rjV +8WSYD3gkQQ1yoNRFgSJYBLZccOKASYRIsvdjgWEhGElGEkWElGEhGEhGe7D7 +eAnqEHhJRhIRhIRhJBhIRhJBjXXLyDPgKS5BkIR0qCFIo8IRE5ZwCKFKIZlU +oFTskQOkUDEAzCkSgGgU6ROYFIlSIUiFRmVKFIkB6hAAtIAB28YJ6EOdM9G0 +1ces9JlXh8v2eqc4J3sb4QLPSzHRzMoNVd+1eJ90mmc501tDmyTLBO8sRVIv +GEYQJECUCUCTKrmETECdA+YBMqPMip5IiPrYRBpUUpVEpBdCr9IFTpVGihUS +hJAM0bQOlmjUkmlu9rU5d5YJbezkYepQ9C8GISR7l3bV0bBO37g0NuqADIHh +uwDMxCHFyxELYknFgjijoEPJQaVHSghSqGlQNCiZUGWQhaION8aSbm+1zpeu ++s1pZkEImkI4FjpjqCAfuQqY+noszEnK4rZt7hhQkE7cK8Z1vVIE5ZAg2AOh +RNCgFAgFCC0BQiNAi0qukR0CjSgPrZfaweEFV7anqRJGIIw4xjwt82Mb4+0i +H1iu8Hlnjw48dTOuudaOFrGpZeS0KDSqlKCUiH0gU0AJQIlCL0iZZJC1CLUQ +7EjE1HB31379tTtzj6yMeH48NvyDJB3OCgE7GwZy+HoOw3fXXHTa4q3XDuTV +gi2E3RlRFoIUIJQA+SroVCgUKFQqEgWyAFeMmjrmHfG64Xtrl7Waxd2+ENgX +XTsOgGUbr73gKF/HN+dQcI/ESpHbjfLXJI33jpQi0IthC2SOlipoRNAaRKUd +AjpECgQGYSSZkkiZvJRccJgvUjxi04YxirESELyBv7oIQqpxhr73iHlVc2av +twUiARoa8N+QO0qtIDSK0qtCLSi0KtIrSC0iOM5TYMcNttXU233003L65fuI +o4gbQVCAaKjhhapZd3drDmzi9i9bfJ5CgUINICUCUhQA0oNCpSKUqNABsCn2 +CIDENFrzmYzic1iIJqgXy0Pn5HzIvu+w+zMC4l6qFkYEZEjclFkrrdLhGRYR +hGhZO93hw7w73e73cO0UEOfDRgqThV3W73bK0m7EsyrujK6u6914gzW1i6WI +ntdYVuGsyu3yutGjIY+FrlOYkRHG8HFqqGCtxJRwvQb053PSOsaGa2Hb1wrQ +9BVx1yUys3YzeQnc0sdt86E725W3aVooQX2W2jy9vE1TFxCnCxVVdHG3IhPY +L6CpSlSVjApdqywtFxc7GV2PfdW9kB4u5vaE+jWlUzcGWDW9A6NPu1npqBxb +RFqPgnrvrXA5hqpsiuTOFtJ9l1lir0UOPMaKEHeoad5nNl5rqGrYZvtvSv8Y +7ts0sxUoPrspTKXa8yvs7X/ZA/x/2P8Ib/jf4ceaV+/5fjNJftfxP4sfx7XX +LLmbncjJeOqmeNc9WEoiLa7K51diKue626FHtO9lE0SOvlWatMRUWtF7SBdS +DAM4MBFVFLyC+HWkkwBfDpZGS0jTjZ1ASkqCzReYwi0QkJAxzHOSHbTWH6tB +q9JH17uQvN5UHvCvaLvFaLeRnFU0Qhc9HifWgt0xQ+gYiDBM3m2FN8TVykUM +WxYwcHQ7MH5H4nnyIFfBy0ab+fv/MmY38zE47nfttGxvJ4Xv2heBsUGSCyiL +lcgkfm/Hw5/PvT9HPz049RW9Yl2rfiOdY6xzMYmate/Rv4AkTsLPQW8kMHAI +6IsCiV+kU75nA5w93un5NE93vhfcjLZYWF+WtqHD1fD6sYqoojDrt2ovJNz+ +QueRwGQzvtv3e86WnPnOCRzfi+X1kfDgSMH39nke17lVn0e9Jbo0vX3lT8Ph +BBaWOjYtR1nGSc4i7WKTRBaVT1Bsnir2mYmxOUCjThM6dPtpupH+Z1sRb2u2 +vkTWqsDBVo9zZ3SywI9QGAhhKGSD5gpC4lEpQKQecriQSkDwlTEgftymIRKQ +dgU166ce4Ce7PHhY7oBDowuexEUyZ9NEk+GMRazTZyGbHhFU6IHYvZfFMqqw +g8B4KIKIJTCA/z+v9Q/v0oNQ1vNuCmvIHEg3TAjkFJf8cLpIi1DVIypPdY3Q +1SFsFrVQdkkgZhHcZB+hiGSRxx2eJMnV3fYjtftabCgKfmYdvuqze8uOmH2m +zxbZE3bac9E2UMyEGbOWtVhmbp2ftp4CJLGEK7AugyugGlPfsD0joTSjSn3y +mhGkekDiB9ZIYldDnhMm/UN9c6HXtz27GoZc/U8Ri7sYMbHamaxeCbBN2oBW +e8A6YGiEajTXOOhvPTjilM23BbMkb+wJDpelCkWkPwI00iFD9IHSHxDclQhS +wJ2BOwhMwKtukZoMFRyVzU3L4QxVPxTmbf8HARRrcYFUMyqFZLpnKAu9hFU5 +amsvn3z08c3g36uNdYnNiLUSgaVoT1K6QKQMfGR6B+yA0AUDQvYLK4geOLuz +vK6Bg6vZjGev8lCPzvx+gfNg1yyIcfbciJHP/Rza2okNOQQzIq2YCYKRuNFj +bjpxXSooJpICmxpJxgSle7rgMyDSDQhpKYlChGkcR1hMyBSJz54BMvI6HV2N ++zbTZCaniJDzPOiD4vV8TVMJFeK7fR043MxcEMxl3GlaMMFIDn6Xt03e9qQF +kgB3TY34g8YQoAx6cKmSEpUpWgrCdvPCaqLXjWE1UetJlBbx25eqh5iRhopp +UoQan7JIY/hZ1syv4gNhe0VeXicPJGUChkA0F4L4rLQXTk89I6WmUkhOnccR +ThI0q0kCkrQpSjSAPllcSpSNIJW/k8nZ2aps8euc4zg/z5XBUIh/mZpH86ba +QdIQu9T07oQRjprRDSxlJOwIeswEwSONnnnpO8kyJ1Lomkjl6T39yNV5VJlQ +tJwhUmUYAvmFoejhJA0GplTayiUkiNtSswPHLkvDqN2aeYdokNcyYYZtWiZx +Z0Yww75eqKvaadjICHUjg9QTHO/MbRMk301OskR/aqI9LEe+gZIj862web6o +wCdOzLkqCIoSIo+mMEZjENFfDCeTydhz8PG8c3TG2ubw039nIT4QL/gAUg7n +Lj0HkPmUFAD51JUUR4CyqCd+urdpQkeM9W6V3SuWiT6UgO5NBcuGF4GyyGjI +sLGEYDBe5cWVhYwYWC1rVRRnF7outFxvOuNss6Di5TEGThshLb2YtoZHYwwU +86lj7V6B5lC6VmKbvTDFbxNC+Fu1crhtjanEq+sZkJyA6LTm7VJ6hT6kDuXm +5lFiCq4686yiaw1181kvd5Hhw0qxMi5XUSacF31aFwb7K5c+qzaGbpWVeyDX +fdZi1HX04BhusHHKVHqvXhvja3hHtRl53Nbal7Qj3iLt8cOLrm92asIeUCKo +m63OoFkhWMp0BXObdVkhsdHOCzcp3q9jN63kq9rGQ+DEF9QYgzFOC69chcYw +9a5NVF61uZj/wsd1o2E0euh33ivpdcNH9j3f1azl+LFsf4qF/N6Kf4qHXvaI +99U3dsIOqtZqWUfWL5HsKG6JYc6y/ZFFe1kWaHhR8kU02uywPT3gwPW+GucA +5Jko1m+JBEata7iwkTiZBEu6Sz3vfTmPfeDG2EBQ+V7W1XM3C1on3R1vn1ZN +MYuHDoxCwU87Gs5528xYbtVXLrq6IyPTs0l5LSSgkmc5zcVUXtbBsceQfwLI +MW23I2LLc7anGc85koOLQ4PaajbqfE+Pxxt4tRqZg+9n4xRfrzDPTP402o56 +TJei2wtBwEHCHsFJI3pgcLIHxneDYQW8/v7sxuO4hx9P5stV8fl+PW1u3z5m +sttW3HycHbv2+ZDTwME/bQJHwI4ULtzsCW645GjscgDJeXh7vR58/7iv373+ ++UmF8nECzz15y0arPqy6u9xE97wmJvBaZoGHgjf09a1vMqmKdZBHZIEzAIyp +F8IU4/LCJiQcyiPHl7simqd+hX8oFlfzt1AWldfxtfzuNeR7qyUCOKBEJefe +6qMamL1fQkVUD2ZdOz3eAjrhAiR3CR62Q03iGPycaQ0s61DFgttkDDCBhhAx +hzIrijW8S7c0Q8xxeOlxnxaebX2TZYNi14YuNZerOEBAHg0aqmQ/5eN71pro +hiwVxkGLBVC21Cm2AJ0wBLJLbjAEes3kOJmc078YHf4bqffgoMYLWVrw1aRx +LKypeZc4Cghgi5zzmrOV3rL28avhnUMe3nQaUKoWhfXxoNSVJJudnfjuze72 +8saZ57uhbEqZ+6uDj5gsFHgaeFGY2rvACQAjD0mLs9Ecd5Hce4JcNTIEuWQh +ThDY2/UEBUTP6W+/YnnX7zVHVDOrq9A0EFsSjtMFgw94ARNZqFA3DWmI5uIX +RkhMMhQwIVMhWdEDmN4nZqs8mmeYvFne9bve7blg4YQWKtSBzYlVUF7gCCAP +BvZ5+/RRekJBYEhgVmBBV7YlEhlos7jDatGIipUC1T1YvkagNJZaYaLyMRDg +NkfvDM3ay4qu932zXgPdastnuyMKWwqJ2VMSAb8OeVOxXtwCmELnyFHwRBhG +4ZOY5bbpaOszEPeqh6NsPiJqM1AyaWxa+IqzjuXIcdICIxMoaRhud3xd4ayS +QasgC6eGiBRmCPhnjxo3y830nV1yeWt/N2M6WvL2nJWjTdwhPgPBVERPGeJ8 +dQzOQki2sQIDTJCUCW30MvUq+W41h86er7wS8R8vW+/ojxGXR/efQhILpG/X +w52nokD10aOyLKbkq4u3YWTBlGQys5DJlGVlLOb2LWLsCx3b27okHVUNdkIq +76YqD482cw3TsCuOqgtyKt7L2ZtEKjRzOEy6tSYo2t52XqRxyuxEQL1ZMFh2 +Kq2KHdGx2enW6/m87qv4Edf1obgzMg0vCdslD610IwHceShnZopEiqyVtQFU +LF1lCiFqeoYFg3NPhMC0RLJ49uS6NXayjt6k2k5QpK48yqVrg4ngq5jYO1lV +w2be0m9ebvsqtgzK5Y6aGpXXVpnWczelaZ09WyhKtu+61eZ1x7tej3BtaYst +cZvKhQnYKodBam09vMSp3XRjd7c2DTWA9fFjZTMljKzcgF9f8wCMnHZvI1K6 +xJYY+35nGD192Yh0za15e1dt5t1j6RXevvbfSot1YZS1UpPQ8LXs4Vo2VSfW +QBAKAIAXl71TY+YWHMkjjEFwZNNJAXiMpK1rIzKEayiGBFmST6uJZKirtrRi +s1Uve181hmkuMzAG5jpXVnvWRItYI6/PK58I6yMXwJQs7uXfpqCnVmjoHB6h +Q8vYJmZW7fEFRYg2wf3gEhrsa0xg+/PKNqUVG+5My06jhi+q9fh62mRzw9Gj +ieMOX24brNx5HnfgfnVnxZ74iHi852SuqXKJN0aSQrAk4cowjEjFn+gwJvNv +hwl8w8DufZ4h6IEjt0xZgR0XQZeTu9FrVL+zYmVA8LANCRT+0l/aHN2cLYhd +dVqpoe4A0C8s7e3MX08hIckM8qkG3jICyyQ4JH9zoQ+1RArEah2KMKsNJMwX +eZqmTf4Hv6pnFobm1iluwuHgLIHuTiMAaIxscMGig+mBNpTSE4wmelg2cbpe +zFQIING46RnjXyaKH5+dPI2aIJG5UxNoq2QUu6EzCmMPmQWiLaeJSSbTgizI +RZhHzZCLxqE4aacmG2lTE1NrkFF2oc+78j40ybDaXmFm3fVl7g96wR4DaInQ +BBesNIjYEh3SM6dIFDJJU5bVooBloGILCEsC8yFl0rhoIYj9vxxUiwkTbK15 +nFVkQOwF1WWuSRTgUMJGzISTt4eBID8FatIDYExNHKK1d5XQV68+ekO8eCqL +Y47KnXaAHjRZZI95UOnEerw8eKQtkgGcYXUOTMy9M74Gd1vjWG3UTv1OyCX0 +ZVaMnKujqvAeWLwKKABFjLe2mRZtFshOlRGbu4ahjng46Zrd7uUGa8Lrt3Jf +H2HzPLiN6oTfNhm+WcSG+MNUaNBb367Z7gSckgGWQ8iwgTAC8hmjPuoH5W60 +g5+ZBmkZ0wRVz4jvzWW0oLV5nNGjv2kglm6Q1jDThgIFy8NAmE9Xtp4JHHKy +0tq1Ww+MVjAtVcE0a+wYrdS2JdH3vIVlTSq9jHgj5ooARywgWGQRa06oxEZv +JVqs99TbF5hrXxQlyf8gJHYXxba+MNGxvu1FrAkSBQ0IHcKDdXW6wHKws5yG +cFywWsVNyZzeqqjFqM2zbYx3dqWQNShdUQ7aNni4jtx4X10UMkadPJz7JNed +uYGO7ddXXBPxu7wccv3YL4vcncrytjp86Du6Wo2RtakWumEuhjZyMO68+b4F +bOLnWrbHKaK8eFkatwWMtmvQdXMK+pzZwwPJKwYrautPkRSBraE6juYZiW5k +zrq56+3XXHnzy9yrxHqwSOrrNYo1MhGPc70WYq67u55sh+2H2cGhd7Uuvc3c +yUJbTxXlzcfe7tqslO6zbSrRQ4YeXqHC2eE7qtHDnRceqpc1Vr1agyuBvDz4 +J4+zIlzcSdXlzqCnw9V2CeefVTLpYOL7Qbxy0fuzKpa+m6twzx7traMXVecs +VbV7e3OoYoM2m6gbZRlysvnNowcmrhF8xe+r3TCGAaBDhN5i6dzUS1sgiUlV +3BF7jodo1WLXRoEWYDwdzwAsDRmbAp9vUKz65bl0tA+reuy+WvuBTBAoYMBB +EHbxCG0hN0k1QniNrKCNqU+N2aBsW6OTwQhAYXgu7cndb0UXLhs11d2LEQCR +fORiB3IomZgoZZKKy2sYjPb3eFpkz4+6dotvlyt+YLuz25nTVw2JbcTGA3Dh +DxkRSNwzgLKBunr18QSIQLrewbQWhuetSbDnHWbWqzYfNjFPLPIYveiqB0QW +l85i1TUyhMxm8zeiRhLDPWHhB3TJBuwg6MIGGQMMIKq0DmYJ1ttYs2998dQ6 +6yDEd2MStAnkQvFrnZOPKSljjXidUd9OtQKWROFwwJN4wPd3ZCNbIPfl0TBt +AT09m+rvyxZJtBE1uUZev8lCAG37CIdK5axg3f8ErpWLOg94jjRYR8PY5tCQ +oYEEMkLh4bMusxomRgw+b3gd1v+OxHRPhh2kye6Kxl2j1bgrpuyt94QLyBdJ +bIVp3fKHW4G7IRpIR3te2wng5u/b4ULIRvcGsT2iNSe+PsKCG3Du+ZTYOVWx +VjPvAnwvbEEA9R8TnVPq8APY4cSUtrTqFrGtbO1qxdNN9WB5pnezDZcpMRyb +VmrKeJvoHJfsEQHoQkCiR4YENjo68uSZjI0k1YQvkyZpJOnDKTOg511d/JyL +8z2F6T+IXqIBIaTWGibObjdYJpCI94oo3zFEE+9BofRfiHvABFregYGfaPsl +GtzCAm9tm8Wl6gKQRCT9gXskrccoK7A0gedBafUR8mx6tU9l/T3puF5wG8vK +VxL8JE4W/G1shPCM8unR2shL6uzdvAOoUeMPij7UGHXWpThVZHU9Zkh2jF8S +OpcpkNlh4c3FxKSSgSZKXF4EeVj5hFfjP59djD+Z+St692VweGkESRNGM1LU +9ZmJwyyyFN6IIYUDEKDM7bWEmYQGzCC1rPWmezWs7a1VS7bbRKTJGeqy3ngS +MSw1X3baUlAUqFYVGwaDAYDZGUZ93u4d3uHDu7u0aNF1Q4WBYvvd27vsz2YM +uZjib511IYawVReIaChOWWNFFm7uqVBjI0Owyjt9QLPdes30yNEQWI7LTywU +Hmwd7sDY1+ovjKphjew8W4OjHTOGa6tcMsTs0CA5lut7C932d1UIgVyBtO80 +VQ4O4bQYgi1rmnqNe55WCsVrNPuJL3e3VXC8NTbyuoLTeAq5l83tyudCI9p5 +beIuolOq8V8aF7kcFZzV3Kyw3UnabDE6hdzlgpqTb5ZGUNwXomnFgUsdOGVw +u+2uvk32TbqY+DeXcawbD3aEDid0NziTqNu+k4Wje7WXB+AQe8ibRU+tjvjS +x1nOO62PPhQ6rzNh6Ka63a3RwUd9pWdW7qyEHO5+JGWhm0K0A94kfExih5dX +u4SmAYCb2kHw9rghrx2STzYEZJQ4IqUQCLMWulckve7RiHarRd+loEU4jPsH +wIe31hTOin1pgjKiytQsUvjVmsquPbwnIb1Y2aIngiUfIeTCfoT4vcmngvhl +Ys21aknJkcwSOQZH4naMrZNrK1ctm7UxouYURHM+NWl28/Ntp2YtvvG1oit2 +mS+94a3E5q1TuLTAEiVKFBo4Q4Va+yAvTAgq+RRrl89AuAkcEmA2iFHElaxY +FfpXN9hynX5ygRskBGLZgFqUbwgQ+8IjO2/HU1aSjQ1t9ueohwhxLiENJEyp +wrw30tbDf2PKObNmSfCtPEb0BAZB93sZbvY6N5MGX4AMFgIrwJBFDJqoD2ke +96Wve9TYuBNi05aqryCvbbzlbbF0uWW4AveNPxbK0TnmZWDy44wPOZUJhO4m +LOCpgCzBZkirRe9rRaiyxaTN05L6urjlpuMWWBwRtIjm3mO4cSARA87mIQM4 +CPUCxxTFrwBIGHw96H6PIrGwb9QZF0getuqAYyDfugrL29rl72F+RHv44o1i +ovV0OzYvCQ8F5khlZhh7WkF4siWB2AhgpgN/CYFZVfVVTNRMQoo34kh0q8UK +/Sw7Sv9WLk97AEiuu5mXm0vEjwdReIsYqyLX2gN2Qg+uBkynh5Vw22Nt95Vi +w/aQsiWhRy/LHbWJfu/wy0yzSlxUbvrl72u6hhmGZKbxh5EYwYvIYlwBmQdR +FAe8EABwFjcUnopB1U0tv30DPovrvjy5ib7Q2j1p7zw9uHwhHhaF4hB4TqDh +A8SAiAER4Aooj2jStMO06s16nPGu19g7dE7H6yyAsD9rwnKdCxpHHiPCbYhA +z4u5DNopCsyCmQiqcZTATEMTmHhgj7ue1fmix9I9NoGLlhPmEFRCGW8smrsh +RixAF9gSGidWthqxe4JEgGWQKmKtZQCQyi1qd6vi2JxOsZaKxec/Ltoya2wC +HRelKKAwG2ywtgzkWQyZMhnKMmTPh3d1ixQFCu0DfVVbfDvXbYVa83srl6c1 +DWLvc+zqrSaN0i8j29d7t5KqDRm9Wdtc3TO5MmtVXE2ivbZr2Kh17VVwvhtD +ONK3hgrBCDtDUNtZkBCjsUsGHg9t9yODpgv3TgXllWoKtnNd3SAQku3c2t3B +CjewPp57xvOe5gqm8xLQWxl7JM4UIFqusVa72DsF72cNoXjyX1mwus1m5BdW +dCruZm7RvCfRbQl0aquBYiFu9T076wa8dgscdp7WMULq8ljhW7nB4/Ow67GJ +18uC7lo3ehpjXZlF0+fdz5aLdGzVeruyK83nfHN7jdfev+Q0eq9+n1CvmTPx +d+Q1XLpK0LsV9vjwOXOcSuZuVRWSN1tVnp0O8hmW+bw+x+3FpkV7HAOQ4I6e +zfISxNMA6SZWsYHMQS4Gc+SNZNIgEMAXrQItayShCHcsTk0NjUxiIzce1rW0 +WM2sWV2yhS+GaKePPq8RAoRo2eZcu7FIMSQv0siBAkkthsGnR3OG7bMEGBQT +qvfIIprN9woMCwwwrD2hwsmoBanQHg2OpUP4+WXlW1enk2mp1taz2eaKEEoZ +JI1lOkjDYNqCXDNE6EYjhDnVINaRRozjbNVazw0G7xIxqlaDmZM4ilIwXMF7 +32VhttPNr2nw0EF55NFH3rTDZ3/iAf1AYEsCLMhU0ayCaEsIktq21DtYZpHV +iy/FK8lBZzbo9q8FYo6ehEmPsGkkO99h5vMPRnYevaCkKA/ZA9D7+Dg5Fi+f +urjQbdXru15zBd/d3cMB9eq55+VzNVbN7KwzFS74kFcaXuV0kp2QI7wPlIHL +zA3R+OdWfiy91VVb7W1lss/mLtHNEjiFiQQVu3tS66C6QKIooDiPBj8UNl+I +HsIBBHh5mVPAMBgad5XSoJUTJWKrAxUXcnbVF35BgowbD8xplul6WiCOOzbN +pOnfM5yHemWedu/IkaHeo4UUv/lEiBPrRtveql7EYgq+zF5tcvM8ZxaRhiLX +sSCDyre27UBE6QyA+fh4nBBOn7PbIMh0paXm4TCRRljd5sab10wwOviWwo7r +ohLpAbB9SlIqmJac7FjM9D3mWMRNJrvLAqVUYMzq2BDAyRDh6dPHCbLIU4tw +XA5lLKWXyJveh4gX3Mr4moKaqfjEBFZXxdfpgO15DhbFVLuu15dZMNMW68OB +EPvH11+KQZ6ABgyh5lDy8kJNF6pHxh35vRfLhxUx8qJc38g2gShp1k9cfr9s +kzLq6ElgalBiEhxqdLLFFrbVlOc3EInhJA6NLGjS1TkqvE1GxhF/n6r9crIZ +bXJBimz6QbMxe6rXLWzV0NMQRTlmRiIN2sGFYQiItndzFZbFysTgi487I7Hq +3k2gWUDbbaWYNFOiyCDlSK63DdLCWRZDJkMhkMrGDBe9y97lrAu6HAWIMk9F +1YbsxA9pzFyKx2Ms2laydO4Qg0ZlYpKYImdgnDNCcG5qU3IuG0IpuggG9G5w +YdTM1k+sbzym67hwy9ybrdCqgw6bG22ELsI27rNpVKR1nszbrfGU+6C0K7Gn +wvz2ZoQe00eeKlk3plTZuNDLeMWb3sveprla3ey0OS7alQvK5ccujQ132b2J +Xks1Rp7byR3udV093L4X3H1KdqXYqrBTUo6N2329UC8cHU1Mq61yKhVU83ol +YwcEODAVh4KCqxbYoFLLvF188vHyyS8M1wlDFdbtV2wdDLXUPv2B7wnvAVd/ +mdwlfilbWk/jzr6IwVyywlU69GIcVHdauO1yyUMOy1eFAtKXfOZ4+nVGKIrq +Xc+upyHtA73gR7xtr2ySSS9x8Pi8WiyBdkSksjpAOCIAH3QMVej4ZXt530e6 +3PilNy/gxrmn6lkNgIrcRuzwofHOlI0JaR4i8CljohL7aQv1YD4+BoPNqaWK +DD8d2kCYOYVBiKrY8761Oz7LTWH2KjaTG174IqvJo7FVPn5mYuznTgcYvOz1 +vBq2Gp34tLUE7A4spAjgNGy4CNpqWIoDIIoEhoEhdq4oThlbQQmTmD9Q1+z7 +CD8rnbLBJPuGMbBoE1+6ZVXJslm0zNxh4qCIdRWyWJDsmCzBhgcYQnZOWIZ4 +bUuG1RS1teDOHbbNTemcHTMSgl27VQ9KsWa8EC3YflyGAhWKGfl1XIDYGUA2 +UJmdYFDc6OeNbnGXuty31UxhrEL+p8RAi2gDTEp92DY5N0Kj7MY604vR1789 +cOBlFpKSKObHbVLIPQcHscXL2GFXXjNVe+5c1nJe1IHxGCNxd3Kicd1FZFhk +8VLY0iTPp4f34iHvE+A9D8CA/iBs25ZZMTBHJwz8zb/Mp+lhAgkE8sgkvrXJ +y+MFlHCkQxLrDWYMGzoIMDggZhzBStqZkogtDwE6fmSTy06R9d+6aWkH5jK2 +WTXOqjIGHbVl6NG9Hi70SZUCQwFYFoWh7Pd3zwEPh4n78QAYyfjl/N/iEiDu +tKmtUffpxZ0Ale3o4e5OeaU12YMyxk8yDQYCesBZglkFmBUwG4bXizKliC+d +PVitQRJykWpZCI/M6TaSLBPjoYXjRk1s73OdraXpI9HXbsb52QOqANjZhZNK +TDsRBsVc04RqCaorBASD48s163BwNg5NEU843iQNXOYo4kRgTfveH8iPefhs +9Wbd8uLOBBBYwy0BVOvqN8YoyEMgg6lS6OjpdWSQ5bhiXi108AvAD9EkeBB9 +Ihhtq9ZFfFfVSraDtfVD4do94eJ8IAvDS+yGRRSuFsCyjIZNGVlGTKyLOTI4 +Dh3Ado3RBAxdsOtuKVR2hmk8xUK6i87t92Kqc7gxHsmPRSyjeB2xg0VrxbY6 +oVkrNkKWp9WXolazeTZUS43SY4b0W8NGscFlU+5be4MZztHHKduLHppbrCdY +TunsO65FPHfOpw0sXclOxmAvO4SjlWasbM6lx4553bO2ncHYGBMULyr3TXkX +ZdjDe2ENsIFG31Guw3IudR1zMnXFnUlu32dptMPTeQFp97ap3x72Kn00G9F4 +NrHK0q3TRqzN9WWKzpilHRwTGMjlNvq4aNJBhlX7baMBJznKaQ0Y9cGPke3c +i0qjlTO/gD3gfeIHvCxLoXlfbiiNxGX8GsgrKumLoH3w4zad9hVLc3nFehbQ +vd68vswWkRwPW3yky9vBQsTkm1NfJIsq4DAMA8LKm5Sq8xskpnEskosCHigR +CShCNNNiJvnLap2tFVqcYjEreq/gwCLrih99GEF8l98k86yKGhgm6C2iRMph +G7FVY06LDP04ak/H0p9VNssQxKtcmmibLGXkkjkY1lyaPDaK0iDVtYy4ENh/ +ECJcGDcpk3V/0+5/wx/XSpp/D+fcared5nWay2YIZrCyalBuDCW4ZQ4kRnlg +CcULSTPEa0/DWVmoqYOGH4tLjtKvaZzdms6eBYLFc+qVfWJBQbBRJLXkOCZ9 +/BXAwqYHBluwnGSpkpRY1MGdTFbTFw2LNwRtXtVAwxP0Jd2zaGsVKLnKGWSS +dtVHnWD6EJTRSSgSmjw9HozBIV1MZkLhQWfb4z45auY2laQBBGG2+6gXRoCM +4wQkSfUpUY8Afe96YPeQfhKvtuwSKOYOr1SutYb9fNjejESVBE+madxXi5PR +EgmEUgjQWNY2wB7xHuYA0kmTJJkqp1i9oLoanIgfF4q93tOWu8LH1bs3LeA6 +reOK551KZhIV6pVIEtxyxBKmRDIWGATySDXgmzLGJIUPiG3aNeeb3PhgXuew +2d6LJ2eFGoUiQSfEe1Tp5+97yA94SJwgECsWKP2HSw9K2qrVWpPevbFvx9Og +uZeJ0uYuKCwg10mihdmOHOIBywBypNhyc0OpkzrO2XtuqW406x7j67IgPXzH +UiDzKyC2iD6UEwD4aS173vIlIBi8yBTnr0jItrZKjzq3Kqq4jq9rGFiDSHXO +vXQQoQ81KMzI2my2kNElgfcBIUgamusTes52c9ccVPcxfKEYpdfWKwchDfWH +Kcs7mSkSSERXiwRAlBEz4ABt/p317b2u+k+3nhphlhzKSDoABMCChWRosjJo +Li0jRkyLIsrKyjKzkM5Wc5znOcGDGDAYMKX8sqVN6Yhh7JfcEN2u0dR7SC4N +l6t7HtXnZu8uvcrM5vdrzPdAobwXqrLJTWW1257BerQoclnsy65achvZVLse +MbkRqVXZRKe0+59CZuXZyi97OqLu9c2sGyVUbPK69vduScOdbvUniSwOu6+y +xY67I3cg3du1cN5cNMWLYqMNvvETbHLYzt4lSNm0CNovTdUYE9ucj7bW+YBv +t7J7hnIa0KptxFGt7rWjD24E14bY23bCh3r4+IwaJ7PTMGocqNAb1aU9olKr +VPpeXsAirODQeZkXISpUxdM7LmYOlVF29iKPMmy1iXKqee5PqutvAyr9t21v +U72bpjOLRudxTHdiWo5T3nmn1YRXEYs2ZS7uneEQF+IAIAfJZWDe7crw/kB4 +d3QEavZEJKHSU3tRgEZiWqM6yWtemktqc5LUS3jUI+BBG91ahOrzKECP1/cN +uvrb6qreM5r15dRhw+OiAb5OjI1aBoBgZBosUR73hLgIPDQe/pd/afZ8OnIY +SHKtOXckrNrW6526uc7M8xsay7Ns77xM7vjenhBm0OyNw3DZLeUoEBLo3yhD +AkYwb7FjenRoij+v0rm8qu+wXYqhx2LkIWEDzfn1tNSVNRmzjSz1eJYlkw6o +cplymBJ2FSoUxZh9QSPU3xhH1fYNIoHuNiy/dOV5FQxvJWlGrYDBB8Sx2b/A +sABn3EeR96JetAqfEaHaBeuqulPEk2c75ChMYIWZQkQxN+pXUoh6VsRBq+cI +o20B7yKaAC8xW5juhfkxjYeMNXqLgJOZs6Gl2ihGibqjHW5lwn3raIiGkeh9 +7zayl4ilZe+5e3u29sUdJoFUrPTd9BhcRFpUbyejxOs2VMvC5zDPrBhJ8PBJ +Ez3gQJ6CC4OqMazHVJYrAzqeOVyNOGaiYCxiTui3CIvFAoI+NC+hs0wPBtB0 +KYoEOI6R0jx7dIhYxYtoVqa5z1ghJetXVN0DFdQMaano0CD3gh7yIogPwPvO +DBUg0iCgm6rW6yduUGns6BHwI5G5HBcx0OphCTzhVFBjvDwQHgiV4f5tiAGi +vjw+3775VowWWD2V055kQYGtAkGyKqqGtagjqFmYq56DtDtQjsABgPFgVMVK +iBRjFSpId6c1q9NQVAzafV6qBKF0lYWtXdNqqulupllWCgW7DupyJhPFIhKE +aBKRPPO9d62+bV0WrETbGXXnzJN7tGX/WgD0ZveOJL8/cX+v/Et9krwkPlp8 +ygUKThy/nfW58HVVrRsegFjEsRth/IZMBVIMf3WuXDfNh6Xw4HT8em9VWVe6 +RdwU9vbnbUP3wR9SesH2gpAB4/4/1cn+8D+vL4n9GjQr6r52qce49gNU6Ull +TQdJvs0GGG5E2jRSUUU4KxQliyWxbFOcMippOwUG/aWCxZPEhopMHhx7eK4n +NpYUqRSpSlW031xNpqYF2VTR1En8+yjBB8woeHuuCUp1MmHFG3W6mh1zDM7t +Tgs1bRCzjD911aw0xpib1cGilKy2GOGA2IHBXol4PpBoC8MZMpKG/Iuduhhz +gb4V13QaWy2Q7TlyGBSUlDGcDqEOakmSCdi3YJqaBzJoHENjRNILSfAAO031 +uNSHr1nbUaqiJvEP2HefYnpcqCEykIQsQvvZmkg15u7BWN88Q9uu8z1+rTzM +eTB/GXOef9frNcOW6TxJLHSddHoGqmh2GjEzHrzaMVYiOkhFuXtH83FmYiv8 +/LbRi99mP+hxztNZdZb72fI771mNqtgvfTj7Ve4+M7f3TSol3s8jjr1gjr7+ +Y8bj427l8Zurb/yZqaL9+Hpq3C5eKIlzU7jY2mDFmxwxjiutitjOZ8KVMyy7 +z23/2ZZltl3Plgg9Gzebz61iKs+09untddWXm3i2TiGgZs+m029rb7v1Y7Ns +3X01BttrWIzYtc8iC/k9mtL3vBtJhh2/39um+Oth2NjHrOtmLKGNN4ZeWpjh +uW2h8ZfbDjqiHjxOQh+7FP262+bzdyqNl1/OXXryPD6EKlRF+YnixbRl6y9M +diesVTudXtu87Wchhoc5yVAqh+P9D9/v7u4cYZNZ8w0wdaiMD5XqyseFirxa +S1p2qaVEf0v44kxenra21/LWczaN2mjT1UVVNNTEs1ssZbJZzFnx3qKbbb0I +333r35e1t93CotGLR7+9vG8Q+f5esSdH266imywnTDsVmoKw8wP4uONazw1j +9rwxU1JJy2GgjyGzOLv27OYbeP71dKlrROG42uWvXq0UxPd7N2wRTWvaYy/E +W6Fnp2nxx0a+rs2tOVldhiENVRHxZ03JjciTTOx3fpMX9sFGRBpAg/2Dhwgc +D7Qffmaws/THRjPA40ufDEzLYdpfpy6009doDDev+vMLuMS2GK28WhaYMt4j +QMYPHz15nNlwwXY2589qoz5YI8rv0xjRw2C1mvp6XXEQhqtydpNp8PebZPAu +ujQdrtHjPbTqSzb71BRA5do6Y6T2Ke7OzO2GjTOMkAgyLqkj0G4Av2K+EU/X +bQ5sL774cO2NDYl+DGIEUf8kLT+1wkJS0j/Z/RbF02cLkvZyLyfRA/LG7HEv +JbHBmzDbXINma9OzzEniCEsf96DNEFw00CAwSLTJIGEfjH8Dtuc05sNU4XSy +zeMm+dTSzX0u7TdtYGuMctPDE8yDl3vFNpj66JZM1izjerp2hmm7hxvzqjfM +w6vbsbTu29t/F+Xo16qb/Lumt+5fA+efxX9Lxtc/7GcyaBoJNKfvQwa9ZZBJ +tgt/zQw2DAURS2KNszSKBDQQJCIVA+/gF8DZuIggnAk0htJ/lNlHBd8K/wDg +df1n4K+Pw1KvwJkcTCWyCUV8UDZR/u16H0dOl6881ylpd1pW35e9Y6fKs5Z6 +7wq6TXhLu0QYviLlrfF70ezV+1nMvbid/Hh4LU6dirbRBI/hp/tD2CIIWhRB +IMgYb/f7U4gWBhMMjt093E3YZizFoezave1sWMMlnL+bBi9/FyV1xG7KXVoZ +m1E84iLS+799tqLsXHH1DnXuU31h1qvtvXH0vp1zZoytW+FuLcp6ciEn9G/2 +ocWfwoSYhbFMIJbaEIMTLP7SHHGL/ntCTXXIVzbX98wmvDSAtS/QQsv/ES/m +kP7BxiEaRCyEQP3HCIPkmh+Z+3RrGzZoii4F0Q7qDGU/7JnpVOAgrkH5lCIO +kuTxmXKNbaVZ22mtXW11NY2nrzJg3TniZ/jkJg8giTSRP5tQXZ8ja+RJSJAa +vxYPorb0ztivYMJmYTtqdrI3qm6W8xsOugbYwlbRrVW2PXlacHvuq/V5eHr8 +2zp1xyfCLkrwjt0n6vCyhAzMJuU7MCXbn2aO/Lu8S0/qqaUhn9YjyBMP80vZ +SASpgT9lVSSThUy7u4imI+5dunSxYYMsjomWXmEMxGX37RQ2nh4sb23Gjask +1JLElhd/Pp3171Ti3vXdQ5klKkSvZ6+HhsOLCOuMNJETUgQpSFIO5A9g9PRf +Np6HQxI2xkusjFSC0tOhZn3fk1AnR53wd4F7np84UPJRmRJIAaUqF9pI+jTX +Hs8tvbxMZU1PTG4UqSp1+gR/WPk69uekrlX4yRska1E7H9yXvTgrJhHpK+e0 +guuCsS+eBPGE1h1ilT01a4OWcE0Xw7d+epwzgQNiQ1xjnYgCqKCgfpB1QHD+ +b+87zwrRUm8rHN+y+vlrT2KHrDTX2cuEfV7EQ+BFGAgoRJhmEYGBWIFQiBQo +JVImACWikKYJWVSpkmKkSIUJKQ9zAChhlETSKKBpNLYkDnIg6hKnYhtI3xOw +yxizkDnjVRENkgiKpFRoBWJVSCEUYaAIQCBZUTwBSVxABEpzgEMBMJBEKjQo +EE/xAp/8gU+J5zjgau7BiPvzb6699tqEQvdZpqQj8/6P2r5YM+T5ZtUf8soT +P7v+fzTDoJrHeWr3+XzPUz9u98CZo/Y/zmL77PJrEZ2q17MY2xTvjbrtuh+k +wj88vdrvjPMzMkkn38v1VVVfszSqIbl3m5k3+Xd3dVVU7u7b3ziR7WjMtWS/ +w3NxMc+4Ehvs8ifx8Hfz689u0dZ8O1eDd/C/HcYR2GYD6x2YW5JyfiwtZroc +b07VPTmOEnjp0zm+HzVrvrN7tRixFV8dunPwjwnx8vHyKPn9OM/VjjGulg9e +ndmqqqqrnwDXfZ9AYzr5vXtppMRERU76gd3uxEPDRF1pMpg9wuWMoMgJg+IB +Pd/a5wSsz6IISIJg2bzbVjFU0NHtvx/T57APkFNSfB9wDqNQle/xkGlnazik +aOTMUqlosC/8M5oh8xTZCr9uFkj+0ReJkeJHoSQmv5doOjWzTOt1RMBnD22o +2mxZT4NjLkNEOQ0Q5DRDkNHj/k/SzMzN21vrPqsLBJ2EXZ9zjyab7WgZmGXb +ZyIZ2G8C+x3z2xgXZx8JhlxdxcaK6s7cjHSx6kFGAc6HaTp2faL2TG+Dr0Yc +/t6tVVggB8+j6PbnR+3rvTRFNFVNF2P7eB3YIrb9cnsDAff6uBru3lMm3seA +O4HvuzMR6/xv8bbbbwPvD8FAr+CaiJpoaPYwDF306enXwpWYXM1Z22MiXuUM +wAMIMGAFQHLoarXZmaRWGQijBnwzN7BYTk7SDaSeWBqEwKmazNeGtZXWduuN +8s2PEbWxZ0wyfAkj+Xy96LLD9HPqsi7QZCNlkMjKy73kddb0Oua3fyokT+OS +UkfoEjy39l2COH7dSIDys4HYa7LEJZASNAkewJH98eqSUIfvhhJD6j5NUVPu +h8U1QNVcmFPgycCSvHH7U5QOOJMoMerCNySsbkmiP7MbbbI+iKxqNyTTlY4k +miNP3HEk2Ry05kmyPnjbHAkkR7p4rx7knivAnGFPFYbkmEZH91XdsjI00wjb +5oyQYQJ+xJXEcr8pgT3I4E9AnLHiykcqwiyTUT6620R/L/smyM/LNP0EsVnh +ZsDWD9B+R+TD2MpH1ZMLdNo/6bL+lrzX0e8OgGyG14fsdMwZMZ7iaErkfSvA +DxDYtswOLA5Gvs0sBIFw8vDIveyH+v7dc+xoPcBwt/LvG6X87ujuvojSyHAE +Hn43waP0s8GQMBgOF+jwiLttgH2yH4gX7WMVb3rMewGQwaxyv8P/F8jx49ev +pwDiO+xutz6P8nHTwovz47cfIBw/GODyXyNBm+Eh75wgvg8YuvpS+qPZlyXD +13g7Uv0fZ9evZLvffOWZdfp8e8nddmA0o0ZQ/wf68WV1cBzyvcyxE+d1dfUB +6+/jO/csH0geud+OI+ftv1AyvPJ58/18T4X+fbbZcAdY7+n9w56eTf9Tj7ue +a5A4T8cdzr5/y7+u9GyZBg8/G2zTnJrf7YWmBj1v/jNBJar6z2tNxeWiY9b7 +3cslN/ske2F+1jr5n0cxrPh7/Q4UnU43Y6eaNp2nq2y20a7e7JshteI+l+b9 +p20T117sI/NtfS7bDQjBd7WXQ8PHBxgbtDnh8ttj/hre1tj8/n7jbbY51tsi +5+MFrYgKPb0n67227EQb2T44hd+CrqLxW1Gis2ZtYfBZfF3/2Hk9+oOOpMV7 +/dOdrvc+B1/VbGHtj6HHNtmvtfi54kv7+8+FWtsTOs+DFutx/lzfrx/XnBnE +Xc6OR16eBUrXo4eWjtOityf1cD2ocprEX/2R4Y/ib2k+l7+RXPnf2towcesW +Dw6evY9bKWMeRgjWOblDtR0WKtNGT7458TjE3Y3+0gpuLVQ021py1HRja5RH +9jvp0/30tfTo48s5TbO+B+89t6VHuqNycMrYqqm1Yg7dszXFqvNtRY4uTveP +Du+ZsQc/o26FXe1/dGD8jHB+bMaL66U5W3YjPWns/S/H3D2PZtF9uvl05oz9 +TSX8OjfVg1O50vGc8T3mfw0Rvlc7X2P9rbOzGN7FbE28dvGibZIrwzDU7HFt +VN6/Za/L3+vF80dm4zm9+H/5ukyX6XwYfJ92pv16Xu3N77+/jWb4uRxlvsvb +69t+hJriNt5LHX5TWM3LtRFdGeevrYiafh46O85mI9qI2d5tEeMZmYO9+KrH +umdNX2tx92Nl1vxuVWPCjxurHxv+FqrtmbyV541F+pc/0H71/zvf4q4Ct8qf ++LJsH+BcKz/CSVvrF4Yl/BYnWa8pLm2c587EWcwWctR2eDtk93z3o2PdnxiR ++OfWT8F29OfJtW+Vvy2nyJ8o+We8edvb5RPuv8em9V7pnlnpvSI36z23ne5h +pZ+2prrEWiLKeL2vrr6baMvp3X57Rtpn2Wb0ZyejeZnji2mM59uN+Cq+j6OO +1t+DeMOY2ji7Y6YVsTxmC/p26G5xtntOZ6ajFG1jnntu0Ez064Pnst+feVqn +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 +v5ctvK/gz+XfVf021ko72Sr0Itz4dt3p1Bo9o+Cly47ebUEsXXAJUwDa8PDS +PC+v6D3sI9R9zPz8B99WB07wzVMfS7X1KO+VnKQQlCVBuWuqrvqcG11jr7ur +PmvufDI06yFbJ8vs161Xdme/noudj2LXNCn2H4K7vp3a3ybekPiNs9gT26eO +RZlI2Qg4J1RDN4Gu7QVrvHlXOkNde2Gr1bp1+7V0xDca6U52VXDJJOru7u6Q +83VOd2jd3d3d7uubpWveirqwuPqOdWPiQefPeq+4SaM2sbDmCR6ZeF8pXA1W +667UnZPQb0NdmLd2nmXamJ52VVTO0eF3yWrwFjwL1AINRcILWmKYIGCC8zET +SIHcIIsEFTVkATW9q8BN1eA7wEN6PCWbWnwD8AS77T4Dh4FnwBLzwGnH4Djn +Y7u7qlvdLqiarTrqlKLtdVN3dSjjJqlKNNtuqUo06pSjJHDTJqlKNPbt1Zt9 +mq0uoU5Vfg9ksy/qNcvpOlj6aPru++oYaOkLftGYWjWEfYSyLZgp39Sw5ubI +n8Jtjfa0qrHszjTWqpxVQXTSN3VTLZrNwS95Te63ziTZsbe5UPdaWKYRlPbG +S/V2ak8oEEhxXYXVdSs4zaxjczmiLu7JGPN7Kr2hnmbt6bobIj2aaVXt9OOm +XmaL49ZqrnLIItvdvJO2ctxPoKKrnWLRwVc77Z2baKhbWZ3Lpr1pYEibVU+p +HCcV9faG1uprbyo5QT/vp/d98u0/a9+w3VpLuzcfU5endjm0hJmTFaxbs6Ps +dXdqs7aq8wvR16tZrWm9VEVTUz0JNlqXtf3Ki0c4W7kpk3tmXmzqzs78OGXf +32YYQjVSluBMdOjYdOuezncrBWK7yXz0qHOrD6tlxTd2jVlojos21ozdu8or +jY6VXKh1XebLP9f3H3cvu5ZzQJxFlnQijfS3eqYF7tc5mZoPT2tU4xWT1rcm +/myftd3PzKja347+wtZXTIqohDeErGTx+7D4lzT333y7Q6OSTq++vYYd3OL+ +Xx4lfW7VVL+13bB+liYKlsXY11PgPuz57yrF5ffb2HCBxWT7dfYLNLfu+NfK +9ucvnvXUoZiljXCC7+qvrWX8qvb+bxm4t+qR3TrJ23d1MmfAfPhb7HFgcVF0 +QrGkX9swqUbn13a1VbyIniHxmUr2s7ZnHc5O6k3t/t4DpORMSJSRKSJSXMH7 +ev6yLyn7xy8y5emVie93NtttttttttttttttydfF5mc+G9xUrk5t11LsV7W2 +xEhk7lxre7XuVpvKPVQJ6zNunl3EoM2xyqlpnW6oXyUvbqVTpLcVqs7eyWKJ +f5taxgkk3Noc1vNnz8WyM5zJ3GfN65i+OM6GG2l1nitqqv3saxXUU249izO3 +Ene9ltbv7FkiVTc+3em3bLT2pVfOwZljl2a+9psSRIuVezMu3be3b6uezLjO +zutQ5VXZPbVqcW9qui6Udvsq7su+oPWs4jutbZGymJLw3xSo0+15XZLXblBA +8sTNM2LGRwnlaOu2lb3inivePWNymlohhmbfwH7ke2ZSwXycTsgQaezIiQ7W +EiNLIYBHOiMEbCIapffk+78781SpVV22LyYuruqNcbXVyprNvtrP2++xbtg6 +oYJO+0fajUvOlWsZojpl9f8F2qfRXPtypYuoi5i5wpYbgf0j5uzp44TmzN04 +LLQuzMvqp2awXZ5SsqcHply660nV3BccyB5tvLV6tPSueYFuGDNva97rlbTf +wnhlxOMZtAWiLvMrnRuxDviYW0WvrhyosKe4CIrPe2LLpfWbrdWoV3bQ1vtv +q7XCDoVuq5LndDtO9Um2rSOzur1ZeVrvemSVZ3vdm0nd63m7OOcxmoU3Y3qU +FbpZ4dhO91hlIHbN7ZO+Rk51Vhq+lV1dlxdlzc7sqLio3WvuPbWG6l1tu5dw +jOs7eaCqwaKeb8ZzasYycM2cmIUvEk7g8ilta2F/T+rDj/Nr8bRVtdXZalxF +7SQVbBkyrG9xUyzy4nssH+jRs7Uuj21oG3yjw8SPkXE2xgZTrqYswQHFLnWb +BpCquZqVrREOSFqvn2lU+JrDt0FOtQZdti322P85Kvm/l9Wi9gxX2ZYx0M+7 +EE8fL9U/tao8Qa+u/lkasFqKkgUGeMZfhO3ZRte4zrZ9la+2zjdeGq0xev3c +pfv+8f1b1RHaVc0aSwL9k1jxZv6Z2Gis3vLFnjjZEi0yF6VvfaM2YTuXwFrn +jVw44xCtQmYmoH3vps9Ks18tMNa2ziKnb/rkOzndWksLtbIxFO8k2BytpuHa +yK7XWZXD40cqiTkixhVgzhZkhSLu7tGXPu5myomUQIgBJIAQadzPjK4Izkvb +RtqJqAyszw9hTlyVCiTiS0QDZu96i6qV2XW7TdYas9JmVuijWBmOjdkzuwLq +VJa33Aq60XOWr8AX+G2AC9Offn31z7Zdc3p7M38udsuu1vam51fD4XedKzq4 +cLvOlZ1cO7adTrytHbE6ldtcOrZdzdyuHGsrZ15XDsdZJeZWjhd50rOrhxrK +2deVw4XedKzq4c5d1Kzq0caytnXlcOcu6lZ1aOF3nSs6uHVsu5u5Xd94eO7t +6e+7fh293cO7u7kl3dzbfd2ZmZmE53d27u7ujd7u4nu7uHd3d3d3d3E93d3d +3d3Du7u7MzMzPvequrOkkkkkkkkkkkevckuXn0+qlyrulvRXcsXDe1Sq233V +mdnz+G5r+361OLvElWqnSqPL+3pJJJBtE9l72K66q5hqakjpweGVjPdIjvDk +u59QMu7vqqpOTq7mZcL4kknsZ6pYreD6cnOb1WZm1p5Dk5yK47WY8VY+0uQP +Ktrp2U3N7ystMKvcMWJJLXdYiWhaiiP+nPsJtc3Rgvfa/ddts34/txeSpK65 +bnOCQIeleZamiBhVXez6aak4uXbpQ21R6r5Yddu9rXHtciSYTVXJv036/N6s +KjyJ+RmGzhiKhsiQiSDp0aPvfNupogBZSlC+nMhT3DKJQiesIBV1KilUKlNK +UCBTQ0NDStKNItKgfez4dQQ/3dlRRJEgsYMO2Hvs3E+Ce7z2OUBQssKc+Wfl +LZ0RJ9QHveTgn/u/Ugcf/u81OerAOeIGimGLS95odH0ncmLoiZZIgmokSYGJ +j0MXftWHIbeApFOEXRcnmmnrHB3mKcck2iRMaJqzsyJuLZ7JtGDmDmVKnc9A +fwjSyJ6oqOjk3MSHQ7vakNepsGl5IsLyPxc08Xo6E4d03Or9HLl26yd6YU7T +yYRrujhmy55zUmrzk9z5KvwvHZO8HOHk749tsplatljCOEzOwY5CwwsKMoUE +AsSDCxSDEdnYMPvCaE2NL6uhLqPfeA5jsZuh7SdsXb4b63NyF8JRiJSEkhIk +Ox7VwdiB2IR+GumkPqlKF3IO4CWWBhgIYCGHFAkKWB3xcJBJISUCBhnFCX78 +CaJNSuEu0iYMI6IAwIVgGUY7jBNQfnCDI7DcWgCRThGHacSEISU2CQNgX6LO +uI+EgS+H+48sYPdH4vMfW+GOjr8nWvaftfiuNzfp9K+qGle4O/ZfkHziTnf/ +suobPCj5jsgH4FB9OgHP52J/5QiH4NGwqB+NgInjmH/SX5zp+l+G3IrrjGcp ++f8PyfX+z937s/X+3Oo/Ovxfo+s9j5XjM/YfH+Lc+bk7OPl+ExfDMtLVT/kT +7YDAulvqvA/6ysa9PT/4p1FwPxp3RNOJAYMLlBgQcPUR+hV/HjHp2zdP1IqZ +9R9APUFAB9oH5o9NvKrw3LE5WJFfbTUa/SnVO/xGyIERLJYZt7bJQd9wPzEl +AQQPwGfo+2Qs2QqQeAz2tr6zm9Y/u4VP/kExyERPYJB+brt4wlP4ZPf8x9h8 +fk8tuWj6Y0JzsLWZt3AvzS/A6Y9oP+G/zmvr9M2h/3/pwDpAHTf0dL5/ZVVV +VVefw+zvM37z5xf/r3vVX2SfllH1EJ+eV8zzwMgCmIGnRGoO+yHaUP7uWG6H +/HZDzoj4PJJoeXv+nM+H3Ix7vfwn7dzPPjWhHc8MT1/nND09wfosRXhIZlUl +hHZ5vDj/Ea2/k6E+Cnb4dqvOwmf0GQP+X7vJ/ckf8JdwSAT7jE9fp8oLLJdk +hCqoX/cIdnZCGCj9n5PuHfn0b0D/go+6nAYH/eP1D8MX2t+hv1/ZhNx+f+9h +1/BYGFcGCLcfYHBf9ZaQtvrJhBqH7B7zygKFmEiSiH8Xdx1O85tBo+zfZGH/ +cZ3RDQ2sB++d8/e8CPygY0GCI9LjYZP5gHXcHvTOPVnPX/Hx6r6u7kfkB/eF +2fYP2fZzIMPl6+p9wp3E/uc/4BefaD6Mfcde2+37GGFMgeEpNkhrS4PS/Rpc +IrpzPF2fz3zP/IXO0AJvGEg4A55n7P13bYOKP0H5fee18eXnvyDnTZyM3dem +2acjaMPE8/Ub/AXzF8Tl5D/Aef/lz8O97957vz/xC8klB377h3G6Af9HcY1I +gFhruPkES4QlCQTZpIdIz381oiMA+T8n2/Y3Ncy8Q+Jcnx9e7z9nHM0J4+8X +3jz2XzqpAoSvrFl96dROxz+PozyCB/0BVG59fRkQY5UEDf4t0sLgFQiYvFrB +mGR74+T5H7gRMi14UdA8hAGeLQGT8YRI+Ffz/OWuCe39n8/bP2dfWJtUF3TX +zfF9dXHnvpC5EV+6dhfVzOQJ09gcjSWnJkkkUgZbAMR2Nc1TwrSZBHzT+7+f +1aU55y0NFAX1xAyLE98G2lFVGHhYhat5U5QladyTOsBhIm3TloPuuRH8FhJ3 +TPumgWgv3xLDk+vVDedoHkE5L8GwixOMe0f5CNghWRkWQ4fe4Og5XBAyTEDJ +MQMkxAyTEDJMQOsTGIGSYgZJiBkmIGSYgZJiBkmIGSYgZJiBkmIGSQFxgH2M +oqYGxblnBifMQ7hb1hvaIZk3wsH97r+wOPdffow+PtZrNP9Bd5W9JNFbNaz2 +tQarExUA2Za0RWE1V10FvuJvst9w6b20jbpbZwQPeWq0JXRS+IZ2OhWTOqgO +2iRr47s6NVVZOawzc3nXY8Qwdt60D1l1LnNIbN11zO13XezHvGl0xpVOPcqm +cKmVVF5Luzaj7XeKclmOaDYe7Rq5sYgmTEqvRje1p3Uxuc9xc1oy7utdoXS2 +U1bo1boR+m08q9ppQyjz5yYXe32a9NRbbvlLHS7G7gWHbwX0krBfOW8zjeRp +WaOzodNGdwoy7FJQh7QlbeoZNCwdqG5V6P9bUzPhrOWRZv3xqDDl38dmvUsY +KiOWXt2st/GKKn5EYd1WLiVAs5Qyu7sqZVUsxPe3ZzG3yfO8rYn1lhdcrC/H +BjqsmVXsZ2rdCHHzlZtXNqkF1467Mq5tUFqygnxJrTlvAqJ4dRNKqdXS3Qku +ebMqsY64KW4xQ5UmmM9K0lDU5vTapgjtJ5ZrraXEQQ2MLl1dze1tTecj7Rao +8arZXY86sBFduXjXRTlLM15ec8PPuXDUq4ETerUl3UXjvhZi6YeeHqlndNPN +7TWqZ22+6mYb0V0Ezc7LBuqW1mTFpvXyG+lzbUIvqwubgpVSWbdu9pcgzxMH +A9fLOosb015jqEXoqqywsddmDLNg7koTOnLs3svhi3BfEW858jlmGl3JBPnz +xDJnsd4znt7uE26i1PLvVyxN9KqsnZZq6tZ3X6K1dXfXV4mS+ziKFWd295c+ +Leo9287OWCzvbt6FvUpZ7O7TpbvL5dmcm966JFd3bW7LsFztvWdo5ek1ksLs +WDH2Xmb07OtwXLOKnTyg9mVWBvKNYt2EiYL6ZIdyZlW2EqHVeX69vGb9vdwm +9Zpct2rHXollZ1ZndTm5BRvpd7NRiRloLaHJBXax9ByrK6iHi23wPK8Lg6Wk +KDq02TWaYNVi84Z3ZHlV2byzUcq+tBM7cV5W503rfUV2FDLq1L2+rRlZu8av +uxnLOzMT17M2zU6m9C7idnZLL7OQtHHr28lUpdFLuvnBXb2KmGrvu6m4NRU6 +J1h3KqJ7ekrn1VkqKlUowXd919uWNsdsQWmjqSFisg6suq670VJd760H00nH +fXO5Ugu4a74UrStJRhWpudlpa2FHzCi7KWcoLms1KoO3m5jDpth06pLtQruN +FN06xhR4w8sZ3cfnvH56T0+C28q7t116wo9YeW23iOg39heztvqlXtdWxve7 +eyRFwl32ysVcedVzZ09yWnM3t49ztbFNwZd3W7yXX2q8XXUOwpmtwntyCn2V +3Zm9zXM1NuTc11vSo76bJKkY0gx1e92ZMm1WXwhd9VZ0jrsN8zgpZ0W3g7lm +U91CTsZrGr6+lHN7DBuwrjSjVmwp11z4bmDCGsqbnUsG81WPT3Cz152pRzK7 +i2DrnDWZ06uHGIjNvA9zNV2OyK2u7nxpK0eFYuvYevMKMyx2RswlHkc5Vr7L +zaJ3qw6Fct4soMJHqGn26a7s57Oue21nGXucnRyclOTk6OxwYYcnc7nJhzju +dOjDk6Oya7u58eqbpNNSdRpl9LGOxLhxZ7U5dR5vOTzTobL2Tk9Tm76Xnbc4 +dzdeSboHBwvNNLqnDtJ5xp5OJPEadnaTiNTjOnUneOB0cl4TRyOa9U0h1Oq9 +U0JHVeqa5nNeaaA6x/kUlOh0XonPmc16pubr1TkaXS6XqnR5HJeSaQ5HJeSc +HC8J2Or1d3b45waNxS0wz8VA8HWM+yzUQhMyYlV9ZyTbs7qY3d+naqa0Vhu6 +12hdW9q2sdmsboaFAkTlu6lXu5lu6kN4eeObWmGZV9NemkI8t3ylYOrBg28T +Q/kN4YWoVr/lPz7vh9935+YR4UevrNy3+Xl7N4iz23fxgVZhyKnKxCUMu1Mz +dFuj9tp2de713c2rs3tVsGQy+IrXLgx3jNZsG9ewdT7IkLOzkF3VbNqY29kS +7sxvLxSxfR1mE7UzZubPdxnKeO/skzQAEniLmYrAZAEjQUl/DMCJUQaZExEq +oyGIKWVFwETHQRkix9uBDiOCWVFu8W5Cvq2/jt1ygfW6QOn1SRTDt3efd4Hi ++O3MQ5p7Qes0RGD5B5fWa8qCUYRkSIiiqoooooiCIKKKKKKKKJEU5HJZNGGI +iYYgywiynfKPiivlCIk5JKfTPIslQU4QooGoBmEZP18pcIplbicJ+mCkcGEy +CmRFCWUmRbIBJAhCyKogsEVQwkERRJKsRLIoIWBbApIWUpISyVEjRJEEBHBk +B8jB5TynclOA48vS93dV9W8eF9S7F2ro8QTMM0rLJMP6WuYvUrCMYoaDQzYJ +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 +HN4NOORSxEoUuCN+HlafYs9/f/rDhhRIiMQxDEMQxDEMQxDEMWGrfWFmZVTF +fudA0fuE+E73jv947tjMs3fKW2H6PPceH2u+vnpTDPU8EbD9/VYgFHI/SEMN +87I6ENlMYYK/MhkQH83ZU4NiIsbW6QfV7x/YMTLDCCILYdH+toUP4a10fRL5 +61NEPlqpWgOzuvkvp3M3MkSr3VqrL+SkC2msWHQttDDYyUIBNbUwVbXpIFOa +Cl24eysxH0239qbMYCffxabvjpE+wfApknAMZKhwhBQC9MORtYXgmN1UWARK +E4wn/nhEH2anaX4c5q76XD5Uw30mq9N8zLba922wGu6NLrjSyBp9CCucjw1U +FDEQURYXggp3IX/SosMl0t9SCqDphCfWwFqQS6KBywE88shhGocEEtFD0sTD +6kknL7ETMKJaI0eXnjhgI7nr3PcLuHVfb5nlz3eUia1gnsCESRhclMALIr/P +/m/s/4f7P4VZ/yt/HVf52wQ7v/oxXvZFtm1vkNRmYfOr+dzrjsPiCg8gAP9g +KoEZByGsDUKCPnNe/oniygD1BiyLf5sjD7KgOFQhzgMyORJ62HdqFcxiPSTl +atqufbp2OyRhPzv7cjjha6rk/O7vLyKq2nJT8qtcsO/lXPDH+L/cxyr9q+f6 +G563DzThHn8f1Pjbfyb24m/djXM82h7vRXpf3bm3qwvzxMqxbUSLhUGCgmAR +Q6h6vKILuIGbs52VfQgZsCOWj4PQxOk1SPmQ9XmHNPZ6e08D1eR+LojhAfeg +JJIJAAcb6Gjy5ORioQGWu8IU2UKOp79Sb2uTcCQwLh+2zoGEwEVhcEB4BIKf +A1RPt09MPv584ap2skp39TGC/hJvnooETyCyDu2Tk7rHjO+3v5ZscSHkXq3d ++VXQgPiJO6XZP+1CFT/N1VhgopTdOdsbnW4HIKBgOn2PhPAeai9nwxjO3l5M +y+MfB08qk6nPDsx8/3cPfNsxi3rXlPKxZbXmbcmPKe7Emf/jOz0TuPD1+zLd ++VzgwpUUpLUZil6Smz0duXoi22yp7dRttO2sbYQJYAOhDqCvDqgI7ED4SFFq +/R+FX4odPMCt7s2br8rLdZ/g+SrfoaLf6paMytCmLaLz+gKP8e69J/LjO1r7 +m15Vc2fd1IckHbGFVd2ZXrH5Z2iotb+2GOfujptx79X8Bo7tnu937l9u1O8T +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 +J17QhyZqF7tITutZejA8GRCPFSQDwz8966zB+ZVb32KPGvWhgQ1nX+ILU1xP +UL65vbx5W+zOdwqshZ9UzbVwm82JvL1cR71HxIw+17J73gSz7r3dAizMt7uJ +DMOO3cfqMIePJPLvPDwCbrF83nh0kN5VDx3nhgJ4+J4r5544kKJ4njF87w0I +c5njPN3h0INlBM4GRjOc4laOGIvJKmKta1Fls7qtWvC1dvWKPOF5XbovKFU6 +OR2d7Vhy9vTuV2UESIMWVw6qgUxGRoOiIJlQIMu8h0CBixJb5vPCwh4niS3z +zw8CHieMOb53hOJCs5l7d3lhQhWeN6h523gkhvLzBqnQI94SKiPN0/e8G0Ao +pEB4Y8lflW/qQ+Z7Px38FWGpjddtGlb0dRPMVcMp9W1j29qnUpiQEVbmjNlT +Ved1j3lt7lzlvak81+IQ5mtDndQqAXimYPXmEFOHkN20kXhDa8kL2xWHPMno +kQ7ynj4g9ZB7tOZzWEt7cw3X3g2vQwHzI8KTq3zKxyuqFZBtqQXI53Vk5Zx7 +KZEWVCc2YLq8kV02mh066wmQbm9B719qV5Wt/nvTqQwgWyvDxiDiC9Qlc5Du +2klecjuxCpk5DbtIc91nW5PIIS+UnjvCkFK8za8yFTmcnN6wjbzK7qQ9OvY3 +fbxvn1mHnxsrPqVEk86oW72denrGHrU4VReNt3WZ1RsrMluq7dOGSuJD7WB4 +qlBSr2Q3l5CZnJ2vCQUvU5OXr90JXvKG8qkOc63kMkm7duhmQqFTPbvv0JdZ +43eaEyZ5ybrIdrOQ7XI8CjLc94/GW9/JJqY+rBWjG5rn48rOreLaXKVco9Tv +n3XhivK8mXlYuvdVSwreHwruXQZVaYLPkQy8j94EgkM+LjHgVTh5nWwmSp3X +PJBTkozPWwndZkXtZBeuxzF+8ZDeebxI3yYh4mfHxi5AOvPcCyHre/LSff+Q +JD9v4tQe4vglQqk2F87Nl1duImCyu77TLrw7lR50B3nrXQF0IiS+a7pCGGfn +7dLwO/vNjw8efGWP4ggkFihd6KCsbgzM9lNUh8NpXbnaO7ZuXm7mQyo27trg +VpcRTTh6GXD0Cjmq+MHceuhXRyqOccvKt7Tqkbk7sw1wyZd28N3qyPhnblrt +pbWDMawXBQW3Q03N2Ht3qQrax0TQy7OduzAk3ikqlnSVCK3O4qcd7JSm6SSS +TWvLJJJJ0ruI4jPDuXbjdde7SwKWc4d1voDxayosO8MSGuxQs8+WdO7OtaNi +d7RtZe9QrJ3bd6SSSTz8K8G8rSUdvnbe1j3qDlybe6JC63O1DI7Gzdfau2l1 +UO9UIXGql3wW+4rHt8K61erOqsdrfXhtb1jSVF0Ql3dWdO1JfZfTK0bKxOLs +NVMyiudYIK7K3j1Hm+wbbyr3nmZXcsoyTbqLcJs5db0t7OtqZthWs3gkTly2 +Wd4FwQ9szFsqsi25Luiwsi2dgmVhPQvryryTI3LG1idZ213ZN4d132FW9dsc +TSN6rilDbrLSWoXdbBumY63oKSmb3HG5V3cyyhguF6qPasDd9ce50zpk6Ky9 +qr4s3yDb225R013csZ5VwdY+qqqEgEBgf44HtEIHuHvMMBGC8tCj2yCUgzke +DPrF4q+ruS5UTaCFBMiFtLlozwNtAf0gInRjQf7U6VtjzUOW+qkKhfp05o9F +WA6sHMKOjQ87OzWQZAuETCaAnPPe/nJUfU8nv82DsrD4km9Jrzz1t8vTPH8s +iwfpXduZi/lBY7dGRqb0qw1qJy6dWS56k6SCXXumpYQ11WrH73dnFa8v+AB9 +70s9eUPpu+5glTxrzHyyGR6zleYTO4pWcyHJy9RTkJzyHJ13onTJDxOTHmwA +vPL17ElJO1met3lB5Reh81TA8gvx8/yZ+B6iFjo/lXFna1z23srcJOtU1Fla +0et2Dqt2tGbE+YOZztvWPBZdYaw+X4KYxL0INt+HiQGUU+0gpycxvaE7U5Lb +ySbqHOb1hWTJU5u7QlQyNvdYBz1vbtCVEJUcPvBkCEqOEeDoROq2H6/jdCi6 ++pYK+2c8c47VrOKtZwldXZdE6VlkmZReLLIoRVReXMWS8BbWoIKMEKfyip+5 +EdBBJ9/b6cQU5i53NkF5i53Ugo2zk7bSF6hkd2hO15HtiRZnd3cErOcuvJJ2 +vJb344he80PEd2kH38u889X7YJd07P43Lx3mGX+wzhMrpuX3aMVHGa6cHkiv +lm8c280cN6sOb23FzBzvAUEFO/ML3WcnrtvuSMhkzPNd5QmTJttzCc8zk5us +gpUbc8yGZya7cwlTPXu4J9mpyPXeUJU5G7cwnMhRbUPvBljeq7y7EH5m1Nz8 +pK83KunvRB9M19G1I73NOVkvbR67k1qQ7maZbrhm2qAFu+6vVEd/vDmpHypa +QPOBecUPvR15nPO/AFCbWL2viQWLes63fihOTuoN8ukSRntniePPl2JFK67u +8PE+RZBUYHoQ4gY37w2qcHfh/LqK6N/sa3MsVc3uVWNOu67O2VdqqeZQV90i +tU3Gc01e09Wbq61szKOXdeA4+D39h5jT6JfXzuhOEqa9gnIZ17w8SeEKihz1 +87oRRZt10JyC1e7SG3aGe1kFTuwpySczJr3cEtsy28hPTEN+++F7o0cKyDcF +YMU6UezN3bopDJtUDexHq6+rRkm7mUapOPe6juPuZ6XJte97Z9fWJJ578nxH +5eYSpmY65IZ5mTW8wmvacj1IczMze2ILyczr2UIpU3bcwiyst7ukOZzO7u6S +NpS5H7wzM8PZfLlXe6zLXGThNb7uXWVwWTXntrerU9HZdcVmTKcq87RKwE4n +W919ek8edTwG2hCKn1eHvESEUQEsyDwhByW93QnIcjd3SHMep3bBORtN20k6 +117qSbqa29ZJzuexmQXreUYWfeEKMMaDPvDFg8A/R9WDJbupbZdH76rXSyec +4vN12ZL0dWbUzOiyqpVluz1omTxHb3ad3uj50PdtMalzxiFHXrhOLcx6hOdb +ndZBRvZe1hHWO25CPXNS9SG615F5JNm87qE5DSRcXh5giAiRDwN2xdXSNVXK +bhUV8+SpvMGolV0zBjS0KduDTS4STmSTxdQkas7asa9D605egbmMVS8YrLwo +M+MhRmde0hwzLuxDnmpe7BOXqZvWQ7rzk7UI47G6hNrys7WES7hQGdQEZlUh +2VyEEaHJJ9OogEEa22s+HBGxjSzFK8EQ4P9wRLD0T3QaI5WVT1QIiKoF9EIh +QJ0VdcyIffjgRd3cbwKGLB7YCyYEVMtyYhYxJJ0qC4rai1CrHTJmb3XdYFHT +OWzL40acvMldtQ9cPEnN1YnuZXinuCjd4U6vrTQVVu7nHtLcsdtPu2Idozh1 +7e7682seXZodtzHZPEV2A3BCSSSbt9tuTE5Srlxdt6ONVnOPK2tkutrugs88 +yZdaSSSScGEumyRWkkkk71Ph1dunasnhwvMoM5LxYq15t9bKw1ElKlcsGlbv +UoHjHXe7dUy8rqXrXShfZhxIklrTcm3rvOm129q4uWqys9fKxXbyG6ccsg9V +GaM61hNZnCnzqhu8dua7OzGixZ5ZgbZa2eiGd6ggpmDhvc1S2tWlcadX0dNv +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 +VrIcKF+ev9hJMEYd3o/aZj0S6oVVZVSXBJG7Eqq0iKgxjMVwbePdOIcN23xy +spYKOItbceVuWdIzbjzDlSdiL29nI3w67WSZdU6kTq9qz3CXtZxWzhQsZ3Zx +pBuEtbx7robk7kjlZtXd2lzoUXU7bUzmasMHjWh83tYDRJJJKlb3g/Cuza1k +VkKxre3qiG1dRnt6tubEq6U08qrUkGTHhzlNyqLqjZNdaWmb0rklitNZfkQp +j7q4WLGW+y5JHimsVlZUqZt6VmEkrirnd015opb2TF7mOp4ZdClFcq1e9c6Z +Lpc32XxlbXjVsWa7JU6G5JeKpt06uqXdbd67CmKLgRh7qWUWlWZ3aNDqKrOZ +2JzLvOkbhvu5Nys7qrJKebebzuYySSSSwtU3tN7s6va9RLSfTi18zism4zTZ +tNjeVVWok9eC8vXZK3cMuuudoze2btWa1dE9Mhw0VYp7KkxYsEzmzdlwac41 +tAvbIrFRuMqW1c0Urt6dzbmEkbMzMzCutqZLPQ3dysyN8EqvpVElSPdkOyu5 +0O0Tb6bO2aTqNPht3twVg04FtVt+9oDH+Hwv3q95eAPvIfcb4bsvs+4kozTg +d32Kl3LHW60jSxiqipi4v6eW8yXPoCDsKtfDOGXTKX1EqQuwza0NbAwlBERX +0EAinvsAjZ7uTXxI6SBgeEbikGo551fFuKi14mZiyxCyouriZgPDvHXVbx4w +3y3Sjt06trendl8e73RVZPVK7qzHLefV9WFEq3/SRhKMMlhsJopsJ23bOtrm +rs41pnb/I11G8a6jdfT0W0XC60y2tqg1mjTvFMFZr3m0BbWte9oteJy2Ic3H +2nQ+MlmmN2+NLb3auueULtba9/HtPn1Txd7cZF2lw3NyNrrlxsGMa4TV1Lq3 +Yzq7FcXd2fVPX1oWdqdvMhOhXVmLZ27e5na+u5Zpm+5DTmjDik3i5d5qm32S +3VdV7a20Jbyq9m7jPPq7FWmNkdmaYuujjYy42pDCaTCKaTRKaDDRdJ0RQYoN +juEdbGelvHaqurbJnVeLbk6d2addjqGOqzVyZLVMoLOQoTDt7VOSsI3il/Me +8viIX7auXa4dSsdrh2xtS65Mb67dDEiS2UGC7RZHvRkJKsu/vrP3KmZ0u7kg +ndb3PWd3rNjea1HRpLsppdOByxl7u1sF1YO3eTb3t0E2rNmeMQQLZb8W0Xbf +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 +ew6NrqY4W7m5uPW8bg0Xtuuut4cjru66kXzRZbRJmjhLm7XJqUzcl1uZVtwz +GQZYahnnbF0zvZe7Vo5tWMSnbfbBo7atcTS3JeV3ZtLG6YkOqjm2Nr0l129Z +vrvPW7688Y1+OjcbLrkzrKa7GtwktIMJMosFElothllEhOqzbulzGku7uUFb +GeNK50t88Ggu4eelVWbU23HVVXX2VeY75Lbg1d2p6zKCUEaLQbTJdb8J3cct +diraXX+ySJ3F4zsKoab82ixYYaObey3h8obIR6AqLPupNCPhe9xZ49dujk7Y +7vnUVEKOry13dwQqSuOubni30ANjTSRSDZLYRDbYJWpcbZHbZFbS4bNXYy+v +XnnqB+zUBBg3q2HBESJcYgtarLRjuF7ygBJJCAhCgBQdggSeQwhE0N8B3fGR +FtnD2Rw9tpezXfEdjWSE0D24JS2hsi0bTSlll5XTsbNnNWdTKmSu5F7A6Zed +swdwWTdgeM3eZYUcq1XI1TpHb5JPhVK26QpcbG2Vc6snSoHNdF7KxVr2sbdZ +xlZGzqe9crFUvbxza6y6Qyst6sxHMR0Fy0SSSancAznoA667d8AN9b1rmbnf +jt27OF11CI9mVkN5utbumdfXrGrOzs7qWTevBAxOrc5neDuRcDXZw1u2KTzH +tPRW8/DAKPCtmdIZYyit4tl3Uxa+LwZdDImrg0KV1cqLjMpGQruObj3RWvge +frmoyus6jkvKzlqbLquzVDlY+7L6PL7XcVg9mUrqutx7nLEupvqWducJLmdw +Ks667I3W5WrF1NVdyYjFm9aJ4bvJbzRrMdMZavlTLu7zFk6DVuHVJXJdZFb1 +uyslaYJfCo7pcpNktblBCuB69WGOmuLttaLvFWdtLalzKeXi3cd2cTbWWNcl +rdlgrXo4M4pnadHcrq71U1lUbGdxdJ25m8mpmRu6qsyX2UzsoXsrMsGtsFu9 +W6teRjjFStQCAIfeFgePvV3hM+0Y+vvpyKrSq7Ccb1vknQWUErGzSHY7HL2s +6lgiUDFk6z0TsIxm2btbFMztlQ4p4GEBcTwvkTxuJwP2vR8e70thj5PRtJXb +085N0yV7+Jn8fqoz7HZLxX3b1dsiPOEZ1bHyp1cW6qqOJW9EysfXb5NccVnM +nZifeVPLP3JtaPLSuzsptTDWq52KGGmCG0ySiEGkQ3nbvx3Mt/dWc61U5UrL +1TO2x0GWIFUmwXurDMzY9BUXU7lZOdrtEVGlZ1G9u7dNstNohFAsl3K7XKlt +zdtkU12tptXWo6eOdFdzKvKqq2A68OzoUc3uw73ePVUrYjtpZjrIYH43RMay +rClcORlKtIVrlrHy/WubHNzdTJs2tc1t2K27VKhsJkNgt+fqpCDTe3jNk1br +lTQW741XWGsw494kbbN9u5ilTs2NEPesbV57KwTPHcJ03nVbJJomiU2iCS0y +WmUW7kTXJhLdqW11ubqVddq5aUlrpRzCi4d5uz3GszX0vDSmrtbhSq8mzi8z +O0v2hWHubQafEi+MCvKizXcWvxwmu11rrStzdqZbsYSt1qZNpNhgptkiHAHM +zeilb11cGa82ldOXg07tb2ZjCG6NzGLqxnQOluleK5UU5NNjIUYxjtOuTTbO +FBIJpJIgtMtdrh1lTXauuxnLtdHO0u66PcEUetw0MdVtDFQzqKun22aw6s7u +uHIOtVFqdDpS7eTZ6ROxuS1Hdi1m4k6UPQY7PvGTGuTGtTXYrrtnOtHJMLxT +LZCZTKJd2HGM2uoyaNxWpeiRkXcWZ1Vtx1KxAw2nj9urpNyVkUeq7Wi7wMNT +aCCF8YYro0Rg9VHFGESnjMdjGNcJh2KYuwa6mVuxkTYfmnVAPsePdeSTN5rB +LgUyrWLt1q80u2FXWsFh5S2p2VIu3q2VT2n1XtRBoVQY3d2KqwejGpWkE0wQ +Sn5vzTaI52m1W7bNR1Kuy4w7HnrvR68PVzhqWc8sbQzDwsGU13W8qtva7dzc +OmqEuxl9cevUQf9u7c3D2mxeWqULqgjnwnC/n5A9Hv59bI63NF2ubrhLbrCm +brW3agrm5IUV2sncV3Yh569z4AKAIDTlsZfBgkRDZXIcIGSE7hu8IhKEOE/Y +/IFCVSEFB9EGJUH7P7Gzp1rRqgXapRhP939X+X1x/XfV7h9SX9qS9ZX78/wC +8pDd0f/GP6SP+Ua/F/Rr+/83+jrt83sDu32Mkiqf8/4ff+21HenMn2pOP6dk +cf6j/kfvSfuSfpSfd/tIfoLQnhKD8nsuH+jWlNJqE3nv2U4ICISkSnRvDhsG +g/aNti5Rb7ibvuXS6HMWnurFJLT5NO2qqd5Z33Q3rArBuKyoyFhlikmotKsW +SRilsiasVNBlC0LQtCyTKlWtMaMsZAuYhiyJKFoWhaFoXMDKFy5Uyxcs5/yr +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 ++n7J+7xDA6Um+ld1LLyyiIZj+XLMRFBZiG7qrfFWNOJdz0lmImZdzb7rO/qL +2fxYrNdnvvM3VTo407AtDMYqJjaYaKfTraJs/dXcP9ibWZLqj/eo1d31UdTL +N2riNfuWzZuXYmJVjJk798Bfi685asqd1dssevDM87vve7ei+hF3JJm7u5bq +zb9/hqCY+6GbZQmVy22py4XCqT8o/t/oqRK4ZihIEkZV2IUn7lTx133vY7qt +1U5urKqKQmWAtcvHdezTh0Ym7s3RQpQkJh7k6eMLhp9n+JDkJcxuMbsswdKs ++eHvW8rgqbSSTOHdz4v+R39VWlueCpTD41UytKpPo7E/+zCiDfoqszdC28eI +CwIKn5EDhvxnT+rC/fr1zRIJPS+142V2mPVmL7KrLzKhud3kwkFBzgb8GPSV +gKv5VUp/Ebm/vn2+uOtQVBIOxQ+NMXCqUGD5+HW1xC9cs11OFWe3qr6raVwf +xc0n6XU5Ukm7Mx6KuVELBdz5ZmIUpC8GYgsPbxyxiCxFltaGhXVmVFjtDK7N +m1GnciibSZ8iruO7uKJtJnyKt04g2+rMUrK3Futl6F8LejyoTtKjXem+qrAW +zHqqlOIuCyqqqqqSSSSTlmJANSp6fnZuteXxbqehc2UkmGZjbvrtEEmqZjVM +2XRmISd6dzFM1OjMQlVTufp4Zs39sRHdVITOcu5zlmznOYjP8LMQmtadzjdm +uFW6qQlrWYupne7ualmM9gzEeqmzVBsj1U2f4y5CPXbZu7kI9dtmryQhJPBH +jPOKg7qt47Piux7FzZSSYZmNuWYokQzGOd3cok7UxdTXzs7lEri295k3yR5f +3z+XM93ldZy54Xd+h6HtCk0pJMszEkhmZjwqlHdmN7sxh4dzUsxmZdzqmbXd +xG0z3vDvlVOYy7loZmpUhu26jZuXIatuo2blyGrb5I5mfvEHNtO/uuS3ZtFH +Jf19XdzvuN+pD+Vljwqmqh3PyRqqkN82bu5CaKNRswJGVUhoJGqh3Mb/R3NV +TubdrO5qqdzVU7mqWE+BHveNltR6Kvjcez6ryepc2UkmGZjzvrxEE+PJZiSE +4OOcw5znDuTfDMSQmDjGGMKY4aYhjENEQxhV5kcvVcnkubKSTDMxtrh3JISd +U7mq8O5JCVWMxHM2T9kiPbjZzOkxIj2Y2lZ/b51MX80n8xk7v0f0apE6iSb/ +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 +69CsO8vHUKMFQrYu7VlZPab77rsfHPvmLKS15QyBU/q8pLjwEZVO9QNWc+qt +hpS+Gx6yxd1feXFCZT4U7cznQyz3SrWnrusyEcdfESop+x9e0swPO+03hdHQ +Lzbz5XWaafq2cMl27bo9c6jt7gMq7qXPzMnbr73dBKuw9Ev5b1MdlVK3e59s +3HHzsXbbupJJHEoIw34grsblBmaHBe7q9XuboZ7orWlXFWVyn3p48xZ0GnWE +rKztNsoByvihpyr9fq9knj8OKo1zpoSH4X9eXd3VZ2ZOFuisVZtWDXXErrbT +lGa27dPc05uLHXPbva6cs3L65UqhUvpFgrheLZEu67Is4967bcO85VYMu7eW +6bTyQ2oFls3RHXIkRvcyl3I7SJW7e8jvKVoePJFovY4ThvlpiytLFFyiVRxS +Oy6wdW0tbGckfzOtcAcenpdjvtX2ySKRSSSbPyTqOA4L4vskOHh0768vBk6+ +/X0yvz7lTa6Ua/Fmu158883Ou87yIC15V6vyZYTvPEvrHrrBvSVdMZ+VYSn2 +Gvja3Z9tRPjmzXsRq8pKDHdWHoIs4MkDpCfTKG33tV91fNoQu2r72VdNt0YS +V/y3Zr+53VWH7R51Q/Koe9UmYMnP8B0e9t4c0dvckkvwbKISVyj2X2Djhdsf +oIgtWQTlkEUu65/V7m+H2R/0euSxVl/r8/Pxv9aK+OXMf1xNnmhgPXt5Pzpx +7sK/JEEx9KvPnlN3I3kUtrWRpORvdSrKGi8z5arpGcQpXCpz3Nytutwdyq5O +vq0N03TswhNZbZNVZyUF1ZXuymt7HeEzxjed1TNeOkBuT3W27l6KGHqqTlSr +mFMrWJvDHeYGu1zM8u58cvVtVXDLqpYk+bj4z3EyaY3ZNo18w+rhJNwRsmqI +ZIa0Pqtq6QfqLJ90eNKVntw3o8pTZOJPpSWimJS1q8rf5QvP8+YwqfLPle0E +kl9uL5iViXdeTb2/2GvllZlfEiZ99dcLun2ZmY9uSqzNrrtWuzlim86HdZ1R +267edtKnNpnuO5Sw2a6xlXu5l9e73SSXYfVvGG+2dyq53XQo4Gqq9048uSse +7vOZPCPiVSiOvtzNd5wOIu9wV0Cge8drNCzXwyV02dlcKOTDA3Hz4Rb24hah +2+XceV9odonUMPTJd06XHeOvvPS9y0KfauqaRrdPKvMy8hv2HOdSQxw8uvtW +3e7K7LdX1zMGbl3c7KkkHaa9QszsFjC+wozUCfrH3Zu8M+k6xgj76k/qlGp9 +LQ2+1ahs7d6+r1aHW/fKb2m727+3LlLSb+L+T7gq6RLaxzbrc19c10jyeR1J +054ddO+DCUyTKmduxvWtral3u5/WzhsTvvvshVva/Pfvv1n3ffWT+gj/R79f +qZuZ9kIsV83lmYNG4d3H9YXGaDHV892lU3NiXK1aisx7C73+sT7TxvCTDPq5 +PkcVSa2sSvDLwp7f1dLUlrBzVVqWOsssxUxdbWW65F+3a0WO3tuOol1bDNQ1 +rZkrOGJTqkZQJq6HTL41b1wO3YKJc4l1m0+2rvoK2VKPCse31L+1yr7cgPN8 +qvJfbY3XWYNSSw3jd7f133HuvMG41TdVtFPNRzsopyj06upLu7CaOd1096mb +S5p5P48AsaJ2nDCeFdgA6u+gH+B/P1k18lYogfVX6T/Pyd+mZ9+ibpZe6Pp1 +BVu9H8Tdqz21Zz4y753epsbri55m7rnccG67OXWxVDmUd6X151HpNiaB66vt +nfJP5E/d32DpTuh/Z2s3Lwmuv/NWs+BI/Nr9fX9lfkKWF83d4WVqGQF4NP5j +Xmpeg20N7SLSdVXKrJctK1Luvv6velsfz7r62f1nV+sn4TWySH9B9yiyycHL +i61Crz8FvVIdNb9eyuxfKFd6rVTHfyHnfyypcqUIxmv682vs7DCjJMLPUnbe +m7BaksdtXfdZvA32qiryGrlSzaY3aUrq3n0Ex0SsNuJUr2IbLnTX1zTdNI4T +mi63pNu8odDtclVnIc1LbzEVgYSKF7JSl7LHbwwPr9tWR1kuiXQW2M7i6pOs +zBjE5rO6PnqGyapub3I3iGu5L+76dXfNUu7vUhuoMEfTM+/q/N2gqOkUfx7n +rX02mFZLmfns2ro51A3Wr8xyapkQjLdQy9geqW1mZ/V9nfrZ5A+l539/P2P1 +8ljz9H9vO/Wf5XdL3ep0T9OSFB9tqZkepXWBiznvV9eOjvfZMk0rvOfvvB4X +rH89c1nWvPdw8I538PGvPpj8XOvIeh5LLLLLNeNnD0LLLLLBqc9gUF93bW81 +TiGhEw6Nc6qKKySSCST9zhlDv7f33Kqv7c/PuvN/re/i6tSec5+KbJ9s3fwd +TXTD3CLZ/I3Nmo/Osu4TBbP19++/H83utjaH1Iw9Fa/r/xwTnYsvp+vmJ9/c +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 +MzpxM6J+aIZjByXuRHmiPV52unle/5IjTps+trmyZ3C7amWenvU72EKaCVOH +wnpdIoIjxObifoPagPyo/L+d/zoH/Q4TnJKXcYbKZDJMuRx7G2557SOZ6/ag +nT8euvsfYDIUMBQzUC0kkUJ+j9mKQKShKMU345HyeCb97tCSB47oGcQinjE6 +SdIiZRjnsRv1jcxQ0cZ2hFTle5+Xf/oRG3Y321FvreEIz+uO31WPsGGLRHK4 +6A6m6vl6fiu38er8/lqU9zHBOvBw+vYaBAISM52lyf843EYvEz/iv9rMMd5+ +Q9mTlRxmgiBj9i+M3v66CUkoTaQoxVLICSlJVJaWKMJZMRNlQ7dyG9gfRAea +R88Pkz2xTRSmA/A7NAbtEJ9MKaigU9tyk/CQByYe+eYr3HL7PDgX4ewXBeIi +5VARzcX13tjQEcrA8Xs45omEmZFwSY/R+rV0YWrqOf6qTT8unAitZxfUzjvr +xdSxwyny5c3TDOKzsbrOuupdUd6XNZzFeOpbrKupNrld92XEIedVWbubiFXp +OaXSVbIQk3tQO5W08q3bGRdUnBnITwkBSmvVmBB1fWaJm9KrIM7rqsNbTGY4 +O67qVolmsmHGztTq56vHyvswRZc41V7pVZovckskkjpOzM7sNcFvDb3eu3W7 +nJUslVh0O9oPo8qmr27OQbmLsuGcyRzvjY3SeyGw7mxcrdA6jJXrygY+cZDO +zHIVVlnQ+T5aL5yZdm8t6IuUb09w7rdd0l4729rXMu83MEFTM649g4rO5em7 +md20b3FTJIo0Vu6+PGZuwtdxatPBl0ehulnULOM8hzdjJi3AkSLG3rzBlpiV +ea6u9tdZbwuzW1rqdXbwzH21azXlrrtDOeSufXvaeFeqjiyVe718LLuxm30v +ovWN7OEDSvbO8SZJUzufZy51t3nImIWxdvN4O5ZzL2s2CijbxTlQ6jhazr7X +L9SzJ65GotXEL3U6um5vMTkvSYOomJ0E6CcJivMToJ0FY5o1HCNkdI2R0RqN +I5o3jkjSN+TTjkctnJ0RvOc4RzjZGckaRyRzWtKViBVNFONAughMYTZQXTYT +ZTZRdGEb9O3hiq1S0d9dokiWtGZtttpyvWsQ6WL4ra6Cn45vXUhfXnO3ceGj +CQ5Cb9GE+OXmdTynWxjKzuhhkGVIvfEJ7YpDO5pLgGUyIBrlibDFmGlXNJ1I +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 +kRo2LGwxHVuP6Mv3P/l5Yfr/KEsGswyrpjaI+4Jhck0ig4USSTVRsVDiV+zq +43VMF2yQzRn5wwOmq3VqzV03zalhxCLZjqkUw5KmoSfD4rJiR3DlhNVVs2Jv +DMEflYJd8+0pifELMzNTmJjebtImxVncWXgIYh+Jr3aWZrEjHWzmUBwMJo0z +fCJNzcb7xuYz7oNusNGf6vJ5xOhI+xSNC90oxirIrh89ScN7myM63n36qfMP +nT1Eed+KSinqXV2GB9NMNe5yte2+KvNuVuuehZM6HtDB1TNBgvWZZo4ZMG95 +SLyuUy+LvrO53FHqL/bl58dNWPact7GWlceOVp8eLhYsWrv85V43FxLMuUwh +w7R44zdttblLU1N2dhuM0TdkB5HNvt7Garcy4wWGfZtMgkdk5EkG7QJpkFDU +bkztXGt5aNctvp2QfEZDMxqJDLnozMbgaNJmGX7Q/fO4a3aJcHKxWIPvExh0 +pDjpJQIlyOrQhm6g/gzwuCGegFeS4fkuQyFT171SoKAh6PQ0Owe/paIBBIq3 +ZDiBiaZ+oLBcawa0ozQ99w+fxD7So1mO52rZc4HWUp6Qw0EhYWvbI58p5u6d +JIQkknQzrSsq+YzQXrmNCtJJRH1cyaAPeceoP5UCVafuLu6ZceBsIqmqfQwP +qB3jaUHanY4x7A5lUVg8o2aUSESe1IJ3NGGYydm3ba8lNjQAsmn5v9NP+jw/ +J4PwgdvnJ4dP84Xknk81B4u5rR/zVn3SiiP2wPfg8pSNtcVrX+T8N8X1z4Xn +BLGZzrW3/TP7t3lPj12eqLyJ/Phy+e1lvLpKe0sS9HPjGorytiW9CMStl7zd +t+H3bSraL66cs3lhcfvfW79if+vXffS3PnG3NPnirz0m+bQ96Y/lnwWMUe3H +L85RlRH5Vtrmq2e0eD6RZ+qVnlFYpN+ykofePR3xGiM6+nMa789JSxyrPq6u +MUFbjfN9bZ5XblrbNzbWrS0Hq77avNW0va+uOSxirveTylx4X0jnIsudXImn +WJQPWai93D3u7dt3Em0/zY+q/vpSvnx1y6Rjx04+ErW153gno+vueyx24xKP +N/jrI0f+fxtHoWKa/5PPrnir8eefF/KttH322q+ubTw/jfQnSIxat53zL1Pj +s8O+dsWe79KEpXzLNra2tFO23uxenCz/r6/G1r73xK+N3jXV9a9lL/pxxtPh +sKJpenFJSdPRPflo+/rrVqz7K0jpmVpK1ocVNcZrTueXJ7T1uezXuInp4Xfl +7ha9ktczOFpVx2SUQuTudCf3+NCXHZ++TZ5MJNdtZZZDySSSSSk46XDdJKTl +MHy+vH0NOcpSaUpSk2TU6csG6dfekJdNpSbyp6Yekg8wHgiY1e4n+kTN/pEw +e2Z6oZoF6RHxTB7ARpV+5GauDFzpqFkzFRH1O7Ham7MZhiqY/2N/oPbDEqHt +se/29mT5fY2DbzuDeHf2AIDnlnfye09XrEOfuPUGvpRISCFfteeDwypPHy38 +vE91/SlDvm7QfQDXzK8mY8DvMXBN1um0K+Jcvj20KcKNQEGx3438G+goOMbc +IGnWdO87vrLn1kN7UyXd4f7IDfphdu5DufCW3y7KBK3Y3dM9la2aDsO3ynv1 +9zZlEDxwrX7qMedFfb549Ym2F59n3RY2cPLmOTm/Yj7yX1RkQayS5ckohKIS +SS8+9Nm7K/YjtJgdyqLQ9KICNNEksnHnmKYn7449CntKS0VO48EX/WdNc8rm +8v77pvrc/N9XNAcHqRu7DZiatufPWe2s3mYlN4Mrp10jbR9eqRK6o+hm1IlE +T6xRelkvdaEr0vDvf5VeUQdWZO70dtsSNM8aqZorQQPVcS/NfDlGtH0/SrMv +Lou7ujPzPx4S+2vFVpfMqhGKpVeXB67HuhZ4UnpjsaR9pbUWplnS5zcIzR26 +aR0Ok21bDyV8pDkcIxUvrwrYSurF2/2r1cH0fqxw0Bg4fYS/r+B6/P6vpfBz +ytFmk9FTqcr433Ut5vVlpxbYt3ufXj31HCvZTkdUdsEA7nqHg65N6GQ0rP3L +kml+L7V0LSXGE7RzSRrzIRnm7g/NWNQIQoUbTby8R6IalZJiFuq8yrBQ8pWv +43HvvOvVx+N97qlOg7JN72T2pppZ+NZoaabiYHCUqd3KmfQnolW8XLUp51Jp +3iKrCZICqEu1czN4aI6SJDHD/U/fL+FDYpU9tm/y8qqqr+XeYq4X82FPPzXD +gpHkyBkDH5fuglbtR2xhsElOnTXWhYz/ptL6Orn4516p5oOPr0dHftg7/QMb +PIfVIngyFKfYIZ0Ndc+p/mPJ/GRj7OxpXN7JEQmSTlWG9otokE/3om2ebs86 +KnnnJWbUHGLDdElYYb4DIGPYw1fLn6S69HoQ9WrE5EQuO09PZUvpOGLpCwOR +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 +4RbK0rvZAEGNp4GrwXl48yXLdsdC4jxsEvobydqyCZW1zdC2b6q3UMsWDeG7 +S8qq/buirrIb581zSRpUTFTqXtocNNZbPO6i3udM81E0V2TedKt5IlG67szm +ULJoszeJ6UqzemcsFp0Sqeu67gRK4vFDIRnDEaWWIdSuSo+u9OaOmU9g1zaw +X3bmzo6vXVXOOszjNSZ3Gqk6O7O2t6uulmVqqOF4tGS67FjfbePiVWQjNl66 +By+u6Oc+m3tYYZvdODyu6Uf7fw2dUxpredGaOS0zsayuSztN9KV2VCJqU6Wi +8GrpUtrpLOXHiIwQ5t5NKrdkU4jn3KuXXjcnZDRJSDw326+wCkgwtoHjlO9/ +Ng+GH3sOzw8MxAP6xuWQwve0/VtSVtdF9rv566zezig3hGjtHTu168N1m4q2 +YTVnWd+kmmVffV1FD2D4oIjnUC8X7KqXMfFbyU5VVLWlWd4okicFfw4bHxc9 +udr67RgaFty22Uhhjc/7CpjFm5vpOQLOla1XA1atCVncziLmkPV6ZrSdc4gp +RRfmMMfZ9nP7K/Y3zUpvNcKTWJZc00nFem8pfxjDCLkGxWBjVg4O2iPvbqZh +l2dR0K3nnnQWmTAt0xFBTEU1+PHL9l3GkgX7ypIBIJMEJKBHDTheVO1mY7vX +Th4tZvJ6r42yP3zt7eqCbfS3c+CQNginCJii+xL02vs98zEfbrRs0UtckTew +GzZG2wlf3NQcFnI9PdzZzCvv8TwUOfn357wH5KL67ukVpSWe07aTgOy8iwxZ +MJNRE0NqhfxuA00w1xA/OIkIZIGpKQ9si61i0KGZi0KFmJkC0JWSCZZIZKBl +kBSJkjktC6keQidOODx4Srk9iZgvV/DWtL3Na4166WWK5ttpY7UyEkQeab4g +4+l7vynxO13gPYRTrn8ZASZnDden5Hz684efHIEPEk4lSLCCMJWQkEkHJSsg +EyKMkDvgdRQmpVoyChEpczEH9iE1IaqQRajMwH7lMsNXKjvqHXbYptru6bd/ +5bp57Kn8zz7a2hjuCqDMTYkHXdYbFvM2x0kQnv5i3qejwHEe8K+tEnEojbFf +xRDwhxNakDzQJqAtYgeMHSVNW4CkSgbMRpaRyQoyEDJWzIAVAbYpJKyFS+rI +SsJiXPqwIh1G2krapRNVSMFc778S0y8861noLcyMV/DokjWqBdryIuFzisqX +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 +QUIo2+ELkDqoSqFzMBpaHIXJrKQKkFqAVgLKkLL2d+dX21h6eHtSH9bUiI3k +4REdagkyPVfAiyeJ1JdWZz1zPHdG3sCHJ5pcvk3sJ7O0JQ5yTTKAaoMgO6U0 +S6lO6Q0WpOITaBoTTDSExgoGZZK+E7TGGxA2kNOIKTSGmQMGGJiQMGTMsM12 +Vinb7ZzF5vXLHOBtR3doHvbJTQ84d9A6EzhrNPsdfqqvSCeAHgXgUO/IWCb5 +62RNeEDiu0NMmLlJnKBpUNOvNmtUlYa5cZFmma9ywNDNOkDBhmWYwUxmMDFy +z3YGCGNp2ebcDxr35zh+LCygRa/X7bEs1BnXKLpYRK6c92deD95nF1Bo7ina +SpPasNSVfldx0giT0UNVFWVP62WAsx4wMGY7YBiLiYztDrI74MDiXuETeKbJ +M3imtYhk6iHukMGaSBVQvqkM8dYbPGvG+HN8zTuzVQNMONA/s21iy9H61Stv +ptS8u6rv28d3yxeyQNHSZodPN7zWXzzZT2QmvAH2J5DSdU3JRzkckpyFMMwX +JaGpBQqCkqQrLepDArJjUUlYVkKlVIKLfsJJ9WGpryeafJM17Jny+WMzS7/l +Ur9MqnaFTNBT27b7tvrzJj/iLhx6zpMt8hAy60mjB1cyxMSVgsgjX3QmY2Qb +Sska2ES1ZCjnzoYyLpAqRbohJcQMtgpIO8WnE1F+tVEW7KuusZQUSpI/qxcG +BiD9PTXOV363N+9T0sJd73jBOpChCEaYiF0hXifebYVAWUakUixYFYVktpFC +oVBQbQ0gYIZ7WoYrJEZbt6AuW8znYEW0vrGpNF3fE5l9+B1BHIXYMAkM3LHH +d30kedzhu0mmUGqxw4Bwa973Ll7lWrUrUz2DsGVs1gnMzHfZ2pbHfPNpjENP +blt24jt929tc/XqW1MGZjRLeZiPRBuZcd6pXNrcZ3LyIvMXCnWdXq64JNvXx +DfZyaOLq7MV0aqVbW9m7ecnzPaSisW33Br3VJe8rOPu1birFljmsHGslcDer +cZtFl7NqgunrEpdXWs5Z0yaZAa2uu0TTuxpFapu7U6nm1ZsObpwo5gIZifK6 +mG74Qz3CTMrM6HKw47W3fSU6p5fc1rxm20L9EdobTZ7aDRlR4aSEgwnep3rx +IGtxS83Mt9l5l6Jcl8ctdMA1ZsOcDeaVhpqHhurCuOY7684aXXcuebyNbWYq +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 +LXLOyJb3QVXdft5jou9gc4VwzlfdwlUQal0OUo7u0cd8jlVm4Nfsd7rLa2ly +E47WS7pQutVVz2JXczQfZLnrvT1TAbrpmY+vbz29L9u6uGHt4PciiG3fYZJf +dN7c7N7iF1vOeZl2+k7bYa2iqt8ayrYt7ruRZVjK2luqDNjy+COilTmTeN6d +mXdxRUJhDzbrK5u3bO87WWK9SLrLpODBT1Q2GZyoc9PBNUt7Q52h5T3ru2qr +y4UHmI3XPneUq7Osc529y3uYp3hg5OdlSy8q26yaJWVXbRzF1upqTSvfdq6S +CqO3uO/6N+zL3dK+WXX26Ob3XVUMXGjVSar18rO0arZXddX3avb1M7dQiy62 +eh2r7qGBqj4+8CQYVL43CY869Qhh54gTmaMRknMMJ49Xw9V/fBV98TJ2knys +tdZmVQsdct11ZWdRlXLUZvW4q0QVd9XsE19Qg19o5pFEe7fIPy9LjFzLnLQe +u4K+V1arOzcNqt+7vttfQ9ZJ79c9+7hXT77atyxbSta6mbO1bUhYi1a/xxHI +63npbEaSwrxdmezDgSGJBIzabE3kwFLi3HviS5SjcN8AwxeWhRDwJW78gplO +gy6/fO/R0wUl4zkJMpTh3Zt9NrkuCHY8lRGeJ94GlDCjVIJ7cAoYl1SsH5lq +KCkXiFVOIVFPrSUYKD4aCxYKqyKozwnhzWeNWnn1wMi1iXTwx6GyxJZGr7oh +t4O3ag6tcnSyNhuSeIIHi8xSg14VUbNv+Zh9QBIWsqoCqopFI/FKgsFFBQJB +PiQCR4j80Oh219mH2HIfjlflp8lRN6LFaQMYEVmLVQwymld7edjuAYZuX5td +KSc3TnVDg9dZvJdTTFBQUFilJQ1ZjkFVSd2YlDRVBQbxBh+eqEQWaWESXdEy +fXQ81a8jQlzqz65m7xNHRl8rzCRdtq4iwQQPY1cDYO+XW6+Mzh3ZiD3+bAxj +1ZUESKKLB3QrHfjAxiwUWCqsBU6751vcdDvNelujcKuWa8FsoSEfMOosDs8j +eCuO+GEbpwMAgjwPVJdVGYAYLaQnOthWRYKFZWW2As4lSLIoKCD7x87Firec +qsZviEHsMhKY8mKKFwVPUMvdHX1VfZubUoelHCSGPDrqszMCx3zedXMPbCs9 +mpFnSFcy4goCmJWE+DIRAIoX9OVu75oG0gM/L9k8IrugHlREQG3dfm7WnOq9 +ukfW0c4Jkgkeo11a0aMzeuJLu3W+sK6BVAWCkUUFBZ7gdEIUMTtlQWOdYGTm +V70a1TzhDImWgaEoZXkGVTTNFT5S8+ey6G12F6cS7kbx1AUAK552A1YqkAji +UMOay5D2SpFgsFgojDtqCqHLU+BPheiZvSrJr68daGrD02dxXYQRmPzhQpyq +kg6+SzAZuVSBJDpuJHwGZr7rvrUnTdOYX1ahtlYLBQWeGVIosFIsUHnDvJs0 +27OUw1311mr1a5k6qYQbCNrqj2ILRFQz5HjTM5YTmF6RiB47w663A+cCGu++ +b1X5+iENGMFIsUKWkoaKaNzkd2tGhE7Tu7t733dD24JM2laGEzJOM2kiRJps +WMtgsxawWbJe978OA4aNG+0DdGgYMF3W113eTuVtRu51buDd1ZVVqqhze72D +e7qfYsxHbrlXYbvc0GXVSr9nn6j3pZs8ZvGdo7C3LeS6LVNDLa03Sm9y7D1O +6O5SPclu9Sg51j674i1QbpkK8k11kbF7lC/QXbw446XN327k1mVscwjQ7mQ6 +NCebY6+127fZoSVZ7h1bwrvVS93tnmwRenERnHLmXmcVVJp9ZOdj2ux69uIu +Y1G1T58KwZq0d2yt1OldcSr7fZOu7E3KQu9wIdDvbfOs40qTfQZuqVWxZlrB +XWbOVszDtjBuXK6523vccBPc8vXXdLW31DtFo7mFVKvJJVKnhvAsjpFRmsw0 +lJm6r4HkKF+WrdheYc7Ac0nhrqkh2C9tTFCbOdovc3GA0LqnarpqdWEKlY2s +eXyJqZBliK76txwdtsfvb3+2Kgw19+L8CX34vutN52PD21Sw5Jm9xenqJEsn +b5zFzWMFTuu9JzFO0aGAMJdwxzd8fVO++mnjzsk33skHTCWRK8PCyEwB7Dg3 +5edah9fxu9i+e5xcuqEO1HOmzBntolIw6tq7wVt5yh5pb0Jy5l9OVZ03PCK9 +BFChsfiIgF7te9dhYM7TmV9mffffC+gvc7bjke3wz7g3M7OZpd1fu/s+6d9R +rbODPtEtbdffyP66DFquf3fK8mZTsVkDzwzSmBWrTd2DJoM2l66aBoSDGY+t +VlW1f1qL8mVgy3nK6D8T53Kq76QduEXho0ly8ESCIgSh7TnU+jfvM9gcX8jw +5Hg9cdRS0lDQUlPgRkFAbXvIbvxc9UbYZZlfj/Ms14kEDKglB/q/rEvr2pM7 +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 +CjR9k7LqEjRBdU2tqvI0S7NTzSzgVT13dLpRqo4+qGwuNkMtSpHXm8wEU41i +iiqsUU5w68d81vPDxwbbAzNVcRxyw1mMsYa5fIWs2S5SlKNSlB3d3u3Ru6N1 +uaq19r5ZHrG4JH13M3Bc7tyFMOtdbuUa6A3MqtuanxfNPpRyJ5kfCeOERJ3d +J8IgutJAza6STNzliI09tzIllUK8zruJ7m5tW+O0hQNjG9dWVnGs46CCKSzf +Hj0NA4p1C2xK3nYlVeu9zDvbeyaslcrfbmQbfR7rpDLiKuEDVozlYo73S29f +WtpIdovdQGvjfeNOuEz15WGQ91WTTPbti1wqtEWZfp2kPoOurXVySyazqvHq +9tIZmhWjo1xy+a7o+o3mc9zLri7hu75Db03N6hGxDoKzbGVAcPcuNdlsyGm7 +gt9O2pOXGYuLqtpCDXT20tYt4BZrL674ceXcAlaxVXXR7ldLio3WzTS7N6+7 +latXfXaMw7y5l6oXNzMDYyem8Kk6g8xtJ3LwSehbldnN1c7L9fUhQeXt/0K/ +0PDw2kPDwvu4Z+GqgPUj1j8zPpSPOouceLLvuSHFKCAjZl4tvryvbnWnlYXk +DrqjHoPBeAGYchmj49iQ78PiEOeM71OHDITzY9d7hOPJIbyD1WUIfpz22rpf +ZUl/cWRlA9K3qHsPYpulHIQTBZvpkVDM3R1u9FhmHCl5pB/EQC++VjtP0+Jv +ZztZPiqyi87vsf3b1Lq7Lz8b+3e+/R+ulT/PyUuld9urPqP1mfsf0rK25ZIW +NKTmouzs1Rhm8DTFgad+O0UKE3eNFOTkSE/FTDtwxmMA/or12EfRycI7EuKx +eEPGlEbk6s0m208duNcerciMY370x6SooiCIKqgh29XMczvNa155mu+PxX1y +qteKuTISF9lXQ5qze7wml4VWUO+zY61gOU61yymnXTebuKL4SoojCdKLKP7B +CQQC9Q4PPkAp90rJ1/H127Yg1uEJmHFjl1SFi67rq5Nsg1NXnPRi0IazNqXb +IzE1Qn2IAYxjGUlRSka0lpYRqp2Bq7vHepq1RzDo21KBVNkE6gwx22np+usd +ddx1dcLHJqVau5uCB9FAcKw4cMFW2Go/IYkCR+kqqxURYpplt331bd6djXeY +4O8ULkcakZJSSKM2tuV8YtuYslOq+4JdXrekvObdeKU2hfDoy8ZJOYVFERRY +osUVMO9dax7eHN03lVNHh1mjtkj2mX6iXjus6ryzd7uTO61wx1zOgoE7tu8v +LrjTt3l0lBFFFFVYosJJ0eHgQE9rOl2MrpTWnMp+B3OnqhpJaoGt5tz3dVbs +iV507KeaiHESrWPTXXWcOazE3blTxhiKKoouNRRRUfAU00Co7YVl3fFnx28h +xIJNJiseiKt1aVk552JMq8ZZohQ3c2IUVZmSY9O/Hi8RVigqiqLFNJeTx0+D +fOK53ddK9Bgs67hELGlEBkiUHIoQ0duDMRzDp51vcxHrF4r6roUWUUcMHh6O +gWOAUqsfykIUqOqVEQ11mtWJkWnIUIw58pEFTDPpS0owfTVMltp6q+ydm9pa +sRCJWsK63VK4ZSsUvD8QoxRVFBViIz945zHrx6NevM9ZPnJANxzAzE2sYbDF +i4YZrWs1i1i1TQsVJzJzrd2hTedm80d2nV5mZlyrqK3hduA0tyqtM6DfbwvL +o11dg5uVvdbO0OmDO3dyHNPbed4G9yKSXzO0K5zOzLF85JgNUcvc3u29nbx5 +1OrZ2kYr7NydfHUbe0CtqZmW7GYeVx6LGFHTdY6EOk2iRQytmcKqIX1RhynZ +aEmBdrx1WKsG6TWTq3dtkHs4VppL057T7bS29Aeb7thyb1jdytd70VbFMdx8 +ucx9Sm1LWGn21tUY8qVh4ZnXM0K1DTaxig9tZmg9CZd56uvjOtOyVi0Wyki9 +6PqwVFeceWHam5lUs8Ss26Xb0qES1YEimSy1zK2Q5eXdN8N5a1rD67l9opdo +bhqnRF9aMzDVEut7szJKe51zcKuxlRAnWui7dR5rtlWXbE2xymzausq6BzdF +0StaWTLYqxyGYEjL1YOTu8KYSHV27M/p7w8Arz1399lPK+8/u3pZPXjzKL2D +dOHjtbmnjN28b7uJw7YrQ851I148LyvUPCh4EeXn1CmwOzffnh59Xh7YF4eE +pZB7wxK+s5Xh77FVx9af2460SOY7+F3WSnbOnTS0TbHUtFYVVGj1tI0hQzPv +s4qvswjQwKg5yJjvlWYfh3d8+59wYQRvO49e8u3wHhe5Xf1XXxSqh22z3fL3 +oXI+5865f0oj+L/N/N2aez7G7UV+Anhmu1xnkgDN0zGMULsww5sUYs0YHUEN ++LGFu1MrHbqkAYkfZy9NH5tXm9vOWeuzgVgnBxwGsYl1Zjq3VIDPFE/wCEQS +SWUCQCCCREh4jA5v31zEaPbPiG/dXsNEggEmBirq6O2nlUcxGq5us3yzAZVn +N3evFx5bq9Yd62ZsFUUXlsWKKFryGXLLr1ZMuExKqKMIC1eCqrvt7XerQ85m +jZTO66LStl1hphqnhnK8GLyy4lFUH5tixVFiiMO7rZXXT07VInjYa9XYqPka +KXkCC/rYBPZeYTN6+OaU7FmusFJJJB9kXK7iBRSEIRBKxRGLFWOpqb3mtnje +Y6Xq9ZzWuucYtvyPgQl2W6dbfTRKrd7hb50mFiM4F+Hrl3p5zS2mYvgcVFBE +01UFFT5jwICgt7FCAuaD1OS9ouuTLSykDRRpUD1Wg7u8eVsm9uyMJ0siKFDU +VWt7dD1m3wmlVixEUUWLB4cve98MsXUkWMDVuULJOFdrsoJeR073S9x6q2kn +gxio6MVUKjiw+oVlU7tDEOGkAppVYoqMWIxSxhTDru83NjN6cvWxK6Qaq1RO +1GgNrVJYsdcPK6rcdxBqwrEcmUIjK4poGiOA9ZjBIhCIIIJ8SCSQSA/eBTrU +506Mw3z4+scuI1a2kWvBBZlWYq1rd57VEUHuXVKO83vWqjjOeHOaHjxOvATZ +iIxYoidMfbQ08ZVNb2i+yYKY2TF0weplOLI0/EppzWLnxlgo3dfWbyhry403 +RBQnetl33vad7ZDMVFBRhEYjCKoDIQzIQM9qyVilrkpvKkWi9+BqNoMf3PvH +GHTnc/3op+LumVHnQ/wE1U+j/Wrt671r8YCELD5WUMf4yqt3aKX/A16rMxWC +Eru7VqORCrfR9Z+n3v9vmn8wY/B9TyGTFmQB/1IOzbn/o2JdSHaSP9onT/t/ +th6H/xM3N6LiFsUUsPvSoZFF2knHTkD1F35EH9T7LxBP/yfWSp2U7JPILcmu +g51m+I2qfGz1Wboix/K6Hf16b9mj+kE/YPyoj70R1/t/8TlKfdZDS38mO2oq +RloU5MshjFk+cEtAs/O40TvLFPozcjduTW7Yd9SapLDEvpTZtIxNo6A6OuzY +5tgTs3iScjGQSWGx/lwmsRUbIszVGbWcsZDSknUqa88G51YkLSmfbgiGJaB1 +pDlZCA6yzJVFssEPY7MJkD849DkSFjAgQhdATNZDTC1PLyqMfckkSDfVxrIT +XgTz8p6rgcQ1M2c1I+9wDhrWtRAZ00Cz3Mkwascs56crz56ed7vyyH3OqT22 +qEyGhDczd0tF0WOAanl2O1y4q24OckZ/JAHq8J65OQxJCLYSBnrur0fwZ00b +ezu6cb76jiU/kQBsSbr+EfJrMkWJo6PndK5cTTOCUV3a2spH3bUpWFAU8ZTG +pTBDouXa07NWubxOxSiZ1Z+vqs1ac96zxOjOEporARDg3frFT9kTzUftV1KP +sx38kc/1jYsfxXSOgSk5C3nOc5ygy/nptUpTWtJ2IRpEuE70vohxJTraJNmH +7dYmW42gqhGY4SpE2hI+bj139ceE7Q2EuLujTo+qr1roofg+8r5fM2jhlQTI +kU3lmOlaJprE9Pt3rcnptgwYnEa2ivRbMqdlOMXVNbm+rzMKiibeJ30Dtvrm +Xnk68C5jpp/Robj/e+l1dwi+4DX2558lpZmS+/dedrHj+Z7+c8a09bMne7i5 +1QYq852jhJ9b1E5FuUyKQrV/OqSobds589+Epbq9z2Z948Stz1fTna7ItC3q +7V69iOTOeM3sTYDp/n2vxmdb61m03HC0sywp0Q7o8+0iBLtvTTD6vSkr2hWP +7cLa+LXMtL0dXghNpt12Ie+0dUawtn52mGFV/Sjiw39W/L+dWHxxQj9S2isP +unWzm1e7f4TOFtlApp0krPvviOC7kVV7u0LyptDSV0ZW81oo1xwvwicLEO2l +nmmSJohNE9J17IT8FgotXLe4awUtyLWHrgrMIu2orZnOT7OhefQ01rkcbWjx +2ex76+vN+lrdi30cuETkOtFGj2TYlzUJLZ5LPPWGmuyzguL4s8tXPr+g3ENP +vLf8LMR9WVBdL874+eZeU59HrNYN/B+rrnMi47aj9ehZ5Pu7vd+CTTktPdm3 +1BJNUpSH0eoY65VnNCMOOmEVvBJc8vQ0TzQxwfttBGd2nmnrKKkymnOrVLaI +cs+jMV7Zf8Xr2yezs8NRT7LZ9rPf2s1y1G+T6ovf3POxwHx2403OiL1c+Zfb +Lfs/LzJg39MnDyfoeufDm348Cx2ump1dSJj12VPi+aKU0zL13T3u8V8dZxNc ++66V0gv2JRfFmPp21wRpZIuMdY41Etifmav8+e824+uL86Y21leWvLj27u/u +sfo8WaIj3J+2vq4+vsN+25yXbtLtUzTScm4In2IlDoTLsVKTmSZ5RBwHdtc5 +zRnMA8oaTt6fsusY9NRemVimmU+6jo5yX90r5ufDpkxnr9L5zNdh0/L8yRYH +h0tacmjVGiCyom4cX0tvDYUVffLigrA4ttX0UkPSfTNOM8PrLAXwy+kp5t6Z +7bsPZuyte6vN6lH3W/U8hTv6JSqhtqPJCWYitdqBCdBZNsjjXhdy3dvDopXw +o5Lb1XnO9KE5Q8yJyi8myoRJcXk6ShSs8yN2p1Lhm3G3SMR3/GDWTu4nzEU4 +fslopbabS2vStJkpOnFmsLecJJF7PKk7Weypvq/bWcQrpkuSYOailJ8dIyq7 +LZQhSsUiUsKcmviVr0tZLXt7biNCE8g5qKmC3ZBoY0JDoRRza0obCdaaTlIn +GZVtvSlSSKIharWU9up8mGn3VPVsXG86wWHTtiKxa3VnD3c8NKXlrGYJXVFF +Ljq7k7YTKrOiT7N3oypJSyqBbzu+M504aedbzpqpD98akDgaOnGfEf3pfR+b +Jy93FVRR/InRnh59pfZgp7JxPjqmmLmUR0nf0cw+TDNUrrVh5dMPwvwyfd8v +lck92eRPD8ZRYsNWxQK6X6N2+6Tx1Q9lVjywtstpbS2mHVNMUWRQiwnpAqSf +dxoicQ7T7OV7tVfZqvSVFF1aq6arpKiii6tiNti209K1XbVVH5iVXWda1rWv +uOtqqtVVVVVC8k7aYNTNVTEpqYSZN1480mkmbXDugrJMDgbQTXG29K03cas+ +t61flepqeGfqYWc3Wn06NaVDZASBEBiMPXD6mFv5D6fVv0w2dB+hPArIKiLE +wAkDeOlOrD0GaiYG/bhkHN87jE2Keb+dPg8LP/aUvV/d/PL95G9v+X+2oh4U +Q7czrjw7RPP+crHikLflzXadvHZ6UeZIxCNEgxFASShVLv3YGjD8bHZCa+L3 +Gbw5KaOKDBKxZWEgQgwxyZIUL48UcCBJihAkJdZiFNZLhKATAAQQoTTX3sAw +iCaiOEEz1X4+9+Lz750jEdmLlMEoQRBF1VD4H2zjdATASPPXzx07J5nKPBqW +SZv0sDHtiJsDCZiznYX9gRTty8cUy0n2KlSKKRQ/M/vSdZ6wbmuvTKPhIdC8 +o5Xth2yBfbkpJUPL7pWSfvIBsdyh3nsk0vUCkhR0Y9jsMTfr7FBwpgQlSkki +USgCIYlAgigEKRCKZolIVE9QyijgRFABEPzsjkhSsjKJKJEBCDJDIhPo+tZi +ERy7Ye/TrdPhTb8MSR0KVRQPby8ylRpRUd1AeqBREyABJJUQIGBRgIkiUhWY +RX7wiWRMRCkQrQizEESRFAQTEETFEkIkxBEsiIUn8gif/MRO49vf4eu9vo5f +KYMXKcDiKFHYPT+/9qPB3P4P0I/hlBP81PT64f+F7xa2+KqSw72wqx4LWy4+ +13DTnVjZVTvqY6dvZHl2kPnRumnWcDBshkqSrZVUNfSp1C494wx026fHGdds +FH46vxLHK1BJXVFMpxnBTjSlbaaatwGNnBuo2xNrPVF0lbKTB8suMS99MPww +O0M4YZMDvwSYaV0RgO4ksQUB07g3OY5AUHOrvkZE3mZZxZqORN/xpt3bR+NK +2YCqYa1PTTz8OOxbSkMW4sSae85yFpl7mAR/PdEI5YKaTVjjs0tkU0GWk9tX +RlGtaumuN88JDlt7Y3yXKlLn5v2533HC1Cayga5nJQOEQRMYmJTaAICowGbM +1ultLjIH/O/s9nXZSCH4ZPyw3TlIkuE9iw7u0m6TfYaTDZeTe9JTtRYpAw1a +FNXKz0qOTQ1SvCchJqzvRpDNN20ZtulHd5sBKaoAV4O1rWd3sw3caCMHSHsN +oGEZPifRiM8zxCcO+9OTfwd61HtFOYLF+0kH6ompiI/MEe2z07vKfP4Y5y+H +HGhVmqxS32ccyI6ojqiO3zWqpJfkQ6/lKfw/39/mR/NawvD6HUIeueNwhsNk +mmmhZUzph9h58EDfOcROXBiPG/7caR2Kb67FNI8G9b4xHl7DnzeOI2aFPbrZ +5YcCnCP/Fz5HApwjxpU0jr4jXYSO3s2ct7MLSJy2aRNnX7XJHfBxiMiWKmI4 +b6bR3sONYo+8kQ3hgveQpvQp8DWyR57R2bAd8G9im1dGI4qYKZiOf7hMNSPI ++R4e5maOFakD2/QiCKDHwD6q2G1r+iy0D/JlitJ+zzDFhsYS+0Q9UZGcuHD3 +cGOQxYmWxq7G2JJdLjCYmVmN3a+zaox2MYLlgFn8YZsk5ln7bDHFjlKxqbl5 +WYqMOfVUmcLRoU96uMeLD2olLh/TFtW62LjG96FdHz08xdmIY4WoL+naNuHf +x44GJsqEti0Hd2lhjRrpq+6cz7H7iBihkz6PUbTObi9IfayaR4b45cuRse21 +M6A0Nada8vdWBhEvTlzpP6q1zMYtr01MY9E7+kYpx3v+9SOL7YGIe36v8NI5 +etvZwOfEYp2cS/VRzW4wiqkrkzsZiZikzfSoxi9iy6g7DrpwkNM0idJ8/hnI +1yd1Dy39EfN3qdwa8JcNuUaZabcsV6B9/5OcumnLLJttQyeC6BfbFm9q8grZ +WbkX7MzqyCfRb4Ph8V5QaKa6224+a1qc7bsXbQ9funk4VbvbduP+CXSvn9Mm +s0W04U1f02daiSm+8eEpvybuidRtEXpKV6cu9qRY56XlxUV8YqTWIoKsv8O2 +eU9f/TU8Ma50zLNXlvIpyXvFrbs/x9vnnWlu6/Yuue4t+/DY4bmMT6qRjpiG +oKkdOX89Or08b59b+NRPx7/fA+1CH7HpHCMrhJVinB6r6uWkVR224wZ7Hpze +i14zhGr81wkpQPjSIm5eK8pElO1uf9c70KVw/wlQo7t/F403l4383z458dOe +LTtjOd5814XrFntl3F5Wl+2W9nUvR29uwjPHvtvq+SJPSXdSmKGjyiubUk/j +bE5zTbZwonhFKykyaKTIaNtIIWrvQoPG0dXKfpoVjOLS+zSlDpbqtKZx5+2K +cNPNeOL0zSZmTZk7R2xXhPrvOvSclL6vReCXJFrWvnrnLFaHR5bZtpfalpW9 +1b4nf+KtFxpv6NPHHKFa8jSHpjRlL6q8LYnFPKxznQt1zpGbdvXncxPPvd5T +10nPbg91ag5QdeiOlR761NPP1W0s61k+Ne3HfPvnw4548KV4rdtSxbnt56FN +7VzK/SbTjFYW95StvbzXrF1vWV7Rw59lNDGTJK84eosk8RD7/7La3t/5ua+n +lTFJ12T9qfnV6y57vrN+MUIjMciWnKpyuTnmhNE524ywrYikX7bl1dU47RJx +5eG1fLQ5YlNGr8Jb8d58dk7PRUlx4fzbdOmOkt8zfEcHmq6PmbT2jFa1spTj +jTypK5Dln8OV/LSsnem1u2mDjTjD24+g9/HdcbVHrz6n/LytHHheW08UzQhz +EaYenf14lfll47l0y/WtnfgqrfNI4REKlDJEog3vJxQmnR9rUtKdc+FN5xzr +mXbtvm2LWVIxPSipHbSIm+qnJ1sqK2Zl8rzZ3vPny9tOVzq42uumsK0+PLpp +TnJ88tI6LTylr539sTxfk5c/JOnXJ/6ecdXW+vpreX19cRx5xiW6h+V+Pdp1 +U4R4e3XTWfGD2+uhwzEwpEiBEiagyLeH9SrBvC3jGJT7pj7Tp28qSxUdQI1t +OJ60L+UiDelF5p70tGtLYlElSehPEWpSjx47cIvZddYRp0n9vKlLJXxpbefZ +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 +6uNXvbdjtPW6093fvEb74HFy0OP5aLl6MT+rjd8LG8LEC441lZfVuBUNIPRo +ilTUsTq66rdqskm2NFoLndnezq8RQaUvbzIHJw7nRqZeZztWWuOWdGbClR7Y +MukFPKlvLdl9ShguPB0SarFdHBmDmuWXtB7MizaMN3qm0Ur6LHd3bzB0k3jt +eu8xZLEzbozDJnRVuXsjrtzeU3STeX9Ol/d8Hs6C8gVfRs1ZrZnPZ06USZmi +sttva3blZ9M+F9uNk119U+7Xf2H6sp930HHLo8tf1HWRt5eTt5jb49ds7OzO +a3au8vLzS1hOdZuuUZghLj3N3J2kWFedVIm8bHZmVMsjRt9fT27Hfc7o52N5 +b3nxV7TFa4KBUSbfdfV1VuCaiMg4SnqU5dis4alTtfaK7tfZ2KHQQ8GiOl83 +V4Re0br5ZyMv43cNl3LIoTJNlJXxVyic286jGmawG9Qd7J2bKmdGoTmWh2yY +5zbZxTVJKlRmuuu3VbrLXW5KcROKcNxtpB4jTwZC6vcskp8J0KpdFMfctXZV +3FfViuxnPZeWc3MrNu69qTtGROdiqDz4MF1z8D7LUe84c9vl37fbNzzCTrrE +ABn8d4ZgZuq6XbV9/EzODRc7vGXzqYmcZnOc3trHzb2ZVNv2WeaDyXfba2Vv +QEXh6+1Onu3uWGCsSncsvnm2yh2d2N19rUvGFY7EGNSH2Sus51DLYz6llWaS +HZsOKuvaqZ1pZdbNMASsPpta1VO6raW2SXzYqoKWJmYvS7RsXZ4basVk1bMN +tbe7WPpOGRa1huwT2g7Jq2DmN6XeZLkPYcYlYstzBVqJ5hP2zvq2g++iqstP +h9Z5RXsuC0NCrvtV/X9qt8QyjVZf1bW/a+TMDwNh+pigo9iN4hcfdFjtg7XJ +88kaK4lV1ZlUFTbM3Vua+69VTYrrjvcaF8sq1mjkufS9PEdMsGpuDisNzjl0 +sNDOfSSV0syuqstqDRr1UNdihiKqV3SSSHsFc1MGziiH9h4iWvZ31Hpb1zvp +9K2hmLkCU6d6qmQMTLx0el9Rj9K8stp5arDb1btW8zHpov4CgZ8hZo+28kn0 +YHUoWtroTuOln16MmHTmcNFPO3x77rVRdy2XXS8vBKwYd7u6UqPVl1vViqLG +7GEUrPVd1NpOER3vDtwYoSUyzz4npLh7OrMXUHVqkcdZl2nm9uvH3h2nk0a5 +A7Bje7kNzq2tHXKMVPm26fslLcuuFB3B3eONKVzcPahjPdnU0teTRpzi62dW +4+e2gZc6hQSuF5Uvb2aouEBfZvuCTya6pJxV242zmx7i1zqmjcZU1O9beqDr +5O8O9p3eXREVdFHr42aCFNdnXw1z2yPO1x1UMsYrUpaRN20s05Sc0oZQ0qw7 +zeomt4483CqrnWzqdSZid1UNESaHWVmd2LKq5Wc1GVtU8m29RKYj2u7WrqME +9wVxWKpvbs2dzMObWXeaqIV13TtV8YFXLJW3ZAW7sCsLY8tPtdOxaoBbpu4X +Fp3rS5/yH90Hzzh33ufX35VX7IfKn+aIZc2ra7cy/YvWqjWlHFxdM40757KZ +ymMiHGqUNLcXaZSEbHL9D6ndD5Vj76Td+wvVV12ixkvbyTS7uuvbdfZRmg/M +Dd5ZY+zAWe3as/d8l8KETX0pqsvDV/by6wrA6qL6qW7uze2ztK8sjV0lVlVl +X3aEQhOsZ28db1XO7mtp48Z6VD17uZnbi3rmPCmqK66d1bMsO95ZVO08mpxE +iHrs2+rAksndmDNqTkMJfVtLrt6baFku+yl12+Jl5TPOZpL7F2kb1boUqpm4 +8zRTO6cNrXBbDUp93JB1lqR3VO8ViudMUe5Uca7N3HIL1p8zXOmeq4m9uXz5 +rMCYbxQXMzJnXuOG7ynOs4Te7nbg0VfEqZfRraznTytrFguZ1X2KjsrdpIwl +0NDEi4l0f7Bo+OfX9D8j2IfUfkUFm7h7Fu51z8OBpKns0z74z7SnheVXw10O +yPK0X3Cv4+3B8ln1PZq7YgXWh3UBQ11PypxeZxxq7u73cPvKwh3fNZLXedmF +rePGXvXMXx+vz8qJkdS1Orn5g2t+tF+ucKDvmVWV0m4pcysuJquzdvP1+S/s +f52/EZ+L8wOpXK0NE3Lj7plvdzmk7y7o4Xzsu1VjM5RSKTR0+7531/KfLndU +STaVwE1pC+rXl1tveynWOmJuTazoLtY6pbryqSvZ9T6Ze2vuy/lei1UFDc6p +uC0HSrljbyuq1KmJ7ZzrJNEk0k75Ls0Yi5a7pe7tDpt/v3vV3Id3MnuGWJ99 +nUjxWo5xpYqBt5F1X/AH17zrrgjkPWOeVWNdHQuM4xdYzTviHxJFXc841FTU +e5x6y0HW3yzd9WpG+w1J/L7fuskLO+ixYvhf8R18PZ5/lc3+IZVxifl5U/F+ +BOXV4dzu29jzOWd2LQ1vVQ3BWYsL3BdKVlgkbuTe53Y3nm5VBosbhU3qHWzQ +3SpV0OWMXQwXEeuh07bO7Ygig0SXSlNt9I26qqOPLKu+7aOnIYi/dg7P4AYy +9/ERlcV+dCirf1axUy3XJq/5ROmq/Xkn9+C8OE/J1dQfn5Pte/CKV3TAe4ql +kMzDs5/x791czwjg4djfTtk4Es1rknavW8PNrKkVNzGwN7Ny1irpfB19rOKT +uyyOEJ692ZU4YM5yqwmsJ28pYe4w7KmRlzllN3ig2LRg2s4bs6XElZxSaK2V +cZOcTx6Zm32lStVjGsO/rOOva4lG9dzi+YOLIeqonJXXJ27cSsfhIwJwimPh ++J/YNywxn6Di7bmaK1mbfCgjrWY6vcvbO5diwd1cK4Z/MKvsq4az6dBVHd+D +hta92nREF2NzsuuygpUzMytrq4vpeG/mqn1/sH8tYjZuw7+C26DmK9m/U/Ij +8bOetupnZobej+7f4MHVw6zUVujV/YMjV98ccb7O/l/ID8tu9m4Z+D8Yn0N1 +LsR1jeOCJjVXN1nOsZq8VlXPRneB9rWeeIjx3jreYOX65fFxMNx8Oq8+tEPv +tzhTPcl3MY5fD4fwP2774nZibtOrvfFQcfS3g5w+tzCqpzNLZdTHBXGM61mr +je8XnijYY59sb2/MZnAq3HXVVjxwnqs4fTo79/JYia/D1102jfPV3Qrm7t5z +11Zx0xhBievN9xJGFfFD8YmEz4+WvL8OtXh1VfmHBRxfP8fwn+fhMuDGc/jX +TVy56BCSgzWO9zK2/4jOPIq/+EOec8cxFtT0PfjE84znUVzS3Wn6+GN663pL +txUdD7y/vPr7vPljrt1u09cRz7B394rlZw7xl9Td+Xp16bv59Ym0Z41u41PG +RbvMVhXylHKvHJXGM886oqt9+01WVxPX4rjod7XUZ60u0U773+Ort3xjPuP1 +ziozKjiljn9HhGr5rh3oAwzDDMDI8kwReluH8/X0ugz9eWf3/fG1w3r/ldbn +ROsl2E/xdkbrLs/js5vb8qTjsjncxv74uJo1ePXt9mM1dj+Q/PeG/Dt/Fut3 +0/KpHHVZt1V5+RUG5e5vCt7XFt7s03gRUebWM8Oxuyc3jOp0nWPsulA6rLZE +PdQp93bi7ja3eW3NXLLvMrbwTqG5hHVuu4c29lDDWWMy+tXhruvTifE3Um7d +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 +fyuMMzKP73w6/R+O38/xPg9qsZpj9qXOVZBGCD6gR+kNhBs0rGb25kmtfc4+ +m98Xxwjke315m12Cz9PZXWu8CxTj5fDsuT68PxXXVF0TQ2W94Q6eD7VpyPu9 +8NqTj11RE766qd83Mz6hT2QIKqtHqrDmUro2SNHP5XsNT65ler0e7lZoX1vi +JYrM1+azji6s0RzawYH8dvfsXdQ+lhHs6V9t7qmTPFZq3Ly8ts/D7t29Q29G +HN++GVa+6JFrQFSxyt3sAqICiuGCuzfr3XnfKtn2donV/gpbu9+d8CPxv8+4 +fAjqk1HeXQJStq6vhUzOgrbNAWCNc+fbjlMX4j6SWPn93x3bXfO/ltJtb2uz +oeSPptVc5ZWbNMAS55Mt7lV1LNs3fXiSt6DiSx/dfVBh3Mr7B139hFi/qe/X +kTXCVQqnizXt1pDoQ9Zra5daeDUrQuti1dt93bjqphaWXdK+MvnTpdFKPX3K +95XQfa+kS48sldZh3Jd7lvpH0Q6RTaeXZXb2cJ0ZKMBwayn2KQdeitym73p2 +l6kUrrc2Tt7N0ZvaYN60qFcq6lQp1bopilzlVcTY7t5Qb1pUL5V1KhTW7QYs +I5mdxW6yglaXYO6tV8RsoQ6b2cHXN1ciu+4LiOO5u0zLq/XevOqDkcoa+dbE +icnZqsPGtESvNrSnjL7JnUpqutu3fWkRgj3JsdsjtopOtJruzLO8ars4YbN7 +rZVvdwy7m7nDTtWStjKvNKOO6aqcuqcVXUlwwKPZtyPmXeK7IkNJ1prtzKO8 +ars4YUq3aZVPM0y2+wvjdxlZ2Fc7nC7mrZ15tmtvDhfX2TctK62nty+wt4nt +8mtYzdh2IZV3lDmKdK6JWWDUzTN8nWJwrVizM7OVXRHZvZtMoczXXt6csKCV +28nLq9fVlvnwpcgTLWhRJnK6Z1XRvHb1cdo0CZWs8Z0SrkROsRTBaoTKLFXM +FsZvFfcnVgzhvx72w/NcmKdZeTJJs2up35kIXlruY2sS0buzBnXm3KY6zqvq +pk66YL03WsoYKSiCx1s5bx16e4VJ2wZ9fBK3f2uPuTzvhq3b6uZ0obWhStiv +bg7gxku85VgNXHaNyy311ukzb6wh1PyErillrBXBO+WIoX3NZ2XoyZuSnmut +rtvQrsaOQzGDgvrbzY+ymOT1IMrMyk73qrW5SJmV0dTI9zd6jtnixouztZRr +hdLJjDL2uLzJu6d9ZNFNirvKPJm9p0EjXqt3LLe4kb2MYr2NhqJCJK5iTldY +K7OoJ4rvsvSM2cc5UFu7z3tyndZuLuN1tVHN9izY2tHDL7st0MROwbxvd5nX +0mGLnbSd4uqtUIeB7V6lT7He5ZzLttrNvdfKWdJpYNp6Nzbmm4zfXtHayr4l +ZzK9heQm7R9VX2l2bCNO+F1VVNbRuN3shvamx3siby+p3m0+5nhXTIZfDuNj +jBd2lQu95HLzqvbVy4hklUczuJLVVva7hfVL1ZVbSldK7YdprOOOsysT3OmN +ZWdlVLPrN3XrcdnbXdX0HxY7G8W93xhb4xo73HZMeVb1L1PgsUG9aVCqvT3E +3iXXNqYMohCBbVsvprKm7Vcjie4DzqpuXu5mZ12QVQPaNFoeuuHrEQNo5h0X +oiuiOEcMJ0R0R1RXVGnKNo7No7I00jqjh0RpGnbrxxtdoWBkYyQMOUMQMYGN +fLyxwZvGHpDTQN5GKLaHYUzoJkZnfnjfDoPAcjWg7DOZebZvy777hsZxFva5 +gdoa1Kt7B3Gg7jgOw5m+A7jUjgOBh59A8DUdg6jJOodxk5DkY5334/lkOGqO +1nYOw41OweQ2HYbchoaDyG+A8Dy+vy4dQ6gOGADAGC26OG2TEXT2Bl3xNzNV +U8NgVMc+rKynm2rYc4tqtwIWcKFXrNbt+NjdM27kxcDkwkb2wVekaOvRl30T +zumIZyzK6uUyiEbzBinMZEc7ltXT3M39+Ey8fJet/BaoO+tKhVXp7ibxLrm1 +MGUQhAtq2X01lTdquRxPc7RzLfsefPt+Sb+kjuvo66+zMz6741smWKkIe6ei +sdandjXcZNebeiu2+qdcsLLV1Rlzj152S8TURod8O8aMajarGB7oDgYSQGKc +9BmD9SPscMeGMp1tDKrHQj0rwOP5whCDjv0/Z+9Dpq7uR2mGKdKOrSl77Rc6 +t2+Wszc1myZYGHZnve9VjUxG3bv2HDezkhvNAyTShzl2ZlpVxHD+TzMqerjb +7z0ts3cBAIQO4VF8TwAN0DpQIFxAllgkISApRNnKJCwglASwCshO/jx3vXx3 +7T512tFostpVKVkzAH3ZTSpQJR+pjEQzjAKRutKQod0rAWN3kg6hGhKGZA3K +GCULahHPh2Xhznp2DKBu4hnqMX3eb/PL/PyF33R1VypaeG8bY2/t+Nw3pYrj +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 +IhHgfTx77uN7tZo+ty7BL7bWV173TrNij2XhrHqyUdK5YEDesKj6trrx3XYB +1rK0AedXmGT5d8dcH7fgxvPiAKmXUzPsCQyPlDx8QDMU2ufGSeOvnHjAOY9u +zIGzuyQOTXbRglRMwOmZkh0Ey5KZhGXWrrmeaxeVjHJqdvYJWlnVjree49m0 +vEGoHqF7Zw0W5eLe7by83TenFMVeu1R0xTgB5V1Jfqhyg588esalcjLVkblK +dzve9GQnfBzNrF8ZJtZl1IsnahkNaB8QIwzO8oXyknM2sNaAZycjrIZJJH5E +D1KEEfg++/Fo7HSxlZvCbt60GjI41eDMyjl4K6q28fchjp7mp3nI4aoZusVi +2qFCyAz2+ci1jjUxAmZuTobGWJV6zEX3EJ5qHj4qAd26YZJzUOu6GQa1btzq +Eod29G9cUDI8WyOLieBlNyUcccaOElc3xxbDiR3veuMxOCPCn/WVVjF+SiH+ +2F+hLaXCU8Vy06qPR+8mnbqsb7K3kJfZTFnLdaagdzjYvbQRVZnDgNT090uM +vOYhmbyzoarHbN5IGalQmqnpmQBVDk1UA0opDomqaBiUUnQVW7ke7uK673bI +9R3sdd7tgeu86e+++A0oVOE1RDATQ81RAxWbp5GaLk1EQ77G/zTTjT1/m1mc +thYrLB68yg+7tzNvYbuCdt8CJ3OjeCqvtkqzDsxU98NHhl1y2kJji2MWnMU9 +iYakUilUUQM1IiXpRQ7DUiEKqolhqTVNRFM7M1RSilTJhqTbzjvApJ4nL553 +gJJ4+K7ykjbyu4TfgdGvbj6j3e/A9U7GCCGGAfayJC58uuPHn15w8eMeMvae +IzkfSn/T19fmHTM0H6BjrnQ3RvuU3Ylu7W2+/dsYMVWra2u2znObiI3M3RJk +zOdGie7zpQ7mpSE05m3MbzVRJ53z4WaaNZfFiuhes8kxtwwwLHmojZQ14qld +RKyEYVi5XUi63i2Cs2rcUZmhOtVWNDFwZdDuV0Tw4zqqFDdZqMQPnQyYNUtR +kOXnDYaUgwSSVT9sXdenagtm3XYuW6pQ27rs1lx4M6z3KrV7NBl5eBE667jB +LR2uil7m3VlZeVWu1Weq93kul4jHajOo5fdcXGhk2OI7Hz15zHWbOtOi9U2u +vA9t9fZdt3S5kvxmtlC4zqlbjqmqunWwvrN9W7jw7twmj2rNzMq1l3NNy1Vd +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 +sTmbTDWey1qu7sdQVp8aqqOwXOodV7M1WLFCZq00sG6R1ZahcFmbzIzdTzDL +brtNZY19om7HdQWunDtQmnXeyCOVzkhm+xKisvYe0OobowYO/XfLfXjfaH6S +Snaf1Ozn1cds23d6jcNm2Ru8DVUnKmCGlzTwVyqLwZIS8u3l1iZSSOutaxHO +8FXd2liTB1dxh62ucrEYqNkmHaRtjUcMxJBu+VZgZBRUszcGHNeWRgbJ111O +8wt41HCJyrEg7dGljrYMCBAzuN7lip1cpNdpMPLRfdtTVu913N6uxbuX58h4 +KteqF1PPSXnn0zISucmPkKQ7U8TxCcmc5kmdqZkM9rkn0QPN5weJ8MhxlU/D +xakXgBCJI/Dzhth+ktRHcvzIt10y9+Qyh3XOd66VZmxy9hmnhumxcrrOi5rO +dVp5dV15M5iapqmKyPDFwgc6c3DjFBLqjEuAKZiUzNEPEufFHJ/XEDGE2LxA +zKZhpTDSplyUBEORLt0Mwiacql6HziEIR8z5zvirj/M/VvUaW7m5TJLllnar +SRRH7qg7rl3d3HBhHLMTu4y95EFS9uddZ59ZXSu0ukh4UXvaYLeSiEKJ9RFz +73h5gVSlL0MPnIxD5xBkQiRTOdrLe6GvdmGa55mF7cGSnpaAn55rsUVK7BYr +6N0EdZsdysXFmPV2jHjumGbOnRUZw92b2zpMlB3da81Mi7jcQ8OZOJgnuvsu +xD4Rx+h83H4SKRCH1Gqp+FW5VeogMiRAQouIQgORiEBEOIQ1ZdGw4lpotBVe +VlGud9MOt46wix15IbuVtzcwCWmsqLVM7Zlb0zKi26PbTj5zck6m/eDmsSdJ +65lweJZks/Hy5PHxlSoc4QeuZruzDPM2pCA4oRCPKKRABxQ+mLCLqfCq6xdk +zXPmFsFzc6t1QNzbmTbdarg20IxVzi+utzjvDpKzJubebfHJWqDtuDdC8Apy +Ym7UENHT6vkBKVEU16RQgYUZKfgj5c9qQrnsWO3BkvbgzNtwZlcgOTJJQl/O +rLu7mD7bFwpVNykMMTn11nKot4sqhy6ieSndmZm6JFm91murMC2F0hR6d08B +LRRQC7X7Dh9doQyIQ+CecmtmczMuuTM23QybXIb5PaBU0rTWigCXKRSKQRMw +E4ckiaEpnJlifVWOibXzq7xbt07li+IxYwq8UHV2Izr7MN0xuzlfJ7kuVmsZ +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 +CXeecePa5yORwuKGC0KFVnqm/B3DorCGKm2Y9r6WUFVoi1T7qbd93Xt6Rljd +3ke3dLFnZVVrsYjpzq8QWHNo0OaFqO0nFDJHCBJGI2/OJkNxiNSKKOEQsyKF +mSoJiCMxJhO+VNEZWqVTioO/wZmGkZuNl6D8+HZmez1ix+fgyqrRwSva5DHf +uGmg0sqqu6F917qgqu7bRavL5XymMzK2j1B0Ozs7Yatde2LluVk3cK4JU8Va +d2ndXnVwji7smnEhRrOylV5KXSDONTOzM1s04b59dHlV3zVyClo7q4GsN4zN +L1ZfBTk7PZOxTs3ipWkP3Oll3dFdvY81NiPTynYN046lVoO6qvFe6Lq23NnT +UzdXod4uVSiWiibK7CHY3Fy7h15Ai6ko7HVXnYYOzH1qV0zswbwlvu7BmXdZ +ayy74KsU6rppYIcz1m73qrgX2qrnNO8RiGqtyzVXbvdzN4V0oF2bsVZTroNB +wGpKvt6xvVFcvDm5O4XdDKquqkKUyVT3D7MdULF2Jumt6t6jl7td1S1fXwmA +lUs0u+E505OoxvntLN1Yg9kwZ2ZNWJFJ1VdHPHRfA12ObAuivaOu08LpVQuC ++qbUs7d49NrKUR5sVrdbXYRL0Ppu1NxlbRq+GiEq5eXyWdh1VvY8F7ltJ5az +lRVZIJfseFQ9pTqieNkGiVRthRBVmKb6lV9V2d3lT2iaNQ82WJi7N5XW5uio +YtG0NwcxDW6bFHVMbo5Mx6oZHmENcMV4xqKWMVnM3q3zrNSlhmNDCHAz4AoB +0AOAZGI1usZzggWi6ompovdxGiGvMaYoaXmZYdK4MBzEQUCLNzwHiFRy5Nw2 +Xcteq8Tib2qne53Ysa3dvGUjEVJCjawbIYiAiBEAZYziqQMFi0MbYGcpkTo2 +K4Igr6h9uhhUayszK6hV61o6bqfd2K1KGG5V3uTtavgtBN3GOM7qypuvhQQV +9DKo+Mfm5+epOqIRZcQcjhhjUIZZcEaahCMkkcjCbYgKTvvp2Bbbda8suMn7 +dqux9OjoVAg1x46+rHNvl1dnKTBTpb4wlXTNvsd3h2Jky1ldmJ2DaXUIZI2W +44ZI0ZIxI5EXIwZJAmmYVI40/PfXUqBHBwepUcW7YVwVMeWKGR9e0NpK6XY4 +L4ZJ2ILNhzJaiqqpbZsE7i6608HnQ1gbCHK5JI5E2oZFJI5CpHC5GJHIInJD +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 +TjemPEer43dkevLJjpPMm1iqkJmXj36MPHgDS6qCLUZKH0CgB+4jIP1BFsPH +w7/HxmpLS7y23hCcwn64Tq/mSPzfdfyXK2H8oUUegh+kNBRR/sB9IUbDBoMF +HyDAoo2GgoowD6Qoo+IfEKKKG0lFh6r7X3k15PfpH7TkltHx/8P9Clq8xhG8 +fuVfuZHXJjsMZpMvnNDHkV2DoTfXzoY9DNHR/uuc4sY+0xwZzjBYxd3JSGP1 +ks/O/j4LGLnPs9DGx6r/iiPIoYfi88/o/G8jEuYhIYc6jEb2/r8g/f+3+OB5 +xa9F8e3bj0QxXfzeppxjR8H+IxX93zzx8r04xMP8hjr635XxHwGOPLntZ8xj +znUnmMb5zLMeOMnyr64kC/0cbA/b5V5z1+Ffq+8bHzF7eMjfA9h+OycBHhgf +zn5HtV3Jx/bqZ6Yx/xP6brkDgHTHHNdpkOx0/pPa5hK3I4/RUtnG/eWmXW7+ +En+j3uvbp7Nd5Fjij/Kn1P2Gjmx60td3rxcNMPE/TqMlNUYgkXFcZxf1x9nj +/h0arC9U3XOqK4n0rB/T3zjGvGPvmKeknu/NJ3d+ausLs+aUmcp1hP/S9KKf +4+KKVG786fmu0HVHR1N+lM+f2dZ1vw8Z7z7RaPW/LmXvv3iiOdRxn2szD9a9 +uR3vUc0s+M98TnHuvLlprh3887ry0X6qb6fW1kp1fyVIt1UUnXpDk7zqaKmp +J51Pimi5wYypl+OM4UrHWtGrs4rMNmMYx5K+KcKMvS2uubqbI4Snj9FvT1e6 +jM17dnr24e5MT1HHtxhuf4sxj2Ra3irXjMX/LFZEjX247Vnp5iY7QzpIdZ6x +DUsddQXVfS5pIznENMQfC6Iu+Jiav3u6LM43VISd3x4963ReZjWh3QrntN9r +67bs1j2xWK3PdHXPdZN6zx599xnGcVRE3GUT1zn1/ljODV5XtWOKwc121jrx +rS4fbvqGOVK9sfPUrl3vf1/fxbfl35XbNenPb8t+MJR4fOh3815fnM6x8vtz +yucP31pd36r2qVpRx/e4/9++uI3w/C+XLu7zNxHxqPm71SfvjHiZw/0xEV2m +PXG9fO+0Tz9N+WO2cb7aynxXpM/L6xWaryz+K4x9dD/SYxoX254oft6+4phc +ev0w8S6mYiZRlEHyeIPbLmc9qjHrT8936XsvCXbtC3pQ/Zx1pDrWHjS3F3CW +SSjjiMLhVxMdGPrGPD5UbfCbe6h7dfzu/HSjGIbVnvZqH76f9CNa7W914/8T +mObjuuFzdOqm3vzn784bBZxeVB9r3eKxiyFtCiN/lePfV71uF7YnETP1+O96 +v4oiH4R1b6Uqrd/fq79fFTnGTh43MbTkJnW1B8H53zXFYzrn25ujJEEdOTDs +6dc7+LxJWuJjbvx1Pbi8azE9ahVUJUt29J3HiVILeFRQf1oE68T/iN7XbV2D +fL+iLb/0/L+n/FzC4f9ceczC5ThhA6Mnhd/1SeLVNB3m4fs87+vE36b8/L4/ +NY3Wfj8qf18u+a5zoiHf4+TzetY9n6xtZb01vjjnGL6PPma6y/NuVw5OcxSq +p6qol9rn/rX1b+lvntFZxBGvL567Xxh54fe54LKErTVGJ7WTdu/orTQvuR9i +v058enF9twU8TlGZzNXj5Xzp0YVYie1JXbypQP0ojvxnObuZnEkcfX2nHw6j +nb7fLwCXClQsruuRNNcxzI+FtYRE+Ie/TLYrFRD6MPc+SbD67H62fhUV/iUy +o+QTXq25EEiRRACBQPkaTF/2Vtozb/h9bCgdvmiKPoXArr+2ylhHbDhkTy8V +jMzXFVdwrjCh0SmlGJny74qr+WHIy6uLJnV5rebX/A73qI8Rtml39U/jn+qS +yZ51ixZqMXeMXZ9Yf2WV3U9D0q1WpZ9bxjFW1JpV+7v3EYR+vt6/pe7jFEJK +SNFHCERR9RDyv5ysjeS5E6imf3J4KU6tJZV0CjeQYeI/pu3S3a/tWFSvbqD1 +IppuijhauruyUqfrNn0/EsCrI/YVSqowOMm1AyiATZCH8m/pn6mtfdb8WlbY +qqaKPhqStBh4ggke8fCIjNyJWqxVV8OJxXfPBuo6f+bnT65nnnHO9flxveAf +q/jE1rnfPMXVbnf5p97y2VGHjN+2axnvfK5ve7o4W9xglNERDq38KJe7l0eI +flNuNYzq9S/aL7Tzn2d73TaTzEJLl41Pfmq7viHl9HfZdpN3XCnh0qU61C13 +hzesy96vieMcc5vV1JpaNa43vd3vcmkTt5vvUgoWobSVvOH6U5zcuvcwiYKf +9nW0dqq5tqvwLv5Qfvqqqqr/u5mZmZ9+t3d3d3d3PA/qdJiX9pd3VB47x6TV +u7UAP3zFPVXTD86IxjF6rm6qqqsF362Hx/rebHxvNbrd1VVVYLvdhvbz44yT +qI90t45xzmqqqqqrq7u7uqr+i7u7u7u7u77MzMzMzMzMy7u7u7u7u7zMzMzM +zMzMqp4Gx818r6szLHkhGs/oe7ec0Mr1c605rWteKZn3vc725ve9cVq9Xd3d +3d0C9dxDvd6xdMLGIh3xjGLigwvGMb1xb73uWPj9Ofy3a2wNO7r3d2eGnZj1 +btfX+Z9mZmZmZmZmZl3d3d3de8c3NVaqzKABczFVJYr0e28zdy7u7u7u7u7u +7u7zBmZmZmDMvwM/jeqv8lvsfdljxruyq5tpdj5Enr/jAF+6b/n+Sfd9Pt7P +BKN90nd07b8D/KMjVu7W7/GDy1TanWtVrM2xmN3x4e97eN53I243e9ve9xvN +MafqMd8xi3Gw+IenxiN9u17y7cLazM86zfHGcb09skbVTO+d/THHGs8bsaX6 +31PfnHE73umaX3vtT0+X3doei3PzBe493b96m96Z9nSd1D0XOh9QeKZmX71N +utK/hrcrdoei1A/kyZmf0371PULrr2q/c7kBdyQCzVVUAkkgFGq/uu7QBx8L +HfOMbtvxUevOyd73vNAuJwTjE4xxbcKOON+K4/Px/nLwz+Sf8/6H27cHt1PW +8xNIWAUiVmLwj0zE343iqfShZ3neLGvvqJvxZuqiFC3vHHHhpX4iTsphoQiE +kGCXpeTqIaXKdcWtkJ1u3rydsxcfF38/SH47PAJQ3S4WnySUEOO2OealPHWs +6KdsgYGjzaRZQ69qCHkK3i0hEJEh0w6KVcEGEqI4QEhkOBlcicgWmiNjUy/l +gxU0RMCyhARLLKVyxEMcMOBKE5BkkpKRpKAiFoDZBqEcUThhm2UUGvP2rZ9M +VvGG5FnBhPF4eGMLORymp03OlOkRrA6NmzpLBYTfMTpxISbmaaQ7hOHhlx2C +kIPnOcF0IsC8IEMZWI7KKKOYMFU1EB3aCdS0BvEGDlhrobS1hve13SwBIQSc +jq6JTdVXOKB6x7A4lXCzNQnkJ3NAbveG2McIDE+Y877xuuh8TiGLwkU0+sbg +BEuCEyMdA7KSZhF56xwIZCiiUQklDokeiA7Xy6nMrJowwGa4K6QMSnZCdmwp +wlE4cwpimOxFFnqhJ4SvCV44HwErwUtCMmrAsks20N62JYhiWMimlVwOtg1L +osSTg5xNFRHCXSCSXrnAOHnEDD8Oy8C3WVxEsuAOw876eujA9xxMcTkZeHfS +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 +JuccOWTxyPFHJ45fBq13ncXnck95Eng+XnG52mTzfe0+ip645FEWi5tvUF8Q +fa68Hd3cSkzU9CBCIWxH6GKNBL0YQlt0bIpy84Wdry+Jz51ue6BrTzyF14rJ +zPSPVyioqbbbhMZ2xjfiIzCMCgoL8QH+c8kT6n6j6kT6Xc3YYpvyP9gGIbB+ +hs1Vu/W7fcmhmrRZoCzJvLZ3o0aNabR+W9m9mtGtGsmcmQznDYwYsu7LtsW2 +8NgNNjAaM5Mt21kNmsmWyZxvLZMmTIZM5MGGxvIZL1Zd3RWCyijNkmK6qs+a +4M5g1xo1rjJgs1VHptp1Rk44bR8c8Nvm74veCiZ178bJybzk55WJ5zqYxdaO ++A8cF0S2tE4kJk0a7E64vRd4h8/3e2uNFlzsnW8S8ydoxQ/LX79r3jt4jHE8 +Y88GLO1RvomSyt43zjGDGsY0UQ5gxN1VTjVZu7vFVmjE459tG6oiNHOpNSls +4fn1vg7TiuAqZ3g1su7wbg5zkzGJnFeMUaMm4sqcwbmjqep5NHPGidkQcTeq +iOMc8cVw+8zmt7g2QZzdm+dJ5meCucme3XJWM9e1Us457Pmrt4spzrm4uZdJ +3zxrDi4mCp1WR43ovcUde91qylPHMPGbjVTxWK1WeB8mqpPqcx13F93sQJlN +jEzYYQaVAD1CMqAIL6PRiAgou8gi6weJTAst+DB0MI+WvHEjHefCuO/fOgbH +hTAXd7vOdW9eIk3bu751OeTe2nUxRXt2Kz+gffZ9g/Q86eflCEVn4xRGpeEI +GXj8CQNWXvz/PtHkrvKA75AJ6YGbGNd2VcZ3kG1pwGvFF4wKo077LxOOJed/ +Ya32WOEvBWqq+4nCKq/u4cenUJd4qqqt39wW1ttrKzevszcypclu13cXnO86 +qqszXtO+VHDpyWhZN8OSAv29KL2tbuSSQyassUnUh9ek9m4Og2KqRfMLssXv +slUzzRve7ay1T2SSSSl2K63U8aGOylvwo8R1bo7t3nk29w18jOQrNu1bbvcr +OF2Tt6+TmGjKrrGXAWJm7NVDMmbL++m+mXTrduEqXeXfx+6wpMwKbydNVf3y +q6f2/D5fdg5GhOzO01N7U23cBNtqzM/a75ZrOZsul32KzfsJpk7XdyfTYJvZ +BUWjhWOVd7RqVlqhqcG2InfVbc79VlZRjtPOwxBD5faXond1bc3ceWz1LU6t +O+zD3OGs2jmnJ+TQSrnBdGQD17N0bPv4fvOJJSz2Gvc6OaIUI6XHTiVkuNSa +tjjXpQ+Lwa5ueDdStPisrHCuskY555sscovM9aIhrxQs/QmaN/VVJoqr5sUK +7ptepFp5XSUhu9vdm3Lu07G7XR1SYtZsbBxGl2ceWmJ30mUaqqZNbuZd9vCS +sXOjdbq7ZfbWFUoCz0dNjNovut4IsOW+YBqt1TXnOlqxPdtODKur45huso7m +IvHrIsXoFe50KvHRQM7nsfSYxtPz2+DD0XioOJdtTSY6yVrxa+3XrYfCjpGS +0nHi4Cn7JuctRFVeGCtzs7nLMp5ovm1Zrk8W3VjrbQV43Ws1Sh2z1X1sTHtY +JtXVUZMV3i690KCh1lTcjn1x57Y/9/xPM1zg/tkvXxwG7ldlDADMzDzzy/fE +2MMDNiO+O2qxqqq9VG/wtur08OU7Kkkkk5WMePA940JHmdl8IJUSw2RuSqVN +x3Rq/gABZ8Kvcu+V9fyf1Q6aVHAd+Adqj6xMi5fX7CMGIJ/Se940LV8hi06H +di4Z196L54Yn9zoAVyASQAlIAViAHdplXny0e+PgcQEPjmN731dT5WDMAxnL +L5/EfXS6/r+sYGNp7tyZBOF4Mv4X332nI8+yA4l31sHKxZdUEDuB1uuWcxCW +LgdYHNMk2xU3VL4JC5y7q17uo5t1s3UOqRXliVputjep21Rw9q12W6G72ypu +b1Q1wxW3ko5xUCOHDoBzlm4ct4TRqKb12SxEOTGE0cjlKpJJJKXbm46TNfLr +v7TWS2Eq+kjcilH5xOpUGqfYumaLtyRJZtXg28U7nY5Q8Upu3anX9l33djBI +4sWHKYx/aRNLzHhM+ssvuupmcqf1M90xb93I/duO/iOX3C3dClMn2MK0PrnP +aq9+WfXHc6ffd983s3MaG8b+8W3eWxXU/s0jdv7447bKliVRGleyY/tCm9fB +557xIcmZq5/PjSWY5wmMXK7DfKk1nXeUeFTO6t6jfcKrG9Teig4sBYbnYazd +qKa7EaC0Gs2WtKBZMusO3Ly93nSSL2+p3d4prhqurs3fVz13UYxMvaxOJVpy +dTvT142Objucru87tBWm5kfEcZHmZb3d5C828vG6zp2yRlAzs6YYKjr1jbvi +Y8MXBZx2ug/PRuvu6uu7yUKDsUvkpsxAy7QOsnaE1vfqUUzszXxre6puuli0 +9iujjYrFirVlnE2ugq1De3t5vfzcuv6x9l29+252hfV/Tv1/Z+U9m/mqZWC6 +l54l5Su7kiLZMn1nOa4NmVkbvd1tvuv9kfhtaKyR101qvr+Vzq46ICOR0TbH +Dp1quzk5qDrT3HFxXGDaZdVzcuwznOuVTlY1Tpdg5r3N6wriTdWq4Veaq61o +qKbK1WJiVOMY6l8QcAZ25wmbhcLX3fNweGEb+YcuMTD6hQ6VxP2w29pKk28b +qqcczWuCsLhiVOXNpmlBUbgK3khtJr0zhwg44eRHFOxKDW9cRuZvhW97rcTx +w84Oh/nv9ASjz8NP3qF9nb8pdNy/x3H9UNClahstWoHv61JjZsODOZ5ZxSt/ +gC+Ngj6MuDGM3w+6d9EZ03E7hi0zQuDhTlbSvN1NXglM0rgTVjHYklAlPG5y +++Y0plyri3t53RKVaa443jBnRotZvFb5jdPrd7dYnO91wHD60+/b1P8Gwh7d +5if3dm9TzrdWh2HOvq1Dpjmc8Obsgi3BnCd1bFs3sC7bnVe1Uy6ZrruK2dio +93DqeKaM+20zPg1nXX0+fWL+GUTXm65Xb8gwoOx1VbdA9dw5u9fQjlt6NNHD +UnXqvTjeVpKJZGmY5xwTKyGx3K65UbqleXay67YuzaWq5fMHczqxVu3NxbnV +ie1c3npy6rcXWVjhPVt4zYOojVEusauaMutaiKhWKdZk29zvw1d91xuOhu5W +9ErPbmddjcw/Y6BphR2ms284XLzjmKXabx9gqbj2qjxIIZWvJRE03B2HCK3s +myhVPnFVwZvtb3fFxL7fjEy++MLAnnsXgSjZF6xG1HD2qV7UvE6IzlK6eaQt +tz0I7jsPPHBl+N9uaviKx2ir2y31dYMGzgdd8lY1jKxcK4eXtGBD8n1X9Baw +pbVDn3c9JLnTJZO60M1rpuzdDTWeNCwtbO7vGONdIq6UTJqd1GLubvGOMytU +9P0iyEPGt7riyDNYINbneI7s2xg7Jm5QKuyznWr7VUvarpdVnOIfGbqMXWcE +KcWDeBrJ+07ZK09KoacVdYuuo3b76bt19uiocrW766DoM44y5zgzWuVGY57F +10r3l10PfE60Ymq1zW+LvdJqin3iXnVfFX2Fjs2nI6zMnJz0b2M2xh+r308P +xvfJyVj8G53vf6Hhb1l+eMj6G2eAr/f321rLHPrxPDX1Is8ObqO247z26q99 +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 +hqrLzPS7vsEm3NVerJKy+IRrvtrT9gcUYzFvwxD5HNHXbOiB8CyqGUpLt8ry +t28nLl04XloGUo8e1ypZzVVdZMzNXdr5PqcGZZo8qqPs52qo8DgrsTJGi8na +7aymjzDQtTMlHcxGtvSNN0LmrjDm9uB0tfnlcIILYLrNldomHhtR1XO+uodv +Qdp03pqrXCaeqhdWQdu2c647B6qmvdy63nkq9KFW3Y2cS3eXtYNJ7eeSuyyp +plB3mi8KPXaXcrcEkk2nSGIXq2sl7Y3uvsG1tG9D3a7zEu5odTMD5d25oY7n +3ZWYwxWN5snZTGBA+fV0urcdGr2psh0onDK32aKpqxTXblV15OhV9lVhu867 +xVSN5BmV1cxgphc2QSryueKds0JMO9GBZdIXe7TtYe5X1pb2QUbzeoi5Sobu +ZnZeWTXdVli5tY8NaexmUsylt8wU82WiDQwK+7a6jjvYY+fLdyc3uYRtLKm7 +dBaJK1b243Ol9c7cE0Xb1Pt44za3EZpqZdy6Vc0dYtRcu6sF1e4iNg61p3Ga +oWgFu+rL31yXlSuW7z2PGxti7lByX9yrqmcH8jV4++vsqiD074Hby8wRN1Vo +XJtr7ft6LZFqOYS6zZ2vrWG8NVu2iy4lXdzdV15hQm5a2XIVu6s29yY67Rmd +rszRQm3vbtbkNOutR89OVlmvYTtnuNiRaadrmL8xlRXyQxzNPdFB2yqG4Yao +Yqpvll0tkZrjFBDxora6WF6sv03HekiHJedY13Oq8Xtp6hO4JYRlp0ipYZ6z +bzpKx9uRXR2qHNo3drcvPSot07BvHIGac1G+0UXVKPO53ddfZg6nCIaZVTW8 +bMkFJat3eWZXb17yo0ltqIXuVs+OYZQVv5d30hD2XewaroLPF5Mrp1Zweaxu +sZzGiMOZ6xzBl7orN54Nqt1YOVt9ttV6te8+HdLxUvLuCXZT5gjOuRbsOWD1 +1bd4oxo3n0zsl852zs7Ms6cqsKK6r4WuKlb1Dt6pdDjfRJX2aO7LGyL3Z2Z1 +DKgly3rvZPre7m87plyuJ4PBd393YqGfbY1W9YYzPOnwyklk8RdUFnDLnzN2 +MnBaKEZF8+6dQlaluY9dTRts2pBMquvtYy3VeVQ9CiVs2VtJVq221o7geVYT +j5UrNMcpUuV3b3NZ1x7Exo2qqxlX1l3Tvi+3bq8rBRGYYxQnuyXoYW9Xxw3M +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 +23Hz98wuU+FHMM30zFV2TOjuTUs7I/H6/t/Py0/iW/Ydg4Tf1i/JHiswj0L9 +NMZjEt0X2+/R9PP4++fJbbpOi7q/N/i4LyM7t+cYbZAmZg7rHzPsavvbsaz9 +mrF/mHjOvm2PSdgvB7vWI5rMdXgYY987Q8ycID4fL1EeOxzwJPZfXoR6E93/ +XnaD0CPIzr7jNpE2j3kHcEnsgU1b8vVv7DcEdy45psn3s/QOQX7kcXxnn38W +rC3PbEsQKaNoavb/RH9vnOixeuQOPywcmz9IZTSYMybv93ufa4w19YIKdS8L +R9D7zgnlNg50lsYb2CeyZ63fHbAfifkePdvgezAjnr6QfP8Xg8t/pyBMu04Z +/zePYk90ZQ7np0dn1uvHl2x9b07Z5Myo5vpxl1IEJ5iSSRI0iWISQNMcsZWL +159+O9db4h+T5vmp6HTij7O47Pm5ss+DlKji/ciQ3b+/x2PUJM2zcsASznse +ncRDBP7UkIy/kGODud9fbQDDHpbfSDX5JwF+5zqXJZegbEyFQhvm6Hc9ft+4 +OWg90xleD7Ifx6jNQfZPfk1mVYaiq+zv3xm8Pc5XlqH4TGO8xFn4zLgcb3w0 +/COKJI+TerTH524x/lKJGGh/RfZ4cyhvC7rysoavgdoZJlzE+zMwOGz3MCGH +IMENEcQfA4Ot029AiR7VQ7dx/p2PHlzVDSkeZ6GPVqv0PhNkTz5T4eTb4/Dv +FiWbNej82HNHzD39d/P7L5OSj2N8AFCC0DiCA7jeoR3R4YWpGWMs3TwZymVy +kFlQN9U1SEsqdpMt52a+vLVeN9uwgPg+05QoMn3ZbjtPc+RMdI/j83A/hoMs +3ufTisPgOjg/Nu8bZh45056SvX3zIAI9w1iSPhiiOrFntVHIm1bDGsTNphhm +/MkNony1nbF9dSQ6SOveSHjhNomTHoidGn2rOy6xuR3+ni/r9vD+p6O8TpmA +sGWT77t3GHYzB9Nv08yOaS/k+B5chvKHppnHGPVXH4onrP1+zJ9UeCqn3+3g +0tTgPD2poO4Noc30U1Seok2WNlMwdkzA28fNWlDsJ+0In8/y74eBflYIyA8I +21A47fvpO9IQnd2G3Tr6bfoOwQ3Upwnvs1PFjBeKjZlzSXqzStqk08DGnHGu +zfaa4itSoyCyZVoz21hpqHjTLFzDTVjLUvF+53PEPbpxJ2oDyI+V9Y/tnkpp +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 +vi+qRXsfB3ddh8N7r199InhExwh6PbZduBHu+30cn8/5f4P3/6Q4bG36vV6Y +Pe+V/EeowHyl9GsUeCVufTkdx2/q8clX8CekPP7OP1XHu/PUSDaI0+Lmc1yk +kkSjMkjMKoiNWxVjFaixrc2rmtpIK1ERttRhg9456F7rxqf4/Mfw1FRhUP50 +Nwv4mcYP3wDB/m/Zg/9YjCL70TBHY0QEVMP/Ln7vvEfvEb4iP0fZ+J0Cog/d +uft/Nt9f0qNQj92Kj3/cPxH3v0p+l3dukT7M0nye1Z/H+39qJ2+R8H2Pw+gR +/bEfYI/WI8D4gep0fYbIqLsKosJEkj5VEQYiSOdBDREgHtH5Yd07p3X6FCHT +QQ6R80aqoKi5o/TMUO5b/F/RMw2mFy322uXf0fPaXh9uIfAwpfW0b+VXUdV9 +lI39W7H1TqpK8Crh9FmM18NubHx13lBdtCw7zu4w1O190QVbvdXVUHdvAqtm +qqz3MmHs47mM/QUcwX9WBT7G9+SmD6R/boZ+Nn6Vxr6/P75fKtECFBKnbahN +0Z9csC6CUIX1huBXVmlVfQlZmz7LCf0Qn101VYYR3y6D4nqp6KHw7o2j00mj +04rhg7bp39w6rnbs2vu+7K+36Tfbo+1Uvt+yll/T75fUt5I78viOPLVy4cOH +c6pVVfNZ1nHYVWc585Q7surtbd9jycRr1vKwxucKTqUNwYMum+JBl4cuRUEc +l5nURyqdllNqsCWxXbrDeVU7ocWdTokOrzqs+trCHmTYIMrO57vUjNEviRt7 +dvT7WsoLruSWSaJBrXuWxe3OqrWdlVRt1I75zH1BuNb2jeZ3BQW9QIpdfS9h +J2krqnd8w9gpUK3jd3d3d7lrdGFrG9vxe5cl7qj5Zed2bmbepBt7mbtva44L +wLOkkTLS5yqocsm2N3u7qqqquL4uLpVVe71VfLevd7LdLZfdRzHmCm09h3Mm +79OfI6dOfTnyzXO7dxQ1TCkLMxVBVajVVsEW1GkTVG1MWJAoaBSkVhQ0I4I/ +WI95I9G3Zjy8u405kznxJoaeZMSM3kkfcJDST+dJiZPghJI32oc+cT37xi+n +wd2J5kk5zsPGPXzHqsraRMR2HaSeWyPRkm+w8vEnSEY10SQ7uoddvWA8Cbdg +7zB4aZBOUlNJQtKvRy3E1IPMYsq8uNkjhZCeJE556jpgjhmJRpmEjNJkdKEk +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 +llz7lJdoaW9qeM+5b20Zg3Dubd/nkunL6BPKs/QK475SQ1ighj0eDQRZV4nE +u98B6J8Ey3oMw97YtMC7JwQrY2isYtSaNGvoXLZMYSGZJmSYEhklkvwET1J1 +rq84dnune7xYX8f4J+zNFwI5ukuyKoVNnVxpVW4qtGiIylKkxUZGGVmnKh8d +xs5VSp57LeUwySRFqKk9yulr3Dlo1QYtJMhDAkMITCQkA+MvVAidcc84Jw2N +TJ4LqT2M5qmWL5th5uSc/VWWLey/MXWcS4lrQw0zY+LfD8g5ahQ+GYSZkhJi +jaAtRq+luaotjbGqLwgRrWMC+dH0SCfzzHmOh9h/HFdiCgbPEkHDboMQGIUJ +YxBV165rkNDw9d33LnyOwccuVHNOUh28cXUhrMBKBpWievqiYaqLSLUloc9K +8abzji69PTPyBRfs9aNBIDc5h5VW+ljTjyKqrOKoHeTehFaomzei41gA9JCs +r9gKYMH4P3AHN1I0AUpStI88wHlQM5ICQwJMJAzsJy8Hct4N8c4H5w8EK0w/ +Sx22UQxPqmTsI2lqhUI6mCzl2wt4q0qgw80A1WsQcBi63GFvUZBnTMyTMzDF +5lXhwDwwV6/rqqv7JpTqV16YkMyMA9NRVx7RzFqCtJNOx1Yz1bTNGI1BimBR +MQbCM4pZsYBrQAkzDRNPtugPu+T7n2aSX+1foft+jufpXVWyMuzS57dmWj24 +5lF8zivff8Ec/DMuIEhvmY+nhCTCVd1xxymXXYog/gP1/HL9uaO4cO27u67b +2TcEEEncL7IsGCJccOSa5t1Vup1nQy+sM7WuszUKvC5vShuVziJ6KVWb3TLk +u2OIrdVcEvU9sXj1smPa5qW6q44ctdDEdrMxwU8ygdFt3Vi9rkXl06ssVdWl +ZTwNlYjZ5mwnNql1p6EM027F8kNF9qrEMVvqj1DbcuR4xcKl5143FTeZKvHa +5YhIWK61uuOm7S3qVMPuRlnu7Hrd27Q3eGPdWJKEVGs3JnYYuXW5LHXM1uzW +Ullu0VlvOuPkzdYVzDuuc64xsklcMO1YkNui/4aBcW0dxS3Nqs+0TXnwu93Q +dG7upPMWIhCROq3hsF7InEJ0qY9q+gWP265ePGcoZVnjHs4csrt4va3Q9zMt +2DVV7iFUjSfLL685OMdWxrZ2bapije2Y+mjuwd5tDeTrLy9gR3Zca71jH3C5 +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 +ypRY42W558naxWOIY/tM/S/VBuklG6PkUQj/M5J/H2ReTEIJohFLuWZLwyTK +HS+nxJjSZvMbh1KEkuZ16Gwwki1GTZjllQYcHrfVh3meM8gOOg+jrmiTB4cf +3SqiUyJgt26Qw4SwS/v3waDeS4buxRKreIIjBj1q2IuGWBthDhs+T62lZ4O/ +j9cjeEshllz8uOvODxA2kEN3Alhm7yHhTeZqnxupbaUqduHGm6fpAH9aRUT9 +0ifZEeK7NETaJ/EifR1SPTH9L9f6Pl7zdE3RMMYxkT7yAdEo4iYiT+ox8TY0 +iaNImOkTHSJj6zHDY0iaNImM6RNIk4YyD1JR9BImInoMcdKmxsiYzImAk3+M +ny+g9X0gmm8kP2+8/1X335ofs6e38F6nf2Q41qQ+Hp82SHpHX+f0f1pmD7e2 +vYqWYOvy4btTMH97TniGYLs54pkOn/NKHXu81Dmfx3u0ges8Ofs/L+V3cmg2 +9108bu170Ph7/dxBWrB9jFg+x9vwZB88g+Rz7Z1HRTAcOwHR+SZiEN+vu8Yh +gI+zz8XbARcsBboYJeIYB2GoH++tevCr1zf7fSj1thrOJMUw3pU/hTDYoB8e +sNmhz+azMPRXmf2awlGDHzr5SWr7EPz98emT6RnpZ81p7bHt71nJ7+ucw7Ue +nyoN6tf9r3+XvOLIjfyj8VPrcOX0f9Tr1McGuanBmo8r35v/e9e32+M71zvK +5K4w2JjF6d/pj40+fno9NKsrFUo9DJiaqbvzM6qo+rm7k7dRNG4/Ti+0lkLj +iyv2Iq6vdS+ZrjXnOivWN+POsd/NwYyuFkW8Yxw/bWepLvMYzUzreS/TBX9F +D1VanDZ9rsjtxeJeKooPx4n7kFXeBHNOt/OG8+z7txHWyEuM+dy3Pqn0yz2c +nioSEbL1LQmwcKefXmbNaH7Y549tnprIJEF1zLaN23WT+HWOy5P91++Xtrdr +6pb2UuaJnIsSqgJVUnjK7fW/S/xRXXOfFP/LzcNJ2i++e34+Mmt5jWqb1Q62 +1PkzMG3u8qiXX0+77Pi96ydd3rofjl5U+2vao73lR53xJi21x+Uzz9mO2oiz +jiCKyR8czKlqvx17V5TNq3NP2xP+19X/f6137D7PTtc1XxXXntz53++Pj0OW +gX4XJ0a98+Z0dc+Pffntee3gmN9/n/dc35WIvxyfSrX3414einWTxP2TVcvx +Y5H9/Vd83iXjzEzHEUW71xf45Jm2vqoiknw52k+XFkUXAtOSShfZqZlW4ZmT +9kjeO+S7z9VhvR6qsWxgp/ZWiZcg9IvPi2+zOT0SWPPbZxoXF6KM/9fOaaXS +c4sgyKhD08Q+qeU1cRr7qMntlouXjKlvSR663EqV58TlSmwh1o8eItBNOlAj +XUtApYd1L8YxBXnu54VJvwVqDbtpPLh4qdzTXLxaJUHjfifNP5Q/B54JaHkg +R4cHRLSfjHiKbpSaWXeE008FxER47TKbrhsE4qH5luldWd0XWoa/V8KhHVR6 +Yo74euz3WK+Xi44d4c1+bBEHD3qnIaOZ481eHwY7aM1rjUJULy/Klo+OCZuu +E8n5esXt+0DsaXOZ339axZf4dcbvl8YLvJxZSMz5yYotIdyE8dQ6tcps6mAR +m4qI/CY1PKOK51ivTNTis06xWtNxxRcpbw7VqzU1QjiR1Jn62YsvxjakkuF7 +dt0P9bxjZGOXz/esvFN+yCLJ4mOcFbH7xmnfB05mn+6x5Mw8L0nEVED+EawX +DLUjnE1zUTT8bxxNaoqCSZ51Z3s2sjuekSRKoyc5N2Xz8VGRG4Z2hQtHDxMI +Ih0PKbzviuLuM67fHb7smb05uDo54fmyneMjnd8/7lF3qHhrv1qfs8dd/5K4 +4vvj25ej7E3Pk5Ucd/K4kKr04jjG9o41qU1R2wcRWdxuOx657Zw0GctFLQvf +Dn06OZnGpnzTw6E/ZXF8TEcul4w9d/4nzmmtQd+LlUvtXE9v4FfGeLec3PBx +bQVFuER5fjLnOY1Xr5w2jDtv7ctEez6+2eY5Ncc53ntFtl5zdQ2eHshWXiDp +T3cMa2ogXPvjd8Yz8fPn1quT7dPJxbxM8R1y5aJuPifiKPWWfqVGlvRXonR4 +77w+rjK9VHC1CyrUMdW1RKOFpHS91u3WU6UcznNXxWLrtBcNTjp4gz7fTMas +szKH/CihRNU52lsbt4oT5rETwgWMZeay9E9uqJu2UbaJaeNy0e75TLOTMrby +Z9dX7I03OsvrlHaueJxxsjash/bLx4fwuX3BS/Ba5ckUO/JfU7l68fa+GXOL +M6uL79PwvenKQ74gO61rOJHp7p6PH+Pv8vx1gxt+tyR80/mR/Mt5938NQ69H +78uJK7ho6W8SGVvBUghTSa4HVoiBa4j7d1HxDn045jeHaFG3+maqq4l6Tvz1 +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 +Fs5ERBItzuVRXdEG5SsHhhUOHzZsqBzi504woE6UHP+Pgk2cHIYP/4wgv835 +/sfR5jv51n6vGVEqRWhbVkSdnO/cSEXlSERGjST49Mdd27mLL1yc6rujkqSm +bZFdJK1SRRK4ViiYloRBV06Zw6jM2XCyKVYUlQKoco6jKSuxHU84GJHZRQVo +plUXLmYU6LJ0oSE6fevE88bIqbeVzpqXGV8spsRoq5RWhNG9Kuc28bR2Ord0 +HOwpIEyKFRuedPic3QD0Ekl5HnedCMy0Uw+XXLw5REol3j3FQ9EOnHIfmQ86 +hxAIwh9w/NLth68ftc7qJMq5tXItFT4a926GLTV4q9Y44BX//mKCskyms90M +/zIG7k7/////////////////////////////////////////////xTauB8b7 +uMj4kdG6HqoPmoxjTC221rYtbWETZpQkSpSiCgU+3POAfKAAKAAAAEhQAAUA +ACQAAAObme++LBQSqQCEoqQlIpSlAKJKFCqUFSoEKlBJRV1qVKSQlQqqlQpV +FAF5x99kACOncAAAAAAAAAACtABkAADOuURNMpthrRRcDN22jOA22odYLm47 +AcMR0oABtjF2A0AaACgoYpUppg6ko7u5yNdC0k1BXQU7mioABrSITtpW20aU +FR76kEKu89fdsdHEDgTS65bN19aN8hPjm6gszRFVS3AvmkDQARH1bG3j6pVC +3onyLCx73nHiW0FeerwB7WvA2tSAA1mvHpPnjwr1B69w65pPnaAfCqT6Mn3w +AAB88O9dGcJyZ61d4rdAPG3rR2kCjA8PZ8ru7ot0u9dfAAVJ1o+6AuwAGiFS +7AdndXd3bZkl27bTu+fA1eAD6way1s2ZZNtm2K1bKzo9le7WAA9YlWyKSrZo +rLK3rxnbvAB1qqtYSxNbbbZSW49HW8AHTzbUlK22lKttLx6rzeAD11VUBpTQ +ZUvPKe3gAAakA9NKUNNzwdtgA9HqqZUFKAK8eqpgAB6Kr0opQVvV6VwAB3ra +FABbvRW3LMAJ0O1W8A9AAAUVHR8UT2qvvbm6qb6XxKhvra2E5KgAA4B0VSig +VD777wB6hqwBoAoFAACOPXvehsaow+vn0jwAu30BoVIUQG1ZD3hJJUdapWKd +wdce7irladccVY2isNqBhmC2sNVEIZXve9SlVUSie2KjYyj3NxEyYFmDVRQs +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 +73y+0MIYvOGQCAhl6GQU5R3IfKJwmNm6m1PM+miXf1hDpp5IuQaC0zLlub+B +aSFh5JH5/IIVT72eDaibve3hQ9sZvYNZ5j78ddvx+lAT/MORW4w1DTguhsVk +0X2ULTNZvt9gK+jn9r7JGQanYjj8D4qYGZHyQYAMDn6qDVknceM6nSoctv6N +6IaQLDeccBHPvgFKLBqOosEAUCEhBhCQgwPV6HKf+UHNp4quv3Pv/ZB5uv30 +pbFxB0gfPcjIsFHeOd495mW3Tl9C57OfvofH+uQCtcRAKPKiOIyD+emhTWRM +cSINAgSGIqFdUY4pQnLFRBoTFNVToZDq62nE3o5ua0NesC66tZzpHGTIcCpS +EG1VOppsZVzOUpygzANZxGBjkGDJtvkFPkIXUh8Kl5Sv8uQ6kOSAgFwCK0RH +NFBcF693eDDcw3qopTFZZbcikjt3r0Gs2avHEy3eWt3RM4tqpSu6is3f2vfU +G1Wxo2otgtpEsbFU2Gs2mzGTW2WtTYmptaY1mtrGtrGZsxlJswVVVVBVVVBI +wYggqoM2tm2ZjVsfq/fk+X7nxSHtKXtFTJD3VeSlZinMaQ+OS8yiu8l5ynuB +3knRU83jIeIfnWoFBfv6b9PO0BX2UKB6v7uqyOg0/Se//+0vBet6MA8x/D+0 +0R7LsvhebywFU+pbJEU9/9/ZTBVOCgFA9NAD1kK+R7r7fm/3VAPZaanadUbm +BsDZm0MPvNxBeBRAgRHeS/oKPwmbSyzMra22a1bGNLZNmyNtqzQ2VtRtDatm +0P48l6lL7WS+5kPtn1a+2Ic74s1MxtOp1ccCcI5xmVUxybmWWWaTUZq4ucYa +hXkIdSRu07KqcDsqtIARwcHEBzg4ABHV/mfzWyvwKoVU/mVd/hfmmSN3dbby +7y7uqrbqsu7yqqqrJlu6rPupvA5Zi+1ZF9Prp9dPrXctJJJJHMwyyzqRilmE +YqpusjK7coTpyq6dT1fUp3IJNpxOPozTHNqZoqriwtlqVOK7hXcnb2qyoqrz +d3d3d3d3dmt3XG7u7u7u7u7d77c4OfOBzg8c56gkc4cbGms1mY22pNiM2Wks +s2ZD0xxS7qXCnKX8pS1kQJjUCG1CABsBv4wMImLHasWXiaVHr8HfstnnNmW0 +XsKnmlyh8lVN7qewa5rXVBnc3t1Sai9XklXURALQndL5WShAuVsYIUAvKEsN +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 +fPrXXf77z32uV9J36PqkZ7fgb6/WHzj6Y82H3dRnGPd68yExGDJZ4sGDMs0D +HoWmVOhMINZsdZkX67s8l10x7GSO/5X9X9mfoFdqX2pQ+bfh8Z538Dt2+P5i +uD2/Duvo7V4+11d/dZff4Y+tz3hOPdiiu/66fu/ucrfwdv5fKvf3Xvv4E/W6 +EfGOj13+Xaz7+mPrPy+V9Ffd+c9Y/Iet+fX69+vz9WK8do9l4n28ffXnkLx4 +yfuT+WhePo8x26n7fwzvIUX5kR6H7C8RnXZ33+qsJ8/fu/YQ2PP0vo+hteKY +nkgo+KbzxRIELX4aOn12BAeb9i/T58nFJDvrup/Cj57+o0LvjHzKGCdIX3Ow +OsHw9Me+vQ+7n73qZvya719e/hVBL3OnvVfl0oX3bux9Tzurzuy7gRq6MwFz +pDbylk/Pneqd+L7+b7ZYoLuhokzVOYmY+zVH5SnmPrZ1fZOVyUpZiIjFM/ht +7Au5H2HPvP1HvvbR9TE9jAXRbaVz7H3kXaEdlg6jvYumTDe2deyqO3sqpdYW +5Qvfg9m7UBF5f0QP800latrr7PdwZ7LrfhFPrv9nz279/sndOnyqL7KPFXTD +nvA7zxT7qvXXq+4eQV2Wlj8xcd+qXi5Iqu9j179t34db9qNjuhZfm6PtHPPZ +UEiSSUl9dI/dL6OofnHkD4e0TCNrphHum0clxFRCmPS1NqWi18nMw7p1U/Wv +72lXhWQe8sScTb9mZ933NUifePt+sTHzddSvfcj+RMkHyoO9SzlZY+rh4arW +q9J06dNfV7unTxl9tLgjzdut3Pbenp4dtV68Kdnbtr7nHGq8JDhFJO6eqZaI +qoVJ7GBpPLVAUgoLIsPm8MnDtU6e1pDpt88APbxS2w8PrX6WeOTfpVWJ9jy8 +sNKqvoRTn0wnnz8zfX3CNSny/db3rdP45uvk35xnfML6yb9li09UsirG235c +9AJOGDflTk5dyfLnjZsnAyYLA+U2ZhtkNxyCCMBZBIzbFWFQNMuNWY2TZsXz +MjvU0eDuldNMDfge7Lr7qhd0FCoVC6DMDEnjkxJgSiQ65uomtxJDRyePPMOu +KAwpAnQODAEhCnTTCFNokRIh4FKHa8jZs1ZiePjdp1YZTxbkaQg+jYKHc4ES +YFKSJZEFoJQHdLXfdwsRq4jh11DqDrLNaW0hDckMIShplNWYByzMiybIHNsr +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 +7lXZs/kdyUvK2aa1SLJ8j2v8vU4EyqWU5BtChv0rmVT45gZWIBRlwggdDirb +qoP/wYmOgrr+oXfqQYa2suR9sEw4ZtVOScbJKsQmUs59Kr3gJQ+OCwAgNxFY +hBBfOPgTv0YlbvZiCwECxIXuAfD2QUY/fVbh9dEz9Nel4mSdfMNOtJUf0Zi+ +5+Trk/nDQ4zEkeW3dS4gogXo9j/ArkM4JBR8xf1r8Hc45gxwkbe0mLbfccUx +EiYxgEl00hLR68YZBBPpLBfJYtA7T3als+jBtZ2pn1VCfoXhN/uDQewrvM6d +yDDxsWuGd46UZtOUd+GgGmp04vKbz7m6otQNuPeV+uLX2X19C34P9jlBE3bp +MAKDdCz6MG3+zQULoaijFfatS3c7d2ySwOqlWi0US66x5M6CSKAxsOdwocCd +RldVHGxtaDLMzsjz7AHKViVzqac53HjKFN28Hm/d6hO5sgy04g+Rz9h2UG0s +sJGfb51JsL189qcfPtPZSy74U17L3HZryDnlrBYuuflQ1xyxKaPW+u6IXyE3 +4fLnrcigSDHZ0l+eCYNNHiQuUadge2UWGTo1bu1XFYzZkTfsqf0CmJ5PWLT7 +3bnrRJLRqKata1pWnY5Jfw57kPXupJl+45Ye8Jkj2YAUcO/T2vbCWoJTGemG +hhoIAAgSCRG4OMcT/WuQBkpoUn8YnrtNOeWMHJ8wA2JjwikU9WiLvUrX7i8e +uiXp8LPQWJbYEBwlRdLVPIw5zD0kVZ6qya2xkd4ljX5v5zUGDNE9OkonzAnS +2H7NG7M+J6uj90Iu5o/CAJ0tarCKWm85TRzO9oCp9Tt/1kh2BS+Gtc0Lz0yK +Vxe7U1q7NIYBqQzUc2z0a/cvd8PsxoysyfD7/5DtduY/Gxo+YBMydKmaM1nJ +0PEf9VXLW8SaDZMSo7UTNnUiKvQHni2J6poHRktw+jW7C9IUrKTvRhWf4atw +w751Aj6afzTjT6+A/E7LdAzSQaPcbkxO9s4Vf0+F/xf1QorfWX6VkWmWZKzG +wZyxWtz5Jb5ebHxnfXTDHP6C0UUfscuyUUuLFPSPW7Pv6+QgNlrJ4Jt9bfj+ +0ZKTaBBPf6UK+Z7NW+4IjBF89VxbbL1tmkCfA2STfoZRdfFZb/USc1m96Ic0 +kbKiv1DV24RIXBP7RdjMRXqaNptfq7y4/T/3RUXx3Vo9b683XAMzsCgqqLD0 +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 +oLrnV/flFurCWaJaEOLhpLhPoaeZDIgjc3Yxu+i+eK5xJCmF6ZwTmHDygDXK +eZonDAbQ8Tg5GpjLlHCnSgdJOR+11aKRAkL40W0nT3ObQg/KNKiaezbDRiMX +a/TTXa1X8flPiCe87z0s7y+N4XuR5qc7dy5KTCSv4zy1HUVl81zQ+wJ+B7ty +CedwIN7vZpM1pkzJUse4z/EvzAbQJMX1UmOnOMW3+5Qv39Zn7S4qVNrjtRqN +G18uVYaJwoy2EZcBvznldEbbD/rGRzKtnmnP+jwyQZLa82TS/NgMV2aIU38X +Lgobq9NG0k1SvWUFec4WRYenQPpT4pxpc1Bi8RsqSJz18ChRPIyr90w4DeGd +vNH5xf+ZE/2yL0gwUHzE4sV2QgpFjEtgW0msmK7LoWoDw33Lfd0ZQlGN9Cjp +oERRrrZpD71G8pmv0KGnQGZb8BcQ8w+eViRhfUyimiw+V9CLvvInIaCCCCCa +QwQAmgAYIGNYr2nAR2VHCJmjHOWoHTv82X2MCLVpb5PGUpf9ubHv1CdR+zQZ +WqbDH68MBpJE6e8r4JoLToHgLDZqzLoHsdEUhkfW1q8qWUpRm/2La2KaGnWk +jTZHDa+U46oeIMnf3Zqwq4a3BspZXEHFnPvaG0Q/FAmTbrlQhos+bkkxZlMw +hf2QyvF6uweV8j5JuDtVdxRBmx9fDW2fItKmbCYSKCnoMzo6HuH3KMlyPG4E +3rTZ7Tl21dgvXiN0wym7sDpyivc5SgreEAl/hELZL5zE6XkjUZxnSi5aXTHL +XZUMKrxsKGYiJST0JF9yPxma0zP9+VelpgtNbSi2R/OOstfZaHojbL43aFn/ +MC49xeHn0YCSI+dE+flwzPvii6y8v/y1XtfJGphsBZqKS39nOxXuqQ5cLEsP +yZkLaAIpzzyjM5ArVDG96v+3TYnTXlj9QyaIrYtflSzNEp6Eq46Baw57VnFb +YdvnzzE7kGqdb/cOfdGP0J7mb6P3ePtJXzc3jD9Z+cn8f09Iph7c/XC8y6Jf +tFHb/biOiyWVG2e002ibr8iL7mmFuxqvPWIsjGiI57um/OA5rRfd1Ms99Xt0 +uCLEgxjrtC3Zd/fiPpSINu/jN8u2AXs+hnh3RmtFKyEpySCoArgiFBXM+HzM +vMOYoRT1r7c83hzrNWAdhDel3Xmozko/NVttDtJ3dv6PqRU6mhe409jH26qk +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 +kuF77n2gFlyT9htuTHtTj+Z7t1+ubfQ+6I1/rphSoSpd0lOrrRh/5aGcKSYL +DtZ/ZznJDeP1Em533i0xNX76g7vpJymFdfWE/57qf2viIPFM5xWBoI52lY4P +jO2D7bt1UWf0ko8Rwv28844eaDo40/Ym9orOCq1Zmk5J/I0y3GTWHlSeaez3 +th0nvM0cMN3+WQxZpa5AwHp3/4lrRlLef44x150y3Uk92c9xjTJ+elC5rHJ2 +Ui2auQLP986uBgCjenbY9+n3t/Ct6a17I9vl/SK76BfJH2JdzOl+rxV9CJBx +mE3IAr1tsEnDBwBlGcMEj9/eVzf3Wpk/NUrE+rsWi0l+hSjeHrQO4wiD4zJC +M1m79FXBHINiyRwcwiDDhfd8/l0MI9DT2E/XLJEciu/YPNKbFgiXF7LmMrZ7 +dYkIcN3e9N6v0vFanatVPcoMg9Itfn5K6f9VXI1vK8fuJVZv7O7WhvtnpHqe +nrqzjNlF9XMsh/fZ4liAW+w28sley77pKbSH6cDmUYp8mfCGiBjfJ5TnqF/6 +t6OymrB5WAx8ykpz9tYzt51kJwilUOfHwLbl7chCSS0V+sX/xuvq1CiS8RzR +N+0D9Hcd0jIJEOW48CSJyxRfutMNtMPn7JYcjY5osN6+4+ozw79x2rkBZOfy +k0tDSdczG+f6sZBu57dNUeNnvY0QiWSUhree01CY3/WVV+BYNfxYZV+ccw1D +DnUvjJ8ons24DLBivjZjOM727QdqHTi/KXn+FpzNTYw5wVjA+O2UpkSDrlnI +dU7Lyto/8I4ScXlL2cyzgM/N19LDsr5y30J682ZdTPl+7oqiWHclcbsEJhem +5/gotW+cpw30LOw8e7L98UR5V8NfmyyEd4wFHnmxUF68ocXsb/qgv2+GPuwR +WWSHfWXhU0LbJoj5HaQao/J/PyLiP7doa/KViBHZih5StA4230QngSsR0env +zZ7kMZtB6oBfOrK7iouho5Q8axdu1uxf+FiLwTVDqz6o+Ek/N8H9h2zMyhgk +j2FkqVVNeSu7+mZLV7zXDazwUWMXeMvjVF+Zn/lfpGX5IR4kTRmL6qPLz4Ux +r6NtzNvpEdWQbF0K+DBaVAUoqM4Xf0ZHWQDTOU8nmUfCYQCNnywDMU/lFK7f +xPn7GW8u3IUvHkCP3+8LJt4aAbWyN+CjpTkQqSlV9FyrP5nAcV55HbV9dbzd +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 +BLG9lpJsjP5uPtCELgWay+DwBRtP/HW1QRIGB1b66htbfr4f3wH1potYZ0Fd +dKqSkQh36+T7RewZLKvrJsFTtSemFmORxLATMgnkOGS/4SXNiqUD7l7wsK6E +Oxnm8h8KK5ITmWRF09vfRel58/d7B+qrDC1Pz19M8bMt4/2f3vJTim1PaIap +5X6s8eiQABK7FvVWFC0lkcnC1C0ZmMrSgpnHy7SOtho9Yutq+zciy3UxMSy8 +1gFGxM5lt2LI/5qwPev8L10PJnKj1j2YSkTEv44ENN6c7Q1rN0vOOl8JCwmP +WQM6Z17tQ3/2SEzLRzLheAKhnRkSPNWNBfNZTfjkQPkXm56RZz+xbzZEiFX1 +nfdnDiBfJlpZDaBYqu37Mw5gNo0JFiCIxA1RltRdqoj6TPI5222Yv8gUD7Vs +I5Hr44aTKNxqczw72QLuvjQYagS54eHoO8NH1HfJwudkdDcojRQupyamn5wQ +kWu9H9icvbJQdG9Kt6FIgG8fNnSsULrjB4/Y+tm0W/HB5FwA8AAWiEAAQYC1 +pNMtH1qT//mKCskyms8AWH4wFFaf//////////////////////////////// +/////////////yFs6+AD57cgOgB997vAZmABAvnd9h2+vdrzbsHdGxepzJpR +m27K3euoe9i6V27e7Rzt7161q7u4bW33bszfXfV67u7NyaqGjbc3Vpl1NbbM +bdu01au2rY5J06XYNOTrm13V122yrrcSqZF3N2V1hbE745732+sAernfAAfP +U8LzbWQcsddt1NK7Mc6tutc0xUW7kzuuy6uu7ubdHOuudJrNImzo1XLd3OtQ +ttu3c2OsK7rrd0V3du13WcTtprttuVcy7ctud3buDuaxtu3WmtBbLVgu7utu +UlzFQYZjp01ys3UXXa3Y5zbbt3bnY3TuNrNbu11TfNz1re954PJme7jbW6W1 +XXZRtUdzu1nbtjcud1Va6N3c2budpR2tUBVbk7Hdu5HNW3d5c9kWqNl7u8e3 +cPoKNBgABRAoCQDoAAAA0AAACgAFFAAAd98yYt9dXd1O1XbtNLt22K6+fSgU +kQ+gAYIQDd94E7n3d1dV3Tp27wpPd67hturtq7O8N47e67uEChVjbbMwa7Xd +4+gAPjqJ9Zb7utNFMq7prs7V8+8++p97e73dbu663Ve9777zfPrx8a6uyXbM +3cdVu3HW0fTex7V3a2yjwfT2AAAAAAAAAAAd76x67u3Z2dNu7FV699yVJSnu +r2+q7m9vZ8VPu+3fPPXweiEKhARLTb7y32dzt22nX3c73gB7vXmU7dffHefX +eegZAighUKmevvvcNe28Vs7zcvfefQDQAAoFKLvPvN7t5rJM87x3sPfdgHQA +AAkX3y+9ur6ntst5avnNGlBSQAD7nndh1gK5a++89BpIAAAPu+vqrLq6Hee7 +25ofQKAEKR76efMc26dedd7HQAAADteZ53Lm7bt5757Wc9A0AKA+fN996sjL +J86Hn0BokiB3vq75rns2ubbh999AbYD7K2ffb2bOs6rvvQ+K873i7o+XRu3j +t7vbu3bmK5bXpr59CSAFADvXuAAAB957zR0b74AAPTrPvnq3HMybwAHkAAAA +DQB9G99hfMDV3r3r2TV2XWZtYA7O5u6t1d3XO5zddroyl2ZXNuu7rK3W0tzp +3W1fe+LxePuNqzt1q7ze69m7uLU1pazN3Nwc5GZ3V3ZXNbDulWmzWbTOjrRu +aq7rCXSW2W2dXjnLpJbehbdtWziDuzZjLWZM7ubaqdqFrttzm2q7Ktba6663 +SOxFS67W2zczdKOc9tXtNj0NHPbnt5t2HDhm26lq5dWWLZqbvHbt6aO5tp13 +e2Habzd22Nts7ep3epqe7da7bqTbo7WRba1tbndZrdu3dztzdTQbbW7lync2 +WKm27ttTbdOmptKHVCtdx3Mpt3TO7N1qdadzG7dcUtt3bCarna1Z2tlbVduV +s7t01qyu2rwPgBIAN9cckSCAAUJAZz3zHM2nd2tdp13Nq2052reB3b6SKz07 +gAAAAAAZ5X33N250rAvA+gDnvM20+6nuj4u5gdAAAB99751dSuvB5fEfe9ub +2CQA46ffbbnI8AAPQABvrDvfd8iqUKAAAAUACjn32+u1ra3lLe697u+wFHz5 +fTNfWzvetbu6gObvcJNj27evc7gAFvRGzKyzW9Z3gAH0ACgAPvr75rm67FVq +nStmxpsq09Hol1rUuU0tgAAAA8y9vba1pe9Pe9wAABenW9u6Hh6Ol1YAAACG +Xstk9z3V5MAAAAATeWvaqdXg9CdYAAHuHvO5qzd3dtuj23QXs7tzeADQ27gA +AAHd3rl0cdt4AA09pgAfQSAAABUJve2+2nNW68AH0fQJ73AAAAAAAA+9OPbb +tbHbbwAA7xV5Pdczq7x1t7Vt7btm7vYt7uA3ee2d3XMrrum3de3XqpPbrbx0 +ude9bPcV73XbK7bls2stN3blsbrk4bpqlRTTa3O5nXZu10dyHFYDqttVVUbn +RXZa2483o89lLVku6GWdXcO07O2xu3dtRbszOd2d13XWnY5Nu5djToatqpV0 +3aWV1S7ubWtYy1nVu7VrKK1qdctw125rduXWcy7YTu4bNrbFtmtqdMpXY23d +2tc7tLa27m2WNulNY5213G7dq3Z0LFnau4rWnXdhu7duM6btrCQujW0MO3bB +26jp1OxlzVq3dTou3dqu2k7UWZd1u1uzLrbN3dkEuO26G6Xa7umxomx3ZTs1 +m11lKd1xXXbLbp3Zu22TWyrbbmdnVudacLN2uHV1nFy7abXY6W1My651ttXN +aql3drXZ2Nbt2ZbTt0rpU1bZVu7unRud2OLdbnXA67W0u2ru3VpPLXPXBdbW +67m1bNsXU7V3cu3d3VWMu5snNWmVLszZa7s2Op3S6a3rjzQet3d3d2utjbY6 +O62oprHTt3dru7bpdruSW5p1dk2N2dc7ttu2szrtu7Wdu52ZzMDbrd3d1HY3 +bWJYrJ0wlNrc3btarbdLaa2RblO7tduu7u7nWco3TXO3Ucq47Sq5qzGapW11 +cXcR1a7u12bdHNnc7u5u7dtu3d2qtVRrct2pxrkbKba3bcNt25cll0122zVb +Vdbs1czouum7sx3dlcDXLXYtNRubdmndbu0WXYsbm7XGldq1sXdt261WWnMb +rO7uh0dtca7HWVq3XWN2zmpXZWc7aOgd3O7m9Hq6tLyp0u7Ot2ca3YwqlToV +W7m25Vds7bjd3a6dotqdO260d3c3brZ23LnV2gOx2rt1tptsdna3O7dli1nS +t25aJyydu2p3d3W2oZFbiLbFu53bZs2XXVbtDrKVu1Wy7l2diuy11xcN2x3d +11y3O7XR1tubAztruZu3ZU1saydt22W67h3aRdMyNHVW6ltxdFnV3Jq02jcp +Y5tmynVdpaV27pM66Xd2dUoaropbtjrcard2hu7N2ymbuarna27TSyLNtdud +u7Lt3dd21XZrpd1wm22stjVc4a1jbbK7tdt3bu27pbtumdS7ld3VdVu7dydt +nWbubFN01d2m4rdzm7DV3e3TvOjG6t1a3Z1lo042rbW0y01sa2jCrajrrd1U +7tTnWujOttJXTk7W103aZt13aNXWbJ3HbbagrR3d2c7qI6bZlNts7uELpmzN +mOl1tSdrLu7t3c22q7jasp2zI1bddd2us2trKtVuw7mqrbWlsc7ChTudxq7E +rnbmu2aW6rnOu51zdS7iauudRa7u7Z25Vs21c7ddcuWO7bmri6cmitGu3a5u +2uo7q7tdy7q66srNbhNto26blcbtWzc2dzdaq6ztzObrmoqbt22x03Nps2u5 +21WOutzOtulu6trc7Zdttu1ju3TUrHW7du41NslbNnZu7lu9vd5nHJVa7Y8M +iAAAAAAAAAAAACnkwCYBMAmAAAAACngAJgAqfkwAAAU8AAAAAAAAAKhkQAAA +AAAAAAAAAAAaAAAAAAAAAAAAAAAAAAKep4FPJgAAU9TwAE1T8UQyEAAAAAAA +AAAAAAAAAAAAAAAAAAp4AAKeVPwAAAAABTxVP8AAAExT0aniqGRAAAAAAAAA +AAAAABTwAAAAVPwAAAACp+AAGgAFPAAAAAACqf4AVPwJlT8p+ip+VQaZAiIE +AgIJpkmJgBMmamTJoBo0aZDTSZkYmmSnsk9NMEEZPRkDU2pgaGjJoaZE2QZA +NT1MAaCZoAynoDQno0JgGUgiSRBACAAIAAAAAEyYTCaMjBMCADJkaGTTTJkD +QNNNAA0aNNGgNDQDJoBoYgaGg0ATAaDTIBJeL0m+Ni1LDCZhEhQT1EfsVpFn +zceprhx2LjfjLimLqL7Gk9rUfEFqErFXl8Q7xfTWc33OS2Kv96RT8IH6WFBt +yar2n5QVk8/EtVtlLa8z5jkQx8ev+QSiADAWQYAIGDABg9uFRQhTIwZFlqnr +vLezohRTTQVUlFUSUX3lwXBcFrFixQVGDQFrNpGwUUUU5BGw2G61oXEpuC4s +l1xUiU0BcJMFrhjZqoUNyFi0tRZoos0WLNrFVRYKbJCwVRRYbrNzJclwXlro +XNzeXXRuuuLXEuLjwqgl5cJgIFQoMMZJCxCq51UUIWbQkqQqUVIyqlSMIlFU +QgEiyGwKihapaioEjUlVRCoUQhGUUVTRCIiSVGqoklSFMqEYkgEhCEiSEkjI +kkjJIEIwiRiyAyJCMkhIQ2D13G1Dy27ZWR6/Bz/mugvyPX4LYrdCtV4DYcPt +zc6efdbpjdsE3em3cAbtPAratJ8Iq1fcVnMRW/N4OOIcRYEkcabmb24+W9F2 +6997x3nvEfvv98vO9LGOr4n93d+aDu1bRDLm9TPkZLKAGOF4YbspfmPYA0TL +7di3X2TkwrpDP+05IIWMmg3USyCXUHB7MSbRlX7Zh0mHV71n7fvsSETcQRKG +lkEVQ9vwXanfa9zUF+xiZXypwjmwlSH1/jZF8BFN54eADh4JylwjtQnWO9MT +Z8UY/0NzuJlN5SC9+32S21h7CI2AAB0uv7Ig7lr/YrL04UkdKKhKFI5lcH+S +38gDgIQBpEmEBIMBeCAgGADAGQSEQFjBBJFSRFJuFA0RUWBGoVGpUWRkQVCQ +JKiVCRJ2XD+m+P6rxvzP+H/fjct0XjsxzJIOawkkanmKqxVJIMiSDJINRVGo +ggyDUakYyQhKKKopqeNxHRcb7Z5jtvgaLvOL9n7DxOi/D0PytFoiaOUVBk9V +EtGEhLRqAKSSFSmLKKqJIVAVGviaGe0xO8JiJKsQgQksQaYVRRai1rVZ00Jy +AQxEQw72tvJ+6PoP1fJz/Tr9RwZuA+c9l1PyvqvX+x8Nu/U3c3HuzIQESByP +Te+/n+z+XP9/iDyM474+PfbnNmVrvI7hc3xJM+ZM/LHZL6JL4Ff2rnr6uhEj +6TBRpZdGSBJpo3RJ4KqIQjGL9GUR+PQIlBCRISBDh6qPM0VJ105yWVFCRBUO +yp35RsUSEkIQIBv9CCtogqG7QCgICAnG9XQiWgiQgoCQipaALRA80RQXhSKq +h7c9rQPjYdFF6qKg/v7SgdD5te/noIv9fDUH5SJy0AwwMma49J/P9HK3u8TX +xDmPT1xsANQQPqRP1xfvzcIZ8PWbBiw/avPTcbXl4cv/76NvaT0M6TnOJt2H +gUcF6nRW2Cbodx3P5/f/O/1w/ucb76PgEOg4ivdarh7BvHqe0t9/MrWxPG8T +T8Pcf0+f8rg4bCop154NoYAE3dRXC8kGAACABAC/6CAltMYCELG6OxRhWU3q +kP4wfdKiYVLBXN92hfx5wkBsCjuGgc7Oj1IdUL4IAAMT2TIa8WCEFzwqmcOA +JAYFGD8gYDtEhXLC3xAfHtISkwt0BgskVCABMGBzPwQAXfHmE7PXG74VW3gR +QAwbuXznQPVSpGL1N2xH7AdxUAFQ7mCKh+6On8f5v/l20d20o6TbuN/n6Xhs +D3fVY/adj03k8IPE/wfNfMx544IHlT+P76h2/3C9d6PxvcIAHwvb/F/E9t8v +/y8/Kn9qXTV5G6Lp0TbgzQsJGxREG7qpqIgObUUbq4lXVNQUOnMRSIeJqxVk +pXReKEC0DVupSc2Urt5EIJW7FQ6F0Ii0EYiTaEGbQRNWJNqgaszSpFEPMWnE +RFA0rmSKiHZ4VTdxMUaIdVI0nGBArERMTLyYlPOMObeoIhCHRdFyiIKprFop +PcJyTNV+B+X7z2ewBm+t+m/U7lnp3xPggEr6EDTnzWWpiOy7DgAQIFJKYRJh +X5IAPqyuezZDwAJ0QHjUKgnfVwFRHDAAQLSHErJHHUcDZ23VjRc60EFJKB4u +rN2GZV/WiQsACA7geHlJz2ewp2GgSOPlhLL/LKtl8XqJ7Df7z4099wddN/k0 +xx13+9h5zyeLYuaw++9vyfs9T/bjxV5dUUIAKByACoclyc5PlJylpV24zDgm +CsJMBgMOEwIiqVEw9kKIkmREsRE3NU5t4eIdOC9TAiSqkGSVF2rqpkOKNyk6 +KtTLxbpXYh7Kk3CoEVSdzMOJLzAt072IEO1O5dIwoqZkmHJIciwgXZFQZMFx +cNJcJ0lMpGDVuJuHdW9Vbl3qQIREJGSnSdFxBDpnqQqMQHEuHkkmm3/cfEL1 +3kNn5/keLTTVbN53PmKcIVIcygYpzEOX3iYoqEpStCLualAi6UUjdWrMs5EQ +gnVSFNowrhUC7oWbMh0JhGFE2piYUShVy8QphlIuC9QgpCuk6dPLoSZhByLI +eKezSKFw72klT3NlOFap0ooTBtCzTp5u1BBEiRbm07qYcxEyopXdOjRFIgqb +VFpUvJc27iZlIzQ2/3+Z2+0+rb6fA793V35tq0fhd0xHmcv0+7e34v0OF7zP +918/HL15LmqE1ioofr5u3IT1G10O4eO/b7b3l6/qj9vcfvbXxl4PyZ1fvfq9 +z8S8fwf9938vuNRgFP8zO9VwfpBARuB/HSKgHJFh/Ldsmj+5eCeo5Ct+/zQJ +8b0VChzOi5XZ9jBE5fAAF/5ur7TyHwO5+Fpe+9Fkg5PV9zb6XM8BzXs70Pkc +Vp9n4TwP98t2HEcuB00/bli+783XsOdpB6rqa6rwP47h2XvvV4UD9EOE+hx1 +gdlh2kOi9t+uy1DS/q529/ZeB1HgwKRE2vzt3hX+y4fsWG+X8V9o4H7xHp/r +/W/E/Yea87bei9n8dv5ux9x43HTPhv6e6fawPOkdgWy6OZVs4+Hh8IjDMdmc +tqv+B4BGx3AWe0hOUCoaAGceNSytsoyLc4gAdjsnpdWijo+M2DdhRQ8bIJZC +2NNqr4gBkunWFgmyC7g75bQcYHgOoNaBguI+LygMeFGfC/VomfFASWAVoWwQ +PrfDa+6lw1/gTO1hR4jjMZCkf48B8nhswbj9lziZdUvgSnTZpcT/nEysD74d +gsJwXbf55ny/HYFRQ7mee43ymuuN01/U/L3a/mtq4TUBdkqigiJJ4GBkWrSl +99vYapho8XhZAj+Q85hQZ1AAAgASrtm3cGAAPoIXVx4LAm7kIbGyiruQWWQV +Frq/EGPOJq7gUyIXKEkf+DYnGBmxaBwXUYHNdBYxBBRUFCtrLB+jCaaSHVCO +nLWPDeNoHGJu9nO6FgAgWhdBL9lRVq9jWqqCJFXYC9T8a4FhoLwdUUaCq/sx +199h75pRuntNqM6FAQguhHrc5WIFGpZQKsu9bN+HAYaxTBIJP4dZfPQsCGO5 +oCqvNO6Bhom+24S+ipNDl5qGFmSoSDekfMEHBzGAEAZDx/pMFZBsGfEIBthn +N7ikAdHQZuedJEU/U2h8nK9qQKtQdZiFLWKuwHXucr9IYBwgwPGs/nBQlKET +a0pUmMio+I7GANTrkDqxDQSkShMaHK1b+gwmds5lC19TBmXYF2IvKKxlChoG +FzBI8GBtGUkb58VpUFIIABsysyHxV+vRtX45ji1GyKvsQrw68vNyKARy7BTa +y1NYjeuruBHnTyGqwjvobB/B+kENHXC4tzshrzRwskF5CQT6gWSlwRrBgBt6 +EZQYAI6mL1I4UXXxRWWEXSN5/YLhVKIkTJsnQ4BUd0giD9fbdthbgjvuZ4a7 +8/XbPm3Ow5FH5P6eet7nYeV+n7b5H8v+fLx0zfSO1kMhwSLojoM0y1Wz1Lso +WTHWsef0nsWmrYbFeOcDv4iQJgLJFst5xgNIQZKDZMigKwtLOAlfmF+4CS98 +PtyrzEYtnHRWDjw0DfApb9BthIN8wYApi84VwgwKPmf5ELAuz0jkB/oXA95h +O3dWgA0BcBglkGxm7xx2g8ZHPjeaqxWuXA9rGSSQYcoDz99zO0AQPtwYaqaK +mDCeUxyI3gMCrBgAgQAfD3JfidIYAugxH1FZnXHvbrzA8BqHgh8s28JFUjly ++ELblcI20Iyy2KS3w0BeWQ8i9l+HDQMuvJ3/XidJxV1dGmBL/LgDj8l0rSTa +RWhHh7AgAFynFoUAkTENeXi1mJAfo9hZGiuKr0+GIAIAMA62boKRcxjWw2+8 +A42bQgAB9a0oXxpS5fMkSIksyMa8fR7X6kvTcbkeGIx4Z6fJLVeKlPyQeZRp +vENciQ7IMnBo+pOJ+VT0/c+T1fU3+J4CuB/3Rf930O/eUt0eBET7Wx/wtsXp +fU2PZcN+/c7tm36CBkoAWfOYQAYxiU5nQyyosyHcgQIBpyIuFSukbYI8VyZD +wNfRT8MtESobvE2bEsFIMzB3FDywDK9HyIDAPu2rjTaQBBwsBnyLTqO4qMXB +ALE9KKfuRnOqiB2MRUh80NYcXAwQAuB9sgGsPBgLCde2ou4qU8xQBqHjupyH +VkDpgSJAoKmuEKAdCk2Ge4MRBYOKp3TfnS7EANnCVl+A4g1l2hSyms0NAlhE +LWWocFm43maeCo5d0QmgbXzrL+x1UzkEKIyzpCgAQAIEACCM9KFYMTFS7skd +zLqiH+QOt4w7e/UEsIAAAgAQBUp+TOBL58eFQ58UNzuVis/Rcca9J8JtY47o +1IRhdXqE/Ur4EMsjYheS9IgJXic5NOhRadq/6Pkp4Z3FpgyAACaCTFZ+nRpL +GzNO3HaduSIGth3zmOFwhrPFYUC+GdGUVMMTdyyyZaZxezWaxNiKHJsIwAXV +BSbuNc3ihxgoYIPr3VQbvl0HG68nJJvCjC2TdzRhBPQXV8bRMIesPZe2qTRb +/hRzYm6vdxLT9dzHXokGFuzy7kK5YPe8CZGwf7WywoLXQWaUvVPR+H8Y+eru +WkEkOV3BSY+3KEexyQd+lFGtheTg6v9eqR5rNM2qO8IeYtSzDnImOL6f2qFE +57Jdku3VlUg3FBcLLLgqOQvJGO29wQXKEx+BaYv874a81NhJeeeQZ3i3slRx +lEYCd2Fh+8qmoe5Fb5LqToyYAsaEP+HRqMjnLd6qewnqI5vN5TOhBuNGO14+ +WGojchD/FR/C3BQZMjACor2gAgWYEW2TaRA7/L+uSEdS4dXbbTscZYeZ4e2e +1/g/BAgE51NeWdVcAwlVhI0SiUAbmcCF4FoVyVA/xLbO/9LfUNS4K32aTOmZ +SvznELUhO70MaDA1VrBh8uxzoY+NuhsOpjrYQ9xIAJCAHaUhgeEZXUXl8Flg +JJT87WvyKkGIqDswaSKoZTaJPHPKxEaK0OuzToLCPRYGs67B7xO6xnE4+eRM +CBAYO94Dru0dF62D8QpXzkBzydjmkWupJxAPQcIzSdqMUp4RVYbGqITIQGXP +FdLdROQGAbAgYGJkVnTUlYICL0E8qok/rN4Kvc4CyDe+jz94keWWcVLq0dj6 +cU0z8As7BZEFpWrNaRoEzdHs0vipaTk+SNIgwy4X4OGWRmCqq8qda4vrz2dz +jG4fu3PhTc0IP4kteBlPTmipuK1x5S6YVAriW22dzhi9ECHMZPg/JNhOq9AM +FV2+X+QLCMK/QiioAAIAEAuyWsiNCbwUTAW5E8w1jsARiy6eBeYesMm10AXs +TNX4FlzrB9qRiZYz58XTC0yxrZWcq8tVoiN+lrg4nVeljLQUIeKm9ogiH+hM +btMAFgiiLX8JY85qrG74p4sS5SXtGryK/iGBWuSqzMKztUerVAgN7t/5MpiE +ICX0fCRGZlXANq7/PK+0XSxz6gfycjIy5LNOlJ4od8tHMLZG8yCWk0okgARm +CNUH8j2gsEmuATqdNrdsPZXVfLNMmVIHQG6RXudNu1xGdXCeNRiEOSKvNGR/ +HxgyqaEcym2dsMQ0INsrjs5LOgCb0YBGP7hSl7xUZJLZ18WLeiuC1Ck+1Vid +IvB5gl8VH/B+ZgAAF5/d+cXppbJp4zQftQ4frsqLm+aEYGUJ5iPF/CYyoBGL +G9Lurp/JFnd5+LYQYb4fHCgw54gqORjGhW9MWfnQmc0Cw/onqtWVpjo6vNQL +dvLFp+tI3Pv4euWwecFOzRJeFWkcPSyhfUCZSJDLrEetR/b8CiXLrhGXlCpj +SrHWvxK80PKRBn1HQ7QcCuXbUmitPwl1eZtvb5JxCE9KYzsuq4bqzbQYEr5l +YrdLGrTQzI3MTohTo6SZVXMbJUXQsphwlZ2kwGWXrCZ7bbuFe+ZnPwMglu2M +SY0KlTDE10idT21tPU/o9cYmL5/4dbZvd4BYpWW57g/zDOTalPsIVWWiYLxW +X+PaWd4Mz9p4o8zwRzfXnfaNOJvl7HEE+7NhRddCuHdfRT3zqW4lxe7GIKcc +7aayRWJ6j2nB8uMQoM40QWvqx5z0zDnCKSa/8R0xavymK5A0wW8Mceop/tDn +G3V5nF/qRXx9DBHDbbpDI2bPui8hAyvrCKIl8Eh1F4nVFSxSK8ocYsXzVToi +VSSqLSpujFNwAWxn5MVZKeKWQWGVMV2daamwABzSCr9dETvOLio0zLVDAzsu +v5MkGhj4ZLSzN0wcP2wUEpfe0LZNen1CIIt9BR5WVAK3E8RdrWHr4PgTNy4N +66yb20VOYVvqt9CL75lmZjAEZAkmPsoJ3W8S6RiYZY4W+jvWR6aGNwx4hPS/ +Ef0V3Irm2NFWaE0fZQNjamZABzUpzHgA1lHebeYqyJJonQVH2iUdDjEx6EGY +OhKyAIJsLepMILFMOBxfKSPhwLb3GJSyKUTAflPKh1LFimpKF9TcODl/Vqf1 +qYlVof5/Q6tw7UK/h5Ny/yCBAYOqspps14Z/Sx/1UKz/ZfIy8BugigJWDyRL +ut7gUv/vvQt09WKwcz7AECYwYA/L5hMkwgAGh7q0JgrNRYpQQyfpgo56U1RY +CXiL255CgTE9lZcireGzjF+WzRybhdLETAN9K1YNIbfNOgmk+F5QAV9sQP44 +o//RZOILABTwgD8GBy7wCKhnYMEsqLqcbImNgX/jnQswiHQIECBAAAIqStmF +bJqdMLHdRP+WzlxQnkMqi9ZKT+9vvEWW3xyMpo5QAACjlGOJJ7YZ6zX7Om1Y +fGK/OwKbpDv0crne6HRjxbyLSQkl0KMP1GoVTgAgAAGgGKAwQLkzoMVjMysf +Q8ECnxOrxFaPfC0PBAILzODXKGAhXqbyUxDwVyY4Vxezw0B2bZ+QRmm/+Xzd ++/BhwmdjEAOvKW5J7B1L1aNO2/9tA8EnBvZeI379nTezy30fPKoH9egpVA4j +UHLfF93q+byTfOfNn+htH9PWfe6/wn8+6qT2/W7IodVAncTAAcPIrVJ83yfU +MckYAVB2ey4LX+LMcbpWd102GEAmGhUhWo3/LaTikd08vJQSRReaaqt9VAx9 +4k0/SFR1tsTkiLkDw8YA6hyV24MqL3sk0ReOe7wZC+R9t5qyNuyGN1KPauIE +Lhj1GyUA/t97eDe0EqQ8/VXpdqL9UFsLztJxhP4F3QzV+Be1FlLTGX7yDu8n +Bl0f8FoLcNUDGgzhdiTajdEauhHLb4R5vKkr/VoUHATyiiszEdqKQ/4jng46 +OkY9V8kYpNK18xTanQ9F5tqeCISH5eYnZMlGhqvv37h8axc8LFWd1Lx1rDEg +K1asVapRWqn0UudnsqFmDAq5RIiSWiK7z0oH4YxKjNQF7rlVIM+9mhilqCeA +cgYAIBcXiLN2Ywi9hacAKoRRCdYKcr7x+LPAp65A5zC859PWlCl7Lb5LkVwK +GVCpP50b0wr5OOukAklazaZkLjI3p0sFgwOHKgnT5NlpinGf/GJ/4k/TUMrZ +iaY08qAa3vSZMvdZjjzLCwL4Gqu7wM9JJyL3+ZdPSvdLOwKBPMUfFJ0C9dRn +gDiHNNHKIPmeTsPsG5cBF7ffVaBj3EkbzQT2LgIqUOqdL7PA8vvdjEVHVWPK +/6hvQNUprOAZ26kxPSJupTMJ2MuP5SBD/pNaQACI4LrW4P2klWn+lcCSYOTe +Fs+IMqCR6JaEL3A0OfN4+n5XH9WZo841LL4QPE2B9u1tBYi/+0d5DzISTgd8 +2GRMJ9fXwi6bOp7f4rY7qUVmav92uY87QnRY34Bwcl4nsqelVKnsNB8EFjgP +CxYSloMJbZjvGyp0CsH90CGbpTHvbo6UVYV3uLvUoWX+N+sa88UqGbIqTiOd +zJx86exOaKSbg8GJo8hVy4r5aUjvh4sVEelxHVBQdPnKIaPhCjcHv+sCh695 ++gYCtxQHiFKSsXCFbaDB2Huekz61m9JZGABgqQ/UOIZquXgMRuE70TaLHwsE +JefXnUkX0o5PTPV/QdX5GFuiO5BpoKwwFwJAnw0xLP7/5xHsTEk3UBsvYo+B +BOPc92EmJlizD24CjK4scIrdevLQagsl2g5BZwNpK0BlHsSTp2iwlzXOn3Nq +QgI8VUb/UvTwwqSA885iWW90zeWxPmNQRR819Ybn5Ceerv9eS4mqNOTAZN+P +TQh/D4t6OibFOf5xU7364kY0SAT5zVk4MeFTijL9NYqCBmHcaxK2vldTVZSQ +PztnJBCP6hQaJeeDb75QwVMdt2i7S7aeCrxJe5jHBhcFfwhAcw8ohwIAACay +hH9N5U8CrMieSyVCZfZ97ekP6NGo/qWYNRKkr2oHMDAbnHswQWHVjiRXHC63 +SCSz9Dkm3BwyXcD/Md7i/cYIQp3doBWGax2tEANZpT5onRIfsUA5doEkVaCU +PuCFVKTf9rkiKn4CLAMwtrKhJhuVNPgDu7Ejavxk0QiVYWiEJT+vd/Z1X2ub +/X1/g+I3nzn0lRQ8iCJuHOWVFD8m5+C/Lt/E+10fG/48P49hqjbNUR5+70mT +6xaqXqQkl6MD6gTuMQgGZOC9/N2pi4Q9HvSCG+2un2cjeBGhk9ZUZ/pBAenN +OoDWwzQkFdz2BOgDaD/2l95HSbj/xQFVtmR3hFKwm+IMnZi6x8WP9IHHGKEh +P6Jvf1JPOZ5W/iwjpfqwqibEsDkeP2xM504SkF0JtawQDD72beTPQawD5jQr +LFIiYGdKO31BJh1orp17dOUnCf6meYSgXDaVsK+1AXcSq3iNdBgSJcO3PMas +90aggG3VuqQ6kE8h5msP3RE3koEsFRV6N0MFqgcSwWCtqe8Wg2bk/BJEsKr+ +vkVFBa6JtsO6wXaRhbi+mDAiChFUDBX+P9jdV3bJ/0e90WR/YOAYm4LiWBZv +tUIS3tEfVIjAHUM/UuEozPQYutx35C6Sg6U335DUnONCe0uKOfWw1JGaDAQI +EC2jJ5Wtlys8OxDwAQD9yPYs78Pv+D3HGHqIHhv0bV4L1u8czh9T8DfvX3A9 +xEfo6fu/n3A9j+vpuG77w++9niADfonx7yi2+j/whXn0rr3VKMcWyOJ+tSNB +PfFUNhsb35H2bf5RR5HTzDZ9UMVjy/Eonxu7PUhOC3K+q+qthee+UEbfOYmy +mVApiue1EpaJq+Gf5JiUiSFOBdzpZpXc5w59Nvd7DC97KZnU6SA9skjDFdWx +aKnZOSo9k1jmQELf26BoJ29WapCgIEyS+zQucF3yjpX02nLkyKpEk6D/LQMH +bMbInSB0n+yd2X0if/XxGHoKs+h21sWIQyXfsZj2TXsu0DjhxPso6QqVKMGk +mWIZlWfzY0jqv0w1wygxEgwB/HFfvvuC77ESfksogAcEjPn0zvOrfKgmhjQ/ +407M8hYqC1QjAGJ3przV/u44tPFR/9r/wRyHfHYw93mBpNsbsTN5fB88i8r4 +5hQjMLle3PUtYPXd4CAVWwgRvvv0ifBjn5l4kbyfjDAVO+BIykWdTcUINDRJ +mWHyq/Lezu/90lc6yKWKWbD7Jp8JQ3QzJyjLkCNNaugt2wTTCNvYcly4jX3h +a8WVHcysTdPkSfRy6YS2j1DGVY27PP435gs/zBPX2P0t3+NJf4fXTb5z5HvD +5TGMIKXtoHT3MX+eAxZjBuLUpPh3Tj5ujDfYnq78UVpZkbgWgDG6kio+bqyU +0hRbw6GuWCzEc8PoQf/B8g1rvh4um3xhumAghtNVvNsdiAgjQKrhSyvkw5kY +aQVLbiGfd++VvON9s7J54w87bGyaPVR2kOGFfs7QHUGRjCEDEemGXNkgioDs +sawxVonZRZzjtI9SJDs3F10TD0cfwSAWwUBr52Sp+J6JcGq34RtFk598sxyY +74JWO4rAnVSgu2dGbCbSNh1g1x15XPzQhsQsHJas64dNK17W65jusVwnisRS +t6fJ1cT3JJeMbKYvyow4lCFT5z8iC3YPqWyzEPJ14CagJ7KF97DkZBDPSzZ4 +ew0dk9yCtqWFKBAmyGwOK91DGWQW3AFHpMFwuUt8PgTcsNMsSe9XjVX8H5cX +a6YoIMBgvvaWi+4tMMv/8++AbyphauoqpSBJtBeS9ZCeRsCNCYpijrq6/7WP +hfSHkHYlnq1dowdpdrDB1O/MxNRK7Cn3AViuEu8Ga5mEFA1r/0mt+zH5hPC1 +Bvn9OnlFa/Ie3sLWdeTNRuiVzxj81EC7ybdTvdAUNstkqA2P6fp0+1Z2ryvZ +Wg6T+4f1USRzgqZIXK7Z1P0ZrfmU1p5p7QFS5nPXJHeCtEt4ufef4go7jdmt +72kNDSB33FwDfY0PIwMujSQN88cQNUgx5WscaXJDAxT/oBHHf5IqLUqb8drp +rtN5ber4VKIYP2pY34AImEN9j7lEzDyDjacYbvc4Dhl3NOyXK+cBDHCNiR3a +Nwtxb7Sg16ec7goMxZqz8mM9V87cLc6U5C36BhDfY6NS+aVFMtiOQotigu4V +9wipygAta0B5AG4mY6DPeUXOb1cwpckk0j3CRpqsMXh2TZFvWQ0MqEEPORS6 +oWicfCl4rG1j/zPo1vvlUb6GjqxSZ5ayYLJlrvsCnRcIAEAEQYQAAK9b9u7w +xHw3rVU1QQiPw49F/pUx/BVygZdIh0Pb7Je5cODAoGJBgXuh2YH/IWHB4eAk +qyPEfxWWXN2BpzSNDgGp3RfSWSGwNnCn+oKcptKUQ0wBaTvw9ILZ1B/Nrb8C +ASQRLD0hfjSa6phQ7psZAL6eqXOIuxN1j82P8/xBqozy3JfYRqwlnC1UsomW +eOTFJGBL1CPdjlQ3C73u+4oktaXTQQhqjIECU/aL7Cy2Bf+N2ukqDbZTgel8 +sJUsD3gAACd7PmpwnYTysbEiu7dy/h1OlVQ1u5L93hElo5fFUAkC0waO4gT4 +IXRQ7coYBhMIFUh4YDbMQYAGwSgAADwP+H0A8nqLrjDQQFn1kW7SfhstBSO3 +Mur9ZrGNFiZf2FwRGA2sGBcUDsF0goRZVP9zvMvH1X/DfDptcIQCfKUKaYHO +hz299hDitJuBWbDOt9R2j/P5XoVi+ArL6QABsiCsKW6Tx+hYHAgAAEJ3CAgA +EjBSj7pDAAAOcGAMPgWEggQFkGng2FAiwftQkECi3HDQvvBYWrPDwQAGgZuA +NWGWj4/5a+xANGeQdX1zh+O4mx77hxUR1OCs+Coj4buPT/6+RxXVavP0NZ0n +C/C/H2vQ/P/Ppuu9Xqp4+GM4MGAv2Vbhb0AehwBYGCLMrv86V1Niezqb1bTN +FCk95/UuA5AwAHEMkwhYv7kevB55AOBsGA2WPs/109c+3p/D0FfAv4K4Z3i4 +JyMGkVhX8FQonybueSFK0Dlj/1Xr7uBjO27IecMPlW9KSGbJ2wocUxFVPxfP +2qr8R8DVnJTLBKOmrWHIyy67k+JFEJKPKhbpzTaB006fSaD90fabiIsvgI7h +5sy0MhYRySIZ4arzurjdex1U1j58lzs4D9EmyG7wr87zgBbqzdpQC3WtJRHF +8eqjJLi6KW8NVVxiJPGU21rIztoRH1NuSC9tAWlj/jp67ha/mAKbT2ann1Cd +Xv3ARbhsMd1LSzikMLzDNGU6SHVYcoR4xmKoQV3MCFXlYNMEN3DvX7KooFfe +X27lFf28e1hT0qNwdGANbkF5zZsyBzV0TjaUbWOAkptOVaLPwTuhtU/wbzEh +iztpo+ESLujA1gH+C9E+nNhQkLfztuv8ZouAN2G8jcMMODq7CGCc8gJrPytI +f6DoljD04EjkRlyBdwb7BdTNCtg4PrJvgNuQSyo3CmLNRb1UcRgIfluhsITE +rsLmaXmJlYb9oREFCIw1n8TXTJ+GHS8fJ8K+Q4xTUp4ejzP+fCOUw/LFjU8F +OIdp9KF6Kdtwx9kIzquvyLgH/zarFeHvmtFaO4Aw3uQqDxCkpTAKgc1oJkHD +7LiPrNmmoyEysGQvcDdqRRmBRv+U9j1QcZlZ5VZUSfwxmDPDhyxR94X7mx+T +yyncDZx+bS8ftIsJip/UxhbX0tZVa2QkJVEjSpjoUvSCBAT4MAXHu7DDETNs +wNLYEctbvLAkRWibE/veyQmrnxeOFMLJiBysmW/BepeaijwfW0d3GnBn4asv +fsjV2jQagxOS7NgZOEpGC4WYnT6uugJP6ntbo9qz/xWdqyrJyxpy66DqeoQ0 +xuo/0LFYg1JGHO1+fU3WzBrRZzsoakbtpj+ayA4bXAAAAH2YE8JBUGkqY+3F +4XClAsqk3aoU+FHh+kBJ4SztcWYEyNBvQ8AyzQaUpIAuy45JSRYwHiU4pt3z +z9XmPhYgUUubkFPsYa85tJO8PcXi9DCYIDVuQk3OsAUAktZLkIAu1WAwGs7Z +zZ9kRra1Xk9Y9l8a/MslRgeW/vTA/oO1dg90Ol7CFFoD7wYFkgYR6XGN4kej +gAa6qGXHppl8rzseMv3TyU6vMpcOvXXJafwSa84elBeALI8WkdG92S0fz6hB +5WB63FbN7kr40AUFaUztq82KUjq1PgTkiqObLpJ502cLlu2rp0597QwgCRGi +46E/jrJAIOZi7px11nQWHlM8htY3nXsNJmyP/QndaawS/ZQbLKKWnU0mbYyF +BOUuWALhmCgZ6Oel2FgOVQrnSo2oullfqjjRipBgLoMXkc8qgQpCQkHEFayM +S004qiWDNXdwiN+Ky7NVt6oNqPDjHOvO43o7kGamtjtfUWoFofJOUoe1R787 +lUAoIEBi2UFqsBdPfLATW0NEkz2JB/tAg4yImJRZqNwNjSPx0snVS/YrcIv2 +y/K/YfE8OK62IYzj9c/PvImLcfW5YFnjbzUumHqKYh1RP+KE49q/vQoK/HZ+ +XnLuaIICUhf7nJfvujcjX/LMY1z4mZrGCcTAr0xShPAsoKSCMdxVQNgB9GrJ +6apG32zXT8I5lPBtj9dC9bDLas+xnu40pRyBT/r9aBCbJYI71yumTJpU7m6J +Khqj7oTYmzaZkmtmewDYKpShjZPusWseZ+sheMPA7lhgI6WwvtIp/2+NjBa8 +Z0+nYYwFwb/ccOwcz7HJgN17Hu0fmhBL9TiM60VrMNPjvOE7sLegd213jP+U +j8TBdoFjvHAQt7EABBBnXhl2dbNiiy4lFKATsXJhSoO3hEY5KLFN1jpMorrx +cXPSxwCDPYiY9TZxqmmI2upROYUhHSmt93YD7kL8KCgoDsxsiTSplUWEPLtg +AWaDBAOFt6Z9G0+5yo04i8/EkmM1djifIfrSx2YLxETGJ3Sw0CABAAgDdNCW +EpphQFuVvj86B7YRaohxOccTowSpMQTr0c4prY/QJ9FXYvF9rMaMXyfPp+YZ +sITM+DOMooIDbT1hBJ8/94jejXiP9d1YGzJ2WKutFwFlisaJ4Q1zj0aSPMO4 +zRx8NleTARZCWK1G8Ayi4WT8udriZDCkfIK9/lN9FCsGaxL8FeZeCg1emVxe +wCZxs2Q53aQqmfhAx1cpY9n33QrJAd+8rq9vA3zlF9fDfKB/OgQARbFXUn3z +JUUCAA/2FLSwNWuITy7XPfVhetyqYfikaEkv2AVIo2BqxAqnJGiutEEh2Awv +Zcdnfcqpn9SD6q8zQhdSWjm/FoyeZ5oxBR6S9R37mDpIEtB3pLuZkilNTIfX +fqK/N0CAoMF0/wyI8eGOmsEaOh7cVw5db9/XklVZXvoRhOyNpPepWtVcfTex +4PpsQNaPqudeiy2O5OUyBmoZ6Kn2j/p5DXfAyZ1KFuenfl4IKLFlzWItuzrK +Q5KNMzEUbeI+xvxXUBXqtgAHgyC1sdo2VWQzz4COeU59mfXU8g4nki9cHUED +XqPx0vAcWLOK3RlObJfopTnqGb5tVlBWs2OLGIWLbNzxKbJwvXXRqzLsdsSv +uE6DLqTlEe0uAsUcGOm8blpPionz7w3Y0k0zx1OutPyxbVT1SSA4+k+cnmef ++/323xvpvZzsKvlBdYhxqfEVy32HYANkUFwsNIIA88eNzn+Gny6jkZyHDtJt +JnK00nLqc+NMCFCrJevVZeaEcLbnZYTaPA7OJxDrxoTGvAxDaZIOksnTanDS +3Sj1n0uBjN3jKS526Eboxt/u9ZtJFZyz80Svex+efyhuS1p4rCeb6/fNWLwE +ODxraCIebHNhks6rLyC5E9/POTQbWpNZOV4AAUMKoxWjcm/Y/6C65wbRYzZP +8jBuwrpSdYpX4qsqz9Ih6sq6JvewC7+h5tqZFJj4KpnbUP9cvRus1gRH9ZOi +Zf2BoeV2m4Xj1XbBF/JWTnMb5f2iHDZ9FH5WJT07LCBg1EnejcCRx0++u5eq +Gc5daV9JRJwQXxbjUMRxjIVHQO0W2NY7pR4BSkBZc0N4RAMdaWEB8uXyM6N9 +zaI5eSPeWvDOdTmddJrECu6N8LIDoIZThwTV4lAcGFB8Pq6u1v2cvj7/6E4o +hwQhMTw/TzyhaDkAbztugAJeEBwPG5rpZ2jUT9UJNFpHEz8Q20VCJ/zK8fYG +tOPaYMfsq/CZo+6amCkFANAMAEAGNb90n6586Akpq+Mhzki9vDlSjnouqS8e +u5PQ1PW0QuqJdxYJRV56mt109qNVqjE2Yl7xul19WaihnSPCERPukHxlzYvw +rxXjM8RY8plVrLh+3QLTOpIt69nnQCRXnaCFjw7P4eJ2NFIxjo1HrWuk0uTZ +/3JxmZwTLQAy+D01x6Bq1/hvZ4RJK1+MYVIdK+O1bKbrKY9fIasIPr3W9Aj6 +rmJHG0Mfg47i7Ay1xhdNZAzM/3BEPGqYC/p1kl/16/Wh2Mq6AQBXI/Muvj9K +SuoIDJyqOADyaui+jkHDX4B1/kTB7M1JOFJj/+lez0aaRHx10co4d3CGKM77 +OTMX8T33xcxUV1iuyA3gYAFsD3jfmAAQZ77zN0LQDIfHxsyGyZc6noUaTgPh +78Yc9Ej0iJt+naHmQzHhWeiF/y0TKmQ3CR5quAXAE/f78B/NcPX+Kh2WBLER +H5rjgsWnL64DY0aoKDv7WhnIs9BOw0jJSuox323Pvp8rg4UNRsMWAJiI5y9y +CHcEFyzMyQriuXgfHrCwMwiei46qAoLskkK0QfFesS0FADmlYmEsG/7qkYkZ +VnaJ2JlhYPNk5HUBi/e343ZPSDPifhppJ84Ck94o69gzM+rVeqsrQ2Q+xF6E +zKwWStRyI1RX8V/eRBsE5b0qgB543+dFrB+KuFYu91kACTFD0suXVu99E4DP +firZQ8WLNJ5cr/0VXaSyCABAAjszogoECBAgAAAQIDoCrtVIW2awc4iYg+BB +FdszBDze0l0AAlgSIJxXKS8ZwtDwxMU1sALUd2evzThQjNSkFXv+ZEAWQhCy +klAtGsXq1l6JRS87izNE6Z1Lj6cFmwB33HHOkRh344EOcLMqQXxfbpnq105v +ddL3EdpvU/Mb55XHnzPqZs0jcpilREDQUKUkM260n0WZTKT6iaI1Vt6KkQ72 +gvZ428/dKmf4bBLcURppxXHdm1MjIFKukLBsEKiNWYRCBSoZIrqc7SQk/Mb7 +dwyAzVS2y3TsLQ6ffYMDQXs6jtf3KFEmp4OBZWqBAV+4FzyA9nTo0bu3hXln +LxUrvvkvCLFy0JNf9NNIk382+OqbFAErZ+hnyjtYphaCZBuHsKldqqhif/4m +q8k35z4PD5NqsIGaS5H+/9ivPlcAgC1O10caEv2TJrDRLVPechr6dL5uliVQ +KECmxk27a0umkVXC4CZ1rZpeBJn1Md9KcjtRYjpi8V5XRpwkdEtFPZdwbYw4 +WyihCjHUzUpEHy5YzVIgs3lrqhR778TjQ8PXJN3/RYhgEaRIfLHA82osYXvt +JGISUe8WNwxuvY0ObhgMlV033qmtFyBS+SRiJWeIb3TdT4ebs0eAHGJZL2on +WHmSrc2usbN8o9O4Z0f5ghGT1b7/M5inx9w7AKaNKwYLlBgqq4r4+NcO2zQA +t1ucHotc9PTGVnNSf55MM15G4khQq/vn+EGFczCv6tIrYvuW43LxT+k83Scd +TELNiLCwQ+bCjIBuPh/gDPq2PgAC9fof37c2jTCJef2IG9e7l8xgB/n0ciw0 +MVWg0sU1HbHOOUz/ozSo8lJC1AsF0Wd3YEA5A6hpCl++/lkd12P7T/M1g/We +vLDPEgwdkEGweZGw31KNfc+J8TC5DmX9ielmtOaVNdUwUp/1J9HQ9bivmk9b +l57byZCKsELYzM+Yp8wXQe6pKkSTJuvuknV4sJ8uOEs5MhRGvvwPinH7w6Ok +RKO6i2x3cGDxQ+kSknChDNnBYYOsKniw0Oi4VmOzTV0ohciREg1IuYd/0otr +nY04hPm3PmqFqUrSJeMBTKInDF6/jIbs/6xyqMy9SqqSCXM4tQILmOY2TBAD +bmFeQygwy1Ri5gzGz7Awi4nVIpohlhn0q2sht3klzevc/eJqD/t2r0lcpkGE +FQd52kt6N2l8Gfo39dN+6iGisWXnT6uuBb1Iu6toXoFRHI36vDxKsJRiShQv +MOsy0aAyMUJ6/aNr9g8MwY3D0gM8tZeUoYjx5g8QLES9Co2b0RZ1YMJSNW4a +9+dXhJmJ+K/ividWoTB3YJlojFVB9YF0NpcybEY9htYfeqgjKLSc0JW7GyEn +WziLHX+e8atfJxPBmsqndndZqtrB3iWxzv98mYPMy5saBfpG8EdtsI7ybFcJ +K+EDeDc+ZD90R8Ee+QSWm95qHCgtpStYOIwwrMwqGw97Fwv5v3FKq4RsnzQj +6YnWVHfhizFTi3fjAjv7Wzr82AfTQbceRg8MYgWMInavGhDK+AVJqDNpkAtn +F0e+9qjP3ulEsYCAww0AYq5r0pTKIF23SCdQAFMcMyLhL3s84mMRf4wL6z4k +FClH/Ce/3pw7m+O3Ovj45sK6gwyGyinmRcY9E/rJfSODgka1qx1LG7Arrb2L +SXU+W2vIrScpfUUHtdYpHrIMmqMlj+h0UIPe3bhegjlDRs5ByzIcjv0LS1dJ +RTyHOoRpUGNK7aNeosOA9aQBUGxyQIAk0lgjLGdPJ4pdL0nYWVn8zIcvfK17 +RJT1ftJoBE/6qLA86Qyc53p4dvtbCZw6sWDg/o29M3KAReUZ3pYWJpVe178c +22yzi9UYfJyAMqghy+QNTxnqF1wJ54z8fAUEX7XbpgAAgQAAAGz9az7nEx+a +mKiM2bYsCPuDplnQTysCrGqd6FxhQiYNSEibIR5lUMaKuG0W0GIcOtaUMt1U +0gPPHKkNhvA5oojcijYfroF+LuGlQfZW72qkpLDLIDsHFxJ+b3DQerqjnTt5 +yTEW1CHGXcqZ3w10ktNzblEnFFbcy6hhNFiRD848vjuBET9yb+bp7MbLtk84 +HPLF5r9CuIVqpBxd/lQIABrbPN9EBxog/Gk9bP5yUL7bOP53cJSvF6zrBKs5 ++IRq47sHzpnwnr5ktMl36mnYVrZoMRm7fusGlKxuIi0x/wjtdPzUvrJy+Qox +UAQ7DBJT0lXEC1u/WWkhFBp/zPvAhKCVWVU3HkclK5JG3VP0CdOeDZsaoL1n +nJlvKlXx4uQIOtynClALJbfG1KtT8sL2ArQBzB6YA44uB8c8X3uf3XCWdRg/ +hcO3vUcR867vj7EMK6oIlbRx99ceU9V+IhyJUoSekqRAsWzQS2wB9tt/20d4 +TPTLJh7ThjzlEkrT+u5o986lxqLpWvRF5w9Du3p+kcsBbUQWqgXA5ovvwi/t +ImdJcPpryaQYU8EISK8x2KlKXgUDvY7Xzm5NK8nDVHRU1qKLJ+yxh6yp5EfU +Qlh2NW/b8Y0pSQXN7cP9RmRRkyVa4qpxAfjJLZrI+vjFhd7CJgnHegsXm6m2 +uJ1UakrnE029q72D4bsMAABzBZKtv7HKHo14FsOPr1ZeUW0xkdTfxK9qMuKv +QOOdWODPU1f6PDJ5gm8zu//PAPAZrUQdw2gvXzT1cGJF3r1Yqkgl/q0cSZxX +NbTaUb5CP29myiVYSOgw+M43+KQ46yOnu4hG7a5DTLAopXyPtQWSSZcv05Ov +XXpRHLw5AXlN7uH/jFnjDBL/Y8gsCR34dBm5DOzvqWq8McxmPUtHsbsucriE +rvaV9QliMHNB8uFU/dvBTtdzKsgYwsBCT/YnYufexnZB8sOkIzNgDPbUzfLg +jyINr4M8ipVy174Y1araappWGL01SfWxi+KEq4K3RkYNndYwaWWTN6Xlv2mO +M5Cx3U8OJnnVf9mmrweUHN5cn2IMc8P2UIcCRfnx7pZi7adFgotVo9vu6/lN +YNs2n6f5LDzs3WVRv7MhoBSoblLdhSKdMk903QBavP1Fpb48TPcMwmXrPbZc +RKPq2sNY9fdP4RuE6pjQxdRsCEMTgz1pyvVcIWvNamW+1Fm2B3r6jw61j0Si ++9tygUL+hHKcNSLNAG6dKV4U1OnxncRjPTQcQoKpM+Ia5gyJHEkiNqZgPIKK +g89chYS4LJiNmJg0bZnNj5warfgxJyyWJuObWaus581h53ylXK/qkNmE2qVJ ++cdJ7bVbCNJMp/X6kNriIV+aONIF7nSoXgA2VIwgoB7jnxYOyy8vT8AFXadQ +E2/i/oCaL9nofZIj9Ng7tngdBQlkoodH9gX9Ftt9i3er5CQ5rJIsa1MLY46U +lJNFWx2HT8iX23q2CfMzKFtRtjAAHFIjZgcA5lroaaRE0iiISOaQGs/WxXyo +hHIyBin2ZyREyybsGcyeagKDXLsHGZxT/g850C4Rl4r8cebynBEK2hCi7kor +7roT2AlScwzsVoU/MjrOIQ/C38LzcTGO8veJBGaA3edXnrECHDXrHLrHEcep +oaLSq0/lDWYgaF1Ysyji/kTA/uyEzYTZGcQOigHp0I+iEQ0U6SCGfvv+NF2F +k6wV1kTevW2bDs8iEFTPrXJXSv00VT0XrTZwXqU0EBEPziv7cyEkihstifHU +FbDHHfZfpT1awBD2xD/p1BbbS+o+2xY1ibxukSrjmAtoAAa6QkrQCiDrlhJL +PkM6AAYADYDIZr3wvX36ZB5EAPy/k8xlmW1LCYNDwmnNALlCmQ7eIZZpIMav +ILpmMGju2ja1AkNXCZtdzX2mIxzVVHuei55Bg/blcjaupN+yojnVaWmFC2fd +k1EhCr8kGWkps6frVqB983n6VO93vd1PwDBZY+rfEidMY7x5TsmCbAgAByyU +Qu7DCAiGgo/eTBUVDnSmfQd1gXOjADJE+bET2/X8HQ+HodlTeQ+OImSeQyPP +bdti3gY2V2owLek0OV35SlbgRi7FZ6811kWz6BjR33IvvPRXuIhRdzP7+Aqe +8jOPp70cC81/+Yse7jySb45yONMMpjVy2lZ40UsI8nyiY1ehsXq3VVaprnqt +1eb3c+Lm0urJOOzek+NFKtNFGjlaKq8A6sinlh3W3PuUGERwkN0AEknarDnc +tArKJuTair/DvV0kdNJxbBuM8mLZEOcmWD4SUv3gS5pPOa73SUj4OgwhL5mO +Ew/jZMmv9DulFGOi1hqLf59fJfgUDgZx4ovvCTw2o/zBSnOHibUf5FlC7PVP +VM70UeL4pAS9dinoGzu3p3c/L6SpAF/SmpA3z86onys81ANTdJ3fzSaWlH5V +lTvYQao5ZFU6JJouHgODm4atRFhCAufXX6RMJclQTveMejZZLMlea4yCoIri +C4j/tFQOb/RxUuwvu871ov3U/OSNyQ2ax95HJu6mo8Wx9hS4qlLva5SR/BLA +MEA1hSnLXd66wt/LAd06rKOJKhq4sZ56DytYHfQipBziQ4sKS38cUjaomEYY +HMufjxANwYMGBTze5in35WzOtjCQD7aBa3XN1ZYr9pEd62G97N8yrW5NFcxm +MljGzQhaK7n4ssO9AX4No/YN/oyWwet7sAeImLjlnPc0OzzfrpZCWXNb8PYs +vJ9GuXfM2pQ1Mh5/OpjBCrDiFtxXLTDkAeKts2AAVQYICwgADn8Taqnqa6ws +TFvBQFLMEwIjuGTi6kUADr8iwVS2WZYvinL44He8LJ5GvEPyxeDV4sKF01Us +piSRgHoWeY9fPbf2DYZIxPy8jDs5X3mhQc2LY2v7KT4uipwQmFaliNoi/vqk +iY++WjHNjzhfI+Ifi0gRWxVAUaEKOLPOF58zYP6KPsk6iPcJddFdjU2JqSLl +x+4M1eCf6AxuR7KaBOKxuJ9iEtnWoKPpg2kcXwZMWAwxnJYl17M4cfI6iUAw +wKl4Z/aojyWqCUQRovh49J6eh2+KTj3GcTjLqYlQW11W0KYqhZZUiVrqogpQ +3vUT6qNfrK4Nt0pZLXvIXr1XzVpuXSUwCTULul4tK56hGj9HPelDm0A7k1KE +iwmaHfDCoyBT09vANN6wH4Lx392irainGnq2sDcc3AZd7KbzFfuqd8UTd0/y +KXnEg1fjITZg63z6GO9SHaMiZRSnN4Hp7hCSLvIh2zEKhFsN9VLW6xzPv/C+ +1n/tgMQUhOkl2OX2g5s3VSj/KUQOhWMh+0QfFZPMUCfWMpMW5uUJuPzJewsl +qYNrIAmb7N/JBGHpldb72rQ+1wUrw2ANs3XvrmdiMoAvo7EeooiqqQrQY8dr +pWopIRT+iVac0a0hvqVbHfRZC9gxfDPe5x9i0MOYtVaFJrBhvZ1Ul+9twnNW +MPb+dse8nCOWDTM1FWh8AW88WAz9ve7UtXke7O8YzKJn+DZk6EJ0RHaBKgAY +NOsWXVb7nJOOUFd33BJa8nJLT/gazTMV0CA7p68dlhTifSJjdmNH6aVNjhSX +Gx/Gayk4NJ8ajKTeTTy3zbLyWxkrBC6kLPPQk1CB+skqyioDHad9U6rLguyQ +v9mij1U82g3xpWVwMjhC2TOh6/WjSKEaFNwlZKR6FBHhYhZuoMPQLTw4MBtD +Mp9fiKmL0rMFWD8iQG3BiCey/z6RpXP1A4pTvKrSsLlxP7bBT7ZDv2FjYVSh +x6DMgdCN2kB7v43UCAinZ+qfjGcNlk51Sv1ywbqG6e3VfrZYyApbMmK3ZPhu +9pSlsEt2l54bw/QKJPCrh1+LNEBOU63TckOgT6AXy/wvPU8A8eK9M3Fkab3X +kZn+cYGzuTM26uJduLbjc0XsWvrAGLISIVYdDttf7HGF5PyC8/UycF0Kez/d +WHDPzUulmBU/Np1DaYboYcBi8mZ/amA4MXl4mH7ERa3QtcFRt8MB2GMJGi52 +nCYf3pTIbbMKkGeN90YsSs/jSIrHZqtRoEl41Zq3pTXLkpJOm2B8peqFi8tH +/Yc7egDT/Fj/DgjzM3mSlj12yKzZzI4oRIpw/sK2DNSxdksgMqnRtcRSKjmR +UJGdu40Oai2q58igwaNTc7CQ8zljvKD/1XAsvIv0rjIxa6jnatSOvH2OtA8O +QXQaPwK6CfBNAIAAFZGfjWhZQrlHqnyMmjiCHTVLQccw3k+BPiYfDggsCUOh +wOA+AYC7OmW1PzW37DcMg4PDDw21VfNg/cExQ/3Gqj1JAGgemdEv20JqCVDk +ZzGpTT50zmDhjRlHO6Jwr9WdL3es8pRtYhDe/M0tTuUbVog5/ms4MAoYYIL8 +8OzTp6vzpzdUX9p9YH/ZzE41S8hRMTP8xaN0B6qAU+jjvmZsXJmgBiay1lyx +iC+ulLSwEOOfu7ah9qfzJlmHvCQv2Wr5yBHY3cLHBGef4H+4mwvg7ZQ32xm/ +Umgp6w1jyQ1zLGLgQABaDAAI2xApl50k56U3u8THuws8FhilKlIAAxJuIisW +6uDRGH3QUKQAF1q/dZuxO4SZ7bhWAlJn36+1gMyQfPKdxrXDLgVG/LsO4kyu +ZeEmvcZkvhOFh5f7TTL1rxNNi7d/t6AiSSGhYdXxBV+reUHYx0OGT9FQgnGs +qQYIDEzUdKt7RH3X2Atj43nl+L2NgmPzq213WGYFhymrOc8cdFSjWvIigGCD +Nj270C36nXziwXqYqIor3MNud93JjyqC97nPiLOpZzX55ckV7RWmWqpJy3wi +9C2huxcoeMtM7aGEDWJ4fGP9G5/uhM4lBTTvXD76T99zKYDuy0HhAcYtP+84 +hrye/j31f6qheeKTkhLnz46QnU5u9KBGQsBPb7TUzWwMMMhCVXgnQR2+dqqy +Y7xaW/vHyWMml7mMHJuvMFteLwKDsM0i/e0zN/5TZu/hEsVLrrUeySWpiwfJ +Z8zXze/9c2B238vblzG40VIs3sBG5Xq6f0iA8bxVhxp/DFhtyBb6x1adV97A +notBziEbZPAAWobiO6uTVPepfREt2NwcQJOy65sM4qTGKMEsRs6dVSeut+MR +KcqopZnjkm1YCbmXYPkBrVh8UQYAMl85sFQwkQZYBkxMZ+Z8B8ZpXYWLaY0p +MzpBl5x4YYIlswH+MmOa9yK3wg0tSVB5mcp49ZY2DWgAWy2jwWKhMBTmo2HS +gZFRBfCX74p4VLiKNJnU15gwfzjtqHWCKNhTYIFLo61QTmWtHFNSVpdpiV3L +YhhfEx0IiPweOo/n78HjlEO+zmr1oVSxQrJ+khaYgnqXW0ZEqwWt6a6//WFq +zqLpquNO7B4OsRCVJOHoZFcUzKZPfw7BrUyuYlgw8Hq6nxrYHiv8oeDhwgh1 +QNiv3U6xvKY8mRH7QIC0df+dzB5LjX0TIeHaR5LRc5EGIroaIlrHmmFkZArh +xqHqmy9Ga1rpekhYE+rgKlF16EokP9b0jfTRmO+PcWh2A0zFbhNG5K0BR2er +mVxOJZN0qcXm8m8swt9FBlN1SN8abwIBDmbrPTFRiV66gtJnUihpQ71mYUJU +/9Kc1zGHkOPznifbf9O7+87l7Hf/J4Tsuz/WYnyMr1cBPSowQYTO4LuRBh2M +O7kD2SiEYBLJ4iHUJ1Jh28YWiRLhEHxRFAxEl2YilJcAkEKIjJYmZP04DBh5 +Feq71/IFr70yVgHhETEQO9OyYQ9ONJ4IADXBgAwYMGQpzsYRRVoy1iRRFTyQ +ES7JCgiBJdfCBP8H2Jv948jsXNbl2cm2hRs6v5nkAECABAAgAAGSAeIk0M3C +FYv+XCmRPpZhCwk12BsAATQjH7EnatTQLFhxYBytUa7qjS6Azwsp4UNq+IAu +u9ofd8O+Z+Y+LekmVUAmj6VY6dPmzPleDavngWS0skSpktPtAl+0n3uCGb8v +oCs1jPa0vbw+tSroAAIAEAFXaDev/vp+Y9l7rf+L73xHF7r7vu+t3j8/jP3/ +X7zj+Y3T+CqBhURVX3Pr6DlAYIBh50Y0gyhjtHZLHynYIoEGA1TpSM6GIGaU +cZ7HKSwRp9ncjUhbMvSfJNjYHq+4s8gIooI39krpnMHHXJrPMEGgSIck6gAZ +OueXEj2Et38MMTjLbFaTY7mPXpsvNm5aAHTY9L6OrkL1iZBfWc3EYwWKVbrW +oNgccpBJdLyc8HRwvbYyTbXLDpoJT3Huzf1WJFdz/wtPx2v0/PbPg7/q/w+N +6z8WVtqo+p3igVQ4qICGMJEhEgSLCBJIQkiyICGbFUDwaQA/yKMQABqCIPmY +qINBeqNFKlMEikCIpRCiKwQD2Yo0KBYGBVoqNK0RQkLEAhJFkZEIRCRKYFKi +JARSSDIkIMgLISCwhIkiIQiMYAyKBGCpIiSEQCEISEYSEigySCAdV/7/WHaz +0n2tDov0ZG6fhodn3HxP67kHdeCOLwXCDo+moUADdSMyXkOET6wKeQ/7TF/Q +UBDSAFdi9kwzDmJ/MH+uQOJqFr7LwMgAAeYMAAAAEm+T+B/7YfPfmrt8R1vI +ea/zcD5yt16Q5Lc/Pav6m9e4yQDuuhy/p+2MvAgh4gVYMIKABAgJcGABGX7a +YhQIAECBAAJumFP8fFIRzKFKerKJmKAINl8JQ/H7hA0mL2DhETMJY84bjaV7 +h23sFr4dVoB4/6QAHAYAGUDxwYD32vY2y1z7KxKIcTFp1O250/MDpgP+7UxU +yRWJjdDp7ykkr+m0JlDHUWR0JIWNZLHhK7Hb7cMG3K3Y6bHPtU1Cwlnd/NIz +YpQIDrrhN5o8EmSQgAMkGTclCLk4cfEdkZ1tPJ1e5p/pQsLs+eN05nVqbrOr +s5P6PHz6vx/jv3vccXufaf+APjEWI9y5/jhJOSYITgOkXRYui4RBeG8r24iX +SFJOntCrMou5kUCCTbpwg5CZU1GRUUS81Dl39Pdl0xCJSpzbu5IsvKBYhTc1 +JmJEPinsAWpDuQaDp4gAuKqBEOhAqJJh3NO8B0WhoFyoj5+HcirDgREUkIFq +YUA1SY5u5xhs5QnOWvFBNmLHdZfJjLknMGCjeFNVcDBmSQcPNBXiIzeStDoH +w6rOhTRk3RBExT0QKw6iiA8wqcUZjFiCKhNBgREwWMOQrqqrCuwJE1YVUxLA +FOGNQINzcxVGCHLItAdgRaaZJIhBBOJIgu4UB3YxKeRJmCqkQ5dOwOkUXzKB +gTaxM2ibSlnKBIDkQ6QdYIt1JAmIDEB5u4giRRD2vyffV5b1/93kftP6PN/R +V6jzQAZhzdX/D1n1/lqE1c2lczvdEZNfeuf9KOG+xgr0Y9Qd27GszGJS+HpM +h9rSwRUlJ2e4W3yQohoDxqhRY7GF3bX8zo07vqF6SRncPuFv3LylO0xkuJKI +P0kDACVgoSD8QOtZUqaG4k29Kvask+456m7tmqXk1ehDofhHG/16IFuevybU +iY5+LIs/i/6CfXMdz/EoXnbdC2HlmtHm5oekvHNB1AgJa4Ucs7Y0fcLINGOh +NafVij8XlrewarGLGe4+GfC9OBjoqUuuisjIkSjQ8RlkFEJAIsYHhO/cRZq4 +rMxt2zDf2Z6o9TSUPhaO52BZqUQOioopoE01HRpdQsltd/k9aFg3bgkA9TlE +86yjiIPAxvrJ8JG6fr1zGFcRs43CNOkuiAwMAG+AwGH7sZMjA3Fv8n69yBkv +v79vyGqlI2h0cGKhTUhq/bZpz/kpJBd+Xt7MotWamcH+TgSTj/Bgnu2EjglC +S5rvufMzC3K/bCLvLVk0juEzTOoBgDBAgIfknuy6l9Wock65ieZfUJcPeXVH +3qA4m4EkenL8wGQUve2n2qYuJ7dz/w+NZ1CjnuIVtvST/nvVE/7Guo66Bf4j +97SaF6Ti+MmJcxyORThNYxONsAYLffw2xM01pqIpT1maeVpnrW3H7YK3pA2m +QgUEejzLsIaMODWAUOK5Cj5I/J1yk1pcJ8PZcTAdkobie+Pje/i2rnQ6/nOc +VuJl4BI7BzQMyAdrCNVdi9VcHyXj3yZbjcBw4h3H2WNHd3/w66qeZAuF67O+ +YlYiKU8cB2VxesytWPwQBzPMovhr6MjsN40nGEt3FA3CQRRWOiOg9xjYhr6h +50WrvyFPNyc/HZz6wXXAlVY2Xu/6Fc6zrM/j2AhCUj7uuo9slBgCW5oDjrLN +F4siFKjLoOHsQOUz3WK+tjOI7zhFMzrusw/HmWO1dpSrcqo0OEiI93bJf+Tk +lV4nQJ7arL7ZN8PlaRPxAQ1v8/fan8G0ntRGYGs1Wcb+SuDBNPzyN6ZsGfMY +1iee2TUKzo6udS6evKvBwfEbHjzREVvGnXUP3xk8xB1/RDSoMa2oaerjL4AJ +v5+dJEAuKVkDgFWCJ00hXrKCizdHnziFwy9lmbfNOEuRvrP8sE01SSAGCAmX +hRCax4m1Imv3QN+GD+AXTvq7+LczY7rb6NJ0AMow2VayuAKjfU/t3VaEgh5P +lINOW0rKOr2RYAADYDAA0UDPpyUWXbs7L8XvIuiC2WfcraCyZcrDVSHxgf07 +zweGxi6ERGAIHDW3FJzVaimmlCe1XLNmAKPmAijZ5epKf8y9aat3ty6RgREU +ewNgPkXFQpKHGIkQjpCYpS/k4V10/Z3aRb5m5uY+8Y6BpU5kCBKipKHG7Jtf +R3aOd1QL93WR8xugUP6/bbfwF0nJCK/5+baklCPj8GkVUXivt8RVj9QN6Paf +JGlbEISurL1UEXqEuYXfOyv1KCIht87nbDGfpglt5CS1R3mb6FkpSIlNR8LV +T05p/eJBOuoLYQq+IvzXutmn8kO8QwD7+3B4YABK/HKVuu2H9cSL0mP6UiHt +ga+IJxH4Vkwf1+haBAcomZ/hlaMwRyFPKpPRLUUFQNX9mfcWwJtKgQmytDYL +nj6eZy/Efn+NL3e3cGpnNGokLKdkHl2XYUTl3sfqx+1IzK/+dOvid/EYdhns +aB8kdYmb1mlUWN0Jtz99TAFbFLkXbk9rII9SdH8G0m9duOaHcPLgxld1rM5e +6FT9zrEGngB7g7RSvaz7GkkQoHn0tmkXZyF52TjPgSV8G65ns/4MogusfExq +L7yYVIg6xxLzZJFeuxpcwz7gLjsHMHCl56kfcwZB6Y/aL5BNi1vKRjwGNNAQ +pPqUyaGjNSnv6O2IziqkTGT0cN+WCdUBoNwTOHQh61WyXA4IwfDqzhZ0VBKc +2WZZ1NU1PAHKqF/q3OXraqe8gZJRgYlCHvOMlcYt1HV3clE975BaKwtqfl/l +sKyCtDPsiGM4ww1x1x34TZGtME3C+6s1D+XjcIbKquJSv09E75U3QZVJN4FW +jIXS377sBZf/7DCnZ6MGBptjbqHxflhLdfemBYvRwqRmS8P9EQrbrQuI7oEl +GQHyYcLRUQ081zhxqY4UjcwPdL8+77zNrFNLGWhy4LeYRVbBl8JAeB3dl2Oh +950ndd/dPU6e5TkhPxhU7q4ffIig3qo8ozNlqvxde4Z3CjNYAUoAKg8NYLAB +AKN3LmSVdmev0CwQXoZsHdLuvx33ZdCAsPQ3cSP0us8yXSoMi5wFtDJhWr2u +qIS3RGCBvjou9MJxpE90t9Nstr5VoPCBsXxGz7jfoTj0KJsPMpLNJguEN++0 +S0glrHjd4/LieiUM8y8aYBG6Nv0PSzZZNZWyfbdB3cSPxkCYupuIOcovir8e +X4l57RAbYM23Ycfh93UcO6SoV1DDZ1pfg8fy/31Qskbz1SpOyab/r240Ika0 +i4hBFlsnhMtKTEfy0ZWToF9fMFYASX07AQLW1qOmxN4G22XmFPYq7c8hNtXP +VV66Nh+g1C40vqTxU4+VBRiwQHOljr3gCboZNv2fDk0ttsajB+QvPHpC4gLo +GshQrX1pftvsYfTui5o20myHZU42tQGxy1gR5tfIS9b7QuCWQYdhzn3loxoO +CH4l+dUFTZLrB16cRaocS34SLdlNKZ0gCa8ECpzEy+AEYS+wrsiAMQci9qju +mYDN6i9aZzLJyNfTVD5CAlreEeCvTjrXEbZmcQNLN4Id8m3VQWqdE8kgwDvI +G8TX2S9Qu0rP7G/x6GTzK3w+ayWN5cn+6y09KGpf7ks2SC0wodP9VN4Rk3pR +nYwJthqrsksH/EP6SHOdK0YuhgpockzJsPSRFOwz03eGLa50mf28mwuOvgQy +DNjYg8Tv7EMbPQKgGCT93OcmlmPV/gdL6CukLYfEj2+GtRzg8bo3dC/H+hL9 +nYY/aQSZq/VYGruUQHOhON3TozU/q7KkFbdt8YoTw3PWU/tS5L4i6mWORmsK +ILQSGE54zscYjiJojwRt/3s+Ml6hyK8+xhBgdgMACekqwR/XUcVRRu9NBd4N +EsNtxfeDcAcxVdLWURAAWFGrHhSqG7LQZ+N9E7ImlnmeYz0r+9TqbpgW1UOV +QA6B9KxOBXj1yDCQYLaLInX78peE2fZHSXD42CIkAAJUGCAEN/FG9Tj3Rr8G +CLPtvIcS2Ba4QDsUlUwdzi3y8erw5vM9Wsg5fAGKNT1zAwlVmzZOsqHlP0bT +tdn6Bsm3hXj9R9ccyraCHc8Qac+bxMNfosnLSI6zhWKV7IwvJHZ7yDn0mQma +mUo9nvW7PgDtaeIknJ4XjyNHFhilENSW/c2iuwZ3tmXm11YZSABXyNrOvy+j +RkJ+Wu4uqFPvBtdOJ7WmkPMANrurLrPMLH9igDEIlzq2zQ1gO5opAODqmdjt +LZim51Cj015DGNoE/SNScyENovJswtNDKtZBTohf3DqPJksdpF5vT43eh1B7 +NbhNQscrTsgf/sqc6reLv5weaeICojlp4P/3gpkNVmqnW+PL0QsZNbfJPjIU +6X+grSOgeC1pzLAsAAAA8BqdpDh/bfFw91mkXtkURhKd1o9o9AbpB4ZzJMO0 +ZCkMnZNFAwfTcQI6V90XxAt9XMSZaNtLbpauRv+p+kKeT3Z7FG+ojTXTO78W +PE6TposShE/WTgc3mJL23CJM30WWpxCdVmcwfHFKOTBGzxzU7UbgcnJTSTEk +4GXVP3dDRnWSt/QjcZ7wrwHSU+5fdjQnQrVe5V0Bzq2YtyVZmb3CGSWvWzAu ++jvVB3w8H7LjTDEOec14nLauoSIiQ6xxRlcvi4ZVUkxeUfTqtLdRTi7XeqHO +1hUebkJ9a1fH7bFsnkMa9R9RDS8knZjDRNxrjD6Jt4vbTS4GHbaP+ESIhgbc +cQE2KPeNzUyw7RoJ+xG9MpeQm736sJiRTvSNiuusZc8b728U4Iw7qptjJ0j3 +GJqBDena+oX7CARvciW8pdk9aEgF3zwItXkQSP9Y/2tJ3JdGzy9BWGb87oDI +JyNX5d2qzm5tKbRlXXtNaYT3YhJIoT0t7fkYEvvAA+JoQpc0oH4Fppkty4pY +goAmVY7C/Xbq4IIZb3ComAZfLvq16OvNyujbmcGagtzCbPYFnMMOsYH0qgmG +KNhIqPbGyalhVeRH0o+WItlDvhh+hduoo+DFLEevHspthOvO9hIboKAa0pJm +Pt4hXswVVjh/SoJAC2gUgBPhh8+ZvNqB6/Iz/um67RXEB97yWMhRH5s2SJkg +WfL/2KfvZOlPiPa8p/SZ4j44ksZNmJ2xXM/WFhHxxeoTE5TOvNeCWw7rNtBA +gAYMAAGDw8YtDUH9SiRO+1UxtBY/nJNeBmCCtkjIt3KalFXgoddXOp8Mk9t+ +2uTfe48fCcxO9eMs3Xx5nTY4GX4d7dNfaU2uxZ1Mdk6WuhuZIaYe5ue/TCf+ +x/mLP7NwN046jb3G7RY7RowMYFV+YOZ5oNqyPqCEFeXmPMAkya1tMSTM+Eyv +ntYGM1BmyGkx/RiNhlxwBqYL0ay8OSgiPDiLweDzFEo33WfEmwo6M25Nr7Rw +0aZnMYN8o4akVRTec6mVPIObyff8XF+CNbzFIlYTTayxoE1XCnWyDoRuXm6v +eQhDGrxJ4yoBtay3ZIxlk8YVlaUafHRQ9gVpUaaGV+5QImubxSMcW+REBhs4 +4rzTImzQBrR5ax10qb3fghVI47Y/pOFf/TOC3nWNDQ/kgsARqkyeRSo0nV1F +gHA4U/i2zVXJmlI4S5QgKNGI/8e5yXTrc1ThvvZ+XIm0rGQ9gA7+g/X0toFd +m5EpPveKgzOmuowunS3PZ7xXLcoqrOwPu0ntXmbvCwx4M+vpSp/l/HMi65b8 +wAACABALLMzN9oxawsUMTPg+OWucAcHyZlYDoPn2dW59aYMXfwlM1AeUxVRc +r4etubG3ITLzV/3FFpSRtcZaHdmji6toYgbb5kBBYdUXR7HVcoic1CjT+pMZ +PMzhNijT5qQoUatTH82zP3wkztcGsCCAcO7q6Vx/zyJwtujNKDbTqqEm0iKl +kzRUkAwJlBdYgQ5V03ZOfl18wl7go/6g55Iadca3YdUXPfdEM4c+FE/lTLQc +KOP9QURolHqqTx3nsbj4uA1Xy4qjS4cmVjhtWvGRjIA5Oo4H9L8VH73Z7zkw +2Jn1NekvNVYI0jcKKHfDcdCda5/DLp3ajHlb6tWJD7pvIZajVEaa2MbeuFmQ +xyYuEx7J4yFGtIlClqHksvZqtLpaKQOUXvRRlfciFzwQnrodWyB7mT6Cp6mB +32dHarwrySAUanvHUgAAQAIDweQAOxfqKrOSGNM/mgeDnan9mWERwh/r6wMP +5XTLmaZzdtqEvecMWWe6OIyp3aOwKrNfdgAMZ5fxBTjN7rHtKTXfUZuE8lni +QUc7lKrhS8xbEijpOUt4TXunzzLxSnObHWHdDz+3O2E//TQt5cGouo3Mast7 +Vs0n2F5+KYrRFdIv4hmI+wQH4sP4vrwA2dBHvIGCaP1eJrMEzrp5dntcHY/7 +0+Vm/F0GW6hdrJNfG3zWFcj/OHY903eZlSB7SKhAE+qq2CkxyZSeGmoZ/P5i +MIafVqtmMV1DlYyvEVHi70bnROIkdeyaDeKh5wF/QEiAQ+zYOB0VKKTupJgK +jEOnD5O/tFu4jDUqhEbR+n40siFNyG+3jY/4CnauymDCqdKG5NBg5JrhUI5U +H5fqZu23wPEACLCFFCtffnBnl/hQN3ObMVF9MCN8FSXZmlrJwwr2npAkwnPJ +zwU2eI5EcPLrbD1f6myzZmp9rVzRUGhBNEQ5brMO9kj6vMDFX1zOWwb/AXQl +KuT21p83D9hV69QR/02eevSDJKgD2d7ObjrvW5NEU681TNVIy3s39ZTQNlNw +P4Rqzox4mIoiSK6aDuJNgvboflTkyzWfQ0FWu5QkVK3XeXNVA97MEpvck3SK +6v8gIwNcYwS18C/l13417db/ytmtHtYvqAWPUQhdtErdyO7iGCWA/3YXwa6v +nFIxBRzmMVVFrgEvqyXSeh3Gvh5zw0/dkuKumdCiM83SJwRqa/QFfP68XgA/ +o7kKbG84bBxr1neMB4SLYTH18bhNVOv0jFOLV4GRHZJiDnetIgVXJduyVPIK ++Cy+hOgkpdk7L4wLH4/wytnZ6NU01IqA14VZmxWy8QqFexDdSR0FgIt7vY6T +ee3K6ROiowfsucXU7/Ol6l3wv0KzdQrT3TqhT9F/9Na0OKpxMO0whMcpplM8 +3sTFAvzZTWdCXPN3TZv7mbfP7s7rFWrP2j3P1kF9Etwv8AEnA6/cf7Uev+r7 +6sAAW1DYe3zPcl3znX2nFZhYm0SLlia1pvfHs/wrLpHLCez5qxesl5XtHpsE +K9w4wwx2R3N59H7H/SdjHrz/u6wheNvqm3+85mFNi1Cgq+J8ylnLA5Mz2om/ +b6IQHN2qdq963PzUqrbk8eaNucdbJttuICKq74qpKMsX67u+TWkHeCA2305o +T9UnwqC6t1G9CqjWpXh1llkwRDH+j/Aa5oYqh8NmbFDyAlWpXTC5wrIPelKH +BwPmdOpu3ZqG3WgTZeAcT9yCniejqIGAONRRQsT6g9u5QgKS6t/slFlPbi/G +nCcIb3mM6mpv0K3Kvjp0rwQz3NYjIDbBdTCGJVzen9Vg+E0YqYHza8fr7Dwf +nAbsXcCwG8Wqw0MCuslUXxW5SMnSCiT7eYflYABKwuj6BL3MDIzx0g6AXhll +PqSs11Ia4ACYrTTpp68YUYMGLslG+Na9/aoqtr9t4DWMdCh0VgpK2nWVkzZi ++QZNrn8olUv8TAZBrEuPzAABxIZXz+FOJLN6wJR3ArItmXonMws9HpUbqgwD +wAOp63TF1dMnTe9k0vNpB+Y+BrlcD/hRjFtuXFPYsFHVz4IuozrwU+2Z9WgG +bCcdanT7t6ObM34wMeHIkf8KmY7cn+pjaZK6dozakCGir/W2xnEeyoQQCqDh +gTmXX7pEz7tXls9sCk/bG4CMYL4amMBKF+TwEWJqBhrWaCK/pjtB3wYu+jl2 +v/Y4wxTbAXsVBUmnrL9QU96B1mY4T+f36T98juquvy0Nk/jm9Wq29zLU2WJQ +qxZM8KFGQCl2sSvOiA9uV6umMmD0eRY+2wg2yk7f3Fd2vCYisbKsizsfMLGf +VK2n0xh9zDym0Rv/hry7qXPXaAyaszRsNsiun1zbnPr9HEw8A/DtwrhjSaBN +ZM52UyAE0HzbpbRu4D4WQyORn0OPjDM4Zp+qvZgjzD8f26y+K6bCV53Tfs27 +xlMfCLCdQBRn1RUKRZy2TxqwyIKuk2oy1m/6xcpKQSQMkvvchHXay3rFW6pI +CsF9Cimd3WLg54KDqRX6V9/vDfA66Iu9Cxi0d4V4toHFQylKHZG5js5btf0m +OtXUwUsqwmiF1FnQvkyL/DzMk3D1P3+tiPb0oM3JjPdkVPO13cXKdiEo50nS +7AbjSynZ9giixttLS3nkLMfog72qqQ9Kt96R1apmeUK0TpzRtQXRBhWwUDUg +LZ5mSppcSO+HiP/pXO8T6WVbRYI4Jp4lGwgfXJM7vZoO9B7cfd0tk6rHle6o +7fCRoo+udS6nIpLRdtyyLSoDmfiGjMFErhriDXBk9OKTiiAkRnR6ZNEXOBNG +BfY51et+s0rC+1ekWUw4/Jt44zxnI8yBf0GhTzmqquthDaACkCDjyLJ/2TUD +8YtGzslFJb1gk3cW0YscVrsrjc+O32kSjWEufRpF0hAhjmDYKimCeF/Z3fEu +lp9DB5UqMp/9ydyM6BP0/8Ul/q/y0JVbVcl3F2F7SFNY0Y5kD2IK6MvnItUR +6Sne7D2lJBmSu+iuU2uIrRfLMLCl6nY0FpKvi2fsnT8bKO66adg7h35q+vRB +yOJ6J0aPy2QAVTmF4kQtqEucZCtXeoZ7utvmIWp8vn40UYhmTHmFA8JX7YdX +HFnverb+j1yFqVpcXg6Jd0U/mCrCv4c/GYZxL/uQulNTSx2URaRwvprP2GOM +cA09tni3MfcUS9pbqFy72uer3Ln7eYnmtX8kEp7qAQACcDfvNLsQk/CEYrY1 +ayS7QrEK0T2IL4sO3hN7kYcYVEV/HuQAhZX3h3wak7r/6Dn6ZJ0swUYTIm0J +FoutWxxPQP0dYe8aG+fa6efLcJvg1DVzGS5rRPjZ8LzAF/kOLozo/X32A3QX +JP9elDIJLWYpfnYd7nZzNrVxG1NhKa8wzDWmyowZ+XhkiG9IGt22LaUBgGbu +db1HchdQR8Qp3+8RFHaGmH/iOBeFjXsw2bp0cFglv+/SFzxdV5m8HxrDxhDw +WceDRTvboHjHI8XZJBWGcF88dB3xW6/rQMK0S5D5dYAjQi1GI5a7yx2Ytj7V +jlTUEoY5VDJRB8Pmkj9l6sTr0NKR4wQtQlYeS77gZ+xkDmadHDgNCySwdVKo +1ZFUiXQYncKS7OzhVAhUpWLovuaBVGDNekEls1ak5W6RE13mVX5ROWUBAiAF +EBQtlYuM+akuuQGlBFox17B0tiCt5GxFbMclTrAjtOmzEAwLz90czdfXbQwT +Fik/CFNLZgZeVCf6IU21WnxGQyriLpqim7ynpcLLkQwgDrOzoVZUS4l3qLLE +UHsi2f+HdNLMtxI9cOm8Y82YkzPiCm4VQgyVT8XkWbyae2FpYLyah6D2JyN3 +zXyrV0ogVQaX9JLHMY4k1WbxbFXqF+qF1qqgWHZILdoPi8fqgdezW8GaxTFN +seyOU0uhQ/Tr0FaLoEw3gbn/EGZ9JE9JK0dT4z2HF2tgquP8q6N+JE98XShn +FTNawrOs9LDpetJO5TY7Ma/jWUWcMrVIB1R1HB9mcl/uICwYg7g2uNC4rtzr +9iFSv2Sp/Mhd4ocg2/nJvZ76tTvi/SeAypbBQbSG6uYN5vgwYMbU0vtP/Ydr +7wI5iQWa7mRXBJy6zBkqoTpLK0YCRzu7ctWWbe2Li61d3cv85lPmcqdOJOIJ +QP5KRg2B70QEbAv99BE3PbjWtwsNSwtXQbZ3zsw4tUlfUthGVKr3+nyNGrcC +bQAngYlCwoNuGhmqVCfN8x4rVRWR5KE3KxPRO2nswyS5Yen+Cr25fvJCW+KN +dHYXprteg1f7rxv5vLySv4N7KI7K2tyzhf1bfEo5lVk6vaAyUrMgDcmjYb0p +nZAiyky7Kv/lGuCyV5AYx+Amhu5bp1HGh8cnXfzIIsCC5eYO/uQiehj9UsWL +BtToi0sPtAt32mg0Xu3uE0nOUvE8MLa7VED/KpqqPRguT1BnlpNoIGh9cRo+ +nk3KlwBk1lmFSHJV96CxalVDZUtzKQfD1KCTIMnw+EXG07LNpcceqhAZXhQL +lfiVOxkKxOJKG2ZO4axUV8ElnzUQmSgskVVrX/NxRFYFKkHnWMRr3s6QoOE1 +oe3P+2MZE92p1v1eDHt+cf/Rli8qQKtyuDcY2V4IhEjlIr1yMtQ4CYD5Xj5f +iMdJ5NI2EVZDuZPoh8WxNxIUzG4SmhH9+eQXTXgB4t065Xk3wls1kT1p9kpE +eceNUrp0psVjCYEV3cwST0kRYssbU028n2ChdIOzFvz/RzAkXYk9NqyqhiKl +bgcwdf1fiBSoK2acpq6llM5rhXc7Q6k7N6o52BwptFC/1ucQcZdmHBb0UNun +ksghrSRxqluB3IINykVJrtpepkcEKGNqjhE+ZHlPQ3hTuxwaK8hyu2eXqHLg +bPaS/atdrDvKnt9SRV2N0s0N5CeVNpkiCOXIjSEhKWKneOybMvrw79Z2EJN8 +vVbaMgYnqS/IIBJa+awnqvZwozJOhdWDzxmOMzf/SgV7kpjp5IY92AE43UUX +SmMdUnYAAAJcOwFtGLlmzxXhB9WCGfSApSNvFKD6GCWJgazHKfOlksuogyKA +KuiGMzouJFSROICxDxll8XVVARbSxkfLRlbVrQy33pP1kdLLP5p7xNqWn4eq +40y7oMmmHt0+H+trFMoxaDCRKVxTo95qpmcMjB8sO2tLE5xTNJPlwDQIEBB2 +yAQ07xqTx0JqbsWtiFGWo52mMzhF7xUkvV+EhQe0sGDcm54tHVnGHYEATQTR +cAAQiqlmOHBbxj2cuUsSRYwtnsLWjsLyi5rNJKFJno0Vx6iy8J5uo/NCqiLN +4UqaR968OQ813o7cQB93u+joTCO3DDiHKxbt7PNupKeFd1uXHNEbwkiKskQ7 +mhvssDIgObDKSi42ng4TzHHwzQQTWXP7L+Th664RK68i3SQ57r1UHnSaxGOJ +v0T/0WRsnnEY7+XFZSRzIEZ7GHAFQiH1Qjh7LV6y3tJf/StaHQnvWD9HwOII +9uYtfprGJOS7FbD4gM1+EKL/D4adHC0HO+vUSoVNgCFIRw13rHGlEPis3+UM +BcIUBZHoYuphuFIeH68KUWmSepVryi5UKPPfdpUS+crJpf2gEOdM41HEcAPQ +N+6fyoPYubYhlb94tsRoPbradSL6xGHOZ3cO5+Skof+kQI8Of2ptsSABC521 +Euxi+DpkUi+Eeq21Z5Iq7Hc77Zi4x+PyBM1VJVMmXL9+eTECupvX11FKcnYK +3+E60T6e+4JHPW1AuS+vJosvAOagX6a1SACAjCSriY4AjBgqEH7rJPsj/Ndi +5Su9idq/fGxF7pz6yP4wq00zdpTmcgrjXhwCu0LDepIVUEqhQjYQrIPEeuwS +QXidghcusBdYVnefbIh7GrldmePlLAakRpC+faVBwUoNk4BXrWZ0Et08NAtr +Iq+zlXwKYgwxVjb9RjcxvWJ1b9earDpp9o9cFZx8EAbEHUIEz7NgXVfMRVpp +hgwdyC7EWXKDbEEs3QH8C9RUw2sPdnIv61gj2DBdR2EA5FgyChCPz1cLtTpq +ZG15+rgbXTAHmkGObpv6iyMz2KFQC2WK6/1RWjZSE0N9bHhuPwrkl8Jsz+u7 +nf3Z8a0gwx+nNOcgSl6NBneOqZmWf7AXwngc8ZRwOB15xG5zqHRfBj2udyAf +1w50KwD85Zp/irUH36bSYgTCal0ZVb5GzRHHgCBSJLHrSH+qffUuxSQY16Ho +I0Pkgv2ZZDgaFeorzYX7G5Gcoah9ho0kFZsAkYFaoMQGZi30W7WzqTDIbu07 +G6JQs3I4w9ZUTcrU7pp7fRtyFdyxl1tAA+rqPU+VSvNIbAezYSBBJGW57U2X +60SbTfdYUq0Mhejg/Z7sijwDqWDbggeDHBkJ8YAT8UhcWPiVxuK7/44qo4jX +nUDd4o0mbXfpWA/9kMN2fGd+HHWvLUKKlyOUVstdE0nvwSfM0/3oevz0QKqP +fzGK7J2t25CFSikNlIUt5TPCiaCiSk7ypnsyeAqsxUrbhPO0VZkfFfxA3lQD +jZpfSYK64OzJrE0vDw0Hoej2PE8mV6E5zF36YvAF5Sqz+J8s7s5yxWccQTfi +EM5jn+tGVIHKS91Es3kDqDY/jEuUuLR3Y/Sh7V5F+GM36cnrY5fySYqJn31i +rJi9Bf4XJ4dMBIf+JU776WF3Mgy3nDZtTKzWqKdcmTQ9SuCvJUKV1wiNt7mN +HQbRWXvn/0Xue2vXOvpgLiNu+rxDrQ5oF89jGYI07z90FaK+QPT36c1zcM8I +ul4yMYkiZV+Q804TPfSsG3EV/+o12/1Q2i9cSLfO6M3x3weD39zphfNeCzvA +bnlBDsjLnyMH7bm6qv92AzADBn1/RTBGIMA+3euRlp1xosyyI4cuCUiPXr7X +dJhYkjrUmtkbM/SgbhC4C3fFPWEQIcvrETE/LljZHfB0pM0wmxCAe2YbclBF +fV1508KpG6v+hsqN0KyPV2NgdhJRV9CVkytUJUB6OvY8BVpNal8Kecipmh9V +ZFYSxn8uQaImC0g4Dj6qpVxUBVhQa/HybgDmY1DFAtq5zdBeNceytEERPZww +FL1cegGXXiDU5IFenyhvN2K7IgUEPcuFxmInknCvUa3qrmGRGTl6NqpljZWl +abRlXZnO7CtgiVVRwN92Z5Gxn5kpzh+OKrVDrvUr/Kmv9MVDHiJQmqAsoI6L +XTGR3nCXVzB+qCZUxfLv+WJUJPe0TzJhTh0qRn1NbTFsd8WUnwu+IssVQ84X +T9Q45I2XPMLBh90CvCpEYb8kBWyGnyrqDnvA3zsdf1HP+DZgPUxBDGOfg5UH +D2UXd0t41kDUOxqTMRViAbqUtuBQ64MymlQgNclSSODutZckFxEb3v+4o4hj +3Z2Q8sJfpvf5eGVpH8tPRNYupCA0wYAHiTgBGNkWaF7sx4TgH2DY6rTSXzJc +EJmY2MP/N+Map6kYRm/040hz2FW3F+K0zlJb2vIIFMOk0H3f/4cVhL233p7D +EgKljEHbZ75b4bA9K/eta5KmVrpwwSHmXvbL7VyzHs5pDDZ0xGKDaw/6dygP +/mqAzQxeyS5iLUzTJJkDVBgeFqkxhwAIUswgv1iThEZ1wEa1sjk4l2px00yu +sB+SaEruItq5I/NFBjaG1wDsM3j9pbKGNvRY2XhVC3mjtCnOiISRPZ50tD0d +8Qy0JI1oBu3oHTYJ1/Yk4LffQgEKAGhX34rDu9gyy2uRZwFSZgIjcySKgk6S +5zHiCFmhHpMUim0/CBoIlGD2P0Vryw8Dy2MgiUNfktWzgOLiv1FKx3oNC5RM +U2X9OIjR/6xNdUV1t0Cz6s+qzA/HyxbydtsOGz1USwG7CM7E+TGD41/UwFvc +lY5SMOmUY4eC39OF2laHn9BNOvr9Z+MdGSdMDKvRAVrNB40SNvQ03OffqnqU +F6yUBA+QzonMurQDXIiMwlEYWQ+WptdMzQ8lkjekars5SF+zjCxnWT0aoKa2 +1yz39l/ONSIJcP3mX+ho5Qnhvd/+nXtvCmCG8gd4J/EcU0xZDqwWFYCJha0z +IyOz26rI6dk422+Sx4tK2gAZReYSEu1r+I2FJE78mFuCTB611Ruh+AjpCYi3 +idUw3hGk4AYiYtySAAgByThSW8s/cZ+xStr49jLTl/VSp67rK94EvaeUDhSi +5wJ0F5CBqsF8Bf4Www8hmR4Fv95k7HWvG2I+4b8F8PM0wRh5r7EkvUvSmfNx +r+kvIdk7bMFXLsUNA1XN+LFpYlkKA5CAmZ+IlWP7Y4ZceVfgKN7xcCv6ynSc +1U8knkRsfw8S1W+FPQIv6l1LzpN11KlrEL2BmpmOvEK2FyEJnedYXtSKPHDi +U35RNy0AsKwrHnisXVCkkSoGiTvevvb4iVBKAwhJkFnfD0RdWBAAZr2eiSYF +ZcWOfn+UuuZRg2x+Upqf5GhtitffarTOW7KaRgdsZn4uz46hgGXNlofQon04 +Zc9uhyy9dLG+xDCMyMu5iScjFOmsRiy+D68BAnz4VFWOhz1E8GaWRXCB/4ed +4MJWUH6zbn1IAq00hEUMvvmbK1ldvc0MR+6CylV+Xuwkyy0NnUT/hhEvKRt6 +PwBZipr3GcJhaBBCxT36YLtjyFXLD+oRUMEZVsWi7jeuRBSLSccc/8U5xTIg +H3ZG2FuTv/KS299zFN4nyXU1RL/QGB2m4ZlrEdfMesc+FNUHI0oKW/5CrDaJ +KXE5MSQBRnTCqBytV8Vlan+Qtv6a9qgxiz17WwzG8QcD1C6bHlu/zlkSNXJ3 +7iIIYUBQ0lcdQO7vRlVKlRrwPJNY13KwhVq0xI9y4hdHaDZfA34Q8bWG8TJK +lgegs5NiHBRTrPWuh1Cp2WmywV89QwVfLBB41numk1MTOBliCBQd5EIXRbEM +zLLhXgT22gjvzxTSf/rFjeT2MmGft3sx9b2ftXVmzz275sHD9Z3z2REkOJ2/ +obnEm2alU9Yoe7we9gAty/YaLFAOiy4PBZH0UBBUTcWdfZd64EijtkmZImnZ +KNZ8Oitb3py1DbjB5np5iRFrcDi3YmjIjzlVebphMCqmWkSdyisDhTUUR+0i +Vw1Ugn9YjZrowVCPzKZlawtJJUwRBrl2zkXJi4tn3MhOkhE5knzz2MzWZFSV +jpxvGujiiVW94+qyTqxVt3+wIZcEVjhPJG9CR4znLZoWXCPKDBAIwMDaBmEB +TOFlZMBDkAbl3ChgS2HjQS1TivxGZ5XUaSndk9LhtacNIPk82oX3UuxexU5q +YdZO2YE58TERbJ48uQaUiae//ULp9qYvHCQJC0j/bXKKIKEfs2Qky+L2wjvz +5hRf9eRioPuIJ/wlbhH8bN07A5eQ6MU0Rzt7guoInPp9GOG6NN6j7Be6FVTP +RFpk+D+KmTV7C7gAf6XLWpP4ZFFr0hUYp0ft/+oMqXG/oAgtFUgQ2Ymsm+4M +K/rFnCALAdOSFkSPXuxSoDYnMAAE5zFTXBRtCEdDFk/DVbaC09SWh2S4thIX ++J3hs9cv56DR+80t21cSGKQIr7Cnb9VSt5lmNVOxtxS7YXsuUpVYgftxMZgD +N4RKafcBNUjj6ghxg/NAHW1/2+Q03+2QTZyt/E0vKR2VKRwLHseKpRa335Oc +Mm9PZBe4mMP8Jma3HuOuuRJpW+c8sxWE9kTQVoivJ/OXmTEwpDdXLoe4GB7y +Uv/FMvM0SrBvr/nakpbG4aJEnnDj03faIWNEjuhXRoUZn2YtyRUgTyx/rq3N +CQjqDl6TGOuvXKVh6CgV9w9TEfA/mIl/UWR8BIGLXuYGD7stvx35O/NOKrYx +hX6DNdTiFCeeul5GQj5UkdLT2vv+BhPSoIlfL/47lg7GxIxa7YJ8aXkjTl0v +OfRqP+ti5Nny3+wMeVsmoW1vcl8woZQIPXCOKED7veP0U57G4YIADYgMiwhw +xwo10TVg64L6N4MY35t4REbGViMGY33J4gQlpW3snG5hMvC1r72yVtZNyDTv +2PLHtB6dPus5AGiWNCmLTWsdyJO0BL3x+mzKEmmt+NqIYeRC0Um2vJxmsP18 +6SHvBzbMGlUiDMXXzzwhrHESruPzKfE6hoxecM7kTYUrBwcE5t+3PdQkoo/o ++Gs99TejX5il0Y4Ll75h4+2HF5fiepNsJ26Mdfzr/lPx8mnWkER8F7R8pf1s +9Dj/EpVTRuhWSGKS8Syb08G8MPlP3I5iKCIUagZ6ugq+jkfTC5r5wmngdaCz +q07vRFqYHHtY/6ga/UzJXTzT0gWsAN5YK81BgfZH0EoWF54xNDI+5kqlll7z +8T7NIGXTl6nw8B2JVuZ2MhTSuENeihJX3/7CMrEZi2DuYxLJ0DZriLSv7Fz3 +0FA2Km1FX9eO4MK7hJtbKIDR473Jasoapd1Cd4XfPPAu50BPgAmRagcBb1Ag +Af1FVbTYso//zPk4/UA03epPp/y48DxBcryUNpC2suzw0Uo7JpHFpraMiPzJ +6hLqsT4RJ8OICK3nOw5EzmWTQeYRG8784HagVHvKda1czlARUybe2gaiwghJ +Sihy3B+yeVyR30TMqodI80V3m+L3xRIfb7pz9DDg4bCs4+GpiQiYB4sOWo7D +/EWw/XmaQRlY0gXf4TBIUFNEifCWpKmQLW7rQTk11MYHrvXVARmtTDaGu4Tr +7OnlC8/d0ukLPRt0epP1Xvv8ggB77z8xvJl9aEpgpzLtGQ+WgyWzLhYq+23o +0fiBB0NjbULEWobD4GF2qgoYOMuTU7LOtgd1fqSkdaou8wnC3+FB2ejtzZxP +RQG/OOSEZU/PLTb4I0URF6X8eqkv28AQAH2DBADDDDmlrNl7rXJvuMM/9AJS +WbPAuQyTemqy5DcUAGOYUJRyVJXqsJnGaKnAxz7n4AKBARWgIW1AlHkSOrGg +pSpnDdEF6gjdddIr4y4meDLzdSN9pRGMUINWHj3uGsL+I7A3gpGXKC7NPkRN +gJYPO/alhCBoVVa9Oi7x1rIgFteL804hwEjyxVK2BUlfJcDPmlKez7ywSqPY +rqlhvaHY3QfKP3EOwYtdv/ObuhBC7jlH+Q9bkEyjDJwzdW8ihsdaIOU5dtvK +ty2V0ewtgLwp7hUxqjiP9ZEF12Whwwjga6S/Kg9k7MEV3Dhyh7Rd1Rl1eSaH +9X6xts/ivd/YJ+tLqSJT+6vJWow0CVxDLGOlzF2BwGriODYlSpRcSlXg2jLR +t6MVONOVyPqhA06LISw6Go86xGD7je1wtgAdAMAimJFR8S6klJJHmTRbzm17 +35jFkZZ0mcxoxD7errRAOiO/8lxktup3NNxn3Ly1MoL3bGIeZFG0SCy80g0q +U+7wU4n38A5rT0w47H5fZYCDgKNJm9QcC3Fdln9cD4Su0xZ+XyNGDR5gJQ3g +7BuKU+cmYu+bWSt1DWUK2Uo7X+jnCHcsvKj1J5xlGE0DkUrS1f6LOuXGNhc1 +QY7fFz1nt9rJLYfSGSFyFHLKZZgZ9Z41LeFArTBfJNipfpWtzxFebPqZNPRW +G6TucJa4nfeShysdWQUPcsYfqKB0t+ggipljff73/12tsSRxqDH50jQlscbe +Rtpbhd17eC5xAeW7MMcA6ZMoCM40e7TRGmUEw/UePNMbVbw7e40W8CbJGOZO +PgyL4FLfylSyzPHFXNh9VAK9QdGlMm0YfU54X3nvDOyT3/cYl59j8/3GjIk9 +NSxmI3+UFRvSImZ+A4RlqBoqFr7iwTt130JH3czB5C4sUOg4L0fxSMBBi1au +HyA9ZqgvQz5in2D45TB4PhfV11paeaJL2pqZVBRvkgEzJGxkL4764iSy77WW +6b32cat+Nup4WsWjN789emAgcWcjv54tjjRgW2hZs2yCNpZ7AdCLzwR9OB0N +XxdCqw79TmG8HK0RR3yyBore5zBxl7tT794zCsmqBVk2RQHPHrxw5DwzR4p1 +Q5koz0IqOrtdhucG1SsQVbP0LXK/BLNtXRWMqHaM3APgE+M2VwFakhwMz2hN +a6iq3+8bo0QGj+aOEoW69KGzM1Ab6vHbZhGRnHRkEfEnqKURjfJgGgCRg04U +CABYX6EpEUP449j2odewBnm1/g0USba5jRkeRk9ef0T0831Ntn/YYFLpwqaF +P4GcZnKhLqj/tVlviU/uQwi7ZNnyoYKDAW+1rf64Qpqyq+a4HnhGwTWblbAI +RrV2PxD/kzBAHX3H1MHpnJgz+C9oDkElEkXDCb23WyRnj7+bK8142019lmVZ +aKyfSpDO9wAo+oMaAoiPax4JKi9Xw6dU8uGm8YNeLuqlx27YFb/2GcKJpjfH +4OB+qhaeiV/pfs0NP9BLPQ1am4cqO1fqTC4v6FmdGGVfELjZ83FQyRL4LQOy +DqVEQQEEi4WYvmaxgkTiD7dAqed+qfHP0tPcKmO7PkijgiP7j1PYIWET+snq +2u/xSiyWUCuyVl9uhU4G9+YQyjL+EokXNbw9qROa+gLD/j9KgeYvt9/7O+2R +ohZsy7mE7sgSRZKaUro+tlFKTddeKUp814we0JgMvcnu7JLW4tk4fLsmHx2u +4/B1lT+83lC95MOU8AZxt6cDqt9GM25ei8bHqX9wV6sN+8G1wRvcZQc1nCza +UHKjqcOFe0tQ8Pr9SBuvczBo8rpSR+PuqZrPyADxJs7wEtiVqY0hRI0S5Fz8 +TnU0r5QKY6YIqTuN0ewVJOND8H5YUIZ9qMHZtpE7u4VuCEmDcpVL3P1SLCv8 +wtMNESPQN/ebOTRVhXxxe2VzNmDqFIvljOoQro3aeBEOiBEjEBDza8VQNnee +SjXgf3O1yT2tTV93m6US4oB3cBselC5EKAOakQGie4bL+Y2IdU5LDx7vAmw1 +L7sFa0nQv7075rboPSjcLo/lDpiPJ30BFUdbatIF+dCXqAVQwmS7Z4EeOu5X +qpZRNer0yUOqUj1EIOQEgkmJpd36xbHSsb0/id8Txwm2HdIXT5mLSWQduq72 +2aBoqYvIgASkjpt5mHcy4HgL22FBIDUDEQYASSJf7GwFbjlyvkohQnGeHeei +dmAlDFKKAyghQMqN1FIXABm8X807OVD44YZ6CYBlfhl4SHqAqwfb/ypVyT0H +Ld5Yr1CFPzC92/bqCva6apRWshsNYF4KmnQiyQXm97kj/6JEJmPBnwj3uTj4 +IACUNaMJ4nQbbSp4zgJ9y8vz+SOU15GFbTBravPH2vStFwSWtsQnjm8tvbzD +8IfoRECn+pjoIrVaGna/exIKUEHO7bJJmt+1IbxCVn1qEUJ8e1gLWim291Cy +T5fd9Cgqe4ubF5cvPz8UjWTOMMnmJwmTeHx8CrktmPmNlr/aQoh3w/8rkShc +MQ/Y1rQRaejFPpIxQ674YtHOZuzL+yNDtqoMM5YkLSVt2KkjMfT0ki07zrzb +QvXRLhkswfRs6W1ckTzQGZmjFk03s1xPH08Fs9DefoDq4mUeSzNiyq5RP3tP +KobZ/Mp/um7SAovQCZAWaICWAR6exWwkjcWprI7/BJ28K5NLRE535nllc1oV +98urXdEPyNm2jCuq6xaWYuQIOKVkYVTWkTyocmgOSJwcBHcFNUTD/ZC8eNm0 +5nt2Nthc8saB8yg4H4rYa3CIpb+Bf4BikpKd/w1MdKULzTfOEcMVAJ5bbOjL +mmiltEfABICwAB/QkfqrqOCsiMnSKaZsJNTgGaZSPTWgOz0nS/xJBvqmHmDQ +RtD17reXSQS53cCylju48r9wC8HVyhoazzNKuWPgi+CEvYi4u+AiyAYIAFC2 +Ivf8UHp6KiqSR6YM6+XBm1fq66cGuPf2v69amCIciE9sh0puUe/F1CQUIMkM +ZvTLOPMyC4TNxhU27eEwv45rp0bAECmQkGfaEgWTpyARIwgAIFhGMcEvTzlT +q6LWjFc569VHwYQUvLP/ScP0UAFXJcD9KEUe8kg8MlNmNEkyU156PTdMJS3P +0x9p5X4cGt6yNtJ5HERKk5l76tNDQDDkXsAoULCYq9sM2zrbdcgkUcZqc9aC +7u0cYZq3WDrl/L4BfMcj3EHURwc6mg0JQRDdzv0iuHjBAwDQXVvoRpS4ox3k +mobLWE2+oS8ZYqIcTwpUiyvRGJc5OpLMVRpXanuMlwMkVGGQtLXOqPFRglRE +tXSafhzI9gsP1qgLfZbxOIHx4pgMePajMcsmHdZUEpokSzHPMN2kIVAJsOGc +KmviRi8Ycj5MGNbaG0GV2WqEKdpoJSzIJiPSHmYkQURPc0lBX0g8dCPh3qfG +Hz89X+O+A/luMlpH3cvdKyWbGUI05IiZPcqvMuavqXvtKeR9sFuTaE5YGnTE +houmIesJvfqEo6+BaFjPn5aLgoAmHd8vSsWIf3sDhgXbsV6tj49Cv1bcmT2P +kyQAVC8uYste7Q2hMsOGK8OqknB1l8+vtM2sah5JMs59p8oGseUZsCyC86qr ++ZkiixRztFalb4fvqmJhJyF9Nr6Z4ICSByaO+4GqZp7epFCg1LBilDHJlGD6 +9UsvoExKGb+pyh3e3wOO7ptJSiFgd2gx2stZT9E1FtxqSXkaLLBAJB9OKwW5 +WkmGdrOXrEkc7PO2SGQwLgh8fk4y8mHytpbJRrOhyDufwOIDefDV29kb8TuY +z4LUg2lePsGz56dz+S1/9+uB3mBnAu9Oxu+sVVqNizz+Q2OtBkn1i0KN60jg +4s0p2SVy8EOPGcgSMu5LAEOTpdRgir7XLca2cZ1VtUwGXg/BT3uTHJRZBAyv +78ISyOp1aUdHa2u9srRt9ZTh/WvBsuj8/sJEOs+KE+QvkzfxZQ65mt2msiKF +aA1BDCzKvkkD1QZT1qj4YxS1MPU+WERHy6boFPLUAjRE5dgzXbcxr2LSMO6i +LSujjHeYwrLFXnNnyzHwux7NVCgxGhe2gy582YrzSOMYMc15dhf6xIc1TI5C +jDGGGjQ4meYg4/sUuwAweGhBIwMEAKoEaIXcceh9Cz7IW+U2bdkx5RCcURiv +3qwS5YOt9YsMsaYGELhbWi7K9k2TzlduFUpV5yEeRdLzEK1wPnea2QmyWdW7 +FVQlxcYtb+32/a1x1V3Nn7IMrZs34gEaZGewKvkhlynOa76HmJGgzcuozFq3 +sEhn7M2/shExhsh17D9UJojORaCGnRh3EEda7xEg/+B4eXSGRjzpUwpluaun +nuqvxujRZ6Bw8mdlfo98zlnFHp72SjIKzopucEYk2JdZLnTzekcLSAvPFLT2 +vJYYBhRla5V6uWqm+/wEtV7LOsSqn5iOp2DMp6g9Qy9pCyadlX3Sudnaw+f/ +v7Efyywf3MkKmqzDHk98mHBato6iLZq9xEJJ7HLKHu2KBdXaxB70+XIfJvAM +GC0a6cknTwDvkA1PB7ridB6XHcogLxiMWEiDSZyeDh6CgJeLVLo/UFzMxGiR +EErOU0zfVPz7WB1OeafKAA4SWPYqAXoB6buo3ufUmVWjtAVyhc0Ay9ih0vPB +1sCXNJIIo/++9O0NkPtPVNW01rkRe65TQh7aPsrIy2JcSKfvBzgx90chcXjR +BFrsPQiguCaJae07i5JZqUrJf2VgOyG06+eoXxD7ORPnxP+2FEesSO3hJZN0 +DO7Xp1aQkj4sjOI8w7xls/Oh77FLN7UUPYuWr91ZvieveISj69Y4OsFSxUis +PaIxwCM95EbMZhRvDs2M67dDIGCdrYzLVbCUaleQTopJ461al6zuJ+5t2Vzh +ba27ZBogLVejRJZkBMwFDvOmDqDhli5cbLvIb40hV8OcuiIv+CASeOmOboU9 +7X2JnnS9DVc41Qht09LJXohUvJdjAyE5n4W5468ilR//p2SHCFsiyNVsrbRh +2zxH7sJEddTd5KErk7z1fClU7N7BPdvCks3tYvPZ5ZqP4roR82f8GhKH+VC6 +DlDEn1A+z6Q40visieMLIIUpq7sSLRp7dPqp2ZsrFkQ6Y7hzhxwsNI2REG4f +l3Lb0H/vDj0tQ+9ptVK4EWgmJS0sCB+9cuSMSt7IZmbfr6l6LHm1w3fvfpC3 +PIcVnCQaxPjtABgFLPhwk1BSKM8uZbIIyhhvF4oJxFUQ1vboxygj+eiudIAE +BKj9YgEQ1Xfr15vUSXr0sUZPlcoH4wMMLbbu5r9GmVpL0gJGMLhUhGygnor3 +SmuS+5gONFbaWU3lnx15xAPFxoDzFWH5PT4tYoCWN9Yp0kOuAnLU8N6WWIh2 +F3o2mnB69pAIJNiUEVLrblZ46VK4t/m6iaGZvz4pqWWmzSIHlgtIWZQot7MI +NSXq5WNMjJG8j/txC9W3znjYbAyfObDPpV540ft0iwjFLpSE6Gh+dz3Sregq +ajP3lJQUVcYNQ+nbgsy8bXamhPjWHbdXicHiZ8JUBuNR8rHwldP/AUrpTNjM +JTk5PEGRc90r6AFKIHIN61QfJFz1kczYLmkM+i35rzHzCmJ4L7RFZB828NUB +o/bd2CUC1xd1MFvhBP9Iuw5sh7QZu4DKUPmiszPGYMGeSIblM538i1XVoD8o +rB+gMW3KaKQNs6FF8wZQFyEqiS2Zua1eDabnJhBvRO4q58+urSqjgfKCPxTM +Bv3bYL5S6UGN0n+nMXxI6CkJsvA23e+Jqdida2MYUaRm/4h1G8jox4kyues5 +e6i2aac7Av2bJU9dGbXQ3ZR3m1d8Og7QzIhWMeyraeEXWNOm6SToY72uJk67 +/2LyTLouW0h5V/JXFAyNBfoxJCrORp+P0kpReROVkt0VenuCHnBgU7isaBAR +NmWDRr4tb0qrIszKyYHb/Y1S+RCGhhWA9LywVJJex9teABFAKr9lu9G3Poeg +Wy2tZl6hMWI8XfkBW/sL+KflFvb6peDrIUPF3kdWpF8Xs8vlFZVQVp2EwTCF +eUppP3mlUO1A9Wnl5gg9fyGCxSrJLuweRIg1cBJFeMWEcMiKYpxcNYtQ3n3m +6/5CoSdQtca42UMMl0kpom2xpy1XgQbWTtw1c8PzjUZV5SmN8i0Qk3wZe+BE +LeSGPbOrCgDOuePzSn4JXsXaMu/FfLlWOZouX3LNW1oaVgw+SyeF+c+Sp10G +675P5GRAOYizlb84O/mUSUdDzfEmX5eFaoYx4do8yjWg/ihmygafeA+1dQML +R1hcmktJDreWpm9cRJt+hgi/O8+jzGhfIbsphp2i0jVmEXzU8n41CfMPCQta +I4cCHGiSkADlxTs/X+TcI3gPzJStOuUW0JK4uDLIh/DIHbH6WVM5zX0eRro2 +FgDLJgqCJJJxiY5nOSKPoRTU2ChZhCHpqW3ym7SLhnJXfOnLv77kwqqZFppE +v5+1LBo2ZTtHcepYFYM5HAtPZdfVezoMPJn6uJ2T1IUsv2zeZuu6ra+dzS1I +zbUC2uHIMwsL6x6czfnBn/hu+nm74hBW79t8omLWrndLDZ2v5rAkna8Gc/NU +0oU8B/QPx6DllQGWN9Xgzmyhvbea8WKHlxKBiHp3MZBDRZipj9DtVj+dJJdZ +tnjuVnFBpdrOyq9CWpmNiaxUVx0ZNOXQLbc+eXmC0gK6Y8cKfI5ouvalgLT5 +Hase3aDkx4TRtw+JfN7t/8MNisCm+Xea6fFYU+d+cOB9yfQB46KWP1sgWaa8 +EFjdEuUjL+f/vOcnBF9tUodECBMKqdNqI9hsOxid25edRzYMukT/8edYpy+h +8x3FcMc29MxyJP77erF/Bye9qmbCgsJAVpMlQ3gKdK5FbwE2b0y+hcCeAz0g +DSVm7kLDIuTJQiSh7AdZe4AJ4nFLhIv1jdKIXULgqiTmpgQ6NG9Etlo5CoMa +McSxESuvLHedAvPSncTrma7kTEXtF28LnPdX0GD7g/tglSDfxmGKclmPbaw2 +5J9BvRvIEBtKAQYMC7zLspePwfmLxNFGOazg3/kJl+mmzZkD1s/QMErSygQO +v1x1blKxjR1+FMxiPeMl59WplpugIEdeHYgvN5ksI1R5lIF3sd/VY7F6MnLu +9znxTLKM4saEon3cq9uiLnGwOcqViy2en6c4wG/D3hyzCfknTFHAIg/Q/55n +C5V2gLXFhDQxwIvYR0zkPyj/1/lO9EY1VxtvdgZe+GfgHlySvL4m/XNOkWEM +1LNVnm8ReAaFb42c2Q90qFRojylFlhXxw4dXaE+d6K5WKyRH8zfsjeH2Tcuq +vsOBgp78ulA5Qrec/9/nVDFBuotZOs0L2eFhdE0uaLzo1a6YYPsaOTnlSmQA +iWRgPgcYYjD/Bs1haQQ7Oz8D+5jX5mziWHDqgzs4LTPFiJ35CEaCmZvOlbG9 +KzMJd8fFJH2JSjp1PNIC6To78mYELZWcLaNL+H1Wl/ZBbVhtqsHiTWavYouy +KXkch50GSxePxs+KewDRqNN2BjZIqjgRyLjsed/oVcU0UjueLPl7uEt6Pp6t +j3me/TQ5s6j80gMnuuGtD0D1XIeH3VCzOyip8tyEQb6Nfl6gt6pu0BAnOXz2 +JOBAppmrAzRUcrdlkImE2dGm+GorncienpFDm/ssQ7zhC7mDsBvxAHokszi4 +7392LJpCdeUhhJ82+TYdDrdOkdpxWjkKkBoVdFZbuZeOWJA2ZCYTHup0lzsA +AACLcEd2clQx6cAM8uxB0381o+ttKBY8khrV3xWGNJ8CaIjU4yUAxbUom2QI +tSQLi7W2Fzssze2E04tDooNEjj8yfg/JS22pXRAmxnKsA8PpChTvEv+SF8xy +QayY/5fB9rTZG/cnBHWpk6j6sdmTVfKo13mBu62hsTYMd7KxCh/c1f7p7nwD +48aeOfBlaRHWMKC/p9wk5qzuMIGY0atSuyqlhtO4+DFN/FyIXElhZtbunhQp +xGfGkUJO1UG/E2+FH87t9uDZ6vy0UsGuhRkTplDv3kszEE0AAgAcNuhOh6V3 +XTKYpd8+gKCJdSwUQRzHJYe3tEjbs2SDwk/vF8gZe5GVFluEi5Na8uSA5e2a +0f+SH4ZPUWk7lWVvf0johM8zYjfam1Gv+zvB9IY2LG8DVa2SG5g2TO6pWHLf +3cdo4WvRgFLgxKJ1CVawTV9U5phSy/Th9ft8UqI491QGEUdya+fOUGcrGHZl +4f2LokYqFnC4Yu0R66kPGdfliJYFDNjFSPUMCQzytCuk3l9GTaFDQeSVVj/k +Od/Pn+6yyZjcEO6P+SVMk1t+KViZxR5h+SMRCDqz6KqtZm3bOLCAL0VO6Rf4 +0Z9Dozm9tHOXuFgJe3yTN0zY/jyBkXOOzARZDfxChUR3IZm734T0K0J9x369 +RrF2vXPshoU7jw++Z6yT6HW58XSWzKSR1hp+SvtLBHNxErhrbpsLQ3SEcHCi +U57Kwp9f22ByEhpjCBpWugbamTLefc16reHyux3QfpfHK9NTpZB4Dxxb9cR5 +F6V3lFehnyx2WmqG0pcRO9S5SgzxEjG6gd40ud+9N8xzYNt6PDvL+mnm0kIZ +5OWnBmg3td2BEjgBiBt6sviFNxLGbDNGWGhCxVCWH1zMc/YDSuWRVGHws92k +ieGikqxHeOcVtguscu/nWuJy7fwRDiQRKAJQbcc+XP1w4Xb53bKi+MoT2cus +XMo/t+SitK4e3Kfq1yK87c9LNtR8XFubcUpHFxB3ZrA/sy8XjMhOt0qbrSie ++ERZ3PPYgRSzZRt98OkBOOrUwSETf3GkRMXkhgzWS1HkohLSPQLl8X2TNyzN +DK0A3JcpqWbZcwK/Lj8YRQGmob+BgtKnpYk4dXHudfwa3jRjFu7FhDGYZEjN +D/IxNRDJdmFjB88ZlsqgWDDsC+B581rHzShxI+rlyQeSxXI/IbWaDyjm6APm +RCLKb819W17IhwZUy4nwFUaq2x8FCpb7L5Z0Tn0uFwIJiFdIxtB23zOFjsEn +Fp1ByBw0d1dtowMZ0zFFfCE0K65YB3fat5KvNCzICvF/8P5UrWVgtaJaGN0K +45nYRJ7POh1rUN8+MJOBL62bNYKVtBTvC9Vc0LQcYNNl7Kfiw1+wv/ls+NvW ++cDMJOUL8NiGsOz0pNxlvQq/0sD+SSgNXBtp/njXHd5KDp/zKHBkFMBjBfJ6 +2BfsSXRcGAp80ylnfctS95KXIVTr/nrNjaEV8psFBDaG/LTYFU4n/k1YJd1N +jzNlpiVqOcPOBTKMMHKxUKcJBkmLhGxZ/EtHpNG8OlzM3bmLjpHETxgDrpmG +elFmhGz5dRnb522fpjILED0TdoQRJtkak10ZigI0eBdrVRCvlxgnIxi8RFng +C4bIldWNbR0qdBQ51gPGcglPVId1AT+0KeL0KkmzmClPER9TqEmIZD3jSicJ +ml99WCqpg9LGbD2mz6Yn5Oh5R9GWCIR2q1o/AsI5MFQ9ZyQAJYoH7VFZcsvp +faZVCtbxHbeqr+NZFO1+HNk7T5SFSA7kqCM8PbttAnTqmYBlOhS3mloMDW4S +xZO7ZJ5RLmxGrdTQ9Eu6tWGLJ7niPrwDqcwc72ixjWm/WlyudWOWuDU2Y1Tk +4rwd7gCgmOgZjB3o8PdPYtfDcRvAs78+rz8JeFeChr5FfV7q4MfKHvN4WVgx +Z7FcaRPtgJxnGgUaU5TJ4S01I8gYS+PHhqqcuhE+DfWgaIi1rZ7nOU4jXeZZ +2G2zSJeRwhIdNKB8FHBfn1gJXI+4PCt9m/1XBxhc+m0mBCMXYtm20wB8M4B3 +vjd+jvwQIEACBAASGUeJfEy15WtLHw5B/SDnJoZidbZNhSc+mat7HDti9hbR +PMxXV6yfYKqG0ZkJl90rN7u1x2XvIQuZePzJVWElpodBggRMDAWsDAxzKpfe +JU0T3NoOpkofNWGhO1EQUvdm+HQGXLtR4HDaoDUNrDq4ouCv8uOh8sSeo9iN +p3r0aJXAzBx6zK1u55pe6I8kKdYpf+b6WDYvRr24Nzrz0aI0iyUaV8PXAdCT +1HVGwPED1VMycTdcjh5O1PjvtgQPnXLy+IPtfv0u/jiiITveGcF51RLGbGMj +dsiBuzYRHagkMZsbUjbrT1QmrD7XZD6ou9iON1oGVw7KS1atk1fHWU9O+oZp +XgQo3+7tFsfThulR04Ro+CBAgAQIACwAHJBDM+kU6OLncYdxS4y0VcEZAI/g +n8tKU5vqEICtdQFFMBtNoXL55dduW0IP8fHTpPRg6yJJMXlC4B7CRW+i1CBB +l3X1NcDVJHSIpJFI1Q/PlJexa/VfYtr41QuSO8SgugzLFp+uvJPGyyDZ8DCR +D6llYz091LANAxNyac6iyPeNWybuBop0BDoNzLp9LkWS7/LqgagM3Fo3gq79 +oNEU7RiAzRmkzrnwFTBIw77uO+wHvJdbaNkyTjWQYyaRJq1pj8ACNVwivATm +4UiyOmAztsJuwng+kO42q4tXd9NttQOjTaH/bEreKeq/KFmK7udh6WBwZ2WS +otfTlsyMQCSlHwhgkarb4gkCXW0ivqvR0osQTOJHHyxT5dmuXBnBwUiHtL4l +4fWSZLTxbq7neZEjh0viRIuNaWo9MFzfKJNSbY8n+DlaA3uBN1Z9JMBOW3Ei +w9tO1/FpjpGVl+OM5VbfESOKi4zx9Q12fhJ+S6/urQuNfeyCLigxkaqVaueO +MQtw82nCxMnHCOF0PtwLbAw+dipDGX1Wx93ol0Bs5CgE7MjenQ9kdm7JbiG1 +pHPJxkCABB3K9ssuOqLLTuk75K1aPcz87REZ1wBedgHRPafIhR6FYj/6eIuL +6GkPhjPmPhByD8mkXiCxEwT3yCmnP0D57HP2nhB3YGUhKKvjVKe294V362B2 +T1m0jD8vAaFL6pCnPmk3Y9KD2/olANS40oTpLz4pzcVk3pmvAWKj4Y6NE6tO +iw5qSapIZtZtPRr1IncKQrk3OURRfDFFlC/1WKt+P2WVJKSYPHDFLnP4T4w/ +4UQqqHNNJXDySGFpaQsPU5DUcHnBsS08oFZ6ZuVULJ3c2mg4jRInlmBZ2lGT +d+uMKt6F4Pl6eVbsbWAoJHmgEx5qJz7oWoxuPnm6/TS/UJ7jr3RKFcPAGcs/ +r7GORZxDfvoOoOHEjKEpLfhCReaFnB1PDhbScgL62EM2HqnjV2VOpTENI2gG +8wBGXvobUrO2vdm/ghS+aQ264Tb9ZzOs3ahiX+APYJO6gcrYN23FFqNBgpeb +gWZ+FhOxYO4SVI1kd21XhbHU7lslZvt0ZM0IUq/o5PBQWWjYnWD5vl6NYxza +K/MCIhU131fzaOPubDGog7jf4QZdm/xgtpfrYmQADE0UH6uVR7Hf4k/3uKxf +2q3V/W9T4TxXL+z2n/n/tm/ZqzxhOtCEkIRgSEIVRRJBhVSFEhGqokWiOzQq +TVV8T6GX6o7X1nz+HyvHcjmfx6Hty9C4zoxfRdRtwYFXOO5j3B1TDGBZmvTo +qrGZYCIFVQsQyKnTmTbdvG+zJibZbnDXq0ydrhpvooaJ4WRg0B89Sou1BPiV +sPlQ1ckVZjwTk3tNjf66HwoHrKhwKyOIHCZUqH53+tn7Xy18aVwzqo7Z9vlZ +XejJplWC8JfCK95ni/yINTeIhybFjvxBh4Ko8VkesS7AA7v/5feQmJKudAd8 +sav7oPgki3HkcMYvdEFGWoUMFQYDc/BXxffrkjug4I8d195DZ3GwW+WOzyL7 +Cv8qleHEzGM08Wkp5u7K4NHdJrxb9ItLqi1R60MVb4Lp7iDFqPrH/NAAea7V +wpmklzA8r1hia5fHbICS6ZIlLhGZ+0Bf6RjCTZc/rKXCybPA8AoF8A9AGAhO +pvOeolWIFlizRlu8B92scbjs8WyA9zGT7g67fBLKaA+GwQABryw1UUa6vlmf +6li51KQBnj2cDhB00hjQqFm4VoJCMNgjGDjV8NhG/gpuT2vHywHwXca0LzE7 +AMkQpI8eNzVkzRqDEZCW/FwoIp+YkT98a12i4F6dxgiGxynwTg/eutjgr8tm +nzkSkix0cd0HTbPYTJeACA1URPZ/NoB+PADxOKkek7XctL5Tx+s671e7c5sv +1Po/14HO8l8nF/LheP6rxJJqRCoFKQn1anDU47DxaCbmyRLByEYrmnyAGLxO +x1/cHaVItj6sd8fLRruXookxa9W9hdaknHRKyHX489UJbrSMtw2lqb36diOL +QwOzdjRhWAoHyzLicXIQoo+ls/YURUWnyzc5kZwDskrFSaeggXAABVaRNBIB +itEeKsJRs0f4zJzQTXtGJbHjGXmdkHV1R5nG1G5LVmMeYIMGBHPKDajFIRpX +QBwFAmbKPIE0TJ8JZxStYdWyy5dLXkzxwYfZLpl4pFFGykmhNPL7NGHVhcvB +28KhHAT/NW9W6sIraLlYRxxyq1+4/y7P1QO7PNRO/VhiZ9rK4HIMrV3YSO36 +sBb/xICugY48neJPg57IcHyd02gr+RHJV0BGk6j9MyeyVR+/xnI7CoqQkvCO ++LGIcqlHlA2xF+uvvpktZBAlYl8+VHov85+d9FN/zDhEgD9xpsLn9DVUw6nj +s98VZ08pog1BgBTnB6JYVuKb2M2b+R0tXVvCWUGKzV9XdzFMnUtJ+7oj0fZ/ +iBHY4PsH/JJVNtiGp+C2N9RCqBBvG6Bd8F94RTCUybeL0vJ8r+8yiqbt7gmG +GvCSXm0PaLCuQh9JtPY0s4H8p865x6iIiYGaCLvQ9P9ruzLuiio5Q40fDLKk +ddMEWjiI2chJmyZi/XhCKagNWTWB3DaAnd8KbS7BLEib5dxpgbRLdCCShL7I +if2fwc8e5tz5GhNCysZ8FEmL36A94YBdMkauVnT0NHQrw9E6r6fSj+PyKwAE +C7yQKUOoZ7F6tquenbEOmPuHyCEfBRUxPIAwFAgUPsHqnCeWOzUR+oxOV6v+ +462Q3b5ekYG2WOaW6HjtAGD1Fw7i7L2AL4z9Wd4XAZu/8eKh6O413xPlq0BI +XQoGWBXnwry/rJDqi0V6ix06AeDoiOhGFfiTG7vd3oGLh+Imq/KlVNd+8mN2 +vqxZNB2w1gXZWuJO8BX9NfwbV4wzP8ZEQlfy/UGPN36Gfk4QHtUNjltlA2sb +dkPZ6NyeAca6BYSRdyCmSywxNOUIGBDUGaivDLmByLYy7IyMAibn5Dhad4pu +v0MCPdiBsbzsm2qNFbZtSREi7F4nTKI6tMIxNQQKlw/WgAAIAEAmTWxf4CAh +ZWNuDa2m9py7Usu9cyH0LAAH3kHtipLkmJpwGlds3x4TBp70vcg17n+zRlYe +JMQIihzP8TxCwMxxGisBejjZeD/cYR+osxTCPmC+3HxGYsxoNCLOhg+Hxppu +UO9sY4iXxU7hlYlfVowxF5Nv7i1ijbuLJ9MEl/mXloKTWbiwByNL7050OLo/ +bB6krGazMdjj7/xZ7cLn8Z+qdWd6qRkMGFRSA+F8D+hhrDI4EYr2cKFD7QYe +ETL6iKpjH5opRm8SuNPv25rXLJRtogNuMlO11g+sxbvYKN+57IgmzXI87Ena +jJQ+XHGJ7IhuujlVTSz9kMSfbmY45fJcT+bKPv9mj481PSwAIw7Tmegso/YV +TLlyKQOElMcrJfiZe6fm7D5cVKfmqHBxRHL0xxHFhpBckRcdqjd1CJdrMPYb +PbjP3seZ5AbEsffSn4u4hGwxjkis9DF6b656SHsQ2DrbILZ+9VOS9WuQAsgk +6eMRXLFb5YYpXE1mZTxJpnW7d8LzlbZQfnguwuV+KW5ZLAm3H8Ab+uQ4/PNa +P3oZ7SMlO8nemb/3kYQvyYgfwn54y7UV/QkvEMZ3zlsgkwooUxiJO7AvrU/8 +aK/1LjDkQPtzSbb2lgriw6cXqFfpPLr7/RjEP0CtO9eOJfQtOI850RjG+/Jm +OXCR36bt4RJsweHI+JurSAcS532dl17ck1vESUREJrUSXQbqz/hbtCpB2jNH +k/erT/YMLeaGq1TE4m8uNv7ZzUb2evihQzm8ytAboaQt43qwSg+eYq/PLU7Z +El2yiHdwCKzbtr6osZnu7NjmOlFmGwSpjxXanz16fuwxXuG5u0dY8mCJWJgj +bx+p4OskjsGYJIhIOcVN2Z+JoMVoIJ1nEi3cCREKo+RKN1Fd1DkPMIPI2c+h +3C+9oM1VklKJIFdlA2Y3W+x0sqaKFZr95eBuDV0Do6ffIWUKnHQj7WlBjWfZ +fT3zTNvLWrrOze0J+Xq1FMw8Oj6ExR+H9KPZRgO7Kzw9D7DeH+GZdOa1OTHP +2MyVnTpLd/n6enkyhEdke5QK4e5zZsJhlVzB1TuXwHt97MxXcdA9J6dgnki1 +9lhRDmOVwvfoxZ4rprfezeBhYFEgo6ZS2YMft2czixFlH84/IErosuFwXE5H +XyhqZVN0y+LdIjr1jiF/XgQFODKyEPwkR6SCtxDn33HzrzRxGKh2CZT0XqRc +I/X5BHGd0P6U645btMbngzwRtksL9FdOYdu1OB/ZcXL4AEw4PTmlSU06nTr9 +lI+Kf1NlrJPe9qD++HXqxZEMnSYAiUW/k6TYjbKP/wranfkxjrWgQAHFhrUO +IgnmiFpXd9amWCnqqDeTL4YWqQOZeFZUr769ndf02SYW03MBAqHYo194e4bf +Q12ao3p3ZA/HNhav4Q9C5icO1bXxXEGMNz1U9B4NV6eehg2kR713+9CUJ6rk +rEjltbk4T9Pzoel4PzW+myDOd21eQyQ+7rdyhCa2V0AQNYzPKRGgpu6kuYT8 +lN48m7OZg4XeuffMez092BYqOz5iTm5LeGwgBy6KJwRkzbu+50juG7Q/slj+ +zur16xBzrGWOZGnTT7sDX4b9/fxmC718Qk0Pehef507R1DV9Q5RbTV/xWrd+ +qcs+hMnZHKz4/0ojf5rR4W6KN+6fOB9Tf7d80LVzmExD0qkEofCj1hgTXlTY +keGriew3s7IVuZoXw2mcV9r3cuTiynaiiUnnfnhv9AL8131QV6fLQseetpK+ +B5SosrhgYvXjc++I3FIEIdIU+3bSSiy0nLaZoS3FBJ4SIt/DDfpN40GbATVd +QjdvqDBiHngOPW+cklBiKt9tA/G/NP6thhFhRkLLVKkmM+yGG+tSxDhqe6xh +JMx4xp7zkYmowhFS1mv0VmXteZg/CckUyvt4tpjOVAG6zbrtE3Q5DGWGwBTA +RGJegQHa1lYw+G9OxENLYG2B/5Rw175+ONX4J4GVmC4UmOeEF1t/yNBqGxQV +HsDHZ1wLwJlwhNbB/EX07/lGoIaA1t9OWpljGPKqRsb8Lz3Y1K3yBgFk1S0Q +vDyFkAXdKmut7Nuxut+16ksepERKU741Jp8eL3JBDieqJrWD0Jft40Vlf6oh +asACt48vxWualI/1Mjrg2bmn6U30l1rGB7U2ZXKADXOXj3K7Nv+ijk+9wLX9 +S1W1RAOR8r47QHwFx6AB5UTxvcWZa8iKVeI0DkGNF0f1Ceytgeri11wQpYEE +zi0F3eJOdu9JKNzEJJGYE/1/AnMLDC/nCKnjmGDPloOJYaQtAo/ahWtQa1o7 +G45i++hN0zkOzYcDXy7gDppncxk0QpMX4vf+1NLkF28hxnonkCwxJSXSI3FX +645IKpGP9Su5V2eD0YN7w2C9BR5kkoK8tw2JrvAxNiM6jiQ552V8Drbkhges +V5D8DESyKvOYsxeDmt8swF2Nt6xuRq7mKRm9hheCnvv4FXzuw+rSyoUjmlu3 +jTtudPlU0SNxkA2bS4IQjmjCJig186rpV5AxqwkPVC/nuqvowKt6utarB720 +gQ0pfS3N++KU/KfNckyPQRBhSHkt0Dh/rhGy2Jy8sry+4RCigibJ87fQBmew +qZDLi9ONujV8gBbZoFmSGgjtwCIa96fqHq9t71yN879Kcsi2V4EAgcjdZXBO +94G551gGnekupBaGUv3QihvdO9Qm498I3rWdE+DWgi4CtiABRGV4CrT7fTLD +R+1wF8GHoxQOOTIzlOxXOHd18Nv34cNRPt3eFEYR9fdqohdxvJwE0XApx637 +3lgvhlBQzqpfgSjoo5wwvuVxI0y9ATdBdNWj1XXpIWLTORhqC6qQUhbRYAtj +3fTcL5ivIHzmSwhxQ3prwC4Va2gJw3W1DC4nMU6kX3KdWpdSEptfUw3EcoqT +ZHnXcFX9ICMOp5VRsTDaEIgMf2+VieX4QdDvWSd74btlZIw1WP154sLNyCoe +/2oxK6s07V92XnPE1TPcy/POZRjPS3OxwX1PaGi/kub5m1q9IyQmZ7oS/SIL +DHjBfIbRiNmdzOlnhJlDhCcHcd4nGs/UR8YZJy2xOrlh1guL4sHm25vg9kpz +2LVuTJ3qg4TThSvuTUQnUX/DqoLtLvF3tNtSCQHY2mALLhwhHyMxUbK9G6pM +wy4fWBQYTpvwEeaRTl0Ze8zYp7XDEp0fp/37aq3LCFGU69jMtmCMLiyQ8Xv7 +bzXWqTTeWAtVbBjAeR5UeOeY0/2awfMm5Airy6/QGMem3PksDrdyD4z5i/CM +SVDciECFV3d/IxdE8+EeGzUkTJM+KmCWIs6/VZX6Mjik3BX7q1BhUtm36sk4 +uo8Wuq2YMyXFdwXGYZey5f2HolOGEx8Wsx2jkZ2dwReX2Pp/+XypaECHeNS2 +d7qpG6RNPxMFD1kdw+9Pe3+BpCB946WvXhVECQoypktwP+pT4Tp6YzRHksoj +ri8LX/6abXwqi6ktKD7xQhUUgClKFK7h1R5dmuVfSbC89PVJJ0TMpuIcQOhk +SLZrXmrSbWMZT6MRpO2vUC8frSiq9iK3m7/cnp1XH2EGpcJa7xOXGZJ/S+1l +15iBAtbphaDoAPQZUKt5yISKkSaXpNhOZVlrRzg/8VtmF6k89M65jDZLdUkT +ZnQhuNChjL2LGahYnNx//npgox6jOyCZ1A6WhteyR/MjdfLBoykT5s8GACf9 +T5N1VjPrKdU3N6bTRnMVMbTakBmM+b9oEZjXEsSrpm+tq0oaNYFLuy8XEXUB +/zgnlFVT6mbOVARbFZLZDgxrAFjZUzsNi0sKBu0z4cQqB5T5rNRPNNIMGe27 +EVUPL3JfCDDYn19DjYgOsS4Rb0obYt79QbMBHs2N0xPrcy8BVKL4aTQ4RSRY +3qhnU146288mTq8sfyEIs25eS2FMoblMHYK5tLECgdQUlgZ83SSIADKbYwAP +z11ztB4WkOneoq5StF1UWnVvOcxuXHMFPAxnIIEdh1xvTJc3iFJdvxsu3VOT +LsYyrTYk2M3lvI6wvsSi52jUHg8EKcUP6rNF87uQAJilXOuKq4LSF4Syj+2u +9LBbUE6nP5XHh3YXvtePiuDyK5W38AaPiWdksLJBiGM8ChWYsffLY8mm/FbZ +iKb9l1j2+rnkJaRx0mUw7qF0rNb+ZCiY8dYpRXsQWp1+YVoAWXvAsMqc90bP +/uMUNmbsnSeDIJb/S0Q34Ug7jW8fkikM7ESpjCEb0k3UtcTd6V0iA2G5cJIO +QhuHh0yAwxfzcCrPqNIz0WNCf+Krmb1pzRWJiRRHSfA21wAGMGwd8KgdP9CU +tWsyvFP123m03epnIsABH2CThT97cKUFZ0paFhbg+V/ufIOhqKha1pkWf65T +bMfy0XyqRAB/2LKcke25ceQFiwIuDccSxovlIHOdW11DCBN9c9v9Hc0Trmvl +wVj+WGBVdWuTeJLLdhkfUKRBTNWa5lZNOi5+G+Imvv4JuBIJdoSA6CGhWSWa +cnF3PJUYdtg9WKAqWmpcf00hTwozQnMgJ72b+7Dn8863ngZrBYLG+WTTIRmK +f1iUoLJg6mcNdut69KHxAMWiSYw/nMrEm1dafIuuFWPcMuNDm/lrcGuDctsh +HUk2BIMPpDAfMRTlOgScoV35sAUhTBl0dFrgJy01htnTbqgmTYKH5cuSOx7o +jYTLkJF+uiRBMvXYYPG12q7DKpgzpeMIZli5OoE0XhvdrB4sd7r7QBklLqSA +dLO8m1Y5WC1GNiUhtfPEdRkqQMTFH2bsrWZOGMHPetC9Un5sTY88lGTUbOv4 +LyHk9vOAUlcEBxDePjYy7lSLjmRvxk2s1JqzE5pKVx2O8Og71nGDh3zvHU6W +FS/jvRs8nn3yOi8tivH2aZrgtlPVsO1PnFVlH1TOvErQAk0Cm8bcRcAJewCS +XfucOO3LEVJ5sS19PCGpN5B6md11cA+TyL1+1okaLRNC51bxc0jVCMgs9f8Z +OVf00TqWBlcMNAsAhz4HR9HG7ZBAqrcmKw8cLv/XsEiTWyGenSGONF+ZGIE5 +kXgUMPst7GT0WhxpIMIwP0+iOZWaPiL2GNRSccZZ89V6eOakBmHVDjx8+y8h +MlWcUvcK08h+580CIcQhTA2Z+akZFsokHwi2xPAiTTOTeFwTpNO08hWVR2w/ +DPq+b/pK9h/wNLbFIO6Fbb7mOI1H8CinfsbYwORpx76Lsw4sk84T4bu96E3f +pUQ42Rpxlczqq0d0ekWyQWN4kttDK65HJVGMvt+rRkZhZeyE8JUecLIuiF23 +y1Zo1yuKnoOqY0W9S5C1z3/JLGvOcE1YDByX21CJ93gPgeg2Ei+kDDSFdgqm +dGgBpDoblBPGSSRgqe/XBdbH1u1ncNTk6jxwpmXsjU7C/gd/ps8lluPb+Pqe +sQxRqKzCmt+7tfOOuSOr+L8PhkUHsA53wYzHZRLwelM/aWEmhWxtNZkzZX4r +dQCmv1hyu7imFby91ri9cocIBhgwAGxUDLQrWcsCo50XvEK36ie+e7BPkD92 +U+iFxyK9lndPgZa5+3xrNj6WljnRZDyJrcpWQ9bXOlG4b8SDilud2OpkpoAP +S/2tbfniGZl5ELWeRqe+Nnu6KnWpx+VQ2/Maxq17Aro+3KezCY9r01F+Pdsl +wlQSsKl7/Qrn7f6oZ9py2ZDmq8Q0EdE+GVGSSbVFwizUp7b99GAI7t4y6zbW +k8mS1F0rWDg/onH4pijlUeduMW+ljURSdka9U5pU5izmJG4Xj5qmtBVuu6u7 +Nj8KsMc4JQkk+NlICKEJ3IcTEgZmrndgvNsKv07Pl3pGCD0YNyna4w/EFYHJ +VWkDxxgZgmUAHGEyGiv7UKIKah6mVs0KZ9tyYvCGhgMMs5lMjA84W2xoRopi +7j82o4wWSJYcn3+G9AFt+mqbsQVH3VtAcdoXuDgeg/JZhueSqshiBoSdY3Cy +TMH+Arno3OgFVf+9BKxqf1wCQpidnPY+RJPmZw+Y3toTX2yHaen5kSM7g6Pz +V5Fwq1QWUddBxeyNcv2DJkXSmPAbZlClmqad+q8wVG3UV0nbXo3OduHdUEve +JHh0P0d6nVjzJsZY8TTFBicYt8/2p/88NQINWTpVRDH4RePWPP3HOLjLwpUx +JzP/eBT0olaozTtovTixt+GTeWDr+gUoSqwhgz+KbPAl2evwwy1th/V0dJiD +xX6L+tDEd0L3NMolWBoLleOeDllkYtKCQ/FYS0v1jpY5drEX4E4JizZYT1Ap +Fn5zEr8YUUj/lITmpUaTVDtrjxtG2JmoEJABMOpD/N1g6fG348rf9OtjlSnO +FKK43B9GGMidUkPQEeTZA3G5PhPpZNZDhGzAPbHMTmBWXRViQQgI1uDRJI6E +NjJvVFTeJHr4Ycgp6ibawLMBeZ+KE5a0VB1kH+Y8Ksl27mYIbhfEaMFr0/Xf +WkIAlghrrFx/sRkDL/csmIG0IJPPxXGVYuMG4Va9Cc91JgYBoJyLiK7lwlAF +i0zauwHdONptVeUyv31+JReFbdxcUOGBkUjTxqxij41gXqrtQ0beBKFW2hlP +RIIdJSsUzfxfWEL9lDsX9R0BIzpzEHc9Tc2/g3pqyELArCtu76WIp/adO+Eb +7HSPK94JW3wq0xQX2SiKuk9a3iMB5KLe3rlStWzNDKknwiLX3mZUsX1OLJjP +j1VIsaeVHXcoQnipsDF5jlOsYVVjTPVb42tdz98k4ltzveJVy637qroE2xAV +J8kUDnILq9f8UMnFMCkaYq6WGK5wvq+HthhKE5jlO2AlqeDeqmsOWffSF6I5 +qmN+Ra2ziZGEL/TN8hkDQhf8MrZmf1VjHScSWxcauYawjYBL66nbGh68XF/l +O2PuBkpF1iP0VBsZf+xEcK1yVnjfTON04p52jxQvg5X0bc/gP6SdynZ/wdDx +rMPK89kabRj6XoZzYVCbzDuAmP9h2r99138TiuGobPaA1CrOWGwJbiz+mEHP +QzctJXnoLcxmcDfMLIAEDa7YhtW2BkJBntr9n1lDV8R/tgCLMqrX/wWna5og +tJQoi9bXp/21q3hYZnKTEPp8sRuv6bS5wn1fHYmJKSmjYT7cOPDho64WHyOT +6dMT88t2fthjGcgJ+yhKmUrTDgYybELzLojMDsm5jYfiJbRVQQ53fNnnIh3P +qECvsyurFUkIlnSDM0iI2nFqD5YfbmSjfet0cP/mAuOpvgcJcoFE9uW5eseb +TUmtgH0JPwH7Slg62/Is7d63VDXELcGBVFsTRXby8oZx8WUK0HppbxXUvowG +NFgwEPIxww2uTkh1t6BSW4xtqg/lgtjySTPRrMGn4DEvUAkHk+QwoFFi43bE +uQkBphYQEABGg5RHeeSNS1LNK9wdVrNr8PmrHpbomvgeKTjW5se36rbXcFH1 +AJikjVqESWF9VMLlZlf7VfoLGPcn9qllq+JfrylGqME89Uvlr9Mf76/hWXE0 +BAiQA7Kw7WChIjfE9s1Bni6lh53NUW5XkNykDyM4x5gzdoT1/gvJBpW+qD/0 +4iAT5VXSkHDMbqkn9Xd4H28QKlWiRN8z3nbgMbobmjZoyXwBZCkESv2fUJ0S +LKaIf2PrcbXJD57/50ukMMWEhItEGW8mS26WWlQh8cbelb4DQ73MadvG323S +uVfzV3qzEIwveVE2190ixtMBVDI9Oa46sHnILcE5aoxilC384pGTt8fEH/td +QIwzJqTDx/NdLdG1Gldn2j1uoHpEEafchgDL3VJyYhvfogsfDEP2c9t8Rkqd +BhXP8BV5q7RxE7LHtVvO3WPbk7vyUgF27FLWzuOu1M/lKK4SLWOKZpXGgsdi +O47aZhRkUYYbm8/jTgtTJVJ4Xc+u1hZLzSE8NUvMFhK4MAM+ZcAN3yG3OYCI +9d2IHtdYspjmVqQRrl8KpCKODWRnw2Cog03s9QR2SscNlGPRNckPA6Xs8lyV +8xO90K9pk9A18iwyKJTeLfYhbZMY4dIytqzMjUZGk/LnHma9kTA5xRZ1AI6w +ArJO6JQDGqFPsMC5DQ2OIEm5u8UbKZMtJdVhQZzZpGlLVcvcGG0yrtYZQAMF +BNMqZikywQfsZD4G9uYj+NdDCqErY9pf1sVi99YNVyJdEaNV59CE9egEM0z5 +g17VHibj6VQJ6mj60RRUuoGTZubTNOact7pXJjtHsMLvSMcUcdSxoEjse1fY +NsF4t+M+pb7QOut5J3qk4MmFx3wb1e2zF8WhTb9kiDvMkAjTrqBLi7w/EJZP +U5jPjQzCB8ArYi6TTKhiwSHS3R4ON07ME4Yr5dSpu9jptXm+1Ghz4i16E+Ks +oEiHLuJn6kuKF6BPIqRg01Wh+hZMdoYOYHPM9+bb90tuKJQxNv+TCdPX1QsM +4pX+/JNZyHRDO0h0DWXzH4quZxWHFmjFxIPDT5dL/9o7XXtVq0Mix0MFwy3S +ppCMaqUPQlnSlJrsWlFBkaIG/YczgryZYy8ThZ8qy7RTKhGn13grjTxea/rL +yNm5G9LbSwR+mU0/Uz8RW4zcjiL665Yhy2jen2bKgXja/xrD2vIWXMS0I5AN +fa0RLht6F4jTmjNHbBizSU8RK1oZd3D0cwK/REKV5TcQS1M6JXwbMcqxfAVq +hlqWiSzhuEK5txAKFtTZRI4PkoqjusR4D/XEYAIAEWafAGoiWcE/dDa3aQBu +//axzL1s3plGX9z2ePghAIFY+UUVpJieb0x/wskNdrSmwE2aQoUPm+hQZRuT +LJtI5E0W/357jnBZagYyKMxRS/qQrbGnsWcY2XmWB+YE5c9Maplz1IdIUYZz +PHmbhsxMl5PIihCZPTgVkR9du/vv43Vd7hqfwejJdpphobiyYmG0eeawv7RH +k6vYc0O65a5MhLfGzxWz6Pgv09vtfm/NZnsfHWEfFe3/mwYESfPKDzhy5QXU +geobJaQkbhoKNbCaPs8gPixfk/SpVO97rJ8DwNl8P67wm8HXM9nf0pA1qV8l +fkLV4CMf1Jv2mA0ZhrXTsqeWyXd2PCxubJ14hJ3xvvLq1BhEcWnP0BUZmzkB +OaSmpO/KsHbgLg4Y/yH/jVSRL+ZsI/RxnSsYRK0BQ2vLygKtesvfTBxLm5hx ++0YvwQeKYis/GY+OdDZ2mHbPFlUNKS/r1XNrwfHV/vk6y173V4w3MHs2d62z +GkCp4PZtObwZTxsAC7fPlYuRhJ14LDZYwk6IYizDy0zS9DMurAzb8Orl2tdc +HrtHnRqG9KxxbQMhLSC0BfhaBXQ1psnDc+sFwpK9rk1v9IdeYDgskmPhMy0b +uWe7UWcTpb71heSEPKv7tPSvPU+TCnMu0gtSbe6viGX565JHDe/TPZjSxUpt +Daa92VWOYKWl5C7qf7XZF+Mk7NqhrKq72C0lcYG0/ELCYp1ENJb88UWLH209 +e8DoSHRIOglZtiFEMAADCRF9W+DdFLMMq7SpT5/Dx1RTLc9Y2ibvSh2UThD4 +pUmWTgzEuoatW6tb2CEs3QeXyBRlNPLu6n9y/CKajYes8xaOxHWbCdU5yg2I +JnIGExUukrcZUD78UncY1jreYtj5LWx+TcCi4zcvyfquiWAeHOVzClnnV1or +mfWCnISUNbYEnr1Y7zJ7H6hh4jmuruJ58B5SpQvzwnuKDp+BFnEjkGSBgfBp +SM6mbJjrB2D72QUnN87/pM4YLXjH+R8E3VKTi7PqdzAVJJnyZvziigRSfxtZ +GG6rQhdxW+4d5uKonGG0UVpYratSiT5LsgQ/yin/01vtY61gkgnXe+tI5vTg +rA0mW1MzJVhEQvQXWx6ZlPybnYYw310uydGz1orHqS69YH+nFbypv/PjrhPp +tXKUdVqC/GvrXah99s9YCanqOZzoD6EvErhoSJDjoNDZXPRlG4Ajzb+peEMs +NnleRKACAAZBglte0VB19g0dcWEhSbw/aXfu7vRoF8zwuZ9u9sPZzpBQr3Fv +OENC12I5wFWHZrAfO3IfloyWKGi4W/Nf+XpHb82+7w3alqw33czahuDL6js+ +4hzWehD3MRcELu6e6NK1K7eRkMS2hTP/Fj3WJamOfZAmz9KL2UVpF/pGsfLi +N6SvltY8iRPxjNRl5RM5JQsITkCABAjy7DfbonqmqQ+v6jyCfuUVcY7WxhNY +KLjurCYMBgXhvPsAEZAujQT5kkf1LvXeHDUtTvslgktUiFMUJN2XPHwScTGV +ywvr5IkcdX4uo2g+8M/+GmlFpTIchi3B8uH8HuWxo948oAJj3b62WL9IhA0x +WbZapYpu7pYTPLE1zE/tKErcGkKGmeD+hbfg6WMrYn5OQPL8H/6RaqES/bO5 +Yd5pfgfa8mQg1vwbN//bdqkjjr15Ec/rMazJz1FCveIw4owNSGuIWPm8wcj6 +c8klCdJnetS48+1zLTxpSco7r15UFDoH2oOnOasp9As/YUcy2Xqd2FW6uvdb +o+FEmiNL/iZXbNsptPLBHDBpOf9KBStSzzbDDtvFOJ3HWaQ/VhMHVKvh5da2 +5OAZJQttfkfJ0B4WYea4bgvB6fbNTv2TyHMe49xw+d4b2nYKqi9UB1mwWVFD +0PBfTyfjYvu+z+xjU9r/L/npeEvRRHzf5/jcB9TW9N2fUf26ziQ5/LRUR8Dj +/745gv7H12o7HS6rmu29ljBAVOUgoB2uLzn3v2+Wze576bR2H09HrdesgS9X +fLYiAWfhtQGe8GAjoaIXD4e/57gAWoCABAgAV4DABEduZ3ahnhIF22vVhjfl +V6qDgK9sN6wAJwGBfnQ4Vos6tjmRfp/EFfj+l8mMBjQHRLpQPC/6vwPcsmvn +w9AxBzGT2zugbeFRsNtQR364WiWuP1/76N8PjGanVoAjPvjoMzeNDT3QwtMZ +vrMwcbIR8MvlfNelpVUXyKooREQE+9BEEHrIKoCvDqoHLEIoLIDAURIpFFEe +dgqIwO4YKlKoCnofkY6/3ylj0Vnf/v3F8cF0kLz8YHSJhw7BZOICECECECSR +JJJHxlY/A+029239TZuaMLaOh8GIEOhqBp7oknvsokTL0WZabJpBBE04IpBB +E5zp+A/F8zViawIPB6782kH233/s/7uydEcCqPPdPuE5q9HCf15TnvIbPn/d +5Tc/XfQ2kBQT93nPyf71m1bp1W36VHazdUJERMoLClNihSmCn9D/x/q5wN+B +sKBqkN1FbLEgEUCkIKB1A4sWJwCwjdiKDAQhhulpIYiwXlR2ZEmUWCAlMIRC +DXgYBEjAmyWJfwEBMWrFUCrWvphLtlDVFCKF6oEFHejIVo+ZxOz+W5T9H8dw +d8EkAnJ0Uq9ikfSwEMsyzftEXKOqIXEIDo1ICGiB9fxX68Cc3v/BGSEAnx+A +6I6MAnxTgH/u7ZYKMZYECBAAmwpDu7Ejr223ZlQnzuIAR7O9ytqkIJ8ECBAA +gQAGx73aeB/hpP+ajxnK7R6D73we63QN3VHchR9zwz/eBtFbd6E8J00uwXMK +jggaoUZaXQKlUSmi6zYsVVU0WGVEvgQLktZuITYqGrFF9qCQvtcWLQLVQXQC +Wq5I3EW4mfBL43xaIy6UBRVF8S5I1VYIX2KAqBdGiWqglYbJgjaMymYgED9v +wP3f+X1PGKbB2fG6bNhrv+6uGKriiDMRmMXiTSWJxRovWIxSGFOYCdDSITO6 +EEAklAtYSgAu0QEYCZ4JJDE5wnnRyQ5z55CTBAyKUaJr0QFaoI2QERbpsa6y +MaETpAUK1iHFlhnBU3AdWFFi3uHNwYCZK5iXt6KwKkWDdBOBbouEghMCjABF +pURo4sgl80/le//Ed5DN9D1KbTJC0chDetoW94AB2u4oiDRAt3cOYKIgvF8I +o0QUkW4PbtboE3Lh2ohhTEHgrLOURBVpnMA0CA5BLMSA5AVkFB0kKiJiRWgh +wPtL6/+fkWZgzzqNE74Lhv/0J41dGGjV22BIREth4YXIQJBZ5dSjKkRLiXCE +lod3gEQkwlwFMyncONyfBc1TIScPZsQBh2gRDurImUIPovPf3fa/ATszhxqH +GrmEEQYhyQAgREJEOUkGgoguIXIlCMFi4lnhFAlnEIQQGDndG2IAJbdKkwWH +qv0/G5iVWjqIDs8FiobY5WpeacUYBgERSFHQ1YFawWLJQ4pJfRVS0MUxQsYK +JPNcIKNCGLAVJxDuQoV5EB5IpBEO8qoaZCElpMFwVBCyJUCuj/+9v+j8dYYM +Lxq4fVw6dQC7mI2CQIdbCIj7nd9tLNhgQ057FaaKgVVAHT4v+bvv7n2Xb9x5 +fwf2/QdXl6O5sERi+aOWOkA0oo7gCO8oo8eApcIjYVQOTxgQOZ5jJQ3fRowx +l98lgMMQMhMIBQo2AbFIvMY7FggwQJHDlwKSfg4CTyJytWvBMOOhkMi0JQFq +yIWRsVaXFyEq1WUIQKiNEUJUpWRWRWQBq4uQsZWaqCUxHHpsKvNpfgy8+Z2U +b9QPjQbbjbG4EHAx4htBY5hQjiH0gDVLC5AFghDIKGU7JgNIiNsGVhyy+5iN +5EAouKEMiAQLwoMmF6RRLxJgSCJoxBE9H2nsOf/573yx93zfnex3QUeLVEN8 +9r0HV/B4b/nQ8rXY/M7XxXr/J5PyuZ+TvG17Sptqihu0UsGzQJAkWQJJAkAY +MCVYgXHR9vOw9p23+9297h9HkOWMhIfh+VmeJ2PyfnfweP4EAN5yTfu/7TUZ +YN29GBWyoxc9b6ApRTVC0C2bhof5+o3P1vMedxIjnCjk47cAcDBJG1eDVHY/ +jZT43Vez4/6eWH7d0/c/sPb8XxjIks3XS+MIHxXkyvGjsiOk8bHckT8Z9diM +HrWh8d1VjC2783DabUFsWyhvjO2m2nfFuJYudI3p2YdccrhNi8pwf3uPF7I2 +tXr1R8TwmLtjSdWanMU9yqPi1Rzw9xg7raU7nbPV/s7PhcvYjcdvzHWX0sRh +AhAhCYtapcoWuEyTkOS6fs/5+T0mQipqRcgFyfb/U8H0PC+4R9CRA0X0/seG +6y7Ky/32Pp7V6C3I/x43Z+P+7vBqTUkKPU511VVqKyRKA40M8MIQNn8dwHEc +fo/TKjymMyfe8L5OcXzfg+10+IDQAJBUdFpXK019aZhaGX9L9/fd14nRqfb1 +maKOW5uVAq3pUUYjw6sC8fU+51W1ZCvTTIBTSBjCBGhdGqPiBRyRLVmFBCXm +AjeIhYVYFCoIOBOJ6wK0PEBoIuKkMmEwBQLcMqjJT4b2I0JV8mOT+Y0CBAAA +lXLZINb+HZoREMEYzI2U2TVEA8cQ0YAOR8H9vwvV1i3bo9i7Tj9D4e+f3/Xy +uhz1+kd19nkbsXUmn9B6D4Nuaye967v+R/X5Xavb6MHOzxWQ82aQJ5Kqqqqq +qqC4uvBgQIQ0ZYkksWDaULWbxuMNk2kGFebuwYqdihiIaSFBiMYN2EcJgCbU +KPHCKpYtgMuxgwCCo3OIMocQdAFkzLsNxcKZYOUUZTCxfmArlJaF2TZKYZZm +9DQXQuMg+kXG2t1EoxgZKt2HKMkxuZj0CnCYSAhjBhryvxi2BygcoLjEDkIX +A6UHGXmAcsoSgyqLGExuiDBfbCWAAIKZpmNx1Gx7R+uZuZWPIygPO5AKZhlD +jCGJlAQMTnkFMY4HNMQXBiyK2zIAG4VwASAjqgEQiC+sVQMZos0uFGyGVBEJ +ipVDRn3+k3nk+PvM7IMhcp1d2vG6jW6PCAIaCgDwaqBolR20sIIlILcqgZOg +aRDh2LQWIUBDOL2GcZYWfGmlhTdTLGpIGnVb/1SxiFUAPvZAIKBcqgREVAio +5ogpQiNBoBkCqUmrSwGmEmszb3PCJmIBjz25DILOewwOQplKjlGGkFFLm2Sl +aZOPwSWkO55P1PhdBMOHWZ+ajZzcw0tqLU3ArEMsl21WFS+SQkkkkkkkkZCS +SSSSSQkkkJJJJJJJJJGSSSSSSSSQkkkkk0DSAOkoype4RIkSGgFCjgFLYAdG +qIZVuu/rm8xjDT5H7sRlAeWNTpUuU0liBrazx4XTZpDQO/xgGZuRKlEzEykg +jlmmrLmhis6e6speaAOIVxqYQ20LyxhDzvzv+/A4LnfKZ2UaKgyAziIwYQUj +AkIxGBEkAhAiMWQCRSRZFkWRZAJQhlimeUijsYo2uRjDY8QSCGhgB4Id4HV6 +XLtHVL2BKHXGRADbkNcVtGdwogKbWJVpL08pQ74KMC7bbyzfclIRilnEWwmN +2gyMmCZW3I3gaMLykc7Jzq12LGwMARglOWFrtC2y5gOVzvT8R1PnMz+Ga6VD +RIpQoxQGGaeo2HrPH9/q/e8r8TXGxhqdVq9XJnEtqrrzPujbQMOrFIo5BZQN +WZBsAQgNKVRIYSzkunxZKYEBd2CAjIyKRGCJJIhGSRZCRkZCSSSRJJJJBkkk +kkkkJJBZAkZGSSSRkJCQkZJGSSSSSSRkZJJEkkkkkkkkjBIjAgsCCRjIkkij +ICSBAIAyEIyJIkYMkYwgxiECCkAJJJJJJJCRAkkkkkkkkkkkkkkkiEYqsjEY +EYgRBCAkCCyDECIEGIwYCSMIIQFiyMCCEgkhFQGQWCsQYjAkhFYSCSSAMIhI +SSJIkgsjIkGJFiMSIQUgkFIwRkgwQkAJACQAkEIQIyQjIwIhFgsIMgEkkkkk +JJCSSRkSSTQVGlqKv54qP1b+Q13tOn1u+fT8FnaJJDSJki6MToLnPVshSF5o +mRcIo7OXJeEEvLqLx3chdjEwERzdOCBjFMG9arAKOEDJNXQashqyzALgsF8M +wuov1e1ZVbsmJvMpwhkAYmkcNhSuMkz2Q4UxmWZGbaTIFKrLAKqSzo8hAz1b +iJklilG+iBLNqGEDYw2NDXf4QIsCGai+KYOLGmyJDMKGUl9lMkDLPEfu5fID +xfPdJ4XZTMfF/yv73zv2c80YBnmnN/KsLlaXV7Amqc5NgwgoUhqayQACwmz4 +A30uAcijDDMbkbYqKqQwOn2Iml47wfw/R/J/lwegZTmtJpjMNB2i+8C8DRGi +AcFF6XmixttkB05tOz4NUDg018yM3t7GSZUMctnYTNAc2jJKosA1RYyzBjTA +mfzfb9Fz/R5+EzTKdEKO3qiG4qA2deXujsDsQDAcQMxBC8SikwGnsaSg0A1I +pjBlA2MpUQA9jhDG6Qy9N/T22r5/4nLbR6f8O799qk0qFh1LpNUaJtkeOwlx +il46tploYdQaW2xAAFtUmICPCFBQWQoKIEIZCuQjjyCnBCswpS4iXMIRJDBa +SqolKrAhZoJulgynGAt2SA0AGz37MbAJnlkMV2AXIDcDjjJA3ExZ4GEelHJB +0oQSJogGhrBQWAv2Quv0uIUd/FwhmGCaQlSiZCbFk48Ypill0CYwuS+6GMb6 +2LkOf9tx24ZGJHF0uoNzbG4x1AEPwOnx17Xl5B6QYA5zt3jgMgdkqqG8UW65 +SWHxmaDtTZWtAyTIOZ9fvfyszH6f7G3ZI5ym5gUaoIQNIXEDZVcjIzzUFGBU +TdVRu1YlpJISRB1WUN2TMSYmpo9PAxGWkcsQxK1tRiyQDX72Zg2pNAeg7z9T +/F9/dANjrhBbt/IwHATwY1w4sAcHHZQ0qCinRKDhdIKOMBydIBl5EdsBzAcC +tyK4s8rPDOL1RwVWnQUMGCZtZKX2NOY0MlTLCBhDczJyLSSSSSQkkkklGAxk +COYOVRjkFwSRvodHeZQo0TJMrBRsil9+eXGQQgQMeFLHb6PedI3OyODNJnF2 +dngbrmpliGlKKdQa4FwFwbOpZ0aBYhe5TkN7o28wFnVJQ04SiiRDAVfYxmQU +rUC9ouvCELObTcBgIUG1GETEXUkExKjfguayCGK+iGUaexYgZYYUlgLIZGYX +qjnCjYNMRM1sLejZczAnhASwOiwVlVkZ2XbRtNI5e4mAyjPMRAMASVddLGPN +uC12bZW5zlRvvAxCmJgUBiuMxIWIZyEByi0cLQYGadUcpcnOFBMOSs+79/03 +0fZ9jkZGyeH2XJzwNPmF001jXaR0Zg04jYsaXSqA6cG7WskVxx1MgSZdxveR +2PS7B5XWecyQyzMBTLVQIIKQQAiKAaNzQFYCgENIUQhpwsYTPqkLiBYIFLY0 +pj3Yv1+bqhTTq7AND7H/PzfZ/p3XPMOdl5Y64Ub8+ksQ2rSqoGBdIYdIhLBp +jTGU43aw1oTYM0uHR7d2PGfS4Dr9YZxD+/P4e35vUdl63/7PNnyZNkFsxNU5 +mvV53n/Hb5/josB67cdhNZ8XV6W/iuw15yTA7lhcjg93ZcgziujToSoWHPR0 ++g8S3CGf7m9pwcEADqjq5sjONsABBZTYqbHUiCBAQRUToBtWtBzVghoH6gwj +QGHsC6yI4qDdFTpyeEpilxHZhVYeftpT6K0YmViJAQxfuH5vfX9KqX6NDv4O +WK2UVukISJrUj/ZSR0gpv9EVMgLPRhq+LZLyF4YRAEJdWYmfBrSs36bim79g +jTWepU6uqtWJ21ipq0gPuGI4JQf5ZQ382IsW4QRlY2mNSqb238u73gZ5XtKq +QHnivcPSDrcWqPBZw34oGCN3kbCwobFRxmT7JHRyfwl0Q1xf7oAOgDKECft8 +gYAxWyfOl5V7BE/myQv0mesDwSXBdTyaQm30EzwAanI1dmSXTsd7PaHUPiWw +CEcHrQiOmnGcikmLU3oPW+A/0XUwAJn453+pQJH4tCBzdq+lFWxUi1SR3lfl +DfSjg+w3turnn0K07JXAeLx9R9C572OKA/hLGOABWJu2hazAsaQWJH7QOaJw +WZvtssZMmQdruplyjdaIyB2oj+up9uUHLTykPxz93qCOV1ZLRaqOSTWQ/ogD +0cr6ArAsH5mtxw3jir6MrMVqQ3Db2Ln/bnioFSUNb9mcFDS26MBd5YFQuQUH +LKNDfD3Xm9ikHFv4Sem6/2qpjrHTcTOcO+w6NvDKMl6fRM5fUQrVfU/8N9bK +aBi7ERN3M6nWn5nwJlJxGygY8ZXXiaHjmyOX+A0zXt65Kd5NDhAsD3Oa+5yT +h6IOBgVGgcJ5bbd/p1QIl4iEMmFelgKe/pOur9zVV221Y5m7kIX/N3/M55uy +ghHTf+fWOAyGwbOeXIysn5zytnz/sJFoNF/V5FUCrgJxATjxzSsv9bXkq83w +b9XDDR6W0UDl28dyGZUjpX4yu3UD3rqSnwcAnD+8aBfVcL+mzMNtCy4WlDms +oVIU2lUl6bH81ibYh9JqXNzorvDk7f1ApmYJFUyaw5ebieBGPc+PQJqPfA18 +BawI1mqZ83f8M9KPTiGQx1XiYgHX8bCL6F/fVzUhaQebQdlACAAbJ8MAVBxm +xx12kTwSBfAAv+azWGJ+5AwCsZOXsh+CtWKWZJqbG/F6BJNIXrGsHJ6ybHrg +89YdZHmuTv6Y0zBFX/i16mXNdPTf8vjYJtJY1PzSF58A1C63YIRxMwyBbc4i +jYgAPaiZmxRIkfg2TlyBUAAwFk2I9YQLIA93+6ouLHqyJ4MGdtMO63hHO96o +3YL2nDLqhBbSj72mBdH3X/sj9YuKIhwrVs2/nZtvYuXcyLqy0Tqexz9Tx5hq +YCKDAWgY1HaIDGWWBu5H+5f4TRtz6MDtVc8Rv2xU3GDgd63Wk6bqtWZPTguc +aOI/ohkorOWlFoWKvsPVQVtKYk+bPrmEc2rYo0z9ZdTesQXEQUACcAYy/fwA +I/IyhIofhz+GW7jl1moHDDb8uGbrrkhbGc8eUPlQIECABE0cY5jmTXRxKnGZ +Mah0lUTVYLYbLa3PiqrUzGNsnBHn6ohuc0Iaf6UA5Dz9xrUJtFYTG3vf9D1Y +7gfv9uD+JrjSrAfMD3KCYTJGJMpyE7UahrRbfVCbQeKMTA/BiowoIAADGgHy +5xC6ZI++gjkn413yxu2Gmr07UXXTeN2Md57qaGW0BgSYgSN+i6U9IYC0PHwO +wIECABC7OxNRXfgAl07CViClZTYFC2XV8lRios7cFFS+lzymnw6XmsIJ7MpF +qW6wVPKx0ycpt6CT4mVsr8dvmE0y6wIEACLUVDZl0oW1YIwH0ELhoNZSy4BS +Y35GuMEDfhsfauyT3MK1pF+pmLLZL8QAqADHeqXbRsUDGPaW9ZVMkrGQm5bM +GcjW8a4ImcI6v9Ug6S0c0VaJXGoKMIE7F/79kodh5Fjn5KSRqNHRPycfqWpd +e0bgYZhS2q917JLlsWUO+0vHlxP0pi7VVieDxFP9LSEr/7oi9BwdEGQzmiwV +mhKwgQxe/DfPWwhEcYDogmgvMrgIi0owQgHdW36Ms8P5+zBXZVxaRpQFLo84 +QfHXXHjzjHZ4JpP7cW/U4gIcv4XOjs1wwMopM3DAuHvvF2euw4oCF3+NBOu9 +G7CB/kmAO/Yw29/4UA5lDWE8j1DVqV66oECwpSfwi7gTVNZzDSIpWO6BbwAB +mfE2ORLM78gHIdVHkJfVd3oIHC+dy4Uf1ohBVoDBiJxEyBDGExDhCruZcCcL +PhP9PcnsINWL9pQP7Djl1+5JdFhjmlqwHjthO4k+mwnjHkVnO8vFyA6eZIPn +EORWk8VZAi0aCr04xJdrg46qw0ohcACzQj6C10R4s/doXPBrywqfV6JfEm6s +SzhcG39p2DKOsfF1Bl3ZyWROjwBm746Ia2Chxh7jFALGJBDnLx1jqrI4l8gJ +KnLFjmiSbh3mlCPT6n94mGpCxjA47vIpPE1vF1CsIWKUbKweyTYiUO6pnUu3 +mDaUnM2azqam+BzRdBeUeDSJ1saY9TlGf4nfShG2Yh/y702e77f1w+3jiFXy +D0R60nHDNeDQsRNVoGvaZXd/BJcSNB7K/kQqqrnEi9D3AuD/GuiGuUfPrzhD +1/wBAT/bZ0cHUJ78eEg4xOsKR7vhMAEAvAwQDFFBhB8nZi45dSoK5/BzZwcq +3wWaj2S+dn2aiPW3epA9CMdZLuNn8OLkJlSF9hb0oZ273RavDR88AlDWgMCN +lV8wc2ztG7NkV2zIddikpq6zCwKzoCFhxcYX6nvpTs/ORqpAV8Wmmt9eGklL +yIcBsLGqtUSEN7XLsmGEEOk/PGv0uVKwo7qhwv4HaOskMrBiSdGl7bIsiKlP +sHsaEKe8Je/dQMVXzQS/wetEKGlgfI+qU61n378hpctLOAb4nkHGDxrk5PgN +XZIZkcULRLDsZFh8BlgWgQ6zKgvl2i3WYiwtSviEV19PUNq/3+9+AVEBGFnC +LFlLn/0Sp1MeFfK/Bqa24SevWTXJ22Ll1TI8skBXR6BVGHuKa3IYpaEdtChF +fz3zrKElSr0bZQlMn4zog5mZvwxUAJdfWzvqcDFIP3/Dg7H9nU+B4ophappE +/7JjwCXB33OKbNc9Ws6lxbmtoEOAOZJtV0EUk07/mHxH6BXb0BRv7dXSMPk1 +OJnejvhyMysyfl9t2uMsYZmxmNzO7RIWShiqsJ3hH+QMGNiz/FG4vjIoDkDB +NFEo9PSNggCkC2CAB31uw9bgy7hEWZeB7ZdtBi2FivaqrW1bZxAwF90rw2iD +pTnOL8Co2c7VUZOJy1CRdeIB2nQM4NLho4vbll/W0Q4BTGmTYrFkvWgajAbW +ZfkYsUv5M1L432NClq+p4fqOXnf7Xt64zwYFim7dENHEtSFd/kr8k5e8ipfi ++2mqSJAvlLZ0kv/rlQszvguG1lRIMAVBmIWAAFgAT46/1neF5D72UPsEo79O +JasEkWNdDRHcPVIQCILE7QwIcEOCA4vyOmxz/X+AXHDuN/1cfCaWR827jCUC +HQSyQj/tmRlNnDdJPHn2+z8tmbhqjQFH0WzwnoQr69LaiyAcl/d+5eCAxmXc +s4CCCHrnUFSCPs6hyiDdR/UYxTPIBQQBYmEXdJOQSxRIYpFiaIQkpsEhizC6 +r6JKouq+rXAX1TCoXA4TRCJdE3MksQYQIlJphAsREJAwRAYQEUAkyBgp04CC +FzDRDoQHgGQod0nZ0QHRuAow6aaDh3lJnSEQmNYqabBD3Ymy1vQysF8OScQY +KNWpqnsxBINvINW+KwVk5D29Oc5TGBUkEPJQkECbdTJAl4txDvMEMXhyxdyJ +mZE3TiTJl6QiQASwJVhl9xdMF91iXXyBaIWaGOCm4tCRhSLBQE4d2eXd4Bcx +AdyndMDmJYxGEmMQUbTwSJSkOUCQHIgOk6sowkBDguEQs3kusSF01agPBoKG +JVA0Yo4QR8oqgWVQKVQICOnEFLlR0qChmGM7737Fu377VPiNkOc1eMKreFhZ +t8Pm1mqV5jFVeXxm5sS9RV3WM1WDdRdYeruYeLrNZzOJrFK7JNzFXmc5NqZq +7xebzi8Xm84vF5vOM5jBjw4seiEUXKiiI7IrqQFDNRRzUUAiAgaCkAipgUIk +GQACEEhBVKGDFEDVqjhQUU7XAqOgoDoApgEFLIoBhVQOV120fH2NBRT5mj32 +XDgAAAAAASY+6xxOiq5ll+gEUDM3oshbfrX/M7yG+nMpD6l8yZZAGft9/rQ7 +UM4nOG/Kde623c5io8r5TVbV8q/xv+/g+t5DqPh9D6H4m43dL+vq61fEfi2N +UAHnzudVuHMcn/TjvNbPkCIDsXR8ftNyKgamIi/B2f+H8PDXoqedigJf6Dz1 +kBNd+LoTxG5Q73o8KVFTloD4jvej6XlrxE6Tz9Ij1XyKR2Hqvj2EPu8D63gu +g125+n1Hlti5Tx2s9Z5f+P0fucrn5+q5nrNPzgI9AqgQVQNeqPklAeeIsjCQ +iMgEgkkgjIEgyMYBISJGKyMgSMSSEgyJIBIyMgJCQgEIAyAQiMYBIyJJGLCB +CCySAQgEgpIpIkipIBCIBIkiMYDIKkgMgJCEjCCSCyDCSCEgBIIEiEIpAgSE +i6ZUeeFHj1R5sBTzAGBQXlYAh5YGDMCGYADpBgzD38fC3t7xmfgX1+ex8Bbz +U3NU2HehIzL4qbqiHgtROHJJJNS8yZkTmM2pxb3Ri3i1eXOTd5yMVU4rNVMz +mZnN4mZmairhVFVROU7vOcZiZvETmrxnOc5znOc5zVVVVEJ4mjRpRnObd3uc +Zu8YVSLu4UPOKxnGcrCdVnOFnHfdaYMN+eKPmFAcYJmIo5jhFGwq26YUYIBc +LAIwRzwQIUBBcIYogmRESyLcBAbwCKkATCZGbm3GThBoUajkX3Ihfm4MCMRj +eYL8F2LNyrKn0sGPEXgiRZBLTwDzjWpdDZqzuGEuGYJmYUgmFOmAtBAQQwGK +dwQWAdhNVst4WpnRawaVzi1b65UqoUBnxhTowbOmS8SmCvTSBFIPMXiZfMGs +4zOX00GNEGCi8RJEnCqZkYD5cNGBhxoQ16HGhuQ1YfSEDKWKxh8SAKE5ZmLN +mBDDQPDwgYKBZpLg2chIlmxiQNALkaCAnbFPoCK1DIZwtWGEBggAM1zEjR82 +qwBbDOBIphoLkM/aeL/P8N37q8VT4b78/6fUeh/n+F8f6ryv6n0no/QfE/Ke +FZmDeL/E9akjohqqADJoofkfcQRa/TM4gyo603YulSQECAAABWtgXFMV9b6I +4v5TWRN7RfXrUyFGfShwIHLgAEfKPw0y67ErMpNCFGO4yAyySnc4yATidqxZ +ozFIhBEzBH2D481/p01iDdOvxgBRbIeZd0fVH/Rh+oJilEHmfvIcmqKuLGp0 +QoDs2aLxgiRsyRUEAECABSYMMPfe8t5fz3j/d9Pt+z/UyhEB7rte+3b396oH +W7jweG5AUPKZFKAnMeq2nkul9tgQQF9xEBfiaWgE/GfJv+t8C9AH4ZtPnbI5 +z1W+WQXI/r3HL/L3/8Xzfx4xUA5jg+J/btW6/O67ZPbfB9blIoGv6v5vZc/e +KKKHAnWf+sKi+fj3nHe4+9yvm+7x4lEOK2vneV97eAHLXbp97+WV7DCrPH+i +01wKqPEbv0WEuFc1GCAIbb4/ftDrr1BcBFRV+x6nsfN971fqfx7TsviskQEl +MMEYDM13v7b5jHqvQ/8GoI8wh0rZEqRLus64OPDEOf7rrLjzvqA1FxP7IaXh +g7kQucjvwSWGVKUcGnn+Cu7fbkwfEljvsx7Qj36pHiCivJhRSBXOi84QBRE/ +lyWzpI2OPKVc1WVguAGCBBnPRho5nBgFQ+CM0LNYAEqztdlP4p2fMBsSuhW+ +hCLRzS6tuWm5WSKRTOVguforCBxvlNtr1kqdPaLy7gG7opOCAqmgtdOTvvCa +wioqCEwOjUhiYFPT8go8pMz0VfQaxWoRBkOGmHanNExuvgUpvPrUyK5y6ysW +JyWih/KK+5JAHlcRyrQR/UG3ggAVGDABAAlNeCAgGz4skt8iZk+2s38ftH9n +1BA2ZM3YUZDSiak6H0aFqat1FDTrL2k0fAhN6jQAAGk0PlQAJ5zpWzDmSh+w ++w/0DplJKz5OCJBgW2MQ1AFRKO+mmFKbUZO1cfC9vtSbO2te4XGy7VymX36T +Af7DLlF727eUFxZHNAtHsoOVGAb3W7GtT0Be1wB70yueyKaFmFDhCygpLzvM +n/SjmXdZfr96o8LMsFng9ZTAyqQboggQBHWNnK4IgDrXD4EWnbsTg/SH4ZjP +7kopQtfkzVJ0RnupzN6J5tg0Mz+zoTGHglApKb3OAJ4IEuIagqP7mLBD8EG2 +7cFW+esQOVSAMoFOhq+Hb5ChT5DD+wnt6zbHak/puV0lGJRnWBetNyrQ3HP5 +8nyS7peKzxlS12tpL3YXcG/evIoHY9o0fSPryOilyDZPlupELWriSn8lj0f0 +TmQ5+HEbnfADsVedQctyslrajJcEVMoWQfz9HqAzJZBGlDP0nmz163Q0E5gI +PJl8dYXAgdB/c0/40Gf7L24GiCPX+Ryy8OF5js/gEBAUwMkTeJdEEfjKdzLa +j6RgvgPTBfcshaxc3cOXYkKwgb6hnbttLaHRjSbiq9mkKvmf4ksLbmUSjKMe +neWTENQkd+YtrgamFGgHbTluuWW3APhRDQfd3ONfrWCn/ZHgMyrY9qL1E05v +cCA4k0uiyI7fOjRwmkPoSEVxd47RQEKBUPhf75LAtMwMuivtdMo+2jLkqSsw +ZjhrBqzu29HGI87Pj1Q+Gl00Rl/rGkBYkYR/hUUoZ7m0wY6jrxLwxMey0npo +h18Cphhw4r5sq2yFIqpZKbYLJ1mDJx7SytKBGnyEeN974fLXvkblePPO6DrU +JG4n4NdnH6avOfe4P57SwaDDR7Ny8cIYswDmTxfDRy8a+i9PtOl6dwwp+t6j +NCeIEGM9eakUQHVYDyYcp4xVAejzgyXz/qcgtYcLRHEA1iuz3RlcOa1PyI+Y +lSRRsiT0sYXs0Ebuvq0u9xzjRxUFVA7k9O7KS+QwADUL1A17l9S45krzT7+b +JkODH3+QybZiffC2lsLJEp8dmlSYXAqLaWEGEoHtgk1ZlKowtJpIsulaZni8 +kzQqK2GnLvhh3O9kobatv+3ocnFTVN/mjVU+NDbfeDVYHtK3+vjo5dpE0lu2 +OiZFcIy8hIp0AuxIoQaJeYaiXhLehdfzRUUI8MDSGc30vM55lx+z6JDijfkC +i/VVDQdEGbnMcjYjUKtFvg+VnjWb1QDSuZZv57C5DtNGYv9yeAzo4oeIDtTB +AZigAQAAAF5I292cIu3J3B90kpcBl9vCQkGRJEkkkkkkkkkkkkkkkkkkkkkk +kkGSSSSSSSSSSSSSSRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBkGSS +SSSSSSQBgwQIGDBAgPo+5tElJqyRW/jM3qYn7hoACXqXjPDgJh1K3SuDwQIE +pe+SMS/8E3rcMZynY6zYRA4yA3nI+q+x/LhrzaszZts57vAETAj13ufPfM9T +snt/x9hw3n9k6/231Ov4nZ9aiC6JDvOP6mz0fI9Xztx9P6u4ctcbR2nkNj+t +7DAHTkLGGgRxlCNJX7jNkJAAo6VhGjRdsDQEgAAC4AAAEDBAgQFGTZrUt9tN +judxzh1I8mMNM5VR+cF2r564nEieNqT/FQqKk/QFMrGBDXl8WJ2uBpG7FAm0 +YHmpkEwFcrdrFf4RPJlo4GBuOBHDvB4uhd93ehNFm8Gg8tg70u4VphhML31r +TLL2mxXch/MKfKe+ALHRKfTnK4f2EU7o/4fM+nojADGukbZY117EyMOm+sGA +EuFXrAXph1Zby+V1WMRSH3MbQAT8tEYsFIjeTFvYdBtu2lBSyOHnu655wYSY +Rc5Xa0tP/zMKv96ViDEc7Margaw5R0DktV7Jf0dn2En4v+iRER2rS3uSmLFa +uHcLnd4l/VveT9s/yyrW++aYvqnPu7EmirHCOGauHEDtumQ4PHOXGWUmQ0ql +oZMGY3HqBmxos+IIaev4h+V2IRH66E9xY9WWM00bsE0UXqjCcc0M4tLUHuVN +zCJRPrb0Bv/JmXKxsOIZSm1n1YZay8c+PX/sce7XdrvagAaO44Bintv/t9Kr +1Ou7c6O+OEhdHMxxXgfLNRD7FwHSApo/BqGuE4H/VYTxlSP8wZCbItnYF3aC +N6TdJkzruTV9c8N/d5aNR+KwvQUGizmyo+1h4ie7JKeP58Lwa9gEP3wt/eSI +ggwcSGQ0pBpGnVvdCGK/3mX4xuu7gcHc4L1Q/+Nlu0mBjjLkcM8XevSfx9vT +89lDlaFfOaFa3mwtClQT1kBSA+onKvM4eDDcV7DhTaIx37e0rd69xYK/Zur3 +9rAhbAYUWHroxFQGauq8TMobmZ9rFSV/mZOVbRlA5Kr+mUHkyDdp9vcznFcq +nbWfa8C0kY984RwtPFwjfRWv7k75P5jHihw3Np4F2/AKFeKScUbYz9ZOmMHP +Rn3woLMy7EuJ9Cf5dICj09h5HWS+4o8HNyInn0WGa3hBA2j82RtSRHX8SYTH +zRN793SnXlEEAHc+WDUWizqu9EWB43TuGLp3zhkrW3epWRjHr8vXt1l8Wnmc +dyj3WW5epDsvNJ8h0NL9drQZ0Twc+2cbjRrxGjCxgMuS2cO4aSR7tHmzSqt7 +suwX0GRmmK5cglEnOV3ss0L5WkQ7ov7HHJjdokfNkrSMyO04ZAJBjNytowqM +J0d1Qpb71c4Bk1p9iPBoSLp1EMKTxdn1Vijw7wCIzlTGP7id+ysB38slkVAn +I160mWJebSyUcsyUByvV4Di/LBJjy2I6KPJV9XMM5ikPmSGwu7nKFMwzQ5KG +W6wEzN3jHLyTso9FhYH69A3Vup/yfSLgC1cYsjs4IIJSTeFP8ZLiJ4TZ+B6L +QJDpjpQ9cLNUwF2Jxis34FCam5lDgCFcT8jfouMGC1/phlf2QrFemAY2vJOK +exOEAm9pRX/2s54pYHwz+yxUDiMi0B7HTM3Ol2VaK+SkK6HZVOjKt1KagGJ7 +vCfRzhQH9vGhC5jVUgVMHV8eXcxyY6poKPEjFKZZw7pduWkUMWDvgldXeX5w +0/26+nP4xGNf1AZtkoNZYmOO0UgiQah4QJAhUVWfdfjH+UxpIKYNjGh+Wzjy +kLc0W5gNTE6smJ/9G7IyJRLJiph6KCeABAgXeErWXY9wE3bwK19MBywsl29a +fHaZNK8Xz5rspr4rJrGdElwF6ihUEXKYdYcmv0NHLP6ef1RzHqhgEi0wmS4W +QKbE7LHSszadhdky8nd73Z11PU3ayYFCVLR6/1dGmyKtr8F11H7Pt916v4P8 +Ou/t9L03B6/l/Zom/wfyf63T62vvUT28A+tD4+RQAOr+X6Dy9yL4f1ve+e7H +f9LhATisWZ8zp9f6XCo8v1e9m4ehvF91quv104y9NX7XX1s/aep9f+75OMRe +vgr5HZv+6H8vU9X6D33Of93vmstAD9fJajb7kNq4mvIcTgsh5j43pPJ9VeC/ +PzOo9Ho/4eSwvQajyh/zXXj6Hv/idFcqBDyImEfWyFggAQIAFTehCEggWt6s +snqqryGggAAR8n4rjkubg8F3THLZqYO/aoDUlTiuZstVB3ZaZvPRzCDfV10q +eHqd/YTkuTbiwpgKUCRRzqQJ9x6ALRqyff9wtUFSDW/td5hVLk49uKfULmOm +5TiCMVc+Lim/h8v9wEGh947wEpRdzcYhaEFSfM0keP7pzZWD9fdVVkX6XXWi +dK/vIlvowT7ZVrZFFa4dgwAACsHoHnK7lXF2B5LNO8q7pu75V1k/qIg0YXU4 +LS22jWgwad4kslxnNROybB/tIzQu7UpJPcqQUL6G2DfSq8pTrCm6Mci3weZE +boYEUEjeItNi4y08oztSH/3Z4waUHHMkgdkguH0b/cy4EDbhbbTYdU17mVGY +nvOqg/4BGAwAQK/RdZwFpUi1osqeMKiTyMUMg+Gj7PVOFZPCet+bfaHuiV/w +Y4nlNutxkSARLcWQ2VuhUCxWcAEBznrADK72+tFZe2tuRNGbySyqFMu6fHVP +e84qVSON4Kc3JppGby0qyfpK2sXpUya4bMfkx8WiIzN97VzvlxlkIh6MXyb7 +p2eHRapCICAg5o1wNtKy3zYGEPu81uCOTALV2Qx+VT0HcvqR1zAEl+ggfEi3 +L2/E3RvpLqzkvivIhaAxJStGfUTspW6qDQ6ojMDk+cm9u3NEVn4Lfv7TTUzK +VoXnnPOKUH62nXRmgc5XF5InYKkes2VmC9wKmhUv33O86hpQgEPyikfF1Y3Y +cjliIDNl8hY46LNc3HpXCpUAo7chsSBBaJuD0kS1BXnDHHVcnmHgBYu15RW2 +eQHa8fy7NRAIawHaL2ef9ZBU6OyX2uWEDce6uFSShIY/g2NrQNTkWBwWwgZn +C3dXz3+SgX+GwpbDOjb6mHmY00nehklEkIrz9dd4blIQPNBT3bjTdMs7FwU4 +aWd2Lm7ZRQUxY8sGxekMBQLqwc3IIgoz9UxoOXyJicudFhl1ckgnhyn/rbUr +az9AIlxIHIrg/qcy83XsaAWBvOQ7npnYDiYEm/LAA1cqsQawH0oxSBY+hgoU +Ji/ayIXEh9loubGwRdjlx+Jbk+C1FPkf9dBtxs3zOHnFPplk40HLvvSnCXPl +3xJOwDqcwSQjkZkDA5NnEUKOdGQunn5lskFFiZUEr35CcGu9x6WoUGcHJjPe +9SE7MC27R8T1dNW1EMBIFiiybhX6JjMu9YyT/qRo36EC/5eMLQaHPk30M4Wu +Uvm6k3JdvjPaV07774RBAgQIAAAgE2MF8nnc26fJsUpI4GTB9l6KWTLy4KBo +9rryvD5a8xBHW8QVQQ9XcqAkzbIlloEkdyDdoDb2IIHL95TzFR/Hf7O3SkDU +Bm1d+9ZNibV1wWsliOHmSwj7kBGYwmdxS78ZBEYB3THnObuwHXRXd7Ci18/z +BLy3JYMh7o9dud4b/2ysSNPsHpDjD434cvtdLKAHfM0TXuvGWEMeBDg8zzeW +PnZXZ/M0dWDHZTUlnpiTIp3PVNJgyHZQoAroIuTv/b6YuztpTS0kfhhHKjhA +xbZKQDKNqZRyF6Z73PhTjZMCK7CPIyWt5pWU6tCxeFVPw8aHHnIXT8ywPm7D +TJBLiJE40mOncnVAsjGmF0cro9Ugl19UlkXs0pophl32wEjXZLpwNez2xr1H +W/VX5PP3sN5aO/tNS7xgzGgKkYOHljnzJANpo71c7eZx7Agp9LCFzQRWxcKV +dZ4eiUCufxW7QOvzvJe2wQMig2W4qGnGmlXFtcFg3tyITQmcyaMjF1Ez+jS5 +ExY48cG3g/93reKfEjrWSAAOdvTcZ5rFee6eHRuW3XNnrEnfOrLBloEKxq26 +FWf7Dm8eQlsQAGtkOR8W2nG+xVzoFouk3yKGZCiazRKpgpQJj6faakcb0r9t +ObuReNA57NoGam7vX1xgQFV8cLnI/kc6cYrV/34qZYsI62juW9tkfUhS7O/T +xOrA/Kn1HGLzvGd9oqSEuwZckW3I5FoCEVKwZiksNZkG5TKBk0L4EQ4YJRq0 +iPBgtkbr3xBiXraHXq/04GmJitNaV3uVuYMirbOw+TfppE06w4SHbQg03KFU +7inakrW9pOK90qnsZRlyIWdJWZuUdxcy5F6apNYGGL8QIAAWgx5/Cquuh53t +GEW/8j6D738IVBgCa3CVSEuowqZ4MSmeuMTpS7nuLaYM6vctF3OG51u4K0BE +bG3d5MJjeG55ecF3Ovnt63X6Jwo4JsvSTM706VFBiWea37jJbQCWllnmlPe1 +TiTvpUbzHBnd1mNQK3kGjydIuZt15Pl7DItTxLa7tsASGQo7Hq0jRjN+fuuM +wj8nDxC0E73fJfz44gAF82cCxzSBdBG142OTpKf9qPI7BCm6trApDnVxvTnl +NllKY/OveqqjkdouOBencE7F0w8jKkAlsbfkXTJYX3njTAKSOLOfHfhDiwzW +4mMpFbV9o73pTYEcJMr+ijosVqNuKwD8DP2aX6obmkeClpYmHfE8WO642rH+ +ufDcT9Cn2BWonJLUcWcofeKD1cymXvnnborHRVGpiky88G6h50/MyWLj39dS +UZxCh8xlhYSnw2suDv1XYUUyc/veoWvNIKK/4upsRIEn/BitDZybbZCwvBTz +smgoldFKEpS1IfRazjcO5fxy4NcpYdGBqpwoOBzD5Mba8HJHpIc3bYGdKbPY +/riFSBHYSPnk+bLflnboJ/6Bzv3SfmAcZ+60e2VqYMaJrELA5yVmT0bGaFUP +2kzRXAoLd0ih9VD3KuPz5MxNLIVS78HSVyX3Y1M5VsaR5iewhEzwuq1y4OKl +Qi4WsUh5Q2zxFtXRzMr8dP1yNjrAVltqjGQnxluJ6HSS+N8SdhpUjmnNyHsQ +i6LrUr/gVskbTT42Zw0pfaUKcQLKoNjxk/FaIgkGghgOuABhFxVylfE5/Tog +wALWDnWQ2Za0vFCPa0+mEeqmEcdY/h9nvJdYhktInG08+PYyLOwJC8WXL8KT +pz6NyJxMXUe4iR6Uzcg2LLF1sV/C6B7yGKD0u2U6jx3FtZ0utV0Hb2J5mqiS +uIVJLli3Qo+VMtRW21yEVIX/dqPuttzODLW1tdn/sBN6IybThNdF8gcpXXoe +FELGKdemjCEchBAe9wZdM8+yRyECrjZSdDNpGY05C+Zx1C1tmcTD08xzD0mr +5IwH0oD5/m7zPhKRI/GAKd95Zi0szNUu+clQHAVhKoLyHLFmZr0EfTR3Vuq3 ++aqAILPxsmZdEAMyb4ZDlqsngQu+pE9RCRwWKWavOAxUse8Pqz2u6Mj7xROi +n0wLUXmVm0mwqwiCFtpPSf0x7u98ipTb8lCoH3IGivw6vTz668IeKmQtcgvK +KKzJFgefg30Ju8QoaDkX4fVGJ9mYDZL3O1j7PnPfVm+k0/K17IquWT3qtyPd +sxa8IZkENXc5pxjvrT5lQblJbzDkGQTRlywXQT7DOMUo4kFOR1qWpiM7Pdfs +5vpOl7bf/2/ANtJIpEIB9ZAQPvaHPeq/PpbfU2v/XX/c/H97S9Z477PvNP/T +zfZeg/H/jcuX530u4/z/HsPx/GUHODsagp8Q6W0lVs23S70YPlkqJIkjIkjM +ClBQXSSSSk/uVhkmQnSNuLb9/AZmw0BsVYmESSSgLAZ2GWA5FBRiINRFIBBV +4E4zZ43QxS0uJapGqqhqdhLQkCQZJGEGWqoMkhJJCJfKilZHqbAXDIRkZEkA +ugXUr/P7vg+I+n7jmvJeB5jSZ/DeP/f1O2eHt+HgL9YmkXWc3ljrNRUuhAOq +F4WLG6FDCMXCo3CvbirgSsWyDiHWmwYi2wBiHEMkYyQhJBgyRjJCEkkkkkl1 +NF2RkjCJdALGwjgHMiLkJZEG9spmUFJYEMOEuApFshYiUgAQo4ft9m9p3vy+ +1+9bL8nx26KoHMmgCn1xFN7EAICnh9x1bptOj9IoNzRsU6gMJhLC3BcFxYWr +JgCCiasohCghksMm4jcKVqCnIsUYARTUgIYiya6UVSNhCoCG0YMF0mjrAA0N +kKaGoMgyDMIZQZRklsGb4unKMEQMgBULAG0BdZNWkPLtMvWqlHH4aymM02V9 +xD4wwdx+1wla3+vkVVgotz1hWPRfZUW+oCWZkJFeWDm2swlyHVRJjbo8jbdz +vORUn5Jjib8BqAM0qkipVdp7kTiR0NSH9dc2XJwGEaOo3OLCEcAXxFqs+CZY +P5ddHl24YdkYcgHyCOgQyxwaXrrRrtAG6DVpiRskzstRM0bN2s0H2UsUCvRb +SBOaABtNWWt/mo5BQKO9KbU01cYXWxT8EeL+RHQlX9WczhBvqg2sVmS9s6f2 +Tc4x6ekz2bUdrkxpn9dnpMaECs0sM4Rb9TVDM9NuC2AIZWbHVY9R663N87DN +mfczoL0AjGm3SJmsK2jEC7ovo5W8EbViTSE1S4foWdpNYzjFu312JOVJ4Qrd +hEa1+nEOu0uDcV85hNTo4/Cvoa8UFR8Yq+5HpkRMGfQj/29MrhHM0VCyozq0 +kwrLEq0KcXhZkiu+KxwoTi2GxrDLw6JW03NEwJl/q3JT4ETTvj1uwhSI3LN9 +mZAYQUxMP3C/TWoprMBUxApMRDHDL31Jz2BmQ0q8atw9NKg293PSM0LMmxMk ++9JfUP6I5sBmyaNdcecrNu6mitBvjgJtWB4sHqtGUg3Qo2bGq0jLpQAFFN/Q +gYwGKr8H9b07LmOrVMg1w809RSrPCy+PamXIdmNbvrfYalRwCs7an0sHo9Gq +WW2jRLCDck5pnYzHHQ/sNXxzM8m5lcA8swTSkr6va6ctfZcB+2Ji+5Jaa6bL +k8Wm7/QQ7xt1Dl41tXSIuQhmEQVrZoavhtpvhORbUqJT29SEnkttJXllS3nc +d4zLOSPAaKpfpT/MK16qRK2ZWBrbAzveiQnWBWhT716BJ6jgXXJk7BC2Vwtu +NgxtBwuPo18z5upXxvFt/e8lfHoPxB3TA1HPwDldhTHyi9LzoQ1+Jc/3kzbG +FYxCXcV7rXgKlygn0mFh/VG0i0k/Qn2ChekvRy3B7n/obz4hynZ8azaRw9eL +TWjCM50Z8Z2eXWn5Qs8ySI/f7XG0K99mQsu9K5SPoow+6JG9BIR5vjhoAIEB +AcAhyHCnz0y7OD0KE4adE9HPlHlFm4inkDyObr9rLcqeTzVqqGojyyEGDdYe +QOVzpJ06M2obPHr0yxWdNdqFp/X04T0vD10S8vFGffsGhT9amTQ7lhWuEfZG +KmqaWEMeA3qa7nnbZ4U9+VYabLqVd7gXQZSOyezElo48gXmWbVAIDrgbtCWK +PCljO9OxIrWBq+fWO8VDisN+QAJO9g6A/T+Lko0csykrEONyPCgs+FrhZDCj +xX1X8znD2x+2muwXbhlwU8uB/L8m8c/Pmdb1mPWp75ZPmgPfsvjGopp7hm6i +n60SFcndi7lxrs8AWdEL6YlXd2bUflzaLz8UZkYvam2q+4pAwlewxQCXhm1I +i7zYcLsD9SlKE2ZbnHpdL0ov2FMH91g2fPE3LJ5P6CrWFmyRFaRP13kHPbdW +eMlJACUHEHIWNkpNSimJL4Hf6j2LTwPKR6wpsqRJkRhcyySYtyUfRh/KsNeX +ZmWXtnT43Re5Swn6axI9w0Dg7Wt0NNdIv51dJuZ5fuBXDd/z1WQEACZLGSGh +GgKCQbsSaPmPypooo89JpZ9PsRLfS88DAVVlfgNPoErAi03fu8TlUInnZec3 +hsDYH8xADMZvSQi4kfC9r7o+oYQEEw8TPEMQubY8AAQIK7jh906vxOy45DGN +oAQ41rPXK9vTN2ANf9Vxm9zl8nNLQZzieoZD6p6iaZXWRz/OporG+Plbm65W +UkSos3lb3i+7//l25vnxeKURp1S0tb3re1qgbBRNakjfTDoBnRrOYvUGJ7bP +ZLXYPP5V9rJc+WUrPD22FBx+juQbH2KjiAdujcBpvSQztdioXl8g6Zm7WYv0 +FSuZwiBwFFR79NF/uIDYN9OdtcAAEaQ3LwtM8VhJH322GA81FCVM9NNz2Lrk +H48vIPbEUKaPxomkK4f5sHUbikMd4LWuzIuFdKWQ5BoXS7m7flzaU4dEW2nj +dA1Z1Gq99IOLEBhxLKx2zD1NGX91vGCTLHPbFX0WzmQTE/UjFLJ/HKOj1ZJg +0Axh0I2PlLr0ZQ8NA1+3M3tV0vIFWuzWGGqfPqBzJZRbuONQWgXJ6bhRJ01M +HXi2cjD0iKGz7TAlv4Hmmx48ojtN2eR0lK8eIu+DNBvz712BoOdjXtUJzZaT +VSxEMY4N+xA7UzrE3PtaZwvoVgLz0bJfmksTP2tK8pS0BY0XiGS8mYlFo4XU +qR0F4fKuNriCS3ksMF7zDBq8ygQRMww6Sxom84RtjhFRuEJCChJxaUBRzVp2 +bpVsg3I3RkTc/FoxEW73dcgvz6oGaC/4tf96k64hOBBL0yuNJlb3r02MBysn +sZOHulkZ739JgwzVFVfaNp0xxgM592rwfHVD/zhMVaf4FvWHRZpH747HpmFl +gqcgdanZpRvebM5mIMDEdCdY5pzrii1K3oTlv5NKHnO1ZwtBR/6xqLgUsGtz +1M6/rXR84tOObFuhcIOGj8I0FQzi+S41NUwnLSUOsQOpc+RGCsHkyEbwz1MF +gQ9vWOCh14LVoR0mBiC6wjki4tzYnUCMRsSENZvaem8YE6IZlDifrmhfDW+v +9GZ34Q5uVu8b/D47i+CP3NBvlJhAtFc6gPkQ1wrLRxwOIZvsN+ZC1/UC7YpR +AMCsSjqe7S2uvXygoEStU6lWwgVjJOEgkOPSmEiDgSL0lRzuYmKulRktj3zW +jPI9rzfMXOvoV0qTf4DRyZb6VNPfwaZC4G8epmU70Kf4VE2rmPSkIByiKZo6 +qidKBatD1XMMuKz8HOCJVxuqpdsQyFPY1YgludpesrWX02a4gK2XUwv9/Clp +zEOeQn6lc/aOnJRADRoeHoulah/WjcKt6yZpyu2RT5MA/NsnDftI3nCHAAFU +lgkHaTVzp1JYKw/2rX5btQN2WUPUt6X9HskozmHYtT/oO1YKz+FjupTMblQs +iw5J7WaXIk6FvxAv7kapAy5YzaXqEneWB/HwetZBvccl3lUDx23/vt8cuxD3 +D+GRAST7g6wnvFWm3HgnyBsxTSB7tRvMBZSQteyr1wvN2NVY4/3kfvBfp5X5 +gwN5dKMOCoUakD7mxoAI8KObjbBmAAAE9BYzd0Ono9chFktdfJbA6Ia6Geqy +N58AECAAAALhvrkdU+I8BtytAOW5Iej8cCly/Ot129iAOoWHlfoh71+X9Pvj +kGO7z56/yq4/tfC6ZsVp+GsxX0AC3vviOxp9jBiwfZu2MGGokm1+juXDBJJO +zZt00vYmBnBbImHKrYGg0SmjIEge9+HpNy2b7GU/Lj6H6v7Ow5Hf9j43v/Kf +Ska2JDRS6f9ZFsR9Wui8nAqaDrbGDdE6OJ2jAECNu6NaMhtCcU2sRBjG4NU7 +yP912SPX6ZgunzR9hum3Rbw2K8FDauQMaV6WISDZJ7sGkCthCuzKF7i1Uoc6 +BJ7Fj2hRtebFgQLlW6t5nN2KwdaQYDHIqSdwxEEmLTOaS5aEUuIDmBhQXzMx +bSumS8XmWAKmIAD2O3o+Ny6QjOZ3jI3ssQchGtLokqPdxJvppPYGkA6EuxBr +MM38nPyYbz0aDnplpU3p1PXjgAIAmw6ezUPiyGYO0GlBzZhGZQWVhuU6K8Zi +bFMGhOhz1+3R2Eh9pbkbqQ+3sgonJAGDEAAAZMU/f5DrK6BouAipigthYBu4 +d/Qw+gPtUVqc11JsR7ClY314jRTin39ttKqUWmALXPzV2dJmW9yLQX9IblTz +kAE6S2xKVgyOYu+SigIjVSAgNV0JggGdXSdluDQT0DwLxqCgQIAACOw452Vf +CoDjB4Cou5IArZWXf0yhIB+BABzVri9LZbTzdbR86k4qB4WAvCgQgIdz+3sP ++bB6XvvVazZeU0eWeF02wdZLuu/p+HgM/zOBOH87vGHwy4cAACGAH6ZV6r2b +Q8ECAQaLwyUvm+0QuIYImHgKEWAAABEbXsA88kdA4AAAE7axkMhvKNiZpY2t +heNEBBkJFe74AHpJBAE1e8nA284QkZU7li45EO98hMAYUc0nSGGEi20OoB7P +X346gnEdFt7UrwLmMskZ9nvI7NyC1H6RTqzyFfA+Ji2t1Pmqe1hmujSfajw7 +kS33donpl5UJ0qMiH/s3IKEC6gbewYR+Q47W6bjyDImOM5tnrt5hhX+S5ZkW +bsCVawYRkibYS+MngfWU2d5yiEawCigVbdAE229PCmDninXDc37XKfVUhlkq +A13F/71W2anHHcn+P3VCoaNi76geP0rB8XGZcouzjCVKImvz+K2a4qqPdHqr +15lAQAZHByP+AisAVwB0qQW4KBSeWytpnhphps/WPWyqojI62PbSz9N2Bzcp +mAru1j335rofbw/hd/L7ff9C0saAZYxRYAdt+ls40w2CQErQ+ztY+DwyiAFR +kOdh8ULsUVYlhDGsx6mDTXMoT4VWjWHRSiZ4Ti8G27LNr15AvSTf3OpBp1v2 +oAD615OhWmkRFmrC4ZubaNUtWz9gMLnQujxK1awAcSFNGmUdfpcWkHgGQ34K +H6Q7d3yAgJ+hzd9KxXhm+AqXRQJajaZMngAwpQ1uLvDVJpsmtyjzpmfT8vA9 ++6TLketZBpJ2tWLZYsOi+toWG1eX5xipWpcRjdWCZwa6CYsfZ1NuSGSe0iAd +6Sauq9jhrhhmtYyv0GcvJjve/LAMq06kcu+8Zwbznja4SUegl2Mbh78ZmBS0 +ziHWqCh7ESCUwM4QGT5dB7mQCT2yhDDm5hpqaHC67urK7z5LYHmOQ5vyIld0 +XK1JtMV2wfAnVIpQXp/ODSG5T28T34AmO6xOPJd1ylXJSd/5U7UlfGz993/B +/GWHa0teis6njDN7sJDKIWV4TxVnQkFVnstoqCrd8b7/xXEZSglHoMOfIJsv +CLm79W1laMV1mum3CSXDU/dJthu2X+od2/DpvNQ2ODdr2SSjAAJZp9H2X3Ur +gXDwvalQQLttbCl0p21D+Go2lL3Erti7o64lxf/ZW9FGEaWDEhGJ55P2Y1gu +E8RhIZ+R+hoZuLFsZzR1ztgDzE3fLEuQhnh1JMNBacMm1fUxKaBnP5xso95s +hzqXijryB1Aek/qFxuYn2/aPcAcT1W37LtAEPCqX/9l/v5ElEv4mmi9whukZ +UluU8GYfh7dAGGYqQQV6vhGIC+6WHfFQ0XTx2O11H7eq5Pg8nl+097yvd/f3 +zxmwYt3nxuB7vmOmfkM0CHEJ7koDtAfn3kLwAQaNxn7wTH0B9fi8pykiVzf/ +I3ssuTJ+DHSuFHHRc7v8L4vABAAgQHQAACBATB+hpuuP71f0CAKnBdAiYOXk +BrbOrOX90ud9QumMFha85ggAZIDCfhICOAjABwAAQB5AfHADw/wBsSLFgIWL +AFWZ8PxsPEDLBj5zuPpvlNeT0mv0hOgQpzp3r+UOU2XvDBVossYZH2xldkgK +56CABOYNIEYwEJDXTHHCUy98ccY7TPkToa+w6jv+U4nsuM8H0X6/T9J1fa+9 +/b13mPv86igb6dT8gsZa85yZuAPtwYDAbx8VJEw3V6btOK5k9FwX+3w4BjFM +F+Gi4z8goz9nAZUBsYJBJTAFW2B/eO6i6kN5nm/N/S+K+37D+b7L1v8s+38R +2c1Sg2Vq/E3XHwp6r2uvWCCp3b/JMeRsq8WpZignRo1+BLJzmlnCfG9RvMdd +k+R6Xs+4gfOVj4Q8uiNaT+G5tf7jamwSMlojob5d7p1e5twmDoZOwK3D2wjv +KSK00Uh6p6grMcigWE8QCTwOg1hMQmt4CvM9SILZ3t3uBdd3+cZ97YI1qeav +GNO2NWdx5CCtHMRvSH+X2c3w2Kh1yMHT8L/i/f+oJYWl09mx5XflOBzCh2sK +oLxMdhAZXNyX+ps8ZCy9+NW7bfnoLBLZlO0JubSZo/X7KK8O8vCueZdW6X0M +graycc+8ZFxwh1KeiDQfLucFzZhnTLIN3gPAJX+wdvI57EL5iUP3jpkJYitS +p0YSig8lJJR/bj6EZD69BkkfUlHTTwrFCxbazmZ7O/C8koO/InmlnkLAr7eF +hrPwaOJRsxKik/DMf9o46efWqAgzcBL2hHv+iC8iFPkbY6IP4D3ehs9kjWQ9 +f9XYl/PUgxx9PmwklEgfw+9uij11y839/mXhmfR4/Kf8hd3wWRGIUsiwHeLH +yA+WJEnbxhNpDI7JAYr9YkJ75lmEMdjD7hpsLcuHf+lBQ5AoZeygWMPSx7tN +fiLAeFs9MVSR1rgEndUuxHWuZq/FvcggIB2gxoJC2n2s71CZyLjqb9QpwL2R +Zm46xa4K5V13uxyyPubVKcrgGvmMzGPX9t9IKZJ9ZYyfX+HBoqwRmn+aNxBC +QfUzMdaHeT0kYGODJeO9lMc+8RaKWC0Q1q9v39Jhqd3FpYyzzSesDcyrOAx8 +cfT9JDBtAoQ+gVcaDbqUAR0wORoYHHvNjUhDm7MPkgPNdwX9lIeojS+jRMk9 +W3mcrkjPNJWS2UqBdXcPRM5yd3Z5rZMJlp4u3w+rYPeOwZdJE3t7KvgEAkNK +mlfPzhdhvLJNCP0PwkxA4/YiyXahjXSoXSCNt2KbSjz6llBgYuRFwep5rzH/ +zdrlHdtA93bP1Cd5vEre6t41Y325rnR1qimbwbaVrKbWVYtm3KSOpAptEyNm +JpZIMBQBggQG5zm8Gp4gUxarTwRgIDRDPYKENjWl9kLQBrznXAYQ5Xhh4p4T +L/DM5EgPIFBCC7wExnjpOjIflQNkM8KQZkqhhDGUq+HavHS7SEAYVzakDtUN +5IgW7hwcoVTSuk9DhM1ef5b5/oVUlUkZPFEE++KmfIxfpot3zG1bgYHlg0rh +m850MYsGhNx6yW1OXj3oRbiRYEno/ERme6ye0dijSvgg4yB+3mDwne7db+Vt +gGRV9pXnjfqpng3U9w1YY7ZOpN4/az9SkbCrmcU6HNb7kGTa0JKwtfXDTOPr +9uRm/Astx5XLDvoQELSreVqawCocHVmrWUui5/8ioCbU2SHG/ozNwsw8IQyF +kYdFrcVZh/wwnxrjBC+2nvdzV6Y3NHJXToYdAnSeFw1pwHSVUznfC2uQqP1n +mIoD5JVli3TqN8vsILaeDEUEh2oAKvStZyWIRSJUJ/2RvCEBSSWsmxRrBMMZ +sftINNOAAQILBZXpfh+Lp7YxyCKTthqc6Gi0VVKv82U266zuwwrDmRokVevb +bR3ZF+9MqggAXuA7W6+9fHsEuZO3mlM7TpnnDIwtI2HoMrH/oqQfaH3cWsRB +3r3lqqnfB/vy8dcQWxZMJcq0RtPwptNBPxM9AtCnBcG6aCh9mywTgnZxhXjf +JYn0131C2mfBpQPoPO68N1FGtAGNRmdjTZ67KX52Zrm0B+20F7mMO4qs6tpm +qZVILasbDP73TPf1SB9jWv3aw9D+gwrT+V3mJ9qW+nc3d0oyE8HW/lTzHr9S +K0TBvejgAgLb30/sRN8rIwcRBJrb0KtL2yE0KK9dq7lpLwTVJL70BxBmwoxI +xjz7rIxsbjZ6Z8qKJweG9l0VBpm02G5vmrplcoxeBPIk0FEr0d4KbPw5Wg4D +2gOvu5YVp5/euzOYUt/79idNJ5Utdlfr9W9xjJL21zYBpziPqQoVilS+VYPQ +vikMP8BQtqyUTfGx3XSlMuboZUSGcVFS11+M5mjIuVaBS+za10NSsDdWOYHg +oYbJWE62J/ppNgTzGxHTm9j1KZMRwtC6gvGWtVtDqU+Fi/RDH6cbGLcwPLAO +oRvVM9GYR9G2YV+Kx3qF4glPjjVmGVASSfSDvxgGtnDBAfSxpOkWa58t1XPG +CBFDoMdnpPKG69iIFFMsba7OLtL+Bwfn3udSh1dYO0SFimgxosPKFaQiEn7D +i4LthRrTDAjhdSLRbS84s3tIYPsmWa1cy02sFOnmmKedK0p5P+VlmanhCWcz +6f+jc2/H17e7YgcHbBZZDkPOS1np9eKCjCTav34QmQ1C1xGA/n2gwzJe1Yvh +CXaXdugmLXrTZtMOFqm+J15VmOVThcQ4xB9cQ9gYM8uVf+SzGxgjpVVZsWEo +d9hdvN/y3d0sxy2HwuxNhP16jVc+RjjdoCL91VbUFZsRrysvdXFlDN9+lqaH +DoJw2eUc/tifyzIbdYvK+q6XdbUWNJ3tE+e9tnh/tbnvEZWQNlCX7RgvFuNG +dlxmW6HKI2SB1g3O5lD4lfd5GjFXLdiY7I/oN5K62PArEmQUqJhphFGeo94J +3UhurxgXmgxmRTuWL0rbzW/Q0/IyFh4+f8MHJP+G3S3pHf8qBN7Yo7l1cqo1 +ph+KTW8JGfJmKe0VqFYZf5tUswWxNrLrBF1un3OY0u80o5E/m2jFTu826wf6 +1bO1Nq0gP+U981oIA8Ro47MxLEMjuGmb7wSriEDch8V79oYVKwYOFDxKjf7A +CP0AXzcYFYRjhcpqylzd0878hKLE+u1SR/MHD/qzX5xHkodCINj9eaSCuOwa +ofVQURJt/FtQEQx15Mr/fyuEVqFaYVDVZqWkw4MA0frmr79nPZqRPlZtfTxC +EUJtLNuJBHT/2ewvE9CCXTFcF9h/P6gUNA8smf6vXVSmh778CsKjR7rXX3jO +PIdZ1aJIpYKrDG4NOLmvNCrHgHQ9YuHc3WM2R4zk3ZciMtS5BzOwYuAAH4V/ +oJZW/HOWgeMllb8CF4tb1cqZ7VsLKmt3XkIVjntFBaGI/gCXudi+hTfwYaz7 +5xdvCM4/8URMn5vnGL7KhnMEPlcJRjmrL2+yPSoYJRwwzYlC4ubIKHKQV8EU +unpsBPK1PoyFhGz1EXHE5ql21IVz6ACBAikAGC1S4AA7Z5vxO9MRbjIclq3c +Dy7EXuOZaI8hpGJ53+Zm1HkTSx02hrEaQzUjBAXOD5T9KMs+MUXD2LK2m2vY +4hrwIAAAAcNQSinFRTs+R9VvX/PY8V0HA77giKPJ++2DfOp9bgH3nA8XuGj9 +13PrfHeU/hwQWP2bkdFeRRcDnrYD8uH1Xm914IRj4N8EJ88p1SM5wuTLRND3 +gUdXarr2VYq6vGsqS5pkKj0cRYGCi6lefJH9puFN9FZWhm2sOdXhOPL9k2YB +yAwo3StkUVbcKU1dkGs1UYD2cryi9vR1n/7KnOnwJD13sCdgA6pBRl3CLEDy +lGW2pSELEbU9FhQijJICw4jZt9sqGuw18HnL/mVtaJqxOY5s+GHSWX3cKlbn +3wVTg23YKdJ42p3A27U3YdeNpll8IESipF81kISOphVV0YL0RY0PztfThnxD +hqGRIYTC+MxWoAJ/qPC3b6XM0DgAAQIF80t9M5yOT7LUBk237no1j+dxfTUS +19pJs4c4pMCYOPDDSygPvuMJIrABcL36AwspTLBY8uoQAABbuwPeIooe+eHz +xX07QAAHg6civFogk1pucR3cyd5B5lOE6pqVqEofON9nK84K+uT3zNjoXGXm +5CML4zrNmiwlEjJtSHK+TErJELeTNNxz4f5Ofxa0g7VBFzWqpknI5gDG5W3n +JM/gZCbBt3Fg1xOx9IsdaHRSrHhru8ySX5cE3rJks59GMJTCCrxtSUoRI+XL +iJSHxoN+1O1PEZ/01dWvlfTUL4BO6wvjSOWCdXx3+XEijcPbqS5NXbf4e5O2 +bEMWL1UICYQsZKuqN3Cr6/XKj1s7v3k4TO6m3fcBsp8d51LUqwLF+QBeJ0Hf +VlAx8y2iSJjjRR1iGvVvuf2+xe1xY+2G8dwwdwShfPBNM+nmVpS+C39DCG39 +tzRkZNvMQAXGiZH6KC7zGeVHniX6g6NuRpHQCc2mIk+lw88+2djPzMPswFni +crSqcNWkGeMroUxstBi2HCAax6Rq8pKr4n2Gh0V2at2pIxBdlJEl3vppiQlR +7Nf3c+X7R3AKgPR3DoRatA0j75X6jkiisOSuvflOkMVDw0t4zINp3HhfaeAQ +EC/1HxrFH+/HyIHJy1mmbWoRPjd7AogIm1lRcZowNJyy+s46KSB+6jdxTe/4 +DxxuN6F7iBfZ/+ttnYSlJjoK78oZFPRyhhBCJnk1RdOPHz1lWYKYIOgzAghV +wUhIPi77ECrWEjPZEz2ojN73ap/n+6Y+m7MCoeRjJpkLT/Y+732MK5JsoCdY +jRlWvexFnJTwDRoXyQYgFbgt8f4Z3ODt3OKXaRvri/JwhiYOjwsgllMLiFUr +3B18B2BxNRHWEoq48bRuidjHCFLMYKhwtK1vq6uHxuCkK47wm2pJIIJaSvM+ +glUTXhbr+PdoOLvuXjQITgn4YwuyEF25Sb8RvCreBPZi3LLsI9AMII0wnzk1 +E+VpnCG97k5WGljHPpxNri2lwulEHEaxDx4YqhPm+zqFb2nV54gNq7sYvj1k +NVW3Fvr6Vqc6MVf2hKcqfslAROch+GRPbi2mDre1+n72o8bTfDlObaOP1rdO +HKncnrRG0xUMBIcBLke6EnSXXQjs9a8Q/ARHQuhIFvs2lZKWblJPkt+Phe2E +p/8uT949KRiq68fh68o4ARjGF0ZH5s/iLR8/yd7b7ve+J3L8+58Zj2vwfX49 +s8lsO/fB85rh/PEUD+Z7Ir9R3woh8kmbBwBY+1rmJLmggNhhIDBhIDBhIDBh +ISMrYg0VFwYWlwBw5aXYLjx5eGAOngGCRmILoEFCEgQJV8kxqriOb3rMFy96 +SijHhtazki3C5ZkwmYq5QOWN5hhhFgtJBI+7tJL6RyZA2PO9iHMfjvuZmwGA +49RkajA2LysCGKw0DcgtiQjmlAUCyUEKBzFmbJGGaC4As4jpfEeJx+++733N +fM/+7vN3z9H2fEbh87eMvqt368/DbiK8loqCkWYH1p1GK1JEYrfDbtjFVS60 +CmfvrXA2tnVQZz4AZA+nLwOI0WvXs6l3sPN/QfbfR/iem8Jze2+Y8T5Txvgv +sB3n/kvGCAkPgwkXcB/g4e3iy34fgpF1Kq3sIRVYrKVVIFGaprzQq5BzlxYp +2lVmsqS1jNZGKfAe7gVNvUYBuplEooirs1clHM07pxdnCCdnNTZgOaMXhwcO +aFvb5qzMHDiliWhBxQsziELCF1czYCm3UmMgijiKpEohGQqCl6kuc1iIh4FW +cIJw5qVYUQaN4VkLEOqa5xQxOZwZuVcC0MS0IOLMCsEUcm4qYkzMhwQSKTIG +kmcEW+HcowwNSWBYJOzSXDgJoTskDAyTLKC7vZRAVMKApoag9Yt3hwlcuDgo +ZwMhZZzUzmEHGYD4wrw4eDQNtiotC4nOHLvh3toF3h2mbeKSeUlInCFTlQHE +sLcC82XDwICVy4OEM4zlhNw4epzAQcZUHOXfOMTkibOC+cm7rCFROYD5gRl3 +m2lC8O0ynlK5WXemrKFzRpqgFikqcOnYSIOAcITNzRIcDARBEwyMO+QSbiM2 +ZBzi8yKjOKOLmBYwRlzGLfM4y4w+JtB3zVO6GQCVd3m4dKxgZa3kuYl4FWYG +RYOcJ6su7ZGSHTu9zOMGwZuYyafJzirmxgtmISujcZqcuMOMTaDvmqAchyMg +khWLh81OErGGzBzDlyIEvAqzGRYObcUQRiRQeJIHwXguuGHuux2bNmcxEaTu +BQ2pbQihguydwi7Jg9GqBO4vZxaDnBcYfDhXDhzl7L2rF1cNdxnKeVboPYvI +zk5y93l5QWEi6fKjGUSBecuHBNvgxduVdW8tdzjKZ8U6dPgXkZyWWc3eblBY +QRfAeMqnDrGMTSVF8IJYwMXCIJzGHBrAuRlE2nwXDvLxZxAsPkPamMKMvaiJ +zL3Ct4rAenqBKURSzdORIsZuLzk4cjEDAL5CtXUgYyHpPeHmaFiXxCw8Vh6e +oEpRFZuqpCKcG8yDSk5mDZAewSKoPVWbmzBReQYCJmyInIqRTGigKKJEOJLU +RJy9VSCJMjGYr9odx/u+tzNrLuhtO1aO6jXbamZeZVVFPtyMxGcF7WRgjGMP +nNXdCcZD4F1mZxkvhYbBGMYfOau6FZLkxFuSMVl4d5wSRdXBy7zOKqmkZWBj +KhTGXprw7RD3l3ClVE4ik95ERVuEMWMWRb3KODkvmbhNh6xnMCLjLBDE1Klz +M5eXrF2HDls0wWIlS2C8iHdsSFIzkXiJyqcC8y7ps07WIwnzgRFW4QznAycL +AIL4F06WTgxmsQmy9ZzmBFwMhlioqcwqlCRb26xdh3LZkSWfOKsPdFDN073m +iohPBWRgU6cUznNTNUhh6e7zTQMC8S8CxkGTnNVill6e7zTVFxRgFHEIVMEy +9KZiKiIlicujmFhUZCCEkkYoEEXYiy2DYxN4GA7i7sXFixbi7BwxLuoJgWaU +uJsURPuvO+ExoJw5dy4zrGutFzqRYqKii5oioUOz4sm5KLXFJIiqCdwxSJTM +ahwoTQLl1DmBsD5kwMKg4xNM9hVBgWrDi5rAUhIJwcPGHU5w7vmMiEZY4w+T +YIt3rOLCEDE4bGJisYCEDE4otYlIwYGHSSmfMf14nAIsUQ7oGzgow0tWSRWr +284FPVU81qMIpPmFgkqAiRZBBJBDu6hKHMO7vQlVQLOSUiHcLL07VEP/n7ZY +/X8DpBvTYNsIYEIRCENLgTTPBEF3OxqE0IhoEQI2knFmpfF04d6nbLUBOUEz +LGBIIJl1LvjFyKr6Pt/6fH832tWSNBrvBIjdK2EKk+0QH9gRXBQ5FG3giMjC +Jipt4BctVh7cm81JLV9l6n4f4X/X/P1V5J/Z0Tk7d/Sfc70N7qwmSogTDvMX +HFM8UTiXoJU8uplywsDAebEXEVGLnAlUFhYhKRODIIUoPTuA5WMPJZ8qcisu +YqquaKoIRiU6LmM1WHkvORMUQnzcPQk5wJi4UTWHOJjCWYU5p3lM+Hop8oPT +uzlYexFDNu1ZWDN5gGsXWJorCEQUjmEbq7xFSorNRJCdXYT0CJVHOBU4hRN2 +8LCjFO+ZVTk3ARindnFM7vYwoMPET3n6P9b7z+GhqCMaptSIh3GoI2M+wTCg +By5IeIoxO5PgbhNDNNChxGXFjLoRcOzlkXmIeJp2vAQmJq3LRAfGBExghYIQ +BBAzMu2SJh3FsRhnfImVIZwQ4JDzFYQmnVjEnIq4M00qXjKcUMwhNw7OWl0o +MQ8TQdrfFGJrKqsOxaYFxnImoqkzsRYBhRkqRhPBUCnwoCWA4EADirT/hc4g +JcIFh0eOdPYpEO3nL4zEQEIA9OHozlfWP5hiRkihmDhqc4lBSqobecRmZo3p +azwKjDPm+6Ma8rzdPCxGScFFC1zmM+h3pPJ9gfut95MURLfOeOHgCYuCATpa +r4ad12n4LW9sQaa15JBibvVVkPu32zKJb+3M2F0D1VQC+qpCx3tfcWDib+XN +MxzVF2KawmBS3icUzXdA9vE3zV7u9h1wkMKMt4hYE22nkCoSUQwCuPlhrRfN +Yf3ushoLUE7AaeTsrVGJGdmxhaB/2yDtWJDYiI+0YsZnZ+S1/SNAfuulqG7O +XoKf4OUeXiwpdZvqD39aY97ELWadhzgeb58wlQQAACDnkE4/CupTOyIS+brx +r0a8b943jM9hHLluV7yeHs1zBrzBKOXvPxY9CC2aWl0wyivxCLHmgfBhV4a4 +3wWq29Fnmrml+SHeT7gf7D97WF9rUwj3R5rFyMTuZSU8tVEb59LYrT/TAWv0 +b3aAv/Gamlu1nMGfGNJenCwqAAerjii72wKBFUOKCya9f5vlXJrhDqMFv10o +ekYTC6yOVX1Cjy4KwkxmkhEk8MVfrEZ8tvphxmJCKGEX4saTp7DJ+29W4Avz +/K1+49AYfZbHpxIibJpoBQ1cbSGb1NG/Gs/8niQxrX0Zwrc5yu00iaN8rPP4 +yU9XpCsIhbqHVgBO9EVPDjF1aJYWS4tj3v+s3emse1DS5k1MBmw8w87F4cH8 +z0yGSi3t4NlEO0rPrmuzfG5xVJhKeo/1Yl3x8l5m0TptFGapKWj+XFc7cgAB +mHvb4zUsjkbApovn07S7OeW6MMhlAcbyUSk3GQ3nzn5fEkGS1JUewoaMgXNX +7wrOXlmzEy975wpF7YN90a+eqWW9OXui1YRpIiyty1x+814QAW0qLQvjqoJU +k85PxBG5HLeO5z88M3ORTH2EHrscdEq/Dfu13hmjgBdPEGV2JW2DcRl0dC9c +e5vrQ62TXET2Fxi3JsKwu/ARQkG92UICZzafY0lQHO+oNAKh+xvEu1o4N8SS +0P30OiMhq85TDBXKuV8XYU0+S0nxF2JEcZo4yewzRylzz3GSd3HTdnrp7Q73 +kAn/utR34dYGAq0M2crihz6NDd9VP1Jhnf7SuwuZ++oq18YHJCQrdPaMg/ez +FvMbLsIcE8AEmpzLWgUKih0NjwO8Llwd9zlHEWobsKh+3kOMnAhvCnKJK4ap +MR+1i1SLcGALfKPXW0tyWCc00vTJvgdj1QT+S64F4zyczO5owqiwONZu6iBA +wDtpwcsHnIXPQX2evbik3VkRzSxKadfxUjd/aO9LBbPNgefl3xpBjtchsfde +Z/nxhkA2lCfgYS8P9RE9n/XfOZM0GYPKSNBZyR9Z3w6NtBUuv+Ui8mmMTlWq +v4lv7px53pAZTbFmAcRSxI3j4+FG4kKQ2DB/VEcaP/XT7TkVpQmx4VHTAamg +apEu432cI38lRZSENVQr6aZlCBG6dWmMM5tHb1Lz+YCgUO1x5syExSYA1x5d +P35MA3ilUG+OX/m3Dx4FhtMhTBJIcE2SBPCGUcacnjDNB8Fayej3e+NE15iE +0yh+ypgi8YnPewg590IcqA+265RS6e4jF7JxpduLOgMGDBw2kKFHcUqBAgQA +JkybmZj9F8jNC05lwXI/izII+//8tR0+j3ZAzgPNyIw0DVWtVK259sKsvo8v +01rJMAX3bYiJ+I8l73LSIvEFQMu+FlHhqqcvX9DNU8ECBAAp8ECBAAu1MPiO +iGVeYMs3TBAgQAKB6kdM7LSBnlxuddEX1/u9YXMxsiOoAAnwQIEACBgAS4BT +qCfSmLWyBlo3a06/MnE9j+H3BaGzP8UCJbAgQIAFuJTIyipmSrgGMZ6UYJK2 +Q67UR8MFGHIL0CBAgAVKwVRiYRg/H0jepb8f/D+5I1ABMdZP9xxCqOXkj9L5 +euBtz3URMf2+fEifneK0QETq+FSoU17HeCVdAotue5VqT6fw0MyKpgbBZKbC +a47BvDKautNLqt7od1eMTO0L67AgQIAFIkCHud1a1UH5F3Cz801FzHLzPwLD +XGHqBYAKGWJ97DjYscgwfs61mJFrc1d4USgupHLvgbMIVgGQumUttZkkWG0y +zdMor8xRoBIAcT4lVXyw5ggQIAE3gAFAbZtiNNBYk5JoBtUdPCgluQan0M4K +5dUxX4/mul/L/p233P93Yn5b7JdyqmeknHmizi2e4ciKqJV1TPNOFhgAAeDB +BYAaCCw8MC40yuOwnbvk4jY1S2UNciKoiALa2pWS9K1oKAKQPS++ptNZvEQd +ZIVvCvkKEGp1QAKEeMJsUeJLNP9OGVSsyyP6qgPhAAAPUH5AQwAYA8EAQgoF +UaqjLIG0WKmKUSfnpKZJIQiYKqEmKkCYUAghENZcgEEkIyHQNpEEpIundYLI +nwaYJ0iwwcA5hEQgpFOA5IIJaaRaJIVhtiuKhJii32pAqA2iSFiEIEgQlNNr +NEtWCy0RJCDAhJamiSBMWukIYthZDrATJIEhwQ2RAwXKhBwZjoKIwIwhJiqp +VLfhKuLqKtFwS0GgoEkIjEw4OAkQxKSBdJyoLIkZQZOkWGDgFyQUUYlBnJJI +ksi2aQcsCRL3divKlpUC6NVUopWogYYWIQiSBCU02sUS0rDdYSxAmCmlgySS ++jDLEkHYsH//YHc4A1yIcDRXjPwH8exxgfJH4+AEG1LNu2ocMVCjl8CGUGU2 +y5fgyxys0uMnLpxZriLYSBgXMaVMwLhLBfkl6BmoXo0NmXTIuzqsAhnCdMbp +JguBGHJh0w0dBOnLIgWUWRkgkBKq4hJ524q6BUYXVRUKkVhKhaKVALVKEklN +AskiibT/PqPgZfy+g/d+3ovJa3QnqeT+V8ZEEACfv6nujakco+zfWu3k1gJz +twYqPfN8uA8LeBDZmg80LuImkiNvw0f2+sen0fYO6rZTYWsJNoW5kmlY3PBP +Jql4Vx4Ther00K4Bd9lQLTyibEB+RE+eGaF0XBCwbCclr7On2tIfZTy+tV8c +GeY7cNQzfO2/9fjbDhBTmea2N1VinDKGL53PwwYrpJ9PPPdlFp2lPuH8ZZio +IBLTc6ryfKiFg6LV+xFzX9LpTfrFPW7vOoo3OlQqtYwxF8ww2+rsViTPAe4n +l5/hX3LEeCE1YFD8Dl3gyqPt3RTSiHgQsZp849zet/LIJBmf5sPD54VNVwcA +xgchD+PcKgHSA00AgTiSsfLm5to9tZyxabNo9kkQ1o3JerG1X0CS4UDIdIUz +rUWjPeLBuwD9nZ5keSFxJZvGwkonTnVdLrea7GkpHvgfrzXRwB+sMxAckqGe +ZFfJD0ZOpQ2FmI6hIEEbokAwtVraqv3VZ6y5sm53N8BXGGaG6vKjz7fUYTs9 +MfmTiLDUtDDx8iE08e9v5vftQnecY1wKU07oUres+msRILP51as/ifKFFH6T +Vn8U9DCPd2LIV94NiZfxOeguF9N3X3lf+2ico+1bbwtKmRPOlaLNZFwJmAHX +Aw7k5bMMToHzx1l+K5Cfsrc+v5Da3YG1fzJfzdyay3xZCge5c2x2X9kaMX3t +Iu/Mivv3WwF0kTXYY0Kt6jlbWqWU7nfOUP0k+waogpkEb0NdYYDR755YpY8Y +r1ZMwyDAt2TCGIis2zobeO34gUyH3eaT6WrfWUdyvDGjkiGGoYmMFlEJ8Y3Q +jr3sk89jt4MkiO6t83dPU8whysVIlcgySsLcpDtn7hc/44YW1L8lM/UvAocB +PFZZhqmKtACef2VinzXngepEtVanSbqrOdoJCdDqFuRrvucLBWkmHH4IUMCV +vfgbQtwvJcr6o/j+D/6l2ixUokCSNc3arVRTKaCRLwAQJECCgyGQEY9zwi5w +TayxLimZldsUzjyzgYW+zEw1fxf/3WpmCadpf4wuAVeQr6R/PzQdPwkkpPHz +kGEOL2nydQ3pQhMSTg/kt2Usu2rC869i2zFi5+R2FZ9pdX9DXCEmWE/OC834 +T32183m/3+N+HfPd9F67lzdeC5Qrr42o5cLgiXiQuqij9Ypcjx1zwVNqpqqa +qmrvVQq8OaKQAI67JpGmKQhCwzBxmWxrZOpRoVTU4d2dw7s7i9SHxGQyDhtE +XD9+9EqNy20+UKKczBPTkP5BidQin+4LOCKmRMDLNJAYcG+Qh9wkN7PyRdhy +tH548jukouAoS8IXlghkgFnCmRMeQJcZZnGFqyIPB6HEwQITMK1Z3F6tsBCQ +HE2RGH/GrIbMvA+k33ySSZJhqKUFoBkl2EslgIGW3GJGwpl5AEI4NJ1vudq8 +Z7LlMzqd4yck5Tteq/++rtfBazi/9/S85xft+0/p/Oz30e79bAPTgXluds3c +zrba627VQlxnKXndVoTUCXTWahAeOKuHLK8eaeetr/LB8MMWEkNAAAgAAGYA +AEAABDl76SQdK8ZViZW9bbO1GjAgQIAE92VPFbUfdpCcBzpWBkKrSCBAmkAG +CAD8i4VDd8RA4EACBAAom2EAKcJWn5UfRtOlIcZxJ49gCqkAhmJ9oLm5YLgk +Q2Pg2kCkV6oSgcu0KQQAIEACRmOX6GX4oYAwPYh6tXtYAABAAALIIECAdEB5 +lIkfGYvP38MTzcl/T2thFG4wlFHn3LLJ0+xAUq+90jX/biEQuDQkLhYx4Mkj +QB8d7IFDHE2pksI6vEoeLbNWWBCBABAAgAvEcP0m++Y4+jQq6ZMAZAAwEcIA +ofvbZVwvIiqud5lvpjqKC+hoqmmFSuZEPi+rVi6vaeKbpJyYMNlsEyMh6bqM +0nKl7mCdxwc2Q3Qg4lhy0yG6oi8DZY9jJn7nOcocXrcdPncpJUpn+BErY2lt +YP18YLnJZtdpmUiaALmu6j0BbyXkoDvBaLmY53w4nErEJwG94IHN04UIddLf +ux3J/IaPGjti8XtixujXdnVKo3DW1QtKZ+cRAobPEwfTq7g2UBAgQAII82um +MOfCkDUAECABRfNmdCaBd2szDCdBGaA8ACrhWMO99WSiWlAAio+nABh1PJB9 +OBoBmQI2/ms8cQddUjpbyH1fXXXGuHQOvyzM1f46z4JLXSGpIRo71SEyZcQo +eJ+G+W1Aq2JQSlmB2AgC4cO7glw7h3DuHcO4dw7h3DvIcBwxEtCDpwgZXAvw +gLhw3YvKIOn3A1vNjMhyBUMNYvV3IUEajWJxcagYEwqDxq82JFtRBBBzhmYK +FixYolyNwWbgLigIGQt5Lr8ObUxy4ylrmsnS4QOk7OHuBeNprbAW3ZnW9iIO +x8ZUSDpmtBONI0xnpEbtStNj4D7H000xsw6B2CVAnTQLGubhDV8RqB3DZ4gB +rLXhYIkgWWU5T/VaEYI4tu6d/Hq5r8FZ8cljWXayFoJlY6GxMqXwhGTmaoMR +GoZUKmBlVRl51zYMkjTahw2KxwlUkYGZRQxImVKjdWRLSqqSTHV0LSSQyKoY +QjVFVKMVVJgqgKJTcVIlZBKvMujHC4vQCDoIndl24MRmRlxDiHRLFgQUhVQK +MCFhxIpCDodCGdiCASDC6OPa/ERVlbC20uAX1TO6DujsIt5kBbCKLkQIQ27E +IOC23e4Z3SJYlmwQidEIBGYSUukgijJAshzEvI5ESxIXzKsNRL5Uhgpa0KwZ +VBdjqpJKSIdiJ0UGLlwA0EUQN5gtG5BEtaYMExAyoVMMKqipjlYKkUvyCr4F +5Aq61hbRCphzqW0l1GKWIEl0CpoVQZBCoZcDCkkbTP0LNnNyqkLEM6Y7GVYk +qBGBnlFBAi5cqN1GVLRrNtaSTKq+FpJImXVAQhFIIpIZSJtJgEU0IlgNXIKk +6uhoQhKAXDV3EoIl9E7lpYtmBlxDiHCYsCCk1OJLilh2kUhGmjgOxLAxxOzg +5LaFwC6w7BOg7o5SHEplkDAQ0IFGCJEIa8aEGy2u9wyLgkAkAYKIJB0UAjMJ +JSUk1Fy5ogWXMGgW0IDgkSdrsEWElEikiGPBVsQEZSJBNJEOxE6qDCuYsszC +CLIG4yWEbqakHFShUGJByo1MMCiqMiWwVILfoCjSo5SOMAyrF7oZ5mOG8qpk +5+C/IEKKVHbCAyKNEGEBRgZDkYcxy4si1MBhIutqewtXCR2xMiWh0xAdGXLK +XUCH2gMBDMGA3htZ1aMCyFoIqEiBmRYBJTEjV3a2EyCrS6VjlY7skuuvysvE +IoWEhBILeCAgQIPAEAAAYAZIFpFx8pjLHYkCABecDMdOJdcjJYfJDUNo8LVX +xgnUnAKOdSP7Ccgom77V5fBsnjPk+e3PFyO9e84votR5jH5e3e7uKPODr+i5 +b9O/fM5zVAiYxRigP2900n6OF5DRbf5P7HDft0PbHO6PvfBbP33tOJ4EVraO +88vsH9Ns2H7vuj+f9Z86O97j4tJcB8aREQkkl/N4CAze55/gvM/j8vk/ofce +v+Q8l9F/V8Z6keBAEw2vwRGkJZVsQFPS7VP0Bevy1Q9uSpvGgQdydyWBEXKQ +ULfcSfBa9EZHhZSk5h58izy+7q8gH4q/nYJdPnPH+rC9rYJeXtTX7nftZV/V +h/mMVagikuDTEhGJylMkEIX7R5ZMW6DWleqUHeWsJGvLa6j0BPB1yGax6Iyu +t3OvTQKYw76knEZOysDOTxWS7jKBiTTieshrXo07VyOI44HSoFl8LQrOTfbD +GAD9dgHv0lVcu0cdthrRlfE4kDuss/Hikl8eZ8ashiVIAC/fDJEads9jh+kJ +Mudx6GQU4gR4ua+03lnhV85UV9yZhV+Eukx1fIJR0+7AxWQFnim2OJnlkYht +5CLxe0p2Sn7X/rDCMd6WYmwq9WO4tvjkrmaOoCuJY10bRVLKGrP3a4YAQit4 +u5U+T81wQHX0IXzn2eXQeBw9qQNy2eHdRJT0tgZI9JsBjITDakSR0qahY0ii +1+UsOCAAlbIEBRBQIJTdR7iqZGE/UHG5bp+9nJ/5/w9av7rKCIbwNfvCOjby +kPVZlMmMUEtLAq0SdpJOwCrbkB62saQBtUJ8+k0Zu99T51cwJtBgYSsFJTnW +TBp/O6D2PDRdnHzb1ObKKOTLRaqttR5tt8YuT6Q+wJVv+PZ7riktPVdnSYif +2u7QqjTn+jRLJU/qQ4cMQM06zvcM2WucsF1mVeglXoyEcDGkdh5X1AvJpuBa +yEC2uffkKhYQV4RmIR0SK0Zev2mo8UACbP95SPeJL8UF+YmUa1yXpCz5b10y +L1SkSjwJfVfFvClDtua6x81y99OGEGkPpknUUMb9b6q40CGpFUy5lgyDAxz2 +RRgzEzYcv+4ZFQcjzaGpo95LfZXlk/ByTvJmoElOB0GB6sVHP0EOT+gPJylO +ThyK/T6tGa7jc28njWIoDmpbcNOJD3pbRgReBJ7WVTFguwApc0e1K6b9bXKr +WH4LRc7QPR/U6V2P4NPs+49JipnXiNn1x8RZGZRY6EGutBEltDUFscgwObUk +jhxgar2WIA6fUluFX+O9ao1ONgZPFpoWhgRluylSo66hLxzcbl8Pf0nRLo7A +vcCCb+FmS48fnj7J257TSPdKZj+FBIObBU4tjSO7axJmSdBf6mU59KIAWOBF +3Fc6FswNhEvyDslSEnDajNemGPI5UzfXRErQ7ZLwoNuhbW/5JWi7EiW1oyPH +BIoFjrNoT5SN5CvKF8UeZGxPdMTGjjjPNIRLOX6TQYmDxDca0ALiQqiXtXO8 +Ao5ivm/DHFpAyW/mFyuNnRTV+8v5VQ7kn1XTpsxgcpQiuTP1kGB/FzVOZB5c +njBDWJakLV0WEt+7J4QkxItNRQCcSYQUdCeJ+eVxoZtOEhpD2W+947tHWkXD +3JIopq8tSoo4EAi0mYSVq68Z1LrPX8VDQRxlN5NDkOEFPzj6sqTTXH94/KFy +BVS/iQJLs1/U6n6PUdC7V1B/fH+473xoVxvSfth33dl3bqj26o79x6o/qBX2 +3RYXQIei+38APb/v0ewEnMx/HruD+6ETA3XoZTe7iNIF06F1PbKXpZ49uJQG +1WRvYmIjSBSIy23Gv0I5/Yg8gyQkYaWLL7I9b5HiwivUOBH2+OotcowNkUXz +LCE8F0sRAY65SWpbmULuwjQ8aObrV4xBSREswGWAgQIAFs+MeAGggQIAELyE +I4YzL2ari9NDZ/LNioU/pavoe+Vxy7uwHVH3WaU/Iq+2ZkTi1JBXTIWAokPt +m7m7mAAAA7ZqDGHM4FlK6w6v1uv/3Zp+suQwmCbw5Y7MYECA9dmiIic9BAgQ +AK9iHD7S901ZQ4TxOlRMnr5NyBZzHrI5Z0KCni1rFRWSv5/O0Xt/9cJ43/7l +vueh2rf/yfB7333vOQ/dm7ZtyoqJskFH/fyl+x3n0rwAbjs6FHYvacHq909H +8bVcdkg5CgMgAgwHx+cqPeKWIJ2H4gOsgch+ny3tckBOpcYbxAsiqfl67Yfc +fmNTveFAAcSI7T1H5baSDB0q7r2vO6Ly//2/eO9/4UcoDKf+fH0fT9nyOlER +cS6IUpUfclZEkVGwo+p3Dae16TQ7Tld+8bs4o5qDmEVkHMHRbT2/P+C7/+/7 +f2e05bdfsdLsHOa0FdEOiQYsXgbKA0GjAupcnXcN7i5eSwrmfy/V/jjfXctx +Xluw/jsQ5mig8hm+U9PwN64Iun9f9TvLl77oOp2vduXwC5sX1ukx/U6XrvWc +H/XichXRij9WtLBUgL4Tl+f+VyuJURRcEBUVJ675/Feh9dgANX9b+XmPw+r4 +4Ufp8N2+053X+U/L7f/X25re+4liSmaSRKTTycj9XCzJidP6eK//MJauD0y0 +nuOaqrVWp9ckmeQm9RHealSKTLjtk48iDVnCvXlsPCYVAXxT2c+7aC1JRroD +r2P71X6sV1no14NcJvN3BuKxx44pY/TxYLpQWZUqrELPbqZZYHqrCDepJ8Ms +vIpyx4i3c7uhAl1g+r8Jd8cLX/Dqz4rLqTFQvKcvI9DBkaBkaxlztfX4ekxy +2RsKbDsncX7tzuBz8zhKWa98HWFaWB/A5SLvoLBuh1ERX3AQu8kK5cJp6cq6 +n+fshAZeqOyvaoXkocMqLmYhPGItQBOwWCyMw17bD3Se+hggZGLRDh3p2Msr +qC/O0sv8qfImn21qdUKef0v6GTWNnnUlqL3buCOiUqa8Zm+AdClIUAIKyOWM +VZ5FHBtKTXuLYTt/1j9nEgCxYwD+Zgd7MxFd5ohBw9od3uhT7t2/BJe2nQev +7/7GymcJ9VCyCuSk4FNI3uUT7hIgSvNcjngPr0go6w7qN4ya5CvHv3xMDcuT +a5OnF+3GLI7kyLyrojik8JjzeOZUQN5rd4Pzq4LTJWZ41Vpvyasm1VOyRd8y +8uM0pIRpxRTPR8InUMKpV39KfB1GLHoVmV2VmawsXE3jmdLkoZoCwUdHe+h+ +yCa5UKARATpEMnQ/52jFbXkh6/rkt+B/9sMTfwhUKqktjLo/EoCgox1KXfGW +hka1c4ZwyvNLWE/M8SgSmrp5c/YUUoSmf/tQylS4iQ4wt+AgiAHUwzcgSPCB +tdSCqC6cwbG0bSnPJrTZqeCsqUWoMQq+j3z/SNk1Bf8jxXbQ7M7MAv2zqoeh +W0AsgH0V1e/zQKn9Y6v/PzGl0M0ImRNodgQqwYXE1TTa0i6IOTdzdEaf8srW +9M+3VhhEeUY5JDJgZdD48IwvFX6ba4/e6yJzNx2najdiS2RL+IC6KE1TfSlS +DjZxsOxnNd+O9MP/Rfh+NLR44CBAgAQIAC188OtCxcCQkMWHB+QMHwhYd8oE +Jyhkw8TSl4FSSXcIMzBmAcpnqAniiEtLVaSWKhIyQgRoS6AyXZFISClXUFRT +DAZAtaksqKH/uW5yx4TwXsN/+xsOmwgr3PsPvWFRQ7L7XiM+5AfERFNF6nTc +z7+8QD6PKfr9OVerw2aw0SaaBi382LAgAAQIC/5ZCWrmrJj0avBXn+AwgUKb +uc9WNCRQdkSM6HpogGKamgAVPAwAYUDCAg0AGFBQUD3kcIFK7FrP8Y5Dp7O7 +BliKxDef17HNF+NTGXVHUXQieE/iD7iYydwEMEMgYEHvLbmtb/1S4K4ABSS6 +lDDHbhAAOwNEPaqjy/lfagaQGwfBGNBsY+AMEA0lAYGcfCiNKRizFPz4WDrG +1JWbwTqkkuGIppye9lkxioYtMY2wg2Sqrr/x5mvV1oNYbYfAdUfiKqbucIP6 +ZksR9lQdJ6n/yIwImTTsYDfQYRPCn4GFQoUEAB+a+siKHE9b7T3WZ/T0vv/2 +c7sWh8fMNFORhN3lPSkq1itFO2EGDDE10O98+IrovDBgzBnilib0oTJlYu83 +7qkpfE3jGM0LFDWQmBIj778bHg/iet/j+36n/H/nyMzMAPS/e+X+G8t+E9WR +8Q5Aa2h1L5pG40KrfkDCfwJK1OScOCBMuwZaIzCyrkrSJwdEoMGECAM4AAOg +gJdpMGC0P744iYcRDpw8TMyJmH78ZmFYTR3sR36jECItXRDhwYwqFvMicqHG +bvMYsLFhAoPD4iZkgHNPGA7vijQOXgOFlqwglTZcZZ6cRcQalB1Qc05yFJD3 +UXLhw4F0MUShkJrGQHE0SbGQQQ4DjAsOSAaoTIfAgikEJEiXaCJpiZKOIF4t +5ai1lA3AuysMnV6Pj+M9567u+wraz3vps/fzvskxdfm/4/D/b5PuvpZWE1Go +NYCoobuXt18NSqgW1lVVUYbyBQQ1cJWIFRQ/638vyf2X5y80/y7+t4E92vyo +x4mMqO5u52f7a8sec+zRit5+j3cN0A7s3CmX9PGMip3vPFFVE8DPPGx+H3HF +5l+87i/WXU5OiN+uup242PG/dzLoW/NbleHx8c/8nNx7t4q9Obf0uXWm6e0P +w4hng9dPjjZpw2ace3o2ck9E8ux5HQ+vRzPO7JfhLxw53jdyzb1L2McedvGt +14HBTPRe3pxvvZpoZ27uExEcXLEDNk3w5OO9pvbtjHJRkTrvWKOr8W3Zsfdj +ac4nTdxcenJxcuazydPdjdWH5N/JJlZWLAZHsURU/AqKEVBR7rSw10UyNfSt +o68VFCBp76EJjpDYIGCJfQo0hgggVBZKut7u6oSELqWqoSSpKKGQCSaLIhh8 +0QED6JNoP5v99nm9l+u346/+Pte31+Krj4+A3ov7b2XJbNi9GqOybPoVUlxj +hJpCRjY1RCoUGZlTDbDbUErEqKFtPdKC6EwYvn2cBijWCawqQkYWjqYIXQbR +JESQFZqZaysIIyqACojQAqERyYpWRk0YdVWb233UwZ9J8n+PFd9s3x/3TKND +TTS5WjtqSXhcUa2WksUmAwNGtgS2mAC0CWAbPVjDtAaSwRAbqAPBQbBAkh0c +Q/O7uyMO7rmnqvO2mHys1+J1nxwN4Gq+Z4532Rk4YhyCRDYHEMsi5HlUnPIf +p6TDumLcP7ZAbJGtcn3nyPfp5vD+lxqZ4gdDv9XzNQFhmDb95HTgc7aEoItJ +Cdw4dPoGEzLZR4nFRe1TWCnLwXOrkGQkDV1tHP0ZcMu2b1323ks7L3NtSdvp +OVNHEx3cSS24EZCEygkmobw5CTRIgVTSVipDNzseC5NbDKVZiyMes2D1fsPH +/IrGZeXWQLlOehSN+fmFSTQIWLF8CzdAlxcSDYoIwMJfuNXRccXMjULZxkXX +SDpMpUyMiZHw/4/NxYzBkGUIGotkwbAJnZUM64xETEQzciN1UQEcEFJ0KccC +EJTcCBEK4j1/Y9zwGYM1AAEAQMuZVZXu8q+TBllryy2IsIiSSGXqZjgbrbky +LSa1rR9uN0f0+/Ys+I3hCtE7u77BUgOQ4kIgkIEKSEEg5B2chYDhG97zKT+o +8V/J7fwvldQzAAvTHefYLnJkkqiii7B6/IRUhBhQ4DJx6m1scnj4wOW1klAA +ABAAAhbM1WhCUSzS3VS3bMDXe1Hz46W1hG+pILKRwPNQE3ooeyX17RbIzCKi +9pPiM2YkH8d3beHlwT0QyP56/bqkWhtvUpinGHldPy8f6x19/JC5xP27j5Km +br8pmjHjkP7zoUqib2fQoMqBdWG1IKJI/Eoy+EPRH/eaFyQGdKy+6/s3KuJB +TiOV8lBI4o0HH149AqQI0pTytq34e6RXzhSE5CD27J7tkVa6DeUA1Q/eQ/bG +f3EI9HR0U9EPZ7+73Zer2MlFbR0zbyE6Q1RMwAWY5SJwFaiGU5VsIR0nXsGA +a3TIKh32dTQnWCwoLhZZVhokH3oQLFxpZeAhCOCocGFI1m3PpOXlFjIytdm3 +du3b68h+t5j7Dds24x/J/N7nyXx3D6I9hxnZyQ/WX4n4XiPR+49SRj4adZ69 +ivhQNOwHZZyEKKSGEg3I5mNCePhz0bhBPNKMkyGu2GT2Aq1RYISPQUAW6rd3 +jI6WldKa/TDRG3kCrMgLDawvlyPiyKNQ6h4BCFqzqNQeAkssUpyEe8eBI5Jn +lgZr9omBdJRhnHm1ZRDx9Vp+TfhfPyiWDYOpXgf4Go73U37DbwDAAAAMslko +KULAQNSGn1c/fHJ38scaLZ6FFK2iE/23dBOdm2BRRMwMJO5ciYE9997/gVYp +0gWC8xVGeNagbXi8dGVkc6fpEkkq4Q9JRxpryAduJkqRnuQgh86yWe6cD0sO +bZvUQJclVU9bzAoLC3Gl+3iDm+18hLpeNtYdLCUZ8ldGX59ZQ/RuRo2G8ivW +aypMh8Bu7yIIO5A/I+6GajmT6hOq4giRsnDuNOwv5h/AVF+J8mdM9iLZ8ePD +YdLjRnRgp08HxMbDjl7HBo2gxIvE4Ujvc6q0tPdKQgWQXBuIudwDnYq16iY9 +lfQovsLKRZg5Ad7DfuFXxJlL4VkeB7cCwsw1wZTJgtueEcwz8QNmbjweyPzn +ANbZK7+u5c9yPKLJS1gmKonUbRoaoPjnn18h4QK4sVS9Noq5uE6dXkkRxkCd +giZY8nUmbyn+OJLgeKRMrikuwct3H6Dl0nYDPpzI7K6HuhZ2Wjm9syAVEE1w +k/OLWudtLjQlXJYm211rIcMcSDsunMfNlRR2iPdbRr6je/dh9bVeZrT9sgR4 +09+oTurXgN8rIFlkMa6cIR2uDfefOloW7UgcX7zC4ZhhpnmxNRVVX+8UNS2L +0bodPHErivhsTr/yYtd/nb7RQwydg73ZXdG57iumdGndH/9DayTbs0gfP5yV +cwM8s8rawX4CfIxwRZFRUKDeBaBCdRAzf8pUHLuy8F9bN0Kj42IHkDAb3I1K +i52b9SgRU52pOj+tQbCKNlPEZRrfbEp90izyOS7HyqU42fKHsJt7Gt+/bbLR +YwLmhMt+e95/kZ/olo3N+TEIZj/2m8kFhuK/ooZ1eaV30XW53wLdpqG6Xf85 +lodsIHwRXNBnnMDyfI7kk2kSQtNUnFFgKv4nSf5Te9xlTNwM/+XJbyfs4K7c +oN0T/Lmy9YdJrf6AmghjJbjuc4nd7iMLlxRNDdzWFmEtlv6+mI051iJRiV7W +K+29dG2VlEZITShk0j6avZlvICZCG82ZrT8FhWCZSzA5XJWA8h6bk/t4/uvl +PU+N/7dy/t9x5v8z2n2m/zHke1+l/Q/h9N6v6u/EnxP+U0+lVYs1UxE2ql6c +WQCYLghkSHFuHJCFxERNq6kiXAaGBIAYFhYWAFhGNAKeVEDcXL0gxa3nrEXb +i72MLguGk+0dk0S/0oLq5du8tlsuJXfOXudRbR7bQPwjokhAF44FXb/kdQ59 +V70maMmjeF/XSnIw3fAJwCaECAAwE4IEABgAwYMAEDBgBAeW24HIX4BQZQeT +k1rBvdKUGlpYVSbA4/MuuFuXtBcc2VI0euO941XJMXcAh6wj5+IUtchIj+Ml +UPYBauuIl5JQqGO69lq92F96F8lZdtMSFsJfTAr91PCb9CiQFz2SbIbS8lBF +eYiAbEfSCrkqHGWwzV1a15onfTKPx/QP/ERzOTM5wywBLASpADlvHS2ffcV2 +XY9fgVHH981QQy+zdF3PC/39t7j8n6fjW7jRmjJCEgIJIYkebPRydKZh19nL +z06+bAZh4LnZmDRA+szh86J1pBtVP1N/NhmDOMQwbD1h7wHvb3eSDkx+d4P6 +/9n+r9jq2wqRGwl2CarvNipESPVhi5ubgANFzX/WFbDbTKp7cwmwAE4GcgUm +HWX91W8i6SPIlvR/Yfkt8T76BYA7ID5Lv7d7J7/78/gDAiHiOZBBwTPf/AUD +MsTDwDPgrTmpmYkxJDkJ0EnDySai3Jp0C6Jd0EiffxmABU1WDNARJiSpkCYk +kEmQIQgEghxAiRBD04cO+ZeTRJqZeSJJMu5bwG0fH8fT7T1nvj+u+P7XvwBB +YMwb9z9v9XyXo+jj5OX+AeM6PEXXXiAXD7sP1B1cOkhWrpIgfBiAEbMFOU5D +4nAl+wDiYmhREOAAwD/e/S/b7IEt0mZgzAZzAi71nacjQYNi9ZEASQSxBFV2 +cQTFkO5J0LIAlNs25AObgCYcncrCqtsVcbrbZEkkulSEIOCDMGxr5P3OnPzd +hw/dv7f5z37576R+7fidfts9hxxxPzdgu4CuWeN3dLlHSHY+R1p+4dYU/Zyv +F57Cta4TrQoaIggIDXXU0OKOLWg811bmOLb3faGbaTtKC0tmYMwGyZfs3cnP +9u8cvHji+V7OdnGeWoXGpBzRSl0XK3NHEDII2AglE3nPHgcASWLEZbQUN0CQ +SZccVzJLFpuuSzUxGilytBCjkSLxjD00bobQVk040IAliwKKLIEEWn/Jrf5r +Zx7Z8p/Bv2TfH1+tnp9HQHJ7bUnUcjLlYFtYVB3d44whEySSTuE3VnlcAsCw +LDnqOfi29gs5y+3p6554kWMYu+nrwzjA1YXhZGlBGq2jXTdVT13wBCSCBH46 +XDfx6eO9zrv2qVbdJiI6XSCJlBBE8xBG7c9jaiQcBACtRYvGpiOBBEokiObk +iQJSKJvGL10fPRyPGg0GBskZnYCKF3zXrtm8EkFiMChXNfPi8XedHDyNASS7 +7cTgEzPl+nfR+p4X047l+bt5ucLp8y6s9TqosZQQ6gGBze4+n8G/TJ6Q6vWH +V2NBSA7AbJgCWGMFwUkkBeOKmqiD16AHZa8NGw14YsC5IBJYFgUTcFpOx2fM +DQrsVsNNnLOw2Hj2qRtBMBCEkkljJmOGuwCK4IAgZAUUzDtHg8vn3dp93G7k +6Q40UgOXO9FvTK3be4YWQ1s+/q9HLEAkkEkpgOeNJEkkcpoDoLNoeQwKNApw +GzjhMMw6AWJ0NVoBizIFlg4cghC7TCMkkSS+LQJbS6uNxYBF0ScErHQ8Ekg8 +f9Gz6rj0OfQPyPG0LjIZuPlNJEE96gDjs4sIPFpBRAEInhwqA7zqeOAQSYJh +gBFRJmQwayHcklMBxFqZRQiaHWW0uHDExpKMIBRRSORcUgqg3kDZpukAYJJx +XIQ2eKaIhgmJRIIBokgEDOk7+H3/Pxz0+5//3wPgPh/WfMc4H4vt+Znbhyce +1+QF6Q6pYugBhuLFG0aY00vhTQAAaW1pJaqknvKqFiVKhKBOUEucJ4JBPW26 +7vxR675zSq9l0R3r1/Zdv6f/h0t/cF1AeeISXUECBz9BPTS6QSYmk4Lgkkoo +nuCXPDkkuSSSQQSQExRJJPH09dnTG7uOvT28v1Hu/cd80+f+T9B4vZy7n7Lk +fT7Rx3ZazltfrNRtGp1NHjzCcxCQJr+3zfN+u4vuO0+oKj/DQ8T/HS/yhk6P +rozz+Q3ZCOyK8h6Odea6QRyOJirAnKH7eq1jf070FJ3gY1p9XVG45fXaS1J/ +6PKoAywxsWyj2PDt4mwvGtjU5QOOqA/X9nwybNrqyWYOHJLHGXFm9+1j0M6x +B23IOKIt5X9yfmjFqwyu2nBwXzgjPOlLLrDGTPw+rhHgAvKUsgWp2X1uEKgS +GN+lq+emuK7AQAAIAECOgQDKEAATgYAG4xG4t+Lb8/YcG0WMh3tEkcRDCwRI +lLWwkNRYYEWrgUFHlv7H6bsAGYVx7OKB+F8PmvSYOnz32/F5mGGrMGE9PcPZ +e76mnS8DvfQAepPr+x9Zu6OPXmHSWvte0DDhPkO1cXvH03f/Fa9n1+48Q07C +teLftHYwOmJEYWAABu4/03BQAHhs3ASABYF473VIWAAC/PenvuCNwfSIcogr +MonzDVeGAgAH3vOY37wPP4ATykR3jV8tZHyPy/7fP195/j7Ob/q5Om8h+fI/ +tuHken6zq8gd/Fe6rCwQAJyABAwADxLK2R5sTMOBAiVtmdKQDAVE+0J/Xogn +yyYBSEHwe/cSIjkVppKNJ9DHMT1eqDwMZl2AfroSD/NYlM9eser/kFcrj52D +9R9idZxCWI17Uj1CXXlPd/jUiYjiAhyZjFQWKNbwEbN4awtZtlcdYr1ZhMi5 +2XfHm+/lm15JyfK7ZL+kpAEIbSSst+jRJZoiVxNa41X3LYWUPYsDHAdW+VnH +rOdoN/vyFuWsK9fJ5G3YaXtI7jPr0rXstPx7uyZLuwjyvfdizuySB7gICZgk +vsRT4lHjvxJgdyv9vZR1gaAITH7rYDteZxocNUopLquZLqiuTdBte7MiG6VE +UtIoOlgdqXX6OgVr48VyDNoUWiIF6Imnu7xIkVEGaCE4naoArzme4SkxGRhF +nB/UNsEJOGKhxlaEzRRPViBMPyS3PUYWUQ017Zu5U7o7QY3FFKZZ6MdeML0i +em+aCUnpqKTFCWFLAGd2+tyrBI3lTD72R7n/D27pbIBV1+bIcZox/I+U4WnG +bzAaFOdjlYMhZE23dfDjrS/KJ6Wb+YfC9jPhga/+eWOu9RnsV3A6xpgDrhva +8fLGF8KTdZgqrukdnTqUmmlMz3Um3uz2YQp29zUfUQM6I+V/1szq9lteDem8 +f2XwSHRJ3b8NeB2K6kWRmHLC+p+GZFyRPNyKE4dtmGvzSMRwrU3w7TPkUwxL +yFr3yWCUSXuZcOze45ijozu/bWisHycIVvmlki3CkSIqfeDBBW7KZ0qhGU+v +MJ0eBn4MUaszGG+rC9rxOVGoouckz2kghDc+3pdRQmSaiYqXm1oLaEMOwwId +spegzJCJVSY2pjEU0Be/UXefUGNR5HYG382Qfu8qbFYDjKUvslGN8vFX9dTw +yr20N7CVhqMAAwmvkjQQKCggQRCgAsYCgoNDgwLCxAhzId3LwlM2oi0Ag6gs +HZ3csQnIASoipeIp3h4cWYNh5mUbSB+69J5j3nkv5/2f9/YeN/E8F/B+vn+3 +osGlkrRbm3fQzyrzZVstcsLVcfC2ZSuoIFVIgVtTE+HTV7FC5fxBOhAHwMED +BgAwYblA1W9eG3LxOFwb1CoJIVGpCQhN5pH00tCSSSaySqgEvoohLSlJvVFR +JBIQcqVIwahUXcO7OW+p5Tl+g+2bdBN1ieb9dk1+nefQbru/ov55X2uN5nP2 +P/HvpI9UDFzcIA9oP/fMB7WYkqzI+Kg1sOuCIBs+1wECADzzqCNw5T0AHXiR +eNHyo0YKCGwlZ37fFR7vIbMsLKPL0F8ta/dWz//5bubo40XVbUgJhZ+Hh2Qg +kUZu0QU9gADwBaXkuS8UdBndBytHLTbryTlpapiKqDRVBWC1plfuPbn+e627 +w/Gd/2n1O1+Rp9Tk5waEEkCQjNJKkgkhUqQkJCE01AGltUhJJJNHJVRC+FQl +pQBNJTUGRSEQkjB08qBJU6FQBu08uvta2DDjM3N4ACsSMCorNdMrTF6LOIzW +O4ahgGGLwh1w8MDRMRExMGGigaGCoeLBwiKgAE9987H3SsWED+FbxdkrUkP1 +1fMxQZaIBefkSDejnwIz0AA8AMeSrD72LyaOdIecEmL/3XRQuiQSxPvZcwNJ +/YQgiBiAAwCMAAaRUBFAQC8I7/AR2jk+EdpnwkzMPYe3JlxdG5qq3AuHg+Fb +AvEyZsRnIMDGJsYM4EYGGKrMy9mqKoUpLOsGCLhQxgwYZ0khDkuKUTBL5Eyr +iZOc5mJtKwWOJmZOHxipolsAtKWId3c2M5GJFiLeaDu7h2VkppGQ+ALEgQIE +5FPbo2QqNyclVU0Zk0ViC9BynIhwILhf0+0/G+q/9f59696N7D7NgBr/J6X3 +/8H+DTtfXV7K+47Ol0c/U6RfpywKke3du9kY5OuvFA3EDBIJeBTjo8A4cNCG +oEyATLD9E+naCbqTNbCjMe70udlX4LsuI5JYukxyiSFBc5cYO6aT/vomabJT +AbiIOm2swwSNlE57SZ/H3Z/X9N6f0OK2+J9z0vGfz+Y/i+k+qv8zsuLy37Xv +/vfU9mOtyluXsucT2gPadqjSID9wD9wI7EmbJcBAgRplr7MwUUQgUQR2kMLP +cDsYsMBIgtu8mpmWyNCTpQ7U7vp7ahc7SMy0zMiGiDksiSCCcyBO0iZd2cOx +YsEyXl/564eEPGX28fKNk8Sdg/Lin3F7FJrSCTAIEUHRYkOHDgjhHdGGmW4S +c/8DxS0SXIQIIzI5aZb9Xa7gCsM00QhVbJ5TsfGGvBwUQr0iWlAkiRoMmWIB +Yw0OykF0yPptm/6Lbx5icfxcjmLR2g7o8TOmiJbTdoOAd5ch976GGRaJ7xTB +mYOWADF0wHnqUQCCQgSVu4wOqdJomw/ejcthjRJRBjaA7mCcdf+3HP7XxHNz +7QiqYZfaB9SWHPzqyiedlw04gCdRYnkKJkTXGSUkEm2OHYkuxSiMjbzcyiPR +Us5yi2ohOI623dd2x0TYGA8PG6vOYriQ73/J+34jZx8SJ2c23QM1cVTJNA7H +SRS2wQRQpCCJGQCGJOZ3tjggS1OuSXkQCKT7GhwTy32dTJJNc+RLx1FTk9yw +mZgwDkk9BRRX3PDUjh5r8r5z48N0h9T0Y4cnO+vQgnAil/BQ6kJI9DuQMC26 +hCfJQ5VzGnd0EShzO5JJUXz3MnseksGOhOXJK4u2046BZmDMAQ1EknTMjZOc +prPWMF4bGdX63a8lcXHyXuOgYCfruHtS/PhiEkCs2HAnwfdxycnISklzYiOj +gmZ6KII+CiokklSzgkEF9oCeZHT5Jk9EOHwUUUQQSTn1VZx/Xw/39w5hUOGN +TrtRvfy/CbPwWtA1GdJJNN/j17a17LykNSRbiEtpjTMkkNObFVoECSWlStto +taqiBPIg4JIIJSWnco5NdnX7LwP3Xd/FfocnICSf/fahB2Gwk7QICZcYB5B3 +EshccpJL8byYBJBXLERyqSffYAcsQ4KKt2cgkEl85/w7fpbfh9v63T8x5bl8 +F3r2/h+7ftfKdL5ffdk1mi1en23OwX1qcGuvLbCZITTeZ8PrDY9g0XmNu973 +qgpuQiMAABAgAQHmDBApz1DuenIIf3D+KqiFzPnquLtKacFasZQgIeho5clU ++Kd4d+ALeF0PSEheLd1gQo7w21kokUK6nD0vAs7tVOqI8QVHeHKgqT5YnZaa +0wOcLqHijaWLVEGpqEEViyj7WLV+xNjx3aNz9zg5EeD8nXOycUwXzdFV0Qc6 +sjWduj1UmBPzUCr3HDppZSmgRrtzobJtSNiKa+nrgAVC13ypPB7JcYarHtQI +ECAAEuVyR+6Ai2sdAgaAMX4yMDYwLmxoFeXndZ0KgYRIcwEgyMhj2ODegFqh +I+mZgRnUYWFzOBKs4rESgoEhQVDRAdGBcoBea09R/lyjP7nj/lNOfb0/lPie ++dHnNueRHufT7pu5wAO8cW/1PZf/uHz3ccgAABertBBTdwOBAgLsV3rKg9Tu +6YoFmgUywqkEYBAHc+eUVixE4eCBAgKcGCBRukIi9UACLg0EAAAGH+bL3ORt +T1N98GCUmMJFPsFk9jWpYB2o1QgQgAbXzBVikOddbSbeIJnQq0lmUDfxSIAA +XmIgoyVOR6ZKGYu5KmwsoIC0bS+WAitsbc3U1QA7YvZYLGfmv0QuLuHCt4wO +xd5UU5HXnYKK8NWV5hBwE2msAwiDuquDzZPG+HPKEvi2LUNu3BA5DU8tU8tk +pCrN89UBf8TXnaMH7O0G3etkoSO4O6tqtfVJ4pH8vOh4IwVHaORPqDLw2jY5 +MP0qyfplKy2O51qCC96r0dehOIhztoaPxJEs2pJ1S8GTmogxgVY6Hcgc2J0l +xRS3pngZs5jKO4mWj4l0In21NYIa5lOmPaqocIJ+5D2A57R9zb3OEmuer8I6 +V2tKOycl+QkrIdsx2cYT9wrzoh2WzacnF/Vid/UZIBYnWJ1zQXvgMrUwfc2h +BMyVsNWrbethrAwIyELQAJQ6DAV1cT4c26X1/o7avcR9tDQs8os8BsPz+ewY +J9QVRQNDJS5HU7WDWyh402sR6pxxOBEGfQnXNqdCpwkdRuyxWWtKqaaTfnLw +qsL9ZO1ujwkOffq7G6v8pw1dON5U3UinydTDpQOVw6lCrl3VhgTQyojTWYQx +AueIXiJkkCJehtj7xt1HwYI5ab9NBA1C2Ej/eVTc9yg6FVDHtImYrQycwdQt +kMHIuirxBZQcwuIx4HteX/wxy0YitpgTK8edy84pRoRgMGSCN94XWfPZDjgN +zzYDKockGcqhyB61PcXUDdFDB/MSPTADf1REvDbI4yJeqfNeQoVrKbpcjUD7 +ZSOQGRwMtvU+/SgqUdc2Ob1lvVDz9C/j1xEhHo59VZBu9ExGVGQXLXBRC07U +9C7Py+RHRyR9TStUaZ4KPtl4esVEaOhTxtMmMJYULIZKYVIiKE4nQ9ybxJz3 +bEdmrjCmur3fP5zx3L5Txvzs+u+R+I+Cr9Luvc78h9Z+L6QfrewHufpfHfWd +5/KfxdxLmUnkmA8RMn0tITNfuSpFp6cEWggId0xglBjKdoEBwQODgAwALDQA +sIEDAoNPW/GiM/LpNUq8FonrBIbh/JR+2NqNBY7F+VZOJl3OpRUSCVQ+o0l9 +VbO4XKYmisGZXmwbAgAQABoDAAAAABGwNa/ePKIeEQGYu2Nql9jntyh5VDeq +q4oYQLw/j4s3M00QxyWJj+clY9uDpfFMrF2MFvDYb/PgeIq6dtILrZtr07nh +2QilHKi2Z+8fZ/ulKEsLHE0WZGJi2TZwphYeY/i/YkClHKp6stJ5Um9Rgkcn +QwB0EygLESSEic+8hzm2UXXwZdVE56NMwQLRLQkAkGSqKkGElVUZCoUQlUUV +loo/15YM3pP0uf7n2F/Bfy+z+R3AMzAeQLcOT5krlXhoeo5ri9H5YiRR5vn1 +NDSjeJ01gVMTJmcCmZoqWseh989hffPvPx//P9P0P8kr87uGo/j+7qpJGo2x +p4h0TxBhsKGdU2jkLNcYmqfBJ4EW8xFwBaAagF5iahYSEhISZl4MAkkGmBIB +IPeAQHYh4cipxDCqpyCHqhT0QJFVJo4lhLyZBmRQAskQosTTxDUEO7ykU2Qh +AQl7t3d5dQ1TLsHd3CEmTILktLSxfdTdALEkwGIoDDJC4heRJCmFBSHYIEwg +EbBAchwQCqiECcxb4m4zN3Dqzdzbh2xRkYVlwnlyX9fnh/68r1fKsGYN+F8j +9J8vyOs4TS6XS1M0Q0qGliGl0kvqiirlLRtKjWd3GEwCBkFySBIeQWr5bN6X ++BQ6noE8EgnQoeK2u5OmXfP9Go3ToT3jM7P0q0JIJOqRJYYA10xIZpng4DAO +6DMyS0dEkl/G3x/L+a/a3j03iF+96Hzfk/ReT8x+bzb9OHOzFyBzAt3LrhAO +C0OSTIq2JYuOjoOCEONP1r6vWM2aKJ6yRrXR660Zv659LFmSY7tOpmn8l9zs +48dp8d5PX4bt8Gi0pnKaaspHOiyASBMA0AUQWQJLrAkGU3Mh318OJDsH5OWb +yGgmNNtqWEkESCiiiSfoelOBt1WmMHPPEAwjBXLFAbZoE7du6t2L0020Znuf +v4dFoGDIutmYtEZ65hffgyxQDNRugo0qoYsUQPRQuQs1ShULyaIitEHGRAIJ +CCGG4snkKIQvXlvrWGbqFmAA263sEa6lc+juu5RxCZe6eLSVTpsmTXIkeKvM +eT730Y+097/ZPu/N9116COQMOTqc3wfyS4GW9WRQzzdC6pBbY2EHZjkOHbBI +6WCQSemggWyCp7pW+B2MirgLrDsdBGm8IAVaSSCD9nrEEEmUxAIVfG+x3bu+ +v/19J/Lv8TwxyLgzc/QJ50x3X0IcQgIZCFcnKT3V9bM81hWQ5PP2k2Zo0Vqn +OIRIJOqggl52bebtjxdn6e9o5NubA43I+d/I/25K3rFp2L4MyCeQCZYiQhAc +cXHyZvnmQQe665qBI4LPX2wLF1RB6XG+TBM9G2QJIlAzj/DeGHFzcf9+/+uc +SeIcjNBOvlveZ2ZCKYtYIprLGQQgMOC2995RWqJw3AATOcdjyYsWLBRCEpEj +m0eWME4jXvQmda3Bp3dLogdJe85M5I4gMguTuDQH3EuN25C5CAjf2KRO4hm2 +lgxdE47YuSS7Ela8OWBJPFv/j27d3gJ14iB0Cxs2bG4EIsCQOZLjK4kkUQRK +RcknVLAkJx6kDAGBsbEicXHhwWhEvjgFDeT+qz1dlNAupcYIRwGUE4BKFBQM +lKAs06JRmT4n3gTr8DMxuBk1DHVuWVi+Gb8dwy8y7fn2GdnIMvvcBAgQAI/n +jBUNnbQW2ibZKI1+jefVKza7enD5m1Rzo+iHBLoWy2DAE3sxpRZwYIR0+uCs ++RTMz7jjKScfWVk9m+Sy2fIIGCr8PKR8nA6uwpKNapw/huZZCQmhpG2s8um/ +oasc/0yG0Gh18zHeGT30ILwEohXVE4RT0oM+FEG9lZPFG3Sntt20PsngCRHN +Gl76W/J17WCAv4VLuE0xYNqj7D0RQ5dgWX8e9J9d8/4T4nh1voL8/3b0nmX/ +B8D/DfGCOT6xel5d52n7Db0753y8ut/6XtfL9PdrkYpRYOCyMNFwx/VlAhER +MnWiATDB0WjdGJc44XU2t+xm4Zj6JwApBeuOOCVX2+wTzkwz04xQcYc6zrkY +X4lvdZHY8olSrOTJmbwWRqD4HQvtNuyvliC/5EZ0istpw/18+K3Lg0V2OHzd +YS+M1Ia0onK8J7wFbDdK1GT8KhURIlkb73lgk3GnJCq5tYHmuWnUJ8kIzhlF +X4yT4gdzYzVlKCBeRWykUP4W1BDb3OLlz7Bi4MZSEccEGP8hWBN5wnaomnAb +gOga8rFz+GheGuXiJkhVgigXaEL8BVb9lMmJTLzJHEvY8Lmr52kG6nEE52M7 +8VSrk6zZEz9tMdGxfxA49l4k030BlbsU3T8Ld6VgCmg0uFvbjPzLo8e1+Fqv +6i+3eRu9lyrTyHLIbfI3bU46h1Tg1vGAjJyk8EJMVw3XRAj89pe9u1K4w/Du +3Wkb87MuDBd1x3lX8bBVoOXryZJ5U17aznoZ3Q55bXkDx4wVnyn+A09ZD1/a +tOlL3nl/dLDqRV7tggoPAUJI1ZogkMXaozwilI8xr/588IY8g2oSbcE4Cbr0 +YDhqi4C+dWxw0SLmF4SHADfZDfXeshEOQVP2UXYhf6lMwh4KF614LAABFU8M +0lpsD0VFroisjimbSUaROXHHIzxXyzUYOWTFe094m9o9Bvem48sMhf+pVoRB +sUwV+lS23P+eUhbc6hHIj6FkUS7CwYy6spUwXOmSmkRCEArQL2jQSfcJHZfY +SWe5AxedKbpqtKY0iLrEQp81uPSH+hKQaLAbtDTRvHwyzEWk2ej+PTP1CvWw +9PAfmHGPdhAc3vZFjjZ5Euey/YOd6rDuxUALm2em45Ko89MFsSuK7Cdkd8xZ +cx7glldGe3JdPObzxraanUd2JiRhhv8wxSk/Mc2TOewDT29iUv5uLQhjkYg3 +eJKsUjhBqwEObtK+PjLQiEg7NltlrkOwf2rHGAjVubsBcykVzDGbBvIDVcQ0 +LPoeDvobIAyvjLDDMMM5ROzEnxI8dql1gTS7WhikW15pclj9k7uXHmnex5aP +KtWmOyAhrd6Y09a+Fk4MRDw3+KqXw4qrl5UJ0Ziginl7UPDMwZgJa4Jd2Lun +dy6LhwkgmBDUbFGEEi8GhV1UPNBy+TARIN4J/DJmPsmUGi+++y5z0tBiBgPL +nvmMWylmHFMQhW6MYZz71JoO7dBfVR5L9nFC342BL0gqHLIfHx8DBnwTfDT7 +UxlcgWPJKOuGf6NmyFyqogsqAeTV98Oc0s6F0SQo1zuW4KhtTnubkfGSkTEa +VrIJ6qTXn1G2yJFeRvBI/CObVESfr3Fek4oE8oDgpffly2Z3H3yOxC0owjgp +eptZXtX2bfutHX1U3O5iHzNSA0EKGRawAAQKMAa28AMBmYIOAHWQ4WFpaX2k +pJgougsgXxVN+5HAKP+e60S+B97xfJ+x8B5v4HkHDyvyg7jzIHipzzwvgIUV +UYi/k/7wAzCemZ6exA6MtNa01WyP3hLvEkXcIVAyA4gZUjxvyHbfTdXZ+zIE +4cVQa5urJlzsvZ7mZ6RO8ZgUvd+oF1wTXSUsK2w6uUXNTZYGoHDfc3SH4BwD +Bmh6l34eBknv/v0T3C5irBcX78sDGHqwQBdIAlmzm2qYOJoQAhTB6oXStS1U +ocnIxdRU05KqpYNJd6zRiBmYk0HFoUcBG8mi4oyQHzSqMDDZySgxgLIy6Sa4 +wMLIOJwJq8UytB3abi3tTUh8J4xECIa5rJQbILQJQDwSoLDDGSixQFxAxkCE +hdISUPosQUuIgmTNhCCBMpIhy8i9EZgmUVAmUXkkgUBnSVQgBREOQpDeVPz/ ++f6/d/5/TszBvkvEdyYem8Z5PfzcR5Q7PIEgDpIN0AJAtEA8b+i7A+DKTCab +SkyLXQsagIdqcPo/OSoUfVfC5WPDfbPNbiumOUSetqpN5ijpu0m8DyjuSQQS +2/Z/22cg+B+h+h8jp4jby8vEQwC8uNQiH6TdKOIlunJMiACMCoFhSSwUa9B5 +WKKHddokeF5as9PROcsUQRlI4pSSq3igJk+xG5YlmQknPvud239Hf1/Hez8Y +9fodp9/y514xyAAhP0vFcze261gdUkmG7TLllzMJzsKKL0wIKYkR1xagQDtB +cUyJTHageo+oRqA7OCSe49TZIquqTzdhEyJBO+Ijeu+dKBtBwTvsb+In8D1H +kPJfw+a/YzgdLn2IcgYIjk+B6rcOrouhB8M4vl5jzEzDtDer3Bxufdewzk4J +HeMdzxNGp13QJPWNUNd1198/Xmtx+l9f6/kid42CGZgzAcGYHNczdAfntzRe +xAdZAcAoAhYAeOYcdsDWOR+bTn0NDIoNZY86S2adntHCr7K+7c+6hTHXdpiR +M0nLkx0tkRv5K3CcEkmu0CDw/DGzOvL3Zcv2cKxfAM2d8L87pXszmyFuxAkd +bXUkPAygHAWQTON5PXSJenck8Y5AnJ6FHKSo3JdN5a2mSXDmsAsACmQDCupF +zJpIkrpxEY4b+pyb8fs/2f7QNxA5kdOLoBA9QY16GNXiEpoTBLvJJdgRuAKE +IPMCIERL8OI/h5fl5hm4FgnXjjSA8okmuXmwIDCdChp2G/Xg1XYdiHw+vC8b +zSDBQn47mhJciq7CUTA4hppOxLLIsc9J8kXtIIJOOpMtyQlhNdyVlPahcXYb +N1UTSRBBtx1qr9/zGzr/zXz87ScHgE5Q1HMONBJImmkSBAcIk79/AMAEuRLo +6bzHTdnYggkvlOki6RKWx34tRr08dTzvufMcvJy55QjlySAmjUFiQgd4BYjg +wtiOTdPTluOtON3T4zTVJJp9eZCJEc3PLHX879/3nlPR//P4X63ncjAAMUEh +4dBhIAZXSrckV3FBDqDY4LnDt53eJzx1WEItIwICRSKhw0zAWZ4bzeJkY9Ba +ejkAYn5qwqVoySWCDrjoXoXZOkje7ukZF6qaWpENPi5o3HV+MEhJYwYjFhdT +i7kHlVP9PG/pI5dwoK8W/5/mz0D1Uz4yhzOpbcWihz1ICFSnlUpCb6DHp3s5 +QZNsFkvbl/IWG2iHI7MMxgITUGANo+0NUxzPmYu6AgDqzY1qYtwyYlKTWqAV +GSCDYANmZSKDgiHJbE/6RcUAJCw4DDRkUJMziGAptVD5K0i5EDGRkY8FqQIy +PmqfFK6XZZr5geHQwjHAA4PDB0bC6oNCh4ANGS1xIEyL7FwSEhcIJipiDFz8 +mG3QjajX1+YcmaqDyFSYaTZJ2EN++NHxUGRA09xgxhg/lVFhB/o7TUhKsR5/ +Rc53tcO6OmjuLgWZBnp2LftM9hq6HpbVzgGjSE5B/yFRggxbULxQIyeGPYxq +zWXNP2dUcWJoW2EbXKGBylkWvV+ZNawFx1Y3vCwlZvT12oUsqCB2OjbTLyiF +5ITygshu3H4cIXRWmmFXmK0VnXwZKGcHwXL2cp9E/+ZC8v2iEyzRwOKP9/xf +C1jTyGw1AAk+UgHCkVdpNyOim7zaDPeKZptKsNMgJ1lNaLL/MTq4CosqybnK +VRZmy5SyFD39cd6BLhfix7hp8+WBAgGOWNgtrcnU17P3Kt/Zu02GV/2FrJgp +UpmKRb0dIWXoheFVbzxvvoIOUsvkXyAtN7t3CWH/1OViOdOImJf+73Lfz4bg +Pv2Yi4MlQvXii9ggjMo6WRJEwfG61dQg1GhsXkbBul9ZHVTloxnPwRpCp4ig +Ci8tCXLEPop4hLhBxRiRS/Qi5+fkFXhv/x2Bn26d50Pqb3iFtDnCKAtYb1IU +1SGjBiESZOxXMI9mS8pwqU1nKbLENIExtJ39EinGYWXDAR8+nYhQn+EaQRfR +qGrzW8p8cz+7YZ1dUCoTButYdsv4+brfoFVI2uDtY+Yh7COthIwwEFEfOVJH +VZGiqXZKW41PyKa31XzdEKSTatXt5cXq9KCZqSkDY/IgV0FnB46GZ3boTCZY +nc61MSzk+Yv40DKT3d9ec2DRGEnXdgo4z7l64WVI4YhArpXDo8RB0/W+kuma +b5b8GOVLc4fa8p57l3t7f71I3EKU8r5NiVYnz5uwZ+lzoeejl3uKl3w610wb +5mxhGnmi4VsMF6Qnj1D42sIsES6r8vdFTR4qAfVwmtsOTB0/BBIsXfDVc3JI +k6dvJ8fqWCQpMOJipOfSabEUb4+i3KcvCYhzikldQZOpGE8JuEyXdODCsowb +N52a6chqhIyYMslD7Na0Gov7cb87S2UfhSxBAAgAQH+anc1hSc9UWMxAgyrE +AwLDAqYEnKSikilIhIyaf6+mhCXLKIRhByIeHIJYJg4TJqQmLtUrDvDyoYw7 +xRId1bhwcHhgiIKiMR6RFhGjwAC4QkIfTRGzJNVX90W2LJ6VNipBuIlmTB1I +cEMnpONbl79W+g+3mcDi1oWbPAabBJ2dgwDs2oPLWJe0MoWP7j6oyC56kZ1h +SlBQJ4XiDJVZo5/TQnAkKdio7JWG8I0PFeqFOQOL7c9JTDlxLwS9XTqeSOLh +1uUGnaY+f06qlavcfFt5XKQW9FaP9rB2jGcbx4AQcCs5Vx0cQNDr3K1A/x4W +2LTVK1Q7McAwA0Gu+k22ggQIEAABSfM+N/a/N8N9D3v3P5A/s/M9R6jj8ueb +y5C9NHSHSj6mIiaj6mL8j5bSVMo4j6paZtKql9ZRlCapyp1h60zozXkWFIB0 +sfDfz+6+vDBqKiQEvWyk2D1w8eEfJMIiyrcKs3L2/Jx0VHExNTJYqq8lGJhc +KZMjU1BgGJqECgfdnHd3lwpMvJdxRk9ldTKmVJru5Il6NpOngwEQnUJ4SgK1 +WFBmVBgxxZDjOZvMiZmZt2olwUAnLkOiycuSHGIsB6EYINixQtBwXJEtby4T +l0IcxDEVIiTEscD5X43u/6g9p/y7nuOz5pf3+v/tq/NZuHU/B0mo0ul0uJFV +C2onjY36iH/sowF160IOL7w3eQxb4X6U/qE/VYloExiN3ZiqIwKn5O5EjZi5 +mTxVDwSck6eBkagiaNE7M1n6n9b+P/r0TyAcCVy9DhdA22oANBTY+54+LjJJ +PG9ZQ9MtliBaNvxnj2PTCq9LOamaSmOgPB6XPx7dPpP8/09fp9vH7HvvW8lP +H0xufqOGZb+nC2x1SwmAEB3pwHcMyuyQyQfrdbX6e9ep1CSXe6nq4Z9+jtPN +DtsObQoaiOrDaCFRFRE7/X+l8fw2/1+Fvl4+Kosw6VvvmCSpKNDXFFjCU1RJ +JcF5oOeXwpIXZRrAaaITAU/LDFmblnlRrtiM200akTLREVUsZJnXSdCJonbE +NF9g+wg8+/2HyO9+Ltdu38n0Pz/6P6H1Gelz7SzNt6nHA6haKbc7OEEAMGEl +cO7u4DkYFBMwIIl0lgcrfGX03bp9MdO+pO0i9gfWGd3D0RA6t9V4bUaptHeL +G+tSNLuplowmQRnXYc7H9d7LP5X5/wnn/mNWYfxbOB5OZyOnyC3E0uKEHgfj +UOmIpshq4AdBCbpaJ5IytXbo6K6WKpqwStUAmvae/QA0MXkvqRckkku+0iIJ +OzbDd17bTb7qO24cfxHr/PezzycbW+xgBn/2R6MgdQRzAFw2SSCsDnh+kKoU +E1OC0++gUpHSK2v0jBCBONO+o5nfeAA4QLFq6enUnXdt3Y0PVIvUmQmLUfQ2 +YxarM4b8v7PI9dpMWaafGOj0WC711yjpIAmpMCBSgl9YqSiUU1QVG+0mK64I +XN9NiBYoobyUXGj0eRpL8ovta5DDFE09r8NyoFFFLpooEiDdBcq8xFgFMV91 +1yO2Rcu6/epvmPLnYdOjdMTmM8N37p7D13x/9HH2eWDN0FmDMH0BIJz0PAiL +rAma1pLs5ta14GHDG0qNm6KYSsJLOjIDcZF5LYyBhMeKSwNEW6KNxFTGYkxB +fczvTtxxBPNzO5JMJFyisw7kk87vPNLhwSUQgSVWv1vddmu/unFu/++B9t5z +3vzHS37SOcDoBYODxk7wAzcvLxLmBcrPQ8GOVIggnTm8F0612+P978Bu875z +zHEzM35n0Pduy/1/7+FSQ+IDBsZFRsdIgkGAEqVWvj3bVeU3ZLbi8qG70C4U +a/VSWJipfm2sLfQ0l3a83wNVI0LZufHZhwUCTzf9OeNbv2NY2QdrXF/UNs5X +sPmy7zsPFp78zCGHjvJY7XslwkD/Xip7biPsG0oBnHiI3XM5Fj9t0gKGX7pa +67/3wABy9P18g6zeRTJ82uclT34Sdtu/wHk6/bVM6ltVCkrrdDikel3ySqSO +yFLYUyPlh/QRiXSKZX4izQQyhIehPawk5EE/lBe3NakFOKHWSIr586p0Wah5 +gLBrYiehiILR5Z5CA4vyIQKADBUQGgdC4natwNwBGcFAiAQCw4MDI2LhAkn+ +KCuQBgaPiQ8PiIUJCgeyhnWSC5EJEpMStEFpHlfjJvjPN7lpk8QZ0SP0F7XS +D0pGS3NGughfrtLry0qGIttPTDK1+kgxVdqb85ro5uiGjVMpdRgb0TQA5k1/ +m2qqZNSet3bE6EXj8+OnCdKw8W2ySFExopv/NL0ZPH6C7sGBvodz/HeXrXi7 +3Cq5PO7H2Tvu9ZXbhEsvzYPNB5aEalKPdAOy3sB1sw351XK73llNiO54NZX+ +mzgpsSE4xPXyklCObed7llqSYljGDX+7cUwXJ3kkBIeJTpnfda6wfmmGgAAG +PPPh7VjIe8bVo8P9+FMiN6FCxUqsRV8z7ATR0jmyNmh9Nc6dSybxYS+txUFT +KOpWl+iNuHUEAHL3c5e1UKkYvwnygJCIvnJyrAbrJ9C2bT6CLFRRV//U9n7e +/Y8z/NPu3KzG1J8G/hiDLhVWdDBhujGqFu3dE23mavWvF03MqHL+0eBfXNej +XxBMWuKUSFBQCDI2AfJB+/N9DRB6m0X6lCQL5hEBFNeHwx8ygkBFPnHvIEas +ftUY/83nfFIWzWlK3ovqrp0J2w8af0dFonWDvZIg7/P3GN+lgY7HHMGPq6IZ +ml75lJF+HGLyDmTDYB4V17wVDK5V+7l/Q4XEy1EFmLtLGgqGKJdm9n+DIAPx +7byO9XQedE3LmB8d44tBX1KD4DIE0ZJvGhK/k1bNIfhE4ExvXh4pqvF8hY3J +okSEVq1a4qZ7sCV85hggjdOIGM6QemvQnB2C0BJCTRlFI8w+g1Nv6DNZ0XoZ +IGkZUED5Dj9OKEMT7YV8gIfFVuciuu91Ktdj9C3/ubkmp1CCLevJkSsxiQIf +tJgLxSPmt9AYAm94jBNPvmvuZSSFeEsL6TsNDGHwbCXPNeBHKkMY8ivlvVmu +Gam+aCzfKOjNAexJ8VkiIAxopbMKbUfotcjGBmJYap1kfuXXgMuK7M3RoTXN +17OjJEvjEOICGvIdEVtViDWgC19bgc07NdhEoPMCjMGClThUUTUl0Q5aU8CA +0Bw6DiCCfxvHYxZFHBmASlM2cXX93mfoPzvI9z/y84JhBKWSL5I5/xsJT9g5 +m+pUqqe2rSovbjONzp27xVn0qcyVbqzUpK4faL9OaM6phoZgx+kuALHv/wPg +Pf5uiCBREeCqqkBUD2n9nye32Hjvg/FfTea8j8D9j+9/b5J+eKdpYa831ZB8 +irWv8+zdXzfERwu+lAfQCa/ozHMAfRP7uZOBLU+9UPql4CAe3uunQI1cxkYe +DANKkR6dDyMfXhqhQWBgAUgyAW72D81d9I6ipaj782s76NrG5ma3v6QfbeH9 +5/59sPP/R/9vuP3f8Pce/cPAd5/L/Z7Md195+L4ryXk/KIpFEeV7zEPATiIh +w0dz/m+b077Oz77/h4bOoOoPl3cggeXIfMzAClj+txWOLEYmYw9PPxrj5qs6 +ORyXppok+VrBdyHCcovMk4MghAOCAwQGg2LiyQ8lG9BXLt0LWN8cqEwIOKw/ +o7MxD4p+mux6zZyw5H+ksKRkiXsdLwv4nmfsO6+f7t3vvXfXcd7dd9jvmJsd +rXfYyHxjE4sjFvGAQcJXnM4nD3dvWIa1LGQ6uc1mqcVYhpOSYT071EWmNYVx +dHGaxhYxeDjFOJecQA8SUIExDpDEO8IULjCiMVBLFYEvd5sCcYziSWIfIoPQ +oiHdw700YIomhIQkUMZeicC3BgIgqqQwKDtIKV4yHkgypmZMWIjEQIYlGQ7W ++JV29NiRJcwcB2w+JWV2X+PsPA9p7r9zxbfMD/y/afYfQdX97/H63zYXJ1eb +mHQn++ef3EuvLU/UK6xgAdfQU7ksvT/n+GDCWrw+yvvva1t0T4rQmBl3ZgO0 +uRUyQTk791+02/R6TrDFxr3zfxD4z3XwlzZNbYC1JTPKQSUSSSSQngNxDgQ8 +EbLXoTNEghDxOiAq1mPfXH/HZ3HZGeWfd79NdnKwip+uDvkaOAWcEkCQL4uI +nSfVRD279KGHUMnfx08246mOXWxxXZPDhOPJI9XvvlgOTVsi1yjshygbBO0M +AW2ndwTaEM/ESmf4mbAo7KdyVx6VtvsnrXG/Ry8T0VNPpoNN/Rt+/+t+b8Zx +Y4bxrybYSdogDhx7w8xuUyISEiAEIHEEpLyLeH0tc3aszBmAVls8m0KNNDrX +VcQY8TFZEzwVkl+rncOw/R4uPk4n4izuTHs8Jyzb9u3EAkESMCg8MS2RDQBw +vG+N0pZ6g7FcmMnJXXyOfVDXdo52rczMGYA6i9UQCASTy5fZxcWzZ1vP/o7I +qndgv5d+SWB8KkSQa4uION07ihxCRq7AuzO1iRYFRGzDu8LZKVzmq5ufrbJk +knWe7zu5Z383avwIo71szmH2VoeBOJwawK4qjyGs6SONbEtgij5TuEjAkd1p +xw3clDhxCg43IYHItM73bjOmhL9TB071337z3ljzuqHOuXs3HIHmSCECQ4TD +f0+Kxyxx9QsqSLaoOC5U8rx1VOkVWk0SJGc42fsdHP4Te3QRxA7tNE2gobEL +uggWXG1EuOLeOHE+VxdhyLp4wORby+uz0GNu365MzDsvc/B+OCSz8QgEQ6Lh +QmQBoNQA+xWVtvqdPrB/SD8GiCvWo4TkKs1HPNDiyv8aov7UopKIkD2vRqog +Q7WF9pfdIXuIVCNWpvTeEp2tSXLyNTKGeOKYz49euhZNHZW2qDbQ2HWbKb/n +Vz98kQLnQsiUGyxwqJxtCpd36h83Z4HpntzbUonnylFBzXy7NI/z64fC+ahi +qsKcx6rnI5KgYt0CoiWpyoxFgyEtB2SnLv9ACnxcMbcaEochw7aWmQSR/xhH +sKewAQECZxJ8EhUo3FIcc1SoIHcLJBMaAHC0yFzEWO9QOSDmSUBjsoE5vtxB +IWHEEiIhIPmmTMdGyUGPgQwnNBQMZph7NRsjE1A8TGRUTHAoIOjBK+B/lWfB +8rmwVeHli+VjF1WAfwIy9yCQTDjqE2+iHTbvubq2J0GJHnD8sd4w75R1+nef +9ZtC8b+pYQzzp6EdPz7A37NSxNvbX7iYJccA49zqpfy30Kz18t8X3tbV+ce1 +EuRXRwadnx9TxH8kgzS9MTueSRNcCEEHYuYpWaI+iB5+vsrVNcKlPWFJM7O6 +YtHCiX89x52IjTT9knd8imD1/HwMKlXS5R1MdDpuQxI65ZOG/gYf0fGFY29K +iAWUquFxgQ/ydWxXBueSDyV7y33N6T5tTGMqCr1mYvXleaZIUv7tx72i+ZWw +uWVUm+JZivv29dBG3J1Szy4Xb/g8CCF/6dNYNNJAE0WRUDfhG93FjL1ZrvvD +JKJqOjcGdDq7JMvx3b/aZJo0Elqg5azSV36shvD3TfdwEDbFBr0XExPylHG6 +hwZdTckSEK1xPb5qqawOrliiVgc3lPQ1WrlD40H8DfDYY0K583PMO+YL+04O +FavCyM2BOy1lNBx9ZtdnoJLm+pzSFRnaTuWnOui4Kjfnlp5zVYN1uZSLt0eC +fPXYSq0JjjriysVYEwJISpfsq54T1RLX3G/5+n82pp0XSC8kgI1QgLJYrRQL +gBUNb6/EnUtGNG/JJTLb82bjdZFcRlpJuYFOxyrsMQJaMTMqwSBFLZClsGnm +A1UPk24vxwyykzs5sDumI4qaXFhdoNWa35HkWz27Ka7xB+qOS78pkpOI5BO8 +cyCEs7nb4VqlYwqXXW8LxDhK/Y5mRgTi1pw1vNcB9azwg8/oku43+Zq/Ryf+ +z4oWlR/XRzm11ftzpbLTba0sJHxZrDiJy9cichHIZqqXPIGbx00NKQ+Vxu+u +xlD55lqj8/Vsy5KsxKQvhJun96DlFpmE/JDR1CsXkJHyLpJiBRajZ9ItMmt8 +c6os2OqBnnsFo79d/vxypfi+Dg4fcpeR/zaINmhEIt4eo2kqK5QkPt7U3hqd +63vIkhIMb5YNdo10iXPQmUaCDzv9UbKgxTH7eM5PSEQCucdgBdJwBADwBhUG +EC/RTrspRE3MVLqXd5eaqogL+F3JsIEIYcOLKEEgsE5JQCaIKINNjE2aBdB5 +dPdub7ZD1Jp1S8PugfIdWJ9IafsBkuwzkEzfWuKciklMpABANoMA3MbiALFT +KDqIZsTpPdqr4/m/9cXv30e533/P3fudt8vr9u89+3dNjd4DjuesFoRiBGSJ +NjjQyEiSGwb62sMhISVKqVVFJGEkqf7Nq70HyapBbb6luOWmCojJrsrD+vHc +ozV4qe010DTlrORElm3AlXP96rvE99yHXF32iHWkqouZuUN3xokwlF9m3T8X +m5mdZ0OtvpQnNpq/V+uGI79nNGttrHu0AU1xjItVQiV+gt/q0x/Ts7QuKzQA +C35H0PzfURZq4eEGjq5PU8e/TVi0kBsBM+Q7L6WOibIjTh/ABI+COb9TN3lv +20T91izdam0kSQ+P9763Wab/O2cV2nFeh3DLyyQiRJCMAZISQJ0EakWQkCQ2 +HoG1gxIJIKKCKSZMAWJJSZcvrlM8szESpmvAUgZmYd3/VfnNThPSt8iolCAj +EqqllairLABrbjiWeTjHCN9evpOcdyHHmQfQOZnnru+HIWDueBreuCnIbkMf +f37ysQE3/3WVTqJ/Td67v3dJIDvG3vKfplmUQnguITvQntwLuxd2L7NhePpX +N4BzlC3UAqE0R3yBLyQ8gZmZEyBM1A+AdX37MRERkUbnKSI11nQSUWRCSJ0S +SSvYUJA1JqoIJhnyCRToOJTpIkQ4ggOwcgQQIgxUxBMQ71WXhBRGVKGyhUAz +iZAJY0JoGqmQCWiCf5te//N/lfVePkfnf9939P03ofrfxebgOXjXT/+uA0rd +munpmKrMCEJefjGxqNVCFGqtqrdFG6Y8Ay8MWk6Fb81tz5L8TT5Du/vP+O/c +M7yhu2OQ4EDdwO/uEgSR4csOCqiRDILjcN0EmIJJJQgjm2fdcp7Df/XV7sTx +KE8yzIRx7nFuiYEsgSENzjcRAgESGkSIbw+JbfAcuCCMuUwu5G/SQzONiA4O +AGZgONwwGMQwS2udZ49m/6Dx2P/2m7fhKcaJDYAh1xMAkAQhAYSC25+g9+kM +BGpNMHZnd28JDMNZwTIhmI8MgwWiZiQMUYdm44smFPT9hWNvDGzfUj8c3II1 +nV0LRLipKMAtmSVkEg7RJGSAOiRo4YCNNCZhmuN0AQzDCt2YEXQoT0E0GaJi +uGlMKqqgMMqZOa/C4ukhp1/vJri21wO3zFAcYagKFj/phwCooXiyBn52dklw +ts/A6O5aMVK34ZLm4wzCnMz2FcdsAKFkR0i8Bofmy7/Un6zs+T6Hv3dNOKRx +7VzQn1YCd/ZPJPL0DjWBIkjQUBHGObVwBRHPscc+5GqGm3Q7Sra6ssJmXsX3 +Gkazvzy8XFz7d+4rfv45t+3AZA+q7Di4pFFwk7PxwIDDUDJ2cBtXG4W5bLWu +zOvKhQPvJGnNs5tv1fU0F8OVv1b2tVLiB4iOykQN8OQS3KOQMgCCAIAs78Rp +jio514thrts9TnB7j+99ltHMQeTRbdwccnUHGNz540s7dCOIgTOlbF+iuHcp +Hx0/4+r8D8f1/Ify/b7R4lFh0KCgkeJQgLCQrL9OyQlWam1zDcubm1cXew10 +a8K8sQxx9GVT7L3Wotc5iRJyRQyAxJQ5uLQ5CqZqvJw5RAid4dRUrihLVOcZ +yfX2rnQJtnJikl1Cz7tnO/QlZ/XO20T6TJSAbuCABCposhncn2x5f4811Qhe +jxpG6lxOFOr+xf4Ro5HY36C22JmcP2/yo0b0G91J08a1Uh1m7iQxE9DpoKmi +Rii11UP909xYgCAABATHBoBmQlD46jwYAJFkXYOjQ8Q7L0PmPodk9v7P2WPA +7fR7Ct235X+WuG6u1GZ/H+Bu5X5m0db/D6jpv579TuX6f8P6eNhKANem0ajC +QGjA4SCSYGEQMqDyf0rMiR1h++zC53/r8hUJNoN+8l/rWZfgj1VeeqCm3GDG ++ly1rGcTOuXZZkpVYdqQ+0LD7wGbB7fwebiqmWxfODyyhpMYKmHOrUqqgv8i +TSr9iaGM7MScKR/7zZ7VzabENHJtiRIHfAYlxhnPZENtg7s0rqorwGjxKm5B +ZXUTC7ZY8hbkwh6/dXt/IpufQnWrb0mzxrHMnUowqihR8KxEuZBvifKuM+yH +5vjA797+krOoxkSr/mbeIbACrFNhLxBcinxOVUvtdUlbfqEUetLFHk3d67fG +REFlYxakkggCq2YTyVvBXIkRJKfVlQz0jW5vxuqYfS1IFkjvE1GuqH7eiquL +sKcLOIj0TEosFM88Xjkhs0gD7gs32bLM4xzkW1ctbgkssnsNlHnwmVLRqzGB +B7312LhmJSIoYxGexTHhT/DKHmuU4H/zGvBzUQ/4A+Pnbdu+vGUejAkFqGgg +HwGiA+aW7y3hz2wf4deesgkjQIPtWUuiwPgYSwDNgiRKzOVQrZuPyGUV/hGo +VLDVluED1qbXXHVoOj99G9Evj7sXuxdl5xkX1MYhfsPzXQ5NI0Fxn+YXFSBy +86ohg71emjlg5pOdNh3KFCJVrMrLOo9+q/h/g7WrEsDNK6O+bls5EhRMC4jr +j4JB0dJSSXB6xOSxE4vryt/fsYOkwdN5uoXcl6hI4T6sSzzk/lBAkyORao2/ +UVp7mdnMI1QFOkfmupU2LK0nefR7l9MJUlvC1kbyDF9Tqqu/fGKbSpFGLky8 +CZ120ib6sqoFNcNBV7Kec1GHTWryVcPu4a+/B4mmqxa3iRWVEBWILBeMWd0Z +TC3URmthZfuOiwwNznhvRr/vBcVubaHBXHEtxjgwzfd4otBjR9Iu3/0dkPQr +XbmPWhtHZ+2w5P7KaVPuFuXKDDVhXrt0PNr6QeETvx6mzcUoVxhYoONJqjgr +dj4mDFQzqpYTrqLS4gBmWAD2LoqvXkgzKUTKB7DWawSMRRYJ62MmbYOGtqUb +tZozlzx5MBHN5/jevRFnDxg3R4pKEN6c6f2fSlZMhC5GV7XK3sPi5ft6bEJp +ixN67rjDR83rHRzLeJ4c2eyQu+7aaG/afuirnjc9w3uPJ9v+HmvN9Jv3rtJ1 ++69JznFeMykfCxOZ4ihLooHoJuEdZEwwS6FoXwSqlCnrfTY9v0WLfvVdJ8zi +fUeH935Ltvx9Z5ndOm8N8Xx+w/g0nu/Ob+cRDiXknl3NiKA6jGD+XvqSFdSM +gHZxuhQc5wQyPEUsqaTmzc1WKfY66l6e35NR4Mn9bB9Hbu69lwe0+S/J1fLX ++Rw67M+v+T9P0vb9zyPuNjVHL8L4fw6pUHbpz0S0ZutVnW524tLryi+WIFVV +oFEmKmoergUYJRIQjJdHw0S0EjGMRhJFkSQyRR+lx/oOk0Pbf0yvZcLz/Pdb +gz86RzoKmOKmfNNHloLLUOAszOCAG5qeH9BU1XTrPjvd11ZyFrEDRF8bNEsR +IOuFVzVbJp7RU3YxlSLkDP9f+H7fe/Mf1/C/j/f/a4/Z89/28L2HsvO+lw1w +2AG+pWdcaY7LkzqhbNAGy4AAwWql85K7fdnP+IPQ4xjZ8eAHyQ50fdIaSjAJ +Iajdu/hI8I/XeU+HaCXt01xb28hPbs74LN2CTAQQTqC2RWjuDOFUT/eIZxcO +5u9HuacNrmXwDmcDMjWpcLMNq9zhw7WMTFmHEvgCWbDxL4gAkNRCLDTubu+i +zskvdVnOyiBCzjJfNVhYuhBQM7JlCZl5lQtZoQJKyEJIe0A7oWCxBE7EG1vU +mYfMrSkxqnrNzISQegQicWEGeAgS0kkOIBVhHGMuZEgkySQjmxJBdwWKG+Dj +g1UNksUSQxEXETIIFxJAMAvJLjO0DWJmdrCIjBFglhrL4OdBY1p8VoCQMy+S +aWBiRFrXDi2ywYnI01AQuABTM1GpBoBZm3pmD6keX8l/z7ryeGf9/8vy/L4v +yl/6/Y+MXkfnfZcN3V6fYEt8WqkdT29ijWGg6tDWEDW62Y9QvGPtcGTk6/tM +Dl48iSWfv8r7m2LI9Vmnhv66CBmsQNmKk0ZNMQzwhcZ95gx01lv33zO8csDG +F3Q8fHvxfNnA37+HtdOIAMzOGYgBgBxav1ekMgbdokQ4IDtqmEiQwWISVTxA +16Tj1wtDxEbYt8c7PydFjtsOh3O7fA4Ttdv2/QQDSRHQIhpyUQXTkbGfsOZd +qJpdDShq4CQw6fL+j8f8fE/WzMsUXXRzdFUgpI2Ig1JA1ZFHJukoBLXaO1XW +sJsGHRy0PNzPHN6x+Xby79vjtO4n9bynHyZ5NvEOMEutiEUylND7kk4DiqNQ +EMCw7kj5Dft4856mxw47Urm7XgzMG3ci/N8JmfO9js5DybiBuG7lAoQEObQk +hwzh2JLOAeTk45k8c9lWu3XvHW1x7T/Tp2N4I04yb2c3FjhvP5Xaf/3C9u7m +dwEN/NzmRPFdJBVt9C79wvTfyegZmDcu6dnYcPsu09t8F/X9j7vXQa8HDpBA +8xKI6Egkzjm6EAJ5OxzyXc6aP1teeh/v8t/z+r9X4f6//55n776Lh79GjrTQ +jGwg0ECD46DBhRaGAwsgJQAsPAWf+kizIV7W/mzM8rJNN81PpQqqAttTkw4n +2+juaqfEvhqm53FwTG+b3wGIqKMKXwtAZVl9p2HLchMeGquc+lt4Hg60z9lS +Z9O119WWkm/sl5KBiZPtxwbB8RoO4hbLCV+L3rOuCvrY3R5ezTYpImlE4LmZ +LYhtoRpQnd2occ55TeO0rEJrIgSovUn3p+8h8XqH43veMo+jybAtPDoo+Acn +NLODPU+ZF+53M0nuHDkFbi1fuRItE50+UNhPNcL9KuGoFWE5KWAe7XQwfVt1 +8omnTNPUpylbJ1EWQ6lBhpV7L4jH2P/HZp9t3z1dR37t88WPEes4fOMAzAar +Z8/3Dsfm5mNX37OPZz/bdy7l7Ppj6qMACdj0D5bIB44Mhg4J7x0c+Qg7kwvk +iw0LAOtwsbF9r4SZVLXsCB8BoACBAAAgQAAFiDAABAAAAHAQELr0k7rJb4WT ++dsgFQMDuHdxMzk1WQnT9tESgZJwEkg/nRVdodzopLlmvGk6twN6WbNY5UCB +AAgAJTUeX5WizcCQxLP3iHw2oicTwhTw7D1opJ52mZzvedlTDabyVxPt2rXd +bUFQdrOZOlQxSVokvmgi11iQQbts8BiZa2dODiRFZjkanQnS65N5X0SYIvhA +XNoKNO9r1pSqIuZGiHhRkFNlr1FeTF1/slHLSag1ZjdgELQ2/uyLGLpxmiXV +V+rABVY9lBJBo9tJ6J3LUSshoq0UThLIdcsklgAV98Zga5utpY92Q4RwbZiX +w6UiMlNd+yKVEFiKScRieaTRSf5zhFZbIFOB5u2kKWtNJ/OSKzAOzUntSldD +X0Eo9pih3XQ57g/6WblP4MGsYMkxa84xJrErM54lsxyMSFa4/WzdLixrz4YD +z8Du/MKmLVndz3Q1d/rhzVBJoa/Ev/lcKl3qvV5E5Pzer93KiRsFrSTvBZe/ +r4x5ZMooXXEHbcH27x7wgY84zcMDG4fRKjVxhVLtHI5Pxr+oZfr1W6aTTFr2 +dcU8x9zlhxy/BJ+N7rPWNhnDD4RSv6RYvfQrg6an4BEEMwAAWVc0p0Zk373L +sxNT4f/Ps94xnLI88oaEmLOFGBlJew8R51GVd5ELhSmJbkGrB/Sq4YaTmhFu +yt1v6UwMljkjjqClMjMKcdKWe75BRiIkfYd6G87bCCQ26RivrjWmNpSqH6Oh +BAtMLbDq4o2/E7ni6UG5DBEaosjC2kl0BGGXEv16gcOeBtZnmKZtE1Mypaq1 +hbajlfUeOKp7aaWzaGvPAXv6UVL+dDimMhV3jTJ+2PqjG5IERO5piZFnk3YD +nhW28LwBuE6/Yv7aScG05CNgzRXz2FkUUQ6dd7uGWK6m4sKNkpEIeVRco2OJ +Kqv/9aDc3jb02a6ZgeTEljvsJueH+H6ZRXPnwVRjsL+UViZB+WzkEKQx+oQj +2xKd+PikmsvY1VI6J1aG3N2lM0ZfMQ5AbIxsdYg5uGEzYDK2ZMkLNZUhbjC8 +rxriEzs4KKPja0+/Jvw+JSnp4yGKLw8Ny7LU7Y0C1lHYhdTV3uiYuqpRKstv +pTnxSZd4tgaN/oZj7+nb8ArH2K6kgkVMulTXjgh9zk9i28/Z8Zyd6Qccxn2S +Xn5AylnD8cK5jh5+TqFZeLN9QR7tQE6Hwmh2YTttmRRr4NlA31k2y7MZiy1A +j86oP7FiQTzyvhRe20k8QO67ukqZoOowrTShZ2HKeWqt46Czg840FzOWnsyX +2kkWEhwLgV7Kj4ZaHnEVNczkKc8n5CiHm7zGB5rnBQ916uhWoCbdBU+71vWd +Z1fPdV0m8+r7LluTc3fL69AX+Q5avRVzLPNd6Vi7yZkzlVi50ureKTBVc2Bn +GZ0GQ6O3l11Whn9tL9dQTPL9nXv6grjbid5EXfkBmynl9ivODU1BZfm8XOhi +NFr2vELa2iM/Od07T2v1vkPze5en/q8OG7/33tCiiPAD390/XQiEoj/GwvBE +oMEPBEoBsN4Kz4MOshFIEOEnkaAhhm5uosiZmYmgANYmg7u4gDQki81lhMRD +xksnoN3QswlpJCk1i5TVQUzLgQHCZSkjQgbMO1USNlJKGGAWYFBQ0gsRdxgH +Wyg1ghywFi7dnBYASCKBAy1xqhppEXMAQIeYhomYDWNNbas0tZlnmQrAxoSh +z/g+f+P9p75wZmDe7+37f3XxX5f+ndfrfAa3cvIaQdLDyGtNaaq+XkLk1IXF +jWlw4APtA7Brtf3mH7oUSkaRmCtCdIQ0DB80yxuet0iI2AMgDAA8QCYA4FBQ +4LBoYILYOTtjIk1ylbURhnGguTeRmOyEhwQ4gEdiHHfvLO/JzcP8ehm0zt6U +aSdrdrsaXYGQQHDupjpzwxHS6NgXTXFs9J7Kav9L/T7353v3yHVA4+NE8fHz +DkBEDmBQEyhY3DozmH5+bpmccmzw3qfLf6fobtCCD/lvA7Md53rjXLy1iDf6 +vR4igOj1v6bjeOYIdA3DcJ6hMgQIeq07Tp/v94qt2ENRAQA2CA5BAcEDZntj +YkDu95G3dzb/rM9j2Xbe5/e996f12723pPGbBw9Ouz6rYSB6o6oHGsMOmEBh +AEt0ggFgkjAIGK6pnq8faQ/V29HUwO+Hrf1ej9bHAjkA2ATAFxoaACgAYWDB +jYSGC5aOCIkWhYgLOZ5yr1vFRyqGqUmRy3RJQOvB6TkRkBAOkRIDCy0MJgoj +7MLqsMy2WMO9AoErVtEr384JZI+QQZgaC1TcO1k3/t+bkcv3eRGEfeWNV/TL +xNkYniUms5h9pW5Lvi1iSz44jm6nuxnj11JVHrOkL1bK40er8qvM6hS/Gxbp +SSn+HyllFtGZK3M2VjiOU5j5K2HN5pHdnWSGWZ7SXFbdcEGFeTDJsox+KQVO +D04VqnPjOGEjX1cU7hT3mJiDphl/IEUdxu31MB7AkY+yLY5JlA6ZR4MXgx2Q +CJYiziQAaqhQWFhYdpsU3z+j9z+++nDO/A+L9Rs87yf7/icOTj+srbv5d/j/ +oPzPS+A5tBzL2PmOw7DqcX02A4IBBQeFADAB5+vF936jvCILPYrNDc+vwGPQ +hELIKnlDWvM+pnGLD4MkwmsEqX9p79acW9tlo0vQqnWWVTeZ3QaG1/Y8ArHY +djZ2uVeCJHkR+6aFsr65nWr1QQ9ksHae7nt1s3YivbrjukmvtjdTP/fke7ns +GDzqcxY0WQNyken3r8lFYkwyP1aBMKCaczLJr5SMiCuYt7m+B5chi/CVJOjs +STA7P1P2E/ojgzAVK5mloCvS57oGYPyDvXsRDdk9e3FzSRqRzv8LmVVZseei +LOAVMt7+DmI+fok4DtMrCwITKlN/b9XTOzQKZEU6khK+1olqxzsjbmItrr01 +0Ymm3itRAq7vbmasRJ63tvLDsBNhZCG42aS9EOJr1CBc9u46yRdi/uzW7Ljp +oBoa6/AR7qCDxlHSA8eI7k0L1fAp6ScQ9JoC0bZeqi7DU2JwpdjA9ADR9y1H +PvwwpZ8V5boa5tr/5ywnjckXSjw1eYt4rWNCbvlCzbk7y1VgTeuKP1+zd75B +iFG1q9IvQYS1TE4O11L62JbFf+xrWO/NyWCKc2zlbO/DN0azHjnpe27CK3Wn +087PMZzJzepLXvNYXa1KRRreGTHBHIhpfHFpPzh5jK8ioAJrdjoPw4vvGmLb +7dwmDGkLKPi7BoRfb/YlRhXv4XFtboy3yznzKUMoSfgo4NlUri1sWHIEj2HC +/DTl20jif0Xjd7zWmc49CUc8z6ohgG1loj1IO3IGW8GiMmcdRJ/RlZBOwQBv +uzatO6MtIopcOhBgUUFdcv/iNhTa5DVZm+copOUv3g+3SGmjDvMzIY6v8dxv +InEuk42divqJJZLh2rqJgZYo2f0ZCGRDlXELEk9hKp/fhadcV2P5jvt3+P6/ +a7yON/23GSl9f2RX8zqO04OsKxPXLCGJcjJC2lWn5m2KCyaqT2MYcm419dwm +rkOQAa9aGKp5U12nDhiy71n9FtIER7qE3Z9XfpytWef962CTh2QQ2q8T6po/ +37VR3RtOLwzp29d4NBSPwoABAuEH9ZjDfJazi/cYjpR38uhxQD7l245zV0qB +7taLh36gq8Nj31DbAnTFrEHCtXUAlP4Mu9TdzMyXgqlDzIXcIdvtMG32X9Bo +MxyQRiVc53S9XHJAOXD4rOW4DosaTQhL12vrUQGTqODFspMdFPdBGMmqR5iJ +MBSBAAgAPwAECABAwQIABKmBJf8WJbc+qQhK32Xj8r7sQVkRQ7pGck8ZDNyI +m1MFA2/bU9EbsYWxkrb0MH2V16uZ9bshCxONmw8Td1H4wB3aGpGRuMKhcfny +3EIkawX8DtNQQAAIEC8YGDOm5MKcxM7X3H9DyIwDjlWMVJ3vitP5K5DS+S0X +md0918bxOpP08R5iyvXSYwL3FsGgAgQQY+JahKk9PSiH6ulHYVktoxIj9Vxe +KYoLOhgTmDQwACsAEGBAYAF5ZaRKgLC664Pu37xe0y+8suBkPr1IWuhzZAuu +vsNDUvoKMAWuLm6xIWKRbS0kkkkkkkkklsNUYS5WxATwkpIEIhLirA2GgZgJ +CDiSDYghQUNEtRRJZ8AiAQ7oeDdokS7uHEtetG4FMzIBW4CSAJAUhncBC3Ch +3cklgkwcCNKBegIeAasSwsl3uEDFswJAgp3Hy5/q+z/O9j8f2HgflvSf6+15 +wI55BQ6iGh0E/1o6domnmnl08NNJPUzVxvhhlTJmpkkly0EEgnrGC5JZiW0L +n5QuYJJJJIJIMGDBgwYYACBH4tJDkRyaOfjLEqAP1gT3m3g6C025YFjqf+nD +v8c+65ShHvpUpnMb4d2onrMc++jo3glaKweqWfzb4ASbB0T5Qpted78Y982t +Z6Yd1WUlH4xo+cQ6drqGehK54yNrocIvBlzMhax9MomaRYfGCxPgHqmSV7li +g1CAK3XUMHSAq/BJvn3DzaiKQoiYmRz8Ft0RLJnwqF7Mc5qITeHB0iRrFkWP +Ub99WWa7vHx63PEmZyL+KzrmKSlyFeUCFu9bHR/88D2v4eE9duYfZNi2n2uz +/cwCdt0ftNzuEQ8JFT33yviWXrOZoF9j8r5Nhy/Wc74W4Phx1+roBPc+HlIO +k7LdOw734XuPN4gTz/f9X3lwp9aCm/8hSgm/7DtdkHP/p+bn+DvR85/GhEfn +/f2un8eYwDwQIA6O5yHDAAAAVkYFSxwPLEHgATNMyLFuGgc0QFvaa+cGZmnJ +sJ3mTabG+1AAZQMFYKKGEgSbtOiYA8iUe/yh3k98hUQvNxCBv3pbozDcs1LE +7/r/m/Y8EaW6DHPMGFoRY6i491rB8gY4qdOpovCNm4iZx7sexjmiJ3d1V+ab +GTfV8hqQu9b5KxbtmR85x1g22zWm1EuUOy6jlfHwOSTzF1MsXcHisGX/LN5X +tXECbH6hIew8NVy371+asl6uGo1cybFM7AKynHXF97dM3K41E3LyaRnFpU1i +lIj150zHaLwTFzWbk6qIC/o7WUkU91aydqmUFpEPJi+XngS9PGcdw4YZxDqM +b5A08bQpbC6Qtrzs1Dj82d9ODssg4sCJCJH09SI9PLki6P2V/i0Qeu1I2Eoo +xJKuzx5fZcpTVj9aE5+26h5jDsx1r6mZ2fFAulrHutHeYcp+7BbS4RUB09QS +EWGNPIQjzeBku+/l6933RzIZ08stlE41q1njqkMDc27+Q93oZTe0T3CEdsaw +1w41TKxd/NX+qpg4Az8ulsNMMNLKrdWTmQ0OZFMb2g6IhhY0qHV7TR3tej7/ +Ph4bxa6EARH61PZzBUAWfMwMWoZRBlN9YbD7b933flKd5HATFBzsXlFIwwT7 +/Cb4NqCeUcuE59HP0a2WKnt0ZewNN8mQXQ19Yr5tkuHY+IaDr+Ij05pbpe8G +VlivVOCSDH9GiDWkrWFSS94WZ1TfoftroyYS0plpt1K+hO9ZYd/qpIbpvvp3 +H/aJHA8fhT+sgH6B0HdjfUga/EqOOHJuGYuvVrlyk8eOVYFQr0LWj2ctgzM0 +HnTkMMBLSGuUyilQivLIIhm1OvEWXljrxDcFJkoNOp25zPZKuI3Pn3Lg5WFm +WQLxKB9EdbShhbJh+CBAgQAAHThnriptfMhb7ASBY5ySNzoTcyPGuoHfXsXX +nvzzLQed+PiOT3CYJ5JhqHHIkNT6zOq3Tuum29o5Arl+SNI8SUedGbJG6L0d +h1GZY7N1fp4emPqtU3zK85Bn5+zTm8ltz3ODENNxEr+vsPB+AAgyIqdFAUQ4 +T0VAhysUZ7mBRrKohCIE7eUZFUEhETs/gdtq/k1te5fV4eveZAo8zp9DveS3 +TyXwpy/0v2+F3/5OPMB0sU1CKBESCkCJuv8UYPH3cNpAjrcdAoZvAUPGQATL +EDYAAIEAGgJdVLjUjkzhRSUp6SKb1YYMdDOzVLm1SR4zlnMmmLi7dpkoAIAE +mBLRFIGVOI74NHLI0AAgQFTz8jzG6T9ZuSjo5uH0RMYH/K9fQU3LYHrd4kY4 +TidLDDH9wv2IJsydAAAgAWRZh2ZmdJYghFG/nRQEAACABAl4EUA4+kVoiif8 +/D8qwBvmjoT9vuvhel7L0PJcZrOh62+a2X55s3wQh0ZXEDry4kwrCO4aeyPh +pgpAAAfl++mdqQvV8bhebGBr5zZCYxHTYsfl7shzdSsDXUJkQGBVGOeVuhw7 +ousi0ySNgSW52xi/UCHfD+fRoc7VXL52ZMRcqZ2bPhvBsOk3PIdzYHhObiHo +8vDzgEp8OMXxDPm6TMv+MiZydoUdtetadHDl3XWHlkObtyei/29D5jmu79b6 +3kUA+ft3mty6rnP6ea6zT/s4f+x/bdPrfo8UCHBxT4qoxABAt9AO+H0jvApi +IYSBATrLhS4YAGXRIwVBCYaQXNexBGrYktiwFkvygY7Zg8xpWuQr+spAxxde +xgF5d76hhf1NBlsOnVXkjrL3OUXFmoo945gQ+ftqrV33v0SrJxICGMQy8lrb +0ACjyl3jfi753eDCf7h5j0O+7Sgh2mxnncrF6jjvndJ3X4Nf8jyHjZVjf0BK +qKFrzBrWm0yi1784elm8Yw/cvezX0th4vRRhcb4By9vP1Qidu6qwaIMg35HX +nwCXhihmHEJURCexwsOXk1uKjMeRjXiOtlxSaGarjXrzbql8fR7CFwr0N4VZ +lgcaZGHBr3oluHVlzchywDL6fySESgjqVlhcHyg8FE7pOVbvBi/Lvg6ka29k +RgIE4/4GbSoQ10pDvyPz189FJZKmUwyKtW/lP8M2va+AkjqWTuBEQR2UjRhM +nwJu4OY7GCZ5lFtkUQH6I3r7AAFfNxMWqlBO6RSkankBbpCn+AcTuM5+RSLR +2ZZ360Ox7uRyGuBW/qJz+l/WC1pTdA7SPhwzR5aTvW+cW0pImKl4JEF/OBAw +WrbnoZ6cVB3TebP+kuOgtGFssQiK8xkbG+7ChLV3KSFlxGZMultBm/jvh+Rl +HLfzhKd/d3DniTJJPuHtsYmoklc9XAaCFMKz7F4/GzOIExy61mkQTMNpyozk +bh2bkokdvEF1Z6Rdlb1kc76wzKj6SurYD/uauVwtYDgL4bZuVaXD5XS74N6Q +ewRlA/Dt6+i/LVL7I78CdYGSh4V64ufiWHvPW7L9jl6/v2p4O3rTd70r6lpV +O9N0futoUBHhMkIapag01Q0ti6wzJavb+o422kqRL6kSDzo8LI+hBy9pFQec +DRWjrmTkwN4989hzDU/P8KAx5xSLdbiXDZ8TsNFoHcDqg0YSibqNDkSrGvez +ByGyPRcCe8TQY20QuCGf3Ej6oPScM6naFF4kYyrJeamLA9SRemlcO6VfeYbY +prNTs9axdXHyU60y083opUFO7xPMOiMNoROykiqmjUl+ZPzaVJPOAjG2Z6eJ +eJLhJez0CC2Mf7Y+zvUjMdKlOaz2g2da0yZ5hocHGpcUPoVS5A7nCzaepG5Y +DmJGvUUY+Nqax4x5Pc8q+tbRIHnJP9w5MgaYqeQVkZH1XHjhhQ4bIxVKrvLI +5V3PHyua9vdJiywtxi/xJfEAJMUjA2Jp1XN/dstp0LzD7J0fMDdir0fUrfJb +yTaChtcFBhRNJqy1boDMfDAhEjXLZg89c/0cBAgQALqBAgQAKYyN7+9al5wQ +AMEAi3DzlAS7ZF1mny/OY7zswzFA27HeCsv8ndM+WeXemieyxr9MWmoqNcwB +EbALaRKhvEBVwcdM+lLd7mlbI5TaLYUN2Imrw5bY9YDpFHvkP+vevI+e9p2/ +n/7v2/5PYez+x2/39770O0B8t7VdP4xJWOmm+lqh/qSRQ8gAKD/mY19R4f4t +L9L1QBBAIIBBAJJY6Z29z3/mcXdd3E0YWaaK2KXXF1qMkNB8gKOyXETP/Jez +tp0fm9ZxMsSrVp5016pRh1ClVFVD6WScJLAdnJVCMNlQQs1dUcRi81GbEpyi +ayHhHLiJq7i6zku+Ky8Zq5umjGcY0bpluA9r1gOjlXX61u3TIjrJgPDXbtoZ +Ude+xpnmOmcykVRZgJtXONsDJYwgCRQ0gbAG2DIytXUy9SCmcZNQkU1ZBTLY +jYQzaoBgsIySRkiECBCBCBCLl2vmXUmBaZ4h4ikXZjVOw/5sGaqYBwNnDdme +NakbiM8dcWOKm4nTskMCv3nGSGGkBcXFwG0gcY7IEDbDby0G4Qw3lCZkQyi1 +QlaPKGRmMvzjAJTG6N2dC6ZBkrGEGQSSED4uC1iTK17sTCEgSEkUigREgkVA +kgkRAdbSo0KvnwR1BAEx53gxRvBB0RlujAa9HlGxFi7A03BEKol4OlBvB0ED +P0WmLr8kNEaTUwysNNrWw5WcZLpU3UAGIKGkMQZRmNgNKiY3RihEIQAgwSAR +AHIcgzxTPyK1RWqsXpe4DXXaqa2sxwGAjhbiGQUUQhCEIYbygLAZAYUyAgOo +ISsmwBYooci8oLoJAw0jfJKBvRghfFsRKKhHEWEEdPWhmhkjRgQ7GGFjR2gk +Fx+vTNoQAJtg0JWCSkMpUcpBDEIjmoo5ZsJAQ1JBcBRcCDohR8qqgQUKILAR +E+KqgaMVD/YSBFAxMIBAqFXogNCKacBAIijcCnnhQChFLKCsRRwdYyRhFAhF +JFEkBJEASnCQZBJEIQiwCChAgQCP2ygaZBIwIoQhCBBCKQIrEiASIYhAdSLC +kREg4UAFoAWAK5ao0Agm/iojBRuRQIqxAQgKCbluup9plA8Lbie097p9z/V6 +at86PhvP8nuGu9Tm7R1syg9sJkZFcu4JVz66hRipnm0aWInyYvtEuBh0FF55 +GVvAL7YFqYIB7xLwLABA7xwwBgk5bJMfDE+M7isb99XkpI+3ve4cGKDQglMt +l+wGPuvpJrUZXpoPFGwIIZ8w/E94BuUXlS5+IbUrAb4UW5x7ptX7tO/i4376 +Fvens1xQzOpCkJhdIZQhcX36LXbMyNji+fY0I2BV+1D04jx5umjKKqw/2H8l +KGEqVP0oyCwJofUOUeBvhygAsWKkYCU3V3oVIbpR1sHh7r/mpwb103f/+9bq +eo3fZfq7/7v7HC87u/IdB8X9/Z/r/5w4KB5NJGHn65MfYIwpGiZZFoIESDIR +GQjAgQiwhCLCQgtqiBISMIxIRhCEkkFKBiMRhRFYSEVAjCBFCQZJAWMaVGSQ +GBAGJFZFQkkLVUhUEqWvZa0sVULquYpAgjIgSAQgQIwICRIikIIBIgSMEiyw +NEtKZVrCCFyMRIxiKkRuFHp4KNkFFPUbibH0f6sCoh+eIpnBkuPJlwiA+Y2+ +7x3o9NgVVPaBiBpCBCQjIQjIQhIwgySISQgEiyLJJEIgwhIyJMCoEIqQBipR +B773vP8BgFUvcAKlCqa3TfBsBeqMISSJBgJAgQhCEFgsCBAgEIQWCwjCRIkC +BBgBESCjBCKp5LF6/xe9/19fz/Y6LN83znP2VHNERetCohJISSEgSEIpJEVk +IARUdXrrhsKMRU3H6H9Z4v7f7966H0+55JkiMIDAYMVH3fU0oDZUbvX7j13f +/U7z3+ZzGs8f6f5uaH1oousIBBggZ6qB7UoBBskbQQQpIAyCjCLZQH/d3N+E +6P2f1bxR3/43Obpyfk+C/17TeQRyFR0DxCqBBVA8oiIrziqBcAilKCsBVUoV +QIBSoDFRAsqPB4BVA2MVEbCIoYABfq6csQH0OA/V9LrNZw3+uy2a7z8cwWjU +g9elawAD5VbxNyNGRTOXdFQaj0rjLcI2bidYgYBpVger4j2ZVdBZMSPdF3rR +H+UrNUurDDXpIXNvvd5foelGBIUalFI+VzffSx3UmLLj9REjhy2+mcStwc7y +YKUGyXRifYrri5NADMcvNZK4c5EhCxt5cWYZC9XF6fAeByYOD1rih4hFwL1k +/ReRw5lCE6xo8BbE2KcFWujFdBY8GJAurfxCNocp51EgrHhJkcVEM9lmOgTK +ntlG7Ru2J9WjYQ4zlm9GbzeDpBfmPeC4mXwJJj7tNfIBzN9+CXU73Ze5UQjt +ewbRK5EgECapTMqe9ToVLgmLoR6IttF2fkAuGvun2YNsEk+vw5yIf/NbbH75 +KYa/F1Wp21rjaFCA9aeiH6u3Y7AZpxWxwUOs+MqnXwrZAdkrE9j6Y/FSWau3 +isqnZln1pDauDqO0f2pVUmE2j7TYHDcS6UwPIkNdfvGxVYOUfX4R7RkWB5S/ +xzRTu5l01tTyW+1LJPnqzMpeRpTD0lv0sKRrjlSalJowyrEKnglbfy+sVORB +/FvqXZJJ6Lkyqny0d7c4/7/Qm1uVkG6JXp9BI8p/2+O+L1uOaWLLs8ANqRI7 +FVHf5hsTZ0T7D3Sd1cz1V1JZoqmd2SyJs9I45D5VgR4r129pjA1rxlXw2QfS +ePc33QmO7OnF8KMi6L4SyHgEutnYn64yThlvnmPQsZEu62aixgsOAui+eBiv +9gjlDYPdMx1oe1Kry2lxfOy0hIosjPzrI5PbBCXB2+QgXdSmvIto2tMklMf1 +MwV93msCu1VjVjuKenpmzRCQXrIaE8lTNJob6EE597P/X36EpuL+DkeJ+jNG +OxPGYuLC1ucadSM101k2Ge95sKqMi/1irYmp/gbm3ZlMFNqzcficXQiZmMVs +rXqZqQqcnoN0mGEff/EeKQN/Ya0pJ8Z61K/D2TuiwyAVv4gxgxq5pvzALxZS +10GyOCUk3BJTsoy4U5S4Jm9stRShUJQh9H3P2Xmh8V+GgkgkgkEikh/9+Hgd +h2Pfvhar3vzHnffvwPs/KRv873jg72tYsWLFixYsZSCinbIqfJUB+Z7IVQPS +KiEBGKoEVQO4FHWJzSqBAAGygDwwilCCMAUggCdMqOQoDwmEUf7RUQylYKMQ +MCohFQQkRXdyxQ0UUqFQqBjYNQC2EUYKN4oAtkG8C19lILFogwgwiEIQgwgw +upQosUgDIVCVQBRRQK1VIFwwsWKARpkgFhSwUIWKKSiigWwRWxYpBsSxYoJB +KiJIoEIyFkbDQhYgyrgEUQsOMUYtxcUIo3iwsWKQWwEQsWKaKLBCyBYikKKK +KUUUuRRsg2LBQlFyU1amqpKKKWiilaKKCiigohRAaIgEICQiIQgjIowiBCIE +IgQiJCAtBZYQCEUkWEWEWEWEAhSgB4xUYlKjhVGsCqKxAPMbjsWXt3heA4rT +dBm/gwdX8Rrq4UCptgSvs3uVoqvId7eJ27eSEABLkUs+BbH+spLM3xdzTUxh +v2W3NdVEOuK5vPzHKf23fyXxt64by+E4X236NJw4H5eu0Wt5zQ4DFyPzuJFH +gFUCKjFRhu39h+nZVAuQXpOM6L5nYfZ97hMzDrBEcziN237fvOY++NpWSFTz +t8VZQoHwQIECAAAKtqdb/rGh4brK9K01xloMxtQQLLkIlkT/Ch1uf5s7n7r2 +X2fkfD+X7LF+vOPM8HRVUVVFUVU02x/C9N6/gB7Qihg2M0X3ibzYxQAtM2R0 +TxktBi/KO4JKZFEN0WqS0OOGIkN0yWZAFVXcjj5m2al8QZv3sUnOq0ZjHs8f ++Iu5SVJh8g3i+jf/C2XWGb0nSPbumNgB2vy0Msql9H19tx7+2343vjKv1SmD +Opnc9byuetvbKTCBCVoa99B25w3L4wZEGP14shdnE7qP6ZUlvrpkfJ/kEcGZ +dI1g5qoCv7dp8F0GojC6zFa9UNIS4hJWlrSF+1BmKS4Fl9ixU9/yzMBz3axG +6R2fj91Kd9OxFqPEEirHiMxTCBwIAECAAAAyg7NkvEoP9g+Dku3mtz6T6FER +6oHLDng36yIJTGHTpFu/c7ejAgQIAEpW2fb2+62CK9kC5ahK3YmFObu2WEfJ +Msb3sznW4aeIKIWUiHshwIAECAAAAccJpYgoEACAAAABaFugDqrfoFIvJ3Ov +C2ggsTrC3I68ySSAziRRluAhpeY3uLLNrUfrk50ov4+cy7EdJtmgau0pOWbK +jhv8kmvlRdiDkqBy2WJoKKAlQvVfJ3PKwSZClSItQgDKWxSEkz2FbvnsSE71 +80jU6xowAQBAAWYNMB74cFRy8DCuYsyF6xQoLt30MP6Otve8m9r8YHbrQNwN +CURpr3oa0Jr/h0DpidY+wDb9JTz60ERjhbpvUsCdMLkXjTu9PeJ6EoSXIuqG +j9wt2tmjlt56mqoWAJrVb2jv2qVX3NyNgW7vl7KGjcvaosZE/t9fVhfyCTCu +9TbtNVw9e6qSGCuToWtqMTiRU8GAQmJhrMk6gB2WHeqJwyvhAq/Ea1qJ+dXH +yByMFYhjtoUhaML9IZGzn5wmcTQTb2Qkq/a/JrjndEtRFOpfQs/3iFxINlM5 +aYaZQH8qhJcdLqqjjyDfm3oJYgPDFoXaBQzGRS4EXt3DG/vPHAjeaqRn897D +A5m8Bhz6sBhJxUe8H6tnleNzCSuZZfC+FzMp7Se2rftVPKwFz0uLzCMPgbhD +VNnnowFN4wiIVaQ3R+l3nYx/JxyTJ3AZEWSYhsupaF7imFOKK6WO9t/Ksxku +L+JnBqX7jZO/mwJ5GERLCvrI8biXjZjCtf/Vta8fGRndUZLoFmjPz2Ts/ySR +JvPDlzdNT32d0t4UanxtRiesw2XO6qXbLCmCm85H130+New20NI1WArZqPxV +6p6N213jv8XoK36s1R9GyCymmcvToSScirUpxPPP3jBNG+u4Wde0D4RwxXRw +18L6TLRt4rnqubnRxz1orkY4sS1XLFdwkSVUWIbBPuyCrNwnE2Qaa2vsbDVF +Ox79Ghz5/CtFdAT5SMiiID/nn8NQIv1cwQF8KeIoAmOs90W2dIZsLEPevLQY +bmvH69U9088nO3y0XpNk0ZuwoDBn0XEsAECABYIIECA2wQIEACnQFEpFIiNA +pApEV8xZ0aqBZVAuVQIqgdvAJAhCCEBIhAIiQQpVAiqBSqBQqIwBSkUYwYSM +AAjCCkIBCDFIBBFKEUgIiRUAWCoEEESlUD4qqBZdomCE0io+6FHEKOFUbCjF +Ab1VQsfHkkiEgrIsgkgkgSDIMgyJIMjIhIkjCYFRuQUUw3go2FHJAT1Co4EE +MCKNgClRvUBoA+aJlFyqBhVQMCo4BRQyoEhFRsg4UIIhCCJAIoLggANAQSgo +aQyIWILSsFGAFhIKUlKWoMACnhN15Dm+g+Xqep9n6333jui1+FD6xp+OA0gD +B+PZXRH090HuQd9EVoT/NTILGJo2KkpZIWMfuAywOGJNu4lxOZ9JJC/iOTH2 +0e8p964dLH49kLzxZbxy0gXmh2eH1CZTeSLxd9dEEfQQJutyjBojMOitVBpd +dw9QV+j0Gj5oeNQ9/CABE5YJAhYLoAjCCjZsIowA/b/29QG/BQDeisAsQohS +xopgpRYgQCKQsAAUA2KaBkQLWBCrJs/zfp9H1W49luPSfd8Dg+h5Heeg5v8g +RPp3ew/R4z6+nARPm9B0+i6j8vc+T89znddNsSoOWmxgpTARSOyAK5fme4+5 +1Wy+g+7wmSKAez8JxX0PS7HnuERSJ9Ddtq+T3H9fkabhcY6hBTeggMCgA1UF +haSJDqfK8L73+t3wu77XX5BkgL+qhoBQgwkBcoGKRJGQpiRoUaKT6XW6vlfm +/F8v/PnOC8Z1N31fsVunovagn+/V9z+v7XPbaA/k+Z8z9NyHpMnq/R6S8T+P +cdvZE6zs+L0m8Xg+M3zcrAnt/W+Xspm/VpHjvM+I6u4Dreh9j6fqup9Xtn9P +ze49b8r3X/u/8nuH9982/1Ao6UUEioh14o0oDwi8HlAJoxVKU4y8oUIhJFag +hQRCBRQQfBkIIJeqA3Io4EDBAEZAQy1ujJJIr2DAhIMhJGRkJAkISMkIxIQI +QJJESKDEkISQhFJCQjAkZEkWRZEkWRkUkkkBpQYRBBHkADfvn40RyYKjGEki +AmRk1VUBaBa1K4hRsKOyiqWMao4EFDJBFMkRHEiDhQYKQQgxQ98imUI4wVS5 +FDERRMhAMQowFTMVGKA4AUvVG4AQxKjFRuBFLAikRQCIoBBBYArFQSAC+s99 +564c7cth/t7q/fKoPM+4124+G8Pwmq/19Q2zmeZ0uqze9nb734XVi62DCBIo +ETiYIUDrOc6i5A2JPBf+33/vXb5uHx/c5Ap3kF3CO4IBMsM8KAPy+c9r8LsL +wxCjwP0M/zf+f97HvBmgGPfCZPpIDstlb2IHc+BcKN6o9X7f6/JX/1123Yke +49HwVgNcMIEzgrgvDbL+X1mDgd6+X2/xOA/ZmHXb99zYrlBNn/Tt6OxKDdt1 +Wsrt+gGnDefC8x5/6fd+M20EclIQON1u885qtv5/x/C7Fp+eygNIBAkAzBQ2 +LffkfxL0TAENSKa+lpQYIGACABgABIABICBMtw/QUzZti+IAeUFZnujvCOcN +ARRFFE+Aa+DZFqIipbWc1d3+f8nRef7j4fCgu268BJSDX6PQ893vH9zynPcr +jD01uG5y54gHMaBiwUd1m8WFatchRClQLAWAoYMUIMGDBgwYsFjuEDzcCQE5 +HfP6fkvvMc6KSSY7qPW/N/Hy/vv6fCFPdem9XkGUZhl2VPr7DW/8J+C2F1AI +UJijNt5CrScZ8ThvV33xmPoqeox+H8t3l5RPDBmgZFqBiFRZBHSClUIyBIyK +Tj9Hyn6fB/E/L2/HZQAZOjVHKpMuqkJBZOg+1fxFzgwuG0IWk/bvOETAlyC4 +MCFzE4KaQBgWBCF3yOL9V7a/BAQwRXCaguSOSJxmb4zkOlxngZNMi5DDXeS2 +f8Hw/n8X+R9Lu/j7b0d2OUAFEkeEJJJJ7j/p5f72wzXYblDFm2BlpIySKiti +qqqqipAJEJAZAJAJAJAJELoBcrE837/61woFyGuDcMZcCXdD7z6HE+S+HgUw +s2PjObuLghCN+58Hn+6/vnLi99+yzpgAQAAICHNQgEAAAAAhk6bhi8jw1xaP +OImY/HIYQOFmcY5t1KuAfW0yVD4g7e8fWrusP4A6D885Wo08iTfifP1ZRTCI +LriOfqd8j+YFzI1TbSbL7GdnKiNuM7yc2+hkitERzIkg+GWuaotpfh/zOUka +skpgd489oriWfQha36PfZ2+YBLL2Niqu0Oh6fdv96ULrT25hz1DDjKx/ECpZ +na8AnvO9lJlqEmBbrmNs7cwQ/tbDjl+FJL0Tnyv3/U0iCwTegQehYeua0+qw +CngYAAGcDezE9w0X3GGg9591yyBEiAA42Y+KkFuuf95mfY73s6vcYV4g/rMG +9BkGFOtf4SmiCi7/tWQmQV5WJD835j/5poK0eZRrF4nkLUHipluIWo6uUX9Q +7drBn2/oQyvm7+Eov9vjvHIjpZBU3+7Xnr2LnpTNHScyCtEiJQ51Z1qasZpr +t1d/gqJxBQUQ+PX6pGVkSSvjr5TwK458XrG0sQl8nRqQjIY8NGK9Q7ezJknA +uFLsViiB6hrf9l/E2fOsL4W0OZh31EYOHwyupChwpfFQ8tulNVzM2iWglREy +V9+AdzUtYVoHCwmjZmMl5dNt86X7uE3oxp8aU/gQuiToaxVjPs2b5CKl1Iq3 +3QcGXcaKuAKjnPXaKfR0JrnER/Iina5uEBteLFqmzpHZ6W3KZ+hH/KIcR9Xs +ZQHNZS/G4vQ5QWiuyx2uPC7jnHnY7+tigkJ3lC43COyuDbJUHhpetAEbIsOZ +H8I4xK4TiKUiHP14BCwqmpdnTg+Ci+AxRddflIi+b+FkiGVv9tZ2KHxQvi2P +k3Lq2O7xZ+ZxY6goJuYcu3jYn0Iz7BQLN2kqHlzJGcwgTn9LEV7G1umuAeGV +X9Bn+r8YxzRmUnxOVP6CgAIHjRTOQ/TPHMKkx+spajasGvPPfUClN88ZY/eW +w6QSLWbsJMXW6an4XIUkzcKw6qmtxD5u8AtT/nYDX4ae9gunaXV3+i7o1yad +ogu9SX7P1PEfcSOdOTdx6ZLM9H5HNmApvrYf65zZFYDeVY1tsB40VHNZZhDY +ncCsvTK6is1Kr+mV0mx5bwU4b38B4MLqr9S2Z7rZy8tv+mrbrydSysmMSBRQ +aGX+ZV8mYbNGYUrgsBBEwkUnue6QlFMYg7NS27w262aBCs5qUkrTPioAxDMX +eCqrwzM1g2I4MwvfZh/s/ABApB/5A4dW89PEiSnOmTfqa7N01wZjRB5K5UTa +uRfsbAPA8sNm0W7L5mCn6YnVadWhHTmlytX2xUoyadbP6nn8EDbyKS0sNYL4 +oxwkEDcEABBngAKmBEwAeAAFgAABQAWn3yyu/XtCWG5A3z3GNE9vFXsYqdbo +Hyf2e4+T65sTdzRZaex7SPe/8n/uP6PqUgQkgrs8x4dDgwnsbOmpEaX6JGdA +z02CeLKr2li35dY+FDfzacbQSXz6SwhmkuxSIOxe1dRsyGXS2YF2gh7V8U4z +YpPDnp1gAAmlqB0jiMlchb5mapMGqFuP9g+jlKgQq18MymPAgZ+Zp8wkx0l2 +DSeVEQ0DA7sx0YmuZQb+WFIS2alnUw2CJSdjI6QukzSbpMkf6ZwBe33xPQ4b +BOd2OyZKEJRbFVKhtJgbq2ffN2KdXAz5DPy5W7Rd9XlBFOxhbsdARqiM0faT +n0jPUb6Efkfj5Gze7sEPr2U9TYb3GIgQcbftDBqgRDU0ye4zHU37JFdRQDJz +eFRQ3jwGhgAgRuG91SzkOzITErojkKjwbyoyxbJNigK29tN74iSpzwIWTivU +ZNkkKPTLygg9ZrZlfdVHnnmxtdFVBPkUKspC8EvlREGxy9krjmgT7Ogy9ywa +cn8MgBeU8XyFgfql+0KrU24mH6CCIGlbDfcPRGyZbiY9Ule/TWgZT8G1iRaR +W4yUp1GHiEb956pS77LToFcJiOf4/w0ojj69M1QgzkO5MmgTFmfegQLPJHOF +r0P5U5GUG2/6oc69rFnsrxRGlRYAwfbCvFAxFcgzB5H1+myxqF0nihglQKpm +bOibE0la4cHg6T+y6JCSo1oWKI5H1CBb5oPdlZZjU0+jDkTod1XibOecEQ9s +6208TcWTUku4ChbZuHsXa/uJybPHsaeOaeWfDDe5kGNLudO3AgMiCQ+uCZEu +vXT/lsNeYbpSkGnYUgEFprCrSMPzHa7ZWI7Rmt3VevXzz4vKmQECBAnW/qQ6 ++F8fW7W1qE3FPms5tJXZVLe5J0GV0b7etwBvE75ZcnP8z8vLDKJhEMJRPbQ0 +22UG5uQRQkSvwjM13SwzkzmNw97aseWWveFSbvbBLkylQ1ab9NYtbtW1lasu +wtb+KUOxmqG4qcu6t/wWD6rhzm0oW8HIriyn+aACwVWDFfCrEyMEMd4RbFLA +8Ao72T33bo7HYECBAdb+FvDtXDeqzQha3lRqoSh3C2P0j+Hf38iLFQzA9xVM +kCQg70+yuIH+LhwGistIM9gXkdiKIaO9Lg1lXk1ZKZZZ9uyrpfmbO/P65zt1 +qSsjmivX79lhvajHuzzaZNAKcoak1TLJleiZcoFuTdFnqvMpIQv+rw8axfJC +BqpzCyfzTr4n0j1qXVQG9G3nXD0d6o+PjHNgOhWH4FO7EsTSFxocKvbixXW4 +Rm0cFxtcfhMEy3oAtyZWnDQytidR1TzRGfmoTRbYCOd0q/d5nQ7MK1BAAI9o +Lo/6iyTyhroEBbNYR3BOsHgRvOUktMSeXLRfkWQXcvHAS9ExdEgeYIhlVVmu +VDajqfY81HzugGBq/fswDKBapbnPhFk8ibx5AlLvoHppJ2la8LjPDf0XkAoB +LvK7VYuNk/ASMbZOAyVW7xK0aYEs9HkEDvFwGaDJW9PkL4tg3nnSsqcJZmBF +9uSEXDDGvVgwFVGmX0taiz2dC21V5yo7zCH5LajLy05vkhvhTR+XYyf9pKUs +ToIJnK0R3Jk5ZokqWu3D5/c5ATMSDAd/MxAAIMXdlyKMHCUTGAbFb7hWYmdm +xGt4W0pzd40QFZae5w2fyx7XVQugOnZ8bHR5Pzd4L85FkrjaZ1ji+hJ0A6ZT +8JJqf8nYAfyOvboAgAQAAwUvIfk+HURKfT+xdYpHDFpl8Qu/SHJOYCC+C+8j +FxgDHbPYwdela/J1BYc/NiFmxRKZxS2FjVMsG/f/KTdZ1b3pCFy5+ODH1cMJ +qK0YpWTC37UE/PyjxeksK1H8P4YfOwelo4QgVc7Lj0tNxMpYplM44QHDkY/8 +v72MsUlkkA0a2sDgnHBvzNumqRM2udbvRHkSnyQZH/9S2yzst+I5m2qbcw/W +pv4c8ThGMS6SWLkNu9Jcvz2GUOI3eqI8khd/9Hsh5jPdB34qqTCAn9jfNmmi +RNChgjC2oan4Tzflqo54criIiv6UyTGo5+3T3EKincTISfZh7eUYfpi/MK4h +EwYL8+1WLm+HZ0oZJqHGHH1QNN7Pvl+rbQ/op1jN/qMqlAbey1HjwKPmCa88 +vZaiVoywtlpeL2cVnB+2sqThCMLyBNvuIuahf7Ma+KHCiDc/iSfdsJpCvKbE +XZit3ZMumXHKZhUcMlG6ALutgjFJ72kSvZcofSTOb5wwmU115vFe7eCLyyc+ +12bugvyJjt9qP6PfNTwlpgAbsnvB3EaU2qYsjKs1K2sRPy/3EEdvit/4+yxG +DAGGLxIUh209u6TSLMY+3DSuLSntJQyaiW4DnIIyH6L5o9dt/cjr7DTvYUmq +Mgfs1DJrAAAJX6qJG98OIhih+NtnltPXQcv7zVqcTP8eZVGDurcpraGMgM4m +97uDkCYdlxW/UpLJGA0HfgcUlKYML07a+ksuP+M+YQYZok0rclrPv+omZv3I +k7GLBARfcJSrgdXsr96OmX3G2pCJlHgtYYL0cmtrtHuwuruW5H0RHSsIuSxm +fszIbq8bJNcIJRi7bWgFsWgcOBCi5CQBvE4Q/6bnqEcbfFr0zIQ56EeZglD7 +WRzqzfPw+4TuB0vk6pZy7ypgzpJcwa4cWBgE3gSRZwlkhlQ5uni2T+NCJ3E+ +27rTJIIcnJre5MywbKm6rpnDes9IS3AG0HwyQFka9r8XJM5+K9/8ZuyX0zoo +Wl5rOGJRuFayEXU+6LyYQTGbEVFh9snA4tiKfw2jkBXf+VyhpMp+XCqe5Njd +fABIKVOhWWwESEQj+mcxWSFrrSvphXJqEAACvtgJ2UlrE0ZhNw4URjZSdoZN +nAtqSSu2Wa2Dodw0JzWB1KsQIBBCCBWi/INEqBx9DczZkTwzJ7b3MglXMg/s +g14gVfk7J7Q2Ps1todOQwxMJ5/sr++f01n7gAvDGhGAn6t1AMAAX1Y16lFgj +8+J3+qgvgqNcQYTNPvRqevcf0kjVXpGHUvnth1IONfFJu0ZOuuZDWHs5Mvoc +5To1hv2jPhAmITvmHo7qX+Vltt4Js4+BZMQ4aPrF1rYAAIAEBGfDYrBGr5ux +udnPyP2W757+C/S/RK57USfSO0aNSy+180G+d1+Kht1cVQZWibACJdqMn4kJ +nWEe168Zqc+auUklRIZRZjqrUIH1Kt5aWCDQxCll4Tk5W2/lmtur8P2p1/mU +IBhZTqif9Fi35rxgpuQod9GMlA3jx+oMnTrd0hF6U0KZzZPR6gAFGbjhwZ+j +MYgiUTHJyaTo4MranBwggeQU7cbFRBAZ9/V+aLpcAu0iH7/b+O9LwsZS6qAA +gJC4sCzodMyJchE+IhbH0QRAswcWR9X+hO+X9Q2SN/Jt3kiaYl/eI06jz1dy +bT1itbK8na2JT9E1mLkWBRvsmAgLVgaj984NNFC7NNcPIUOURtpSfvQNtDJL +e2UUf/0GLhDtYqDWC5JG2zDToUhFVT7d1AEgYSliKpi96+YH+AZmnnx9HQzB +AAgADEGA4gwQAIFCDQ2lnPAGDEXidI2jKAb6pnpMIXtLpab+haLQn0JUOgMJ +bI8EbsrMzDOn0Yb42budwndclgT5ErtCgJr+srifUpbRuYjp4luDm2d4a+WN +iiDXyZbreDaoAAAAAjRrKO3nlC4gQxxtyMH+T97mZqlm7YHKtUWnck2lr06y +v9X7uweRRK6QSKgp5OfUa9x+LlCRjbgFrmVYQ1hhl95pMKzzhQG+dvGCNr/h +2FETF+ivU2M53EZaZawg4t01iMUgo2Y7b7jYlZosAIkYSbcU6O6PlCWoiIxw +HuscKZKMZWV4R5COSlaCxdAsumvrZcr2vvc7PXQv5mi2GP++7AzC+zFuk17F +WwQfxC0EYnv4lCGQtIO+6dc+DIltOADmmrIj8AFRAwQAIAEBnAwEygKK3jbn +aZb76eX/uZIhDk5+3JcKjN444Qah2neplhPC2tL5+5DFkYJ63AI3QBOAvmL5 +C2vWEwokP0H4DLRYlhuwgE+LUJwWu9iWSkZ4PwtXc6c68rLTIr7ubc4AAAAI +RpQYMGABhPOCljiq7jSBtEQIEDIT8fpfdbBAgNxi9TJwqyb6jgFmkIDU0DpP +P/bVEDv6l3NoWxSQ5ZqivWsSJQQAIEACBDnzW/ICx69h7bbKCAACBN0wPqY6 +K3CH3ZAALzEkDAmEViEVK4ZBIZWhDStV1MjfwjRLQuBAjNVvI0MAOIhWm+Eo +SYrXYEq2KXpZguBEzpV9tmmMnX+ABmKe/+uEw4G/ZqtRdRmOn/35Wp9CTOiT +dKvA+F94fc2UcBWVdh8LRLaAPOqJsZMOMTYKrrgFhCps7YiuwRYbuuGvz/J6 +F+gS9NlT5CzSvAAg7pBwQjvQmkgkGgp9mJxhGYE/hE6KTuEITubVofCtH5wU +Tgh2UcmFwX6bxiZbcEnz2fkoACtfKcV+SEI2GvA8u+xwNE2iUs1dHYrcnlso +4aTZ/PMOdZU8yvo+y/RCncABrzCkPQepA9rEJXIMW00km4L3TJRxI8qUlxoA +CDzBMc2lILJIx2Yit8CFi8khEwmOhO7jcRggISUvdQYIxMAaqAADjn1/NyoN +GRaWeD6tGcXCzks97XVEcJ0vCTFRRxmRjbW3/GexTiCABRSuAOgZnfvaWEeD +Z+mYaBQ5XVMI3wJZDwPSLoBiHbGvXeFdz87FoEkJg3ZglzQDj/CYblcbnV+Y +mpmwTPd2iC7t7nJ68oZMsWsQTToed0HtIPM32J72YXiytyX+dYeyaUtP0GV7 +Ilwnmm2sCmgXL9IyN8M3+Z9+8l6hKbtlp6sUKPmLJR3wqb+tBddY0NFqej9O +iuABCZA5/P0Yo+gFcISyXkzet0KQJFszlJoykI5cjAMkPPYBSEPL6GLEkZQh +ruPdu+HENVBlHqvRvOmNJXbocd/E7KT91EQodefsPhs47rKRz1MYbDmP3Cz3 +d1BmZaeJWVlllFpd1EXVtKSRFn5VHq12mPNnUb7TNhZT+gn4eLbEn0pAbG7M +UO41VQQ67MadjzzTU0JuUCmfL2xFwK1J5jBeAPR5IAZzaK9lb2PiKcVGTVB2 +52/TOySTNUFRiaIbPuoMdE+Fb/fi1T9ELQ1eWtEbq53QVP7IGIDJwrIgN1bG +JBlbCR9Au7BtGFVnJ9uAZQylXj4PkBymhSpkdSYbS4lMjB5+5BS0OlkiEkql +GHwfom/mtR09nvZm/ocNAgBmxcdOwHERcoM8Q0DhSZv0lT6IKmuntCBXMngL +zf+X/NbbAGARauOceDY0gABQBgSlxvvXJoEXMyyF1A0RUaGICdriz8mxMNq6 +3KSPdALNINBMwDkLUqfP9Fg2OXvNsbipbvBFat/un2BVuSJOdWsBgDkLWxhN +SYuPrXjjceAJAUGm0wnQZ//elidtt5IPtMJgz8+zFK1RIP8OqUBaaB2Tr6Rz +aQQ1BxotuF2SoABO9WIwqVoluoVBSQMww7Xqj3MFIDtda4fGaMSylMezMV4O +7CVhvrBkL28SQ4g4U9W6ASp1Jss9VuLSdyBrLLmt471TAsrmQvlH/HR+wbdo +BT/yfkI3hl2pnMjlsDswMg7oD8AAFYXQalWWKbLhUraJrRzhTBWGGNn9McLM +zNf1GazoS9WERjmwUzjoL1LTyHShrYnGbQMyTYUqbuVbRjcGzX1OwcdQhJHJ +bNveYmoKj7H4mEo6R1LSEzNJlDdnMzbzUOw7pDDFptDLjvo0jEPstRQ2FoJA +rz2I/cx3EtRTX3g1tDErC2A/VspqdDveplbd9kxgECBAAnFPmxPWfXfjuMj5 +23ZoPvdQb4QXbf1rO6a6lB2QCg5sCuLc/o6SPbXedELj7N5ymo5sNtu/UjFs +qwo4RBQLsAFedjJU0l1siEQMnwq8HwtQjIxZy42/nxVUtuIYztgXd/UCABAA +gOGVY3e3C+Pn5nW3O5EAAEDAABAwAAYAH16P8zYQ4l2Dw+JAgAMx2YzzJZsW +9girMcgiP1GoIAAgBAwYMEADV7hM6J1bx3i2BgAT6OZSZGvUtgvE9Sc3A71x +FBKUqsWlEBr4fqftt3L2j70V6iciBPm4E22Y3dVGfG4PovuoBqcg8yToXhLy +2WXcPR3q7Mq5susG59YabDMkqV93Ru+xb34zfA4Flt8Izlfc8CPknI9ae/H7 ++EVR0uP/zWfwMaV8ipva8ayVWUMeCMfCuohZkqbcwpxmgsAAF5g4nWj+TuuT +3qW5wtgVy26HkRNulnTwQAIFrzAQECIQYDr2+IUCDAeeXREn3Fcppnnnksla +shLHl1lBgqDZ9KCb/aHhRMpt4E2rvfV/enOYS3u6IZRiLe0J2PMUAL9Qayek +iOqjzAR4ShCRhxmwFnloMiTSW5M4F1yWBWLd4LpFAUdGGreGXeeY8iMr7W+O +sv1tCcuZ2TC8gah6wD6h6ZNOyOp7NTqzwO9gavNgL1U4AmB9ua2ZDGk2q4s7 +WtVnuD1xoxTG0SneG/hlcs6H349VLCkk/KEGCVxyKaV2UkZnFC8YTZ8ofhoI +8/uxjTNbzYx3+QGSIgIuMl6mCf/E06OOAzoG12F+V4WLWp+sSEsScsthUpmy +ts+ndapFw2UEEbB3SXJNe9Y81+uy14BMxos5PY8aJnU7cB89q035EDboLgp0 +WHe5h/uZJ3OOZthYFe3B61AyGXOUc+WfI2Ac1T1X5Eo/N1GZE9iYFBJrWAmO +n22Oy5bLEqHR6pmcGocf0gG1xRIqnK7J8bw84+0VMl2VB0iZkMRG//qqy4OO ++5N7PbGzN0pUFy/Nd5WnSo4qYZVphzAEmjwdOdMcf9KQjq5fASjQrK+tKIjz +i8VkwB7kNhDXNdJDy8Gm3BTHADRLuH6QrFpXZaa1UNh0e5zJNfddTc+M1M0i +xDFPbezBoOq8A16zTUJTdAhYsWOG2PHezXx2p4KGBZHCSh3wpBO601KZDV0u +jdl8oPYP7dmJ2dIu6Q97YVRt5CQcW9Gf/N+Wavb+ps1ahs5UFGyvFiZ+6OHn +0jDQ8mo6u/nRbT1sqvrZelxRTSh3yNO5oOqo1YUTN/0KJBoRtUMEpOyw5f60 +ed4f8XnIWj9zmzdlUiWb3kz1L5BIoUh5YpjTVNb9X0VPxKWioxlU2om/j43f +y8FJ42OHuuRP0TBYZq55YtCq/mGb6FSfiouRHjvCS9xyQT7PJ78O7sWGuZ4x +YEecQiCzVPnHeiJ6LmdN0HHOfjz1HuoggDbLVh7wARVWHXDulsIqZ/qjMvPj +cUbn+3TZboH8Z6Qt4G3CJ+J0n6P4FGm8pChx99A8pi65nkpudbB3Qmx4AZJp +lhKTrDShnA9e18cpRvxp3hCmDpKfz+0tDWlOQjzkzW/7xpbVhyZVKW2cqiKo +Qn2cDUe+TQF8xPQQIEACIysAECawCmCOYKeTe+2r+PW8bSN9la3Jisw0ZA9l +oOPVBHUDZ7lXT2rwFqwUMdOlerhwE77C1PKi+49AXGI6q+HtoYIAAAALH1tT +Yw3iquCx/t8neH5P8O+wuwgBAgQAI8HhVoHQQAEgNZzm+p7v3eZLLiIv0oBn +Zr9DTxA8laV3Wul+9KbEYcnY8D33LjC6gYn2quE0b6/zzPjz23WBiQ2e3AgC +YGCWmoqGtQrds4CDKJg7f7FHQAuDFaXNqv6EW44/vktqtZ8LFLLZFp40gDru +SvgAIEc+BSx8Si3kTEONLQAlLNgeireES+UZK1DqXNItUubBHGWvt8dkY/1J +WgR8nUPVTXvK6JqI0GxWNsPYt53bWitEipSeYraMRWk3hMViTsNj9G/2AgQI +AFl8cSmYBYS2sQoiWUk/GbCN1Hc0H3IWzAjTm+wsJM7KBYveb0OULHCZ8J+B +4LzfpfmPPcnSvuPJ+/4kkkkkkkkkkkkkkkkkkkgwYMGDx8GkKUjc29I0TMJh +CQwX1dtRV1Lc/byh+v1g85D9pzgxdKYUgAAkYGACAA/DjVpFKCIGxobvjnm+ +78P6X9n8dj43cez6P6Gq8P97ke//bpgQ7T0XPbn2v9v5bF7HD0eRrwCBEQCB +HXlEZIGwtkNhkIdqqNwF6M5zP3bg9f1m4bJ5j3nZ/z9d/bhv54NP4n6Phdi6 +fU+I6K/Uc9ZTfCUQk26ayIO6FLDUJ8f+K1Cdyv1AU4MyvnMYVZ8HDvnDX/12 +P1iPkf7koyCiOXd6ygz4TDyK0CeuaLdCRqv/Q8Y0HpodhvXk2PyvC46jB9VL +SQbn82dEhN3fhGEqFL+09pu7Y+d3HBUVdYWAcTeopQ6uxSTxn6gYkMufizuI +jvtUpiMMMS7nQJrQg2qoRBYM48Uu/DKnRyXBJfR/m3qq3FLVtqT57xot/KlR +3KJ16uY5an2frFKBlxtsNb0RacsieQ/d42PupY/bqFusWfU0oihumS+XB8hn +G5iBbOKgiDh5re5ea6bcHWnPPktYKORsPj6zXePB+0KlPzvtW4yuDHAi96hy +IaQ1jLmt4Iouixtdz2ayM5kOWxymk5KcULB7gxZ4Tap0aTfqynv6PsllEV0W +2JhWDs3EtTy7qqzzFA0u9hoVIbXr7AYs1JRZ7Kpm7cjAxE+16sGHcmZ2bosb +ULEeu690x7AOOZN7Uk0dCwI0h8Y0GpEJQCPNuBPVQ/353SXrfjm3Z3PhDxTe +qVj6T4zXRlAvTnwIHTP3HxLOekc/+J2QH9nlkewliP7oFQcGpnesZEVoVr3h +NENKzkVu+lbtzRzCHPh7/Ixxse0MjiZ46tDXn/beYKytRtVKsTKrHb9cnQv+ +FVsgLub/UC9Hna2kYKSySoKdvAv5zyjXT1DQYKskCi238ZE1wqACb3uD5XAq +iiqnZOF35Plib+FoGonvkNQ6gwafPBVf14v+1yscorWLmL9T/MfRcfAStloY +vf18I41qEUfj4vaVpBjMZCVZCtB23VSBG1NeJi786vCaTEhQlCli7g9OznXA +gt5y9QGixtX9tI9XrQdHon9ANHzDZDrvSuv5mfqXYHkqHEzvh4/YiRTaa17H +YaCAmkA7HrwxSsp1Mdy47me5kVd5wQa5YqTF1NSZfcWbjc6MaoI5zfUCFJFn +28ACjiJx/iAhV203GkUIZPjdFah0DlVtpCjpVAQStuPDy9aYcWnFw+1pKiHS +cSjCQ/F1edDEXb5cZ1WqBBwAAB6BgX3vEKQBsDA2QoKtW+gTGOrmke6rS49l +KNB6wU4+dn2QBhLg503oSNId/YMiU1JbNHz9Beu0j3yDZ7ApOeMJ7dDC/poK +3RzmcDl6D2PXsR02oCj5ftMqpghcQ/8VPSfsUeCBAgAWGQLmdu4a/rqxuthH +UCDnw73Fu6pREP242I/dYQLEYNvm6cLisms98avqi8bPUp6hQ/DTOluZ9RJ9 +l2wyrsh4rwshEVOYpMoeVMdIADaACBXgHZC3wu7hI1FjbJUAY33LXBYuEMVn +uFMnj5NTw70BGI2qvpCnh4dN2YjMkU+wCQrsM4EZ4HXz/msHtSStMedy2DOj +FDa27mhm6SBZCj590q0qs1Uwu65NC2En9n+uE3D1YIAECBAN/7y0z0D4qq0L +bvONCszD4GzM2wbWB2PV+prmgQmS8vBKISLNx+lrtblnG701ejzDmQOLndi1 +kcMqgyKYU3tdtnQHxFGYwQIEACoFT4jjlWDHJbi1AAAEACAKCtM9hagknkuD +RlANi0ECBAAoh7DNRzijUm1YFxyKEQR75in0CtPzBNZklY0L3GpcB1A0UoAB +MNezZZEp9hHl7mzrTa/KInG9rdVIAEGjXw/2mnaxweQbcAxxN1QwSmOhMkn7 +wSx3GbrwAH+fR+jelKukadaanT0Ri4sRb+MdPR6Hx/xrMDcAa0YKQIrEYEIk +RIkIkIkICB+STarWtJQowUex2/oPB9FOz/f4P3N/I+C87lnIfS6vxHL9Dt/2 ++QWVhFynhcJ4r3cVd4gH1Dh8Xv6EXOAyYtDUfxSoiwAAEA2awQECBAAn71Dn +houCWzajPy6TvvYTngLgY9RsNq4AWYSyQC8YUHVnJosjvnntaqe1LreGFNRV +6rqlwDOAHJ85GIOgv0JpyUVAANosJqqgYQFwq1B3dk4TlEd+KSgMLht3/Uj3 +UuB9OdCN01MR04wGjsqzj6ZIQA0D0w/tCQ57mawGDgL7xMtmdYO6al/AsP+J +k2by+Uy68uNfK7S4bfEXzTgJpBiqboWXkqVk2RsF6QbpRoxaMJaic3J2uGcH +Dny4MJMm6WkTfbrx1uulXw84mmemjZ461xuocyurId6YP6YVErkRLvry5WC4 +kcs24p574wJWAIA2/juCdGGIVE05II0BfmodTvXrWbFCvp2lUyKdd33YmJ9Q +7AJ/8nFuq64JuRsxvo6jF9cOolc6N1IsMXO7zss+a9AgAQAICPc8H8C0Mx/9 +YwqeKN3YdaFwkT5MTBhBMs6RiVSvaTvqG8K2mDUKF+TEwiXbJM/Q97rG1nPC +cvbrM+TOY/6b0YiFGjgXWZB113eXOtm2WhOxXGDYQ/ZH7FLgiwbUFwIX38/A +LUbRhaZyFnKfUMLb2R2WNkHat5eln7xKRlwi/g0J9yA8f2hGRLewtDm5m8KC +mczh8zPMWkVZ/Wkxn7AvomVV60bbwVFACtDFSQ1c7tuVjEp+H49xZpElfupy +Np79i3fktWNCQm9rLXhcvywwQBviVprNQixYLDLOMl09gZCcYSUFxiZJk9n9 +Ao/OCjJMBlOgDxmcD1Nc9V7Fj3UxrZLRpohLZds6GwLv/B/TggMfnLV30R1c +6EsaJEogBqLXT01hSox3qJPtUwQfngWl3b4kSnYDBCvob/2Erb8YERw+hTy0 +jMbT2cqAQEuX0w1JmFftHs89nPJ9QjvL8+VvtguUxLm0alwqcST5CmTTX22h +DOsye7n5vRs12e0mOyom5JLLzezdu4xOS2d5sdylScEqVh915McssLJ2oGbM +byVYU24az60htDLoz4z8y/vdN4iEToz/TGWEu0IdxV20yXsOB5ZiK8fzFz7j +gf8Lix3C4t6FevF6fWiodNuqyP5oeOoHzupRHOaGLtDYM1Xr97cNbF7wZffc +tDA9xshItSSoC75hwKR2AbCY0qf6HabfJVQbczaVTg2tABIfIxdZY2PsM4XR +EUj/u9wmOcP7oN7gvbreuwRLlRF4o1trQyvdTvBsOCBAgAQk42v7Cz0+ktei +vuPLEeq7gGKTpXTCzIKGzvXfwh1wWd50SIIBkfiHNhlbNKKgIJUHGaclH3dG +55Az3fWT40IsID+AKE+uCwZxPsBHe8wEAACzESJEm3196Qw9wBIlI/Lsg/iN +lRDGK+hIvsBidz71DwykPWa/uRNhz2nxssfI4xGoeNysYHlf2jAv21ygxErd +RCIsg7fYhyl7XycCiCMA1bpEtWhd0f8K13ZM5thWRtaz/yXXehSd5JCp6SRv +ABsN4JotquGTLY2oQ0XqmestTRrKHIxMmtkmAmO5ggQIAEpggAQAIAxjvBdR +zQAs+jKeHMFqNJclGqvqBh/bWHoNsS/QeD1/eF4/M8NMfWlU4C+sIqezxJFb +7FWVpKTZATN0DYPbHa2TPoxDu9PTvO4ts8HG8FTMWf1gOOm8B++KFm1JslSB +bUUDL8VJD3hv6NAfOThqQr4Gc1FSaKwNQTH9z2zInuQyUxWt/KyW7H/9c84a +SZ7PTGGT3PqWkxINOpMfCcdVpFPzqKi0pNOeOZ6t6AAAAvN0IAA+i/3rH7Sm +NQvItWaABJA6F/oeIuVXKG/p4ZlDjjgGISG2P9ymhlQxEU8NCLT35h6Rhxj+ +p0fPd+zTOeJy3pFuclrDON/yiY7alpKAb57usOEn7TJbAfYbkWQFH0Fjg29C +DR3gmsgAANDMQxxCKryLsbRlMSO3acx6tBsPPWSDP41PBZTLT5K24+uJ0l8P +kdZG3GuF5J/nKC4zCs9ZQaSubVZ/JK1L8DM684avmxfsBTGKN9xFLbJq2KiN +SnZX7/6j633qXjNC2eBgeaxVIxvWXb5P3JC7lculZl1SYu1BYe7JEj4h0+zG +ExaVRJ+rR+SWeqZShcFY61QJzOyW7p+9xQvbTFMWf5KyGiPz54wEgAn47Wzl +sSKqgxUjE5A5hKR41S6Z31T1LMzX5qRTY0TqKGjLftkZNttl7u/CeAGMU5bD ++gc5dNBwgtYdUYO9NGfisUENX3ZRjjrLlbGq8dd2mRkzjMgTKKPjPIrl0aBH +ID3XFWXfEpYNqtKwqi3hH+L+RqLnnvjKAhNQp5ufqzCg1nqjzdqmTgaH6Lzb +dLNtpWuVd+UFxxDfw7taXIPXj06shzER6KTRbX1uRn3SWDi6NfkLNnwkmK6n +RN9B0qK7ULBZz2kAuDKQ9jgHCUpTvxIB6eRuNua5u+o9OXLU7LdkAUE55BcQ +iXIxxbNUL/CshaNE2Kz57GE+wDLBenOWaDBMH9GTJ6JqqSjTzUMqrrHcZJPH +PXc+1y92eL50vM22P4nXHYtntpyKff8LhSO8Pa6V0EIbhpRxwwTFj+3vW5pB +4fl7McYYweW3MxOsBEHCzNj7aKglWlFjiaCBGxBhlA6pQa4Bw/zk4hQXyDlD +hco61T/2ckFJYM3DszKsXuJQYoAKeY/h+rc8iotsAyvAXx+cHQ+evgmm3gLP +po7l7rM1ogmNWHhMiwfxl+JVHR6ZRMziWKUAi/VMjK/1ygyWN3hIWC34oAAI +AEBnLrEdDrvpHOyhZTLekhQLkZ0EAshKmhAsdVYK5tgQEGq7e27hjs8QJ7hw +tyQwk1Sr8QFVUeEvIfliDN8ws7ajzlJqQoAmSkHK0lXrSlzHs7foGFNDPGWp +1j1Vou5veiBt6UI/rzS+TMRTvhjYSaytRVyHEhS1BgjbBJgP3MmJJE/8nhqp +D0Ufv7VWPK4XLPmxk52xbfeil4FYgew6BD1P1/h/0J0sKO9XfoGFgn9PVMRc +I6DYVVibLsPcYsWyFaPwCk1u8hEXnVkaXjV6rZDBDHXcVtt3AXkqah5JCAkW +wQ19TaBABe6wNIJP5P8b0jBV4zmTcm9A4q5jdZJjRTuBYBxmbx1WbPERIWQd +cQQHNlJycMOoIAABiufhYu8vSMZUZjXV0gSBo8yJQuFIr+4VE5ENreXjxHpo +YOrh7iK4QQ50uC/YrnMfWpcth92XA/55J/phaa4mEy5xeZhBDgxiOIpi0rpv +O16Bkepb87l2NyqUU3hEjzGXm5huls98XK0SkHT1c9hNaV4CAn2Qk4hFBDk7 +CCdwp4opz7mbraFfYzJiH/oYE6GAeFL9gtW2mCHyts4Cu+dqmqFtW5HbMjTw +PuapY3+b4v4h4x0fM1NBsquenQNuc8hkzDjC0TLfkMswQCZVk2URT7zHY9PL +78/7UFLqPFxZG1cOSprwPaZZZCuObgigAgAPE4UGyZogbIAAFDEEMVEMqDm6 +7oqtngeSDM4gCuMJJDkoMAECBAApwlBg8I+jarXczMqxum9ud0WFutOYOWke +hPNZAzXSJTmH1YkAAXgYAD8SqUKPwX+MC3DuJHi0Flapc2HMf6zvwf/fGOgg +QAAFwm30E0DGupwvl9j/JrnbmscqkShPyAobAB0dcQ856F6vZpSuPS21sfp9 +ZKQffQnlwz4L+1Z0wfeJ4t0GQTa6ivEYfszAtMQvveieuYkJzlhXmV7lEkGj +YH+JohS0WrQRfQo+SmajK/TvY/TXW8lCKdH1ArU0d8BEe+w9aHiSH56QzIY4 +R7uKU8NRVbxTrJZc0KYyplALEZmrcRv5ou/v2NmnbZUw5JatPq26Js7nVeji +vaed5ShBiqMJ968Q/Mj4r8ls/1Hw2V097qp3bZxeMX6MIyms0Pghm8sMvcMd +wCgodRiXB3CHASAHvy2JnHd3Vr6Qo3h3C+ioqL1UEYZJQGPkwY9MeSnX8EMv +Gy+Nzxr7ECv82imYAxOFAcJnSrEmj5cvASjPgrHBvAA4EwP5oNEFSG2Z/L4i +S8Wi7RL4IoRrfcmTYIHtnltFO+215OHST7gWx/5iLvaxEgUdVKxslDx96MW4 +DSa9h35CLkWLnPj7wZPIRU5z++lLUKOHL5NSl2GXuz6zs7DoFTfTkaNyftmZ +FKf9aBMQaM+tIbNnMYx0tGPiyY3qBRTYOQ/5vj3bXxgR8SUdW1R3/q3FYJDB +5XUe9KltPToujsuSn+sFxyNbmM507YwIWc0PUU5tnCXPfQps5lAWDKKysk+W +NDI7wHoKBYvk1Zl2j9pVj0nZcy926Z/l/7gV0F+JHyhYwPUHRHL7zw7PTX1X +6cJO9BUDFm1zlQBeiyPMmVb3c8h2bXpZeMZVuNNjGjK6y5sC3GdNyLpoxqpk +2fauIT1a3Vo8fli/JVqWMhz5f0EMl3/TLq752YMStbm9Pvw7WfNfvLJmnznG +yhdAP19qY7XjuV6ztOvVZy0qht1zaTFE04gZd6xQq/VXwHa5p6o2/Mo1j8P4 +MgmSlz+sjsBjIyLU/z1pdJWbMk86/CJItDe1HSwWhh/7ZkmWyFHuNMclDCTd +LruvR3hEnQ65HFC4+T7ZOHzdKhasJPRgAAQAIC3oSy3vxs59pPuehRFAxAsJ +25wmcWyU18LPSvBqACADropC6u3hTF9EgsPKn6rKGOw1ISDYWvMada/FgdUS +++6MJ4bcUi8hIESu/ZusuGWcN0InYdAqsKu4xnG8X0tMJTVrN6dpy461kiFP +iM3C8PzgkaSGvLy7XfHBj2MAGTnhfg9/n0nH2ashQ1f1qLZxZv7JjL9Opho7 +fv6ZQHwa/c27r1uvwUfrlFP/ANAPaLt1zHvVzasVv5NmlfyjkVYuNpNV13xR +ofm+zABALADzDtpdBvEctT9Vg/vupAixgbwTQIdrNBiEc3cq3P350HugC7IO +A1X6zb8gUB6x6U9Ye2WfTSYrZm3A2tDIkTYVD508c64w4aMIh7u3JqgfF+4G +Tq9oXKkjfjsgACBFXLFSXgRhlYDCrfdFUxoaKnNFHwPJl0/XQCuuAiwYEYGP +MWFYQMAmOG0r2NUECABfCsnfZZct7JfNVpvaerHkqqj2zSXHegcAgQKDWxnW +etzyt4St6HxiRwO6gMUqMH70bP1RiaYYVidqYJ1WxjrVbWZ+Esq0lPlyy+FM +0zI0fLU2d2yyuj2k3ie3c0gFxuRkX1utq2rTgKOO+QLH0WaEnfwE0rmh5aLA +bhme3kek9+Jdo9GOHHj4RExE8NYjyKRsAIECABdoAIEACo6cYOlQL47x7urt +x9haHiwMYr+E1+Cnn62ftHs3/hqqaBeUya/Eq1XoeUPcIOmheCBAgAV+Yjx+ +z81yURzW6yt2JlqdRQNTP3v2FIYYVCVc3ynhOFZtLtd3AP/0LNLljShS4vGg +ZEdhiMuw/reUiUqNzdt0Fco4sDdbs6x4ZRGI4oOdWijhwBY78hSe1XjzKyAG +HdXfL9S0rDUA1zTXJbkK7PTLLEMQi8ZshCTiAPvnqHTszGV3tnmnotzwSfPd +tgq9VEiP5Lg1OM2YRO/pGGq4xu2q87lCiag6mMEevr/s3ZAAVy8hRSDIhBjE +Rd5v/dcPYd/sieQ9d3YR2oOoUOzO69ggWducUtQp+fqgS/VjhfASYAYfHNQh +LbaAcGtKVDpGCOgK/XNUBJ61CDeEzxgqOCgzplUFxc5i4s2oe5lBhonNCb3p +5v6gd0GXtVCM+ksPLGgjm1DP64bpQzBiGxIUh5q9+7tz3iDrGFLy4dpAxrQr +zNqs+N3r7A2ADX6+6mE/0PoBlmwGD2Ga5q5Uesp3QlkJGq7tiBkF+oBoM9oW +2NNloEyuZ4WSAM7tc0c6Vn8N67evYi/ua4ri7UKUU4oTXk0DVuU9QpnKjUsh +C8iQ7Aacie8yHN0Edev6T/uN/l+3ZR+nmYJvl78Yw5AtBB5w4cw6QzegS5Wx +vwa++mvR8lzwpH60j6qMm8zoHj4qzU/OnM48ZLT2EOlzKgGFgQ/d/vKxLpgy +HE4Wq2/jHyGzMTM08tBBo1Hfr+SodFnKHgDPRuibWOoKzEiauUL7s6GYSHGS +dcEF2VQmBAQUvvBzkDlLNfxY3BFjcT0cYcjeRL5WlvJE9tE4vY7qH/D18B/X +BFUPekm6YkkyGW3aUqibairMUpEHDoRh8X7W9BS7RoDs9hATQd9qRTTeC9ya +T3d0ObGZ4qtVoShExoQ19FW6VKY3rS5QN96p33U19DkJ5CD3jvyZMQUMqKov +LX7xHumfPjo++/Y3nGfGuFKXJRHGJwVK69kGA4CMjHd/zDNWXFeaEv2FdF5y +Kh39NqQv9aRy3/FZSPSmvAmBasjVG/18Brm8yAG1hCZaaHDAQZE+lPs/UtQa +pjCbqFS3F3gxAiLEDqFJmGrYaTewcL0Dv1nCtbdiSIHVg5UYcrDfKKn4QXyt +f6gAynF/HMFBktLPs2JsikfN0oD4zxSIkaNkMb8jsAtuQAkA/kK5TbGdb3+x +T1OOxG4o4oXwFt74rfHSycDprGmfluM5naLGjTDFx4xlh4A+71rZrRmPsP5G +ty0WGgOKVUAnHl8QHqoDAAQBofkIiXjFm7VEEAifaTuE86lhhyAQK6yFyXgY +ecsQfYkcBikWZyDRU61YEbyu7l5AZB7eDAKBgBU2deBlexEz8kIaPRJQQQL4 +tpvEEkBECuI3qr7MDjqlJAX798YNMD2tmofFeFPBrmBzL89Xw9ZeR0kIU91G +36mkJHr42fd4WK30vKBra+snNhr83SQP8jUjA/Xj4i6sxdpBTb90yG/Qcf48 +ZizMRs5DUrtUZxoPGb9V4+wAACABAHcVVJJdKx4Q9MHopQ960NwGtENpf+S1 +bL6Wb+FOa9DPio+IDrDUFTJ2LqDtfZ7diSrVRLZtwsnD5SsDKpwgIa/ULs0U +2oGCBADzsrCWKAzbp2LQ/h/4Z2FhrCfW8Hm89sxODDQJEACBAgAWBoN8gYUv +7h3HhULVbIkcKf5RmbKj2w05z4Whgt7PX46Ta2uc62lKRDEjaJQTn/55Ecum +tDTvlEmaTnIUHmf5xygEhf0R1KZCAA7vVz10hnMRqi6u/OC+8HA7+bfkif/N +itIumQgDfy8IrrOiXK1WtCIMIVYXIBD2nmwttocxwtHqOClosEP6376RGWnz +eV+hp+8gj/BpkAvCQmV0hDopUWBpPhLlFla1d65lYbgOhQedHKLMNEmTov5X +fL7EkM2lEZONYBoJmPExeEKSzc8eCdf63WoK8ymL4vH7CoLxXCQ3+Nb3cdBD +wFX4vd5cMdgNBB4eMQAUEFbLe2mcGML7POkdWdhn4KQha1uNPxzCfqOhZhSm +kskTqAAPoMBvBgB2pF0VwzTFfiM61kifmhzdmPKN8upuX2J5dZxBdSEzxafc +C7RZJsEARvqZcknMpGHD7FF8l9lwCWBxInE0IXP0umJOdXfJXs2u2QfR9yON +XP3n/EX+wzshszl3UTPIxOvoY6GqX/tmBBGFduSaXsYV4fvyb7dHoIPAIIov +M/zSqRjooEeO6BFoWgWPm0P8Arud3UjXj3iskqQ1V9XivTpvIM2ptiYbSWic +9UEvkHZV9En95iHywFsihuIpkz6Qx6F9r/A3L2/q94Murl+q8nNoPM37YO6T +3JFce0yedf2/g/nbDkjTvt2gZKOHgKgt6N/me0dHqVQCl55id4lnf6LzkIpZ +JkjGc4umMHfh9zRQPGYtISDeuSU2VsPtRl4ESG9rnExAZPVQcSTL+xn8eJ61 ++2CLAxFv5ERxFs3LLL62WP5AUTfhXrzcYOp0RxSwjzKgHj+2sG5ESPVW6qyR +7AkGOEUDOw5zpEfyJm8DMt2XOYysg+RYRIefyFBRpASbgvZ1dhlKuHIcuqns +OHHSxnZByxXXSAcNVDOUZtItp8i6mbudgSLpxLCj3vne/8+QfEJ1/fsP0oQ9 +8kN9TfpfylipC0+Dgo7596KVfohjfBHkIwYsdLcY6P9P9ySip4iHLfF8I7iY +ajbaD8yCL2EdmjJUMXLvP214Mhhv0awaPQyDpHMnU8vBOEYkvlgrsZyKt34x +qbXTe0vuDnRF34DEvu7bvhgbk+qvSyMZbwocN1OhbqN0mRf8B46u0XRBK65P +KnooncONN8VrzVcizPVAycRvI/xZ4ig9dwQtm06DWPshKDdrnzdgOZsEbiGJ +5W7FrNQ3Ll2ctMeLSkL6bYNhfAcIDP4MjwTU+u7oeAABDIJQT92HJtGYeHvh +jAciL06t0oqwKKSZ7hjSMqYL1jn3un4tZd9XYenk5Fihkr4QoXPG0CbAl5+0 +bAoblsy9Wgw+cl1hwQ4G0jikOINYBSROOnYn+/kvB8Td9xpyIvxxEJCd6ewd +qmExzWgCAgw4bDICfAhKXyDRYXyG2whyfB3Tx2ySaEiF9BPcziY+k6pY4gu0 +wMGwIEACSojs1B197PK/9XNrVYhG1DggsEFW07yMQ67gpgABckDC8Dm1cveF +IgbHg4m2BXSxvRYmO05OZaOUPQoRo35ikVzbXntqiYeVv9jxFB5tWqoWwwGI +FASUw+Uk4+J0x3BAAgYAoPz0X1AAAP1qwiWwihTiTRQfcTj6EQbfc4TXRd/V +RzEC6KgxUYBPwaaXq9hubAIPdZn+WYfNJEkgX6k1/jn8ngcfSdKbASwsp+fZ +xs9MsMKoR/QzBLcwcUOXPoXPcCcnpVlGi2sg2ebVrp86ktIIECABbZ6RYFtf +Sltmr+w9XHycrCv1QMCQqC5unsncQlDN8302AisKKXcWICF89toawAwEiPcM ++MYNLln5XO+n7DT0ccvP+jt6ctejlS49rMi3/7RqV+/NPqSR2XciT87IpNEo +qyUmaKP4lU5meSyTy4EAcgwAAQMGACAAAAoYNag/N7dvPY12a7YwAAQAIAfq +8IDfszBZVFqe+6RZihapluf7Fj9VA7MyradXSuK7mcyHtKoOrqpLcudoEunD +oACAAIX/tEo6Lm2wCA9RMSb6ud79JPYznXRREv7NkmEYv/T7m4gpET/bDqcZ +N+82Wy0PUtHUz+kSrb31B/N6FllTiFMhVMXwBGV1gkuTeIBJp+wGngAanMQG +4Ia59M50q0Q9ac0aS9zDWw7H6fQACVwYMGx5/Z2mDQWPCFT84vnQQCeI8ZaS +dPwQYCuhadYeEye53sRmoBAIlLa3FBcrCoa6Q+izAgsEACBAbYIEAAACBkdi +LF2sGI0QoIMIBaq+t3FZXPbti73wOZ+N7Dfv/bZ/X6+Pdd//PtfZ8b3ekU9b +xwigH2uXDjWioQl4JSPYgEQ1oQshYKK+9YJdcJYGDAgXwKAAABggAAAPSBtl +iXE1B7adlX0dZJkjbqX5uYz9uur/Mz5emEIbWgfmg3uiepUztCMCxdqKh07S +8DqGDOLeyv718/zQwgKmUADuXOifkm8OT6KAzaHx2hil7d3efHq39ZO34UZa +RC9LRFIxtJVuZc3cFW0nr+MvY6zL2pHNH2tvjQtmuG4xrOJICl+6qTQOZiMi +pdoDcwq4kU9cW/SwX7VlOmHO7zH0hfOXlq2WboRtFt5PWRjL4R4nCnV/ciPI +S02AuYAxsz2dqifvVReAuhTPO+e9rC8Ux6cUnb/kjSOWRJQv5YZknGwBjatx +O1mV4+1O8y5CzeX/WxU9AnPKsNhVmfF82RCoVhoNJe4Dn1uOHGsaJ8dVch5A +1D+uf3qz6o9ebt6t5fXNtmCSGKxC2bavbKOWMC36FShYaMxT8cxqWnp9zvKI +j+rTQNJB8TNuHKCPrppXIFU+fBbgYRD0ERzPo77ZHK/7KYxt6jimwEjTA6Ts +FWvbA8nN2t8dI7nxdf43mGmfIJRvvtKX1cKGNNrW41A1fLxt1rR+Z0V3GF7D +HsXiJOtn67epkc3qEx7GLomve/T5ZCNkp0h15S7+01U9sNIu9rKaAuoJaRyJ +WWZzKCpkFs6nw4QfMeBxG1SW+i0VKC/bdDq8oErcxAS2+Q6oMELrIjZF5POe +aRfmKkuKvRFpM2qDYs3DqCF6yj/K1spg2dUZiGu2CaOypYUZzG6QAjPNlMHo +kCw4MSgjS4sc/gPUwxeatpj3WwqQlopAsLDYKaxqHhafdSOwN50Pq28g0Ko8 +T0t50D4TnL562YZ+uAaQfV+hMqKi0486giQxFq+fOZ1rMrhWhEK2Bk9u91RR ++yJqFf+DviaM0zBh7h3UUxDCN1IKGRnz7EVpRSx5J1YKhfEu++BbN7vOuXEx +wjjJ+R6olWVZRFUXLmkKkoGTa/xdAlcYi/ZRXg5TnscgaXyFdDgFJVJzseL6 +UpsnnfO9BO11UNuFMqlTJ+9mfValH8K6DZSA8goKwc/G3/kZ5srQrKpgiFgS +97w4j4fHB7NCHVAQD22CNmTGuFlM3I1XJSOyDftVccMQ5Eglcg3QBBVrlGSu +rFvgC+tzQOjP6E7q0fOK82N62Cy+nAk6moZnOjeOAwFeTBXsCFupsEO2RTat +E/h/F9mGr14mnsX7xmQGMxBNheVZtnkTHZD9Ii8xJBFHAjmUGMfrXgsBOyAy ++OpwIuqzyOEu54WbYxZuY8hmsNPRdS5jhbvAN2PxWpSWMV2XllZXyLFZ/mku +faoIlBf8px+Ed//FxipIvNkQ2TZtOLFN/ffT93Kn1Jv3A6KR88ici6P0BRNN +Q5Kk7uSTDglpJn8a5An2i1d1q1UAAq9ZlDsBQVnjsGNWMqXT6OwxnMEr+UmC +7xlj0W+8LkkgOVfpjT/0SdiIO6Fixo1XzyIx/BF++KyOaC06KE6WdxuvLqD7 +hLs5PJ+J0+m3QqCzatcQZmxTSnWfiiErVcfIQtFm8reML29lx8yZceL2erCi +Tpum7r905DeTemLgNx75TWJV3VemLaV0dE0aJITUP/rONebvhFrXYukg8BJM +xDSReo8PkvpZ6RPpJ+ZmsEcCu/HdNbGd7Vk/3NRB/oMrAvv29+jVvPgU+t/o +9yMb4HvLIoYaoLrK6UDz/mZQ303N5WgPOdttxbH5G81cKDp+LR0Csz6N3Sy6 +C8+faBulxCDCZFATowW+gmbqQz9eofW1+wDumvlGjiE4ta4pX/FIkEkHKp0Q ++PA0Ppqif36+CjwrgzQhPuTC0v98tufqh08s1UocrBGMi7/DcIivDR60m2A2 +FcIBMxZYr75tbs97BJhvy3oT1KgEEFlWehXiGrQu+AzbYcrki4fNUfllrZ1o +9nf3T1ttj/LpHeMpYMZ3bJwtysYK4WdMHs8pJqOls1lufiKO8UVtAgHQwKJy +GhEZfU+ymH83BCCK/8HUeq0SksH7hBllODH9bJjjHuQCZ3emkpcJcyqNtDek +txgmhX8DDh8WlPunfWBgMzHOVp2cxGLYG3UmNeCgLmyxMvsx3A36f6KY93WG +FjUUC/82kYxBkEP5ZY/V+2H2ZCysIv2N/aOmJKv1SjflGZwJFWk/xYOda8sp +Hi6CXFYIDZVIoz6sv+4wyLI3HTJ7bU4n3NAaSthDLllXS9Gm+0TNGyxLwo5e +qpd7M5cQpqbbSxM3v1uLD7k3AvDGJO/p/PgZdNWC5NiyvBZqj7xtjEK7yzLb +x+MeGpJzaUnvZ2bxnfANyXoMl7UonPBN37WDm2sefbmy5jHqLIus2LGuEAFN +S3JRcupZUqaRzAhwq+OlCEb+JTXiMEWeQAOFK4PfFpiK1+ncIrP5dNjzrhfN +Jwc2VBVMII/cetuBtCd+RpA4Vho4gkk8rKdXqdIk5fOkKZr4vXT0hskUVFcE +Ah2hXcQ2nn1VgEKpEZdEmU7m+uf6NKartSafiyH99tyR/IaUuJ+qVx+C/wRH +UAOtWymppVm5ZG/ONhHPJ4ADL3d279JklojfpRkW24tsGOiWlsjmnnPWOwyy +1QtQ7uHtIe3fNP4ASGJCz7VCsWNcFvgatRYp80Z6iO0b5uGMNEsWvUihEm90 +ae4Tkd3HG1QENVuc5mmklzwn2OTWJyMyntK0Hwq/5iQAbLRpvA9O4pvq/NVV +PMyblcEQWnVmyzw4GtRuGFESQcTYNAlgP2roofSh2O1ukbEd7yxeX2C6b71o +knbw+iVdKKMOJmaZhYi/qdT1EG8TEUEoG/p7kkUEGvP7u7v6/l9NvsRn3zDb +TWoekkvK7GY32izodgjpMb7jZhsDR2/F+gckSsjOy7f3KnQih3APuNk6L/rf +rHoWeczWtqKdVSMOLAOtn/jpsFT2bkJKBbqHnFU45rnNoT6NVJiEEalbciEs +s6xCMm63P0xWcaHQSwGGUqJClx49BYZuAirVYvLmbxbJPq+ee2uIzjfOLjvz +WeSPAxh+oix9LWq4pAXU3D7IYYiDivWUIACeDdBclGeGsDoevFz5V+nstJRX +g7jsX0s8IEduGkk+BYbBeFqNky4m7hHxuAiP5tEQggkBFhrCEnPvSWOnwf8O +2PuSHuXNppf8DCG3AFahczcuXwFo166+7UPoTdLyXxrJzWAuXUCQGv4xG0zr +Zz5tJfuDpissMax/WHY+RMNWlwjoIdcgAkdFjU7eDRgJWIEKzRW/SByO8+Vx +JixlFKszEBlO3kT48SfLp80aZyyr3+tCjzHmjbzpefgSY8pI2pBhmoYnCMyb +SG7QGVBMR+nfIn/MqIHZ5K1RimwCUt+cVDskZBIyA+cUzq/AXrJcgAArN1Ur +7yeRBwWf4ZSe14ptZAjqv6CtDug+lfn2N4AD8AAACAAAVIIMVUxgjNQJIFss +wFaeAy96ewU3AiONnCC36e8NZurniL3SbzuGrNMmKbGcPAWdjQQKu6AYptst +PbuWvZnh4Hu4sHUnWbgDFf+1r9SoI/VxmQO3kODgTaqRejCfH57pFfexNgvS +da8DHWkhMryyJmfoOW4psZfpEvuPwn/tgj+Jy7fS196ORA7tIdTx/k9RQi0l +7k31L0mpT4bMD8aKR5d4X4lFsDvsXZonutQN4FjBMJlvNDk0lY6KauUya1m6 +7m3pp6iNF9qOnHTiVDaATy5CA0gBc2qd47V9nt8/0yHrfu5oQAk/sbSgMhBz +bNLmtWQaGhriVKYTOHUvceCN2s9IpM1uZJoSSpXZ86yVnNMyaxdL+dZ8lUgt +6T0sf4+RS9B8F5Djh326rh+cetzRXT3focOKh3X1F5ikoDJ+l86d21nljyi/ +r+JDwuy7B3Lz3oj3j6STooPFBLt5axXCsfsYVbSn33tD8JtAOgbOIooEJXLF +ASB1x60i/NhAcS84qtQjUvFhNjhm8QR9bFLA1/0uZ8B3uCgO1XCXFSQ/nN0v +DNIEFZ7QxOx/M9rzJjSwpStDTq4Z5Fplpx2M51L3eZp7/0sG3dptaYKa5gI4 +mfpG30O9vY4fblGik9vJlCeo6yEpE7hOX4A3HJGZgLcdsqX4TA8QEpgnstD6 +kbUQtWv9ZlQono3/VrcH2Fh4sDx288btDb8tewbhER8Cywl7FrjVBy4O8tey +DxNHpCBO28LJesfMJB7vfgAbqRR8rdDyXJFgY5Ss6XWjdWxkinFBkjE74cAk +smr6Ju/4d1Q1Ppnt3SzFOR5AmmGSenosX9YnY+fxuTWK0BJ+yfSydu+Hw4YS +ITmWKShv2OOtM/2QnhfF1QZRNTF9DxZh10dTX/n+tFwjOaIOtlrraHzuvPMw +MtwYiT43UKoqxY0q66N/i4R7h2SI/cOQJXLy0y7TUkVdL7L+SOGPlTm77agY +tg0BWv3A4Ocbt51KHGNKZZ6n19sCi8XVNTQIfnvTpo1PfS6IhHf8qX+Sw0Kp +R8IqvdZvmpI9RwcPYcZBImk2YacNyvWmeuytm/4QLw90TlA17oz+pPGdH4oS +7UI4LW93T/6JpZlIyAeW3O1YuAIXvXV/orsuSAgVaEQGuMBwquZoiEsLo3Tr +dVYAE05SdwyeoMeOei7uZm6lzW0p8nf14wvqi7cnWClstePEP62LSQrrYmCa +1Iscc0FzC+OzfpxzFdtkvTBtfoLzF0pkfDQtZNOjBSmhVWSHYqs4kixr+44q +CO/MHNLieBc59QjdZbsic8ntskJg6WHJ/HmZV6dYm1fdi9Z5jtzRgo4xC3Oj +x3W2BHQMED1A9YAop4pJcq3lr9HKF67YvrS/FzxK7NtHC4OhnEer/f57G4RR +GBQAfFchY9MAECBAAh6IAyQQIBMr7Z/MW/Fbtl87Yoeprvg9cIZxjvUoZJgJ +K4dalZUgmBlhmfnfnbKslOudIIfDpsHOA8QY1hpCg3l6xc+Y+olxEL6kP3oR +b2pGfhzlQz8J+N3GsCvBqbD+lTQ4Ax2Ry1Rbj7bQBFN4I9LY2/ewQkX7VNEJ +8t46wtwII6+v/F2mVn9p5f5QWg+qkKdhk6964UaiDxGN2dDuI9DdZB4krKNL +E7cNhte4xRGoyu0084kAACuJW9iLFSq+K179X8p7qRTnKAjOHJdkLKoJCtPk +lpECWSHZdHRaHBHdqTFEKFPs3Mfw1+n6Z1t0g9NaVZmfJ7LqAECBAAu4WCqX +mep+ztBaH30qJkPQWFgwDuNggAAIonfWKh6sbD86O4uODWuYHDb31HbipcOO +d82Xep7I4MiQ9MNAwhKgAAIAEBt1DcX1xVRoO3Lyt8m1h8M82dncEHSzBnEh +wFiHSaqLV44VDon7LCR5bJK+0mwEy83abPvuFZ5YFzs1a0krqKkVal0ljFF3 +v8qL1Rp+ZebDI3kUm8jpBuEUSS6Gceuw8dI4CABAgAAAPQAAEACBAOomV5qL ++yZlXUQrCyVRPtv5Ssdtg65626Ty40Q4DwAAAAGyD0gYMiADPfrahja5k0T5 +ZlVuONLdX7xCgraO/aQbZNxCq8JMTTpHe0RITLa2GavTxE6qic2b6DfTUUUp +b5UTBBftJeIU0JkGjE9s7KRZ8Ox7Fz27NJKYN92Gs3HkV9BPjRnen+VeDVQK +RIe+yydPfjjAovNDxBVqM0QmXsmheFTb39H0uBgrk3Jy+an4PWxalqv4a8oB +J/i8/A/hivxR332yzN56cudCUyA7TRGT+XzRc7RuLzqNkz5QTKHJQSE8AAE3 +U0Y3FF/di4e6p6MHUOU8PGVhcJfRSf/Qd8QaYGo8wmerc8wSL8vVM7CBnLil +Cjt4MCqL+GFCk0tc756kcDSGSxJYSn8H0rm+6wA050PZDQH2D1D9+IOdef54 +qLgI+eiMdwD7aymmV9e6JmKyUzQFmiqscSoCWFTOIo3mtNOS5TDSz4CmKhcJ +sCWN6aUXmV995kId3hrtWfmTRfNNcePyLqVwgYclzmR6/el1JcKWEG4WGVBf +z2l18UvnBxBuC1WkI71PWozhA+jze5ZtqXHho5C/u2lvHcRA//t5fB46Kqnr +LXy75DgcyLFWrWnaX7uHI7asp0Wy7pyv3JqzX08ybB18KN3uoo4TgUtmG0W5 +sQlvUyJr9RCotp8EbQ0E9oOkbCi6yqFvD2O/6ZibxtbwatIztEn9j0QzuQrm +i0OmeT+8z1SNjieHKqEW0LEO5RSRXEZzgaHo3mCJ7o7oQkCZlS+1znzJZ8ht +ObWxdfU1rEqEB+RfDTAkiJBWxtHqfxZuSxtxW7mDWEpLxgRbMcBKSsIoRmoP +TdvfJ+pdLo0OPftqJHpzbmW+MKxLjuDZ+7uS7jWpt4TCOKQuL5GUuFV6xvwf +UUaBdWqPFIdOjU6atnOBAgZ4V7J6TCVPfqKyQzVMU/yZa+7L6nE/ox2pL8nm +9xVoZcTahkpcWfbFVXsGj3sz8xCYmQK3JIab/USWasnY+Nkw87+L63sW8vId +wkA1e8YBPdG8qzJLFMri7XnwQAAEscvTFpmC3VopsEwQTKvpTaTXVOKO+5HJ +cgKj/2fGmWLZnGzVUnHjZBp0uM2bf5IS9DHsuykYUqqPolJaS8vD4NJhcNQC +46tzsGaI2tBWqj2DZtCINaueH6dgAAXcDFRyBqN4BXF0lcl5OP49LyCyX9/i +XWWZ9ahN6dNYW2DmZVwJZvnI9rbVdjsIoXvE8CDZE7h86f6Nsem6ntr+eN+I +uc9A8tqBfrknjF/IrjDC+cmwvvIeLSZGiedEiaHX1JOaludPXpQz/xkqNz/M +FcyMXQt8UeAu3wRUCfvvkbOdKniIbBxfxvBn4W53IrbS6y8wxerJwomQNH+6 +QDRt2r4YJI7CdOW2DOPjrg2gx0vI++3Qe8gj/W8fvjs4zcHQk9dpLq8FkfmU +VaXW9FKbURec99M5z8NfjaGlzBMj2s06GARqk2XQzVJ57XpCoeJh1NSXyI5O +5wmjqhRFSqp4JI6gJ0hu/UFX8YZAq1olRM1N1Hsj/DK5XtQ9pkc6w3LjbtRr +HVhvMT/yxU4u225VV5i7Gnjk0M//oMGV0RumWUxCM0fefnsMLMFxH25d7dnw +31j9mcQZAAAaHQtJ29jIcKMc85MuSizxbEVC22RkP0ZZ/4Z5XKe234QrWD+8 +Ue80hDfjH+jrpZAAgQIAFje7vdBMgUo2EsoCqWFxGgHNHYjHLQk/lY0tbvT/ +GV2hXRMOMTCAn/hkkuuVe7/V8e+6wWsuYuIPsq3jzRdEuaX2hpu/k4Wa52JV +RgTkvtJUkbjoQ8pUjD+BXt6fs90aV+RFqVYMbBgwYIGCBgwYMGD7en8FPP9C +YsbRJ0+5O5rCwCrrvqCd1GYoiTrGcZMyfWDX9eGHsLdFRX5HtsB6RbwSRkH3 +9vC9sf/VF2iAcl2XRKP8zG6Zdi5uHqWADAABAAAZ6KStt1PB8LvNiZ8E4c/I +EfAprPp/5N2A/ASmuRAgwGQkcaew68TAwYaECAwYRvZdnjhbzUqPxrok3yAu +UcdBAdnG6g9HCqsoSF+Rwf1LFiCNknSgTTqmCLLBbqyo59Aq0gQmkzmidKNc +8wEPR6FQjIiGturx4CYKkZ7K+8MU+oFEWfgAPS/Pf0IsfDXez0PN0pSyCe5u +wkfRcuadnGnR9WgUYOqxD9yet+k5Qw+JO4oki7dpNcr2f051EVOJ1G0sXOn+ +9Wkf4XCAGPEvOObmJiQ0aGXM+9QeIYVXKtY8kYToge0ZecXbxVsCvZKGyzDL +wsrnw8oifU51FtrWrkA3VM0by+i4EohUaoG/I6ow+qrZ+1TJYS0NCJ0oeT1R +ThSEqxLB80Ycc6TaSg51i0fFNvMXPKLbUKIPDH8rCQf6RCgr+SvWjUREWBAd +splis7X1e4crx/1qAvogeGPk/QNnLix38oqQgyYSJX1hDs3N58YzH9UWwbjY +vPGdxrLOIqcMkV91LHZPuY0mkCOVbSB789jnQB5ZCELXFj7T3mQw9ITY6wF8 +QiS775n2Kakjf0dhlZKBSqqf2XSqSrPEhbgOwf3XNMsys3lyP+tAZ1K8yKDw +wnWTVSpC/IDy4GdrKAlElUy7twGNfgUhkIW/f+6831I2MmRwrN8gfY1pB60G +xW0diaZB1e+7uuiLlR1HM+WG6U3QglKksCbTTb9zmeaK+Jem5z846mEnGsHy +REZdBbKPYIeJL494T8Y9HUaCraSJnsC16xF04mgQUTBB+3BavyVJhcGVkJV2 +0mWbx/lG1FJQ2Y1jqBEXyOKZB8Q4rkUhaOy3TTwlxQ973FatQPzpEycc/77w +6iqYN70Yj1pYY1NLEkI6LCRpueOUqdWeXMlbnanIjbHHt2tnpND5142N8A2h +7CYFLpOrFXhrCAgPc0DeNN/N5oCYWHeV0vHUwBX7kNH51UPcIy3P0Fh/3/0/ +Q+PDf7yEwTNCg61LLafrIS/fQ2EsOlcLcT4Md2aQWukAS4Tr9Fif96kDhzL/ +e9ilw+yuLMs6gMzxSru8/NiG83LZCjbehqQ90VuUf9crBtgsd4YdGu/8XLl0 +X19xbhXtaWxu2kypq4Hgcmp2pry+ihYJbrMTSM5aUPq4DNMa0pqGuHAheUKd +ryGOvL5TDpvaT/0U4op0x68h4B26vOQCBAgAQdGMJ1lIV6oNLdeGe/BHcdp3 +FAf3ee5MWCQRuBpiuNjhCoikD3DZs4EBakzjr1nk0+mH+V0pNbS6pAI+SbPR +jrljHrGgC35sZJAn4B04ngi4nfxhFjNUGkDJfdvsCrj/r0Klhj1RBnTCE3n2 +MzyYZvi6tQ03WolquYNkuzHXodrzH3yzTF0s+lsrR/MkXceiI7fIbdLkAiCI +kXQxwsnOiPTdQQAIAEBA1/q//UwdlxfJmm1tWQWgsPpgIoAAIAEBNTNa7YUV +NeOpTXZ4ZN5ZAwS5gJih/Y/cOQ4tM6KRp0qqhFxu8SNGqrnpwc4kxSMoGg46 +TgzHtm5xyvqEAABAAgKg31T6IRRLSqtBJdypQBAgToVgAwAAX0ZGnHsb4O27 +eCBaZzt9WvMQj2ImqoaUchFHRLdXxpmn8xufHlRHDNhQzkK/OnVF1T9AOLwp +0/+xobdcYpS8tDgHoIEAACwfaYzxmwKqwir8gZoZB+1VjIS9ZyLzSE8WfzGg +yxaD/9D9hrqTyAmWpBL4WH3j3vmsacSZz9S2F7+x2mFD57Y1TXOmks+EFayU +5skhHUT8yXXYM54IUmfz075ipqg2ks9FgMOBNv2iJrMFyC2IfLMfV97KpuJq +le+B6lM0jmV4UGWqNv3d8w7NDdfCW4pX0mKw+FVVi6lCXZxDP+TYIEBhA3V7 +7LB+C7Q79u+WqOXsK2fwEYS8Q+/W4ontSUal20+lT/gBS9cg0c0/hHWR0e1c +A9HrbtbtJpjNGZwezcEus28jo5GkrJXhVJCyymip47DrL7/PkLwSeRulWvDQ ++mwGGwJgegLZqzUqfDnncdoMVearrusX5AFwDQYPeVdxHZLC8uUxw6q/NdMG +7sqIsSpuKN/Po3vWbqbgPxmcJbYUCzpafcRWaFTK2ZGc3cBvgwIBxUt6no3a +jnWZWoa3OdOnuDgL9BPc+bCg7T89zQN/SmYB9aE5TyexeTGBTMOEsYaP1rhu +jd7O9EjN7PD7oHXSQoowO7vevN7An0H57xrb+WJtaQNJuEdjQStLQJ3Eu2E6 +5hVlyOxyb1xMF3p8YB95Ly7td97WLMjlQND1JxQ1QxVY3JX7uIXf/gG9GA5c +ol1INNX3FDRf1h+64/QUOUMb+TTIUUOaiajkPSVgl5+/7LScwQyg/GiXMbgj +M3rY6ygR6NCgOrj337wEhJ2FnVnAvPtgffjB93ALzQL64T+8a2r8aRcX2oxD +DNtIO5tDmDr/9ZwIED3K81xEALuymOMkR/ox9QayV7xKUDrv7cgCZz/4od5s +XznqnInr8TTmPi7lKuFFH1wWmF3IWcx9ALZhLE676PSpXt35TQNoMa+O7wjQ +8hpItIx5+0vs3c1k4N2ur7FGz/+8ZU6pO+8IdyN2B72+wxZ9Auff/HEW7D24 +Xv9iU65lg+uE/kbWyeoiJ5A0bUqvcEKv1aLBpDVm2me6FenNyH514QUrSI7x +Bwvl8uOc6SeTd/UYVVNKeoBWWGsipeWJwqsTT7892frs0Z/UhttRsNuumR53 +SYw/XprSLrcPUzyKJ7KzxeeCOig2E6Kq6nmFI331DIu8Rg+h4EfZLAJoBAml +NzCwG5fNHLo452tr7RrprKZ6IoAvLGo1YW/r7BHWKWR6S2xIFvVR73mjWE8y +TZZ1eHBmy5uECSajw/ujoQgKxQzDVubIWn1cAAACmPxfZg/QjKfp+znygI0q +1oeXJJXTZ9En/mjG5+IL3sbaO6aUi/tGEifdKt8+bQQtTQlHG/rieh1bS1QL +MAxlbGV4HIxi47l0hdzUj9ktqLCWUrcPeXZmfSTv+HtzWplAljgkzWVte0Rf +UITl+e/8I1gq5A+XJR9ZYbvNsnO+yjKtXEpa5YWN4hWJ9cePXfUmSh5afGhL +HSCDzWp5h8c0EhjdLWRfuCzUaEIWHjBCsSdNVez9ggQIAFwlKHosDeJAFU5I +P0GwJunAmxSs/TW81EcxeA7HQIwggcPY5rI9iooBvH4Odu1mGJZMc21vaQIj +il6+S6/lmEjOf3q7GbmFLtwNncYjWQ8gu5kkQUsfhWrkzFUiQ+kp0zNGSDCI +WrbODCVFPz5UNwNpD3mP0r4kOBLhPGJ4Hk02HrYkjURhqw2g0nRVSpBJxMX2 +kWU8+q1X99LH0haPGJTt1ATWQQXDZWoaDjJ8oYut9x6kBi0V1Zc/Wh0o/9QR +4/dFgqfmRnF0n3e4Za+6JZ1kRGehKo0kuT2A3ngPk+wV2r5Wv0vF6TS87uHX +bk+YiSBzBCBCDGSL0/upo+5+xxmMwaWliqcvE5HIqE69bRoAEBujtW+1UC33 +AyHgADoAAMAAEDAABgAAMH164pFrBkSsxQSakzqQh3HF6/j/3FqlEOm9BjBo +VifCmpfj3qE7Ni/mCKiMeQY/vRB3JU16PYbFkKThOkw1tL79sLvc7jfSjkJO +xR6m5hyjvJ8a4tuf9jS5csOS1NT2LPoIFO6MiLqEXAjcpQ7ywQ7HZ/+wG3pY +MTy80R5e4LeGH4kuSL3JyuZLf2IXoNUewBCr0mVkwsyASE2XhlNAz9f7trhp +7LQ1sXKGx6Iir3w3NwQAIBYzweNl6VytSbczzVrEGSOblt5pGpchrNLgMGLJ +64qSssxEhEIh3qx3fVhwkEKY4YdZyPHrcDc7Wt3hz+QSuI3+eVOC07eERdFj ++y/jbVWeLhUcXOgzjyAS2V38s9f2nAMgJCHvnHWIBzoY5uRMt8XW9A0gqpjF +ubuPuyNTcQ73XpVDpX35Wg0OmzENcsUOUxAn0UqdZhSQ6hVujWqsvIlpBFJa +5JT7GMmbf1lU7RnT4WB3VEmAaTlbNpxvHdCWTZn3Z9pTylVpYQ2SYz93CpSW +KqPZdu8DBC+KwmFglq90Bt45PukBGZ3dF0rVJbEJGtEKDLrTfkZVy9yD6lwZ +BNoWyuh1E1vpUj6Kxz3KPH5DA1ayrhrJf9q6yulqUP6JU72L7M2u17mJdMRl +ZzBF0ABXROm7Fd9+jhN1a3RUJEyzZs7UReZohJPdSwl4DomaanBkgqqa1Np2 +ph9SHQR9Ex37LrVXhdOyB/y+OK5984kOJLRjAI9AEsetGQkCmA9sCvFBbPcw +nXtS7jKFEZAjQ0kItP1iw2XvdFeCw3+jmwKGcVgdODJNPixvmFUYqxIo2J5T +ckyE8+JZT8PMeZQ/xkelTmD0W78gNzP+2N4rbmnpnWiTHdEg8Tg1UZxo0PbQ +wxiKxHH5dmKMeZJbkEBUZIN/r4qY42/HxS9b62jpi6w41cZIR2TLrYiswkPB +6VMdCqJCzunVYWYa1GhlHc7jiqSX5yiTwiWB8gAEH5ezYdAW/wxFKxw31iEe +JNVd2F2Isu7gh0r+4M+6SNvNiGWf0drlpYZUqqaL9g5ARva07rXZ3q/7UQAG +t3bpwg+Zsr1Arw6cWY3XM+GwABCtNnAzmf52OA4GcptJ8x33qfjXgpv4mGZ9 +NcSZMU2qVnVkwFQXk9sDsZMdlguUb6Ho9uSpZtq5QLRBV6NCpOavuqg2ZCSB +3zapkLqUNTL9HFJcLVXRyNPxuh4QcvYZ88k+qXev1PdN5/3V7diACbYzyWKD +ax2SBAgNy/uaGTnSasygfdHe9tfVFEKW0b4a4I545KRS3WFguCXgx7/nDy4O +d0wDuw4vvZK80G/ey9x9/RN12cy6Gw1ZwAk3FL7xQPpgoPsXo5hlb8apBwIC +PZFtzoHmBrYDIPLeKEul1NA7vCQ3JaAgQIAFlucXmc9tzh/QES/xp/vC8Plx +codGT3w3Fn/lERSQdqUd+Ax5WQmXcOrCABPgwAR0sXsiihilrPyejotcSQtC +zaopGQ995Tv/wdzOTP5z6VIAAIAEBkmxSwHroZ5Nqz23vAC/1xQuG8hdUYUT +VfyFsuBlnvCpItggQIAF4bpWh5roGVvhznRayfVzVuQxBTpHKihPtUos5SLS +jIsa+oD2Vp62nc2lO4AqFVTKXi+URgEgSdxdEcQNT85C4DgBAAgAW9+31vzB +CyOMe1LuAhF/9FwNBpQgwR9XxeIRBaqtkCRny8PwE9JTXsBYSG7WsuEp9wAA +XzVYrcGabaJLB+9c7Nn7VILmIMGgInxXHV/6xyLqtAiABiyUY37vcc/57J7D +Drd6QCoMGVURU6iULtbnZrWg5+5bRp55100SUL0x7+OKWhx0LrT8y+pxu/yt +fP0TaxrLDqvXX8D/KD1iLuK4TUU4g059HX0bhcLgZvmT3zp37/8AENyCem7s +OE0ktpcI7CK/e1V8JITTwOp7LkBdzRiFyhC2StRz414cVsOkfRL12Po206GH +oSBwQVGZHvNgrMiQTMPd/HOjRmZcw79mqOJ6BTuYYZP11GdTZg/R/MreflJN +3KjmFYRSuVj7sevtXvLRjWtqQtYf8QfNoYyJmPMQ2mXUSQD84Am9p3cXlPr3 +T+EWg08C31zwrtEZAkqJV047DYA5DMXoQmOTC/JyTmQoOaGmC7Ow06lYjTwO +Q+EFxeg11FobtAC/xOfXVsY7CMKw4EAHdYQEACvtPJjl2FujRAea0gfgzrsl +BcZyI5cjkIrKKy+JAystS5WQZVz+hkNud0Rq91JirzuR89ZmLnUV4o3R/k3c +MaLcsLvyzeTQgK2BgAgPxtbQiN+bqcR2ly9Oiq+SyOSDl/bO+g5Wsj0ctMhv +pU23T97xQjy0hbdsOK6Vv3XE4jQrfJt9SCg1rHUrYs5qiz0VcRs3l9uY1Th7 +gW85NqXwPRbbROL/E1K5WAqnYue6Gl4DpqFZ35TerPMNuOK3SMzYeLAcAkmb +e5Z/aHYMbmP4ZewW93Vzc85mWoU7n5f4cbi1fpPmy4lbVf30NMyC4bqBUIeP +pD22L9Nqo3waUDrt9M0eamY8u9dtLm4AYq+bh+V7+u2/eDcbUXIayJoWC2lQ +X4V/IMyZPysOLfyeo+XpKKBRnHWYmMk/KgmssrcdbdO/2XvevrDQRjU407GD +riGIIbPAaQW7rJhO8hYRKLcCCOZUMEBBPy6/BkFMr7Bv8LsyQGkV8D9jp8aU +bRl/x5yDS9VXi6lPAGeOuYaEM2LKioo6vGCYxCw8b+qedP2ZQ/6HndmSlU06 +Dawm3yrBDYYRAcbHTUbMX9wvsYQh3kf1ajADW1srrxqrouEvQAigKQyIFsh1 +EZmpI7Aa1ObjnLZyQQtBav6XTmrhDIm702peDcKh/Yr/UPHIp3HGYpUUJLd8 +X19rI6K1wBESWKTWWrvbJqqABMkuKK/tC5V06lKB+8wBqwVZ6SHwo99lWKHk +s5EpsdOOpNNvSELUqrTM/CYucIK7jdJZ2obqOnpMIqoaJPC0UrmHNKRnLKh6 +kfbnqmCoPExa4KzULNTzL7nOViQSSOSd9xtX9Otyh56iDJNpffUYYgjBk9mu +yJ7czxUbwlhjrY7Va267VQb1y0XpVfm/ZG/XrM3RitVYDX0w4tfHExyadyq5 +p1gcNpe9O8mcHMFVnlj1EiecLZJRdCnZl6PTRx0sAFbml6vqFSLjgJheJhvd +Nf8wSXuxHWLdE57FDYZkM+EciWScapp9GsKFI4fS+yTLM5d9jFHB7s8c3whs +jDy5sFNYpkLX/7rYbxtRct6Rd++VgyOjnOPd3hUI1sdadksZcsJDLEo1qf4Y +jtZQ7wXuAFomqQIDiRGE3m97aN59yoa4ugn3iucNUIsocnYWP7bjdF7ddJxI +pacJaojplrYSYlIrqeVeTDpl/aTOZllmiaqUTcHUGWiK/FC+yxD61uj7JQxW +pDsNo47zVELTGDk5v5SIwkVOtSb9TUtdYVJZU6bZVm8tRdqrHsX/QNvNhkqX +ZUFULzRkIpMx0sWw+Jx60tc6DBTcZ/OXTfkD0LsqOM0/IB0zSA2taqt4zp/A +353vqswqFGJTJqABItdzNaF4+h1xTl1s9R5SdPe/rSRm+zjWt3m7KOZxet+s +iXiLmZYbVzxGdGObi5dDnqg0xhS/bxXJOc1U+77SULINjYb/kRcsPwiIuyh8 +x8IzTydoWqiYxgjIf0iLJDh8MtOgvOSjmMGGaajc9Rcu3+0wmdAJmu9dtqgf +1tt5VDjYDZrR9fB40tyeDSymcUJ4R0Muy/6m3E9FGfvhnsbABAIUVnVk4PId +jDDpz1tHPol/oEju5fzeK8d1i6P1/IOS8fAtWII5ttyaOjdSbHEEBwTwGXb/ +2W2YWrmcuf4MATN5zD5scxAuj8WjhRLSqsJRK6R/uBiC/c48a7k9BxdnV3md +3wob+UjO0lbxtz7k1efX4/pZba9U46+orTg40EAAxA7cXUu1SmV/O36ydgo2 +OCZfSROE77cIb+oeCIf6cblNMTYhbcSDHCBJEY2VLrRVaiktLm2d/Pk/5tKE +kuxPIpqr0D5QVer2WBPxJVbhnFAU2F1QOcWgYks/EILKdd+Ydw392ZmzPFIL +enZFHCC34CidWCme7dfw23pq8iaV4rxbCJtY7WtK2XRDMx6Klt6I6xS1VBfX +OaKcqAdEl0Q95dZHqG1m0xMZxNsanBePM553Fblicr4xhsQ65qBPJUEDAxj9 +YMW3yjOtI1SrSZ78DfIiXKWahg0DfaADHqZsZVS/SRc+HWUYFxaxrGsNtTqz +8k9UD6caEGStjXxEqXRJfAp9xGtJCv0rsSO1aAJGbE37k4cSFV9b0O5fbPrk +Rd7vsmvkJ5ddYDc9DI88oHFpNZj+af58069uYx/AKPuP0yhdVRZlPTKLfT2Z +KatFWWUrT0AIhDjIeuzWUnv2AVjyUxS0qHJHkw8q6LlWiUSPvKhzsCDCILZ6 +wc4RMvq9CVJA4sutaiLLENXdcq/QoZTKS9cQLm4g/R5plKnw6M5YV978KNdD +yuu3gSuAtE2Et6lbfUof47ky8jET7LLekA3gAAQAID+xwia+z18Vua9rzj4q +ouRcRPEU7bfeoFdH2nXm8GYtX2iVIbdv4lRHIMY/UVszLM9ChshnDzxlY1M7 +I9iTEKzDcDeWWuGRtZcEU6unAK6xgeHIfdgpUyyeeDX9V61w867DR8JHK1M+ +sqMNZ8X/RC68MA9jYONkT7Z28Vbb78s68xI3hVGfHjgoIl6BDGwaSFgFORwa +C9seNYxYFb8sQDJdj0xuDeD72sAFWzWjpEGR1JNzIwDGPu1q3kEwUPpKdbho +kepjnKgWvXIjTRE1l2aD7ebPyBouI8nwHMGhhYZAOhyKfpEkbQIR9GAFhcTI +Wv9RpItMFm8kgXUrkG4aXfwZnR9khYiy1A/y+IZtAC69N25vtOUfHP+Y5j6R +53xGcr1uoEdQ+DtUiiaxpGhx+O4htRszg4l4aFSPmjGBXRu9vR8WSyIx4Jpq +5ZORtL2PTkBxXa1UqAztN/x7JvXN/vzynWhBwzUb4oPwhiJlpv5IGZr+k3wK +y2Su5C9+bNhDby57YMLxquK8ybMdM65NgUaPggosxKRzUiv6NmhPEWWKysFi +xa+npxwe7egWo3LkvfjGhYci3akgHgAAQAIAOcxN7wc+t2e01AILKar9nXq7 +Ar4I31R/2jvug6njIJfRYZy42N8GmetUUUaZ36vo3eAB4OD8xWIF34oUlYp+ +r0yPHmWg216tlbeu/Gs8HEPa+uvBIjdJThexMMvMZh9VEX8IZeWFPkuu5gug +AADAAB9kAgGk576/i+Vy/5a/7njPF9d2U4n6nUZ2eEFR79BZUVoohCSSTU1S +oQDuvX8NqPHf8+dvObtnMfdxh5s+B0+37tf1PFc+igHgAin+L/vff2bN/9vO +wdn0mv8J7PT6v2P08zcPL4+M9rvm2+J9V4pQQIAADiwj3livGQWm+sk1wXhK +jQxDyhPvtqBfynAKu1uez5nQa4pViWoIm0rsR4EsikDWjQl0ylW4SQYktZ40 +rrBk92IZg8tc7Z/zcc7u5ExTirUnRRjgVA/Z4lScDG4azrA60VnMqoXdXHAN +50LOIBRlIVwvltIzxMnojnzBDAA7ZL1PdUsdsW2JV6pm+/zrNLKFTn+Y/zuV +ru+7FZXB2pN5zSXc/Z46ZM+i7RJW8zZegxt3SPXnDzHzQUedptk4T5HiUX9t +nu4cXuep9WQSn8M3o76OEW8XHL5ECp2B0H2y16lu1pBSbkN1Q0Rb5h3nwt+Q +/zWlijDPfiNUpmo8xxSPKsMVbU3sGGcyZiy5LE9cYdqR0ZKfAsYPZRfhP2iN +8PMej4gO4O+obYRGRBPCCsG0eQQ/5cDCL//d/QoBSK3g5JqUsONCLIk39sve +tRTA9dVzWzaSkVRPOxvvrH/V5h/KjNpUfAvLoL6yB2lyagv1nMa8WYtyhkR2 +9WgtXpMIb2NtAG6l7kwki0TONtK8nmg6Da/dHdkdOfvHxjnzJJFvNaRmeNOy +QiOoaVuFvqJdWyWV/e72pm63ZYYbgI38sCXSbQ64/UYy8i4UmA4HQG1JsSqY +eG8mCPzG4CKPpC6AWw1Qvy9xJuzc6L76mJQU1mTJqwzQHsPnYoaNb15L/rYM +JXIJDtXRNHzn7xDKvXpWznk79tixyLm23WSupsbc9YXtpeKSSC24+FeI91w0 +WHh16o6n1Ji+cp9Y0Zpnj5TnA8xLgq/y1KGWTFgULf1pQ7VvsdJHRgrOMaAR +wTRta0QORkBLsd8a7Tp8wVRQuA4j25kDapGgpqJohZFdCp0VI3xgXGqhb2as +3dm9Jqv1g+asm/u/e460n2IesHbfu8iv+TZODkFWmYg1f7VEVLFPvq3xOKL+ +fqmMJ9lSN7S05ZDYzN2TVliU9qZAABAAgIriS5d/714NPHjlPfLWahMqj7re +g9pA2dTCY+Ykf0kvFgAADVnMS5REY4QLtiRxtAD2reHLxdL8+qXrIxP3gT+W +LpUQolEs7dLJ9Y9PZjNXREOECvD1EXM+KTVBoSgIBm2CZXtvE2Y4q1y8iNJd +g3Tj4nU33ol6tv7PdoRAfbbxoP7FdF5fM9SVwKz9drESem3Nb4keH9AB2wFu +xeRLrEEtOjiKyudqgrTIh3APbg9QjOVbh2eiY13+txiFh5BYDLvDLANitP+n +0ZRWly4wd2153idqsfwJSnZ6VJnzNr9RAqF+xcglTUKBCkAZ8SSBxZvkngFB +DCgLPvgVjH0RAXm/MZaY/v/MTb5f+dWcNoybd2EFvXGPKZgwVNLFxVpuKCAy +3yk+UKqFTn2aJie9mLYIEA4AAAALmVa0odjJ4/6SzrzYhJvS7f/gsSh/a6se +dPNGQu2l6GbDciJwYF2R7mqsIkfScfiwIEAdLudTzF27W+mfG7y5ztLHkhkM +k1kfjnNlYqF+8Uv7s1IKPlsG83XwnYnesu1KzEO75y6Kv2gMAUAfTRWX9739 +fs/Oe5/DvPtvT/703QHe4+d/R8+/H13LySSSRN0gkEWoySAyLrZe53jFsAAE +BIS6DszgSMdx244oIcA6gLcWW9QbaA5LXNa6EeBmX1hFzEBU6CH+0hurv5kZ +AwZECABAgAT1NoqdMOUdLw2Yp0UznN+RiyHmk9EiPP48AAAAAPgAgQASAEAA +vq6CQOsoRR1gBjAyKjjotMuDZW95kAD1tQaP95c0+1TesN1g/GDOM731hWJz +f584Ylc5cEJUT8xjhWOfF7oC4CcuUdEvgh7Pft4Pki487LinycelYsAmSbTD +IQPx9SmKqa5IxfUq1R+7mupybC37uZvPWYsIoYqMxv7jlpoAZ7I3xoVAE5TK +lme3iHdCQlr6YGR2ZUnVKI8apumjOf3B5ekVhGB12uCTrv8FcDOBhDZqkVxL +TyY26z1OQfpUw1AJSsSLePn7TecxYikhd7kX+C7aU5OjrjSeSSGCE7TdKUXJ +OCyFocKX/DkmOifQFlKj27SDmy+UUnhgSTKAIx1F0WNra25l12XsOYPGN4Ya +pkF4C++lqsUsry9wbc0YJ+enUAtRqBmycUnrsmbPHFARVONDroVZZj952d1I +UAoCZ5l7GptdgsdfHJ1RlCY6bQUrB3B/Lvp60MrM0U3dG9KdJmJXfrjFgyhD +N9qhjQnK4eFrWBQFMTXjsLMBEEYApcGACASLLaEcDPVz4qevImhKcA2EPeft +xe/dzDJtxcuz7TRELLFxXujCt5mIixNPhBCnqG+6gBxU7pVVhlOLQghYjjDv +JLfy92GM6vqFaQ4vNUadnctvRJKUrObAPyV7fxdVzJ1owcJbvC4iw4i/sjhi +9w/etBJC3i7clBwD+ZhKo6k/9ypg3C8lnP4IkL4e3oWyr1SniidrV4h+7brU +wZ1shgYW/vyYR0OTUWvv53SOwoRgjQ+vHw1qpsDPs1JCOtu3t26wa0RqYsYP +v36tLhqsmWlQNyaL8EFANVi5H8eFYjW3mzr/hdGVtqwS+Yw6EQMrK0jBFDHi +LvlrwVlyPj1T9ZeVzzEigyKuqhE4oc7mFH8cQcpZxbxMABLVFul3QferrdSC +BAZMiFOX+63GACnDxTtw59X/WAM7sT7jd4ZlKDVj0a4c3DHJxTzxgAtVkNsv +bLBnuuBsGCt10wzi7CvYsCmp5ib6SmcIdgMAe2pNWf+1COsbnjfU3cVUOYzX +bD68z1zkW2KpIGG491dpK65ZSqDZk786wF1hQQgKl8r+KyYmBGyGmojXC0Np +74Naj7cZvQxWcTal0Ai6C/cL/I8z2HMBAmEAEDBAK/7CAQFIcdHXFb7i2Mhq +VuabZinEAN+EWb0+mmGootSkW5+JOjGC17AuC/HAAQIE4qYYn03uLhwJ+Hrv +ZipKVodmwpvpFUWxKn0DNzbpZD6dvEPIgABAAAATkatZTUbeNpbpwvij9f4M +kVLLDVtadJYOpVkWFTtwcu3JPpjs5QhHOtkQibufguP0kVxijv/IV15rUR1e +pmVkaz4p3XThdvivaqURuZ0GJGEQC0xWkZGjiuihU298L9JHRq0DG4XYb+WV +owu0MARSqS5zLV/GbuEuz5TMA/+KPrJSAoYQOcECBAAlJqKT731Lc5AABAAg +IclUp+tdPE9E1YZ994PUQazghxMUGiyIrYIEBGKoN7FRS6ABAgQAI+qxqCiQ +pGgQHQoM5i1qJSsFcdx0QYJhEQpwZL1ZJnOE9MNYSs1RJ6GUDAf1Ywx4/5ZS +QWPkuQlZa+CslggQIAFcHMSlRoPiBOBm0yet3a44Hl23pf4E4HG3WxWD/tPW +rDWq+nw20ja6CQECBAgAAE8AcABg6ZDL9cRKITZplAPtNyfeOYWhBZXVEGbL +605+EvRXKaihCPQzYFzqR0FIgmBslFNBQVCgagCFQFZHu/W8N4Tk/8/N/Bke +SrRjQTVgJ7CvCed/+HmYmEq3qQBznMki4paG/yhWtEKx6AUgmFOn8grXYlTY +ECBAgW5JAANoE2Tx/MafauM57Zc/2PZ8Pu/09l+/nijnvF+q7/3XqOM9J8r1 +Ha6bcfpbCCJ9j7PNaAJtmirjj7Co0tggiDFj7v+v4/YcYHSTZ0ygsjdEaJ+R +7gsfKbBhp0FPZFIDryF9a21rWI3rUH16Xqqc501VJepHaUxrsdD7xMk28rfu +9yKkaGM6or1fC8VeZaTVywizuPSz2ziEfYpIjjERomhbWLUFICJ9hTCKq0aj +3MO/Te/FzAGvmApEhdoxJgpHUHsLjxwWtEb97Vi4woyxaDLypC+9h5GbuHuE +ecxHF+cpv8Tw5UCzxq4mqJQ9kGOFPswIS3o3pLKumU3Wre8mgiNeOwKbpUH/ +yCNM4+mhIBrw8YkXpMkXz+GNbEqCWTrBi8WGzc81Lx+lqWQPLcWnawqoduVD +u+9DDPwy3XhT1S4y8iEYVlZ/n42cQZE+PmUvnZ9VTk1jl66PIKvDeZcxbOiX +rTZbrf8K6F/tMKWy+rBoNEAROhigEioU6s8EYOCfOn81lvWCWNGUEqt/3y11 +ezJ0rdDRWraueZ4gcjJf/1vUx0lVKXAqFggL1ScXnIKOUwgmSKVd5x9kmQD/ +dn6iT9/Fsi80974yDtlVCo/KqI0e5JNVQ8/yrxY6+n8Edn5Uwrsd2cpyQnSc +d/NToVorl9/Q6WkNPwWqY9yAaQeGmnOdW9JGlMfOr9w+g/Q5CwSFtERRlFgB +yboavDsOlKq7iY5vivoiynZXJhZJuGS/rJpVwFYbOoP3ZBFAcTBbkCgcr9vq +NouIerCDmb62Y8EIRCgKWlNFMYXZ+miL5lRzN9tAt4knmeirZffhUYPHjJ7Y +40ZjmbpUtaDPf9y1YoBcwMtyhXFHPL2koeAKp71C1raDW3/hJTbq+xNN3Nlj +Ct/JPw6b+3azz9FsgGgIe1Z0XWWg/zYmXf1aBQP4am2oziBSjWxpbN0mrNTG +RfHizH+rzhxV6Wpq/05zJMBZGU0VNFuB9r3uAIDcy62CtgUPUId2R9n9cJU2 +jPa0tNmT6m/OeSn4Ypf3Am0O1DMFs+SlkrGC80aDwR8YTqoEMqFLJg93LNAA +BIA3/DL1qBkQOu81z2Wl3oCbq3sNrNVmPsvh65MHCyx77VVqpt2Zs511NO3h +vdDfqYpj9AKd47NzMapoSeruNr4VA7Z3zStfxY51kfwM9x1nTFqZjC1kgECB +ZkNXh+56KE9PSmz+kt+hK+m+PwxrfwKNk/Rb1UhGFpvgvgWx+dPv98TYHiK6 +TG+qWx6aTkRnSy8cqXgEiQfy38oc5vLkHxfbcdnxNoJqrbRdTj91dqhYDOEK +7R1ZayjgeHloZ1K3n1mr6hG9PLWtX2BlgfNvdf7/nTawvYv5rle/HdyUrNXP +iyaKVcHDS2SabJ5DLAwKmWvdDH6cdW0Ym1MA/ebQh8ECBAAqyO+mGkbDYBv8 +CgKwL4+triLh/R+nk65MF8ees2X+qW3st2zFH6O4Q+lSiAdPcQUm8/jQQmY+ +wYAIFuhc4qWMBKLnwUplj0WY389OWP3Vd3a0KyOzfDceO6FNnNR2eulbwODz +0Pitr2WK+H5SorgBChko6hjs5r1qZkF7Vnsyn0wg4aUbgpiCdzYJia8pFvvo +wds3IbS4rmR4CyUz4vQuDOKr2fWJfEAEWR/UZ3xPSxswsmgsmAjRJecB+981 +ed/V7WGhAbRYtAiLWM+mGJZFul8WV5J1KO9f1IceNCLQiDZQCCjpCiUtUOn3 +fLY9GXMwAS7AN0Jvkl7MQymk0u9fjeVTVROnzpPyJ5j9MKlSK5KL5s3879Gy +oasnS66Mr5vMzpPhlZEsXz1glf3ruR+30Pnsk7Q26YtXlYqTBKJ5KMiGXEg0 +AnJmomOa6dyGMWLl1GdllHmFCXOzC7oaE/fDdADGKY/36lGqomKionQd5t+f +8+u3YU9+R2NQIUbxO76wYDehpGQOj7yC6XvbO21ESOgMzwsT7ByVMmno+LcH +spsYUtiDRq8EsfQ+Esct4wtJM8fB36D5sC+DVH+FEmMC+wsvLy2qD5UNY2xl +RqYb2Bwsom1m+O5SWTsvz6//F1xnWXjmxmWmqoML/p1o2F/zg1cm77IGTYsU +/xTGbo9i8owx7zHqqdr+MLV7CvdFFgioL32HkPnXe8XwCm1cTshFBSAL7Nmz +9fCJ/ShMkVSie1hrGQ1p3uTaj2QN7APrNEXTPLXpprVHfJ2JIY0DLFPZ09e4 +pZSYdfWuP14aJyqrZ/qzIrK54AGY9GmKG1GfOX7rFia7fWRIK/ud2askmLbZ +Zums9YO3cOOpwp83xe5ovPLHzcIHISryYiimrMFLLLIX+KuYp5levugusb7j +OuiaFyeaxdQnszy47XCb5p6t002jRewz5k2Ad/0GWN5xZ6BJKqe89xY0ex/o +O/xlTQ8n35zuD8RFpvIyGEV0g8G66i8e2vJm82ELDLqNfbcWa0UJZQuCWqIh +iAfMvnZ9IJcLHaCRS4xyPNTEiovNTZIRniWR4/rFCNeBNYZ0y+QhV49piWnN +3VyMWUQvroajds6R2V+uTThCbdejIvyr063z32/CpSJ4crUxJix29jHszN2t +iL/y8lsHZx6i61dAIBpdttSyEM2QPvYbeC3dccui1+qVzT3FlNVfwExEtBKY +aftzj3MUqJFD3218AVC4d7V12OhdAg3zhqFte/g6Xu2Zr6/XDzAIEuCuxH+4 +ORdUMTLmbrSawgqbLj65DSCOWCm93GeIH7hX3yHRfntvvF6/IQlzCw3heiG9 +kw/rkIwE5nLpj1Y04N5kvEGGk7F/MKmX3WDqqG227qmgfFmvUI6wuk4Qcvci +jcs2cKB+b17PJqD7xk3iqV73gAMih5Z+oFQD9oVXDuvV1YcvPuFdHhDB0Lrk +v+56C0d3q7IV7Z3bfKxaygJsDou/3zibwJcB5hRFGIBZXiVGVOJc00aSRvut +i4noAAAEqDcW3jK3EJhelDMzrcdAwFx1aa0KSrhQy55w68O1kAlMr2tGPjN7 +mgO7tEqqG044NlMUZSEFgo+4242qgUh27TBzbRU2QU152iXNYpI6lbxEsZGX +OPQx+sAvS3v7+RRv8b3m90hTvMoq2jfMJfvnecTnlWtHcDzhgDimMwhtKGH6 +WvRhxrhJ8kutoWJGICTLxiRI4nf3X3woMbdjr9DIpG4fHeYq2DDYOVzuzNnf +Q6e2wIP8U4bSLeo4MSJNU6pyhmiA3rtVjP7iruVTFly4upbqdbPS8HhNzrzZ +N1RjPsT1xkC67WyKXxwiI7J5K7PHtMjTQxQ9foQoqd8/mctE/H0EFSHMum4l +3eOteEJwkMAIYQ/nqOC/IZe6E9Zpl2HzX98fq9aqbxaZlSbrrC0N2x/MJq8o +iO+CUKRKiq6AI9lHoE1q+relQsUojHkQcrtKLP9XkKguhmN1dfLUIIPz/jmD +/wegIcMOp5TGo7ocGulw/AUvT5Xu5sQa3/W5EA4lBmD9zMP0vJ/c+1pTb0O2 +xxvM21yc0783cG0L+Ic0K8BZ5OXmK+w5U6fIlKM1Pb6L9ZzfDOT340H5TXq+ +vhgc1J7kcZ4i0xb2q+AU3L6/QuExLCw1CdGhI4mpwmW1R7krhpeM7/ARfnW3 +CiTJjU2LbB72pD8pNLOvYMSaRBppVPOQoXuQkO2qCGjUIxcq5ShJzPbo8K0T +ISl6lJEcdchkNd4qVZ5o9QlNzt8YKfEggZPCLO/IrC80ALpHsa/sNxRHDqup +p1xgVlVWDRjPdEkC/UqTbYbJMJKZxkXw3yS4Ri0e2F4QIfMYgOLGRRPRfNpJ +ARtTF3okQ7e90U1RV3jji4FJMnyPG6chyhWlq8IpiwKBeI5ryjCePMGy8DJA +VwyK5aZews6bcErQKFxJ7UGPUYF37LBHRHbLED66WJWrGDH3+KUHqZG6cpkP +eJTRLJFQ01W0Kf8K4qLM1ZDcXaFyFxX+GwaLVvToMHwRUsadbKg/5LGKsB5N +9GexuckoFXQtlKHQ4rEqStDZOeGBWJDYwbj5C6hj5tGg/wql3/KtVj6cFU39 +QFS0CeYeccnmFafTqYQ1kY4vIP7cuq8A1WgGOd9bLCQMs6RPxM1py0wbbwl1 +WxZ6sRVt0+xEe8M0CSowUGzQVDLYRFTd3+2yO0X/AkldB6IsFXyKwvZHSrPc +pCumJ7Pr72FVdibOTa7pmPHJZrUmV9YchlUXlfK/s66jnGsR0/AAARLUNWe4 +TMsnjCjzdiQ17akCM8jS2KEPERpOIqtK+p1rkK5EIfDIKqG+iLx1zLYtqfud +wwT6J1KYMKIFm8rMZ8ULN72yJ/hScOVhVn56WrDJVU3EIL1F3dG2b6PxSCFh ++xcjBhp285AsdEjk9DSkrFku5xRdxol2BbW2ApIo8LZBTdEmrWWLGq5chidf +p7eeW0dF//qVBnaflwPvpXZDihOqwi4Kevj9zmYTedqVVzOXIlUaQDcIRQK2 +m5WFBgMR0g2hciA5vq2Lt40AZmb17PUGFaJMDyTc/qqPs0qolmAfPjwGmUSs +3LVRDhjrkZIAmVPRXJIV6uChC2OHSwLNEY9QegD2ZC1Ho9LtiDh+8OMP8R5n +Mg9acDBMTAuCLnXPRs3hvm+DBqXRb4HtRL5o7b6NMAIst8/ZTmIuYeEysMfG +N1GU0oQvbPIBkhJbxVJs/ew0F1+KbM+6tyoOZpCgyDeY2BwFYfqyY2ec9RIW +BV1wroM3ALxBo4iSmf/+eeuIzCXeedD6it57nB7HDCAiHu4o55NqZyn8VO9y +xElnGM8zyArsBAgQAIOyVVgV7nwl9YngypYlvaNf1EhqMRu2U0/3rcIQFAb+ +noNm0x97TIx26GSKosdWlHCNJwA368Fl8TvhLz7onk3L5t8/1HDalkV7OAAC +VgiGPCJv/U6wCL3cH0ExU0r0NiVgqxDuDGc+6aspgSZCBT7aeP7KX47EqwMh +lUY7EAT5BuWxw7WDb4qUPkq76uZw+qICPr9iEfWPF78er20qVIK+AKXvhvt6 +w2JI7jDs9dz8R+usu3oE4UDJVAD2YABgBgICZUc5QSZb8Olb6NxfQJ64Rsb1 +40SOzDhiKcxwrYUFnSqjEXB++xBdNhhaR94bp07t4/yi0Vc1MwuH2FBjqq6+ +GLPxBd4mHzisjLQwQrh1un+M+hjD2txmFYJkP3XUo64h6retIn4cRQFSqsak +8kIVDI2kF2e2DBh7dnWwFV7UtdiYAt0svyJJSZ/gx4o5TAbhLDMRF7dR1hK+ +Cubsgju/VsEV7yqiW3aHzqp439SWQbku+ZjB0xvc+fsexXcPgS4HGKs2Ivax +zeqAU8QwnIuJDktBO8tLL3aRiqq//2iOl/HvR2EqWjFgKu6LpCfq8xV+fBXj +5j4bZ8aea+9fXS8QpIbo7LXP0SP32LdYWfH5NDohJRDBGP5spQIRMUYGe3EQ +dI5OKyUc+emoui92g7FKkPMoT/ASr4fsh8D2WMT80aTVor5iptUw9Jkq37Xv +/6FW7TmcoRzbTTWPKXBCOToYtxdK9oDzyxrG7ckay95xzN3wx7z8jBT0UT+7 +53iC2/GPEFrEZLSnfe0MqNNdZk6W+C4Iu+ZlCcgOF+FE+M8CYjkmTMZO4DSh +y+rMJx/Oxtvhki3bz7+ODGv9EtU1QharsCdl8iJaSe7XV217svQQKUYvDwgw +1YG44F1G/pbVknvi42fT81jzozdSl2MokdL8wRIs7WuvoRSwfVMfbBzZjIlO +ZaYjt8mE7eIfZDSuRo7E8acT8vG6pQRyeVpv+B5huewaTS723WTyY7a4EIjX +4rS87lQr1weYYWm27fTQydSDsh1yTNkYTQrGwKAgzyAAXr9SuCrDyx+V97ji +B017SKtBoMJM6AOk+CnhbJ3g0fEfiDs2QxrMQnf94JDB5utzP4rhhojNJyqr +X4p2eK4wsax4dqbYCMiWd8pAm+BGqhoF0QfzwtO02lsLyuXX9SQ0C9enKtn2 +iKHHgxGoTv37/cSPb4dDvjDjICn3lCjNdMBU97KrWdb+3zipnEG4I+lP/XFN +8YkwQ5t130+5MHuDsrx7902jkqKahpsir1p4N/b7Tp92OUFVYcvBffNQDxsU +N9QTGzDcT5CsdIVRUxTsB2rB5xiqJZKivhqIJHJqXdfCGrzLdkld1YZTzZPW +pzH13PaRMJzIWHZl3sa0PMvfe7ME7Tle/4uorAbOwxlLvve/RilNekSDLQfs +VSPmJRmQPuQz6xQ8xAAsDPGjTwwAhBwQeXiJvYqSFEFRgp+xPq+yyvSa3hvu +onaLSBw0xUDTSTnnEFqvVemQTRpFSBEJ9hwomN8w6f7ZeHaDHWqzgn/vhFJJ +YXX2KS4sg1ygYXgZyfs/8RpZy/aHJaw0/9MtcqyzyAEQkfYZ8qV7MNnez8V8 +MUbzwEoEwecOEdoHiwssZIGOCxpkBJ+agDeKfSrWGxzefaxeR447fmR6deCE +KFcVyxJMOJo1jOXOiGSv0+vylVBRmpueBgtEg4EQFhGTB4tP95lu0MkkG+rv +Sd35enFEblBuajBu7GNmspQmZUhEoqxq8anNngOqhR3YG8buPSHlW4+6wni0 +ih+PZxitFLwWpxwQBXxLjk6X1IRTYSho1eUetGYgABJT4VcsSnQWW67Ritdl +LLxPpdB7wtZv7auPgEDKcqm1+1eIRc31gSZZ+MDLXhesE6UAmZPhCPAgfv+J +4ShSBYKARkmhMVsDZvWvwfTYq8p3L4JnLQPCAmkalwWvmvxJvwunVacpJosi +zCEWZh/kIwehs17MvLiu60mbEpX3wqHwxaD353gAc0VBlAADzXTBV84d+gW1 +NJ/MXh6zKarw1X61kczFJJTErV15RzXTvYpkQrGidvcNcdEPHS84lRBpTIME +HGiuSVVguCAAfgcN9/51ZwW8INAkb3qIqZ6jAR1Od4ud/I4Vl3gk9l8EFxQ8 +oU2AWgbCtWtX0cGWzo+Tx20usftywujpSYQ09s+G9AhjoxxdInr2kXZDvTRb +xO0OssQqe4qyCYD6NhJvYoaRX0MBVlU85eQ8NDoweqjw/5pkA/fQMKuz75rr +TepbctIc1/v7IatH3UXk7AXuhJg9f0mBntFzO7G2y06hQCbIJ/IBAAK3wMTE +9rBqcH7X64XIaFNzeEQblI52gMaNkuvNEbHB1nr4xDXOdlHzFXmKUE0K74oD +6dWR4jsLYx917pA/97c5mSnZ6rdhjZVkpS67uul/a6w6VVqGOlSPfsU9cxbC +XFz4/DD1BhyBThD6GXQQGk/jenn6Yex9Ar2+lQzI/G59Bn7b1VY295cb7ydH +ctmPXUHOK75mN/9insOyR5qLynTOWHNH+odb2cABcVr78ObqWD3BvY5mj97B +TkUob415W+iShZ+pjDA5YmzIBuZC9JrZZbQ5rOoj7LDm9L5dGX7VruwehwPo +oUCp8nBKCtpb0oFz9qOFicNiW/UQW4ZBDkQOgMshe4dEUep+Qu1VfO/Ff3mk +vIhMsC08EjU5/ByXItyIIXzlwa4Nbj/Dc2S/aZzFgxRIJ6eoR6UBtCI4Mfs/ +Orn5yFs5Q2yaoB9XeAhfzcYJM1cEmlChw09JTenGDftMKgseET0umfJD95fJ +eva8OtKWaVZjas9RY5IiPnyozHD4xY73Z4NdQblOa/HKUJ680sXKvwLSKzhD +WZ9C3cmU1LUtKTGyFfZbE+x2pvjX/Bw2fMrFpcX/dq/eqTG6icQcNSjLBowI +af/QgHKEIJBxjlZgpM/B2/u+tvUDiTMxT6VCz1VkAcsOCpE4gnuI3A+bVwdD +6aKeHYoCAdFe4zn7KBQifG4myl/BkMMH6phhAqU7Skg58jWVKKr93XovuFyc +Qq602vpIw1iWE14to64yjrs4pFIQIUu46FPz0BQDS9JMVpSNPPxU5aEzK6HS +81VNFFSJcPACc5u53mkPpJ9am8pzfzgud8r5eGLybNGbIRmDYUQ2zp/OzzeX +AyKSBw+Kyknvammbr0v2KY+Qh5bQ9aGftwOmmIPiEfRRoB3m9yyrJ7ySyK72 +28+Y0xQ7PnhH7s2EL28OoUVxExF6kZv3T/wbbqSmP+SSHoKte1A4OJhArCUe +xIiCDs/Ou7VY5zdCw6WtnAIwzrm1uKP/rx/RS3sPUwxdKYwBQaeGuBh0Mtin +r1p5Ly7wLztRv5HStAaKAPpGfkQb2eYqQWbW6uF3Zazrr5ZTd/2j/8gGvelN +WDjUx87giSEs3/TEHdGMICRMa1Rp9ZFV4uSnd0CDKjPD95Ukpbck5wih6C/X +7Oef6CvyHS4pHcAiGffCzGP1Ifsijn02VP+n8bbvQHJ1vHvuwd/72MrZiB+M +u7rpPAP0lcpEQvgjn9t307KQuMEThZIdBCMkgy/oVSJHfV+1NHMSab5bEZ9y +mkNH8oue9QWgEX+eNVt1yXdnff8Ei/XwfG0jkC3w4nKYIvrifHfYvKsmKKa5 +OJ+un2IkumcYbHt3vx6+spKCBAgARlrbYnGL8/wmfvjz5iDrcVnSTdJpWayi +ICEBo0AaSAmp2Rc+HNq0UHUR4acEYhzR0Vu0SP59EI4OEzh17y+QUstZWa2Q +KpFlfq1wof/NnMsmeLOu54umXwRfUbkseJr2HNN1kS0Oz1aieFmzC03Xvb7C +BLxQosiQmFr5EsgtX0hpwuzZ4IEAACDH7ij2sH/Jq4GzKqoFThEsqWFRbCaD +Gg8KMQXXqee0fesO8Q/PXIZdp7v6kLujHV3vzLDMQRUe9z6IGJrwrUZ2ZqtK +am35FNWuDGyGGr368CbmHtjo91Xz37wuQLMgOEo5Feab7H71wddG35qcrvMX +33PJhluMcVXY9zzqvzzA+bAXCUKYm2f5fTCiTyYZcMjIsKfCZ0DG7+mTM7iZ +ldoMh3yxhYKsoQlKuXhkoNY1qGgMa3d+bPjdkEV8XZmJW7bRIGq/Y2rWmrQK +UO7g2uUxz6lBBy09Q56GjOUUjfI2QLTRhmEgO9e6qR8xwATh06HtVhe/Sl9z +VWw8kGE35lc8R/iQtaPRLyuJxVKS7BUGInQqjajwJisFpUpo0Jv8PQubycPn +7403qv4eoNbylXpcl8bpAFK/w7s7XgxFrhQ+AKVORXnowR1qoGLKH7zPZgrr +vQx/F05Wnl8xIGCrqha5MTDY6R33/Obbs9yDDnQ1yzy5mvJ9f0GpLj4Qda6A +FF9rvbpz5pVPXeAxSwkjihgDYaUidzmC65ne3dj17Dc7C11PpBO5lcrxwZq/ +gwtRqQ1zEw9uGX9ttS/ptaC7MlcHDEL8XYDwXxyl7xG3M2G3AXnheqp6YiEt +pqasM/sxHj0St7upq5AhUKMurGdGGMv8EeXo51eYODeehMx0XfesG34c+88Q +I7+KTbmh310Lt0YIXPWaw+IFDtNahd0JA5othrmH7aDu+vGCFuhFOGsUaE1h +78XGw3vFzlMq65EFerjUzuI/wuvIbRS7gm4BqOFdFZVdrXc/tCNjdaRJw+t4 +6h9IywTab1jYwMGxjm/3aw6H3A8B1ucYTOqgJoDGoJvvXayqalp77cB7li6M +byi+tDu6nE4c9suC8bnmMuAJ/Ds7dq8Xd06S9kJVsoiNK16lA8uf5/Z0uHm6 +xSrqvALgeBaHXInj7/Ksz8N8C1LRsON8B3av+Gz9Oi6xRHdNwCAvIV1lWtUf +klt17X33trp9TMAGT6DXIRLVzcP6Ex3lE9UP/l9thJTQ3qE4NkghlcDfLOLJ +A6IirAIBXJ0mGgEp2OznScqPHgTnesRyM0NyPFOGBh62p/OWaS2M0R9U5coE +CFYTu1poK3nfx4FJveoyzMume4Lxtqbt8VjTev/RulUXFhOhiTHM2OcmFXBM +++Vh6JMii+ygK5wA9P7VvQV+bZEr5aXmQLRZswGkuhBJg9hpuMplQ7tZSJTr +n2/JeIiedaSJaUHjE4+1wd+Tsoj5cnGB9l0UWpNjNogZY/640WZGAIR1KFR9 +P4nUbYdy8D7tlVILcDfk+Ycxlg4U5vHsUK+bmYa2RDpNd4fdmDJweiidAHRS +yciqKvqSXlMWsXq+wcnQpaxTpSEkaBDQ5ZZ4BsYcqEVcobgm3uOsKTR/yovq +92tyjnp7d3fe/Hb+nkNN9HdTQbBZkuPWmdno+GKyO/3el37Tb8PvumOInhIc +g+HZ9oMsbMeXaCaq7tYs6+5xFS5bvZIJc4G3puHH7ddUr1EELmVp9DewzJj+ +aT9dzh8yuNlzMHrUUUrfFt3Qxr5+nB/3+zL7y8r/gO2V2IEYJJvLc++aeLNn +n0XxMyAcb+gmfnUCpyO/Aqk5wsa83H2Swj5ThsR4VKWjmUUb+JhQ4ZvlDF+N +4Vc9dc8SzTrzt8kDGILoJVjIN0bhMRxil4u1YnZe14joN/wo+dtZ5jvlwagu +6KIYL6jn8KNjlyfiCYh+NnmYonNf9phGc0sSq3icY7Chl7a7l1MOY9NGF0Uw +aXmLdsKonyLKk8zkpBagw3a6GEyFbMpknA4dSH/ZKE7HAuHKG5TTgZXSGii8 +t+Q1uPUM+218uhE6F4EQ0l7b9QaXoHjpREkzpZjrptzy0Zbsr0PbUTgd/HW4 +j/QNZPhYMAt3fKmzT/fjjQ8+0KZpYkn3F2oJAlOehFLEiKK48CNM6gaaoWUq +JE8P1RfBgAIEggwv5DacMGBF/+Ii3KhuxRsHJKuMdbOiMBXM9uF1lquqa0xV +5KpXFs0uOgiaC7n2rAGqn5vi5HyJWQhDmJz+x9KbzmuEiTfetFhtQv+EhO31 +TXb9CzHbWnyrX5bp+M/LNmf3nkJ0v+uF4NjINmxHmnrFrVv4v+zlVC4CbPJh +bo3VEXO7yWGRiJ21eyXQaO3Gc4NiOJKEIPGmhQ5U5ykcM9dMj/ncdeAwc0YQ +REMubPzcnJhfBSvvMMimBa07yFlyiUiGplvW7nuKTcM7r+vk81vAJQtcnU+M +yZvg95dM8K/VMkxAyOuFCxwEzcJc8Es4Fz9j+25UdaNh68PVtJyElDmnxR7N +XaE52uUZnjgOZcvAVe2o8/yY4GxxxQtD9+6RIe5WQSoeSGy2vBnSNVyEw93f +TdK9rQgVeobdFExSfnS3MOWBEBXxte4JkpZI61Tue03zQRIFHvnIIdfzZIGV +BcCBJkFSC7WFYi3qAi/8Ov0w7zT7nFB22Asw8skys7oyX4BGpMd+yRxEkU3t +IjeRFuCfY6BBtRsufMjXAkvqWpzfaxumYlyvzvqY/BHwd0WI7052cm3UetA/ +x+CyYLFJnGHl7YaZOewhGXK6A8/jju/kRxMwJuo4Y/fZJL+0lbbjiQ6iDsCc +MecJogJ6byNCOIII+Ow9upkJwGzoumvi3wgYIdFGqSMIgZacDqUXw7pnxuSU +BWSmCeXVKtwLVMs64ARgLkrxEFUJNb5ZE2X1YtTG7OMCN0Rady+oLDf41cnN +4Cnz9hpNAJ+FqczQ5fjdX0uvOls2TN7cv951BeUaHwvGH6OHnt5QoL9Divuj +XJjIUCJrDXEY9u5Gx+VZ4yXKNd5X/7En923mmMhPlcIoRGEkODHNmK5V2X9c +kwAj3LLuARn7FlmOmui+URQphB6Hmhfm1QGTpU65IfsxAGWcP+fgjGXQXAvh +FRKfB/4L3DHNgQBrRBLw9dtsqRvUp8y556Zo/5Iydz6YUf4WFTMd593QkYL5 +GH6BBt1jh0aJYgbDAAAEU2dq11II5psVgRPx5J3rdBonwSaI36/pJ6WnETBG +EzkevvMfOLr9zGe73s2gsNSj1TbFyaDpkhKhLIVTsqzVK707v8aMvzcGhiIP +DKHDBqMdA8vv8JD5/Oe8MzkqK2DCNeTM7Cuq69FmPfE5zS8GEr17YSuTEHyH +t2TtmIAKGjojvXlkS7MKRHgTRExvod/sfsSBep5Y8/1dn8tmrizVHi4chd7A +MF3gAgYL81bDYWaJZZeK8u8WbtZKcdH2VhYYVbmaxzcgz004X0z3X1vZwaCm +yJ+wCABLgwhoW95rYIAAAdOq3Odx0kYQyl96oSAAAAABIU3E5+sqmMtSyFFZ +HlDlDUJogGRvIxBDyU+78s+Os8KvYlQ5KbyPCI3NMhVcZRMz04N7Ylh4Zlka +24fTzKyCdsuBoOkEkKjE7Yggdh88uy48LxTm6c5xHngeaa1S4/JD4cDWujIC +Se/NKKFRXanrWdKg9nVFbUPj/8WbvEWIyiOcMT1ltZXiJpEjiaHdAsW9mUPM +3BWJrVE1CxR+Q2TQ1WHW7jWv4pbGmdRwpw+rHXrX6qQlitrlST2BEoZ7VFja +l6njfU9KWInn8yc69iM4s8cMPxW9nZg9LvH2Q2/ebVsm5hQx35xnbsqHxAVZ +U+qNW99qBLvCdUELak3VANpAYZoYd3hE0bKJmIL0XS/mhAMMFzOxIrkcZHz2 +jRs/IU90zKBUeQPznN6Gdl8bvxmRnsPo6FyCGUJLhbMKT/iLM1d+rZvwDy5k +cG9vKQaHF0ccaKchG3x0KOiBkQHxqp9UYehuGVgMKt2l5urdScgcIaCLsmP8 +UxxDxMmZI5ar5XG9wnF+DpFhTTNeur3bGQ83P7cqjE4Vc4985sUF9mTxMzfO +NKjPYyHUdBqer3R6e1KmTjVETbukXvYobv/CWHJZcSkEzv4KKi5KAnISvcWr +zWqEDrqovttqqvnyPhLGZ6kppbeHn5bevJqVq+zdcar6ayF4oG6b0sqs3pFA +aKb7C0rg5eUfmzXR+7En7MdcmkfAjifTolR8Pq/y60pm1OSeaumcWHk1Cx7d +6GTP8zpfFaaOj9eCYiXGGFgRJwyd0/4XZMe+TG48+D7359H9a/HYxAUm/Guu +rimhj63WX15BxPtKkgeJrHub+i8wnjriE1OL/kygnodgGDstyfydIdP0Uohu +k6rlXWZEHZNkPLKZHzu8PQ9CPPpY3XiUifAp2bKVziABKNLfWV+pN6PMP+AW +uGrm1IdAo/LrZDlkpqyyN3Rs6NSjoBdxE7pmi24RlnDRLBSwk3S+X62L3EW/ +PEqgBvgAV2nmzmE6ooP37PTNDf4kkdPrKVMUI2WZlddOtQlT8NSNEsQCbLwq +JfVHSN5FHm721DCSzb9273tQNIX1tCBDeHtN7E1dEwALWk8XanlniWuXCv25 +OMa3t4nMewwuziCr91bvETtvaz6pNy+pwPt8urF4gPHNBRt+1oQZR+S7HWVy +8NIepOwLEckptdGghLBUnqfTTRfru2FEgr4/tOycIMnZghA4vr/FpMSMXWQp +rYfHd3l2rfCoP5Qe2todC5xagyxNHCMauGBvSzC7/teKMv4RAdqUZd77ytKM +p1LJrTib+tyhIwg0CU1EipVVFBYwdg3+8ZGau4VUizs4UPnUQzc1nc546nPb +XaQWtDBxGjzM6Ob3AT3lPteQHgZWiiSmqq8Q27iIMSQejlxeZjMkYu+WulWp +kFCnxzaBj8MnJ/AWJPcj9g2B5BbNYobNtPjkkK05JSdOjXnwMDHGjoU9qwgj +pn/FxNKr/H/uJfzuvEUpMFU0PEWh+qBHOFuqoklUTjxulkJ56l7heAbA98Nn +FUwzwsJKlndLSeDNSu5JJBqhgjJigvuXBByooDWppsJBASr+i3JrOs4yxTYQ +HMNqtk1QbpZRYpvebEMNyDhqGScw546HPxuhaHr5+sDA5xelcYtPK5udXiym +dTV3haO1lJ4jx8CCDzv7D/3X7V0Lmv0IQroCBADjGn5IgFPOK3gwQGIH5boI +rooxo9zpqsAAERBcvjVVJdtoHTBruXwx9TAaJPYRyEtxNsyQQVDfY/Oemcss +W/lk8NHFXb9EqZNq26wiXo9nWAEjqwCHKkEGg0EuHiTp5WoJbWJQJe0kb4Rg +zpS06bFuZIo7kV739qh6iYg/wpA6dkkdUqm6zhcukSd13xo0/4g6F81sSW7H +lXo4Iy3qt0/uqoUuNgXbJgz/qRM59WdRMgms2m/gvVmJakh3Ui2cCF3u7QD0 +64lQHEr+wpArBKDHh94/S3eilgs8AN8KYYxkpgE0jhOzpHcI/WOgNSFiNCMK +9DXGVVzTTbIxzJCqFF4hCboge3UJLMSlv0LhcSrjTvpZmo+rbNoWJLu/mIAX +Ic8E7QKS9bR9D8NRGsGql8he034DDM9jTdfE1/LhrPWPAkazNNS0cpzlj28P +iNUn9Cy0gc+TalqhwG6WKH0kA+LVJCBS2DjEzFSoQ1ezePbimBYebYJv1nY3 +BGDtEJtowR2NV97mVv+kh5juuonrMgwmbiK/A93BsAs/zzZ68d5TCSaNLxtW +Tq+XddtHK4T7hddzDS+LTtqSOZL2N1UtGZPhh7G0MCe42hcoS2L9BHhmhlzC +5zVGgL7TVk0bGimA/cY4dverW8dGTtqgeMSvwfSGljib5okY6Xbk5yEilgnU +oZPrWUnDWRt3l49nSfCyh8DuGP5DK5PIYqAa2UekYlnQ5mv/BtVEO5kALZtz +vKP7uJnKUGAj+HmKgTzJHYWHKvQqFxZpf+adOFNttWOEa+WFKSFDC83kgbnP +SBCA8bxx6WuDtG0ZjUSQ7giqExkIboJVXDWZX1H2P0rr/7DqmY+8mhZGgzFf +Qmdon+i70ecoKILVStweztuUvfW3BSTSSJQQPrCkkielnzePIx+sO3CQ8HYN +8xQDYdoNXjlqOVHmFmJqW6GGq3tgzbZE3xEtRPzZggwiN9SaeFaoYRp2tHAF +eNprsMlelzjsEVOwD5Qg4YGmP6YT5J1zj8cxS0yfCuvM9PWjACk1CKxbNrp0 +pNth+Zos5CiTDwVnjk62Au7hdjoy80r7fC7MIDjwB710vzLvZqrg/VHqt0eY +BJx9mtLTXoci7cTpGtXC23HDSVsTKyrTpPP1pip2ZrpIu/dJRNPdvqMuZ1Sx +Hdl0jlZP0oC57QUdNkzL4OLg7pqUGIxeVf2+DcQg4ByIZwg5JPTcJWMtuHKh +VOQuOxvrrOb5wKfPGJQ85eBiJo8ybqHNZpVjVFPgC+qTakeqjSMh/cBSaOSp +JdpnH2jy7zicn3Qhy5C5EZuXo6zH0XdILcETj9EZ4u+HFVU6Q0aHB5JQJZ+h +lcbrXgVnGg6Qwx5TVS0oFIdBa/RCDB+lhiO0qqsAFajeimvBhmlRMHgAv4rW +kJpd2xPCtLUmx28feU1zWd+YiZpFBuL9Bq5KkigBoqMomlhzbivp/W2egEBd +PCcMe/wfOtvMERNyTsyONLN9X2GmkHSE8F9giOgS5AO9XaLVEfU3LmivAelW +yeue8qcGZ3tpwDoNNcuewsLNLLDSBGlfDueTq3c48KSGCT/kCW1f4H0CyAAA +AACWP7Rb5HvGd8+VNyOIqkI07s80UafhlrRmOS2RyefxGB+92+LjrkbbHVbt +3VoYqX31KRlQs2+lCx5CKUf6NvZ4DjPaTX2BCH5zYfUOZvoIhgpQEB7R0PpG +pRLmZmXvW3bSLnhJq+yGj+N6LPGLWZYXUWzxoS3vYUeTuphRGcyZl3Kq0BOV +cuvQiZ3oOi+7tfTVgXRUjuLXeu4GsKxeCLecO+/dzv/C+8kKvSW9SskPiOr3 +WgCABUeufI019w5jtFFVmQHYgXnJevmVpMFeSLfOyJPGGzVzOQMy+O4bvjW0 +QFkT4RJ6QJSrAwA6Ai5+m2Ezn/zzR5Y0ZlxCmmP5ZmIg5k67tjrtfhLXcEwN +qLruRjwRCGOrkKuP8H1aqZxAxj6hx47f9BNIEAbgOs6EhipyL7nrY3dOlg+7 +Yh0o6is+FOf3yoVV7xE1RZw6e8G4Zk3uDFlM1vqOoWn5cm4pZxDSaHBU+VwA +ADPj+jgVsvlx3YECAbC8Km4ZVQA8xQJIclDsqIlG5Asok1f6WWHFCeac40pY +ENG8fe1ZEMvRtHr1Is8AeZrdEiDrnMqNvR3ZJ/dK/+mq1GMiev1iohDRmo5h +8vvEStyTXoNtpneapPvqBZiGqE7Dtk4SO3VaP/2O/PpLN/GHVb3PnO0iW4Nv +BXJSAQ5l5FtZt4ymBTBgRZQOAeV6/TmbNT24OhUjblfLSd2sCohevDENKctn +KsI4m9vcRM1PIs1/KlSCWbncKTtkTSIrrXaUmS8rpO0ueBsQaEMcWjIKPO0D +BuTBTRq1YW/yQAs2MU6h5SxTfCJGBY3BXrrwaR4QS9k5WD2MEZwWZKPV71xu +QcDe0bBODGJWD7dQGqHnCxTkAa5WA1OG9cubM0MHxTkPfTXzzvK/3qGY5K/5 +N+3rl01qfVZJ5LSZRqyM9Fc+IKRHU1NJ2NdCyeCGQFRiNDH5/LkrBkCgkd0g +qXo9JInuas1QM1zsiQpbbzfcVxQZhL1DfKApufR+h75zYIHl20xMBi5UoBcN +2UlwTzp9dbBS0Gb6pRZLMJjKdkk3oMp5PEy+FHKRt2wZj+kfqzp/MgbnZp9r +Nv840xWK/1ElQZE4dyfRIwa4EtQxbQS8MP7L9iI4oO0cn/XFXkRDq8kSrQ+E +027IbG/HRSuGRkUdTZVJGt93Wlgj9Ay0hJvth+QsoSmcpt4bJcdagvs+rjZ/ +hc7eIxufbJFiH0NvFF2FB7Ryme0H6h6dmu0aRx9D5EYI3RzNfJh6x9lFEL09 +UzZg5OTf/t/xaX+VQQIzvUKOAmasFWORuP8GVV8zjoxTVo534xzWX+VKT4S7 +RZ0BbzIu4eBphVF0CisYTo8WB/Il+3MNY/cqvW0C6kqN/7JSOZjeWGh6A44l +xU6hYwcht3dwi+ircuO9EOaCNUy6+H2DsSNZHouLH3A+RzzDvSf/TDwJc+vH +hXbz6U4RWhr2RHFNtojY93nqTBgGZwlOLHQgbtFgCo7jzJDWO8GMCHZgvU/p +3pTq3DnybLlJFafRm+FqPFm8dMP1PxAEt+wrtEOoJ5csjQueGK72Mlbgf3JP +KqEMwtvzlZld97DxTWfRQcAcZuVHtzXDAdg58oMooyXsc5GQ5Jf7clpYVQ96 ++AOS80PNv3IJqPcGIhRFo4jH1yV96KKpB5lerd13XAKrc42q8m7ks2Yn1osE +i8PfuZtK/ToW7TrpKU7E5ZZm1Ydb/nB6+7FB3QVCh3Mj7X137txtH4LGlVBf +bURKMm7eN0Z1gYSOB+FO8b4RHSi98hgi9wmwt7xESetv7kTRJvsQXEZJ8WcR +ptkpKUUnHtr0fo6xM63qpFhus3WxX/0pXBS4Ini0PiCcsGV8OuhxkT9LbiV1 +CxeY1qXA+E3AYNtiYag7rEhRHcaDKo4rCvtFrg/BEXrvQpjMIXyTFoVy/Nbx +5qM+vpEzc6Rz1yypsaKTg7ufnwgiuKfT+Lcw9MCET0q91q5Dzkr7dDCI/cf5 +/Iq7Nf5yCzIBGT5rSwamS6Gyb0pHWlcTnvNKXH7IWj8jv8ZnBWvRukSq3jWE +lMsPm7kUyh0/mHBNkzslmboab10GwQc2R2wWmmL4VXRRcfPm20cXysHBzUBv +9yBpbABDO15oQxK3oMJW6v8LPuAWPlP1UyHNy03bSzEFlcdPrbX9pJQNGhwz +ROyZaZ/WlTNgwmR6d/mUD9gp9Kv81afy3DFZelGZShJnfVUBS+psHKh+WOGs +FhA9KxWWU053c9gr3HxszO3o4bexYeVSbT+LoYzlP5Yn+Lrr3heTK4a4QE+D +z0H5uGRejUjDWpHjKvHcCOQ5DnppnKyKTtblhERsCwmOLQLSFIz2Vsc/Zw+S +e8wpHrjOrqfd1dUedtX8Q+UDvk0CRE2V9K+02lPtEt5COTzodrcBNvcirRJW +VhPALfKsLVIjbu6VGf99pmEb/9Kvgu8ZqCgR0Z6VU4n13QEhTeoSPOp3xlb0 +fXS/kmN9x1Piksj2ipUgF5TCdZrQfXGd/sy3mVd+J/T87zRuUbZBmWNGJ5yy +nWQbMWPM9qCT3Ovzc16lXMD7AKVprb+wSXxAohUsaaeNnBZC2zka9/c2lFxp +Kj+QvkwoRh0FWvh78h+0ipu3N/FXD4FRKrqn4WfJ5O7hd3XzNRSQWBorskIG +1/qxlvgyXGnAr8rN/K+c7rRidHM2YeY467yG7f8BqQjQVDuuNUzGOIiGZVkF +X6J53wy2AhrF3EZapN/WiWk5/kc+Zd/4Dft93FrbexSk3vFsBWuKeo+zQQ+N +eDN9jwusO1ieJpeMcd9lPmiF5qYDLnKHl7/b1YxBi2nkZJGEJPo1XxSNusCu +t/fNWUT5h7Kef+kTRRq3lUcqMUZr9yVx6MzqJVB4/47PsDW7aXlrT99RDrLI +rGPhyRof5wMu74UMkIhkA6lw3vL5FrdOBHa6jqGK8mDJ/x8x293n55Dsgp3L +FZlHT5klyCEWmfdS/bR+JbgWk3kbRkzrGpPweODlhJlqBH5E7cU7h86EFxks +wZfXbtfqCBVoZ9IePqhgNeTC0c+9Dgf4n6OcRBA44mYh/wU82RrL8jRpn4K8 +HXCncbSJJXZT3j83BJW4ktUgnPehA6eb74lvBWEZ/SzCN8VmU69K8v8mdkk1 +BVuAgQIBmAJwwAECABUtBAX/1m+Ile9wrUrNK5VA0QNqqNHS4QaMD/SgWMdl +arHZJpuwiccOOSJZbgYHvYbbMfKP7i71rQ1Ghn41tV1ryy60nOE20oLF8oB3 +tUM+auVVw9hD1t3Ow1nb85mROenH9T4Si0SDSaJuidP/KrvyHihNUq0Q2W4v +E9mskoGBAEmPKvh8ymp7TtIFhBxKBH+BQx8LStsr+il1W15e5YiP4YI4+lbS +z3nC+G57/XlxcwFYFc1BAJpVqCkEACZAsna1ZWAxFLkgLVkuNPtd/5s9/8Vq +UCxvvg69wEyW6olx0nAkef9BAcwICdyeL27ceX/scKIMIEGIBCIdKQGggoEC +SSED7IUFMhBhOpEQPxxVTtPXfg3ZUOndSwAiEExIEApCCUgQCCEQCloKQIsQ +KpnYcJtRmPpPFarP3/OT62/W7P/fScZ+XZc72vRd97DTvewJs1aWoUQ01NSQ +qtRaiGkloGCLIWqhvgFVQ1AkwSYHBYq+qkhUohgl0YUQwJDpBpLAJIfk3blr +b/xCYpOHoO6u07Sj9Z+0oHcZ/8Gta0HvdczE6Yidcp1YKToIq0htMlyckSXB +W1zWcTsvs3CEY101UcSQnYb1jbEgkjbrqHZAvT4mRcYcavt26SsWANcDXW9i +OXrXZgYuKwxaBYLCEnD5dnT0nDo3hQN87SBWlZfO/bpdAO+sZL3hPbkFJ0EV +lJtpkjMHAsO5FmQTtJxd1svc4QjGdNY3pDZV6xtiQSRt11DsgXp8TLXGHGu3 +bpDLE0ANZca6oPscEZrXZYGNM7fVW2Nux9ovcDqjKdbIoCKE7gwcPhjsDgSB +sbAkZnGoWWE6YENsOxymZhIZqeg7CnvXCBkoYQbAUAQDJQxEJLi6xaVKl5Ks +y6+FRtCXyoVCSrrKwIsqVJLA1AhgyILMWbaANoIBFsGrJU1mFhVkihiq12aP +stwiNrqmy+DjRahznWAWwMnOyxpalOaYmZTkZSDpaUFetsRWIQ1Sosad3azm +BALlRODBbZd0ZLE5SF3gPmXJWJqKSBCCMkmTrDzFipyca4CM7JBa8StHGsDS +1ScyxMynIyggXK0VB7ptROBC0OroWksHSBAdEqHGcmS2y5u1RYnRIYxQcZl8 +JPiKucoBMRgYfGzE6S8EinzdvNJ70mSLrF4eajEPDKrq4aYKiXoPT3rnGuHQ +OxxU5daHXXNUJV5iLOKxig+Kci7u7qqL1AVXpm8og6eJ3tksSwYliQwqdElk +TIZi8ykkkkiVx+Y+i/zvu/jfTfNaz434TvOk/Gx4A8eDZs4Q6KWRrCP9CdPi +3risZsAiAAASp+SyoVI5iO8JaKGmvCufCfzDxDZfeF266NZ1urfMdNpyiDVL +bMExQYnbJVC0uurTKmoeSzYpthEoJ5m0ifOdGoZEJ3p0vi8Q7DQJklzDq/0c +/pw6tAMDy5D67r3HTHY8iK77P6gnh87AaMj/a0aHyeMEjIBOYQzsPwpfbzwn +xOY8pwvSfX63qva+b2fetTvey+h9xyeqRQuh4I3079ULCdAqQUYeaT1vxZxZ +iUPOB0owYkgQJDTnhwQxjjfa6YoKDRK0UQnPUcuGSruQg5XKBW7GVs/y6CSq +ZCSKJRRJJJBRSSSSKq39CgkgkgkkQvQgO4dIJIIpLuoZh22s8os06DurIzul +SFiKg8mpeXmEMEgWycKN4rFsFNhH8oI4lXHxC3Rvzcm+5xQqX623S5OfXoci +52PNt5Nsa8i5a2bgBwOzCyWngguCU7tQcFt2d2yhe5Pu01ZtxF7NHEkbijK3 +btTwOS53LTfufTet8T+Bt28Num/ZwvfAFHXfAUxuLbpQdjB0jenZhsDBtqrG +BKrIiC5BZc2SKRXSJRmGCExCmFyETsb8y6qrSPYxUMCLpqyDQFyJGMgS+hz5 +opdEkCSmIILalpI11SYpcOGY33yOOO8sw1IBJJIIJLbS1lsmCCSTtTNtdkBJ +2nQJFtu2NTW1PtwwbIIJJJJA2kCyNpgjakSxLbSiSSBJG3QgJabVtNbVO2r5 +ToRuLZLncdp3HcWkgE6ncYJLkQdpRBO0yXJMEklFtDB3FzEkkkkJJJJJMOBg +wiQvLySSz6SJIZCD6tUIDgbxkSESGYo6clLFLl07QpokcQ5SIWVIBoy4uwyW +7G/ACSCpkYzTuNpSGDRZ+RJWIcuOSmEL89UNkBDLRTA6JygDTBYDSuKCSEgw +hDTBYYBjLAZ5cAZ7l55mXmSO5ZonqPheL525UOct8DO6/dtS4VdFokKUIEVc +2Jr1ZbWF1VVVVVVVVFUVJYVLrXmvlVRVUVVFVRKq4BNi2ngNgAUwXqlGCAjS +jAVNLNghdcigawgYCCXxX2P4vi4xwCXiuIi5q4gpbrrgbCNjNpQ2gRIgHkPg +2LKt7BAHAKQR3A0wo/qEA9UYB43/mDMMSG052dp9qq7IcE0P83ghcouKLA2u +MAoQKIXmQGMSwLgjnsRPjeXn4sfy79YCGLI2G5AeIz7yTMqmSqKolSqqqqqz +7bJnJ3d0nd3dE8AwaFEO7vhgzdt8l7+PzO7yO5gMByBIgpnZpCFxJLIGXBNo +ypJJJJJJJOALA4mAAQhBSDAhCJYb1CEjDOlBAClGyhSWGhBseU9Xz3F+z2Xb +t8733XpsWblpGEyxSkHZgih8HWev4PL63Xm0cDWTi01t22XN112CbNrrin65 +HbQg7HR+yThhhgzMSwvduvSaGUFqQNuxMIBBGpYkIsNxAyDsKIGSN1JhBEWt +0w4RSGjUxikQogAwIGO+g+BPOy/AKUiVQpSJtm/fO+x5jO+VpnSug5KDkiOk +4/8O56zstDd/hY8nWFGc5kF1FhuFYsSEIexh8X7vOW17ohhrcjS3jrvc8H/T +3fg+/0MgNZkDqOf3O3HxHO1D/zwdyoaOAhrWAkIgwMlKHVAQGEIQ1d5JLh80 +XBrNsDKMvVFEINczxWMxLnBgCuLygcal1wruDDDCiCwLFxYqAdv9Tu/83GSm +MKAIqKEQo6Xrb07Hb1/EAAWsE7+h0z8VVj+3oYCUEbpkqQ20228f7lV4XbIk +iaRVJDuabzKcWEP+hMULZ+qqFwAQF2vMOwgXa9OY6YarKnmNHi50lyZzWKAW +UUxEbzS82hVWCcFhWjdjL5baeoRUuoGOZ2Jlg7f4sa1YGDTSzaYMugn9Qrte +/MKOK55Mkz5tw0trkw5ZSLN9186w1jb/cCZyBTXNbde57JivID/LMV6pdJK2 +HkLzTs9rgtDrDoeqg+AKGHD/wulOi2vva3KrVIdxlw8yKvSsIm7hApieg7W+ +OKcBbFGEcYfhTJYM4f/4hOQPv10P1N2VgS6yLb67AacRL6SG430TmG/a0GWN +Gd92hNSRypBMI6+VnUjFHmkKUkhB5C/+Xu8GVuARi6YTzZEzreaTGU0JFQmg +n+3Y9iWzuicaWqjSsFKBlv07PD20O47Q5K9aI212/0PZaOttOSZPPVPSlwrF +FHqBowaIJ+zQYJVWoxqmvrBktXrzScQi4J3M1LR4Z32dKbhMnDa0qDX/5ilf +ySoMJuWL1Lml9oxFX9/IiWnh+/PMMp6L1tf7xYfS1B8amJu6ga32b6V3PwQI +CiBggAblGZ3CkB5YRhQukMrabXHi6ybM4LcLCT09N8kdQ+2BiJ7E8sfQT5d2 +2XhI4SYC46gLh9AMREctcnVymZ9KpNb/f+xd9SsqOFWAeV/B+3CJJBNTUy8j +C+D32+3A1eXpHO/j/eXrshBqUjnY05ISwG5lZXvFIMD1zTM1fqK5jBggQIAC +NMBw38KCHjHwoYkophVazQmsdltUM6KXX7kez0jX1Q7hrSTpjIg6j4qoO8/s +NzXL9g0QzXiuxtudMd780fXtNOQqDMPJoVL/saiQhoUe9QPWozs9I0BzYGFv +SHwClGRhcLfHmvY+XUREgT/ou7igBc920PkTviS97/mPV1wyFbMGgleM3uaz +0cWdY8HQKAXFnyEouEKx5TMxOsnCZjkYYcQQPTPS5JZFEgnIB7cSd5VT+BHI +TbcY6N0h3j1X1oPfSAwB8+3VYTpi+pQhAPmq/jwXYUMBAgMJQ2dJe+OUuTmv +ToVe7sop4nPO6FcgQA26HnpQp1YclI+0D93PN3vmkTSUG7ldCp6/SppJnlc9 +WCfty+mi9+yBIrrvgB+MVllHw45C2AHW+y0oO7fS24AGqg4fF34glcJy/nnG +kTz6CL3HBagRoVmjCjZrG0TyuMTRfa9i84Kps809RpjFzQHq90LjTfvOiLfB +lWFy1GtqxA0rHkXb0YU/HlNd9qUx6voUoy6IoSwDX0ClTXtoAAWFP2UUJUm8 +1XzWFSfl6Bo4jAqsP/NH7PmcJ+0KLP0S0STL8ufc682gKt3qMUW3FjVxb75k +ugNZFV3+up4e0k0gSH6jrFyzluv7X4WpUeWUlbRby2ZYup37zwnUThn9AGFV +f6tzTnYxQt5Q/lsvLCVQ5xGDwI+WuoSoFRPdE3KSa/MVhCqVVJWCtmXp850B +lQaHXvidHFWMGRIo9t669LdakrosBAvwY1S5uQi7NHih/EIIURYUdwB9phYV +RyuCilMygOuP5tR1gwzSYc8/xb82LQCtpqQy6FiS5Baj7gkEH5HNa8KOYxL5 +kz7KL+a9cJ4FJUXfNaPi6uQoSkYWKMnBs0Shvfcf+e2AQw6HPejDKhAnPL7h +nqMFZblCdCR8oh42mU58fO1BlFnIjFyOUc361kqyklgticlrRqaYz6qUyX2+ +AEyG6gF6yJ9epVjvLvrGlrXckShOYZKwD9zWMEShvyuh5pJq19yZZ4j5gzjD +ij2mhetq4C6ggAF5mZKTttRFir6EM1GLotCGZjwzFbro5paJreFz0x6+zcd2 +DzBEyZkKKUXSIswdu9oQtia6JOroKEuIYJT8aSZE9MthhYlT9Lv1H5pM2Uxj +w/ZQsXT44wtzC2Qtsx+n0QL02SxwcFlxDHrhhD6S/gHXLyQQzLQBHLSwWbB4 +13nB0CeAKkkoK2AIECABAgABeLIka10PzOypajkEavFZ1COlXzR4j7RBZS2v +/AHrmAc9H662JeSWxYQWm0CtepFJPkCr7NdA70h+JKsWoP7Qzf2b9sTgQAIA +EAKrFSa1PNl0VV/yWhlSid3XhNUUCZQ1mPAeqOnbHH3K8//J0XFZLHGVqcZB +RkBAABYMMAfICqrVhcPx9b4PFLTTQShzYEAvIBfObbg8AxY5EBk12yUYeT20 +RJNMiz80ZpFr6AqJL0bwWBPnapdFiNIQ2fD1V6O1i5eKFcnnn6aKuDtFr5lr +eZPwnhs7e0w9foF1B8+gY4Fm5WL9taxeKp5R0W4Oz0z9qEkFUTq4oVGh4vYL +RPqcY457hH0EPfhar7SqytxAvmt0iZWZanPCBQ3jHnBIqMwwLahOXUJoxMqs +QgrfOaKpBYhizBve28w2HCHDy7h6b4JiO/Mi7122HBchJaZKXMwPdCOaGMvY +H9B4ycML4qKKumZBICgAmrdiwtJY1EvvC8JVVFEfL2ncNVUhUcyS0WbTjK7i +FfKZgEBZmnP63aOVRt5L4Y5XZ+xUsWTTDiOoYXRUCqFXFawnQfBAYCNgZ2GL +yg2VxL+eZYdAXD5IbN/lSGWcbLoU6IM8hFU+ftA9ZdMeL0hBWrTxSSzSeFqH +Y0o4NXVrekDkTzJtz4rtCTzY3MDySgeVr9Tz5PmfewVNclyLipbiLMkeFTy1 +snJcVLM9/jXBknM/7ZjsAhSBQRFE3nl687mb2bGWoRZxOhAWYFOnlSdpWBG4 +DmeGGn/Lt69i/cqoTleLbJeDCvd+/7yxqhGfx2faWu20OuyFj7jSWkBC8QwW +i4LJgbh46uMcS0bk6/XOUuM7v8+SdNNUCp1wMjU8iJvm88lyzPEes24Y8QoD +OPhhmgaGkp9+pRl1sxo/4pBavDdKDb05FXRnIrMITsBn86Vknscih+cSa1d6 +0f8djcVry9jQVD4dv0sN/+tLcpgz2XkxImqQ922Ty7y8C7Xb4xyxoOXNyf9+ +WHCYmP6OOY7jQ3Oqcp14if/rwDSbzw5pHkWbWp9zad+3f1qfP3qc43tedxLF +OvTQcyqOMQKM/qABkQTTdDolYI79Dhkz7/yiU+19abAjCVSB7RyHNqaRUpT5 +JDvqKvIutUzi5Y1o15hYuczZ4KPtU785nbpShpdGPdQYHczoxDt2WwTv2VIB +CTiTGypU03L3hDhTulF90f6M62TPfhOs7+zZCk7roWBS7/i3JSKi62cOsQZE +9FsRrDaXuNM0TcLlBUvGszVGwVLt1FOdrPMx2a6q0sK3+3r/KL1l9L34KGN0 +vqRITN9vOyE0eaZBbAAALxBgAAgD4oqgB9qgSkVPmiIERGKsiEigSKEjIgyE +gSBIkISJIqxUgEiQRYSMgBIoSIyJIiyKEhIgSISIEiEhIiyIySSIQipIBJCB +IEiMhIEiBIBIhISDEiAxGChZUbK2FGAAIAADMZ9Ybl30dHhcEoEwIlUBAeYz +QJuctGvaF8SFyDkkf+QU79hBm6rY7eUaunL8dDRBFpRv4VgAFoAGmhs7Prdv +JRfiZYaFrS6aUjd56SBAQCAPYMcBY5mHlGbhvcZik3fxOp1xqJvF1/2vBc37 +7Iwoz1kNnqisNi2jlNMqpCoyAEgkf6pAkMXR6gTlwdv37gfkfy/KTrxcnc+T +HsPtfaePr0O4c/PJCQkJCQkJCQqqJCQkJCQkJCQkM2xaxISFeOMu5cq64sNZ +13BHG7Bx2z5HZaL93nf9Pkd+8dLaOr67sBxP15u14vunrY1odxHvmvadqG67 +DZTiSMSCRdh3BIJBI6qQ7CAHcEgkEgkIcPUf79f3vx+OA6f2rZJISEWTMlSS +bRVEhISEhISEhISEhISEhISEhISEhISEhISEhzNUSEhISF1USEhISGZmbMTU +5noP64jMxyDy407loNnN7Dw/zGwbNhIb7Xrdhv18Tix10h8P+1eOQ7vo/Qd1 ++S/N623kB3EhIaFUQSEhIyMkkkkkjJJJWXNLsiODDAA0ANABD4ItC4BsUxEb +GxT7UqD6hZrCrqRgndvevUJhAvsRxnnnTkvWsBAgQAIECABAbO/IOhsFCiXy +blyoUzQM81cq6BmjcYYGA+GjxTtO28XrD7OMc1MCXPeuC8OkBodTAcuVwJgR +koWcwd5YYEa5xRFYUKqGJ6Zs8Q08R4P0gjf9EdrsnqRWS0LxGIjO+ixIjuvn +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 +IC16twN2T7+4oGvQcMw9/JEZVYd1GkSPE1YimsxYyxF5iysrf79mJbRCJC/s +oVEpHd/5X1zNMkNSPVRO421RD7ZP1HQgP3D0wMmDppgttisvy7d6uULTY6r+ +NBBikMK2Rz8c2TNzhQiN0HLn3LsGB42LJXzdA1ngcrNMWCTUnhm/9mhI8Iva +p4Xqidx5ehElAeTO2w547np3bSq7zlURAfo0RJrkSYkUkFkR/OScrI+hzdZh +WOg94nBUcRj4T+VnBDjD8ZWftKz4NGqnF/Fj1yd8o930JngcfV013+Li0h0O +3w431eeeloTGTd1mcSpsfVjlhRQhinZHKIFqDCQGXoxn4ZTVA7YVFrvcGbNN +Hth0vFs1XmYliHh/2YybaMuZ0xZNkaagTuHlN4SjBdGE+rVdh9SMJq2WmNZe +Iv0KsPNTbzZs2pcf6ePFR8f/Zl1uOOjriOfV44c8kHQSSZvwB+rfNx+xS/m2 +h3ccgAAAJQt4YPebdBtd4FLxXrh1fx5xMDs0I6E4QyFZjcUGBpTG070rrLcj +MS56vqSLaT22BEQIfI7ECC6a12xrTUYbnUm8ST/UX2FUeujSvIuTKyvtrjFK +domStHVE6sZqPRSiBn5Rj+Cl3HKwp5nqh9bgzyB/0hBvSmiZYPh13ZU1dkBO +xYqyzf7KSUVXng15NEf/MssuUmSPFC7STjs9ejEtlbwKA989lLMBrxIligAf +JI0IlxEj1jfuHTFwUDfasNPrIbg+tUYL84ak7r2MEssHytq6Gqh7WW/Lp+uU +b5+ywyhOqLwKWCGKG6AWeAgrfEsgt3NTGIwsg6KIvA3prE9jpTOmLzzxGTjR +QFVWDAx/PLuJnh8fw0YYdn/8/ggNP+drW+L33AooHhfT+eOrN9ogqx0XVf5p +t0tpvjoLRLOmGTqFkTHB/O6AFz0VBX0D1xcX9nCKqZIWyoHHw+efQOnJblbl +6WpXjDHMAroQ6tHYm+1XSVsAINPsvKpjPurlgstwpbQF7I9aF+Q5PJqKbmaR +DTqU+afunrD2ycI0sGy437RbjdFp7Ez+3qh5NYtN2YzIVPXLaVDQJlpJkP3u +bNG36tHkXMXAgYM8YrumSCOUU0VlLuys9yWQKV5MQ4wz9Uj7Ps1hi7BAyI/g +f2tWoiwewwzccVs5Va390gwdXDTLsRGnr5/wD/LqMhVvBKmk+RgstbKeawrd +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 +SgA/6yEm+R0ntmt+0MER5T9VoIsRqShYiL9Dd1ljAmlXmg08YIjsD1hMK8gN +tJUrof1VZoCwLHgBosBHseAZY70Dj0ucpjVqsUysjd1P7u36FA/yYxuUrslx +NrsMXkLmC3r9TFFzH2pJKrtbQbmmF4qRTkJR+wf07cNTznqB+SZccPDHHTfX +kuPz3zNSO9wg/6q6G4e/Vj86up4o06yOrWcCm4vjRKhgyz6FWPQLq062qizX +i/aKw4EbbY4dLwso9atIV8lke0DUji60V5fBN4vdl44oPQitxVOCffKZM+eR +ssxMbdK1hJ0MrqyfJNE/aHgbr24dul56A2YZJBezZ9Uon5pq4K6WNBZlqSju +Y99h5YObxkFbXH4T8nglnxbiwY+CcC8UgoSUNl/gNpilUvwSSNxlYvfo1HGR +9CdCWWLhIAb5a+CWyLzmgN8jAwYqpOTqq5B3WriNdD1Q4FtCphA1sbvsW5hB +fVzIddLB8TaJiGsANF+WQ5dUZ1UxQzsNb+yysF0GSkygd/CEoPGR2lVLBRAY +2Fv5DBimLkzm2kXkRun+9lpDUC14XWQMPw1VL40rfS9hy/qdA22sRXYmJZSo +eiEMcA5l3Nzd+m61zdwIf89x5f26MToQkPapqRoSburMlCN9cStzLErzjg/G +7fYxtAU1rx9iNbPet/iFaDd1gFFInPHXpNQOJB0whciTpPf55tAlErxcoLhs +qtJJtZpI/VeRsU9vvxOx/vTj8A87USvdJyFCSraQT/A/dI3zPtjM1q+ioB6H +3UMaX2KNWk/89+gNETAHLCdxMc4TjZl43LcMHDd9LQ4fmbGF2W3n4vqTGmkg +aHu5Pi7oT6fWPb7ELGhFWEX9hTWVHQwFixU0/chpzWK5wgnIsRa34lvXmY+S +PTQzm2pJbBuU3oV/4I5TXZ3jFLTIaxXlrNMCgDuJhOlWs5ciIXYj7nBzuVWE +P6W5NfHackzQaiJdeOfNj5hBhUSe86Eu0jK431UlPV0Kf5ZeOmtkT+b0JlGU +QxMkPmxJClIPVChpIKl2vR3UDBflFlbAZw4l5mVYEoS1Qd890xlLk/x2Q6W5 +vW/LVP40deDDBOaDxE5iSFC0tsxzKxd2XRqLzlrDmRKaEKq+3iFXbu0G3Wu3 +tpoE65NyIApw5BedljFD+f6XuzGpNaNc1wJxnLdcDl/Yec+PMhAI64/n1QBY +g/m3lCXWGSuZX0Ro51J7vaKLl2iJlcGXxEJ1EaQZQaZIuPny0kDaO6y73Ztr +cSLILnCOTXDQ4JIqkRP9qPCYeq+Qn3BpmQpCWdcKRSNYaTfLgnU+BiITyN/5 +INcoEKSlr5mErtszMtnDe9uMiPYYGxRJYZkrxqIxgBIecBd/zPfVc4Z2jiWX +G7qBDotF6mBj1bHpUkSPLmUZwc95cs72mHbSlqfUob4APy+OpujGKIpm5nVU +PHMNXpr8en0xqHFPe1xlzTBmm6/bEn80JVp7RUfBvzbURRrzNwjQvFsD6K4c +4bhCaEzRC33NT2Ofge7vJjgsx592+elyumRpaUc2o91XrTQquV/P6UvMIT10 +ke33xQiZHuw/9+8Ci83MYe53jzWGlQSavom1siIPk6XnhZbavJGtLekYt0I1 +axfRAQmKdvlJ7e+3MZHIfKVyQlX1u34AxCLIV8wYAZeIJBeRj/AijK+sOSVd +SQdpSLenOd38t6zS3vJYBLpEk+mjrpP3/4RQm2YoOSrQ1UX+UgVNWAJv2J3r +KIsV1kL/rwUe6r8valRGh+zlcMQ/UYSWkosnJTuo5XEqr8R/POyzLX8lX/Xj +uBzpnIBc2d3qL8ePccOaefpYZauAi0zJBX1ujIwc3WCBlJaWLPPTO/K4m/dR +TdBHSKYUPI1e1QtqncuIq66T+yVng18jS0kdamFujO66JK62Oisg0bvJ+n7X +ZZSkfYQswZ0myWMsqvelzajtZsHUY0xqCbOQLKsgcqJfV/2FSvBEV+ED3o0G +stP4owqvcctKsYATeVy5Yy5lUKAQHON6FpSBrJtoNalh/cKIGT2T6HzPMgAl +X+XZqqHjcm2IwXl9kArpM4wuccPFtULRJhAzwB3PusLFhK0ZpGDBHmn6JDav ++8Dq98pr3mQSS7MbFI7MqdjPTYOOjevlnbIShyGh2TjeXdKIUVgcFExT3yHJ +wJvMXH+IAdk2rMCY3EJU4SXGRZmupffvvU9uPS0/iwi0UXSUIAl1RNTNbFqU +mUwUIWY3eKrxJIfUQNdn/pt2nZY+FjRzFopeWUt+RurU2IY+9gentTNpGAsY +JhgH468GUENw3280UfLAmnke548gT72desLPCWxc79cwXausL5kdSgQA9ocf +swhgz+hAIwh1VR9ACKPerdveGC55zGAA/5vcFyUGH3ioVGACmMLXuecLrwBl +8LQx8M9aHHAAVTfYJlOHeFjqvnjT7i5KWLUICM1zmyZZlzjSzeF+1sVOH70I +IxqGeqJ8h4QlGQ/hKgfx/JJvnkCfvmVOJai8iU2TY7YTpTsQkqwn7SclBJut +4URSjaeXXy+Gpc/praaZS5g7s5SsSxy+8yXd90IYZldHnvy4ogD2vYkV6oa9 +V1zpoqqnMEga78fl22MXhw7HnWHOAJI4YCSNOU9wvGoDcx5K7AnaJLlsj83V +PK+rheAVUxUnl40uMVFyihTNtwrwccYAEok3S+EzFh8xc8XbggU2fE63mFIT +84FPhMNjTh46Y3WYTXTgC3sBwRkgLoCvcjZ5Dhgi3CSpuYNtNOV7ht0ojoyS +j7qdoHoxiCLm7h2q2sb5yktI5f2j2KCuT/cSPDM23Ph0pVPmZdNDaQfsZTUN +wZSQHUvzJ2H4O9GtBybbKiPMURBx7Wzh7R+rLgGBZBWElh0HPHqr4zoiU/TJ +ZRbeJh6seDmWUPkiRhewiS/dBuKypKQzqg4+qCk7tP52rlG1p2M6DEaBUCNB +xTAD+BrDVdr/qPh+ObEHjpZY5X/p/1uKx9L1qpefROdr332r2eUjlNY0m3FY +o1rAJ03T2ahsf/LB2AeVd1xWCywzIOWmfzklp9Rs/e4gvdFNozmYc+MVgttq +EkcKA/xc8sWew3vSNsHz5p/3H7wpXjRSxFwvfzACMVWBSSJ06+ME2XxbmEV9 +YjTOznrnb7xcGnLsr0csUTP+4PO1B2Sg1cQy58W2F5to6nlGWx+BPexp93ae +8J8K0swSJBfPtZQxH91HX6b7RQWEi2zmpALictlbmUUR/WsUGFnki5ImNls4 +T5fG244WtNzO9LPNJg659SB+WnitLTAFGcoPIetAZAQJD9ngFMZitYY03WxD +3wCqn88yhCzJr/4PL0+iEQ8dY9GUtbklm285u2ol6zx83K45CF+u9D1HleMH +1gAVp/UwK0+YDOfIP9thbHbgrnmq5GngatPQe0lOrfxRnvVVZqeVrTxauo3f +ZDxaO+urcdzZwlKlzpIMWjRR1NGKGz7jXKkM5HMX/U2/0Do8Nqbqnln2oyyj +D3J0bcO/tVOWt/LZUHl/yp4XTvrw/cn32zgDSycXgx/XKubBAj/Xm1PUHAla +cbY9MFo25LgHjk8rxaAuamb1lx1S7zZVwAAzgIsghYlIXJrRXzTf4hftHZNR +DGm1JXLlxkFSvdge0gRXGV8lgmkaSKcmucUg0mSfZfl8ezOUnEamA6QGZysc +Pu/mRj9OHskVhwlwm9H13N73KzJe3f/V+mTpglOxLKnkrXHj+z5wRPgVXjUr +k5RdJJZe2TF1LsjVIBt7C3ZVMa+UT1yWEnltvsLvp5zm/bXT6cBS0IBlrEqN +Y4cPjDApvPoHSIplVvVVDSOUjFIDa2rUsKhuRrkdWSQL2knOGRH+pRRD/WbY +bbu71lOSkcSKJ9yvO3M7mtO+1any9licvkkwaSBUCsW6nkRztMlBETgOA6ow +ceBcEgtw2CJn8aY8wcrFZiZotW1ewOHpC7IaQDxHB4FFpJunQTNwsP1tImcd +JLIhVlt4XLqAt5bavGV6OsxKjO3hDFxMQV5n9OQdcS2oceR7hs8Cbtk01hor +N0NESwmHeSJzRaj9U05wdCrn6+UKx/rmn2heKWn/EgwwgLTo1Xlw9Hk/sVeT +SuxL+YCPzxPiTHBjDbVriNq8i2tlwwm7UO2jxoauGmJqyC7ukTMybvDFVZmy +yNutava9+xygA3mEuQZK4/mO9YTSPYL+nSBsMn+0hZ2brL8oI6OjhE3X+ggA +AJgGCBTmkReq5D9+eqJ7Vio2GeQXiica8N4nopYxofz2qNl26EPaRNGY30Zy +Ulp78n/BlQBjblIj1wppUi1TOe8Q2z2vHG29W06tyV9mKlYDv3COruUaqH9J +OoNYZlsyP2geNjkIZn+pe44mt756DnJT0p0p0igZm6G/LooauvUNHCdVu4of +Azl4qP/Gqru87rGT9Z1nM+i8yCSGzWryfGDY+LwFrgIMWg22Nhprya44FxLg +Eh5VKyuWoaW5FhM6+AWmhJ7GZm7R7/EIX1QufX7lncBd+KONjYg3qGh9OrQG +ctIxkloeWBhmwRHdIG1bUNpM131ks3bFyRjnN2xsJ2QpQY3Qmj55L3d0v1eW +yV5Ml9SLoEJXLEGBJktK5WBGz/A3lNfZ31x+7ZQHNPmEVWWnCH6Ym+B9ZuFq +nexMSJ7lXnDPe2nY+OQ75lbsW3MlPPaDRAKt1WPCQxIs2cbMKRP5JGqEmMxc +PNG+hk26dvNQdDGCf2cXWMwrS7bTPBWvuH++BHDCgNASfEH2ZumQwsE32n0p +t1Peg0PGMdnGIHF6CyXfuyTNcidYeYwqk6CNFZB2o7bA5q4/6nSUpTcrUKh7 +Pqf+C6bQ5/7dLZnRbR5VLM3ssIHP2YbPWCi73NigUUVTsq9ZKBmh1mLmSsLX +eUQRlfnwEvhKrauXYaeeg4fvgeiQEEgOLhHtKrb3QjpkKqkOkcRBP6riK+cd +rdtn3mVwstJmLaXi3vs0ENDd+D1gVpxob1cm16IjhBkrLQ9ncc1I+r1ANdXZ +MO5hUJbMDfslVWETHg53ujZUWRv/XjFhWqOADf0Pm01XL2HQ1sfjEqZQHyTC +dKNaDM0OvMqhL+DVMYyIaXbi75+JhGYwUs+nfLZOdmqSQzKt66z7HyQgfl2u +AU3KYmNHOKquUJj4num5OhxdvXXwsr5feleAd0IAvd2FPddLzBs0bMcH4jKO +dtMkKmSqfQ4OHiwkMz+XYfcRDIJ62ORgjLiSsnsrR3kpuKXaYylgbyrDMj1E +mKjauS1iegsH4DDjo6dPEQrwjPYvMn/ZSRtjJve9Z9lLBgXqLH+Bs8G7ejEN +Zb8fpdxwuR4I9elZyoLGbCpAzmrtv+R7KtpTEZMhI8ZhQT93euGcXV1uytny +qab09/hN/e3DL3tBclwfrD4w6oCf+qAJCvOC9AqDbgjeFpMhYxxkEA794sTu +7A8l1IzJgbLf2zmhSo6qHpCAxiLTcH7C8Mq0nC+pnHFd9UbI5+E1DMCBr1fO +z5qgd35+oVgc1D+zALeryPx5niTCMWzMXf1q+Xd60C8D4Yxr2OZhMksfZ+En +8KNBt33aseYX14Tb0VQwXVDi59qsVEGsl8IWTQdMGPmgzZqVR9H1o8Q0wYro +UnaAeZYnNN6QUB4WphaykdBQiR6Xvm4nbzY0grRzm4K32WCsX7wijTjSVhb5 +p123PqF35Erl/f14MsJIHtlLSpxLtun7NRwGHCuj68mXNSpmcWcdUgnKnl1s +gx5YZMi1trsTPEFKTozKbtAAECAoSu6p8hK9ZAQxe2+i2+QqzTOG8FXtnZ3S +n1MbG2wdQx4NIuEQo/6ZKWchfmqcEyvOYk8uHd9wug9y1hv5iCD6+LPn8khG +pp36SZ7hEXMzJbTIp0VVYqig/3dpvOdhCrgY7VZf9N81K4UUtGHwrMwGL0Bg +0NA6qq+1YCfp5y+KToB2pIHsuriOE5BufXgjHkFTtCFKjbpA6XHBYj9WEEid +yIZQOTX8SllOB1t0dDAj9tRgsphpj3p46Wt4ksPLGL22htlvBVEFLDXds5QF +LfkMobI4np8m2X1oidbbZj4NuEEWjkk3BUBcWSmp+pIeJlF0yNXZnzsoZqcx +FcU9QqujoZeqy5d58r6zkH/KlDBeRraO/IHIdLv99ju/eMLrfN4Dh2zB8sRi +f25yFmlV+qrrtRArb/RBsmzO5j4q7q9P0LrBzRPeIwBUZv1dLwx8GUV45hBE +dyB8e4dwev3lmw0IR1aNP78th1/8OQIC7btnP8A+9gtmhWI99wV6F9Fe6uXI +bhrsMSr5oJ7rhHgOhnCKqAK/qWykfQiMLXxKGzoKJueV6I0Xisi1hQBsVfu5 +kEF26FpAiBHi7z+zJdPlBD+kIGpdxYzHx3vGtWRA2/XfHze0DVeYlDX/tGeJ +HLQUPLiEYqLswy3HVYgdsGZcf++RZ97/YXtn8NzJi5VF3ubuTLWyqOuiHpGF +3dZJgnzogO/oWI7KNJOcI44WLGp2w7dBPqlW38DTwxpfuxBG3xwUMGqBHfim +IA4NUgwy8ac+3dul6QMcLkgc89hlWp4q9b6gZMLodIt2lVZtjIQzMv4qDUGo +EExkerl8zjgGDQbIj5WAwOTlV0pVzb3rac8muE8veu1KqlGAV560srC1sba1 +l/iUQBaOFbiOrDtvfve3pgIahA0wuiPyTL5ZGh1ztIcXbViYfgo1pZGsTIIW +WlQSmk6j7rkVQhA6DwczlA8+G7T4pcNm+C56UDuer5pt2KYMpLQhKaqz619/ +k/WXGvk86gI4F2Dou4sCBEuqL/ZeBUtoTJLXG32Vfz2gD67VEpwtzE/OaeDQ +aPrVR8x9txzRjerrUFcfcUNswm+NTd9tpx97nLFMXQETddoSudXaQAGp6Zui +j7ZN20xdoSbr4vd3/rfxG59Jfqh3Od4vGxyJ816agCm/sExXIL1Fr1HbOG2c +jJxA4leDZVYixn0MeUX+Ktrs1ke9ndYnrYX1/5n6cXTaiXkxNt+Dqx11x1kE +2pQ4h+nC0YMQdjiFaTAnrDqaMCZo5UTDT7TLWeo9AqquZxcLzuTeRbF9OGec +25A9ZzpiJBmyrwEoudQ5HY5nT0c7hcNau9Sx7n+UpvrL88EaLbyk2tapwHTd +tIRk6jcx6Gl2vgU/GMxNywgs5CDGby22vqQz5w4A4bQxfv2n09tEJh+hL4o4 +19JYZho86sameWPCnkCFx8uevcLKB5zsIu9+LJ5TpbSfEEjCW1LLvjL/66oG +gP2siXdzoO7WqgI+pLniX4UzFjtNc6ny7fmIB8LQC9yelE8Q5Ppr4xxGr5GA +1Zmp1cwM6y5Eg2ZgJR55dMiBbzaAUrIKFLUSlqv56qp7eWpST8ykYfXk0kig +7wB570oNV5FSWO8YvPyBDPdrYbdEpNt7R8gh5CX89GsDBYMrGK4YjdvzNhoq +e6qRVQDOs56qA8/yDN1NGpLlKVGz5hq1ub6igehx+yYEv9AtAjG2zTvCTSpX +pEa3P+lv600KfUSaelOFHCQASm2zl3/XCYRudtQ/uMYmFpYBrXLS01tQq9xt +/D0IYfxwVCu4TTKI9Ogke7oqHo5lQj8dliEYg8jqpqvkFtkVS7eD7aVWtETN +Fos+b1v37a/I2skb2Wic+UP6pAJgwKJy6qlWLKcFfdf1mi1qO2pIC9GZo51t +DhTSOQrcc6gBC2NvH119R37hulXCfIlJ33/PxCAow4Tz0Cz+ZnPt2DfEiAUB +gEG8oLhzwDQAAKEKLxByjzeaiA162yrbrZSuKfGNK2huUmn5GQ44R0xtzJ+m +/dbwoOzEx4Z1BAbi+Z9UFmECG41PWiDDRpXc59LZ8zggr1LKEUoC7OFSXvaI +xuclMEQKT/v5chxx6WYQwGvEjvlbiQG/mJao69nVJ/gYzOaPyhIiZxGhl/rl ++WAS27snnvczaO1m9BeB9M+5bEH3uRfpbfW6dTCqdlImHmC7jRSdCnk2IwjS +I96GkbaIJGf4KAbIjlvM9Dvk2A/WLKSUq5Q7/chp6Ck5YxZEXhQqB6NmGpIG +E4FDQ3HTt19To+2g+VWoWZiLOTWKDJcDqxrxNqkTMexLZDHfL+cSNtW8yMko +fezEa5XHiNqsh/r3mQKCSRFA4pap7pPS/AfWOeEM9S5+3cAoVEQzEMlrVNoy +ZfnhflyKzhF0vpuyYVl3cjUIsIyOe4N83Ozo5TTIzLLuRHbxocc9cdkXPY5G +3DAztfavqIgmhKe+XfSsusUufwfchh1KY2RU2VWngmSVxpF89GRLhwUyrUst +JpgRe1uZqmxQGT2TsCfdezNi7bI7NasKDJaPHd8hCuK4hpW16qJTAkPeTZ7H +u6Q03EjbsURoUVJCwpr4p0sUUAOERFlAMv3ZOtQYK1lYX+f4Y5ru6nC1NzTD +Z0G31N/Rn/rbFdNu1T8oXwkyksQqHkbEwo3qzIT5o5Vc82p+t+xOW5xgvpRU +P4sDsR2SSdx4n1PlVI45wE7H9QhyiUevUitU8XDj0WgRfyzXcWKTSPt+NcZ4 +KII6bObizLuVXCcC4/DTjClN7tNiJJByEs+tkX5mulmr0TdUBtuPJVGI7NIo +hiyukmBaacHZZzKqgaV06a6jq3uBVYRzG8h8DA3F3rrU3Qwr0gdrA7BTlMM9 +CtdEBLHbYz/b2U6OvimcH8htXoGu0NSovsQ+iueVexBSCB8Wz5mvR+ljSH69 +rV1AMCybSwgW2dIwBv6GS23XI9Fvbu+oBu9GeLEvoPrnYtYN1y6TYMf+WycG ++fEG2UZHSEb2DbZPDuDRzvKJ+1/AABQvwEadQJi/UdeegUSssjwi8GsipTbM +zpCS0HaqCeqvVnRX8NdrWXJI19XMEHDxOVA3FV9wPjHYX3MZaOkWOyGLAVSN +kbO/7s+8Lt6/fObG907N+GIr/xO+HUqtr+BdDlMO0sgbQP8V+ozLPFrvg3cm +J6gpT8sSygRxUoVn1nwonHkO/xMzU228U0048XtHEHIqf8WgDDgk4fFCPSFI +MRjtQ+sG4X7+p6GtXhc57FbNFVPmsJVPll0Ed9Y/inwnowcq/cSJmtgG6izE +3zMMId3IxesioiG7z8SRCx5DbcThZeKdvAXzNRZzhwCBrbQ3Jc/lw8Pg9ZRO +afDWey7c6Y4TjfSsw5tIWNtrkV1L/uB5J3CL1ylZqnTlz4UflV2R2Qtrfg9Y +BYotMYe1UWi4+VL2Mtrey9zN9G4hCHNEtG0H4ySAXFgLbXFvuEXEpKWcQe/s +gobq8gs9M6me/6jmDgvIu9zT2BqS1f/pRW4dSiec1wZbMsJ9jSarZtCfaBJH +5M6zLpFnLvu2z95DWJ/efCZN5K/DxmFuPYbdpxQUly/W4QMn5A/PR6hsDgP9 +xDTNDTxn+t3z76Mr/D8vOA3mY/dUNiTjIhGswVNKYmudFVxF39xmO2fSGist +HYaJN9nO1qAlX8XCB+/qnaVC8o7KmoF/N5SY8Y65IScNMdNnJQ5cmZL/y57x +/Tcf9gvuLMsJsy6aLnP2MolUCGFC0nbRU9ZnxRbSK31Gy3AIMoXRxclFGRqy +7LqID3+Y+yc4YlmL+Cv8kRibqabQnG7Wb2nzWZ4qu0zhNQ1KRhO7YZoubjNO +ndvKtF9wD00/HQOtdCtXHRzaA9U+C7dEDXX/I9CC+tfiZCeegscndcqHHrrk +83O1aLUkz0YBtT3elfCva6Dz6ur/EdK3k5Od5TBbvWm9QuxPZkRWaUNyGX27 +hDXfrGyPgK8D1t43HZhbYt57ZvopTtB1J2GVYPU3DNc/5OST4OEKjEOXDUFa +nxhLikLaG5nd5rCRshqmXtAuzogk2wFcDfOAeTKfW8NoY2UL6IOLGAzmTT/3 +7Yunl1SR4prjIQ6MRtdEOQwji8allff7VufU7vAb3v6zumllzFTNFp8As2uy +wuXnHUUlTEZk87v1Od8tIEqv93t4Q4DqnEsh03if7qYjyJu9avH7aA8WO7Ja +iS/OjRPgUt2/Yz3ohxQ8f0ybBevUzrh7hSzkxPmF4FxPD0nOM/cg+iwjt5IE +AOIYFmF/CNsZ74wPJgeyn0qeXVWPk8U/vm3Rn4aFN8Eqe/emBvnjXREJJpG8 +pojTz93IZEMN3j6UW630BHhuz8l3QjYFzKPwYqq0QMBaqd6AMVOnPeY+ugN/ +exsRfPCkRnQ2+7WQD3wcIwKVtriteERyDLtIz5KmTRfS6WCc1KsiyOcrqTE0 +WJy6i99zzLWoibanR141GtIuEGrFaX0TNaCuPOduFAhceEO1eFzjY2JyDtRh +73dRjBdkc7IzJDtcTT/n1DH3zn8+LeoVfktl2NnCuW34zDz+C27rQqW7i7PL +BadaydLcTMa+KWo+yWb1568JiBab0R6/tcnnv9kqS4SZ5whiJOZNUIB/T2+K +ZIEk8vUOJDcHRb/R0KWZ2tMdh1kDPUdb1SNCf5K1AFZY5kj6dxroEsvgn5uO +Wo8a/pqsGBFB02pZ5e2PaWI0dHooUbU3JeVakh1y0sOHdRYjvfaEPPun+LWi +tixwxQgjueUx/ZbjDuARuhnIcJ3vEIlSC3J0M/GJ8MKf6NaqytrlLWBnKD/c +2EOcDY7gV4bn5BW68F5MTwWED2D2LdlfXcLhsvRak0mEo3+uR4OSaMms9YrJ +j9BTaE9z/RjJD555mEWaHaxjHrPBdgnX+Q3OU7aWiWOdsV1+0VYNaiC0KWHa +YduJrCnhur08+BeXvWhOFDqRUWnD/MUaN5sJXYcp//Tvm+E1Lr/ySmcvmJHh +XOg9lxDLpsM6oTh9aaef493sBCZOixWNO24y8eBo4yx06a87hAGdol5G3djN +kWAc5neYQ94auCpkv8o6/JBfSWKfajoNXprHhI2zA30SJVjmmmJDeS3kb875 +wQshLH3ezJxbn6A/4ODPp1kieA6H2PwWk/TQ/Xp+toaLK30C8UHYOqFjauOb +vLNW5JP0zv45U5++Y9EYJpZkyuCW1uc1O/56IwN/gqHNPlTPSUj5fZkffYHi +dR4pLUfNil/4Sx6Gx5lbcJ77h1ahHx3sIu+4WHVXMgigrPSortOpCzuwURyj +LVa34ltOQeMacTiP1MuAGT8yKmAR6DotvR53WeYVpOeRfx/HbwsLEdXWctI0 +w6wtFtwoJIisDtuNh8oWhq7loCTFQy2QhDmkWUfYA9lb6Ze/zctq5v12P5Wr +OiAHCiO4rxjuzwKwrhkTwQIAECFQYIAAErzFTRdv8wXQtMzzfEUoTtT5w5F4 +5nhEeuWYQ87sGn/lUlRc3+xY8Lnw1iTwsqrKZQiTXSEWboxk1pOawW5Hc+tL +Cp15pKkWlnkgZOTa54ecJAC/wwwAYuixysVqSaCrSpHemiKgnbVf5New6Ivr +D4+sJBAAADPdlY4DBx0icSJNVh4Y+jsjHPwkdJfpCpAEtJdvyVIgYsoM59gq +mys6u1GNgiH+wpptuFsQrnnN3bcHgtUe5UFszNmcSmjo1elBuk6K5ObSdYIs +5DS0SwPBvZAUrbRLa7r+oaImTpkw3Oe/2Ihjmz6hSacQCc9tvcPxwn2V7ctI +AJZbGYhZGxMh7mXT5FbD4opuwc0OMVhwtNRuINSVPUeQQW80CuhldyLqZ7mh +88ihVquBRe7Fx+u/yocgNfoUxuso149Kx+DS/g2eAVgLw+U7Ml3DLQTahjYV +JDEza4noiffrN58N95ZNmRsFwCuT5HPnFmkf8M2Wze38x7vInvfLvvQz3DYY +I7MS9vLFIBObyitkJjS6Bl7hl0xNxhyZNGbk04GWPgxnMrd+s8d3AyBHYHb4 +ohrlfgyoZPPSET6EpFb9aNWmT7RE/fhbpq+NtK/UQC9MK7mkFCwAEB9u6U76 +xGA5h3+0wQAEBLgwCYp/wjA5tNxNgpOqFMwUEBcQgdv/nrVSzFDdlEIAPR15 +r5ThWbcSyOP3YXPqsI53/L2Dz+rPgzxdLTvS15jEx/Koxe5rtZ9mnENiCM+k +zdpDORuaHGv5CoK5Un0ZFGkorkgv5Jhx7iB5O3Tqqh5orduhzjcMTdAOtkzQ ++RIXKc7hHTzbAQc7/R/Y42o1J7AIRgRtsNGb8nuBmRyhKmj2q1QytrWsN6jt ++HTKtLjYJm4xoJb1fHcClsSJwtZc966rAJXgKJaKx/tL2VLgi0vP/GqhRe9a +dw8pfA0dZ7zKR2Mp/gTTMi3S+XKebRRUJMfcKu3oC4/zPyX9tRwPQ9uxedK+ +xJGKEfKguUjj6kNe6HP3ptYBFQeXZQMnIuaQ+1jR7xG9dHr/RCZ+WsfxX2k5 +e16n9BrOFKuzzDXg8yhPSZFe1vClhXuY3FgylUM9R5XetO1Hh29JzUw6MKuE +v+ahxvcMdTdMHXvJ8TCzvW+oZpGLLib4rrwlUGYO5i5LvQrH9HMAlA3B08of +rzWRlEkY/JJK2oVmHCuTYOzmp/inIkPCd4o4GMWE1hXWqImwzD18kWdJHG1/ +QnyZoVbrPwjOl0w0WufjsC5O8ALjhhe3FfBwkFkHcCtvp0T9u9Q+5EPOIlQT +gxJDn3Zl/WFuF3EqYBatCzGKiwtMj1NOZDKu4Zo+NowXzChCLyqdGnstzVu5 +Y4XpR5I9cODKtlbQbgeHAfg0hkqBQbDHtfExrc+LyPT5Kjqcws/6KE7/R1Gv +PtOf4dMTZHCXZticktD/6HS9p62Cz7zMFPMd3EKnNTsSoACFou02nM4LRTsQ +BV51KzqUSYYemTwkLhgAIFdw5hp9hAUK6xS6R9JwA9gnIRiNwoPY/Qovuo0X +XYgaTZ3nHpkiTpCEG+7bGRbWRvkMVMXvAcLx8OZ5e0/wGW9ipSeolfQUbq/E +yUuSFaH+RZhgD/ycZ3s+EeJZGKtCKWCG9N2eWAe+mp3fnlKR73DEQpxq/Sco +WvLN69rYJ+4fbNAo04xVkslgxWsiv/zJ/JUvOpKBTqesLJi1pJq93j8Hu1xp +djGstflBiTpOqT5BThaMNlcnvb5yZbrAb/OC6UF2i9vUocv5i2Y+3N8xD1b7 +sZZdDRVxWED81PdLdwH04W5LoeRTGaJ2EhSW5Cra5r5GsTtLqyGLr9nr4D/d +WLw9Onv6XCn6kRCS9k0R7uPH6vdF6h5KI30872vMeG452DgVciHgrdGcJ7/q +aIU5dcFWU842SQo/p0uxn0jubbBqFxyoRj47uunyIqjj8VV/ozulRrZY8KjY +2mK3K/wWSGLFvNTO7KTghcW6XB8RhHyeBkhaI9gVW3uWVtiJjwCr3NgNN6Y8 +jao4PUnyaKREF/lAAQLKw1auv2dHb9ED8uh4QaEhAlAgED7IlnGi3w4y99B0 +30JD4x/JdMidJNPmiO4kouwRJCns7jcSn13uca/QRQfJCzCFjv+tSz9aIww8 +1g+oUsQjjBDVOwrZE31HVsc5565qcd2PIRWx0/0XeLk3hRBcDgn1B8U5bYH8 +C6j03ByRB0BWcyat2Hr0cUTUJhZkVZo2QyDrf0evvdvmEVsnmGeIN6nCWFIB +QQk/g49KnSMgamo5PMweFWUco6DrpJu4PRfHanGaIvIXJ0QA/o3ZItyeUxJI +rQNqTFTtNaUcW5sqRAWkLMPUGU6v8uadoRr2ghPvgDU/FikOILB5w+F+Y565 +BZCi4iMn2RR0ro13jc7XYcxIk+unC1ovxsaKrrev6fRZ4kEFmTHGBd3gR1sU +gZAGZRrp58qFgwS1BgAmSsTDZmZ7dGT7HGBc3rt8L5OYDVXRDWRpfiNGBWsk +SLB7PtjsdWmRzxuJXlNjKrvt0O1UjcqvJlmUw8LOl/Jj134jpN4SkmaKsrkI +zse96d9Ocedmc5EgME9ofidezLX7sowbcb8eGUhAMVrQ97he+OuZ5Gu6QuQv +9RCQg9k5LkMKSBlyVyq+IPoc1KdyntmEVs/+b4GpZ1GStlZZB+PuOYPEK1XD +0VkWYRvbF6rZaSe2tLnZHsmE04psSNBAzx17FHcDaMRU9e8N+zrCg5y7ieiQ +YZX+Gm+gQrgYMZndqfb7SfnFV8/a8X8wZ4516qUiclTRe+vN/mTOb/NH5JaS +OavP8me9076LSSDRpHhqITXd8FTZkbO0DLh4b3aWrqt5DJElouxko8iZ0C9N +eeHkNZ4t3d4DOh0by1HOX7TLIDIPNkaOB8BQjilzw0QGI32G3x8Z9lL6vI9u +GvP2oJigmmCo8g/bD4ZpKmHRNHS0oI5CQU4NjoBlPan6BWPLbd+4fRXsZUsp +grLt4aMegZMULNtfwRp2A3Go0Im+FVwJl3jrVgK1Em3mkgN5XFlhuKyZV2p/ +mDcX66USsL1DiCo3b/vDaC1Xc2iwpS8XL+AYkO3rbAXElBZeddXsLyR1hdec +OY0uPpGdd56yHDdsEXULs97E4sYO13qWUrQbBleJ6NVPDJyrGt9NSiHuO7Fi +KKqvaN0MIYPHZV16gr0wB/Sqh3KOKi8KWrH6YkIG4uzAgE32qMt1LMuRtW/A +joARVQqWqW3WDWWDD9Pi3quvCLE2dOjn1Zi9hIqC7lQeFNJS9DZRqnPSJYi3 +27C9z2N59d0KXrWQ2saZaSX1s4qEVjEItb7XhC66lY3oYqy75oLUSJeHPuMY +ikXrheXMMC2iXi9dE+7eiiEzj7DtfwfxFs7Z+j9FheU4SeQMtW1/60ErejTy +Grlxt8+0jGLXKE7cZgQIAF7x+6+mXuI8r8w6p+N0HMlY4AAArwicypW8YUhG +cuElVfRjTMfQsms9PeN/LpRyCNHvAI+Qt5AsNEF3pjTdj5GmCQF1tcNpMe32 +toiGPfusyEUyA9oskTQfwbV+3nsEJ+HpSpsAn7G6yqkqrRdlUsofZ995NATp +9tI2tSjBqkv8Qq9KaZcSfpfGjsQAymh305aHPkzRcPqmIECAAW6MML0vhQej +GRzOg7XX1DsexiMvkCOzNcZiqxwgKoSuY0PBIJHTN/QWB4EdtAO9UPqGVxLQ +RVXmD34aUkrLdxuEjN06wHH11InW9Pof8IamD7ZXVmcrRUbA8FYdYtE9+UNQ +ECAWUVWiSsmpW81/ouhaDQaNhNUCQLgmONs2jO1wYaNYIW6ugkXrDXD2gLqg +7eU9ZEFGikXPsfOjfW5hhyGFQcCuS0kwcymGpwYXGKsFrA2LI8I2F3qSxlFK +MxP4ojUctzXrTi9zQcDE6NHmUEgTVo4fzbV7CdqU2EMUXbTV8h91W33BihFd +a+4cm+cQQeKRdGU8uN5FpBsLQx6JDcMCuC12J/KytYqutGt46TmSNHtg0g+3 +wtq+uuAvGzzyxghsR3qJ9S0/L7jx9j6+XgVexVUHLjw5nEPbejddCYrMBgCh +Bjz7MI2xrwrMWtCtccKwfTMYcQdb/0LeJjkgNEBWr/8Z8NhSlF8ID7+WwU7+ ++pCbXYF18zKipoqjcjqay2HaiQ4D3wPNTk6Df/cBVqjf0W4ReAEwnhd1XDil +vJcwMTNFqY4FuUOBhLMsyrH3BzI8jCI+nl0Tl1pgPuqH2mPRGHnLU96/Y+cm +6MncRWWUbO1NfzoDWGIuZlRbr1XarpmL2fHMZLSjZ/xJT1FDBUu5GgJHPJGD +diNn495DwBIl7SAECBARIp4kzMKSd5FsZyT00VVRf75AwUU3ezpP445fGgJX +Rs0cDjvKNU1yarkWy45OT0XRobxeT8M+Z+jvVCYPhKNzSmVi3IphIRzmMV3k +6kCI+iZNI9xvS6JoEssCgS16oD1ScFnsSP5XmoMmlINnb59U/gNX5LZYMCFB +7/l4Gzw57CW8zLDPTzErD0a6P3el6X0KTDTCeryoyIntIqfgPav4gKYkpo+8 +BzVwNCbolv43sbJcFNeVxA3TqNr5332ZpPL/+8hzf3dRwH6M3aPH7Z2Xptl/ +df+va/5/j8HDWwEzYtPKz6Ar7opDiScrdMCM7uKwjsapBSWAYsvURkQSu1K2 +8Q+ZTXPPnuI0TAhw0bGSCMH68ARJpvkW6vsPVLIjN5+1pc8O2f3UhH3DJ7ng +vTR0MBu+SbeSCIoEVKR6VEtC1NmhIpXzYu8sG3B3IspHgPPc3zDaKRAlYDIV +BAe/CxOlVtpfqptc4zNpj8Zr66FEx+dP7Z1dKQ3ptlIbsIS6OHJDihyhADkJ +i/zWrAii+BHWy9ht59JXWYe60Z9lq8uSyZmfrdwcdZmwO9cBi8oVznHM9vZk +KqsTfi3Hp/v7gKfEnuKaUuM6XeRhAIkF3cXW6bG9UMKW5tx6ObYQEsNqglt3 +Q2ymOSVPJaqFFMPuwRVGvbKixCQbuxdaN9N66Z+jtSubLa75xKbs8CcD4cEC +UK7MPBwhFTTnQahoWsf5zW+o+ZZrryxRSwCibxjXe+ILlzDpVd1k02zgkiUy +6xO8f0BN/Vzd7mOTg6roeaf6V/NmY751/EFQ+vEKNDPE3ELfT+nzPBFXnYp0 +z6fRM64c47/GkXfbnHJkzZqlJOwLkVQ5ynfFR6e32YQR8lr90lJZWtE8Ib4a +kB96rmOhIB0mq2Zm1cern5NPpvhia+TIzi5AL2sIRh+r1V+GiB281OXErVgA +D3YgtcGRPUVmuD5/VSTQAkFTJlwbkRYFkBSAgQRilMFMClzpM7QppiHZV2nh +XehRC2U+WrF7CODc92M0gnLwOLYRUOmDDN8N3MAsXkD+ISMjbiDX/WvnpwxB +bNGCx+mydeqIu7U06GyqXNKy0cK9drR4ciihay68G+fenrU/dEiLQTynNEfA +6Y+lhYgtsbNGPcwnsKH4/3hI4OD5AknKZBn2VKzaqopue3pTrJU8QaC78eyS +kW/PqyOqHsMAkwxFtSYbC6w/qtjolHrSViA+ji+T22CNTsH2U7qC6u74jCxQ +xP00B5s4ZuDjrg5m+hzQ7VYolfjGVYEND/rmbUVOHcTJPwgwa3vU+CxPhAwA +POtsKPrsnYtm2nPFk2xXGS8Zh2Wkv14v9Gr+RutfaIA6vKUgAGXi49D0cZ8N +9hOs/GJw1u8JU5DsHpeYuPOZjbYqC5shKf84e4H533RKvQAvQN/tWwF2g+De +2PpclJ24kicNlTIkDZDWt8xYqCqTCRYrtfllJ0CbTIH6Z3K4+klr2nVrIkmZ +YewZbFmNj9uGE1SNlcX9459ki4ROs34chzMIICDZI/WppEfrqy9UxIFEKEDl +eVmWHSfAAeaWQ7WWGtnEd+PBR/6SxhB5Dg+/I5YTJoEACXwYLUHS8m1/yZXU +OknT4fVmEl9EbE41iE8oBzEkU3e5ULMGfnyjt2PIfCxcZ6TaI05K/2S4K1GE +xpFMMxuwaRmro30czYUPLjr3QHWbkLBl0U8sgumc4TQlWKGVKsfeSWpagV+I +ofGlT9kaABYGukTCZU65yMTwiJO70HzRM32K3FwfyEAgApR3/qwkXrGZkKLC +1bAL7YOgJobvYYemlAupPWPhhpBxLwAfZTCdM5cGTh781BBK6+9UXVJN7iwh +V/lpW5C6MV4uWHH22x13FCZ9TfVWNRiMQBdMf7uwHjl8whRshNQKR0P9etj8 +BBq7YdLOqc2N2wa/D+e6jBr/uvZqSbg21mKTRHzdsC1aPmVdqD0hSc2O1aq6 +M4sj9/tQjyNNSR8rJV68RibS6a6OXYUBuFK8/pMkRBtlpc1CZwEPEREGVjxF +7JkwrjS/RMHbUHqkCHDyQnO218H0c+Gt7FXZlUMpOA7AwLYHgmD+q/zQX1/b +NRDtthTVkOBEUlkKO3ut83A/V1LuAAjrOtJyEqlC8jt8vz26978YMPtkDmaT +zJ/nDEOu1pa91slch76BpGpGZfj4zvcu4hQAUwQCABO9k/tKTOdH+eoH7trU +vk04PZUyEM62m3kWGwn0Ar6OPnphwL5tjMAn0fiJNOsKAx95A+MF/qNA2giH +uM/ZZxoQlij0ua7FagLyQpZdkcZCZImpPkpGV83gLeiypWZeBLSUyl6CpaVO +SvzSHRNrmcNq88hiMw7+TyHI+1rCyh8BJYXQN7bStiw2IsiJPqbZ/wUMDsMk +Vhhsf/uWtGjH4lCmXxQ+6W18nyHVe3pDAeRuQH5kiAXH1aDNP5nKSaEvaotk +0jZaxcFGrLGIoYGx3cRWlPR8ShHgQFCDEtm+oGuf6BHUzCMgQ223CTIAnS0K +9zYCrAw2FOIYrVAVUOE2zih13WfKdOWCvWs76mnMhabkQVHzqtvmDIdpC//d +rWJr6hVrayyv6K2ehmG/VKcqDTs1JWm3oBIrMbkzZWld+kHwCNAgJUdW1uQK +z546eKI9bYgTxFQrWOh1TJrplHfynm5bNAlJfW4Gb3w4F2GTO32bcpb/HoSV +E6d3+sB/EwfbPgiNs/17MRPC/CyLMepk9FzdEKZnHseMX4gnaZbJhYVp9kN6 +B4PYKrbbZ67TrLKp4X3jUBir/ya/OSfxddgzu8+K1fwnKQZO2eAnZw2D0DuM +u7hXjB7nZjFmm7+2kWmvixeLY9rg6XT0u4FYyKkT2UjcKOwcd2K6Mi95S2bn +XttmLknCexNxlxkjH6/YThZm+E5IcwmNlF1bti4wl9H0+b195RKEcU0ov7jU +Ac556SCWq9DXHfuTrj1+jm7U5jcAxqfRgXEPstXUrJJmLxj/GRtZ1qAw3N23 +lH8A4FLDveMlc4Tav5/NHBAAMeUzqar6CGGWUyCSEy7U7JF0Eyg1M3Ce8Zok +JcVcY95DJVEfWn18fclR/xDMkWVe991cqhfEZehQ/M8wo2qGS03X5kkA7Epv +OT6gE9hyrLHPljH1HkGjqetVu8JOGdEjAhP0It7x15nvYq+biEu/Lzk67wku +eBPMzczIQ64wRUCFvAlY2un6P9yWGhoZWA/36Iqru9fv9v5pU84oLK+BT7Xc +XGo/P483sm0N1PD3bbH4n+pqH1c073H65LdL0jpBAqXan1PIhaoD+DhOeKa1 +DmtijYZuaf8J5OHG+qdlrtq6mMgcwoskQycQpqIv9KWeh2MWWFt5oyjIzdOF +umvC/GbMjLynywJU+XtnvHw7tdk+8B5s56bhlXo741JQS4DVgP7smLT4rdDT +2sa7dXNmg+Tly5tzz7nKN2/qinyoxlAsJh/kIFy1+H8hqwuBusd60hmMnu5+ +pzF7h0x4pxCY/y3zlxyRUblq81MmCu2sAIfon2oSMz0cy7MpzoX8ypJ4ScvE +N1ouWkfpVbfxkG4jEQB72/JNujfmlPZ65Xzuvsspo+aM+rl2UVkC8m86RqDG +C66to+rUROYet7DujWOFcklZoMeQA8mhgcEmKOjUv8H2eW2izY+aDa6b+QCI +eZl8KlYUQYXgC0I0T1K6Vj98kDWoDGW7v/ATrkyaLPBMYmv+C25DEc64pPuz +a8FJsh6l9vBaQgoRI800srkq1UPWPmXFQNWIOvZZkxGJRfmM/LiZ1RLMV+LX +laBb2g2mzRhkWiBr67Tuj0hkNLcwwyNmfWZF9RbK9clnsghE1/3+Kg9x0icD +TzATXCPhsz06DUYcdo1NKMIwlYdFk4TQAl67yI7b2JsekbfZLScb3QElaxlc +hxnl73xY+XT53RSiVotTFCbPFFN7Z6PsxUPwxI81VasGFI2JdCLbvCNwmLP9 +Ws4l5nUPInUBN4nSnYviwgDv/iVLaHZCahGtcqjyscVO473zGICByhqt1msy +SIeSczUdeyVuZA29LPKUjSE8bXSfwaYyX9V8ZZAbJjq5Q7P7wLHg0yq995MR +Iv1oe4ixMD7IxxXdoeWr/7d9WfdjVcwWQxOCa5kCFfQPQ04PYZQJOxLDqQZr +Qn5rFkP6V36SODOhm2sJKEKaX8EPi3/4/uSrlwMLOPypT37YqziSOLZnMeAO +y1e1x4FvTyV3PPhDa9YBb1ncxxf7P9BOWj8pUxGxaIG7OcVZJ4QYADTk9y9I +c9uYb3+Uduv/ZLG6WT2xic13JFw9nA9AG6f7DMiOyDjq0GFEyPbTDMhRMtkz +DXV9wFLHrZF8Mk/FgDbY3dP50Y+xVt84RvuptJBjvy3GdHEOYfTG9sV8bgOA +8zVt5dhZwf57XPLupavdhNYCo6I5IlmCABYH4PFJ3ZEyNwcRMsYw6HK6dPvo +pqNp45qc83fjLCWXo1h7FkzUTDCUttr8XeDOxp+S9ureGzWucFcGgNmGxmsi +pV3gZi3tcezof1B/mBKHHN83tFNLvWf4E9ohh6w4j03w5jNc/HZEfWiv4Jfu +k4zJWviG4+UEASv7Jh36rENccbxW4XoQWQo3XQnDocywG3u6ZM0ly0f+wyFN +Ph9D/5ODLC3File5wXVxEyM18ECRFjmHxWncEDtMGMzJ1BYQcziqKHpqnee3 +N9hNMi88qIoHVVuzGZHaGjfxY66HGJfQpZiI5oW8zTsEXj7MSnJMYoRPsGQi +l6UlARDl7rQIAiVRmoe8kumhEjDU1kUyR5KvX6/EH2JRbyx/gs+KOMKUYMwi +c+NXlEg13+SqS+IETWrtOShVa0tiBrnhWu2A875gqu0WnrZcqmV+njgKfu9s +yvL7pdVHaQbLwzPRlAwVYk0/tr4RkWmDT40MKzwZfp5OZsvMWtT9Xj8Y/Rb2 +URyHU+yRgLJyNs7oiZmiLa57hOtn+DWEjLncJhT1y4+YMgZ1rOgXz65U572p +orRYYMa+OUypshcD++PhLC1CPN2VH/F5W1GW+HtJXn0LARnNRxP0ngG5uhTA +EegIcCrwAfm4R/D1jLhyuePrnsZFE1jO6G43l63x5pL6iDI4l+KdwXpZKrPt +8IlKRE6440Zbdn/Dyc9SUpsVw6e82RahJ0yanbJiO3F0I7YPWhvB6YatNd/h +wVlCiTHzSJD/fTPJdgcwlyvWouTmVDSfABACWpB8WH9YoHLKSZ35uWToegjW +p0c1MM0ujOiu/ho54D2o7f0ClmA/YWhvauL5/yPe/N/UAqxNleSbgVGAh+uY +S/FEjP76vyjbn++v977P2Zwg+xeBb/A2eQBukk/d0N1p5X/n/Q2HjulHTcw2 +aTngsYyy8QbnJOo8rNo02ckfhy47duea5jCinSi6oTFP45t51SWHr2dixpsC +vyD681XfRzzNoCWOP+niJhRM1W7E3afluSBqJfcqH+1nVQuKJq7B/RBDKa3O +hp/BiE67o34QmRIdhbKXDPZ+Fr6WllCG1fc91LWg96yc357sbuQ4yyiI1DaU +vnaoABGgT5WCYI0MpGWhd428I7a0q55QOWnnvNAJpOuKVsE4M5OkE+q2La/3 +UlsLHWKAdsc314tF5NxjkekLOM/IPxTN8Acy5SMRY3kbBLvkcKaYRRkI0nua +asEwuAjn94pb7V4b4RIZeFIF2Ef6jxUEBhXEXOmWfOSwx/N23T4rG9S3DK+a +KHVxhhbQ9NQisCNmHVX49yDHMd1pLNTxD+Cv8fTtwZdbpMfuKi+GKWll0o+1 +EbX693s897GnOzZSnX9wAE/ipZmbdgt2hgpV+TGBsRJZFAtEopgoFTQ8GFs0 +lNdiDm3JP7SAr+VWFGCymfWtfOYARScCXaBJ5rez+F0KoBBMBhfuwn+xvOjJ +g6zA9mEzeGklGVCMSLheKwq97N/i4HxQD1LA58KNbl8LgTtMo9dOStpjT2l4 +BdoOXlhBkXRHwh26JEnSK9mb/ElLazXv1SiCQhTJP78qegA06WXftNP6cICM +z8tzdBNOv3WBqcloMqJvsfIVxjpnxf244v7X3kbefskB26VOEr3ULwBsZVod +j53DehuxSfTGoIlMwGXoiRmIsc2hnuf8IvKvMrocmw4c/OQQ1BsXh5eJQ5cW +oSr+rDI+k1DJ0fNSXMhtBqopsHN1XggywYf/r47Rr6UFGSTRmB7fkMMK8xRQ +csc/8qFNsyIWw3O5EIdDx9GtMp8Dqi+iCvUUPU+tY+lTET8L37oniL5l3gAa +RT/OeGUxLJPm8Q7GHIgkoCzswlCi++JruacF3dc1jkAKeXaKhV4q2nSWDLkT +1aPrykZMkQW0xI4JI2nh9H40kpw4FWf8LlvOTRT8QK1m1cebs9oZEB3KWJth +HljQwXgbqjB/ZW0YX4cNTvg4OjaCOAZ4HkI0WMFxTOV6sGq9jl0lvuMdrtfS +cG0IIuCAjt7LCM90pc9280+mfvBgeXrh78QOQ4IS1JqYosoSG3jj3mTQGkVH +g51ptSB5VjAo998p1Hme98KNcffzOqOZK3lwL+RGCgmU1Xw+zZfxhDweGhZo +ixWzKkq+CwknGZPb1WOsElbWlE9ENvdCAUuvjFWzo8/VY4ZKTPrGobcQ40nl +5AAvsNXkhjZGQ6xT+pf5v06heO755m/QONrZYf8/jiOGgYgypSuZG9AjQas9 +4eiswjUHCzfiefVQVoe3Y0MTxSkuar6WKdX1yG7+eKpUikJB1+/+ZX6TP1sx +8ux7rn1RAtmBbxUHKPNFfZ/p3WUGlk6wiVClgHYH7lbmNNb882TJ8bZzxUeJ +T5tqTKO+OU/jK5URvbfTBjXERIBNr++Ev1NtHAzaAJcujypvYQ13eVvLxXqk +XgLGltnwkWutZZGJHyU4xlvq/70BSpcNJ4xjCaKL9R2pz7aaout/xKsCs8uk +CXAslmi5f2rG8whI90zM1/MrLleXCiUxJVtFTwJe7OQZX5V8zZruffOyIRjz +ABwQJrhuv7hq36ZSZ3cHFwxuHGwDRqDGY+nlEaieL4ixWe7DKgjIAB2MggBt +S+pK/VXtFjb2Z19Hzkes3n0kvlBzYcd0Lc50vl/DE25cTnBO4bs1rtr7L5yI ++VbtrXFWut/NxXsn8Evg7uWndEn8tdGasjfcRwGMo9tuD8Im7JmKj8QoJmhZ +NXSKIuJKmgT0C2wwonyaigaSS7wck3ppyj5OtIbU5zqoii/UbRkD0iXB5qqr +ZIDQxrUogLXe55j+ajbth1l6xUELKZX60imUl3Ecg2QKcRg06JIxyAdyLIHt +Ppx9VHCp9elUOfNo8H8imGjUvEEzKw/wmSrK8OTDIxrSVg6jHLplvfwL6cWS +55DTp4CjLj8go74SCKXYhi/DyvTwivcEhsrC26BGMFyx8/HvtFbiGVv0BwSR +IVnTamOVXAbSBGp7xYtiUuzJCp2pGTVuSjD29WL3bPzjGn8/cmdzAVfEfFf+ +LJcL15lne/4I3sg205Y76QZpVvMlzt1OT5onP1r8nA8mMaQWD1qGdsLQrSAw +Ogeb994B+HGG2FhpvXy+KRO/l9+XlFSGPZd36IRNOy76Za7M2r6lvDL/IerE +tObcr96+JvomPAXQplvoLLwCITGmS06Y7bxqSJQ8+sdG1Ry5LX42MhRRa+Vc +ra+kq3q2vqGWhNE6KwoG1CwtXCldGGhlEJ5c4jRNV+8PJru+soryn6jbpqmx +v2Dx9av4cs5v5LLBhUBC4jvA1DY1pUz+GD2Ym/TU9GzFcu6vd9ggv3MksHWl +sPHgGtMjPd+88L+HIbFyObAWF9VIiDeRSeCkUnKtmGaTySSTF72BbE88qMNe +V/ogdxN189nmVbJ5o1EfRJ2Lcofcx8t2Ce2rWg0Z5CVmryo1ddMXUtw6bMzf +LPTSDffjkxuhBSHCivlezy/KKdYdpo5V7HlDaZgAPIMKfeyqNZucrdWCBI7E +gu3m6Kqt0UbEUmK5bfkehag2tWy0gmmCE7fWEI0VlVkQP2vAMq4pDgD8OVrw +TGeOdPEPnXO8Zymf7bIEK+W4CBsKFBcUfK0CJZ4lekdVYRt5vjVp3JanERZs +VjZNmnUaXpT28l+GgcG7NdbTBhkEBnq3JOBAdwM1hOkLBe4NVzdv4KA0E+eA +UAyAwWYDAUdopIX9uDmsGCBDsueRMsYhwALYUnUsF9cOBY35TRkWHgi0GCAh +YkMBHgMC1q6kNABeag2ZoheusY9Q2A1d1g8DIIECABYOaPy95HfHisTOVAiS +bygfUfgSsVSRhXzHDoK7gi9ew2Xc3k9hJkgHOYNTUNimYsY2HGi+oGiVjKs5 +3LgYYtedI1iwa7W+LLnsWsj7+QrU4/EdNzs8bsaJ2idqnAKnv61DA5yaxKsm +50csYycVXkO/LXkFdnXlcLQ1TOAzB8m8j5KYWUuMNTOd4Nrwn+i1diPq6aWz +Gq3fMjjzmsukmducNcrZGL7ZTCnHA95jJP3AB1HeQXlKfPdb357NfwExMXEl +HB4ds0nSWWXqUfgOpj3mRX+YIp8TV4e9uDYIem/1/zZfkXmXB8DY/d9R2voM +H/pyX69l+H8Wapws3EAD+dCgAOM3au2nQ0Hd2Sz3DBFRoyq1qWJtjzKv8DjO +Nm4qdPmKI2fmfhdWPyA7Ztll9xzIrpPpksq8w0v8LPPMo+C6Yx3vgNKYC/lt +CoImVeTVZ2iCiWsJHjESjibOhuGfO6RV/lc/fXML24Hm1xv2Ol4+St4hTjPA +69FLx3y8bXVgmad476g3gLE7EMG1HrCnLy9Hm7Ck6/It9ousryptMzYo6xBa +Au2C7pGgxr+XB8NVVKImNZDFAjfXHU/RsoZbxEAAAgAQBEhws+gTOVeCVbQG +2B8Ivu1L6pIspTNkVgJ0XoDiQJRttKsYda0os1d2dmXHt887Ur2vov8KFThn +zsggPEVbeF7StfHTPVlqgGT9sQOS73Hw0Krrmi+vqjwYbu0bkuugGYQeYDvJ +MnUMrryEAeTaQN+nloB73WTzPQTeJRuZlzUMQKEfoHYcqYp9EgbC8NtSQwFd +sqlZSWJwihlFCLpf+wRUmhIldXU9gZe7BffSHfPhMdXqyM/2YBSFBYUssdym +evMQz9ZmKhNAEdf75e0PL6kCVYSlQgRuaPYS508LiRZwra1C9sFbvY5VNBpA +9pfZWraOaImdQYORno+372I4zPgxvmkRQAf/q3+9JSbt26qIGaXPDN+YxNZ+ +aL3rGPcauEZefN13OxMIqOE9swtBUg7TzHSLgPjoVEj+T+99siC+iewVKRWp ++ol/s6XeVy+i2I7xGQo+ehAwV0Q+vHc71c+x7mt3h3urHwsntoHxV/mDCRpQ +UVXi5JlPlG7yhyitwbqy3L79UI00fDFHM2/8SzVKBtfvnToJIPMJhXKAARbq +Bv7YVxzZA0ZUhdUysiZIQ1Wd09IDXTQtiKcViJr/qgWjsQYnstJ4lrm7lLE2 +nkzbo7PuRRMnGsGC4+bkObbKOV02Q4zUlmPfbpih16J6gt+4RvdGdFKQewSx +2sGnhdzODL5vKvfeHhxE3B5N/kZ/ZYdw20T7EMpPMJavq8sgXENMGM8AxIWn +EAgAQIB8HfuhC6pojt1BGtIMUJ0r+DWwx3TVjBCVLdbL8TL6tBy/L/izkVvl +74S2PUTqi95oFsXUgmmqik/qiJKxLoeDfMR/SqY/rBWay4fQt5rjALamhvD8 +o/d0nctr+Av6ks2KNZDzNoBIXkt0bdeL7a4zGdSymglTIxCpewErnKW50B86 +lZwuMdOW4zLrnuvK5CaGtlsotjQdcEqQ6+hQOXHdhBlxZYg8MIUbk1uHG9Sm +ZWbmQz5qW+pd96LbGo8Ym+v5psxUyHIYqqP2w3MY28g4OT5PPBc/BpIgGLRF +OYVzpIsQRB+VKEPKE2jMFd/G0+pY4Bv+FiZeds3VJ3KcJrbbPGJxloduryJ7 +v8u69Pda7I2j8NxaNr4KGwHuk1YpcaWtQz25XmcSQlNaYefrZTVO6i3KDR/C +zthW3Z7czp5PNc7XO7HfHaz6086bWzfYzxFTX+t4hWyqaILlGVVoAj9mDbId +qZc1vUKHMbFKAP/bxfBQbkV5FbrAS5cZNYxYZ96TSXh/vqc39255jSx+jVMS +M9Uby6FqNOMCw//aYGe1ypV+MxsFoGDxMHd3eVhwB2UVfZaoMpQ/pD8h3A84 +YYJymtswhUGjzrtZHOtUu6AYoCtq1Fy/Yz1g5WTvsITkuEiw2wMcGFmlhrhI +YNDWbyfYwaZLhcPPiXlKGhQf5epFpJoQJC2ZXqI3cb2U+/tbi/0TEjilYqBN +XlY/3WR8VoSUO8RWfIX9tDJq5I9g4G8y+pC0e4hRdmGGGpOO2TcMO5NnKWd4 +xwNAsSmdiCQ+DEniHHfiM+1ODxRGWxVXPByUw+/PwD0NqRFrxsHXAJ6ZXfcN +4KptNy67DcDrEwtzWB1/32ci/AiqizKjTurXGqun+fkWgsl5IktLFa4PMFDa +7xKUuiO+iyBPYlDfpwigP/NDEk4qgr/WfZ1JV8vl8kJnmE+3SQAvkTSv9cGV +GeI4LuH4s1RBXkCW1d/5TyS5KD2vqbYt1x5PGhVISMN/baj6itsZmJD9W96C +qrPwMsjOrU3mRd4ddfTk8W+H+1Z435x63QtsriRadyojWMW1jUXYC36uJ4gP +XNB17C56+U3FEpxe9cdeURz3mfdQhnhDszSQQQENPtKEhSMzdxi5hgyG493/ +os7JEv7QjLqLWUKdD9REZ/8wyDx7Q8KwheJiMyTyWpzWYXk1KXI/H6gqwxgk +VwouIQuZODDADn7vZql3xQ5+NyTcp6TWRYm3J64MySTEOMlKa2W5O8J4VJHL +wmOAUj2RYuHtPr1G6uIPdaG1nf5LKdGW0JOnexjy2ycGKVvABYSIlLVoHTqq +NYv1BX/MznVfagnOUnaIGK1Zj5beTF8WB5USP+A+ZkmwrP0ESO8GJN9Z1/Jo +VIDZvk3E7qfUX/0Wu6jmi4L7QWwAF398dCrHwlbnJGI6BWE7HIAhezwvuhxY +KnihcwiCymSd2wL6Fz42KshqZPKtvlaetzPA4uX1xHxWIuaQbre3Wq1Ew8wc +c2D5dnSpF0YmqZVaPTRK/WTAD4rBv+0GQZ/BPXazolcQQE9433GvAZSNH/X8 +Xgj1d4u0L7dgmeY+ucqRAoZ0pcMYoHffq5DkYMH3FWnCXTuH7GlKe8xHixpP +VTPSFeMAtu1QSKgv1XyL6ME82j2cQ+CkdSc6z76An3K2U/E9mLN13HT/ISLk +Wv0zPztYZVK2wzSzMx4GBHfeHunJJmX8k6v8AMN0MJsesFzbTM7Fo4bvPGy0 +TbxAl4qwYzLsCMBgAcfad+k2TmlR2FugRWOi8/Hu0Af6//KLLt0pnxGPG7Wu +Rryc5+79Q8oGfwebQWGEb93cV/W9LtR0tLV7KUBnmuTwNMJxRYw6Bct3GAAc +px+83I1mKLea3O5ejTn0iuxZ2j/iWF7Qln6KfXS5zfdDNnhE/oYvRZwcjWsr +Me6lIDe4BKPy1Zt45PGsutmmPaRCwmD8Kux/Mo4nU37GnpoSURto8Mdkgwtd +8THAMzacj7stzB/fXnP1r2eK4EzuEO5UUyjDGHwsLatbl37tcX6EXnBp2hU2 +cYjjZh1BAAXnw5CShuXY657AQ5KplfCYdfSVKQOVDDgehuSm0SMrQaPFlr5/ +h42Rwa/aniWuaipy7ctKfSQbCPb+efqTXqo+RZeC2qkJ/BS4l27V2+ndp/t8 +R5e/B9/qSyDl9Bayxyv4zck5+hINgaVtstaB0NhIYNCi0wHIHSh7pw5RHRTb +5r0dJdv/tXL9emCv2kevco48D3a/OyjMuaimHe4W8ksxHs3dvtkqDg3w0sNt +HhC0ep5XIy+jmTuSxNjmQnF7tiFbFDk2IsY0jTeQcWfMcmJLtf85ZkaqFL5D +T+26Vu0FCE4R9DE5TCSTDtVY6luesAebX9Xa2tboxnDdmew+Wnaz9R3dUAPV +OeVLensYYxLmHhMdYxAVZFMAEATETGKV2Vu9l+z5SGzFIEg2b4ceQ+HEKD8k +X0zsfTkqzx+r1XXYqITCnx3DWNHaq6WbiKD95Q4r1rYD/uKeKqwuj/Y/NPNJ +ZoTQvOEfsqx5qBroUk5/u0fPk9kYTlWIwTgCTDhzNkuu0WRB1lwQsuTb6gqW +xmKgFf+D27VDSYR+zUp5pV0DR/XrBcKy0PudLrIJZ2ooYR3Hm4QqyoU8heO3 +T5EKx1tUiLilf5rtloWrw7+yi11Si8c+OTy+5J+1KZdKS0FxUIACObG0znWX +S9v70VbflLThy35Wr+UxU3qPQQAL8RUEUOdHVnKhfDDvA4aJxPJfOafJWp4/ +wmgzJ2ClY5umy0pF2MJkrHln/0riRuojUD9R3QuVF48XLfXFcfIvIST+277r +q47HYEirD0IqDCJWHfGieilo6RuDwqopvI/iZHxei7hczyMn6LLXgFAZy4S1 +9e0pBHT8SpFhBWyZuu0fEB3PUB+vzDHx8VRuLSah1rySDnxeLdySQ9haaGB1 +FGQ6AIq/v0N0VtW2lbcJmsJ2UobNJ4IjtNEkNpZqtAUBnar+1RwlXnFIOxi4 +I9krL0/Zf3udjHL6sGqwzOMmVJLyYxQKVbfONQbxP6yWbEtNo03q7d3h8eTg +lSWJ1CiGnrqfj8q17bipeJggn7c+bdwHDwAzS4hWzRMryUZLEh+6enEUSR3U +IXwa9HGdKMokkCR9NpSyVXq5NMHw6wYPoAManM6QBC4MEBHA3PQCrrHxfH2d +h1J+tKMFlSSbZBtWOpwG9nsWZXg8W5P72KwKyMn06CzXREJ5VAO4RlRCptJn +0ls6nxPFx3c+EBBGMGUhAeRgo0+h4pU9MmnkxuEdNDWPN3VfDa44zTYyfGRz +7h34QjrrmCg1cz724RQR+zZDwsqS71uQifq9NF7zzVE+rrUdIGRjpz5iUELW +5Pg/QNnJJvjgZlz0fO4y/f34bj1jN5N0FVW0TRVayE1xvUxm0S83J1XZbLoj +bwaabjdIng85yCCiLLjJ6j9yeSHV1dj65i0Kpy0JlK9V7qpZmrCAuSpG67Vf +3qzGKRLibwSjHVrPCXjhxhep6YO1peO5M0J2uxtLOm0qU0A9q6lOtqhfScLS +4NJJFl+0yirSvcmjnVwWjG2/nXM8GK5JLt8cqnLmBFel8nshABtncn9W2ZiH +6l7m2q1K2MrJm5Zn154z33OLvPlS3wMFHXtAAgFEWp72jFEdULXXhFWJzK/h +nGIW0NqJaTcXsIl6SEcWG3p6GWnlTS7bT8SuGt9oh9h7p1E7DoiFmwoLUcH5 +u3UNU9qe/tb+q6ShQ1AzpYeuzCcEhqqxb2oHD+PNwT85SdSomcxpIyWFztKM +ka1U3A8WKp0JDmhP3S87KlfrfLPyNXdWzACRcx+03AeYFz6sX5j1QdW8RAAo +xQo70wLX6IzvNb9Yoruf3O+vMi9XTaNtJX6vY/VjpW0mneIDs0luMzfd9I+e +gjeWKLzaqV56T8Hxrjzd5SaZQWHbxCJxdRyAG4k7leObsJ78ns3Rm/eiuW2P +OF1NJon+26FQlF1EtsKb1WA8mf/Gb6QBUdpygRpm47dRTXLyexWVZOML0S3F +nTMCIM4GtBKC07xF/qL1RxjWBxaEZVRLisPv0AtsYac2qbAzMdLoiqAueChR +xytBO9j622TJ4Zou+SQUco4GCiUKMhqqWavdxdxSwPTFK2+qfpUB/EA0dDxL +dVTjKc14nPmjThje+3969YroK7BR/l4ID9Yvsrl7q3ZTL7ozxstZd4pAZuEh +vtHcfRP36/+5AlaeA/t3mfcjdwKgQPyEY6l1hGAlCaQ/U5VswgIckrEZ6kJT +OfSW+0iAEW2DUSM5n7xMuKDmfllKkdUKbj+bItRz2PJQBGFh4/FO0teSTRbj +2Ey92zoeJT2q/dS4b10tuRpxx2oRoo1bhLBQA3mrh2RX/15y05N95cWwjzfS +l792cwRAOz+mPDw3DrH11RiSkQ1gLlPSWp86v5RzydHc+m1ZSq9VhI7gaAJz +ACPLKICiIh1if5UPeTp9o0yx3qQWpCjo7dy7KbSuaLP2PrGlHJgAgRrOhgG8 +ARgAwRibhnaXgAgwOABgpgRBAldzyw4KndSvBUL8GIQOuWLGbrFc/KM+QU+D +da3p1EGEw+0yuYCuf+C39LmEVvZ4032HK70tpQPO9lPcLJ63Ezwu+UDDyqsi +7QzvSRsFebHl10Rjci/8VMPz6LuqzFPCx6fwqgBHE3CPuRl8AZY/1OA5Dt24 +Yk9rI+eMkrbVy/+l0OoTLGzXlRv/NDxzdqMxpq2F8mk2Ky1vxnF3Q5bYY+PY +oXsjWNEvRiXMI3BAAoN1gObbToAjmH9Ah5Cj7OtYKTjgYagMlqpZzY6LrJwu +jgNgGsVaEydDbsfDvj/EV8DrOG6dRXeYSxn8BpV8FiUJTeOazEUrklb6sOf8 +IZroXqSYUeulWRLlS0hy5BTayWrbacGRlRecMB7OupjVjPqJy1c6/nl3Zed3 +aHTyAZBrVIZEbePvx/ZrFTv+spOQj9boyLS1T0+a9OjZAfzdaeCI5R/L1EV4 +k9c4nPB5pvnKSDFFc6dnR6KuZ4rCtXvSxvWJ/b7HuDtMmztWjNggXkpbnd4I ++fTqoo6dWZWpYI3EmgrBO21k/Li5CNxZAAl8dP0JGTYxIpGeBbRQbcWh6kNs +0HFQghb2XYLdXcGgSzxfGu5csKmbeKHD4AmdKKj2zdWXB3yUcZDHuSBApO0+ +qCSPJhxIWx8eMvRlJw4J/YA6Nv7ynVFq8sw+2vfzw7CQp7ol9rPLj0G6T5pf +2FB6Y9JOU0OfB32RO05hSEKQ4oc1r359kH3nzMCrmrFaOOpy7fVfpdQKgvGl +wKr1fzc28SORkqcTjbTkY8ybra38rB/mqocdxVE+5nFFt8hl1TqReHK+c5H+ +Q5SDrB6iAdTPxX5Xu+PU09bDaiH7QH+QmXWOKYVwrRI6AnEsfu+mPV0EkNHF +a5UfubqMwvGoiW13ApEVAoNNmC3vjfzg96+1gSWRdyMrC+4igpzvOQvzNL5L +qjjP1e1rmAKXb1J++50j1UGk58E7P6KurSudDNJ6xdR+TyOZX4kPZViNHK0w +g3oOeANzJ4/91ogRIcE2Wh+n+YQm7vA6JWQmJCJVbempcpLUR1r/bPg8igEg +dUzNXrlTQQBWj5M40hM/DENouvF/QuLH9L2Yky8b1Gs3TCv+dNkylZh3arsW +zm4OXP6+5Bx1ZmkU1MRAEYb8F6bWCVERIQgg4rZmvP6yInZfGsjgqZkUHsmy +d559pGqEMWXjQx4/cZF7vLMt5vhfc6xh5czg3ZD+9p2iJSOzviU1vA1Prb7i +yF5la8WtwLcZwi+hGfyyiCWMu7zzzpxI+BhoDY/nQ4xdvpW53Fu8bhISbsjZ +M7R3C9jEdouoJ/0Ydr/os390/v/9S5fmJDAGWr80CsN3RnxZVAkFeeZ2cKu6 +OtCs3WwgY5ec8WICquil1Cl/IMWq4ibQlXq+4iIVhfTjz+IwxAjLvJL/n2Of +xR/O5ohuQfbr3RpPj98dz7bTm0NPeXGbUwOnmA9ijgvJ0zPaGol9bBE/tGVV +TL9+YkwgcoaygV1XaXmgDbtzdU3u7mIj5SzE7zMNz5JfuLFk7YCHbEPngp3y +6ecDkSwtBijypnIPf0DLp7hihpIPQ8aV4XJiYBhvUkg+jRDDUJQsL8cxPEaJ ++Y3WsPupYz+wgHZEVOj7JhnyYQ8KRY0Pqs5eRjOCcL63KImMpqDEFXjHbT8v +pVviEmJGnA3D7bcDxf0vOZAWVUadC8Hlc3G5TjZKQHiSvZHwGHO4SIZKiV+1 +Yxx3OTnDCRI1L/D0df0Ud5B2VBQr/vTWCuY/Vl4Ij/azxp3TZHAs35ERh/Wf +m15XzahrXMorn0pNhE+6kc1dFnWMhct954r5s/7snlfHTHBBxak4NwKZAxcN +SM+C9AUhR4/vOKaiD3X92YQWKMhKByzrWmwXf9ElbASvEQFynnNbIE3gkiYl +FT/kDWbCz1CMzO+F6zNFnZkl6ZaxtV0c/ky4G6dyKnQWRgAWgwAAE3wCgAVW +DW0AeqtfbwP6UHEXVf1JjDWkYguZ0xn78tv0y4ZecTG/rAAiwAGj63Kg04zV +buEfzECoK1xcSc0P0nHV0/f/DDxcS3D58UhmSt+6N5T2SJSZKNdFbTChoTXa +0zg4uzBccbVqRyJZ6TxDrKOlrjBccVMtj3uGmuSlRMxVsA2V67/KeyQXfTHr +mqdYe37hQnCUCXPQSlHcaJv0ZP5BSWtJgjMR+oajeLxl2XdYxPqPFkE2jstE +YDF2WAwhD2Xdh0P+xxl0FpCTXugXlcVjtmZdjmwoZ00wEehocYWyudSAAOvf +xlvVNvBCQpV3hMhAHrT1jjdJaTTqZGWrEopIgH+VqDQzrlSbGKNzvobYj5eO +Fi3FB8my4ZFiBkwpeWIkOxLE5NK8Sy2CwwK/SsuoBkFeHf+/YiABTWHYQwWQ +dDt+Puh1+LdpbLH2e2tiIJVDpi+3LPv2NPvpI07JaXU18+9Lqc57liCS3cL6 +QLd73dm8Hs6fjYOtindC1j7aq39y03KKfvhZppNqmsZa5P1YVd65Uu7aS2eQ +iQnAcKPpfRItFo9O7h8TEduF1dicM3K9a6rteo5g/+RkovgPf+OR/tJiJFsy +Y4U22zJRXE8AvNxJnlZGEMPNsAWb6oeRIdazir0OtAITpoHLzdM1AMU9v7iL +yiRBPpmFuQWbkJciEI+Xhjh/pA1OZJ6CwefdnjQExfOC3waB+LVQlnjyXza/ +uXhZKXH511HQdsK/9OB5xVzRhlpH0MqXe2+laOeGqoM9j4lxDEtqOv1Ndv3+ +QG+J7YryksaBmZjyJCY+GOx/5qiuFDaDWNepO6IBa68AgG46TfMRhFYe5VY+ +e0qvly8ED0Vn8M+HhkaMevmcRfc837c0+pZpjM4g6rlJrtrDuDKa8gNPu3Xk +hrE6AoD8JuMp8gpTueqvUGze9WhjIL9hNvfKBPCYmHqqvu8yVhJmSG45c7jk +TW2UEqJ1umWSMU5lTt21YHy+hzbrmgN6U9NpC5SaB7tVMSMaIX7VPHuRXzHJ +wKyXQDeOG51PUlqRnDotXDLUVfPuyeIevCou4Hw47FNP8xI8AcB/18ssynFT +neOgDnkC2l1gebmmRlfgVH2EWFo2TkxAm3ixgpxLtGjhO8Xy3ISfbq8pK+CZ +YpJgw/aQ6vyjgbWFxYOwKi6vV5wgS14YdJMS275YXbArOeKpoCEbiElxcWCk +GWXHJftLcIpVGK4Js0IzN0Kj1dFqHZMi6hkPEJsB+13cRgL48hpQQeLZX68W +zVUumcH/6WvgsBmjo9iF63k3qQ6Xr2WF1hWaTgUPI/2D87XpIsht9peoeOVE +kyrxqBPesMfrk4o6aCnSxs2EDYZicMVaw9Cvb5qQdjLzZgRQlcKejLX37Wts +Lui4kDYwAnD/J6ddzK1OwwIlXhsnXDRZ9e7/8aqxRQhHjk49ZeHjfDmTcXWF +xxCBSAUNxfdX39fbkboYx6zdxC4X0I4O5rWFvaZMOtNwSMW92EL+UZ0NGv3G +MsRowwpIkj02r5hG7gP0I4oSg5XWLRb8i3Qz0M+9gSsZeHJbCYv0mlT19r0R +vtlxPCahHpbkB7UHIpQ5xcq4JZXZ6yTiRz+7+vsC/A8Gf6deowxNluP5Z5FE +dI8StYFBpeuh2t6mb10fe9Ja9XPZUd3XcrNZ29+N7YlRAN2Yp0EFX9Cvo4sR +zC0tHrQ/grwG8Ff7RsGs5iO5bi4J/EXBeZG59N2BCQ0iU9FlFXjlQDlmWBEV +TR0peJk2qS+VtddWuDS0uVcm7TOOuDBzEZX0SxMToyR1Xlbs+xomug6ye2j7 +iYaeBr8QaZjHWpWPvdQ2qgO6q7U8LW/PXRSEwwCatNgC3iRS/s3MVdjbdXHp +62Pv9sytjvk7+sCtTuC4o84aJTj07N29naRRkCVIPwQV5Qv8baVDzv0IwgV8 +zRboE6600W6dIBxa9K05sF605L2UOqxNJF8JIBJhk2/qQY2JywtutroAIt53 +pQUSfhJM8MJCNzRcUNM72tZITsHMXALOs2/AICA8RFx9JTiwiT5nzcMLPweR +bN37mjiD08Tcb/c36cQX9K6zaH+RsLlTanBFxsjIiql40J1uKFv4cTPCg9ri +NdsI9omoHWhlIPHRUhl20/9kjmUUfyYoO0mCK/NpnXsM0wkColHAWEpgfEBL +ZFDfrKrbmwx+alWlZn3vUNOlfyARUEHtTtzMeA+f3x4w+Bei0si3TunXrwrX +y/hm2kqzima/IGL2HIELBeAC6wHPfmJGMtqdqLOr4XFjcesaukuVJ7LnrrA5 +G2b/n+MHhcrl+wBHwV5m1AD0i3QayKCqikvQmY6nv5ULUewWhVhmvnfgfoiW +FOBc8YFmTyilsCJLwMhTMxmqmVX7w5z3sc6cI4BcwRfjMIFeb6xmqhsS6wmV +VlgaZhqqq9cWgBpotGfnWOjMv/7ZJMtWprmb4LADXYfeOFNdK56K2vD9wYxo +Q3oR26z1IF6uOhyyZPuWv69haoPC7ljc+c1lPqcxclTjPn2YmZwXamqZhOnw +jzdOELxcnyrI34PoyM10pLfiFvVF7bqGu2yaGJ4MKHCNuKuStFMfwWNHxJx3 +glRrbeDk53l8Q2/uz52kE9+ZINFxi2mW2v1VzKGbUiIoZMjWN7TybQZZSRTk +0leJSbycoZHmmmNvNciHTPwInZyyPQ4wz6aWTRbzLDnAOzULf4AnJYwhhC3N +TQY9K6eZpHJ/tihtXeIkKeTLk8540jyA4eZJLprrQBTALSnByfdRFHjxCgpQ +SNL6Sd7nQyIUrytQlNLzqFt5qYYaJpgPtGy36xx9mdyLpJRQyPWCvbUj2SuB +IB+92QlLGpkGCAUBoDM+rmo2JLzN7e83qEPX+umkG6RWJIZtWokkDkIF1gxx +LE8ZBjJwQwm0Ldul991GoTmgE7Vl8z2f20S4ENfmYnKyO9kafzPPxEfsDeV7 +aFBFsWNV37amuxqkm8A+FjmJTNb4J6h66/8FS2vLyDjZymW+qehIad/fkLiz +AMUKTTDC7VBi/EPhSXzdcpuQqbeNWI1m7zMycYD8T35bh6K92SHZy9vAZwwY +Ay0WDzOpQUbmCCzI+9zE3Hb+7gWAx1/TCKVl+a/mv0J54EezpLP4WSNdIoOL +DVkGPsEv8YBmZcdc3GMcNMUhch6g6WqK06FcSWGoYr1RqSGWxTjEuh0gLKrF +Amz67LdPJCByRy4ccGr3U2p4uU/D01TGv1MRNz0JJ/yGXSs+8jsogW7iU7lo +avmbbwH4vLWnWuMBR9a1TmzQD7M3a3AkzZYLZHbiuf4YyeFtxLNblr87JOVb +l59EdYJSgZjFV07ORvVDPADwsURtcsdAvPftRdR23WUAU5XrD4MMDXl9xrOF +ZCdwlA6PGCzfJmPtjeHdORVoeJSWWzqKJJIxRhYDYMntECs5g4Gv6a5kdE8a +zhXMLMmXhXiBWyIBlkVrPQzenN3bJIQ92Dhr+erk8bggjkD8Y5a5ueAC+olr +GcAaXTn+sY2Y9pzdaWxvTek6NBf8R5UxZyzOg/W4dsXko0c2SjoNkOs2UFT9 +IhWzIEH/IPtRvM0a2WlcnUI0kkwX4xR5HWg6eyYQ1KSJEr6HDpU5v7TQdntj +5PggJ+Pye8OvC/5mZwAEvcqNthXCJ/GxNZpnMyV83pEc9YpKwFN1j/LJtD24 +b9DUQvNZDCdLnQeXxXezLiadsh8GaIxmIs0ojLpiiiOGmOSOpSa3RZPm3VaH +zniTIaIUNkyRSoBE5mhktchS91luCnMootOY2843WvSjMIqNHNFFL0NAMag6 +Fl8CtdblkdmS7ggymsUHG1M63tGhQP+K0I8je6itX4qwNSN+QGXoveTRM1pe +zd59vjPPVJpuT4N2Nowln3I3dUqV3FvzkcY4+VyQrPxF016j+axfuP2oCz5Y +rFj7ejRQUsZaTRSmNohjigbxSxU6oAqT9m3DwZKzPGawSxxT5VOxl5ynkQ/R +U+BAiszP1tXM6nvC0aYrLDmKRRfJ/RaIdMWdj1rnazyB3RJFiroAsFeA5UQi +pSMFyjaOz+gwh2yR6rrSWJeTujDOdknhYK582109UZE3EEw/GS5Sur2kN28C +q0bcM2CNstzpYzyAbIPuqgtRC3WnyQQlwYe9JDZ7PtbnEeFoWezeEmpkHpP7 +GuCa6JdvgWhwOTK7NAPT2PiIjJlDngw1lZmZtihOVEKhqDv0Bp19m8Khi04y +V8Dy3dKhlHsAkD7hxNBgVnuzkKeLY9sV00j2bt9fqlwtXm7cMtD9OnRFO9Sf +qyl1ynRkW55QUvuFUawLxv2ZDgzn6MxS/hZF3lfzA8sTNwlxFy4u7PZeU32K +hvznNBoohOdvektXSpPgNJ6SpdytlPF9ynKVW34afAPGSB/niB293S3y+uYY +cpJxhwe2CJ6Hs/7m6QqIwtHXPVsxL6BZIeGM8XV/PXTqC5g3iQ8vbmfGteGF +uzAK1jiS8DJZFLeDFDbQKJSLyhNeJXINZYl76AH3pu0TcOB0nAdm1d5pxT6B +4phpMHQgWZJj1+TyO2LtHBRjQEOOKMCl2utUrcWBQjPvf/cDYjE4ZTzKemei +2iA6ktRmyYn+BapX4IxoNM4/Ia0LqNgGe+grpRd/mKQ++YJJU912TwyF24xL +XmvTiROZru4Dqvn3vEU8frs7Sojxa0VITIM06zgVKXrVnqtQA2ousztE6J3Y +Dz7IF2RefssLW9GCvtCLIEKDBAAAFOWA576MtcqADmPfNdoynuJwLSBG1v9W +65hSpVyTzsTlqiEBkrdlV8mZtsrcTYnDnZg4Ny7iPv0ioCyeN85/HR9g6d/U +wc/hQVRqLcTZdRY09HnUT9CGwXDRH0Nrz/R+mVP5swSl70uJAbe1XFmwT1MI +v66lHRVzIvDn+H5dNmF9CjBZhUU7eKJXfGAcB7eOf+CxLplSVuFWIKun5FRN +xPGB4jJDXn2tKqvQZ8XpkJOgjEjYi24wSlCeYMz8yMFtQMVdPdDfYX1KI6iZ +rGGW0vtXJEnyZL+kUxrvat+jt6PkupgVHIPtM7Vf3SP47o2zrqhDVqhdi5J9 +nkbGIzA1jd7nmrqmLfxGDsCb2UbtUIUv71Zu7dNHiLSla+mcvXyIucyX1zqR +4Fcg9JLxDSSQjZWwrkg2ESYyc9kvHxaKduMLuqCp8dM6DHO4wv7ogqitPH7b +lbxjRinlZReon9XNdAi3rC+hFxJHIxHCwGmRDyxHtXLFbHbKxNTFdvbdXeVE +hfrYVd6z+P60WuhnbdyPHpN/iHIxnudSIXnujg/RjhG/6IHLVkxMWrqk8SEp +0yRQvwZmsHPVqQNEMT2vYuBZbDloj3Dco4iICrWpwCkBeoPrEBbg0iGJIiz4 +ZSZ4YVE5HF06rA0BbT5v9M6ZXD+jhkz5s6hTrciCxLp0dQV6/5pscKo+X4SH +w2+yeUebcaGggzmKedpAejDpSjDW50u5qS/Jajxe6V/IfDPYUwVp1tKVRvHU +KoDZ/74zS4OJJN5P/J42/cjfdG4O8ftXqm4u4TvIBrHYVNKqZQUZwrcXGvEX +LQLiBCO1Z6dWMVuuoNxDivsTDoPqY2n93VRDB/npU+f1Zw2aNQXv4TiTiAje +HH4WVSHnRTYMemuSU3LIzvHgZ/L9smIctUAfMPJK1nysfvtdM4K+zmu8m/3S +TxeQIOFJ4dgOLZrKfequOhOE7/W0pAunoqWXOUu394cOjAXLZ9idQShjCdB1 +QSmNZlAxBtHgE7Z3vfZs8CfZKywCTVWghwsLJ10AeVhYN3xdclFRAfijcqCE +l77QCksalawsvwymXC4ahJ3YXHK5a+5dkHCPSxrxeXZOJHIEByUZ81QQitXR +ASQsJiIoVhWe/8R72MROKoo+BMSt79iZVl0vV96hgXxdJgZsMxoKCL/M6bQG +mazsAoBokUgrQ1VNbm1QioUmZtFB+9EcYpU1vPZL9HfdpIOIKhVw+5gdQ50v +hfsJCsfNSZFsCcOExrmZgGzQK4/3XN8Knzyf7SxXsixyKcGQzhGTR5O/dCmk +ZyRU4pScMi5+z/qVTUbe0dhyNFKGru7MM7e7+jarFuW8Lgd1gf/umvg+9ejV +YaM1uYm8ipV0dLBxRQuI8Ygk/x8u52OLM2pKvcI81xYh6fS1TipZgDAsq4SD +Sn6jDuBjYXA2Jw82+58ptjK6IIThs+3vDsuaEnDyAn1M9dsFG9ggo12zyVrI +dbLYuvkgFsqO8kgts+aZCPj4YQKNr3qpk8KOIZeQ00dua6sDuMHcVqqYlllr +bS9EdENnfMhd8bHAFa7I2kLMx193SjKjMOkE5rHAy2XMuEi3EtRclaAfc1iE ++NCmxTFHuanb1rfLbfTQDNfuKEFIE4hwOq48KtpOOyNM6/HW+LuSsOYOyxPJ +S8sYzDW04F4vz7lXblDOjGt51zlnoTbGUY+poL6sQYPLqGgLle78asceklh0 +lSmKaWVB1BVXj2BQ8MmmGqIyP88B8quZwlLlomE6/bguQ5J01jYk6F9YT0V4 +w5rgJSK/rXHbWCTiPQZYzO+IP10TAtW+9Gwr2nlecR29ocDxPQ85JjLwQCFi +oBh4FmlU7JlkuX5UBRvyxC9NGhHe/Y3v0u7bu4Aa5XUewgrWeuNHmxXMO4Gs +tH4/eAbG12hfcYzCP8U5xI5XTseBaMukuYJXR9UCA1x7wRbeCXyz76ZFlIke +wMnfMU6msnF5+m/gFwj6Z3Tsvu9Rwy8t+w+9D2aLNDXyyS7zE7BExfPSL0/1 +ChEG5k1btG+ejqznAdBJqTMDKvQS0NkBGYPSlVOQxZNv7LIQ7uK3dSlumAT5 +Vuukl+/PEsYRymeWGXJ4Ev5XlsahzPwy7zqay7khA+8dakVXVdSABAXkxmds +CamkxU/lwbAZDnfVwMVGzCPrpaXHrmxIWv/XgsoCq62xobJ983fPtRXyQzJJ +cx1Pk/E7PDEPzbTVPEHa512AduoFmPwWwSSpTv1Mh2woJUumzbOaKvQgtGr3 +APysTQa/I12DvCa6SnWadfaQHGN4MkLyO+VUOB2/JFGqbasGdUyl2DPUHLYV +bcyrz16Z/l0J7K4w3NCKtl4sRdynadkvXIiGibj7SV+H44XP8NKLBaKZJN9t +lbyqQejve8kOJ/Ej0uLYlrPjFqk87qqXVt6iIgUnhPigr3rbkRQ14UUGwBFY +HiWQ2h1FZS0qcqIoLKkF9Tj9Wlo4c8ODGMaiys6LiGdxerd91HaukJFIxI47 +Duk2biZyXlNpnr/rxJYjmGJKi2GBfd3SdovPiLjkO3HlrZLFmkiWc01lb8tN +tlSYzblQ/fZDRdaOha4TQHg3qATDsebN+Qy0F9JO/mybS8UXjz6IvY07flZ0 +7PERIq1iOGjsBH8ZI2MHhSvNE9K9oARx6c1z+p/ovQfBvNrgzWKclx+oifA5 +inFOiO7hnmgfmcfLKpK2hZ0ZPE8aa8c9JOJxszwoUEKyLTQUhScE8KbdFaDD +Z3hkHQBVbO+Fg09R0NfIsL+T0GkO2j1COE2K/byCBC11EXqQS7k8ohOjmbDU +GPNCbHNRyF39rFTQaNVsRvP2dmaWp8d5TYk6tf9HyaqchahTQxRnVaiKUPI7 +xAj+qu9Ga0Pp23gf9rwW1CU9C7JpqQaLYxaSjnVEbF7SQYwmVJCgqO+4h/ry +zkZHUh/dCFf8zKFefjMwWadu3DhB/B+s3tpwLM/A6q6h7DvKLVBkF5H6/4sC +riA5/JXoaoAA77e3T/PtF0zskItf48Sk9JyUoXGwvPXl11Fs+GA5pxT4pwhS +Ba6S4EgAAhv/AGfVIJRbyjNqc2In2/SZURe7PeUpugKQgFs5zPcrMJPSXiy2 +RqFZAU1PyIS+uhq4Zrmd+0AvtSBmHNTjR93wZ2oR1/8DHdRYWFQ3heB6GKi4 +KoSJolWdRAPQX4DqpqrmrSK4Ldj9WcWAysJ+fbVf+8/SXYTKvvs/CRjCHhGS +jQAnkZMpgB9RMGaTuyaf9jIiNq2R2qcz2t89amRLB8MlqEw1H6iNfcPSdean +GjDXfnqDwV663ZS8ViHKczbtvgzfDuBoVEfIO7MzCKSqby6PNdJ7pzoO8Imz +xg75KlTFeJ+d1AaQYm7zXg4Hin1U0HzK2FCCuzCQdWSTNGkIgE5Tnu8OV7DQ +9tQhD6/KH2yEwqR4oUylI0RWa7wQq/JX0ZtM7CAme9RGL5JPNz/cqYrLhK4y +hFrNK1iP4rBVaNXAgZo9aFFfPpC/45dZDiUm08Au/irsnsCgRP31PB6qHx2s +lYe5/deCQfUeaim4MCba6D6tD9fkYXpGPPY7LlFJ7efIRuXv4Zl5REFKrxlA +IkHkdGK3nwhdKoBuCY+RcPzlayX1V6qdWtD4wY3w6tHfwaCM20cfORWqu09a +qrJ22FbFBYk4celrxpvLuLspvrHDDBEe3BicOB96iJBaqVEf8MkTFDq0MYBL +mD5j6nVOQ5ZAglE9E3e0aI84ZBXlHSNZIuDzWwu0isZHoEI5Ut/FYJ1f/GO+ +PjEiD2zX3/escpRIK8qC2iCvAmUkOWXUP0UhO73cLwSMJ6xyZKlk3j0tPH7A +k+6ZFptczz+s3GDlu+q9r3bnX8oqQ7CCT2UOft7Pbv1tcgDK/2XEDpSkKrZK +Dc00hQqi3priLAsBxH5bNcIlj0wxqm8PG+GuQhWF/Jjjp32y2jqNh5U0YeKS +D5UA/QotZwGuq1cZtqBdyJQuPHZ/hk+JT77EBknAL8IxqX+CzFkX1LSxPClr +svDam7ZUPjotS7ZKaViLvEh1U7I23+KN3QICiV6abFvxLRFLbujZE1RLi6dF +if+7a26YBMLOOGHfHERHpYbMi3vffVc89IKxQwqYGI5fiC9PWO8Yo5mlyV36 +2eD6iXLEC8We8nXM3OjrBhR/ZRwL1jmpL1P1D09nL/6OFbtpb1pzfzIKfbNd +sP5LOVWEWbZ6zDfUTfiUlAVfnKF4AY4NhUn6F2/q0v9PhC5cqMokonQGSNk8 +FlMSw0sHmZFl7o4DjQzk3iMDU2uQSXbaA9iNIkjpJ4YHa4FRNOEPGRcdZQgG +xrzIUO9U0s+nK3RzIG/7p+QIOcuSMoDdOjaUNfHFhAABFrCV5t2ym6XUC4mS +NA2H7KfRsdYvEF8UszEk328iVnNSOd5HDs585in8cDDP6jC42cXEkmb7nrWc +w15lHEeA/9ftYHcRouU4K6/omdgroUiksu0jz+WHGcr1gPg8fPIQFHXUqF5l +uS/nh3OwbHTz27Va4DlIlJXbnqZM9lEAa3UzM6f7WfkZ/iBw0N0MAyRn+/DL +CqBg1t6Cya3TULOh1rVSamr+MHZEnDl/+m+J62X6V81VKntj6R/4p/VO3oyG +K2punHIld3oDjeWxCG3eaEt9gOi1x5FEC1qnc1qKk8BtqrC1J640leg2t6tu +3hWXGOjK6LAuN79ChqvBx5k6/BvFnYQplvSYRVkRaRZqZ0Vk8aH8t8vLUccG +JY4gX5g0VCyhJ+4CABAAgCxuE4svheDvdiJjhM6QdVeNq9rekA6/Ttgpri7q +6r4avUbIJQEQ0atPaZzRsV89guQrGE5s/SjwOzcuqRKYEBT8g6EgT0GL30UZ +iRlIgZ++ccLU11hqThLumm/V4Rs/IhYzUjdAnPrvHN9nBhsR5WtezRiQZ/F1 +Q4cfUpsiR8wT7Mv5XmvXC4hKZRDLAvEulfiaqCsgUEm6+uamUbjdQ7eK7nE1 +VvxXvNUTFU8UUqqV4ku7IhjwKpOxnivZtNvNT1lA+bYGKIqa0zrUeR76uEL0 +xiPP45cmgJMN762IGWMN+ZFnCWUVIETCwOat2LC1O+YP+Xon46arEaUInb6v +pDeZEHg7dIQvVKmhIFNdZcSX4G+emTbMWteMSWPtJciHxS5+TbAYHRQhzSaM +HaPffojrvEXS6sQCuI2aZGvoYbzr1KMki6ttAt8E12PWAL5ea+2t0ZAZVklz +CjV0Wg0L4/CI/PEbyWJGGpseYcVaCd/EvHknrItQRbpWCpul8hC1q/3uQ0MC +GvYjjsUr0c/rxxFfl09oHoBTuT4hJE5ael+/OVLzD3W2rOGOdHOBKhdprKyL +7vqaBsrJl2q3tWKKi538RG2GfC1er4zD77j2HVF86wstfE3bM5Ggn2Y1/V5i +uOV8QTI60NyWrDx5uM1MCQ68/CW8pLS8vGKess81mJzqO44ABBLQRFzJbEcZ +cLNI+xDvxCEtOrn2wPOSU3l562FvjKCe0lCDHJl+jjh40tAheqbkOsK+LJdw +X6EWrLYO6FtbY+3XJJj/3IjQvswrhEVe43lJjwIQNzTZGs8os+kz/XoqiAqu +yg6UfvivwlObJqhww+xupPUDdtgn1Q53DRwPE9vw4ouoI0qS49vRfpxcoYb8 +7QK9rallzu71kUDGb39cNbVjl1vQE2rHYCh10EnJ0iWAvj8IDFrHky7KP4jU +9OYTNof7E+6QTRXzfBiXbIYzV0kc9B5oLVQZ6GpigDUgqjD8RNyEPiFwYxfu +PqYg1jPHAV8utm5WgrgPmKAMBuBFftazmJOEW30LGdl+Sxr4I5afVRPCR3It +WGl5FrCWk86pbok866GoAaA5P5pzkS8gcBlDbthcP6a9Ojb6VoUW0saOGkML +NzVHIByV/vifZG7oCRTnz1pGuuRjp+P9ybUVl/fECqFBx4jn1vafip57yXXb +exhxDLBLRfNZzJhk41+1/3S1opBXShdSyRsLY5k4CMDEimGz4W1REyhAuu7K +rlg0nXpVcuLMfWtDVtJgAzcRNLNFOPAHlCW9p1Z9SQ+ewItXhBXusiWSo1A5 +qbo1Sur891cWPV6mdEMq14QDU5pNWPcmf85f8/K2+FKpj6TIuldGM4rsTAJA +NUQoPpd70PS2KcqlGa/eT5B0lgFIZYiWzoqvZwDyl9iEg+X1L489MIert6xt +Fgl7wjm5H9KxAoPz/rSCrx5TuIBEFJS64lyGFnwxjqT1ZO2MQOGg4Iaw+8SK +R3VRo/JPv6341sF/7sZw84QZi5uR1/DoDa9LJdMKOoLMXmslwBybKk3EXr4s +ZeLdm0/S51lxZHqslPWcrPAV4uI5Gn0wK1ZmAdsfS3LQ2DOLtEytseio70iw +7M2+ICiMG7RIl5y8p8Gdw8yuM+seCc3uYBsHWlfdHW5bfhC9a1GE5zPhDBEI +S4vIG/LHpB50dEYwMHjCvHfo5jV7rsMTStst29Ajd/tahiSNK+ihtDhyFbVV +VKLw+vSJgSp8iXfJQRYrCMUcMUSkvHOx2GKurJH17LdK3wNgLcyWORRxvqqY +ipPMI9bI8srKJjKp5nCe6tdh/AyJ050sbYtVvPHwWMj24nvX+4VRVkJE7mr6 +QfafHNHYPOAxqZWmxRxIgSVnnVEcBxypQ1TnkA+8uVSysl+sq23niDRR1/j7 +FxA2LKenG9lQGs+fwLsuZicL8v8aE1kNhU5gM2SRcuXq3TDLxLyfGHsaw+yW +m5WgkwGpa0ge+TOWzVE920xNw1VK0IvGnxvQ+hbMPYqLzfdL3qGB35lKmLH1 +1nHklxJDGHfzbUUHqyeOy5mJFu5LsDORvCgB0ZvvD89nnjL9bRUpb+N7A9Ul +vyaPszoUkQ5qmfTM5zE4ph2dpOapzLfZQwLXPpRiqY+5eFY2IsFn0NVZct+S +V0M9MQb7SDw8kdXw1DnBnjcv4Gy/aHApsvTttQ7dytApal3By5jFi/dRdK/H +djFuJxERIT8c6nloXj/rfMJK8Ltc5/AVna00J0MsGWJGuwbcdnRQjqYgyt5D +vbqirH0Lt6stxT70R16/7GZ1Fuo9eNMc9VCEBIw2CPjp2rJKELY9yJ2v89DU +0YFoXEMfTh2z88LhOG7dHHFTekplPztAghGpQcBGuHiYKx4kGqYVPZQibVXp +FbbCQVjyhnfeiJtnjnEmAsqtvuZ5OZ+bzOHao2RTTLPqeMEV7oP01qIPXz71 +2cPvvZymLcb2SRcBkrj1gIpRnVD8GKSHEeZxxYrlagbevRUQhCe8s37oFsqt +xPjOlONWcFC8xyRWBYFuejfftyg/24XpetX3kStaV/4um2BrRCPpMfPLO5in +cTlGYdkmZpl1CVnzmfT3h8rLsd6FkfdexNzHrndfrTlIXOtSwX/85uaIUjqx +jc2hlXgm4kPxaCJrEYPsyJv+9tPOkpWSdQ3+0Pf/g7STvK5uT07eN6bVi3tI +WI4h7FmUR+gNgY6HSiTJWNQzdGqcUlagPEzqWWR4FwK3sZH6bUnHIGOqgxpD +UwR9Hnikn4kCh9lfHZvjPh7+G/WIC3JtRp4/iFF8ViS59pg8ZVwX/Dk8P31a +fKG4lwsM6Q0bNjUXmY5L5naq9bNdKe6GdUxh2+DNzN6a270UuHB4JgvImVux +5Jxh+RvzIOZUymeHYgD0+BuLAeJQmQxtlKSLnqJQFN3iJwEL9khZzsvk/UWp +DgOy92YXHWWDxbqLAyvnZWGwuBAAKklg7V26zD3loKQ0cSZgeLoIJz6fbded +JUtx6ysI5Q0NBnXZgPRypyBljGv4fd6KWUpjIoGBHRE5wh+bNjZiT5273S8q +uThSmCoNrBzkP97wLhcd8AZlkDSDGm3Q//cvPyqAwVY5X4aK45IABWMDuIq5 +k8cUIojByIOFtO81VmJDuVtOoWGBo+UTq+ZCiEGxlGoPfPaRBaPYzFToKxrI +sssNpnL0Av0Ee0nPWuOJa40olR7dAA9f/WbwAA7CZZ1UgeswR+2RuCRgHcMU +yZ1O/ee2YS6/SzDN2hB3xEsiFWpbypw3breX6p4teZiC78qxyGIIDbBgidLC +lWQtBCUI8r32GBuFdaqOCY0FPPf1o2sZfnzX6h4mIEu/UD72Q/cbH3DLx8gy +rucIr/44ASSLkJ/v4fp/p9e+rQiXvwaDttW1XxzrsXG5ArzSDBgGoBM+w4XV +9ya3a49oI+05ib3uy5NfPkavH8O73f5+zwuoQQAbeflpRtwFuDAjAYAMGDdQ +ggrI9vFwULnu3uGovR9p680SBFL1s5MdFdX2He66EZ8Mo80/uJa8kMj0V9Nw +OcBPMV1O5e0OxxxzQmcwG5OLnWbIMNxOT5ueej1hOic9r5iCRYwgH9ODo0Ae +pVaWqjAMgUOZ65s0EcyUMGJpYl7o4Oi/F3wSrccdT498vUjmI9Ct/gXcPuLX +Pgyyow7ZoyV59MGZ/kuCe9IHNxTxyWeWb97OsEDX648LLyvH3fNBV+klImm1 +AkSIXH0ET7YwVgK/snhE0r+/YYPwKXV6c156R6U0dpVeyxTNU+lqmhY0WZlh +8kbB9YnQvh9J1dyXG37oGm+8EEykHF9gQSuHx4l7DfavuvN6Okdeu7K9BRMR +rkFkD/mCq2O+X4dazkgd+NpKXwjU90AYi5C57lrVa1dUAA5k7PiDOSQ4MPND +5dAMhEW+noY0ClYT92i/JKbNeu6VonsE38u96Rm6Y1NaSrjcytLWzCRJERc2 +1V21AeJBdCFN4svTma/eZrEipptdBZKE5hJ8k0vHe04zlGZmcJMVgEzbUQiF +wltXh52u9Lsgw8NlhzX/K20F4AC50x6yR4mUEilidTqTaW8LN0/tCgPlmxWW +xHCZaQmaMWLd1FLRbGnvYRyA4/KebLl5M/WCD4dNZalDVdQvG2ZhytjqLzbh +xilMKNcu0lRprdFwrkAMsl3EYN/sxbxOzumuRVjWw2DojH+T+78jo9ywXYVE +bTxHmFwHsP4nX/LK++NnnlHfrnBZvvk8tW2FDlMB55nJdw76uFQw5v35wbS7 +1ehQx5GWqdv816Y7eQYgABMGIABDX4MtmcUOzphnVuYcLni90XYzWVPCfkL/ +0b9lgZsaQi6D8/RV4DJ9kOdEh1DcgaHvgkgFyhE0eiBtHC1zzei80EKcGxX1 +6bteI4ZGGo5LAi3ycAi1pafEM8Q3x2FCmMqcpIKE30OxtUuXMaRIRISAAoAG +CswYG+TmS3oBEzAXVr+mvwsVeszQpFqQp6l4qTsBqncucRPeEjsPF8VVmiZa +q/oOIxo0qPSAOzL6HbRpvx91B4FCd8qS4IAjWZBS1q5y4y0VNU0PvhmQFvjN +XjeTCtj77rUvFSqFHImtn4EaTV8zYR5QovSSW1tdP7Uu3eDIGeZiRonTj+qO +xSPa5yDAW+22yNzwIA9ozhZNbeO9NpeUqbBUTGm/Lu1VeoSqUDRux5mCHhXs +iTw+v3yUkiVxTIRC0BUmhZ3LatoQrw7dOp62kreiUjDkpXuYvvPQrpsMz/81 +3WtiraF4epeL26GiCTwvTAQjMRAJnods+QvsTqRD+Ohjv58SLSKUuTT6xdWU +DRygaFNkGd0nzWNz3OWpM3ZFPsBSLSnFOY39ztfTnQ1BwukeNpbL3gH/VMlR +/z3F2agmitP4NyZpSNp37q6XSOeZNfjpcio7foal05xlEdsS+yuu+mSXOsaA +p7u3N/TJuI1XJQ77snS8fLyJg2eldNvEgc0UtieeHZeXJRe0fGWbSj2sZgPA +YzcfmUokG2ZdPqI1re7nYJ61SrQhLLxt9dZemKS7/3kNrLffYF1Wlt+ORkcK +Vxpdh0n+nuyce+1vF2Th3jSVEcZiZUaIjPJTVhp8tU+tEw0gzntSA2O7/tML +1ZLRKGdnk1ysfwF82itvoBxwxK80rL2clURFtwiNrxp+16qhed3u0YLOuZs2 +ZYe+2X/QZywGLN/RosG2YRs0I/aT0rr7zeZ1hAebTSSLzXXkBFHfB7bMjbkE +KbsTCeGEmB+epf6JbKsZQ2MTqcx5kQylRDM2bUyBl7c0YtzizqF6wlF+FCMD +x9vIVP9P1Lfd8/6H8w1v1loxvX3XAlj9bS5IHQxsA1zdHnTDvpInc71l94wO +nOk5wqCo6rA1K3CoI3BNJZbiYq6kWrRlq+WVHfFuDwJjvC/iK/k9gjemaEar +YrTgYfi4o5YdPFY8sThuq6Rubfx697VYeI4fvr8xptNWfi7EqE3dQq4tvIQ4 +kDQOQpJbUdEe5jBpASsZJf6XLeBO+nzexqHJGtyXbrKOG0tr1HDZ5fk+cyCg +jxxsqApocVcdGVaaWe3jL/SpKnacT+LRhsxMezgDp4J74ZcPRJJwgYFVkemN +2t6Z1k7kR0ew2z21aA/+CGNwTRhTHrTtYCl9fpKBVrUpFO2g02X6MJBpV63R +wh0LEk41anTTF0dt+njQlR5zxNquZJorIwG52o6PYljF2YRRONbhrijs3g6y +crT+94hjDqBIgrxB0bzPplz4hfWZWmKPpcS4LoLozUy0W9kT8BAJ4fSTjPqN +cL/4Sjpe1d3c9KC4g0MyDYnKG1Qmfiv/MnEVUIv3hN9k41Z5s/NcQOAPTXFB +BplpE+CLlEBbEAxwNR76UQ3tEFluuLrFUi7iryHV0vzFlHiDwyFuGSuV5rck +uDG/Ju32f2nzfxxYVOQjJO1fq8CidKgYhqjcCv+d/kSJSq2HzEIcxrSqD1lk +hRy/2cQkn42DWBgv0vyxrtVvZeiVe+Iluzvqilolhqk5ZqGXaFHRnszlAGCF +Sqv8zQP168bygIUYag68yoMAfyi906ECwAGhk/MOvz1eSYazmKRX4bs2zlL/ +UEevlZxUG7VBu/O4FQmn+eyUdGHTwOafr6qQoq0z1SBhCCrfr5fJw/BnY46h +8MC3C2QBnkHApK8yi7pxeAIaTcqQqkgmCFfErNfo4rrU67T13fkkov400gM2 +cGkQ/kubs6Q+uM3ObKcYEdjpspQYvI0mcKTpVpoqGTds7Mnlptd8cq3uBbnv +3JW263FjZpVPSNc9nr2N6y7/bME2xLlPTebUO7ZhzZ8WyZmmUA3hw5qMhQcR +d8Vza2sa4EQ8EQYLCKWnRXwF/MllStm1QffBbRq0pba59zZCS2SioIZzJfcY +77p/xP3BCL8UizSLe9dAl/JhrcgwgZPNEkwPvJQ/NpHmtZA+XsykdGDolQ0n +uJGt19+g2oJYcSPBip7K8ZcVj+TC/KJgd3wyZp2+vcNNGucWWuWdfVtqbv62 +/WfTXJ/+36PXRjSER7LJy2DyqTlHMXHejqxbb7Dsn5LbagoKL1D2EE0mlTgj +YHo/UcSN/HXbvsa+hZ9nuvJ171C+qtS3XMO5iumQpo6vvlF1UQFu7NrKlKiV +Q9Hvm9BsOHlpCZW8c/zhT/RTxGoVVJbP3HXLoVOHURIMOxYqNBOGPCPKyfjU +UlCsXVXaRhrsYcli5ewiJ3HI9qiIOM9FpJTY1UvYCg4jcOHocKYtBPNivPBY +w+WKXFoScMJNS9viqXiH0fAq8X1zB0pHO4ulp9M4x58e2Fojofa0tvm90CRN +tCpr+pXWJKXHtd64Pjtkm09MeOt7GRcW2fipzYgvru768s4WAdZkRKsdsc/0 +/UoAtqrsPu9xRqdK890z8tHhNfRWcafm1IHsLFwq8UcZL4osml6HiTIfPi5Z +QyGL1mYFDBgAAJYMFIgyfX3B66Auglz0kNNIna1AdY9vWNovzIb1/5Tj3sOm +ZxgTiH08T8AIIX7hnzldx7yjprIMSy+uzx1vc2g7PqbJbGBX3EkXzpDxiehi +BlNj8EDsJt0w0dBH7ET0HK2LKUDMNjbAyk4gMjXZE/vOIXvUxDShzS87fHcB +4MFX2HK3RyyoaZa+jAjhfF9GCQfjJrKD76VJk1YOoLbIsGhNdcsJOIrqA0E8 +MEAO+ZmpgDqUF9dn97BmqGqOi6OQ/RDvQDEmIu8iPHeIbbOvKNYz/XGHIE3J +VWYjIJL8eEzQTSyEvm8gimv9aKasG7NDf8K1UupbZySRRWHyWVmn1lmrd3pC +Ug23Obs0ylmH+q5RLamyUnuXrhtI+OTD+bbwfLV+mmRhsVBcw4z311iRzINB +5/mv/K9q/FaXD/X+o2vdXL2vrw4eZSvaqYuyfx8RbfjVJYHnXhJufsjCoGKw +NmIRKsNZvYzMTvrki6R4swkvK+T0/5ST3M8BfhZ9XzmlJngjAlLpVEPsB2LW +6EH9A/u7mgmRs9F38lehiL0rfN4cEaPqkpppa8LTkdCM1v6hmXLyaX3jeWxZ +BKWk9w12Ue4tsxrOx6yFx9v5ury58hU66rc4lA8ja3vFzZnTasisO5ayV8SK +KVYIYCA3NHLpdnNTtLxxwHrFnfwgPQObrBJ89mcb8LVUotQZdh0blvUHhFq6 +kw9XkXDqihze92ASA+WkKYeym/IQzI67pc1evxuu7O11i0uWaKY2Rxs6+fqN +WHcyAFPEt6zkOGNV89ylkBM71SMPdgP1fDl91pYO2VG+gxbGwTAfYHmEsmex +wm15HJmG70s2ungZpwPub2fC0UwjHaZB7bHaDBsOZipXXLGHyv7uV7v8cdB4 +ETWfBl4JBfjunS00TOpHRp0KXzlOZhqYrPLmCFvxrIXNJVw166ctdBB1nJfz +3HfJCkYLrV00E/wPooMv+SC75iv1D5ixM4oszzdaATW43XEZHJhZ8lUl1+Hz +QlAgu8pGyz4U72ozlbrTjqJVdcrz9QepHOAt3zeyz7nMpFuecf63xgmV5D6z +MESWFGKd8AiO5zbkSMhddp6s8VUu3IhKXg6XLVRZJGVQRcRv3lHsQV224yqX +7NO+743lJyGNVCgZ+buDcTA/9w9edqKKsjENgRiJE01007LlVYmlDgNYrwfS +uZbGj/gT9aaZ+YRQEsg7MHuWzpIZgyGQVzsBqoZJdKVrCYd8bxJYccc9FAQw +bsJ6Q3VBkCwvijG18J8ZW0cIfjynnDVi8yp8mVNcm42SSXH3haUyKtjowGiZ +DC1Q7jW26cpNOK6GS4kgXUV5PkRi0+3AjA92L/4HkrcWydLLzRGMOW6UPC5F +TJCKqFHf3aJ7H7SSNz6TZ2WN0HgIJex/Ao1BBymA02bAQBpwSs7BI6r8ImPn +Hi/78QvngW7pCIU0H2f4HmO175ZTfayUFqtEFcVx1QbFHSJ4E6i4qTf2qF8t +eSy3FELi/VsuIddQ95n+xO8LUJYj25ywjTDrhlw4tWNrE5YOFEWEUNa5B+dp +fLffWnOqIUOpqYbzH73zET8nDefVLFCL91XB34anetULcTCAkZY8WUXXyfbY +ZfJpayGJykawbVEvh39VzrmjpP8Njcilslzs0fAPtMlKmHKJm7PXJ7BYhpiw +odHRoHr2dt4VFpxAYIIuwFJMWmi+SvlBkv+10djBKQzGaNk9uhi8h0f6kt7E +hMLGhMByIzL0TNcqKaSWISo8j+8cV7G+jaaC88zArK4sJPX0tUspdm8zb09Z +4YivyfV87sKnP1OIEF6dwJSPvOQtO7ekqgih3UtWqrdyTRwHE4vAy/aqg6JK +0nbLVrWwNMCazqs9PUU3ksj53duko7UAyvRO4MLp0EZmvAoCHuDHe5Cfo42i +UoJEG932XT4Mw36YinCpLd1DvBSs/DA8VUrpsCLXTb1JkTw6qBoYWJI7eHfQ +FW4jhl2x7RQ9Yc81jYvDu/aIdlr1KIYJHuoz9QzHLAnvynHgZ10Pa5Vlc/1N +WwDqPE1KWvMW3lNHTHBKt+3xeO0yltnsONF9MLb1LdQpT0ClNCNaL3mZGutW +KOcWawB3PU5gjNCK0k8tJtXkmIZi/We6n9mzGcVfTOLItQkMO7Uw0JQ3UI4J +61lFJxrLzFmvWKCMJueZ4E+d9WxgBXjyfoW1RAkb71uhSCRKhSi/zTqUfGwC +vY2Ksk3b5uDoiIj9H6BkEVFda1OOg7W/CbBme0j4MYoXQcrY2g1+8c7t+aya +biDUDG8li4Dpw80vVODJI1dAzNrsIhWSDcVvzZ8Hxoj+b1ErpucK4fl6TdVo +GR0p/OdNyo4gT7PCLCGxalN9Q0BBm7VkC/mMoeFMRt+R0YaRZYqYPzb/nXkK +b0PyOmVwRyBDeP4ISBoluWtIdo1GqoLyEdrPy3Bf3oni3usMcqED1r2C6wJI +lQr1dFHqQWHw3JPydEheAI2Z27T+xB2KVeaPSJ2Ajbof0QFAwjKw2ySduw7U +FBWMXu7aO/2HAbWFY1BgjnyTj9VBd7f9DSRpOdVaWm5io028JBY0se/g5EzZ +FHIPBWQIo5/nl5YqgwParZDdK4q9HpWqQ5SZvAa8onwpE/TfBdBfCFu9gXMD +JmC57Dtn9MmGgC/2XwcvEJHnwoAF57g5UVuDtZRN0/kDITkvWxVMpMiuMqx/ +AfzvnBTi5hNiBURGhiaVzcZwtSpgpUtWOPuWaSgHayHymlY7xGZplqaes6dF +bRuMb8SX6ToS3YGQM4omns7ZDdh96ANDjqAZD7wrwMQrdm8Y0jdvPE5Xzb7q +xu12yT8dnA2lN5VzLNKc8TvsK6yoRej1eZM6Y72WdHOyJWxRr3c+6BfxpehN +kpgxpdaZWxX+9APwbVgWmyxpp8JFoBOAu6mzvxGrwSdZd0uo2QQtUg6XP8Sg +KKl0MYktKOV8NoQM7jmADh+1VIQccmu08Ga2B7l+VG57vlW08ARpl1fI6N8W +qxSikYkuYuc1cXcdvqWq2y1vXO0Mq3YNN5f5Vry17kTM+jhEUsZ/sBSY45PL +Ss6sPDzOSquJHlyjwdKADQc1I2I9COZJTgAaty+R8m10gfsk8CrzPvr1nlkt +xSj5UzbMrcDob1l6n2bzQim0fmkOzE/CRQvP/y97smslMaknXnQD8A/ZjmuY +lP3qdnshotUaYDqeF61CGjWWrI/UbOzvabryaOfD47xkec8G5+gihIPdAO3V +8qOxQIHH97YbTYtPyM5mv9KLDuEhNC6sQaZPm8JWuU3FKcpWzXO4oPAZ5/8k +YA00BpbainYXLe/9rSSRQquhSlgd7tNT8dUfmbF8m+ygx9DZVWOgnQYZRmQ5 +3hgywRf3SFLDGhuxc2wETj0OxEa3WBc0bpOa0EXyGx/1R3jrMWSP/M7Yq+5M +G8sY912HrrWvY8BSkl0IsFpnM6MRRFEdc/zc3+vI9Fi/HG1WWrBYAbhNELWI +KKGUNwvI9V70gY+8YyrKKblxMJNdOxLDY22uHYIGJv868yWzHv9FbWG2Waks +Bff+EohZneLlbWS8LaCde74G+ElmqC+LeIrvot8zKa5cqPda1FvXgcX5A8og +PTvHbXOShLMBBlbQWV3k0ELtpCmyfZyq02h1BXzcV9vJ/DHQkJOFMsNt0y1f +GF4N/NOZJJuXwVl+4Ar4i/QkNS4idfA/KVeLGMpEbfKuHmHiixvrNIz0Jzfs +9IV04Edz8hP0NNibG+KFPhTmpw7fPlcY3msxMKT/LesRsrAjeb4kV4t3RiQv +qbz14GC5THL7+HQ1CaHH1d+CRtG9MOlzyjhalvqxoLJLhWKEuJLzLGO1hU95 +Bxiu3spDLrvFIqG7u66CIB0P4Os1VBFJZJL2l1FXwkTfacUX7Z0/UfuvECtw +Nr6Ns8gzQKJALhnUxObXYIOT3dc8fEz0scBuooEaG1e7tP6YFTv1EY2KH5he +2byM0riFGyGYgQb5mT7HBSYaP7OYkDqok7vjAaD3UH8DLnot2UjjwP/5hY+u +VVDVYAIosEvZSsjVVTmXzcJVovI/tNVSuGf1tBioOeGglA9XF+epb7nf563w +6eX8WxzJPwyCOL8WV93opvUekS7xfHIM7LVQVY1w/Yz4WhkABdJr6i09Gx0k +AqHuTmRILRg4/oMXeCYOWo13yfDUBgxx/sbOlT1bo13Pj32YZl2XypaDRZEV +vp9KiG1QG5ob5JuutDM1+D+bBN5hayJUq669aIi0hoIyY2tlW5VOEgfRYJn8 ++kfySaew+T+oH4MNaMDfGry79vDMCCWzX3wr1EfI4i6m5tSPrZo7glVetgrv +8+GJwB72w0+34hqQUKMzdCK3D2jSrcnrMy9rHB4teRYHMR5jMjF+GHx9Bgnn ++TG2uOyiqYqIo2WeTp+ti/Ev+4tq0L+E6neSCUTx1G0RNcUjBkaAe9xhriqH +LKrzpJuOQyqlOZEFV3NGbtMe6cUiEyJhjCEPAzZBP/Yr9wuRxonP+qjK4cnS +vNjj+N0cX71qEpRv8H2K3kKa/Wy190eV/Z7+JB68izEmywdF1+Fe17nA79rw +tSjREp9C88rBudJ07b5/jEKUMOc2CdbEIcuHa4YCRTQOgsb2soSS+JkjlZjb +hd78cxuB8v0iEdKZSfASknLOds/3zvv8GMHrQU34Sb2F7UA/mYUbqsG2bQsV +68HAjXcWNQVU/bBeQz6ZxmecwWvdrdynhVYSy5/x3iwfwIMZ4x8kYt1XZP8+ +NWWgpe0oArnjH2Vbv71HTT5A8JkDwQ8w7+jGGvGD58XCdGin+PAll7ZxYgmB +Ss9AGFaAtzd452x8q7iuL+ik4IgnkS+9f8mXgwRLJLWYFWq8nI7s3ubYmjj7 +onz4WreLlJj4Bgah+Q+Fa9zBR53+Hxq2049euqt+tov/15CRLESqnbsY1z4F +GahWLy0V028iAibjhLRikISYhNwXqczdgbNawv4GNMaoiKQfnsaEW5DQMEAC +iidMCQA2xCCsVg9iS6Focw1pbAABNYMh4QhyBs1/BR5y5dIYmJhiqBhqZ8Fv +4pJaqDqw9YaGFmUnw+rr9i5VoPcaZqxxqtNM+4SpJGL6OxnIbt3CHyuvZYfw +YnzK/1p3WNKt34rBTaTB5fqaI8noYlS5DmqY7aoxPuWq5eVGUAaIL1s4siRr +LpYi1rxGWWSxVEFwitTRY6uK9lpLGYnztiyOb6V9Tnsoi3NdxK1Jt3ZA3CY6 +slZfl6OhEhQAM2nTfSuti9u+TWzXQ68QI09HF0kLDEXDAmaUk09s+NVX5TvP +IJcQXXbKTaXXOqtS+knQNeM7XdNHf+iFvJZqE5Vi8zjZW1OnyBMmiKkpNBZO +nQULG+u1eHt8tH3v9J2e3NRrUW2Q6QS9Yfq7hXRsSiUNsCHcmI83vb54p6iG ++5vob5f1xzEuF+hoX1k/8Fg3KS4ujTc5pnflc5W/60+ZI28A10ZKyBMWXyQ9 +i0YK+puOlnk3vlBaVtcP/fRmcMDa6r8k5YTfEUyyX9pmv9btOxYLLlpSGsAR +UEwqzGo1l8qWs4WL5qusA1RbUNojmtvLP2qhTEFwGgtP+SuvEznUm2fAaMav +IGHp5MPIwZ++KL82SUrFvVt3IWN0hvBTZ3MUkpdt3xvcHAK96dhAtYE3cZeE +C82zXtplD+arqU8JQDC1erNdnP0GPVc35rZR0/oWsRZ0o9OY5tF3iVO3Zd/T +NTvRvjsCXeJz4in/rhRf9YtlE6oSN3PSnOpO57uf5U2HwoTpYUrMbasMhR9F +5UxymSI7Ns+3MhUWaIJSxatlCaKbNFcNX3cdtmjUssNa3lodK8ZP+HywG4xh +dP5dDdC1sb3NHbTHXq3oi+wNgKLJtEUFFhQ1+B93ukEoOCzm+EbzJ2RWXTre +q8m4OvuwedRTfDHZY8hZ+leE6+dhi0JOWzIqa4FQLA0l5ra+BGkeJU4rZao7 +zCGhORFuJ6mr4mL3+6Kjqs595ZhXH4mxB3AOVfoMBHunzHpxetLIoUurS1zy +ojVt0a2IHzawXx/RCEQSFG/ZuDA6qqfh9eKleIyIw00Py3PEXANCI0POhj0I +RfYiQlIgQ4XCSjRivq2Lu6vaTv/BDNatNv0uPyX8C3M1/zMDVwsX5aKz43Lv +w7KvWoA96dyVcPp+kRIdAHBRnQ0gMvlPNue3a5WcpTom5MH5spDuI/zv7/s9 +S9OPrfGnu78Bse7zCyzHvfaq4kPPfLkdSGQtmd5zukxVLKVgGE0MS6yg9izl +ck+uUxyDVUY6kNy7XbKT4uefh/A7ZWB9avKo8AbqqWP9DdRixz4NweHK8aE4 +Wo9KbTGOcVMY9khOeVrE61o4FbMRdHq5ug72g/f0C4Xy4+nSTh/xuZn151EY +BmnloUXQzMgfIMbo47UQk9bUezphH9EU1I8VPhomxN8OUCkiXcS5e7QmCAtw +EwP5JPJ2vF2V1+56unf/SBCbPVh74H2Jz+eIoHyXxGWYdagJWT6vrE+ifsd9 +IceyLDSY/ca2NYeaJo7Cwn1yAeKAYssD/u1dgdi4hVT7aU3MH99O+7AX8/5L +w09feZ4I+DzvuilFkZH30x/U4gosUPBR8XKGWuGVb1DVOX8K9d7h+MnrGnwE ++IhLl2CWFtDiXZ7uPb/rAOyzWorH6GeMdUh/Dr/eFyDETaRny0ujWnKRZgnj +fY6i2eJ/xQV6DwsHMRc1wmJr/qRWPkUeZDSKC8fdVxLzSJ40vBzVhLu8YJ2Q +7wpnGXCaFslE5byDxUpslsx4Yqbk3KqrssjklvuSztKJDlFnPyPpMbyLO+fh +9ipiD6XDKr0SZuvMRzigfnuNCkMg0gCdn62eOh/3PS9+1W/30ICGLHZgWWi4 +tzmg4/A0FooM5Y4XUXPp84u+69i9Pe6BLGh3tTsaCeIF8Qr+0WcnIfhre/Ya +8GXlgFw+FTgu+Q2Fg0YOpk2JdXIv4MjUDZioxH6w/7w3PESK9sCPPGtLDEU0 +ceTj38UIjsh0RGORuYBsF0lhGO2kI8qC80U/oB/QMmAprQfSLZVdXY6TzWSY +KVKgkGPgXu98JwwCf6zJnVyAUKpaLbXD1o2nhW0adldsfsbi59YJy5hGbysU +c7yMUp9i0dGOsP8uTmxPSCtnYkF/K9vEAPO3/1Cx8BQ+ySW2Ug6LG4/Vkhpd +O4WtTwTP5ukn9veHe9JG8Bipr27gfb2A2tm3YM5Ym94eqXz5ACX7I+HmAF7g +VnDCze8wIMBcE5HUT+6MfQc7/xX+bZamOd/UZs8dsWTysMf8U2PmGEi1co1Q +7beVS21aX4ccIKQo6ddswGEGftqvUx0uDkqRF2gP9XeKE6lvHQyFEbfoGf7l +0l//nqnWDKOAA/w88EaehaDXQoniD6VRQAmzWW70/Iq25ap+/zA3YbXqPBWK +rHO6AVIfOtN5D41xJL/8e/TcJTIX9N4SWgfdl8OWnvjBndVTRxhAogfy0Zf5 +xx4rxVOpUVazR5vgmZjB9j23hfdw+Azhn6ScF3xIJqmJxRkzbo6mf5zISv5e +Kr3lGjvpna9OUiUhYUrA+4cxjhrgH0SyQK1oiErO6l9BzS0GGlL76V0vi2sc +VwjI0Eo7uTOPGjZlrmdTirQbbW8c9eLsdWF0NCFStHaUewTrpB8/sogIvJN0 +NVi6QuGH1w17slVxjXyT7CcH8KsWmNC460iuGDGFZ88/7UgTrpJYnr9UuxA9 +7A8qqY5iJahtG1dcUyCItD3ReZ3i8OmTODGhekLgbKuiGR3xxzJJQtAItuuF +Oq8XZ0el/8yHkW99uYJlGPcrnH3W/pBCPYQl3nqgx42vC3M7UQrOfygh6Yc2 +K6CQQNbf6X8MXPmGpd0jeN7oxXB1jEhFG9NnFW7eUo1NHNnPlNWVP7hGiIK0 +XBI3kRSx+LgzDeZJq2mElvw2C7ptdii6wGrNyoKDBt+B5trufrdb33Ajga/J +EN6YatMkxjMTzZ0u3TbT1jhazCKe3BnJF11wxkoCTYtOQX+6vkJlPHWDQ2eq +cX4Vy3WWT7lCQFQaCfibXf8ixyIhdoUX89SGYJmYiZy2owqEXqouUGknLJlX +EulZRgjRw8vYvamU6ju/r8FGTGxSoSKp8OwFscjthRpj78MZ+tDZgT2LtQz+ +bR4Zov34oBVK+dIn2oa58w4WVbLlZ3H5HiQWhRFYQi+3I6BX7RJYLoi7I3NR +EL89EpV8rbajNtM2yNjVM048apTJSsiqV5gaiLjlNg7tiB6vyl/I+lcf7bkI +IZN594H2HdJ+66JYZt0spjoOu5MMLqDnryNSMVJijH+7YXgPkPR/qX0FDAL0 +zE6eJ/y0MiEzqDe1ZjJjW10swoLLeBqLgR7SSo44T/bSzMIhXW8HP4yYvNe5 +CbNeLdsKEThI6WP0RvGdownk9m2XWLUuctBdxWJQ+yaHC2Vwh46lNCeG+F0N +h6bZdyHYqbgvOssGxXqNlTRXGRo8FxiMwuAe7CdRM1T28iOxGyrUGDg56bWB +xfbqvTCTzU/2rOjx3SmLJ8sJLiypyLr+UPHRA++frFTAcsa/V/N6IBMMhVfi +SngxrkLeufDrM0SmFkR+WFUAeynQKME6nUbtlbUf5dYyLjG4E3lQH5AwbRdC +TLhY6Tr76qB6ikfix5Yjhjgi+ZnWcUsahNuwZtWMT+VndzkIbbYHojX95u5u +Gy5kvir/l0U+ejP7x7bBRhzxjh0VrJHU26P0kzXrQZRIFTLtkuxOkRxCYoXS +wBtoQ2Zl461rttVbSZ6KByTSNgUeCeWV9EFeomf+l4VWk2+P66FuK0hsjX4N +2TUOXtkUpCsDCvIWLiYKxMQ6wBBjZZfjD5NpXDHD3srgllAXyCO76ExKNluy +FvxiVdQdMuXae26JH28PdM2DpZYex4iMnrgv0zJVX/6aIXj8PdSEpEhczVBP +ffn/FyaEGYlRmacNKaqOLAPQwGFWl7b289Ck3EkpnR4GPrfG832S+/iZ/zSA +56JvclM78XOexqYMud31k8eGLOQqGO2IgUfCeO4Q3q5n8aguR/+FzkP575cm +m6Jm2VtMmVUVYJ1TtfmA4MnND/40j9l3XuWMSxioN1DZkjZEOlfwjubLmS5i +hqK0M01EE3bPnMIGzTBO+joxOUQZTWN9VGHk6Tj3dGJr4SMVGFEnWwWm8Siq +/B2B80f4OgYx3EKadFBIYlHn2rjyWIz+mMQcCbKc3WNBxp/Z3znOQ+MiPKPH +VuxRaELblGQoAo0Q8A6M1hz1SCw93xCQOL+aScFT95i7Vm+MWIZQ2eSyH3JJ +AvOgaAMlj00bsZz6mXZZsjEfZwzckS16JSs9TsyJD1xi7vnPSksXqISl7j2t +yB62kRLXt9cto0Ew1stfepkx6bRswZ1O2cHy/wcsLGnECsPEZWnbxKGLGrJt +y/Vv9GP++XdzIkTpESF3cDpgrY8+1rEv4R5GGaJVjDRN7jnZ5V67NBYnVl/D +reZnW4rd8loJPuDCSUozls1UAPV6jTf0mH2+GhZ9mXe8mRNOL2Lc+Ff7PXN8 +6wZoL3rq6IG2AKWrNj0dZJiIUtgLptB8fjRMv9W18ehkZrPcd2j4yd7dt+77 +P+z0nBoFub9tQvf/D5hjGvAIW6ckyF1nWCAwo5rsIVkAUKMd86QAQocbAu48 +LOQNFYObawAhK1zAQzWBjHvp46/P41D7lotBm+CCDGAdGIRZp9+v36iefZ8O +XQxZ0JYviY9mapOy93RyuP/QWiATSrlY2N440HxwE6sAAUg77A2NK+A5ItZu +wXlH8Tezzt2qgRHNnh9gPdKPTSzMBD2Jih+Ac4n/khfwNspCxuMpSOsOAKQA +uFToONe1IYWc6eVxOc/ZWrcaHy/AnZdQF/pX84XNTyBgYA8psZaXEPNPYMMm +I2RLau+QuNTK+kwZSlsc1diW41v0ufLoZtHGh6g9zfVsywEtsXR0FK8MBFQS +uKBngo/DEyTdJ6HrjoMjcymuRurUYvYyj7TkCEw846D9kFj42TcwV4Fle0P7 +N0jg2R0S2MXy2T6HFH+8nhdjsoUgyhwO0P0vC3XovcKWCNsXOkbsbHp+znZC +BiAVMQNqrlpQwVhGtNHZ+5xfCJYgUsMci4lNgmz/9Kbn+qXg/gM7C8FKF+c/ +iCByWNzRTcS+aumC9FxCUe3d83KJ6rgV0VDMmlJYm8nkhloAJuIFOXnGdFa5 +7khOHNY54rcvJLTisonInwPoUShDQHq6zNMGNkswlyc3iRWkJjHLQyHaedJN +1/YEKzxIwHDRkd6UMe9VkqaaPm2+Mj7I7OdNMbpBsomejJV9S60YgOsAaxIm +HXRXCaUJU2kdmTBIWzPi9+c4qf4TJ9QRpWQXb7mZ5zAMasUBRFONhnVEXFFn +rt3U08t6ViyqFxfJaxVtqyTgl+WWa80I4iSOLebqb5HsgvuVLbOzn3LA6FJm +JqsZiDf4/x9IrAZQG9oSVbEKaDMWuwi+yvIyomSzIzoAydb+G6Xyyxn/8deq +0BZOC+T1MhvtDdQGyZz5KX2oAw++FERNZNuPFoDDY6CeMzlDB/zR2jVTYr9L +P2vaVpKfgHBn2TtISz4KdgyUKP3edKd+LsY2p9auak3SY72rCQO/EJIhVKj6 +2TfCGbtqYS7UWaLA0Gi2IStrqnkE5ZbrUdaFpe0+eyVETtUTMqpLBQVWjaZN +/0w4+H8STS/Xa+xtrNsy7kj3B9vbpfZsOPvY/msLgyiBEySC/FCc5QfZEcYi +VXRdB24EoBpoN+b956HEdNkyJ5A2sEpOK2/OXljnA3QOljnOwBcI8ymKzglx +BgLtHCBw2PlT3E8tSSTF2WYeqldWJWjWkDBC3WEZ2IbZ6mo+vYBrJ1XL0asW +odFWW7IU9zaihtU5ftNa0iahIq1g3cZH6di5iHi/F23KZUjizPEqvjJvP2LK +zjSiDBgc4BrvivrZmgtzNza/CJiOvfuIj8jCPX1Gm7yH1qfxVU2e/fvmR9lo +VIjV4BTiQSMYpCd3WvIebhURWKo8rq/FnmvRKYTk+juPg9FN4WEerOfqkNC/ +PrOsBgAgAYMEVh6kpxl+5bVXaHRL1nVjrk7Ph35I0cJ3sxUwGUdxhrOpQMbZ +1UKYIImw85EbT/b8w5WC3CojFOQIACYqXv5EeQKpX4On/H1Lvs/dXG/DOkkp +uiiW4Ra9BEoJH3ODSx4yNsry7a/QpN+1UnIFeacWKX9MWSqwQ7jXwfO+zavp +dOhrTuQx/CFNWt7/xdr6xtRasl4ePyqqlwkRB8PsgsPl39gwG/+YSf/Gvhma +Rz83FhuLBN/xBmgk2OPk7kUVLgRkkGNQ5NXKH9l5Y2mo3sAauHNVYZP0Epj3 +Wkga2+ZXVQvuHkoD+AX+UC8oMdGKSlirNNmg5gNG7qcJZnYDTqyWopbQhytv +Anv9x8EghwRCx1S4yv4rAQe74gGeXye1TpSmdex0s95Q1nOdYl8Dq5QBVQo9 +7q83FS18R8r1kjleXjkmU3WVasLhGKmzw+2dNDlYjZ33G35iqmdo1MzJu8fU +oy5+CPJQrUSZ1bIxmbB7e7AK2n9481A+dLC5Ki/hcLgkJ2U6qoNLJVFva8rF +ZON5Ceb7vFk/HqrjMmsuZFz6rg+rHIi0HBNKOP2CKvUMdh9ivIS2RXU3uCfi +t0W7w8tUbE4NiPezjpHyausiF3rD7rWpJd2hqvS3yznRCBUmz0xo++CK/M8i +go18lP5jJOW1GVHnF/NhYujWPlrNMytORHMNJfCuvttfMNFk4o/T/fPGHDHi +wt3Zrxc3Xjgj5fLaic0hQzdGTCmEXgU0J5ZS3ChLnUM5d0cCpNobw9VuV9DI +FaNj4vcWnG26cSKP7EbgKLlYRSuW3kObcD+a6JZirzNrems6d8fWrozfd9Am +ajZ7CIMbfWmtpF/MV3YXYDbmKxDsPfJEAVApMeUHQNIJ34IoMAMsDZtPQXQw +/Aaol7uXJZhDaa2QoAECyY81jQ7u7Wl/6Wdru86g1uDOSfpi8P59EwhuI++u +o2boXdFIZFOK5gnfTZ3lDp5JTuO+pefdQ+dsOn42jqiapaZSNGw8bTN5uYut +xkORserppacaxub71m+z+sx/DVQEjkSGBpcfLJMQnGYKTdyHHIrIqUW2sGyH +Bezb3+8b15p4aA80yvP8rorS1xSJ3J4Kws85koYn6oDYviwg36Gclwhs3syF +j9Ig4ig5gbBtTFfwSdcXeua0H1LYCdL8mBcTfiCnd3vCKHfJFFiB5pr+Pjdz +TD2+Sg6cLwVtIRN4Z8YaeQoqtyJheqVNqJ44ZvMm1h5VYWr7NlUN8gj6XXET +dXLDB5ilhgsqhop4MWMM1/EMHlWM5qU+Pru2eVUZ3N+SUL1Imt+1O1Y3YlWN +VUY/Hpfohdi+p/IvxlnJWVk8cZsVLs77tDJpKRCw3LRLAd1GqoTV6syOGfpr +AXDd+8oWYvpDMWA7aX79qr7sf4XFFFzDCOqL+dYu6W8f9QHYKgc82htbhzR6 +VATT9wbVULMPdnTaVy313IRn29Hq1mXLFFOJtGHpEmhvRQi7+b4Ztu26X+jt +srmXdubeLokKNT5fu1V+eCb9h16Zq7yqs9VN85L9eQKOEpGpRrQ+M5ikMZiD +LMZtxKej3XYvu/1Y05VjSroV5A2Abk6xCEsmroV0oaEZ+ZOOluNWmZm2X6Mz +vuykfoVfBtZ26XnqRs/kA6qGIgq2/Tt5OlLYic/C8vCx9Cs/crAyJ1+cDbKl +FZ5uA2gj75nVVYsvCl07jXDOHlqZVrN/a3uZoXs6FPnUkWGaah08SD56tOsa +8Tjl28Uop9Qjor5Ynrt+HCyLsG12tDbo1lLKEcKGXiWx26Nonk1R4sp56T3I +rtkcXcr0Z0mNvUkG3QNoFFQtiMHlrgK8eLmS3Km1r2OsQ7uDdaloh+sIsps2 +vl49GU7B6hd7K4sZvWfVKs3vMScaSOGKzZ06yJvoXYHcMGUJqwdKLULVf2R1 +/ScLx2VeHMIgAuMGBfKtXrb8UUhUpb17FljwGL1MMMHKhkt5d1ojw88hT8E6 +6Gd3RYug9+a1iQ8HQ3NF2Oi1Hhbrt8T5UjwPNS+Y9X3A4gxFq1Gw/gWBpflO +D7M5RfR6bg/+oTfruqVuvjqxzaRCT7yff0zst6szdqmDMBi04l0xQypL6yfR +4j3rjVFnOUMvxrtD4cgkS9Cq7IonGRnlsEXPbg119/dhkWl9icN3u863YXN/ +CoBhPfgehp7097/BHFKnM0eqYi031j8V4FDkPhgpHNpB/GpMY8TcQneF/cAo +aK1aaVof1ZJnbdQr5Mn9IqGIThi+ef2x4xhWsSb2Xv4wHnT400lZ7qc6Z2nH +QJ3DozDVawq52LzJ9U4of+dD21llJ6zRSSfRTcE9zhJ5xUv/fT+G6knynIF8 +NbKJiSjzw8+Fv4ZF97JjjEQsbq045G3RBRO6y3/rK8lwK+GqwRX/YwgNV0hp +ZjgRu+DI8X2/yuPvsBnTbVV26an/tRXyCvSVjSjOeE/RVXolA/XtD+Xt6T0H +trsrXzWTAhjwDJPZOPARDVs7g5MaNEo7e0FwnqkjCblH6LwMjKJu/v2Sa2RP +UpJrCZ2lHrMc4sVr4kElBMo2VjAdPfvqNfEak1aC2nybIszgfuDfKc08yEmT +izYE4otOVTLZYPfvK75nvXlc24qUo0RJRTX9Vlgzgya2i5xNLGrtjaVCIXaH +ICnQXLLF4crafXIJqUiVOxkZhCuyF3UmTDu2IfXq32BVaVFPvEK108vwnlz6 +VWAl8NRM6ubDQYDa9nGdRg3/4LcdPFgLNTGHpgGiz/K6eKobv/Yp5gPJn7kN +ZtVmptJsIRjqVr0M8mpzg7NY1w2qdLRcMyXKIpYO0gPPbL2Cje7C2375yI+V +0ihNbcSryWlSKu1DckX/tW1SN3rO+1nY0ao2xFPnzIUtN1IG/5Sy8u7DTwPH +dr7zfb02ubZGwDQedRt9PFD5rztiC5LGBa0pRSQYFU8IPtCL8cWoT8cJn5f0 +E4CplNL0Vt7zh8jhVZWFcAn5cnEqNMzYD6ehiKPiB3+HNgbNt+hGA7zxeW0L ++V2K5kPwfNzFPM0FuRGGNMI5mwePFiujgkriyesQqW/ZLVyO0suus8CVtCoB +3aqPA5YO5QjwVRbEr+qH8/x5858fG46P1I/qstujQD7zaSX5o/BdUmJ16d6j +3x43/KcP3DU9hMcIDc7WpIx++mx6liiRC9rZDIzZNCkA1tloKdBy0vBtqo5K +JhBXMOhvr14A0PQfl1um1shcOW8wm0X2ngdXlmV3J3tZtJkF66RlAvy34bbx +80pddL2LZRyEBH2yV0TFCPwagniAW8/ss7cltHaloMxK7xgboaIrv6Pia77z +7dtpApPpee/suqJDMj/pbcW37V+zOVHETuOjLhYOhSJ9yq97862Sk1xiSvpw +gXIjKIxFeASATMvwomLg1rRm9WcgAxlUyU08ioj43phIof9CeP/ZmycRGCit +12K09YsF966jlRkqplmHoc8NwNcjjn1Nzg/ojntavkyh/VfjmWuwtc+wqGZb +nqNAFgTCZxAxbNvLsTw3Jf54zt3vGlzIe5p5P1v7feSkWXrp1K5V65/g4t5H +cEhwd/JjMBaWtlvXy/Mnjggu2/kGWPKH9NsNzFGcKWoZpMJ2tgRrg4BZGHFx +xof2u5XrZpzE76hZsoqhmTTJBM3sETx2VrT/GqI+OEYPjd+YHPO2PzcE6G8j +qWgwHavr0MjtHLgghTmChW0TRrF/RyOZ0wGFlG/nymZ3o/2ABYVxryksUJD7 +O+S6jjzljSMWi51LJpbf134oWNgTRoZj//XolB/aVo3QTjzlUKjnyA9kRKXO +JjhBRo8cLyxNZ+fekIZzxcg7v4ijojrDgRs5WKKJUlWu+XujQZG71EdQPZFs +k0hiPuufj0njXoazBiFbJozUnOGmYba4ujfUGWhLzIOvpWCTYW9DQ/iCwkQp +H98i18BdtJU9CMbq0kfh8ZNq8rUi5gc1zgQqbD3JKzGdsNYVzReCtpocLD8c +cYAq76HCaHbl/sMHvBSXJpykTR4R0tFd/9nHL1umJGPH3LHEgqkf/cv4KBvh +eXW8tKVo56YR5vK/n2tknZFSlEZsKl92yWbYPd/jYiP67ZAwxuc6oLYdfHDH +ECkw5YkxnHucCQIZnceijCZX6kQQMGCtgcubl/EDAvohPWy66GFYUeiPMtMu +hju0ik1P4oeJjGwhZ1oRHLydnMKfRi4yStv8bLiO5DUD4dIYlPjfyfcM48bp +8wIsXQ41qvUBYSHPkxUEcwyivTfJerp99qkAy6N+7kR65XmM22myX/VEyEjO +1+JkGSiFegAjseX/wR/ZhfFY5fa2ROxwsokc1rR0rewXvxCSIqK8JM6srN2Z +lHTilVD4RHLhUPxkJKaO0irmzpoUhelWpLkHPxE2WSGU379J/p7sjtIux6Zo +czSg0IQI4panPNTpAhjBqwwuDeJRYuq8UXbOTnvRITK9P9qbfBVpQRWmWIcc +pZUqD7Wz0TuRtcvyEIm9B3O8rl7IXFdF1YL40DFcPIDBDzdJBLcR3FoCe0uu +4uvAwjzC9oO7GD6LMYOM8tFBKh2zrWCf37T3+uIkwq5KEu0fWApOu5ojm92Q +2s1S5Rx17JKduCDogRTSw8S2cdzkI/hfFi3Zqr19CkWhcK6GKMa/UPREZMwF +Zq0IZ0Kw5n+Lk3eUYludd0sCtGgC/GgdwmpCqehRgjWwwJM1B9B3scjQRgeE +oggaDOi7WiyLRg2SNLusVO580Rtl5X+w5DjpqE47GOH6pIyZ1TOSY1zSArh0 +BBQGJTxSO9/gdPSFGlz3yB79pCPwzgUyUfh9NGtYPUNEr2PLLhqqJoQDR/Cd +CXA/Z6brK1XHVqUawKzE20sD9jMZsoVKjTNkJChQVLxpgOPvr8wQ7dMUNXxe +wZ0z8EZLtn9eN9zjbiYPmo9sSPdkc28YTUkbvt9463B9OOT5Oy3L643TvuCb +B7zgnW6Vo31yMx/8uznjpIJp1cvi30e78eFLMstVtwFufqvjxjoOG9z95oi9 +VZdEAWvlVRnz9pUqmXQAwhZ8m2fI3suYaIUhpWMVvGM4tO/E+F0unL3L/kfL +Uajwb6Dcfj8bDqjtI9SuS5cSgpL/BznEqMJlvz0bIWCis/AIi2FEN14H0dDy +ihPlfPOltYN2pAellat1S/idm3fLcbK1W8eVz+gQsOXcGO3aiTqDDBKgsSDU +tyQY5VKi2nDkomGpbiFQQ9F/nzLhWUX2CFGqCAYPV836c8+xRJPKIvKfUAAU +IxxHs5qEKo5kqhYiYeheNzsbM+aOJBsj9rVyPMEpDS8R32tcr0wpJFbdPfiv +worUdUmgoe6YlORIz9EZDTzA4BU0Vutmmf2xy60UP+WNc5lO0FxHFovEDP74 +fYJVUNLII45yspbcJI8KII48wixhuU8OD92IxHVS51HuyZu6mhcbTMeDiQ2A +R6Qv8iwfIMu17ZvzdC72H1UqjOIknHDoTy85D2qfK4rhNpTcG8oclSndENfZ +efpahnQ3k1Gcx8OW4ptNevzQlpyEbakK16XQlOVPp9IH8lkdOSo/eAWskXq9 +lj/GxnRVGeyJjPwWaWoLpIH1G0KPB+rpXlt7ozfy1TYdkyO3NJ86uArsOwYK +R+OHTB4umKJ6O5FePBfZvAUMVZVnqB71dZEX1eqEge8acmeB2OkQqkDBJwWd +2hCwov0f6p75lIep87FG7saPKemt0G3gWrlTHaJqypde/H5pBIE7+BviGuUf +YAlYOfkTMFvliDpWPU00zvU7g5zALL//k2RORFyyBjpRw5DdOBP1OdiUTnFE +nEAFMqprn05WkF721v01VNJfC9AWP/3rK/7J/W8yEIRKQD4AOcfIfPjhSfKO +UyKun4Zr0NeC1HGQl8shfCMfW3pDNrSBrnkoHerKXTt85oYtuxxMRNfCrKFU +cd8t6YDt+uciv6rFJEBblnJqkU34bI9sg0IWB13xDNSB9z1Emd2JcmyURwW9 +nA34cm62flXunbRIO9m966ar1ZnruFU8hylVA1ogx7OvvZm16M4f8054ldLO +LqsGs3hK7RaO2SH4jHh3kijPU8dJTd3t2Y90/n9qpjCbSw1Q7qjQCQzwGqRr +qGWEAdrrPfAQlQFh0/iRDtReALv5K9+FzHf/uJyuj6Zb+IRoGmL5D9a58uLH +yM8zkaLr0h4uO/X8iUuNIMKJFFWphsJtOOE/VAGQF4Tj2Wi/GNUcwru1EpX2 +gqqt2ykz7oGlxhm9aLVAtoTs1JsGVoH7Scn46gPBzhRrdr1vVAte9qx7MNlN +jthtHOeQjb9Zw8XS3LHXnZ7iKUHbQNDtB7/zCqWRZLFK092DGBMplKSUxMXe +RrdDJjYL8IUBfIOCu2X0kuzc4BKhhISPA3YGKv1v1pcPtneJ/4zJXeqpXfP3 +BiIR2D/pXlfu8IesUd93nOxZTDJnDUkiAfxMIOBf8TEj11m4ujmiNfti74XA +2Bz7NzN/igKBg0MjwtCHz8XjgxI1ePYSHMKWlyf+K98PTMFFGqnQkuJeb8dQ +ik+/+19wpmfW/T3VadINmSAHVhBnu6vKXMJsC5nUrcak5lju4zv+E0IFBPVE +uYOoCTWExLwiVY8dBe07oynZaZqA89m4RQjod/48bTuZQOvYwHasyXKMK++2 +l8CmDaFJ92gCRZXJR9w6kOUc5dkB8kUck0Yu0/kgbbTaWoQh3JuMjxxU1Bff +OY7Xham92QkQdSCIeL66pjv9fQu44pzqw3Bz7a/IO1tBwhSCAclz4cuVSsOr +XSY22jSDDO75OwNQtRRThUbyXMgwN9CJ5kGbI/k/xFyae7PVyyRukhHbm3l3 +3USJH23sv5DRzsFtzD0h4wLTrt0q3OcxWdNO2NZ/5n9AnM3goG77XaH87+VO +Pv94iHnIAQCia91Bfc4uxOQTzuFJVXOKZyIfRXSk6gNcYqGFavJT9gStwMxr +Phh1opn/pbD/l82tfDRFtQI4UUiY7ubTh/Xea2tpziqv8DpFFei+p1qm1oYv +K1cNEnTuKiqoP6jX3weDyfV4Om3NWWJ8Bd7J9BVlAIPYDiZwM7fn6WEH9TDX +/wf+skQ5horovwWwncfMSK3NJ73Zp9QDyGRhp4T9L+GhrVPxvI7I5eeHdJx5 +2CZFzjS3QwcNQixg46wGCn39W7SNAfvWTOxQ2vcUZGjFkvLy7g41TtmrS3qQ +n0dW3KMSNjjx1dJGlFvZxMsVl6/80ezg4+xMeTup+VR3tpVoJNKwo9Q3Ok1T +x7yz4fjQifDt63RVFi+1NQdB5nAw76ZWjzqpuU4vEn5MMbqnQ4uW7GhIkf2r +fuBpHhCuxx/OkavxH8cf+B9u9WjTA1FmFWaljhjkQg6VAMxZPnP044vwUcVu +l+pB0WgETmnKHALQ+IWKwIiIx8ziR2JTMilKqJmvWxv4g8gyHBSHGVxEM8Xu +X2tM7eNHmmZT/+hAhS+9DNcBE5FC5zd2GbvNmdP6Wo0/J2ELOoSUcviqRrNW +vROjeG+UgpldJw2JYCuQODCXcBS0NxrEG4cKNVqZ72MbMMaU0JnJS3OCprDn +1vD1lJJzr2bCiT1hM/auejTqnXqgswBUr6UVBYf8JdN+JKWAFLJhAGqtyGSW +n9FmibbVeTSXok3RpH67hKyE7IJejhWClffQHovQnlC/FSqarjDvJtJxX0Ec +QoA9NisCoyymOVxtFF1IN7cOS4r2s2IDYZSkZgbHRRCpFDw5jJGvxMH8e3mp +uH4qudDCNF7rxf398yDDG3fjZOzysDOQCAZUIsWIBv6j2Ga90QrJsvdj4o5/ +FEnVhWKArBLhqTh+qjFkgZeO+h5UV6c6mPlqELFlLkeMzj/GuE0tstL8TOiF +8+T83GDw7tzWMrzgq7OKOhb+iNzZVxrbM9YGhd5IZMwXIx/G2nFQNQxE3LXs +2suIk7g+rulshfL3nw4rMYM19hfR4wiTw4p4fmWugwv1rwOmLdIuyLjbKqQ6 +xRIdO0Z5zytoij2FAD1jvLRmF/S2F5gk/nWVM6djreXzhkF93ZQSTWKWD23T +u2r6KQslYNeFtZdtWrBULpSUcLL1XQLeelWCoXwvGlR79TPvj2dEzIL6VbVT +8J1j8G+T/h8KkrbDOHQnwKZ73mjLLOwaD+cf7dMq95AqTItZMZ6QZpHO+FGR +zvk7Z3j5y4+Zn/QyCB6plwzp/9dKHES8unw0OXWmv1GvRKUEjgsLO+LetIJE +9m08wbJVnhhYkmUZ7G4ZRbLq+A2jGZOJgD9Gm+tR+LWNMroOAMr1cUreUjr2 +fBh7k2C4+n3rPfA3xa0FkI+ipKvdCQExUBkLs6TSAVOjR1EOVMlZGSMSjGla +NCddj14CM0dnmTmXj7XcllrFzdicgtMSm79frcZQhfrZt21rzNW6goXG2T3h +oF34t+0ty2l7AjEtW2csOYR3b0TB1599J2LBJFWetyMgs++hpnOfXxrrvPS1 +PfLDoaQnPm/8sC5vnkfdeJhYfGNyISgi32JxQaNosFSHO+Gi7lnZwOga90qg +lQ1F9rvb7w/aUdd0XUuZcYdiWE4o9b/wq6x4JeRtoTw3CAxrrPAbbfChVV9f +frsGpXmmU5c/RiIpA5ONRMGTDBOYut6JvV0I7hFj3l/6n/ZZHELaOnJ181gS +2JLXDivyY+1JTJDSjOqeuX7HV/aYU6P82yOAMUM9WOz83zOc88wfEYhXW51M +CrUDygofo2IhClblYNjAtU1Djk5EeHu6btcp4bTxZYpv1K53+ImzzTSKaprd +A28OM1IMzXvSzkeKK/qyi5cXFNJwaV6WKQluzfHWyw/RrPiyd2+fnZDDxSsi +EhsJtMNvlhjVfM682aTb/u38ATybiT6RERJL286wXmqqDI6uI7tFJT4aZlju +rwWrriJ418ewf8/em6RWxEv1GjUctVl5sECSwKTKRLHVcLkL9Qcj2s9OOaTU +ffZEPEUDaI6nGVHa1f6+19DbXM4PNAMD7oo1y8uYTZPVuGqkbYJJkRDm80n/ +PNWG4lpqwY7qvlfj4MiiUprRr6E+zH+BBeWb/Ncvk/8ImpLjFie7JzTy0JCC +qkGvPc4MS6qJ5HopRGUe+dBPpkdWUH2lVhpwx3NCRx19FfScir5eXQZAKdVx +d3lArbldoa45avdd5teN8CDIBOFM5GkV+ME0hHxJqfZpzuHEQ8c9hmqr9x1b +exydWTFEG+NLF1w4vr7ByD0XbI+ECg1b6eDDfwYsi3a2jlov3u/DkO+oauEj +2zJginkjrMatWC9EzYdlrvRN9II+xkwcbXhbHrLdAZXTuP4Oo9cAXGtRwaKq +komfWbxuaVC5OaH27zzryauTrlvM1LO6cBEhglh7toSGMepqUL1c+k++ELjy +wpnDLdUCxXFFGitByLNcuHG1J1+ED3Vi8840w2BjXWm17pH/GtWso4yN3Y4a +hbq8+UNnKWVJUWvKpIQfY9s45zC06uiaF9mT6Xb9TD/tJywATr277kkiZa5S +bJ2YVSISWqGRpGEhKdWvCmrW8ZvxgNMxRsbhGoQoVxzyuWURGw3oj6Szl/wb +/AR/5seX2kv/JHqBYp3a61mCvOZ01TnbCkXfJLN5M8aC46+FxayW2hfLCry2 +1blD27cP1uMNPsmKRH47EE630jtkkZIAiYGPieyvhMr+lPOq4STkK3lExuL5 +YjRJ6cc7ZvOtQ5Rj9rpu1YmDG3z5IuCOgI/nhxcbm8fa9pLaNjLnerlaDE7X +oDLZJiOfbMjhO77dhzx8y9okgrzhBb3+khsR2x6/z6oR41LFO0YE2ebeQV43 +gimF9zpbMG8M/tEXXrNJ1CahwLQhOvuIjv1bVIXooV/OJprI1HVAxMzxxZte +Gl8hq2cAGw75Qzg+24LKOhzFqZINn+90uAFcuFWJeanghB+CQdkJgNI2OXkx +k5CAxcjaxeARMEkRccJbaVIp4nw09gfJ+vCLxCMSEwsBzuksl0rBi21kc52R +TcXFqW2SMS4m7n765fJ2OxBTRWTgxz91K8AmEc2fAa6SW9ydCwDriMLpfCPD +jlwCPodV3Qo74EcQIDY3+/cg59Zdaa5kkposyCqShcUdp8HeIhIYxI4rejkH +dgya/wJ5jYVM8hdn2Lr79qlJu5rqWp7dRJV6qokjX6LzhLhnmjVa/Y1r0QEC +/jyaVt/zp1CWQy8RhuJK+l30l/bS/I44BJUc6OiYzBUMvHjQCSwNKNqEgyNs +ReWy+isSugVqc/51NpJ/Egi5FjvPnun+xaFFxWg8prRZH+onn3cN6nplkrbf +FlVAPnutFxLoe1Hgk1sBVhvUNYKkdDZDCEAJ+RX5StiY0RTStXgQaKcsHb48 +tE4fXPFCW7IY55Ez1bKfJflWZBTb5UebTrYOG2w2j5RRhjR7zauWOE9WteTw +HbmvuSoXZulo8f+euISzTzZuCMMcyDgYgGCLYg0stZGmKo5Vm/OKbtBjOV1S +lQbssNmteb2ECP6Si1J3n4yD4C2KvIHU08Tm/rRJoXielqMUUnTavZJ5ezuC +017DgkSaz5C1mZMxoTHiXygRZxhHSkfCUMqAiu5j4oSUnO7+SU93fzDT0sQ5 +dltjgqBMhbi7nUBN1qRCp0dC/uvbYW6q1mm0DvZsz8yH2CxX5i5oUmd5cP9c +cc0flnp6VnusIWFlWw7afNkaGPOfDuDa0+7WUp/D+UikSAgATWFvszL2mJ5A +O3AScexUIflb/USYmn1quvdqmi63hBnjlyz7EGqVXo05VrttaWvevqHVZYcI +iiKctnkARx7uQK66jASgx5PBBTA+d1e44iMYnWHJyY+/Wuo0u7s7Q3BjO9zl +/XJAHTUFJ4P4kfUg5E9R5wxd3IUpbY1ygrLM5DJnt8n/WO676FpX3Ci7LxiD +12/5efoem2d/4/8Ww3vOb24RwVHMV6s/TuQ7y0iIQbdSZtyvr7+zoJdq5UZC +Sp7Ei0m2tRabuAGxcTUek7kCXsudKvmFsm6UOD2/2/tG6PSI1D56kupTeTEx +fXaYUQ88SMxcvWdorBVGsYQk7+Yagz9D6jsRsWtBOQvxRRsRebmfFDhDQLCp +6ZbrhtZim3Bho7W50eLtzHYfrhWljMBhXDQ0NffHA649p/5Ufv7u/ygrCl8U +mt6iI0jGRf7Iq4Wf2/ST/Z4YKVgpJp2AxVZvo3HNhAMGvqu6Y9d3IsUqpJAV +zmad6XDR1rAJEszGnyB2IFZbe9PMj15trX4WcTDgqByD+rb/sN12dR7PRZyx +NGM1Hg8mOwcbhdk0PRoQ9fCRUh7z9G8O+ird/2LWiYb+t2ebn2alm729xZGv +X11siqhg6yyx766c413ljXHZxin2FyjJtasfzJvdSOyeJWn1F6y3ZyZ7485K +VN6Ai3T80CFnNFJSBM+yjyY0lyySSI7omcC0mBGsF/TNvkpXy4VXum10i4mI +mxksrj1MJqxwqnuM5duF5fkCABAHbjQqFiO7pFIadmc+QcldSC6E7EVSelGx +buOHd8gdfMN/6UEbBZNxZ+1xUtOAi9UBXeapb5+1EXu53SacNfdEitmXigd4 +0xGQlrntdfljHmZS7fryvSMcesTobd5KmxzmjNIQLwMBk8T7vpzkM1LibfpN +4W3QyG2T4NS6s0EqYJeLQ2y8ECAAhauk1PivZBMd19Xfa53rQgmhmPY7Q1M4 +HLYn++JFH92XndFWG/vewgg+eOcBYLToVDaneK0JlK37mxEK08fHJTXiAo7b +5olydDYk7p9GTnc+JolWYMFeJTPqXooCOyEQMQaZgVu8kVEIiyipIB2dqpOd +3wBacYvtzTtDvTfu663aHJ+tabAbbOlCoHkc+jQWC4T8WZt4IAAFr0Qf4wCZ +McA8EQqmmGEkf7ZkOI3IiWeVsRtHU5KooUPQOsC6RwZctWPXA6DIjrETaMh0 +YxbFjpwQd3up4RyIo9+BvQ1dUM3cWj/E/OFDAShcgVNjT945+6GXkJ4dLtNF +3urDUsPKIS/OJJtFLyxisGfVYSXEtMsfKehsz3hcB0YtO3PkvjLVdMXC7faW +AG0wTQOWlnmqUMR6CN1asHhmgVgR/MBnwMlvk0WrKGwd8kild944S8DeVRTP +tiyGwqmMu+/psq1zVfWVMognz28gnyOwBweTXc8M/twrPc56Dh4b4JPI9bal +soNE8wBarJTZkBQKRkvwPxGChw9OiWc1/rRS+cvO1x2PaReH/UNUzR/eA247 +aocLeaXkxsJCII9NawY2WtWP/HWHSjkYtikxzwBTBckYW74208PcsrCdN1Ar +/cSIIBqKHIAICnOS5cner6OHdSYGqECrveUaN8abV9PrxaF+VWSIc6S09Ibq +ei+taQRsnLZIIPg5qk4GRwUwr1+Zbammm0N7YizxGt1yr7jH38r8iTmJBqnA +9qycrGce0lxBtjCDuWaFkX7fq2186m5ejxNKPwsZSVk7PDZ7pX7plpkxjC5m +PkRq2FVgwrHOE3zM4WgZrQ3gtzvcZ4u9YhysXFkUOhRIFQFgAQIBozRJKPxb +GxMlUULz7YgsCdOanWGM4DcehVmzZ/TZ0yrb7NTcMfoCe0D1z/X2IRV4+geJ +A20Ja/Y9mDCCyaBBzhpiRYlgedOeqw8omp5eoBVEWZFdEzM9QzWSQ7cSsqC3 +NkwS99IpygjSf+BfhGLz6wrxYmXNGiaAK+UHBw5IKYlD48v7yq56Ga4od6Q7 +OJl+nZ1LUMtQphnvq9WoEdcnCVzqm5sbFvF9fgAAQIARBgLZhQNYUACPwQU+ +/5nKQIB0C9HB1aXBQ2AoShMA+xv3IO8TEH2jlJbbPY0zkQv7hKxHuqGSg1nO +4tlFp4yYCbl1o7suYe4aBAsco5BE9yddNmtFCgrTWJB86eI9zsedxCYe1i8+ +s27/+whmJj2KFPWowHH6bwcEfLuKVs8tKk3IQs0PNH9Zck+ilRB8JrWjusJZ +VuXrfZ0Cq6oxcHmNEcedTjmMWOU8XnPHt5EqlDygXFde5/RpKvKtr9obqnyJ +S6TyACGGg4Ny1RWBKYlzBYKjpycVJgMdf/Ypm+Mgw2t4QLI0K3+mNbfEXiUa +XN506yPkeZcByCfKm7PNnHDHoVtnxD3w3gBTXpd+BtyUhkRejIiOia9Gfi2p +WQdlOz24kDuxduXsJUbTW8tx9efFF8PUT+v2x4+ZwnZPLfOkjrCbl/4FXQGw +oNv6qg8IVs/UeNrQxo+KS7lrINQmLLkOgbs0NBsA1pS4umlrT36ngCQRCuN5 +Y461nMMM+gvvAouSQp2z31hIzRc2DOusfv3HNlovmkhsAmycK8BAAWGGh5gq +GwUU7b4VC/s50diVtilfWhX/j+B8P5h1Cdjp6Lui21XhAQAAt+PlOer766ie +7xzTEDBkkVfJnO9RtYYWGkPucwS3Sqe92ekOrmuu1uAzJWZ33qeegwQAHLZC +1np1SMv/Hv1cgpXAJBpjuXZsSKjkfzvcT/IGrLis1PacKHWdTwAFT6foa12Y +ep6xd+cNsT+XzYNLQ5ugIyn4VGTpw5IRj0JDk7T2Af+Whp0YeF580fw0DoJ0 +X2j6KtrQoJFs/DttbsDKO5HDxKR5ICJidGu+y4h1Caz1e+ArGRKE10Rc5akk +YsvEFOoF+hnyRPCaHvbzcJx6bXRegGygCBO9fbpe6GkMKfmXtflNkm2phJh8 ++/vTPsazxtPaaLNi0BuyIgw0YIB7LVgoopZ2ZSQUkzHtGEe703dtiFvt7VO3 +tBk9NHFZoOJzTpM1tBcEBLmQZmJFRq4PQmehZnbzKfAJ1CrX2YxmVmb9dHbG +CICA7E7+PpIQZpC4WIJpmvjKrRz7J7bl8hocFfd9FYmiVsTTGtl5jh240Hmi +FJa625BqPHFj9ji8FcxAaPxKdOtEFZ2yaL/cYVfDGKY6A3X+qfpGYu6j6xDR +VPbvNqi0fBxBnBSZHHZy/NBJcFugiEceyV/U5mpKuH7nSeDSwZEAPTX+wyAJ +4mrCLaqGRX2GMF1l5mQ5aDm5P/WYkqesrVSBNljJc1eLtbEkASuMAfSZSXiH +OIZmE4R4ic4f5e13m73aAodDeA9yVal2hMJI1yNj0/uJoSaz8U1OiBYrMtq9 +AvlUTK8t2Goutnc4BpGPA5l1ZAkztiH3MtN8BdPItT/xW1fNSoHrsyOmbOsS +IzCtWnkZ51TW+Gmjz1e+Qm4pyk0zNy4qryGLOADGLhI4imRfooaRS9yDXVjQ +1jJZ4kGHq6CnNWUmGNPum72gzg8N/hpCm3IRlZqfrnnuWtGb5aMPC4gUTqKF +Yog9mFjoJRZp37Hf0/kNyJC+8e46AKSXZFJbkRRI4OqK7OFj36sAFgnlBLpB +TGJPkAov8E1rEArfkeNiHDcm3DJlJwb/79QVExbW05mJWiMamI5OyHSsYh5T +bgPnWdY3ZB77OJijimNGrm9jo9h5adJ/YSqRL6dZZruxslQBqdv1a3HPBqYz +Ec4UwRu5tS5kGsU9YfNcn4+ISwIngUeQ0unvSja4rwUP3+umVLc8WZ+sRoK2 +WYVDAYzGKGaj0FC30t59MxBHlcBaBFs5Ojnr1OMlAwW4f5ylC0ExiPc0f9Ci +tLHVfDX1TS6UnK1HZHzz7CQpeLFF0RbucXD55HuHr+mKgANLMTWBK4IpcMSm +/AWfjusUBhGFbjGefE1BSY/W/aSm5Yo/sjIPUviUDDiZp/asIBbjShCppMmZ +InBmC82jsj38ItifzgnfG5/k/DlCwBHj8xcx8APZb4IjTELBF3nnL19PN2t5 +FZ+5s9SUUffuMGCkWq2fBd7bBMAQA7uCV3mZc7L+iQxl260nXRHxhCx37OXC +lRKuB77FbaCmIhgHIaCle8poN3c6oeYM+VRw2kxUhM6kOZ6xChRlGUzxRj1T +XHABArSI3EuKJ4fSehRrONItdIIznje3vrQNlEPHhEgRNi8qQULMUztL8iVq +mPV2PbaLH57ubuxS94OiYyQgRl5f/xk61tTs2sIACWTr3nWMaCqePh1JV8fV +gmo5jsi3/QhUbMvy34aMEUo65ZVDxwdAbviOt150pUjIS3WVMDVaLbrJD9uO +fbmmHNBf8LiBdD+xnWCcyZcMk+gy/VI10dhB8GQFJp+RdmQpPekP9ci3cfl0 +4ma+22khv/uCt46Muw+U9/9Zhc+5psUg4edNaaIa/LqaSfldg8YGupn3bK3a +gB2hwtD0mTx7buhyH7YE48NSwn9YcZ87spShfVOJhbd8lj1xGMkTqqzOyrrg +7bMpRj/l8Keoe2cxu1OwEveQqI1YzIbnDYutcCj4HAFbmE90VqfzCsXars9D +Yrwsgo9zPkFFr/NINpLd0jcz4Ta4kGSDhQQPytd3ZhEu3nB2WdoiHBge0y/f +HIH9DqF6deikVXEnxHFkg/4aJ4hRwybwMnqSRNzMO5YXvqpdECtwVZmS2DMn +RsM9nt4qPlrJRp2fDD/1Xf5wiaCelqUBLT1e6wA52DQiFBheWGekCxa7A91W +XlKjfP94ID0vjYAj4PXsUBlUvFa+SR61Ef+HKqJVB1CqXjHXqlNFNVpfoJkR +0czNVK1srPcy4Cw5W7CMQA+Zz+32VgwBQiNAEA9oSf6JHQ6WiV9Bykw+BnGb ++T6lOf7ThBlK4MpUxlkwp7XCszbmP48cIj4xneKdxcGZuxF6ocGBza9Mqk3R +mir23HoQp+TU0LwiuLxYwtkMw65DX8ndTtpUT3Hp7Iltw3NeKnCitAZTM57w +SxmneuBpPAGQcpKzWurCHFvKQuBzAwWf33Phc5uBb0V5hnBsVm3xOJV7ZOHw +21QQZUwviajH++wXcJJsOcEGNPpEjPEsHPInqtGJuzmDYL9prMQiupwQofYA +rcMsxSECrQZ0mJi1qh3pUzySEqG6pdR6zoZs1PkuUm6IbkKzMoPyXbVdGu3l +GJ5QNWel7TRatoltJxv1kNme7D0umjw/fG88UQLtLLeM2toeRkmmmd4xibxh +fVkKLCsJQCjFfi+cHB3SMK1mOW1x31c/ZNgQKixyplb6cMTmZ7BaIcwrjgBU +JTM86rPwisGzO4Lh/GRTnb5L/5Ni1viIlZsiPqwT4guGPPRG9mvqGHLR6YIR +KzmRim7tzaRsT82zzxL3UW+KFx8N18WRSv4x/SJIX8dqW+Fy3m4l/Llaiq5J +2DtP8RKSFn4++HDIYjzveQEKAN1MjuUBGrOVv8EPQTNMXLHfdUIIhoNBW0ci +EZuDNhnbYHRGV4Z1o1UbZz8Vht4UEPgAwYIAeN5wwsxC+1BQEBwNIbFAFKrd +cRRLqFikzopSvExtmCtLvrh5oKdClcechSkL+rz8XpcNahB+5tdF3yY0Jd6q +frsqkn9YSB5yov350urvZdK4ZsE6+YsRlYGR/TXObMsCB4a8+r/mBcdxiaDm +aciJvwIklLGPn6PWW/HcJbu8PKJuKzPI2NpTKRayq8EE7zmKky2+N18c2r+e +zbj3/dEfpQ5vD9DhhV3U/ZP1+dsdUNEeuJhrOc48Msp65otc+q+AJ25Hwh7A +4TqxBAAo6VDXnQXJRlM/OjRkW1YqAjKyN80dBqUx7v+5Yj0wpb98VUdqX8pK +05VfMCfUTE3rhZguht59NQR8uH+95g88AtWIiHEPQmcFM1RckzUStyfG+BAW +SDljcqjI1khiuqsAzF4dNxe45abRl0xVuwsBwgsPDeE5iJqGX7zeJMgkCxTU +8YLEJ5ZAV4gBNjRdd48AYLMWnD/gHpLQPDwH1cg9351Zs9jXv2sH6rtCfqMG +Oi90Xh509VhikAzDV3RwDR+f+EgGk+1KuikhqwrHT4RWYc0EDibbIH1dT0Aw +FRmErMC13O/v/L6y2CKZn7g6NuHKez3SKls4rL6jbAepfDwYYV8z4xBVduoD +8gCp0L3E10J7m2lgROCHNtqkPkVfTZqeVlPST6VtVk4dnLXwo/aSWgQnT1Ml +OZfZXh9rGErXqhqCmgfMfkL1cR55zdCm8jBQxFex4sujPFF7DsJ/3wgV9Ahy +FdK1H0Na+M8fIzXudE2pwhjnh+BWRtT7FjkPdDVzJ0RJjqda+3eW48TEBC07 +xCEia+v4Mb/O3wqpQfzygXt0aCxlzZfKStenISbZn4isSXpI7YrREwWCKIpT +wnKhOFOuKQ0AufypWIRHBuI4bfr7Z2+s1SbfJ+26tHX89NjtMy/VjtikAA3T +IKgL0Iz6KB8JOJjy6B/4oInsmdkO5d3SUjzo8ZjIj7eFbJxUWxwxT+Fd4lwd +7VNBU+Fjv/CURRefXXbcbuwhSGwy4zybZj5esychuDAAryPIVAepUSacq/Y9 +CFOLyaSrB2G0WGqUpVsiiIh3C8BLJhnsjNHd5ErSCAhGJrOAiuRIIs+DXidD +2qH/H3wFA/rAgGgGACWOBIfiHG4YsM2hFS1758zZU8GE+EhNEJTjbawY0R2d +JF+nL4oJDqTXO9YWIcLZ4eNcWVIhqlWGMb7eBpfWnwYvem/hTne/mTE33wvS +rS80naEel5r2C3Gyej6P0d7hOHXJlENfLSXQjyTMyk3QUTJ5CbQgszUhSOu4 +kcsYX0J/kl0GckrMpdo7mlq8F3OtxRiydXBdPCT/xQM+ReXpOZw1Fh0xsfqN +5mRBLeUEM1bhO3r6qn71FXsXoEm3BrEYF8g8jAj6DdSFloDno0Y6LZERrAlj +2NT8Xpz4Sx6DygR1T32aJPRmL5dXT/zazn/Wrz+5vd/75q7a/jfZtg/EI0vU +o9MFqGoSHm9GgAPgeDM25a7hQFAI8XMaIACsKKXMRRWL/HSlK4UtchE5bVf3 +hwiELT4YxYfLk5Fwp3F4y45cKwrbT2PdrkQ+dCtTBGdNuWzEg7E8QGVJaF6b +FnXLYn8TqBAdsRwdyceI+qcEacBh1I1jpaCo1cuSSp3rlS/KnhJhK595uFaJ +kCgn9g/+wvimP6CJOE1fxxTUKOYw7D0JRfxSHOmgQ1DMfRS8FybUzvrKN1Es +59Z9rQdltH1wwvtlN8p/L8QlXWkSxljn41QENQAJZR23kWaspoGbZEb740Vz +4zdv7eTUaJE4K9d9mm7q0UObO6abscgfgf+sUVDwnIOkpSq7RXbR3wqu2pGI +wnogKdGCfFjmsv4boL7enLBk3OKXrUVpIudoCd4DaSpqJ0UgEbWf5z6s6Ucq +6iTLu8FuQqgREF1y6hE0wfn9j9h9+KXSbXddkMWj9QG5f9gFQRjFXYtnWbst +N58RczupqeMotAZ7ztodLEJPa1rrZeD/DJuKEYnKDjVGR81T+bunrPRgTWRf +hAOTjYU/bDs9/XNQQrJqEAOCM/A0HHYIkJM3AP3qPvS3VGKsQRGq5ue7Q/EJ +OvGV6pNBUvhQWDypanf5GwrFRxrUY2RYVYZsqtzB8N7xxDBHB1bA6gRocawq +HYjJK5vGDFS4jU7HuQEglG3CCM41/iF9g2cu1sTn8zs3dOL+M7Tqi9uJFqC+ +R1BD8pxFl50OE6WAveLodTw9plUIEMhJcDTKWIhkZotKrkuGhMLhrJFBLb7A +LGlR7PIRECR2PSYXPxWxKMQLIH6hpWgvvflJlioei7gfDlYjzTp9XhO7v487 +QaJvKFqmfKhUbUfY2H9x7sHq00lEKrZJjasIerD1LKra9RVWUxEOkK/Ig1q7 +ZRYzc3mE2wkRJRVlF3SpOs1CxXcRj0LgyGGv154ggRK6p+EYgFGhb3+Z+zcu +v/thMkmWu+2aq9v4/GwbTGJ7Hl/LI2Ic+IS4ULKURIwtPwI/WDeS0fVpRn0S +qPzs+iRXiH+w/mLjUvGok5g3aXJJQIqg14qkgZMTspanIOcPSh5WgbR5wVtV +7YVm7En9ecfyYvg/hrXVoBPPi98I4e5Huen5sydr9WAYH/XF/Bg+ls5hHpyb +QMQKcPtUYzbyi1vv9YwybPhqpV4ag7rJziuDf5/LIkieZZ6bvp4EfLuGyaPA +KmQNqdS6F9XyrghAqYa98e9M9PMVlt5gl+mXB2OmJm3L08knwZ8L+G7haYOv +alXj3klyU920rRXnJ6r2OxWEw8R6A0FORuN/uH0VoAOawDuhyx/QtMOic4wv +oSvZzCo0rwdKol/G8DjTlV6StPghJaUmazgIjQSGuoRtO+MSmJfKGwGrWngA +AQqDBf1ChOL6YHcLLFZZW2KIgqQiZ9OfDcfNtgbEySooHqX9BLRWhLuHqxBT +ThBj7UGFeyvhIOT4Xb+02K9pnsGG2lD8b6raIPJoT+LMTfFVMhG3BAHwPSBx +aKFKz2eDlMPA+Zc3mupZlcTcR/c5h0fgo7YAqHoi3Z/VcHylyFV2jylBRGWA +WCGswcnolEUnx0s0fDfjfTMz9NdHPmSbTVlod0jB6mBlvmJjQD8ZjCWfnVLg +0HY79680ZbD92U+09Rkd8aH/gChG/ix4rn+vov78TkEoRKE52AQ/GaM13REt +LbHdT943xwifqHk096ttfnB25lky3iBj8jCq3iXY4QKABNZp93P6IVi0iz+J +ipS8QTjeJuEuaIM1/b4prlIT+rqmjZukhX2gAw3vPmxbTZfCv30D8RgPBhLT +bOlhyxqdWk5MJo1eyLXF/ejWz2hh+b5QVNDurDVB3NKW9fWckRM/yfEVX7J3 +MQBfQ4nIgF3/XS60B7mPAa1FPzoev7NclDhHtwABZrumfpyc7b0ehw+Kulmm +Sxl6hYgOO2Rkm0slHalOHBjLduK7hvgVzzRlDIvTzKJfQMwklddLWKg6zIQz +MsMSDWX7xU4MsyBfM5FOiVBh2Br2+YcxGGqtxQqUouTQcYLxipslkE8Xog90 +rvjUIHjTL3v822JMm8eNJVFpygrOwSL5DMtzyCPl0ICKIPIq/1gdymuoZm6U +RHoMMomSnxGDjs++MUVLrKL6xHCxV4qei2p6ffJ8X1khxuJhKuOs0kOo3p4V +u6C6oBARv2N7J7tngZNReY0x1gJboERlK91vC0b8MeOYrfnaBXP56IdqF2iK +wN3HQtAUJF8qwhPdNikqXPby/JoCvkW+uPrjXVgv+EiG8WkaCcEkObZAS/0B +oX3aew+Wmrn433I5mFLaoWISgz4Kzp52U66IRXUCa/BnoSGvODJVEf2BmNIy +RYmKyVN0SsIY2kOm7+/xXReyiHc1fLwGc0bW7Abkqo/692v0SWUryKZRX3gv +VR9Zq/5USPhT3bIO2VPeDq004BHW9jYBbQfTx4k4uWA0Iy2Nctl+mDuVEmkk +OqMOpVV491EZBco3G4MnCaq9WnNfPt2ZRnpopeHhA35hOkZO261Zx6Chhm08 +HvXYd3XPhmRwkhHu5I8ZWGTwOtSnYV4q+x9cSQxbm6nLC4D9I5iLmNrK5Okg +P5H2NQG8aLmYp8mQLGP4mbLIdKKryLyMrJsoVdCq1MKSn7VQT3dVXMZGRoDG +66obnew6uGbn+ncCYHhX74HxUmJD5bV5Qj4GvPbiGU5ogQIUq+LsVrEMLMzk +wGvZRZZ426LwAuEuHlDyz7q+wylfOmGrUBpD25+f9pHaBIn/RthLLDyRI08E +ZBE/SmEy4tdajlwoH8PWtCXkH/ZB5UegAIXza3+RoirNchVBITPXh5shsuy+ +XXhSJdMUftNMJ1DCznLPe+vacxGkL6Sl/a/3dRtU9aoHwpmKOglgTXgzdbAE +ur/ou/1bK7zG0d14oywvTNAAAAsgacDAO8dY2Dwn9Zo6bmKqM5ouNMFRCuf2 +D9hluCULrzgWOzJAeVccYu/+Y0xfjRLI3fvKVOCTGq/XzszNFcNBY8zydk9K +PouZIZxSY6cTf2Rm3hADEL0LkN8ZbaxKL/iteeagVT+9KoQWYDWq6sOn5xoD +H0vab7NSMG0UwPjvpO4ZSPK8IYcmTi2grAId5CwcweeqHhm83tpAdabZhryI +T9Yb4iQCqIOQZTtC0cEhMe6T2H2gOAcmPfyBILaPIx1VbLOOiMLY05SgyoX9 +Ab5bQJKIXD0pkygzej884a7vEcILj3nclRPaOHRxWm+mcZr2vfXxr3AiCeeH +CHJLelJBP9qKeao+KQDXzKSHZYxBbOx6FilUm00IrWY65puDvfOVP45a53Pa +kWTR4oid8a5uizlhCOAUudqRk23dTFZU6EEUvZcG1cMjY8bv7bI1sv+IQWEh +kJRU9XHV/W5BDy07q5DB7+pHwS9J14z+0CBZYPFMHGA1CdzOOegDV1/rAccX +5zBOOl74qpFkr2BVOyI5bdYWOiZohVTWmsXO23vJYxp1bvirpWgABPnnPMuy +4y5U8goTZfZwaX6+psCs4Q1Z+Qxazr73ZjwsryiWWgEudTVvolNHXSy5vkbH +IU8uqIs1xAoJSgNZDfMFnQ3u8LZTFdp91UpqNgd+7TUNLXZRIrlRVVgBRwSZ +wqoMxAjbKi616GDqaZ0MfFAZj5jUURFU47Fq36sai4Wzn9BVuhevEGzUfwb1 +L61xrhWKCLTEe3re8LsLcJ2LXTHP4WZag5goH8efO76IsU//1KF35YWDfyEk +V/bzRagNk9X7moA63o1pRlSRWptDqm72NWuelqmrc1YkTSFqjlOH7h8rhvDY +y0kD57lFRA66rYSeLXEQcxiQFcnTvAyYOFKM8f+jqRiDyv0jHQx8Q4JnEehk +8Bzglg2HpCRPNShNoa1jbbs6H2EZiM/SpMcvM5yUxN37bh6eQdDNoU53os3Z +/xkn3ipxWve5eflV3vXzIKwFOdSi+iJbJ8vCkbqWwqZpEfxAA2+ocHJfdXul +ajEvHVk3tcV2B6jkA5nhunn22cHE6sCVu3pGv55oUuoyW6TT6gjQafWYp66d +LadNIJGFCabWVXgAgB8TPdOdQ70aRh2c835lQuRqYvoj7FQ/dWHnJPjKjtLZ +QiiojhvIGVON4vysyaCu0v5EmCTiktdPxXQRshewtOWy3fCb/MLbPvEDumSk +ooYV0unZE54R5PwfWH7CJjWj/yrqSEBRxcRjRh5zbYW0Z1K6WF/A65MjCAVa +yNqIcbPlulDvaMsF4JpMyD1WQVHoMo75wUrcOWPyBGSqiGSuATkPH7cyXCv5 +rBqj+5b5FPUop37Vl9+b61eHdPlef8j12Om1jpSUCRtuJ950R1sl6ii5I9EU +vRv2xUEhUiNvWT4riBBJr3Bz8BilX4wkR/Euq7YoWtZeQ+J+FAgzEaCZMkSg +c7KHphRtbLJJRDCvfJMzeyLILpNdv9rMye+oPeZID3muIWd4OvQLpzVE1cQh +xHC4jlx5rl4HEdNYRbcFeSrJygwn9tRKwDUB/d60HVvBbqsxBLPOfNBQo9XO +50rRW3n/cG6p6tXAVXKlWtORZp0CVMSNQ+D+Xds/zRFR93MOhaa7RoE2VJjg +lCmeq4HZrfT00qU42wlNrWIJAXn0kASoaljf94CubfkHXIIyKJtDyrzZle+X +NlZLj3hVi7FEKpCTGRtMBNKQziy1yhYnyhFYbqvfzX74FN+BDFWEeoD1oL4c +yjwEKByXSF16yxRPGQsRdDCY9fqNyloV0pANZISL14wCGhv3tHkwIAUmiqhG +/+hdRjClU6QZA80yTBQh7M05ScuUji91I2RtCtYqstvBTUncFi1qV4oZ2f7L ++sNJrV+MRMsUZnOxTYwqxNbKhtEax6w2Me5xz44ptkJOtIZnlU5UnVa9bU4G +NRk80Cz9/wFQdYmNYa9ZSIYTcdfMAX8UGeEKVic/qkgaSCC6uZ+s0m1TCdcg +whDZnAosxqA4lZKSVoqkHlPm2k20vpLwq6wGfnx5lP4ILA4sjUTjET5TRls2 +GSAvDR+9ZvH19vkRjcalTvpDEeioiVAv1TWtcEunhRyLrsVJECWbenmOKa2V +W3uOA5BriEYr3NZqrUvZ68lWzZtAzJQ1dhhEJad6gZJ49gPkVS3alKkTY9JR +vuPdeCGnjq6zzHwhHKa8f3oEJ9XkSbxeg87o+pOIRDjWLD3VUamF3hw1KJYL +NgRbcmvkVnwgieiiFZOVBbB4BR8kZq2NpHtaZVyKGRja2gg2WJKPPHqe9tXx +x7xV3aa7hPo9e4XQr/Ocixe82qP/dCP65Gvpk3lg45xGg7U+549Ehqo0vhm6 +igdwQuWrpnXsw4yct7q955dyKn7yUoDtmwj1BcLlDh+hd4pXHWXEPoK6eoJE +zq+SWhv4Juq4ohLubZlkHYs83YyJPiqceb99F0+4svsnCI+84QqTaoDLbk50 +Xl4XRwEwMbRLL6YmRIssRQZI4bVoLX47ESxCrtv/24w3dbK+yKfqplj38UHR +zgXERTyPEI6WJ2EgcWfl/4l4AA8EknWhdebinOFZ4uzsQ4RlqPYPJdTwNhL+ +FYZCu+iO/k0bHK2ItW+s1cBH1yAZkc2eSHGZRpZhRnGpscbDAc/WvMvxy7qv +C8srm29LMIK4H6r7p5xArMj86U5cuaZLCpfJjh8VU2RMTxEgaxWaQHFCsNiU +JF3abrpx7+9dkcFCeXy17zhxxMd7NwJvcGM60RmmlnP2HgU5TDo4dJNpanv8 +TnXJILSUlwb2Ye5o0F3cGP7O0pPdkRT9ZYkLPeFh9nv+0FcnGPhaJQU3OxkG +NhmsTHuv00tKCFMFQcezMvBuSViz62pB0bN3QTnyCw0JhxkBjUqS8PX9V26j +aeHwzT91tmZ/3LZlTY4mIsbJ0nmv4z3LLTbr/xEWs/wwcqMxkMlnDCoRdoTJ +a1niMOYzuFPHw8Nn2zZPUrG8SidUp3nCsaRaVGTzkFBKFAiSq6UsXNlo2vPt +/MG+R1+p4LtorM5cI21nP6GkxA5UPWxhvobfxXzn5FpereisUpMnKHr1yR3z +nA6XWdKQq9F1EdLtu8nr8xzXasmatlUngSJcl0S+RYyLdiTLRkere/E9HuzP +H6dGv+JXEXwiyM373Ice05Gudffvp5Q5e2r2sMEaoID34Txvcz9/O2uZh8sk +BUxzzQZEodu7m6ENa+2fi47SXJlyd1CMtJ0oOJlkOlMBf1YV2WKm6qbv+7+8 +ZvurVSv/k6+9MpF0AuUXr8bmj3TWUgBkBiUFSB6DzDG+PyKhWAkDbc3jJfvP +rIm07iOl42a4D6wXq9LSkczpJ0MvcY3zSYyCcN9jICpEk8R0bxyJ7lE50uui +Q7QYddWPXrE2UF9WnAWjomojNz45iCqREc1wT7LNKjHSyuD0lD9Rv3mejCxe +wJ6qypedLLp53c9hB1sp0bivgRfAsXSdOCjxkDEK6TtNIXM3Cnny1uDh2zk5 +5YQvutWOrjkgwJ5uZuJjnq4qsEmpR58idX6aWLeQzMpBaCPYddw/Yfs3+0o3 +/51mXpJFHCSFzLADNB2hhv4/QVdcYAFFDOCoLN8ueL98oq6jG4kf8AICFPCX +cbETI0LB21iU74WkxDTtY6U5N/CSNrcW7o576mQTbF0dbcU0nRSLewrNuA+n +EzkupYLHAHk3yYdb0r3UO+ZoNHr6BTY/hb0tKc7RR+R21tZHdcaFUusyza8v +6lR/WFV7a8zS3dPA3qL7wJqRrC9qvX3NfV03iXUc8WkZrhpcZfBhfXbpKcb1 +Quy2d2UF+UaHZaBwb6kv1BtYkwMkSJY+hRr7zVkOiFUXpTAaVDwKqgOkkz1z +NlwG1gNlweIFQxN+cXRO9GoM7PWOC+D/Rfyfh1pm7Xw/Badzxah6vbXQY6SW +fzLOXX+rZbGnzSDs6/E7TtlD7fXF1QeIf/YL4jehA6xQ27GqrfrRfXaVk755 +IpT+6mrd3oCdnwJbi8xE4pmLaNkZW0pquQbSOGy1X/QRo8merxfykRquY3ym +kK2+FJUp7GcFOjnpr6XSjp1hxJN/tm1c3K8RleOCiJRJNsuvoEydh6h2bSZq +RFITPLNsJSQIEu0DAzG5GfvCv+JyGr4pZ+5XRM4tjmBPjsbFRLhUZpGGLB98 +tEI21uELw5/K9TYSr/w5QC2WtuTDW5iDXIqA+uJTyxWhNQr89exhOmTsT1db +tFyosH0RQ1R2BB0BpJLgh1c0f4E5YUcqZ7jktx7GiO3WuKnN3RdJho9EE0Rk +/UnAgwZL/v3SkFgtAGACVt6iUZehzkmB2XHb8rsoHWYzUdVCfoFVCx6GgBdN +ZdxLrCEbS4CXFW0Oh9nCIKbmoF1YBjPb1Gga+SnQKJOf1tZvbkcqY2QcyV99 +PNONNlFB6kqGgrXJRASosG1ivXJwZW/fMS9iFV8w7dHQVaANzQVhoyfyy2LM +kYZLqXZqGL+UUwreNTNGdyYBD07aS7m35pJmkH+YhFuVPhqxFHckkUGNoE8w +ao8PExEYaxE/ryr/Ahn30szCfozP7Eu4aqPrAIkGTzaBRWI5VxrMFRVeZZzv +W1i5sGjG9lIdL7MtivlZ1XdRdJDtXLAb/4vIE1JLs5M8/3ZDlPANtG9ovlhQ +WerQ31U0WvI8SiL/PF/RkpwIHKxeU7LgOx3BoOYD5+GlhtEKYU2dEkRVkShc +dV3Est5KyOSoRVXDuLH3/fnNPY8t8Z3Nn5PzsUy6U5NF7ZJT+ofefCXFNtdl +7FJV0LvBwB7pty6bKSsVKO5jSCAu2bY0gs9Swr5kbq6NZ+wTg0Bos8Z8QHiE +uwDe5b/QTIOp8gR/8kndJZtE40jiX+Nh58N/rZqQ79UB/H8ZZ8UJq6PyxRaQ +8glwlSxXXb3dS1T9PuaMTpVC4RMSUF8k2RW8LfPJRx/FkUqlbtPw/Qm65oJp +6xsPPVeyN5oIMdukdLogXOP5DRVL4XiUzni/LSgG8llp1X4lqMW2nu/wo51k +ZLvTd1/FxVPM2L8zNfGbVe2omoqnc+Z8Sj9p9Rlcq9WEzvdOkRfh3btlDm6p +KCXXRvCV3XrjCDDiW8a4QH09n3LYQfL2iDlIue7Q9/WjsjGuwUXbJUHEfuiS +a8ZegYHawBzf8+2TmleJtmGfharBxqmCSZPZfW82BYVqGQNh6I1jka9eRAxg +1IlDjzedcn4LV7d0TRNCSHdVrglQ/OLfx6B1TETg32f1vVqlpJVGvEk2PCZe +obClnEgFSjlAmwdN99YFhPn7AJhR2vFyhi8+o9/qP5IrEkqBOyQ+7dFei2Pe +xjpH8yFA3R97TFiI0tPIPj7iMObPlY+STX1ULK4xoMPx1KOTewFV2m6NVe8n +pSems+gmdUyTuJfbJlwAzP/84XCXy7pTyF3RyOlVtChlftTc2zJiT9eeDj5g +b0iGF237FtOBhden8LpxtcjTXl3x68LmfC8dXjhlZm659luHY/zFx2ja9usq +OQknSLOSGVIla8A5p1pH/Fi1qW261WI9iJI9L1u59J8O41XxtajjA7ADhAN+ +guCDaLiZviP0ghPygpvbN2KNB5vE8+2fkbENURe/ECd5k097fY3nRmHlD0Tj +nwdZW1SRGHk5sHtl3M7bPbVRTE4WEJWsgwhuVlJ17oCFhRufXO1YYmWjtc79 +0BUJIFUTziLHlX60v8iJip8pgwk1VJHoD2oqpE5s6LhyGwbfmxUrJHqYQZpB +ObgKiX5xCZ22AOGpw6xoQ+GmfocU5aP6t7tpKTNVZpTsJhiHYlJDPUr01cID +1EMPHAfo5FAjrMa5IuF1H4L0BfoqVTwnGJ971YjUXWdez4VO7DGSTVVe71b9 +J7bqI0gmINgWFogCe9DLqkSPDbp00lI/yD9+jzJz0ebH9mhXu3kRxcLQw+Tl +VGJju6kTxj1vEms9d0n251oFm8r/b7ksp2oq3tNBrQ+E16qqlMoPkynHY63N +bXUW0ZeP3wNPea8z6qPUooEs2FrhLqqc+lqhhV6IOSnsNJEAyYOCuNpzGuFU +aMZtLlwfDJ9vdUqPxYXGeuEUvNizzNmCFOV9dzfFEBqby1Bx4oULv2Lp8yxf +9TddHvfIQjJLTGYoBF52+H9UoOyPanJRO2NxwwpuI3daav3+xhFwucNw7BXs +6+pd3o00AjcmjTSUM3JiHp8qY7XWbufCD9IGoOb04N/W5REUoY/Aadk70TOq +qPZPqDsDgZ0w2AAP8LT43sIdJlSx6N+z61zrUGs2cw5+KoIdrHNsZlErhFqx +mwIRj/cjJoMvY7ZEilVbD44+LYmlsvMh9LAokYbpiVZq72rgkmxEQ4eS2rYe +SP3MDfZiwKWk61oKn5tVgsIe0PcT7pluRp6fG7FBCGebJwnDIXlYpZg9gF4/ +4pbxW0aEilxC3oqXMl/RngIg8P1N1obLz1lydo8OXmfB23pkAYCzeu5Q49lw +Ld6EbHoN1jSzuvuNvOAUtfpO2cMA+tpXrfdkumqy+KcdLZ8Q+trj0ekqRLdC +sYJkuoPatOsd0jphds3beCG/syQZNfSinR0RCbZ7JljhKOw4/nHhyvngmXFE +LkcKodZ5MkkbZ6qxvvbYoU9/yIycfjlkZaGDM6oWqwNaI/8/eMyUneE614F9 +y5x13qTkbo9iRQpJk9mWF20X60Xa+vlFJhjXr5Cf13noxmF3H4CfkRaNEo9I +yA2p2hH20EuiPOfVXRt2Y0J+CdY4MbS0SMi8NYNlufOyFk/jTilWaWJ/1dTM +YIJTgofou793Xig+7Xu/G06TMuuOjg+s3DvktPrwqf6ilt7aj/GBosXlQoxn +EY5zRtdBnOHgmr78vlOsCxTWLyWBxkGTNyMFc3fAAnjfi3W9jz9A8XWr+S5U +AwBkKw9ToQsLRRdRb+X8Nwe0Ohq78u2IQickeiqa+y/Zyb+ScQGUNSzKOVQO +t+e3X/L6WRwMDb2zL+TBEcaohlSUOm8GU2nPO/6aEFBUMTjSF1o5eiGno/Ox +WDXBk1Tr0aDIiIbiGXH1+EHQwkElMAOBgn3WY+BNUotWo2gLG40PhulOscMR +PTh4D5OFVs7qc0wdGpZI18Jo4fQwYK956ihuEC9XRdfmDgQB0By/yBuJJ67o +TtCMnrZZE7hO42JovOGh/3BPRM84qpcK0mLeY0HjTWcjd0gwldkf8Y6mROhd +Lg1PxVTGSLlf2bKk/due2kdBBOvPpVXvF3lO8XlvVPPWfYEFtCJlSBW9QQRj +OUIFRsUzOc6hWlq0nx2dwguzXvKhjjiTo//mB6YmqnmW5EBAKI5MPuhaCsQ2 +6EGhObHX1YjXWMW9zk+G38fjaA3Z0qOll2xIs81W7kqT1+p3+WZfo3Zrd/MQ +4owGAgQG+DBAGIMHJaSooe4CD5CmjVoHmLT8wuT2GW4cJkzlerXBLgcIp6Z9 ++I0GXNPmjro+Iq9EF2nxgwP1Dhos5/j3DCqq3RarCVUwmEiqBtIc7BHmcP50 +FMPCFlhEzY5ypwJq3gdvlcxOjRfYnBRG7m5GjfeIG+YltJ40wRWIA7MD0P/e +/tPSJC2rOSe+nZEvKhEd9lFFL92CDntsAXedM05RzSGqrJULp/eB9yfZdSdR +yHSNVAf5RCJviWyXsq6lrYKjmGNB4Lfh7qQqUtg1pSVZR+aXb4sqOejff5P2 +wLoXo1I0tI7t3LUw39oeiHtYXU2QOr+36ao2aghMpX5BxtNoezRsSPsD+Zc+ +JcHlOUQlttH0pi+NWXvdQRMbkpvicNEGwCplQ86p1CD8Oq6YEnT/S1O9xbMm +6MLn9K6quWqylN8xrsv+HcFfwLHY2yl4cSD4pEu2VungTMbIC11S9aER3O2h +ZGuwfZxT+AzQAEShN5JN/baLVWZNqsFitykpnrrG48Om+H5fQpX7QyZucifp +eyGZtk4CNXVLdKm0+Zoz3hz+mN4s8QoF1lQrdlq0ihgRU5yx/rY8OsrCXUAY +xmojjRHo4eNy63bxjBVVW9gVmXZb5UlIE2W8s7Qj8PGKAOKL6VuwaLKO4p4x +ElO7pEO8S50MQllGgCNvhyO+s/1yh6D5YI7GJOdKY1ByX9lDLqjh3APOhP1E +sKu89rq5eWgxWF5zZUpJeoecSog+MBkjajb1p0xXlA6ozzKJ9Y3SuBJm7+sw +geyhWo9R0Fpz7bANrGzVbucWR7WcRROPY/QYyNr8SDbmxW6bpql2YjHXJg9S +BXb5vChnzPUOJAMNtwtOGBZOjaKx7HxhhJNW6dP52xxn3B3Sd453OFcx5aHt +WFrOqh0NW5icoVt5cVkDa+AgQ9ZlSn1nyPfnz0Rfekb53MTwHZx4xQi1uL2c +g5EkZa5DRpoLlZumnud/JjzOV+jDwadjmvG0rSahr2i2v85ZC3+SedShVhIm +4zEB4Yrke7VUQa8brnNrxbPWhzkBX6iTP9Y5Pk0ZTXXf0Dod7OBV86eE6pF4 +oLuwVzsKjk3oJgf36YrCYXENS3jG4qAlLOz1jnJUUN4beapMzuSFwBP8MRLB +ED+qjq+Dh/1WjrKP76y3K5trGIWysk+wEZ9EUmOeH16bWo0RYpkqRbcLVqVo +5FgKs1Sh8vdF2qY+3CVYs2NHuGzASLRsp2NjpkkTObC8i12Ch4sJJdt+37q1 +jAQiy+6i3t/LlndrCRtwY/rA2EAN0Ui9IKlacAJCo4o7v4qlFmYRGkv1U3sY +Y9fDAB/rhjy85rbIUfxZYJbVgl8av25JH0G/RsVhxB6FbfKXIDoMcsGLVhCr +C5nl65DALmX2Tn3/1BFqtMSusYd3fl8XkuwdkPZGHtYaFGxttqdVkAQX0tjx +7a8tKd8W/Xtm99rvoXHumWaSTKnfd9udIZn/pjLK7xanjm6E0SHYEbEpNw56 +meZNRym/4swYw6VEeEZ18y+a9SCDKEQ5x/+nmhRLIuj4LCyQ41zkKObYeOEq +FQqesgR/zxA6C8Dm+2Cdoq3jkmQgdexQRqPB6TP2H/k+FSF9bcwPPVmrNzjj +2KyPsfxhiA83v6+D56/8uwT8BA1BMfJ+LSJ2rG1YRdwE8HkucG5CxQHr7k+d +BJBAul5+e2/66H30an9MmNmKRPaXqCh9C+jm1jfZTe9lIy0iY6osvRuQOFlO +/xQPpxXUScINbacAzqBJBFuBHLY342FtmnEpahsX6QKiTjB10NC1310FFfZZ +EpbYWLsecyZi8Ll6bCG6waeTCdXm9b/zoE3l+6y1Ei0JcQwrWgCD4i1cmnnA +cLBzKZGkFnEfhQYH3v5kHgI4x926PAC37y4JCYG7Jc5ZqHxxKWZHrLWKmjfx +kXfTGWjFIsU/Pl/enLgLNpYOAoDSPcQ7uDx/U2fzX/ql7dCMqVoWCtSjw2Ot +9SWrJURnGCNXSUw68bXTW8sbMXY31ixbd5ks9emUmvFEn+WcVPhKTnN6zRsc +bbpICxc8iUtxXJuiymyiCCLRvpsojscmWBZtlpOY40KlmTQ3Pcqm+IIaGgtU +Ti2psg1v3B8rzxo9vSZ+M9q0SAtn2ug/eAy27DcS1GTuwen/cgSDakj7eRvU +lvy+SIgHHw9uvwPxOamqHilG/UnTy+RPi9E6VGQA7Q9hu7Zpm2G1BpRmGpFO +CYXDZqqqGmSx4s9rd2rrxXyYBLKFKpkEvxGV5GvEcoTND5QcY75YY5pj3uhR +YfSPmcdJJc1z/xZ+G/UNomdeR0ixVdXtFONkCWnGufsWbfq6AO3acGba0u18 +dpVGvAb6I/dxnoTWjkpGSpLA+Ce0zVzIidkVy1gvmGR233yDpoYUbYyZb8eR +1FnjL25Bqql/FSI5sg3A+5KRonN7VNBh9CPCaWJvHNOGMkRdhKyyATbOUSlC +mI13IN2fhn4teDl8aYr9xTuxvpxYc8jSOHh/gVHHfa6VETqYH1s4lDFT44G3 +MbnYZ9+0wB2dlKJD50fkk6/0uVIWcEYjEmttEMKsthqKJ03NStolwxW4m7fv +92FaFK9SBNwfeM3Hx5KVwfm9uvXkEIVrnEbwHvJPNWuvO5XbMr0GUDqWw83s +S5kuC4N25YQeBAObMGLkBCx8KfWk5XGN6vwpU9HKUGxoendZsFvCDVYTSD4B +o/g823QEoTshiDs/V7u0e4t4kZ8k/Pj2E6iLgDX6mDvSX8sC8FFMSG29vguV +nirZxLldeA+Ii5s/LaJsHc+yvpgCRZ3GG56OCdyhOnst3663L54khcHwjKK9 +reOQadDYdc3c3h5Wl08hFdOGqzxBbSDBVS70z74jsjd6IiTuGIVZi2tIoaw5 +hmQMDW/4ARVAHgAsimJ5q9o2ZS+2Zzo/UkhRwxACfmF0wrCRvwkuJTFqFmHB +2p5PuF7Q0/o/389sKEYsH4rI+AuY1KlIUtNbk7SCoOteGfz+0j5d/jFLPypq +1bKDsyYTqLido12WQX+vWFSeKynd2+ZFjG+ho0OnFfMidA+dYbieUxuNlKWv +dZBOWf0OSru6pe0HgSdAl8Nv0VMa79Xsj0NNTTmyoHvzPlZr/3PorDmThQil +1adiDeAbgIt70UkUy+yyG9shNiOae9usaCXYCuAJ6HJl9mleKtBlHbbloCsv +LLq7Mzzphgl7KFBG9XF9HpaJLJQQnWdj1poWdGfKKsNdJBM7/xVUKJXzm28V +Y3f+xx1crVAWYpm5VNDMP2d2V0foRVG/9Zw3G1PNZ56shxO7VZi6bu/R1GjQ +PBVgmAp5EvIy1M5JOSWuuq8f+gH+bn/Lh6beaKwiXqLpgpfM0Nqv+GDwtF80 +klpmFQzuirf2n/iXk/z445KsFCxOCiFJHTlEtKoCQdiH5CH5Ztnxyq4Fr9T7 +z9gGg4E+/duhv0KijkU4TWWU0g5oxz1WmvKrtNmduXjp2C09O+bMx6uPFhCk +BNZuvT8kOakq4trbePutBcB6CpxNZKsbULcrZ438AJ5Z72eSUebBEG9MeEn5 +foM5SxdOqsUjRoY2IkrE6pMt3/1siRIqHE/tYK7lfNqcPUcFpUcTB5H5vZgI +lWBoGIr9FBx3U76glYvqh+WrPZT+c/Eb9A3go9fAq7rmzU8c/NCPz+GGLGns +FjBpJVo931U9it35p/YkQ4z2EzOEAvEGAABZg86sNy7qYiceO1M4YD5XS8Lm ++EUpJ3LxkY5XS2W4kHlquv0PZ/yXO+jPyGhfqOjYWDU/ZWKmGuTE6q5EKes1 +jD08gmhGwcIopZkUyxP3P5zA0kkIwCHf8KDiOR9bm43NwapBuY5A71bc7EBC +zkiNkR4gxQ2+l0bOUmgn7rZFVFAc5En0C5v8HhlgRXDBMXdWp16I5Rwo6Jc/ +/izYX1dRvECJOl1UIVPjkpQSszUwvIyWYYg6W+5a3SsKx3VgBuabhTu3/Pqj +fsupgpPjX0ak5pnIeCzP6rbThdVvn0ALZaCJpQtJIMW/qCLVeZPLq2Xn8dyJ +ZETJu32KvMcDssX/eGgsCLmQjkqyBSmJdiG9kU6V7lNB++Em2948GUWLFVrw +jE++wTCeZbSbx23f1W8jjGLP34n6uH5cPvDNLcd+jKzoaFkw8KO8+ikjSzEJ +oHXnWJV0fxH7fSHabpsN6tQfdT6IXK7ltr+Sa15cEoaDoyx4r3+HGcJEdXZx +17zKC1xTLvJJXqtQmatVZ9SqHUcTELbOkLMpboRA3cO4dRz6KlM8SVcm8Jsd +LLAzW2IgR/fJFoQeHg4bforUNZDVf4KB9Ms5M0pJXm8XewlfK3J85PdPGUzF +fKeplFvoLaYeW7057mzZVi8S0ikSxxNf4RfPsw27VfzMd+tyAz/shZ2NWeWl +5Nc6QMukVsdv0cXDjO4l68fl/x6dXHxmJwrtEeud3ogqKrE5gluqLb3UEABo +6hBnETHaHbLgmgmKEVEbHYPw/BIGwA1lpMM9+RYqlmpE2wVXy4WUqNqfjxtG +QFSvEYlsHTbiJI1BFO3QtRVWHatbXiNzNaqAPkM0FQlZs3iV8O0l1b55DwJb +qGMRAy3FqcfsyEUVsACwbtU4CVYxh20Oxht4V0gR/LoJPnJbsiAai+99g2G6 +eFpbA8mle1ULdjysjvH9LKW9ETkfNdWAmXMzRPAAABNcdc6EB2r0BopNaWtf +ljtuxvj0Edjv8C1peHOOCAHMwyB99xL66la0qeGMT83NEZmz0Hzlfn+1f6ci +rEnvfPGZCFw4MRcK6mPdgP5L3FzUTY7xxIXlELPe7JTEj5k6eRbYCQzDaxnQ +knFLbbzG5p8S5DyzDiFLPIZOwZGFhaDlfz7bzwwNPETrrxNyDUX/1ZwmYmgL +SbCybd3ByA0txftXp7q2+jEh4ZeP61gOlR4xNJ7odu/S7qciwTKxToo9fG/7 +pfEmrzFr2XKsbKWGj9CzZrDa6V4fsaCNN6rOQ8U9kKh4rJhPDCMRE5u8OQXQ +Nu9EhDqpHu0GvTpyQHP75OfU2G/eAx8fn1XGzqNjZt7UMOqkLptWk+jkhusx +y6Y3H9W21/1KpxqP9aFN9bZNDkNchB3WPxVzjd7LHgsH/qmKIXGfRiQ1hK+X +b1du+SXGRI5pd8gHvkBRpeE56/vFfSDpuyOzCw1FWmFhVrypWqqIeRckyDOS +POhUDbyR/bl1+yIe5GwaLGGlrkOS9x/fKGuX2aUjW8QWurQD1qQiN5YK/DX7 +PQrkLyZbFFSZkiSBTxlIEi2yA6INTQWC5DKxPEmFr0Gdp7zy0u5ALpdt+aZJ +bLFBUOA2n89a6Ezq/rwY6LISvuND3hWSttpiKPWTcz0KdP0N7VA7Mdi/OnDA +bbORgsGLfA2Jw7sJ/Ab9fJ44850/4CmnDDmbr1L+GQHiN5Nb7oC0PDBRTX97 ++WiR3GOujATQ3oZxs/bp6dHg7ozXTcWUVCbMmIatF6u2iGMULUbIws7X4lMI +4uccYMEOK5mQ8eT7X8R9ArCBMI21TGj6RGm+MY90kUSN43yMuKrvO8VCtIei +eGc9cPu7Uw44lxGBopSwTNrgQ1shbc6BZMmgCmmqGdjT3VHWfRS94pPL9uHP +BSyd7GbbktAVtwCCVgoDqsDSKTrZX2173CbYTdMS9O7p0zxdCkCdngVAH1U1 +89tktAhxFjbVGPobaK+sduCx2b3+OSAcF644v13iYyAdeP+/NIXic4HHZAcn +JKp0wGl6UfaKwWUsLGLQykmVUPm7kz2jUSI0WBU/pS5djHPH7IyLVcER8Ag/ +xkVFNIyn7YWTSLI1DtE27is65yIg+zGt+In8wAfv1Vo/rxyeZLKYX/laWLt0 +nX4QcobIC/q6sKwZJ3PT9BiYnCKK4nSExM7cyskNaVNzz2vKryirUw3F+aH2 +SY4VYg1WIbL/iK20F8OEnsd2+f7H07uZwaR/eA3opLIOB8vQ8qDUAZxkOYbp +uvF6TaGwhBfahbtwzRfa95dFk/gtp0znHJtWBpbQpncniymRR6BxOnpCTqoT +++PdRpJiqk0RQwzGgR/OR2VcIX62tWB2cwba4LZkshNL+ytWT7Svzpz7oih3 +QsERQSAMezP9SG5tyOhBgmSdxo/SPkzv9aBQIRC7gRPIKWv9OInd9ql9duof +UEMIIU4/hiwzSfLatiwfD0cunbV1XrIHhKGDQQCZypdcmnwliWEcxmEYId3D +C/V2gnU4Y/tMO6pe+VR5Fa3+pE2Fs8YSADlqhHn1WezxwcJU2l0WDDoaZZNY +oIm2WX6carJlgehNbjUvC93KZvk93QdNkvfDePF5ul0nazvZOk03EKqN7CQ6 +zIZ2SBHOfTBSQSvmK3M8O08h3rM6quuFFfhJ81fsYFYADBMpC8hbX2PZRsGD +EcuCNw/8OJqzISd7yLwoGri0KUs3Dbm2U83Q4OdjnKM+4hGCQ8qe0imVNS8s +blbjkHyhrPy8JHJQJP8Xmfookpt4CImlPpr4Ah/EpqVhI0yN6sorcwqoRJKa +xM8d031YqUKnycZV8fS2H+BPc7E160R/HTOSfeUsy7It5lkNo1zA4mRb7ss0 +vRkqDTTiV9rK5rgw/LTzLtiZBFCyUtOK+WhPxAiFZclDX34IV7TOWlnDOp0m +KASEnXsYlk/f0gCfhAgICbCw5CGsy3541zNROJTQlbj+bqH9WK21yrZ9ZvDK +4gN3OQETpGJLBO5jLKczFjdHQP60MJL93RmkMjNhX+5yobmK6UAqxJBSeFcF +x73UdivPrZO43+MjrnJhOFRwLbi8oZcfk+OpvcRCwJyAEWhphkhbZnVA7TKG +C0G7CCABNq594rh+V1IG6bYJ5bP7lhX/UoXhh+8+OsxDdotZt/AF0n90b8/T +iL5QQRy/lW7LUBZV9z5Ft3Lx0fFpEIdfdDm/UO4PPdp57Xayv6uF4uQ9n1YB +X6UNeItvFDsNFLoyky0DLkblMH2D+ftFlIgG9rmfhp1HUWsitFpVbDZS4oy8 +SB+6p4xd6d+Rjenk0Jl5vSXZ8J9M6o2pqO4p5ShlDyihKyvQfykj6qvgcqsL +DIgUqW27sSbSkHFOAZuZ9Hcc/lUlvXEsjZuG2VJpidS0WSBPMh2EMJ5IXjdS +fOkK1ep+AakAj4vH3LuR0kbpj20cx1H/ebRysT+YpawDiDVyNPiOMIQRYuQO +AkBtbJwW+7GzrHq+s2Iuwyb8tb0fPH62u0AMakHsTAAqIWkiozTvOzd/HsqX +2pKUoPDAzAIjaPdfTfYSuUY2odvAwgU0a4czTlxmkWwr0aAQGz5FPKSUhs0W +giM1UhCQSLpvOH2gFHvfibGEMwa9Wpy3A53NqT/F3hc/klkOLrDzbE3/sVxu +FO4u3qpl0vvA1hhTTJnhzepDH9b33TW99ePL07QaVoQuInkeNodbvd3Y0hhS +JzENh8h1xEBjIuz1xTJwfIhuFtmwpNz4mYFTOE7AMYr2nuPNoxjpb2duA7i8 +rjBomQp5BvLK0ibevLZFvfxu1pd3/VYdNt7qDHfgY81vlHlrgy1GdlSb3ii5 +3sek2h8SSCe8K0rEK81W9NT7s3miae5yB5zMj3GWc/1cXG0HqZAssJathPkH +j1iZfEp0ftVRmgd9dE+sC9A/bn/ocYTBm36OT2h0Jjyd0sn4t/bSADIB9kYi +ByE1APNzTN/VxheJQ4h0s+pOKbv4y2eltRT7GdmLB+2xeVrIIJamviWpGIBN +vM5Xtx03B5mBHkLz2CnI+6ptCD2+kT27pM2ls+HpjSC1J5wqep85wXtIojJ/ +SIbPJZZiW8Y2/6eyUtePNThnV4z5RqeHvYNAch10iXKeEGU/p6t/gvVYgqZt +CLgHQz74raIxieh4q/OIed6kcbaO6djQpkzD9XCR/acpuxmbAM3D7MjUXScS +cj8kD/zeC0YvqnwJO4GQCk6Ga0XxuDtUZs+qMBXvsj5cBST9qlvPLsH+YsDc +UVC2NkMWkzQYAuB2C5VXLLcQ85XDMSEarkqkXGU839rZwyEwQ8UC7HT6MK7j +rxkgy7PbU6VcKmGoJ930Wmdg2jNuGQeHU6VXs4eBWHZl94tO4ll4Qs82a6ie +xfYcgJ3Tesw2iLRdT9CUH5h3fCosYsW+Z/jX8C6uk5OsSbNSUzboHg9VAYkw +0K8QxkeUa2vqhhQzxLigGXoxwxlLn2VJZ56gAQGweQ+jlIOmXxVnoKftbueJ +HRoS5q1IQb0Z8uHd5QjHfCYfvYRc9mMsERc3saO1b2mFd2APKO/Jt2uuKi1z +Sjzwc33za+D+8FGwFl5eEvfeyb6k1Hv1/nE94WNhK8ag1XBWTdeLyIO2+xlS +4tY9drPTN6APEiv1eIMpVz92WuNHv6nbUcT3PeNrF6RLRHiHslVolRQ+TB7K +R1idNb7Twxh3iwADYmbMVKse7Pc3P0ksp9Gi9q0PvowqISomNzqCv4SdnBIC +Kt5SEZwU7T7VUOZGNI6N883dkbOVY/WR0zjcRMMa972b5FcCRdOtgGHy6DzI +8D4E+zfQWiCZ7gC6++odQrTrz+bcHKCgFC6xmlcWMd9g3G34g+3FAyO4PBwf +3/QTuHNQHbiwUDqhmsMfy64jG5G2mqDIyX9o3Sx7gomXgliVufDOmcGzXYD6 +z0s7heaSsM9uIL1g07/rU4/s+8nBMKHEq0EGCCcSn4j40DBGiIEv7Z/wzav2 +qxX+cZoB68+Mn7sPbDsEk5go0UzrA74rGzZO89UTIMv+chZzeW5u8fH8Satn +hndHYpQuIZi33oqS0/pt9kzMajZ1DAMRjtmM7Pw+aUM6wYuRtt7USfxSfyeF +dfuQ2t8LHlbow0kmFf52gKyJeIzxBeMQZSxTfpEeaDwdoykkbJ5MU34VhPhL +3lxEwtZ1TE42+xtD8LTL++s7/fxO3cuVj2Eo9aFoqNndmaSXMtQX3kfKi/+0 +zr+d24UrBFBy5KZNaZOGwIAFACHigBbRjov5ofND0R3CGdZsK6vGEaduCAu1 +ZigPuPbvCYO4s0Y60LLvW6PFqUL1rbpZV18rjei4GeptBuDUfz9frW1x6WSW +gWQ/Z1Emorzi2VYCSKsaKTKwHHa6aYc522fN1I7/Aa74pjHUNK2eVM06m7rt +fIkz5ZeV7J/XDvJxr1++9/LcDJxuN0mWLtpTYMWyHKVhQ3xPSUr87zPMRMmn +UZEeKxm8OMSodMWfYqxe6eol+b4I4F1q/YbIBYHraz4fB2YQysP9bIBX4nBt +WLjWLsUDUdRfHUQF8NJ5h9IYPjN/ei24qDQ2C2PQ/yTGakGprHY4zqV/Ua0u ++9Uo2s+WRJ/eiYM9tVWLbI3zoXqjdaEEpSWxmqPR/dU0nJDdFXmcM+p+Zuc4 +YXsXEgC7QnAFxlYad36Q2xDm3TXRQacrFUalxraWjGwp8LyNeiiJbZzYfL+L +byWtSHVWpAqyikUrbOfmo+qS1PPRlN50MN/FE3a66I7+4AB9eOn/aOP3YkxJ +lA94AximsPkgX4N5Jsr3sGbOzvZ3C3KAsLQYFWEZhkNSwwMmyj/St1Njq35L +fKodMQIBK7h3sZoVb2oJHza64i6hB0PBEgsBUioKRdYAUnH2etDyrrNkRljw +J7dyJ6HBBU+TSJpWnweefVHWEvaDaOqI0WNANq1f4fTl4IbaVDxa+K9Q3kuC +FfmJTtclWfxdhafjARZFDKsVE6KfqOTrvsLFSzTc5330XxRTiF4Rv/K+NKgz +zCAxr5KpKspoWNXLqFFIlcjl946w5kfFTBuYgm0DMRDi9IQ+8LByuXZ927iD +Y9t3CPWv6bwYvySGYD5/micWMmcBRH09dJrMD1XINSVjYJ0uiEQ53vPeaye8 +APw4F3IUOH9uyyQWndkNwvb5nFNh/dyyb+Y8SJEaCyuHr0PvJCodG2/QyxYj +wzxu0/mboI8khjm9J5rknX8o5OtTYFGfK5VxPwSdnkY9GbIcqI3O8b+MudEV +DzngyhGDpFnPo9iRoM8YPgsinq176m83KXpaWIASa1TSDsNMPlcwxQg5rFmI ++PE6RLWus4uzacpitSDOq38c7egJxMgOJvgffTTkhPfTGkJ8fuz1YxaXK8J0 +MBFWWr1sMULqIqkqKkiaphzfdWbH61qLmKkJfHpMUzYys0l047j9ksiY7Epw +zuEchU3/hG6oFJ14iw9bbhE2Z6tURbTHmhSxz8I5zs2rvhBTR25CYjbqEi81 +AZMz1kGbTVGUwUSvxlDA7bXO9gb2DNxlMotyrrwAcAa8IroWRbcpsuB3vZrM +GVmGpd9cgpSSUVPTr9hU6kdvx1H5zizQEtrKrqQpx0AmGSBsNXOO4ia9Lulf +RNNJgFvyfHaqeZYZgDRIt+wcSWVIx9taQ4Mbdqw+peGeF/0X35CXWCWhDFvs +HYWY53pdMqaNSm19iVzXXYR4BQ2YWcL6u6RZINpN1hvMtbKxpfC2LRmVBkgv +i5jozvLTNF+GJlKhwFjvKgqVK0uiFp1Ht3S2EieYX2lPy6FlvpBp4nEHhGW5 +pFS766UK3MtVLBI2GbdXzfk95WooTy4xN/s2jt0dEHCRSkAiAYTfwItkj9zN +avopf8Thm/ahaGTbFka+N0eqeKfmOqMTmv80zNNT8f00Jdgh1vVrU7h54YOj +ybE4OFLIzBgOqUn/oV1TmTAqy3W9w2EyrIoWZVckea67MbR+dZz3FD6YWFD/ +jS1WdeSWkNrOpiVl5RqA2R6LfwsX71yfkZHocG/aO4k9pPT7K79txqLm83M4 +ErEDWzyvs1umdT7Zdzc9gSYViEUeSUnPWy3L1A0aEp5CDcR206pHomF1wi3E +pvcXP/KM21xgM3KiGbssDfe68cScBO8EfluHdPjgbuykHXQGHRYp1+8byJp2 +MMU98wwON6vWjB1XTYc4HJhBjde59X7coSRTqAALB0yUQITbQPHHHSO0tI2e +0Hhxm48PmRfBeBox1+yQNeHcEQ32BLFILVLf4is+ZkyAVYEioETUSFMLves1 +VPSZPaSSf52LfzhjLTAK7B/8+wxmnp63TusOPVn67FYvP2/g8ucryO9LpU6P +k5kcvZuU0ncouK9/51aYO0DNUIVgN+OmYvOjQduWPJPS0cuXJ0JW3flioyZ0 +c0MouHmdx4+zE3/r+y6wJ4pEUI+KNqTOkvpqaw0NxNo5RzqNpjZhSsm8dqsf +efS82btrwugNwsrp+CHPHJaOu/dUKXcwOshYM2LTOEd8w8qGVEAkPLPmhwtX +aYnqxLPhqTFvVyeWaBnSOguN76EoOeqa6hD08o8JPb1m/WVBYXdAkBrS8CJX +B6LArR1RQFtmq+4VMHcq0fjvWLBemF4PVz+ovrAZcNs4E58fNqR6sswQxKl9 +7SzOPLWfjuIV9LF2S3acBVAIDZRXCVb6KL908wXwnENA5+0KrGXcpz4IKVeu +sgpNKJeVcnTfLxMdzC3MwXizebJ6WrfiklRW7FO/LsN2ileukIenb/7pJZWd +nu7T16DhMaw0jbfr329kmGvueJBn0KEAzPqyJBQG0L8HihY64z8a/yFD8Nb1 +DJb9+Mf7L/PH9YIMq8fn2PwMiU2Uq3ELPMqv8fxvvrVQXne6NLTnDvDjc6G6 +knaqiiykUW6qx6e1rWSvktyZKg8N3bvCouX5wYVew8vyLIgDuVks8JeOA6Ct +uF6S3jVR7xZC309wqAuvxjUr4MYdM5c0Y4kQ3RFDDwDTMKO0su2ndm8yp+du +Nq7lS54Eakkgi/OxyjBhlLEI4H9vNQWvMe7e1bWQdn6nfUIOF8c7arb4h+Pt +tjnqijnDm4zeB+qaGzp0wsYz/eoOcVE/L8w5JwoWIhzCh+uSjOhB+nmmdc8k +RG3+ySVUL4bBUByLUOupfP6DAHrHcespv1OF1+0ONSeuKJo+RqhIQsLAK6OB +c6pZ738mgRZQdNeGdOmuTAMIpbWrUUU6AdTdSkhexVPI/LuNIoYHaDKu9EW5 +11edofKO7YENkIbxka+A2fd60mmjo72hYf1/+xhXBx3a4FLKOZWU16DvifjO +/qLYMKuxvDDcRrmq7N6ZGtTkmQf3fWvcM32Tv+pS5HaT2YyEW37pO/z8kfdK +3yCEQlkTZE8I/trCL0OsP/kiKRO6lhO9bi/vn+7zJh7njz3RtlxavpclZeeU +s9ZjeX3/JAmRl2TVtc9FpKP/ox0/ttNuyRzKhHzjk7R0xF8Gw1N27oHEfzhs +3hQuf5/y4N3KW4lc7sIig1tVDFuMyPe9t1Gi27X56kycR+TAy+nwppTx/HEZ +e4lhJlIAr45jdtKzBqrzkaxIItRyFIM/9S/DWJi8hF6wPLVBGbAHN9Z0a2+S +qX7QwLyKoz3ewTSY1OHZL8522Lo8JV9E5FHJ5DvqGExzYYJxq/3euwHaYE9B +fTEifEnYlr9ji/7zJU/i+swtuA3ns00ZJQdhcmj7Ncl7Po/aa1PyV8BtQhDs +cadtGk66lkwA5G5Q0IJmcw09mEJ3R0z5frxzInQq7kwnpv/pZuxlv/RDUIpN +xrP4KIF2kFY8SlfFO60npC+9caPFupCvn3xp0Z7aX+FF0D/hSI/Ws5skplJw +QKCMmLiE9w9YkEB+NEm16wTdRXxfx4tUM879ViVsvurAmIg1fWeXBDXMGiDn +v5pOSCFEx9iVlvgn2s2echeSlyj1KAoWtImH+AzKCxzWN9n/Dv6HT3PYXWkv +32ZInPfpnHQ63OQJnoHYWAvdt8q4s0lg+1T8mOAHKULPA0mBgAgMhns9UtMP +fj0djieBJYk5N/yoc6uv5wsXwLvKUXnRdYVrGJm3ZohjoVwtqNCTYIjvCqEy +oVrgAIEvNKl4hwTDfmhaiMCPuDiaccAvu4ygfDTFsycPHYfZ8W4bpCwQxKtw +nH+12c+HYVP2ztsfedWP2X0i/nB15LcLX0epxXMcJHMI0JxD4E3BFWRAjUFA +h18FvYSIF9kGp+KGtwj+xPfGZDTmXuBL83LN8SPWSJ7YPGsS529wdY+67E5y +bTXPPlIqCGylp2p1A1T6OZA9Kab5bW7cPIYrco/94k5CpJICkbVkvVNlV9Bu +4zMWhxEH/m+TUSMOWX8OuH8b5oSzv95pTbwPYgJHvwNqiIN2I+1EuwvEwIt+ +lIdLjbze9fT8xfKMKD5pWdswrZ6Gx6HcRb3F6v5IBYSZovLmmpVe64GSNgaC +NJ/Z2Aq3AUOz/VBnhpS/k51KLDc8ShjSoJd/hUW6yR7eIlIIrbtDzWOvD+8G +hFrT7EZuXM5k2ktc7gv0UQFhFjNFiqZsu/jxMdX2n/WPFj3s8kvbrdRKMIvi +/aT60aUOKvnPpeV0OhF5v7GbGNlDF45AYOsIcHjk+52hp0a2UI7/xKx1GGj4 +Gg+DejJgAIEToqcPgdoIAnACKh8DCHIqlT7uPaKAeW7DOWshl+f9mIvrbOq6 +rflCto1jxDTX54p2ESdG/nPoDI2IYAAPKMfaKYQwZZqpXaal692tOujSUmt6 +WRCEwICy1jN+20dgp2ZNkKwz8iTm7q4r+Yk4IxMoWvpwEiF4g4KCzFMYYKHZ +uBQcT007tWxcn+wiYduQVwM2W9MPYG55W834Zv3Y1iiizFTC7+8wMnqJT+TO +Uh93dmhlub6dMQ+eyT2o9oinv2O1ZU8qB3U6lA7K9Il8NOq7aWCijHQEq2D2 +zC4VxvGyLq5rJoG3znGen9E0tkrUj1ZZ/Quej72oBq4gAOj/ia5qxkDReM9J +VxYehIyN5hFLFIofritsWA9Y9ZC11o77Z/AZ3x94xfRq6IkQW9A4rvIyVa3t +JG0iY61iWMgDBDPVQHtdoLGuKjDDqfZ6wJ09Q1RtJU9bFmeZcn6tqIH/MaC0 +AhRykE0kFKG7ykPx3r9kXk8zYevQ/I+LMbVJxELLd7+CWIooSGHJpSnbXLmC +y0OCywX6WFx1lAB0WnA++oEAQFQ1ut/DrarQVX16iX9DoDr+SWdP8UL9o+Da +xO4aLlpeCFskaocqj97JXS1uwzGVVjSlDubUuu47t1U7PnNgLta5UD9H0/GV +51guI3k4rxyJPpqKrLY3ruljQOD4NM749t+UDcT3aq39t4UTH4WobZUS3lEK +ulPrptm+5OvNPB0aQgW7sZNVtgfcI5+uHVGpAEfH8kxNPBgF/MwOCPrxT2bU +i7c+p36lK6D9EjkSk0MTtxHJCIBrVhb6Q+BH/fGy0fTrsG0O3I9Cjb9jOBWj +sCLNI5tm1QznctTdyc5987F3aJnwn3hjg+X3lUxts8hHoBMYkAukIMXdcTpV +fq1WKIC5bMGAAuot99S629s1SUIbeoj8sJgGe3J+n+gaHNaZr6RivBBIlR4h +P+5PdOvyNBrGClVwhKhVJB+NfZuWWyQmLF/drk6K2F8HdHq9CzQTdVd6Eae0 +MNJ7WdRv06sIZzWpPoIkSbNVx4Agg03kcMgU25qt9XkoN4HSc68Wvt5XSXFi +324VVGYRXTdFkqCk4nGarT2gvEbeunbs715EuPC9N52bLQf+sIH4g4ZQGDYy +hSY5bQQWXC41Sj0ycFHs9xlCoNfg2q9zLCuwJ80YJt56CpZZlWWraXoDuBix +8Dp4J134T9PKoXhU/iP57fyxIXURLIAB2xPXlKBWjz/CslKGouu3E03nCFBE +DD1G0TK9w+VYaC6xgBLrmU5+8B9huOH6lND+rjVd4cCPTNkSQa3h/jh59eo0 +zHbYKgvU3fwDR8eILIwMnuWVypqR3Dyv2Qimntk2ePX9EtNKeeNp20VYYyO+ +9C+SiSjGgBLz/XfFH0IKvswXwITz1uZZZ7BeZXMaCqWRwfF0ZzrIg0xK0TL8 +89CdqJe7SY4QIvOfvepXOXplGNQ7OwYtHaF55LJb8McVTNvEF54qlZVny1Gf +F4SnEpsPYyW1WmietaNhfEJKrxN+3TBUCi24P2BVaUV4lzILXUcNyXuM7xBb +eU8XOh2dh3x6R30xKryzHdkK3WPQ2nQK4WbTDhSuKmBSmdiL49/Ki8yCHCDP +GF1lLtCsCp44lewp4AdDCRNZ6FJa85KUeijXjMs7wTp7G0vy0UeekfidSTqx +uut28aHchebrqRcwDkqUXvCp+oBSHqd83jEQFiI4cZ2n8I3CKsrDhjsHM/ZI +OqzofmvOxfuUVO/+ovncBkpj6brjpd/5s5Eczu8/om8OGCpdeHr5FvnKxauy +9wxEdf/M4CPPO+OOJg04/aIxEnd4McroWhbEfYVYTSZj28glCdkyeQNRJynT +DJnaSun+2XUxpUwiQzjgNlx88DRgnyD4ZnbMY8RcwqreMV3x1lWMcltxlQyc +24SEID8FSVc0Kji7Yd2WP8qIy8sbtSQn46zqxgq0KxqCedAI8XMyL/Fc+qsI +lTD2Kleh/W/NVQP2BuZK55Wah8ae//aWM9s8Wqy7TTwO0iLoB7UV5Zo3+oiZ +rL/3wsJc4gc2thUu2Zzsv54EythfUJPo0ypel7X8Fx5LUciGZLp7lZv3jlLj +ImipDItBWed0MN8DI7vpS08el1OWzW8hUA3r/Xi2ewM64MpxLM2zblHTV+un +8NhKYhHqD1bkLOnyLIKKdJoB2gVHZcY155N8AcTDrTPj9kAwEftyNexOB1bl +lgeF6+sD8ea1YyRwqxK5aZwNK/v8o0lYgw43OWqtzz1ceqdKXUGibqSFqKyW +hqz3TG/jiF56MFdk8+DKu6jL+eu8JCvgPTeAaM8PsVST9LYQJ3E+D2C2ne+I +hbUtNORHS+8Pw5syRS57H21IfAZhaFaRc2+kzK9EE4sn1vIqN41rpOsXEVEE +LXN6T69Qk6z1oxFVyNxM3PtDm27Zg2gpmOncXD9xWauoAg89Ycg7HVSPsNll +TOzbgIyso1fQsBFNMkE8oal2pudR6SDpfKjlvN9ajyKCffq5b3h6oFZJnrHE +6I3h+eu5PyMiNoh7ykgRvskCo7YRQ4JERlTO3zpQepMM6DiIg364YgBTYmU4 +MYrVaNUShibPKEeIoet7LEepcf7M6Nwqpovx8jwwZ0Hmff9z7PG9X0hgm/jL +QuSMLDkqi5yGamsez3pOS8vMD8gMN8g1bkA/BhYqx+x4OSm9mPPdhZhJ2HJ6 +zsDuJIAVz0UYlyZX2x4VvcnVcsKr/jqa/GgR57fhS/V897GVGkFjNnPVf93T +sQJ7qCJv3zWm72lxfz7pM4cstvk0P54O7RBX/dThZ2M4lIPCJOEEhhY8ukcz +sv7teRwUaB7+rfmrWMMd61JwcPVsnefQjTTuX2JYcIKZ86FKgYyuA6m9Bm4m +9YpPSgY18vciCvGxozgQlgYBJkDSpV5119SV0k0IoMSd8o/Ko1en/57Tw59D +DStMr8O8iwPWibj9re4JJkLo3/XMdx0sjH9uZHFwHK+vETBtFnGpxhxBIxZB +eVmJR1mrpOQ2chEUW1xUk/u1DdPW5TVozoAp3XsxMaCcvFOw881l7xNduxsB +U+H+ls97yLLV5tFrM0DSg8X2rtHerf9opAiSEGyAqNdizZSXRRp7wHiAqmtm +d1t13cbU1odPwa/l9dy5vr5kH5Sxv+kBCl5Yavp/Lz2dltPpknJA5wEdWwxR +7LFSFgnbs7RVRvpuv57XMsmysnbR1x9VZ/ah7CWCRk+6YHYrGt4ALJ5Uze/k +vpNiMMfsXKUKl207B8iMxgfpiLzIqC+U7qUuOaOwKNUpWZs9oNjcX1SxKCy9 +lND3drXIZQpB3OwmMXmgfyixgHZ21wUtabuQRuRQ3hVIzgrUzlXIrCdclZpU +Kindah4reT3zSjEitLqzuqIVgMqsbl6m5LMr3lh8cLGyuCN4DTZ62wPb4eR7 +vH/pgQ27FZBINNiEaVYYpD2oIc/c05dU2C7Kx54SqlQzZLf7+TVjnZITleXJ +qSjToPMgtvf6AUcuILqs6GdWQtRPFAvhx+hcdeMh4JTEeiv0ZAXMgi7lzeF9 +SvHpwb0ZDfQCdlbnl1Hpm6dI0ppzjT5dsIdLsUaJjjiSkLQ/c8h2tsNq0v+l +NNeoIGEwKH7yddvl9Z2igR7G0ANXBwa+BfAwX8w6CmxfTVAwCWyaa570+/1W +zLegA7TgHkybkKLX800lz4yi95yhY8SrXHaAQR0IqjyipQVaTykuB+LjHwMC +BkwRzI8CTmTKnn3hdFoHW014rxTHgmKzLOK4xhZXVsdxgfWwnwhrIAQxnhRr +CHfB4MByfPTh3q+UHBy/q8/KnjbjJ+Lx1ITNroSHR1msgJ+jFUackOuksRJ9 +Y2dqtQDzc79AyTXdjjjkXk+pduINnKU8YmGwMxVwamySK95AP4nhpKFW10W7 +S3qW4GMf1qzEkf+l1xE3JFpvoqzEWdF57r1UjCmDv1tW5dn3RXVW/IN+Xbbc +644pRCYCBN7Yse1JD7ldjNLhlP/j6PWfXI+pB/ZJ1OexVRaTihrTmHOsbffh +UlpBXCrdk+LAWp5dgc7INcY/psBqwhjmM1abhJqMIcY8i5M+YxKl1fAbQdPk +PJh9+8VYWCBQtH1rLT2i2NsxI4wy7DP46oLwRJH8+i1Tc2/9uE+Y3UWHrCih +K3S2flMqVUlkKTne2b6IEMSzDjQ55lHf+pTS4SfbCen+y7koYaKPbDEUP6a7 +SWcBwKIt6DciXfXRCSc2CRL7o0m7t9aixt8j/3f4m+mevY0VWAbcT+aHyOYA +cJ/SL0HBhstecj0mCEuKWJC5/A1nhTGshmaLSnGX3FT92/ZVfCG4vzDD0P90 +ikZ70YKIDGiYLGJA/OC7Z0pS/oX+gIG1wE1bfmgtpWZTI7+h/8vN2bt5Vh6E +NGE0EfwB7TS5mfgd4JGCtMP+e5GjQ+p9TFCVGzCSSVzyeanA6dzWKQkeFSvl +PyGlg7gjkmzFDHWVJabxCiocv4rLPtcCQHusOyyNBYZvu8SxNBYgY85RVTZb +lTQEBSY1hqIeig84d2cxZeIzTa1Jv2CTfh816WDw5zHfE3oPhvPBpwAXFFBy +M2BfZvY9MjjXtrihIegaJ1uhlSOz0sU7l2GN7tA8nMp422GU1sJ7iEW23RUx +rDoc1CuemWV4EfN8xXOPtQMyddj+Je5On/aTMa+RJJNu/53lTztSTiGLHotT +Nb3R54hD0yFlOxmdkKfjALWpdKLHpriEdcqUJS5I3pVPiAAitVdebxAP+Mx9 +pbJVnbW9aoBQSNXGTMY/dVgM39ei6ZRdnJqXA6vKi40ZrZa/tuMwdayQNLH1 +bxSLEDNor83cnTy3+z7P5WvlDT287iGdSa+qCT+7WnA5RH0UHvrKqEETXi3X +Ysltg4ZCiE95MhlSvSsmqwXSqY2CbFm+Z6n7Y94JCjo7sAU4rhdaHQ3GdmMx +QzwIchZszXi8zDDiMOwgfGtAFuwLFnpSMrRoR4rDyKG2TkpRq73omslEXn2R +xSFDt2B6oM8eBlSRjr43Pqt/4ULC7Mj683qp6DD/sSbmz7G2ft7X+Pu1B3Nx +rTMed7yE4/porHvsCsbSMOSlp3EOcqcc55RLBYorcRq02Tb+zjEeOXMMEh6C +5Mgr5c3Kdac0lZL8JAN1ty+8rf3PzmyYalRqAKyGm0ULLUYsPktHw/LYPuFg +/G0AxEm08L1mSigov7t44aAORZMdv043iOtrxYs6Mvm7fdvqM+eJNxdRmuDk +zZEWzdlDIwiqOKGLYIbvXyWWBueUFZkNFGJznJImp8BMAgIIHBmGqveHi93r +gcMYQ26Rgwc6634sd+/fN8WY/aDzLx5pogzlfxW1D6ZgilaRfSKEhIPDurug +Wvm/HmlyzRLwGC5hwmaZPBLiISUEz5/h/HbzKorc/vWAQszzZAEZBtld5o40 +JnQ6XruXx1mODAgxYy/qgNvVHsZr1RzA2FJTRxl3MotMjCmAI9zczvM+2FXQ +XB72o95AOfMdttAD8P2RPF24ByXjvmnq0ATXr2W2ZZB2L0xfv1sxaUOlEvQx +TlkJz2+vfCPvR6eELO84e4fpKsLOllzFeV8avgKtJ1IuoqPciIwoM5zR1eI0 +tqhH8WmFLubs37bthDMaE976WT7KAs9QXuFZo7v4vPID1gd2cAIMyQzWSIL2 +B8+uJUj9vgBTpQTkHNxYvQYrtQ3pIbhDhdunzJLBTm9ofBjf64oVc7nr5obY +4W9A6HPgfK9EriX5bfVKchrRs0Nm1J1w2lT4FSNn4pzASImMNP/QfZ1clQIm +jpiidnngHbgTlBBsyxeXwsBgws/ycx86ghcvsSmwfMS5VFNinnbBsWSLU5mh +/eceUL1MM0iGGPo1vks716ADFi4pRUF4hy/8ULDU70IQv0aKwJvoKSBVFbz7 +tCCEcTz1WmlTWYpPoVUBDE4XnrwdlE3Vp6FI79ljfBSNBZJnZ1G+bD/RSTR4 +9ZrIxQthKmEEsIllARNoaG1rigJYb8L6NzJLZS/arNKVuNyCIc8KTjhve3H1 +Aw67FcMHjwI61UVZ0a1ThMGOfhjsNri+Md7953Rih2IcOFDT+J1EuYvy+8vD +8fYBh4ME2thAHSDZEz4GmcnQcgW45gR7l7cFaWRT70OxdH5T/YTR0m8Padyp +2bzi4OuDYGCUg1318GuRlseM7ZYrfLIy0vcFdJzM0WMx8Yo7U2pg314pEYwW +f6V++Ub0fln8ZqhS366rO7Eiu+2/hRRsrBKphCfTABJppeNGWq3ddH6WNCLI +V7E7U8ewRPCSJ8O2vxc+clG69dhLi8sAn6x2NIeqbPQLw79Cv/J408aP6SwT +vHIdhpKeswpWGHjBdUfA6+GPiOROebykOcGuR93lGRAgM3ruydSKZt8OM95s +2czxXMrwdd33FCDFAJu94AwBB8iYD+ucLULGk4RuffpcL6W5o+JvSkoJ+iLN +nexjVDTy2qmwblMufW4Xv5wvYzrL4KeQ92V9lkrCQ5AnpeEZdwOSKeOWv/Z7 +tQEM3eeH0VvBSexQj5/6H7SiFRL8s8s4M3golpSxi3qxAEHYUpckTgvhK/CH +q9dd9aYQixAjZ7Ux0+pwxTaxR/3Lrli9DMHiH8d8fzK5RyHf9PY3X+OEod0h +t0VhdSBc4Gb1MsbznX7P3QPMkzjlHk7POI9nm2mDEN9OXhr8ji6KRXK1sYwb +HeOmffGGHcdhl96IzZp3g1YNITTd4xIwmxi4ujtAn79xBhqrogPhbzvcchRl +XjUi7/spzZilm58pqa/VI1jJ6P6lHP0X1JFj/KGHJ7RF2Byan6u30EoSoqx3 ++k6j2ehPtbxhkUEw/MhIiADRGmkrb1yWIU3DvDdUVCnRM2XkXB/tubBMhvbq +TN67x2mycjFpJJSWaT0sy3Zxu2Ws2dZ5O8rsN5yIrTTxl3eK9YX0dUInEYmp +BhFK8pdHcUAC1jPz5v/eJ9xlIoV7Y70Snqo2BX/OAr4AxyhAEartcJJjKOh5 +qC5Yqobhh6ta5ARrooEIeAknzhS9ORP6I2v7m7yUn5dfYQDO6C0wtySvD7Fw +67GE8yoPvwxGKfodPo42rsRkXGlg3JCHCDjqF4HG+60xgy5rN4/+QtUhAXzp +f6GFfkRR0NvDJOJsBQ4dqC7YRlmo6XPEe1mJD5a0DrjCUa3rvo53Tjz91B7D +VXHxlE3RQz8ueRoVgUit3jc/dLIo0XE+F0gqYbmsr9Q5tWaN07sqX2ZEzEaA +3DGu5UhuuMitice6AYTI/eCNB/c368GT+07dZ79u+2sRVtVb/oCE0y/3tB9l +M87eFiBOU43k61ZMip/NQQ+dTRF+LnvV8xFKhzSQH72PH2YpweAaZjUzupNC +KVJRZUNJWYTMVpzZN6rieIVstNJGsFoOMzko6EU4w9yK7mLRqIoXP6yHg7tA +9p/naPKd5S755pcpuocC9MWFtQ5hnT81ff7HykXeqUi6yghc8+wswDTuH1SN +TixFgxTP5w1PWPkgvtufjFaEzgbQRgN13WgstXkw3c7V2S/NuPf4SSODqh+N +ak5Yz71CXkXRBjvlxdNF212BgxmYw7e8eDszu1uNOf0Co7vYK3SqZqkwQMDT +QJcOYCgVaTpidWWDKG0FmYJfWww8wz+q3xHXAthdrrZ8W3RSEG+hil2xz1j2 +/G+vWIqa6UYm7S9cf1b2ExYSU5uh5H4lCVaPCQCA5ESwylnh8sS0o+bzg1F4 +afIuRTJHGZSB8Psu2un4pyh6i1tC98xc6eE8eb7JaQ8eU5+787kh1N10LYtf +5lzuaedYeDDjJDYg13xqlCaXA2CeYMDLit4+PSSUnD9nDms3BFN0lcFGJx5S +lF8Q33XRnsmcuYlTkFlZ7USlM4BJ2nzi72BlsTY6vu4tsqocqGuLdSsAfE1e +nc1DJb1sM7B+jXxmU6sxdtD6HYhqr0XSvc1/M0ltme94F9BMQxDL8TwgxtSR +JDxxYmPqqk2+HxZ4w7WcDKYvv1VR+avVrNvHlG1WCtMqst+odhixkVOksvDH +hW5mdkbyB58FHkxMbhTuLA/hoayQ2VJx6vwyc3SLomNTEMWE2RIKXhRTN1/V +Bbhzo57yh3L3pRbmYjXSH0kqQDF89a3ZBXNCLdjUtqVfvwSIQn2R1LodTm2u +adClHIAd+06A5bMVUMtVoXsXtLTmJVUkRo93kHPzvcMTeuVpOHdhyWRu/UKk +F8UCNhZoweHZWVkcdlHshOhq6jUjOKJZDmd9RVvbAG4i+HTgm1lyPC3Uc66X +hnc5+Wxf57wKaw8OrJ0gc/Bwx7Hbct5J86lfBZM881X6pJMvHCqU3DLDXy/6 +7/rJxYygkucdgPPFLswQf2GZNoEYd8+2M7fn1EwMK+E1l9XC+Bi53EZ/Wl5D +XSPssSbt9o+M08WC/74pGlS4K2kdERIFRa/OWEHKj/QAvascFnzeFrhucoT1 +Fk+aFLu2yYLN0uXNlo/waCUyM9rVanb/e+mFkZlpLBTbgaeL6pwPmilSCAym +yCS2+01SnOl5z6aHssqc0yL09BZ0lAHcq0/PRGURbDJgYtEt9mSvC4Tp4bPW +pSPR7/dXI4mrPSNQhx6DvQuPtO9QjobINoHtEmz8gdgWhizW4BMOFhiDV/vr +zm0pQep2Yjx9PBeCpxFitwZpp35YNVb0xPBZYE3+0WZmi7oSraEpnZ1Jdouz +gjRMrKQwILPm7V6XZ/WmaA/JyVncgT3aK0rQIX6a5wvHxzUlq69MhGdZCdYv +z686EHP3hJJJMdnbKu2HN0781hSJnIgc02SoXyPXG8DwcZsBhNc2be9i5ND9 +5xgMCbBgAAkHHSnOL2em25lqZDJsQ8h8O1Vi2/C8inl25IjxB+7LYc0gAnj9 +2VopwS+2zvahj2e5mVwbNydiTvQu+HAxpYBIF6gp+vWDcwsNPMl+sK87RSPR +zDc6L0zyVOwPZHB49TTjPDriBANL+aJDWZjfrUz1Z1EtjFbGL90C2xJPAPFq ++5n7capiiPp6Wa82gAfS6Q4qS9G6JZuUyFB/hCwRZlZcJv4G5ccaTCTPV3RT +MJ1aD0umDjEDnbOOhPorOYOfSiZQn2XVC/A7MUSJzSyHOl/SeZEf8GrgzZ8E +4dtvlXLTKYPj/6xG8z/SRzj2s3fcTiErM1kGtU+/+MLLc9zC8E322qpXm5WG +b3G6KS8OzAFE3Cy7+RBw6nUAgKbUmB/2+Wo4U3+MMSsAlDg+2slz95iyR/eB +LCy0vm5sQa2p65uEFu95gvNRKBZrO71gRjTwX3YZaet+lE9G242gGTnUGvyj +xWYt/bdGAc5aF644qj1uNQR58VrvfI522WSkeKDkI84ffqYbOv2Ckrrp5SkB +VlmqmdeQmwdmPrjJlweVLjY6ISC5Hg2/Vb/oprztA1uXTZJyh/asPz+33/w/ +OBSm7NZH3VC7fTu4+nw/+ggwzm27wEgWWXnZFWr5plo1/wkkgYGdx2y9uhji +rHsARioIEABqA1kHhYQCBCBVAZZPmLWaUJFah+KUzy6Rgz+QM6xe6eOvhR1v +wG8F6nX0Y5HFP7TdFKjgQinewzMCXdIXtU6QhHX9nSFGlaHSR3WHaO4YkeIM +5AThHCkHY4CVwF844/w6DXI97mc0rXsROLlgWJshAIpjfZju64SwnKjA3ano +V4CX8fRJqKgJBNbvIHDzuVdvOeNc3ynbHuit8+nqW8bDqqjTTWsSS1l87VlG +VYsyODZVDdS5cAX6J4eYnZfhSs9YPoRzVSFiEsCbAbleoKzzhr+KbuS/MW+l +f3MUOGy79HylNHSeHh2hCXO/NBT2PqQ6O7M1kPMCxsbdcFY/rpTckRhzJvVM +vbWmlAlCdseWqaEROLWAzUjszcgD/3TVfwYuT6ntHvLT5leu7+hzLph2qWmJ +XaodYNvN3sgo6LApet0rho5ps6IrovyNyQ4D/LUtedCXF3P/zJ/L/7NXrr6P +pWUZiJNLaR1mQ6Y6S8Zz859P1RsZ/2Rf5Qa38+yZWkpVXrUO0WFsf78yvU5P +34Ggy9Tm+M4BpD+MYFzXe4dKX1LUxnQKSMOOb+yI7Omllky0Y97YdW9qSyPq +N6myhcnrjBIpyzB/04ZdIrmaVz54eOuc9msOvX1p3Jo50qYFB3ehQarqVf3l +R0g5YWH4PzNOwICWeprDV93hYU+rv89I9oqU4uK6963JihZKM6Y5s+CrCWJ5 +qT9WnAMzLN1XH6xwZWdkY6izFSUqs3h2v3WvRyjLsxfOPDU8wHZy4S1XsvIy +PjI1EoFtDR3OA8dKHZkgXdxkd3syDsciHAYXGs7fRzoj0I8u4nUv3UfvUby1 +5vmNmDLPfT83pd71gVk6Clgvco5r9ye8f7pr4/7+clgw3lPhOnzACUmWWpnp +/F+PHeW183RoEhSQ/gXSvXeT6w6cGs7x7xJNeMvOyLpoUHRVVetEUJGc71Cv +PpanoxUX843bRgz63MW9ihki+Va62jeNEjv1u85Z0SwJVwgWFfv+t6SeCtTL +q4Tf0K3fVgyT0PAKDpcc392SCS+gSnG2/+s033VtqVE0d099dJoDTJ0ZzQtL +liBAeXBfBcm9tzuXLxzARXec12KaDmmbhAvLFeGRPz8YPSVF3TpEjK8ANgQf +6wHf0YkEPZQcRludWbAJWvA3jSUxgD4oBh6oDfqZkRWxdBSmQzHYi07z3eDg +mOgK2tdJVPHlV/Xzi+idjd0ZSUMNZIQdSLk761cT2LosZ+a+Jp+lot3h6Q9f +FDxLFahOKumeNe1+zSoR1aFNM+FxMeu5Fx6zYXZ2YZHoRy6902s9DGAPsTok +iNsrWxbLlvp/RanqHq2N5Vqqu1UNyeqvmzN6rVRqQG7RDqFzMYyZPCyxm+N8 +wW/53XgC/wIji1iBE5fovsIgh4sZTlQ9brc7iCnrb32nopEfFZUY4T8AESQO +4EgIM5c3W33iLRnJcnnsZfPQ9oH9wd8OzFPPGOcOi8jH1UgiyeYckom9lnnK +x7eljhVjbwzZxTdWGkXRARlk6SrAdYpnMbCTfVrllpFLQwFdZAOGBdVYZdIn +xQBtoOzIGEPq0nEkTCQaVnx5DZCOH+8pmYjFJZeDsRlOf/AnVjxYU/Vkpwyy +2ch3eISfemb/JWqJm6HG0wxidaXcfCi/M527jQ3CZhEFor15FVdEP/RDs9/U +EIwc+yZwiflAvZdR/GHhpwHo+v41h844vv+qwGc5Wi5xn0YTw1RryOYjCQvM +2Iwc9pGa5JAAEO0u5yNUNGEh49KFh/oe6/+qTWJBNS6daFePSmcuMJLvdaKO +4HuR4HpktCPHwhlhPzqWnJH3xwco3as5+LfyyOIvKc/2WnPcS7O0fEpfDrHG +2TwmnUi2Ei5SZwiYuNZkVM/u29RHtGTMbPDxWu2WtP/TzKCFLYV7s2RkO/WN +RAP2Ry8Hqc8Mp2ePXrKeEFHLSzGpp1AYMagtUq7Ud+gNa/e5M4jlpoNi1wfC +UU+05C1bcGXTiS5V+SUrNwwLE0kfBc5pqE5kUPKY+f8MQ+bhCWu+rARW1juU +iOAAWI9dvIiR7AkW34vwsfmh/xCUsjobPNcnUDsqpPTawNKZFE6Xg785NKdq ++q4ct7VqvwvIPIF5xTTtdrn4WKAr/FWJkau4uuuAksCDyheXliQ8bvYiTvj7 +NcHrbAsOJChHypEnQ0Bi5quWDfbVX+x1Za7gUOO169TqIXNGjfVUykqkJ6pf +UJ7BVuvEWRfptg0unIDyMoladR6ENKBDn+YhWZZi9aj9a4h7m5JXjYzRhpSE +IWJSKtovF5HQd+k9cokWPr9Pl2YT6zQM7Tv/PXrrVNwV3rdGuYpJBWjpmSrb +4+YRdX5KCpDWqS85lJniIJbGOrvsAhFLtDsFrFJovx26Ijg6bo7JcerLV1MW +sHyxe4cezUzOQ9HlSK77dL5UThFiaoX8OGYV2FBoTY+V7mxnNAXEuHNYSDfV +z/iYMxgD6jQwlHeuvFb4wNoaNaXsIVmFhAsL8Hz9p4/oJDEZkD70raEM6h2f +16tBsHirv3TY9B1UKE7fNKZJ5Vfs1R/91Tq7o/ducL6+adqJjhErhwzFv0Bt +vtSNLVIvdS96FBFJ4a8kKE6qgAhnAoRg2jrL5YH3+kpl1TDekmvrgoSNdUYH +ID+IqhKow6Ld4rGnOM+aB4ki43/0BKON8S2yfQmcevfiujFFm2uLCNaPLf8y +BWH8rHfrpDdxpkCy4WW8FccQzRTaA2g91YNIM0ClzNWD0+5c/Q9qFuFfRel9 +2i6jF6liUYh7Zph/sUq6/F34+DzeZXCnupqx0ods3JZvfLyCbUM4bisaBvI4 +6XIvfa6EWEM6FDddA9Puc2m7TPcyouGeyq9GTP+DuccIP/hIacbZxQEGo5hh +3SwosUo7goousTM5MV94rtf99SsTu26/JCs4RxwoDPi14TmBEF+DRaWrmfez +PYpR92K9HrlOnV5ShTGXwwlhuJAweRHcywA2LzLMeiqPem4AL6V+dFHS6AXg +INV2wMr+K9UtkDdwYrJkLjWOI0dKSjq74TS6P3GFeCMhkKAoyc+SRSmi4DUI +K2k23r395KqklrLWS0iHiJ8NkphVzqpwiNc4hbLTi1xmuMOjPzQJudZJww7J +hUhuza3sn5ZUzww5Lz17xZxYtRlnyyaHtpFasZbOMPO0fwUWGyfyiThEms9g +byae6LCvIP/fCKjE3IsOyfs/rjl3X5mhEJU/TZYZRo6NgsJ4BCxq0XIIXRm3 +srPoTdAKQCC1VV59Y0CLh71NAUJ+NCw+Sjf152mTakZDMnQ5pXiZYere6tni +qYYiRxt3S9UlYEnKOrcR1opv8EjSPkhbyKXQ0KfAp439Pm+h4BvgUsSMz3RW +ubxV/B8mfbzH+YBpBL6X9VfYfY4uXQBo4jyrkECgqa826C8aU5F4X/TPcKHc +UdoROP70Fy5sDMRpkS0rsg3hYScPuerVhuOtlgodMzVKvRwGjoqb0KyTnL8i +ncmhJ/jeVV0DIL2aGkGT8DOKjTfCkarRBDJfEs2Tgt0jUM/PyGzwA/ybXptZ ++4fb5FqMftSNmKCjLb6oQaPM58XWbCHIgCRTaV+5kra4arm9vBYU0ukX7+GF +cqLw5qrdW5xrOq9sWhX2C4hWwM2zpRVWLMG8lgPfwie7R7McC3dSaw9MvnaG +hpYJARW4Ff4SO8Ikyycs7jSph3OWv3ESPqKG6VLxdwR+u0CPhebcagQPcJ/w +ZKjpGimiBmw7r5oiSW6+Zq4cFYKyiGvB+VID4tdv0G8q3DhfZINXVWYX9hjg +9ihLEruMH7R3kLezeOk8yKPTdhy2z9qLRsxw8IaMJtFzrRbilezyIRHaHBdO +6/vvU5CrDT9Lq+e5f4fj276TlHpnc21+PqsdBXZ7hBluDwX5JcVzAfkb8NbH +XpKdZJHDXLxC3PydPzsNra+SrzZtLNE8AXsjiY8ndEuV8d8T5hoX1zX3UjUU +/3bOMHyHeog5VO2lX+/IQU+a5lTbMGrepUoHeKayl32GRCvjSXUh6gmKi8kU +2axKa2ORBejoxCsEsURUj6Ydn2zi44gzK8h5vns5YYTpx0ExLhyYaEKKqd+k +JO2AF7vFF/+xJoAnhlYj/FQRQpouj0PCTIPaQ/D4by1+xmj5XLlKnR4JNMMJ +nz9/l+W+McJwaxPdoqh4NsOYl2qNwy9TtXOlKCyyy/h+MTMOexvP76X4fXVa +QVwSYiWmZW3UadXcvDnxIrA6UYnWasGnUCd7hXStG39j8gQc/6p6A9ZNNWZ/ +ugYZfRqx70Q1GLT5E72ilO/HKuLEt6RJ6mGBI/oGK98tq6kyMqN7Vh6sF0zZ +v/r44zJVr1fnMYm/L55tQcWGE9txz19KeNZzjTPJ8R1EJ89ezP1ofOWK4BW4 +iuOk4C49DKoG8vOYOrVaUSDln+K0h9MF40F93zoIOw8UMa4qxFheoSIkvBXW +6nBPr58aIN49ZkWdLPHjeuQ8mn2oz85G00Om1GnDr3cPiexMGdNlgBNz4gRQ +pYpqffurV3fHQHUNuMIglM/VjyWulIyElNShMBkVro+hgmnGdXFObz/AzH7S +SsokKho2VuwNMOE06mao2wnHmdtJLglz9MIfcEQ+2FYBMx7c2Pf3tKelrISA +Jqkna+zv/tT6b2QJh+Kjj8lLTs8DXu241yicekItBlNKuGpHqKLf19vBKYMF +4cgUNF1ngeHCJORu9iLUoJQq9Av8fioOTekieH6VcZwd4FXaPzgbFWEOsp44 ++JkGUHhRwZ1LP94Qxy9KgnwtQe/rbKzKY/4jktYuem3L6BeyCsreBpWi77o3 +OfgvvBdR4vY9fGWT74964IntqwFYqrZHAqi1Ff0la/FsibY4gAAWbzAmqxaB +6sYQ6nHd+ctG140mtYhygH3lBIyRKwknATqs1rT5XhyIYJtM9e/xpfNy5G0V +cuOexNfuni/D2XCRHYLrP2vuzoqh3jy63/6sahPmT2dXOfMKyqTg1YT94bNg +pOlMULRlTjmWnCav1K/87a/hc43BztnAeKfQRaMy7xv0jYZ1xVJK0alOnt09 +0wTvmC/FlBONS9JmUfZ7waFJF0Ew8S+91YE37sy8GDHgefnzhTVGPzOhPU4H +IEHYOmJNcj+ruq3QpyFLNPqF/F2BhgM6lC8bUdc8ZMGKd5Lr6g7ANHEuWMW5 +45WaK3Wyx+LLF/llLDyEW+77q5C4wcbudL2IE/Tb2GHJptShUEyOH/53tHX7 +WeCeUh5pCyGnPDvSPkAlsY2fHGgvc4otwoXtFeDUqPJaoMOu6CGblrW1YUQ0 +wo4DpzR4UpPUeC5ATiS09sM546tOMBpfvL2QOy7gJCd3GAfxkeUUa7sVfTmV +/ENwU4k/YYZjt8yLlU4VuPzJHqN/b/uunGX8PizQfDIJXZg1YRKY/Af+nXTH +A1uXuD5Xv5HIlkFHtgw/EmAACABACRO4BQSi5I6xAqFDvfdjDuPpP9no//Yo +8mGf5EV9aR+lZX/j6yw24qwcDf3ihkAoMSdLJ7bxNpP4EmSDQBhD9m3rgmEC +XWqeIdsQh/5d0nSBjr/SzGDi9IikGdorGQBsnnUsIU6a7swjIa6UP971rK51 +GGXpIPp8PBPr/qBF1abuARoMxylU3RJLf53oo1F8Q2KC2AoVml+5/ADRqpTt +SjUkQmCtlq9XeCxHE4Ox4+7Y0o4EIp/wt8FjZLm3Sl8zaOhK7NxNnxwlta41 +ncioPGUehiPcxHmBo6ZHH4NymvOYcOsdRLs+S6NB8w62gYLDmP/GX5EluIvd +VnAMgo+FmyZMjDtMKTQdSc/vm6TYeJ8XIVzD9pSqaFhNAOQKIFYKKBoTS5ag +ywwgFqhkE0vomMP8Z2rTQQYACxn/pQ0vvL1vqf6yfZQm5HDLOxhGas1iuzNy +I/gSVdpJgkcuJSvkRpkVyySwzOdUVK3+0aAOqyVY3/5aCkbjg0gntcc4IMUL +KoGUjHZFCoMTQjRZiiHjdL5R7TuellAjN/QOSAjnkZQn7mtniUsGMHr/PoTW +2Y/aG0U+yv9zkpi8AF4Q2dI9TpZR/X2mdpGfYR4X3FscQAn/w7H/wgssRMTC +90s33DIFLaSDjMTKJZMs0Zq7T7FqArA00Gel47YYWP/2HhY4wJxW5WaR0PV4 +ADQt8fAvFKo4PxrksnUjkBELcZpMwh0OA0ulfWXp2FxNRfCZolOhQ7/JxrY9 +qAjNxD7UnVpv2fxJyCQVhjCmXsydkaSSkbzS4xRIKP4ZYWRljnrkD1wZblmJ +F6KyXEdAwnzCrVbbcQy/5CMgCCSObzS1rqjy/MX03pe6aaygZTZI0JwkxqYe +19Am2mVx2TTEjTLoDPN56Rzqi0L4Ifh0NU3K/HNO8Qfh+UdzaLI8H2Ce4vGa +J+qhWdNeWXxBGAZH3wa0xpcWabS9eNtTJCrOWEHijxNO0bZnfIoVbodGxsJx +3ky8j1BIBYRfQkLVjcwxfeil/BwPJin/vZVkeZnyyEJoGz2Ucn8QLFCJodwl +ZB+HGeUyqzx7Vjq2Iws+mpHzxJUDGeo4uLzbwnjOJ9nZ88ghpNIVlxzb7JOx +RHfg+kupQD4kzRgIHDDeTSpnxY9oalVM6FsbtfgriUCpHdVqkUjltYjEbMcO +KHnWwdA4XvMMsB/pwR9QSL42wsNuY8eN+toctHEVRKrNepzpMSe3rWYtCXbZ +AzKwrxiPb+/rIMEY9yjM7ogUf+HkICR9I4E+adEVsG/BxAAmcGBOVJN9aGsi +mEvnE1s2h281ZTAHajonrVqN0LpgEgYcSy7+5Wc5DO0rt33rm97aCtTedTMf +HNXFk7MHYj3AcTYlxZ0Snfvi71CfDr/+RLzShbwchBR0qYq9X4hLmuIrfSyp +9r4RiGifrUP9rn3/nzM8JiiEJNOrpyi446t+hGrXuq05+qR9UUn7XiXJDxvN +yCiX6rtMyXyDcEr5pLUOD9xMIaXV7IviXejkvBNdJk0DPdnxaweAxzr98NpM +vVN/9/4g7s1v+AsMgJIqVTGtaM5+GZc5VeGPXja+qU7jdUWtF3VL+NkpC62J +zTrLoiuXrhzs+l9LnvTVGFT/uxaZ/m5qGSYq+iRiUgkni0Z0D339rNMPfagv +K0L4xChbSFIsp3I+ZdZk5HdlV90Vhy3a1eVh4n6ZGmO5H38JEWm9cxFgYFqo +HR8+YRQiYAQZY1E9C09vLDCFE83aHhLhKx33y8ZapqeeSpFIbCLtClshogK3 +1s3Dra64+chEEJ6yJp71ku5H/X4rtnRDu+G4EQZA9PC0asW2XcAjaQqnJEGo +c8fl6W+IfoMwk3eiE9r6dTfFu29t1kwiUw33Yz9BnY/VTJKpINzWdZ+0XZgN +i9wjXMxFGvUbYqh0FlxZWz+L6AwRPLhhmXeahn0OQN4H6kUQPom+deXD4fWc +syij7B/0YdA7eprDVN0SXHcGpsMJuSfOSJH0qKrJJQDDWyZoCAoKQTCSV/+J +tFgEaFvjHm+ZxF+5eYkyKhtz9REy3z2m1hzNCnTiEF4/w/XgpTkoJutEsmWe +RqfrKWrK9wkGThXvSIn4Nrtj0wUz+DTFlerlqQPB5//En0hHetT1gQUYoaJd +/8O6yduTRejgPQJ/2XNFCRdLAwpBjeUKEdboErqtzJqg+mAsVUJIvCHeJIZX +eZ9z6wrGJ/0nhArVVDofTHLzu9cChCswVgQ36rd6THE3zIy6z405mL1jID7N +3iUI2xNFWnb/Cm8araIVMwwlGkmplWLIc/ks8XNw50yci2DxYUz2hm/2pI0i +D5GJVog+pTuW7kQHnKMXK7u0RZnFjN8BtFcLuSd66P2el702OhGN1v6cPgdS +Gh1MflZVJNKHfKKz5a1Nsxz+EBrCNRQ+Z0INPzmQzICMFvKbt9n2o31E9MGF +fcCGDJpXYJ2Evjf0FnJnEl+ELjJd9NjqtBLWEe0ywwsS376xonXRFfGJeweR +V1yUQmQtID5Fe2gbar17CpHlnPpGgzPBe6jh9uMd6TzUr6PN6ueu1cqKjmNb +tmBK4B0E/56RffBpZ7ymbzNXlkbG+G+W37I7HkYCh1Cv+x8EGXESXT8Rqh1I +1y9/sPYt6Umz6ambhnVimsF4BOiCgqBL/Os8Mz/lJXIBRJDBVnmOAGTo3k3b +qITSLUbquUTHKt0ewsTcOvqDT5USwWydWqIKS1LuNE1hkMWYnq2EDgDBExtp +J3tlI1Ng1yGLgZ+gK9XPTQQ7hs301ytXZ+6K9MAyo7uJCVLBKDx4gjfwtb8R +xRc1TIGL1B/PwChmx97nkF8NFuKlQAr3bw669RkMKiO7CXVyhXoGJ+lvqtye +X3DtSwc4ncKv9o2xJQAnwHjGv2tZE3yO2alvjED+4ykD314eMqZtMHSH8+xP +XTxt/Li2EaPWpMfvvaMqQcfGTNxnE2HktJqhDLBbsFF9asyHZo5mUmKA59Un +/qvskg4O222k1Wtk9JCAAAUQadNb6CGd2pTSExncyfVdAea+i77mqBaEsOOp +o136nU4mHh7bXGp/j3dcWQWHcIylk48n2eipkzSq/mI/OFY92Av5nody+d9x +zOi9iO2psI6uZqWHfjwwbehsuAon3BneOq2zSP2ZBhEw5MpHZ+e1afxvZEgb +HyI/XPqid6yFMjMsduugUAAIxlCCIeuNUYdg62Tn69CMkLeH9LCmxrMDBEWZ +QE/cdjZAAHgtZxZgwNTX9NoS827q6RPBG6iYqCi41ygQPW036R6KO6NvpSYN +RnTISSyR4SNaZA+DAgNSrvOY+IwszWR3K24V34O9uOP7QUyv1OUl1a7gCkj9 +aPlOv4vCCAt6nNkSCZVa8gQ2KiSyja99hl13+yn+YthNtBtymoA11T6Krjsd +F/AIo9HSn94ua4y6JMlpt+7nOeVCJy74xUT23a8ELDrOnJ8uJenb+MECnDtQ +0Uhu3fbEc5j0lf2yGNE0bYVvlRMNecC1I+/apTA63Vs/0U13w5xdqeh+MOt7 +EqJyKJts3dIbvjOexHlIM0/RDD03ainj60G1CVf8/IYLyRiSgndJMmtPoGp/ +QDuPCz2sa5IxBt6zDuyVq+qyx65ZMeyQaqQc2ojomT7rkZguQMcOc8xUVe7L +GlP33qoxGWBoE8NTaI9iwGJyGTCiAit+LgOSpDMlnaAyXgo7VLr2rWYhEeUJ +Z34trXOLFNbYM6usYt+rZfL+1tWuUMKrZYnmOK/t/f5MNJy5cZYpDgr6iMQr +5xy2NQ7LqaoLeA8RRTHUlfrJa4EBYI+QA9RNuPilOxyoMtDQ2neVBT/ddTLw +/RFldbNOQRv5F7aIbb/jrvFAhH94Q4MZMCSVAmQ7Inra6hEdHZR2i79NVJPu +HygRkM8+3VE459DTvqzbhZG8w5PdhLCXhbDZZ9GOEKsR3/wlEf9wW7GlJGQi +ZD7PjNwqu/AfKM2S2VQh1seUiBEKNBMUWMD4z4SnXrZiOZhLlxROdpW10pIq +9vkQKe0qKkH/G7AfJfTJdHylVVEUYLBKOXD8zRa0jk7QaFYg8ACfT1hq1ty+ +koxNTadjZwy00AK/q+WR2sZT0JpZQm5f1ai3VpbdNyTp+1aYfaWpbberk3Qy ++HEPNGt8RYsvE5BjmYlFgR1lX7nXrG08rhXATndwA0vZRQyTBlgWddXuMO70 +7x4lDxmKTXE0QeB8zgyvPvClFde9SownW6z6VQfVD3DPcWDUuJ6fH+L+Qg4b +UF5wo9uRXMwZKXEiKXlUy78h2q54WvcotmyauNm7SLGsIghJGj+/on6c3TNW +A1pLhTxKq9nrQvRnJTxzOwC513LaEnbjKdlAZp6BwVjoi+GESlDuDoHuK8r+ +8S9jpihpoI2MWOlaNXo573E1K4JoUzTrTrt4+peuCcHd11zgIb6ZXzg9ro3T +1/WPGVZlCwwbPScMpxdNt8nVnQm4WJhK4q3zaEgYG41wGTnOfPlpap7HxPG5 +MxZI7AC+r3qcLWVf0LzKpUGOVOp1pWj7JlKodC2ijRf+zsQoHm0hYZ0QQEc6 +UJjh2uuMI/Th3D2Aq3weFSwO9TaXrlAkOL/xnkpSl3IpbLYcmS7+EsXCjUHx +5xFFptLaFZDNbj69B6wwphkba50s61MaXubXbEWcGDY9brpRqg4im/5fu73V +iJY7xCVW3tTzOW+X2evf61PyosyT6CIQy2lRmebdxB9SeqqkG6/07rl2VRi2 +mqEG5GEvVrZFhM7NX5VbK19xqnEgw8NpUkwxUT2rFiyxOzo6d2wd5Hvc4Xk9 +yHC5ZdRKgFUH4cK7c1edWh0KbGh8KbV/TzIX/VK/NU8rFqyyr7h7GBX0gnGm +Tlyt/MqbChYtyPi9YINpW8gGCABqchpewsHkQgASb5DL2Y4ib1eXCmRTwtNN +i+M6DNzUHSgDzPnu0oTfH53PmEqWzTEXjy0ldJ2FCTkvIR+zgLyia/j6FzIb +3fHRSNvrl2hgh3uH0fB3GOqUaASbiFEgYYgwSxnUvSAg77mnn/wcZPhyWioO +cLiAlfsanSK5R5E3TKx69U7FCzE0T0jwJ9geDyF8kmOavRtkViPbYer34Gp6 +zB1S5yRO6N+v+G+0o7ZyfmJ80TQB1FkNkd+6zNG6g/WGuVrDhFVP7mC9z8gp +rybWbkTkK0v+ulfy64rG5WuZ6yEsnRB7k0gjeCZdZxHzRyIJmnNPoffo1cle +g9zxzpCQLe9zXfgrvr17zgzqhbR2YMww5uuYO90NOq/4F+SQx2i2rjzitJNz +Z2FEHwyLEMbPojlW/xXmAt0oOAx+NyWzvnW7ybC+GzEts8TDLyCaTPBsT0IA +cqeV17csuV7Ust9QWpVoMS7/aw/KVYZAWngdzpHQvblJzmGHRfa3NIo48aBU +7o7LaBdBgdY4Z6ygIW9Epouh5BCoHum05Xxi3V8Tnq6p7ae9bAjr/JTU1im0 +TgdAWCsqzradvd0M5abgPhzqnNgHz8wJTsj/+Wu84dH5OGk61uwu5c91oKNe +R8PKHdhTv4uHRzFr577u3z/bfwHLN2ZfuXF2hYj9k3Nfr5TE5ehx3sVLdYUy +FVcMQiJnG/3G0Tpii2g6naanc3Gae1PHNDwgkPNxp11WASaHJjtaK6bNuVJF +7vTfptzJSILvjChhJAcXLvfzQKygEJEUP2Zdzk5OBa9q3LNvKliGfrMv0Axv +30ZnNPnjFCUmOlY3VeYb65bqFZnp0c0fcQoK34TigeoQJZCn9bHlEgWZbqy1 +BlnanBoKG9qeJzLQIiiWmudk+jaF+7hZ19INgnnuK4eTL+MzuGblBAcqjN6Q +ZKxgJOwKtWkDpK4pj7sM2m+HCosR0gqGVj0RpMe9q4aJ5ExEoA4pVKZSIbss +Cqf/zCj84v82EF8W7EnoY4KTrU/bG2Wz/pZfBhe2YUL/SEAsq4dCMGDSwzbI +R7dlHBWTuQ6QuvGXTKstyY6EptGBM762o/HYpV4k6NYhIXKWEdi5/7OEWkYe +7uOzNCsKvRRGVqQjeNqhvhw5w7gGKKX+Q0WbGyTFQd1AvvMnxF8iVNK0vF+b +kx6YL/vPfp/SnERSXn+oGJgQuu46zeZWPElYZakjK+92CkiXZF8euQZtaa0R +VyTKLFsC/W61mccfLTpT+fnoWaeDdrrMjjYD3y9GMuOp6Z8IpGccbZtK8fbD +LtQyLgE9+/Guk4y2IGVWP4z3qBjSap5Q9IOqomlA28po/+z6EM+/Bk3pXxkI +3dkBqykwglj44Q+WF2ZWKvMC/xougYssrxYrOmhV0cmf0az9WewOeRXwEq7k +Oe2/8DXF6Glywep5v60SOMkmLhyCP9os6aaQTy0vNALX0K/uah0VKux/6hFu +lC3yW4mDIQMemGcvW5E77SWEUs1MLPxtF1g/+iU0ACX3B9pT/ohFNIMAO/u/ +WrxG4e9QKqQfq/K4UyjDNp3ulOFaUl1PGfKyGXWpLKb08Pj8VSb0id3cWOrQ +4UyWm4/giNQny2PP0bTydPK9wndve6aZhFJY/w1NzJmn6ii9RBGAMECAXDV+ +dmm2d1GFRR1YiaOSZq+3eKFJVjWTNzYsqcnx5iIOF17pCnzOsADGTEL37/1/ +mScugx2TjvaOgiCgjP9SjS+27gG4Uc2GbObMYTWOr2SwLw593sNsEZx+MC61 +3RgdhONFIyfTtW7rpp9OVy11VSJOhzJv2whcqJk3Y7nWHwg3tFFVrsbQ6h4Z +mlaG4MKL6tHIaMS07CQsnFwyiCJz+Szpy9jWweVzF7Y1DRVLwda8ZEISuVut +SfH8uyj+fJZk7hdNpeucEVULMeVryyeqsHBe1VS6e9eHfaLPjVCi5ufQjzjB +lZO05auWkGE8EVlNsxt5j134AQRmT8XZsS3rcj6DIu2mIq5kcVMJYMY8GcTj +5Wsf9FGh8JEwkT+SOAgoyCZ7eU81EWRREqF1qrzngN5OnyuaeB2tKdIaUeWE +wKv4CkniR3fHLwy5ZIFBKwqdWbaz6qs3lFZdHhczDCEUC/498FL3x+L45HHV +yGfyYWeCG8ueVaiw79/ATb1F3XBiDKtp6wdrtfuqD6afkcx+C70iLo7qvqYI +IYzvpE3yyKconJmpmdZ9sl+xQ9ep/V0ETJpYUee0qaGnbP2ek9yIV9h1CQpT +AP70f2nX4MB+OdJ52EW0oGARuF32G+d8G5IbRUVNUSNkTgdBQHk3mfOqmnS5 +GXDnU1wxIriYcQRVY+8XSf2UP00mbcZyr+1sVecauKSaBDYqbHj7Ob+Z2k4P +/MZFfEG6w9oYJi+3HW59lzPwI569V4ubVOxw/LG0WfPYHDejt9XO9+cSZiod +rZxxJGS6xO1Zt/jGy9w2MKgtSN69jU74VptnHgVJ6iT/EobHKA/W4uaikiY+ +nJs5ArdVVrPkPhXiVLnbg2wximyb6xsj3lPXJw3VnydhS04OUo4F2IcnU7hm +4WTE8taeb0S7ZcUB9lvr16CKs2RvectwkhQNMCRaTHH1S1EKnLOV7X4i5fke +Wf+LzioZT92KZWHD0tUALhNFq2aSJVreL8DdlYzKh4drIuAD3P3DozblhKLw +NG6Ap+3ZkZKC7NgNX5cHW472IdtJx37jPOUnByErxk4DxbFiib2oQRoRrY4+ +oz8G67piOzdLZNG3beFW8If5VY8atXA+hO1/EmcTtoaC8mGLzn3XjHs+EPmA +SYnlFbgxSJXANomJ9N41pHn1tQqw3YPxlF33VO6tO8yoQkaWOWIj5hHnXloT +1loLn/c4JXCN/P0rT1m2UvaYQXpNlakvYfhaxYQRGprrW+/pgYTmhgEabSVW +9KEU+3aowJFUX7AZzwfYaESlXveheHtlirYVMGLCedCxdk4xiVUL3Iwsu3qh +FHX/zt3FMo8U/J11qX0c9mJSHp1k8DF9ORD0MfMt0cKAXm1oNl4inpMU8FlL +/aCOFMgGJY/RpCN6iKLNfgqoNQ4cDb4/av3LHxKtY9ZggAWlb0wTiab2uouk +4d89DJL+K8ycab2SqsPAJKG7UQ8KNVOUI57Ax1C+SP44nNuXmlNYiKysU13M +JaQxaQFcVHfyr/itjqFy0iSPQ33p68ORiWwAg1N1xgz2JJmEMaAyZ2AD/RTO +fOXUObfWe+FC35B7f+NNeCPFKpee2u3FOCh3yq9VkBRIeOEZagQI3aeNitgc +QjbSp3Es3OkXUL75LlQfvy8QeWmljTECOwbCLK8J/S6wjl1p6kzdy2uHhFuA +3ycI0DGWq8J5M/q+CB8Js1oaIXfYw+ocu2n6LvDE5ZIYKux93rxXH/Yss/KK +74QqOkyNk7vzUtnV7/OTtVumeKfpa5mY2XD573CBe4HoC0SjObHToSP3tTgk +M9UrD+1iS3VY8LP4+XDY9LAQUg6ttQv/MfFeEPedXCRppLZjue9k9EJBU/0i +dodxdJLRe4RogzjNiABGHISMPiGbIKbUpDmmU8LxL3T3vtONo6bKPK/dapY4 +W3lTB2dyCTvpZ1H9NK1rrLG9RxtZpvpdSfGJs7J40D2LWvPwkmulZ5kPlS46 +Y42PMzt/oJr+Bi9tWbCXHWnM//tv8Ea7av/Kk+h9vzw2ilqrp/85bMeWl7TD +brHfJFKNa4gqvVr8iApl/jm/3RpMdQ3nv1WmwcA36+lFk2tsbUZ6c4SlEP3w +kEu+GWtPJWwMEHWot7r+FQ4/wrS7EcKVjTpCMNFM20C/2QquGkH3ciJg3SWU +igO7Vs+eKzhtnGTF6WsRz5LSP6rtTuRSMTFNoEBraZDe8tgyRc7GpEKSIKEA +6VM4Zy7Gm6Tr1984Q2JCYAQG2FvWEDK7ZfoZMZsDexu4Q9/1BRzEoBeOjkM+ +m+U1W817CI4Jn0wHjexY/dj+VLpS/pY4h5giugzN3P66Uj44y5inJosFhEoo +oEzddsEACABASS8PAU0Ge+Eid5+Q1Ngn2UZNYXexX7/zKwcXlyAt3MeYJF+j +jyUjRH57escYofJqVNo0dfq4FqplG9yakp4+e+kcZXJ5KgjFUl6l12wWsnAU +30tzKDRdSBEa6A6HZDQ/pt5XTn1FCFKTqo9Vf9iByah4rx+C2/ztf9McHEmq +QdXwMxnW0BaKCdQlKOU3GfOziYmk8eXlTwG7zfWgYPulAc87Go5zGTQDwSWA +BUitRf4m7eG/u976Ut5f26ZOaTIbVd7Va0ohAnfEByMvXPdBcsSRoaeozHo8 +yDRI1sVmv5G4ecRBk6+P8WFl5tGEzJst4vjec10kPUoTXMQtDSOqvc3JRK26 +k483XyKIilswOaR6/qyixxNEtwvXYmfxok0NEK7kfiKmuB/lzNjTzHZyzmZG +gnG3yrMcXRJK+YHeMt8q+V4Qu5+ybyxkGUlmOfQ05t11mVnXmwYV8yMbnXlO +x+XWZnoF6x55Fsx2MBVhHTSRi9vcbddhw/fMmmSMYwm/GbYNdmc13Ln27F0L +6Ja1Bd6TVmgoxigCpazjP3WzY16a96r/JAe1cx6BP9tiBxVtU3pXALgebxbb +yP39vTJzedCnZqIZvNZkB54TIIGIi1Wpw26Eqx4HuO2WaOx9I7vUTPSmxBWx +T9UpSXIJqF2OnM/QAULtc8mKs2YxqqfONXiSqrAEjBef560atXd5UMWokfRK +N2IelxJqagxN6GbpPvRH4F8/kUErtn2P8ayxl/FyNnHy7flnWzxU9qY8s71O +tWFFy+VcteF1ujqdVoo7ypuhUPQc0gmseamLVDDnaYFFTBgSuS0hyol2c1t4 +FuW//ZaieMtEreB4KPJsEXGkeJ7+czZ6pt6h86WiB7RGFayrtdpQ/3dC/arH +Ap3FmHYBQGeEqDaphQnu+GGyTSn7J0qNMOi90ValWvNzL91+wy0c4jpuZfI3 +DBOjg9NCEZiPFN7wlpVg2tE9Ky78YLZ9jMBEXeyYwxkEKMQ23GJMwrqIloHb +LPrAMQuloB4T3NOfMBZo+huuYjW1+AsBUfQuog1ZxCxs1XqPxyidn+1doe3B +iKkyZv09M2A2bNWD3ZUqe1ddS42YuPLLTW55rD5m09DO39IE5USN+fUQoAEi +PdOVym+y9uPLCUVDnf0cRd1wPscyjn783DgyErc5Dwv2T4ZwS4qvzfkLP11+ +Nry2/dkqe90Wv3bQl86D3w+Fosg+SUYJt9J9mtOGfXk4c32a+I1otY5KzDP4 +FGOQ+kerPY+J5pgWVpki2o/hQgZGBVcoa/XiUzYhJOpsP7ZfRSn0IZ1egHND +hW9NtzZ0YpaMcC97y2EdDQBpn6xCRK9GPFyguSFnZH75bSBmyLdht/i1vlc4 +7vL+UwZzO1hLJdARlsXc5wSVDqXY3eoONHVE2kR9xip8+q3SOo3qfOU4JdIk +KzteTjH7HKbsGKMSwADZfYN4cTRUEivLLq0hIAvtsp6nqwuDhSaOec6ltk48 ++NhER/tyU59LsGKnZE2TuEzwBVQT3PWMhv7lAQPWUJ02jC7crZDnP4aUrL6m +j/0XBcEl2KlQLUG2XhD7p4lY7yDKhxEenUjVT++Wt3mF/W7qNdYCQhnUaFT3 +Iheo2Mv5j5CxednDmLQ2C6UwXExqK2GH2e7Iec+27MUSVSaDnOoh2f4w/cnS +B9oAc1x7oVquIQjCYjOKrjEHpp3mencx7IjrtKqEymgb7KnzNvSdUf+O2zuZ +JARXMnHf854alad/HIb8HCAN0bOom1RtdjKCXDJ7obn3jii6V9/yL29Yzzay +IxOcwR6tFMXjITod4XJ4OOYLS6yP1W8VB/8RFEg0FGUVm44nC2BctK+/uFRH +QpQmYa+zRFaq3Z84bbVR6zX/EhwMVIO0CnfyBjbroMff9mRaPvtUOboHPWXw +8YbLEQ4+u7ri3M6dkWKsasZWBwwwUSi/KfqglxBTBw2SClhCMBLb6l9KpX+l +PGpKgVkJCQ8+b55Ki5DeOGSkXqf7yeEOuSyatpb90phLvfLoxk2c+hLfJfbB +zacK7Itnjdo+1EDShnxdblAyoUEA9wyzayatavLZxs7VERcQiSb1H18JVf7i +xuHIu6+qXuP4i5JR9CYp1zXAzHyoAAlMib4GxWIBpvokSovCUWFGqL6QLp4R +KkBoKiPU2OyvxaXwkAg2CK/b1fTdCAfbxnvX0w06O2htcchq1D7wNBNaSBTH +jFeHAXy/V6zU0wMPPHhQRve3tVc/Q2IO4RIrDmLPNrZodROc/3iPP7HVmxXB +AQtofKwJJDkk1wOOMaeUgLr0DDXA/lJERe6QkgWdBmyGD0/tNqQ2yixl/G6t +Knn8Pf8k+6HFZx7xZH0MNOd+7sknvDBsogM95Xl5cLuob2v6yCoQKqeWGu7Z +QhPfHva47cUxVyprxUehN+xnYAs6yH1Ge/OZf4yihdHeb98cueQh85NcyuEg +sc+WcVzFXJzjWskanS+I0SGhMX3OmaCvP4vDJH7Ci2sqH/GMPGfu6Q/cKg9J +o/a6OqJgtSkIvyMYj98EFaWq0/xh72eFAeVV7g7NS8I7nulGd3J4JYanGdGd +cQQ2JGw2Ug7IDNxQihpnm88rJZwLuWYsATrqwNsY+sunW3yLq4kx+5g4Zpmm +nxtBTqAldfFUzvpLJ3uSRK2tJkrMtJm2PWr62gM6VD9TSIregFqWCGUBUg/z +9+46PcF9AHzqOO6Z4NCc/14WerBkGiWqP/ifyleetag2WwyEZk/xeMojkNyf +xPnfGUTbiJke6ZkIlPMenB4f93yeZxt9EnCoe552na7FzXotFwFeryiuKZoV +aivFfvsO59lx8xxxLLxaeu4SIu20eaRDMTmztF2n2Wh7DK9uXMCmh2IAABv4 +HhlgGYaNddIzW/4Ucdii5soz/XQETeWatbHt6iNwz3G6/riE688Ip8UUEI/X +9DPc+ogQOeX+Y0sRNMLWGtkH+m4aoS0Vb84nV6H/XLZu7j1E8gttt6pPGi22 +Nrp9BBvRpaam3sowNWnb0xH/mkXJ7OUyy+hw3G9kPhk5r/hf1z7H/VX3+rFf +qHmCQG44h265x4zIMPD5IA478oEyBAgQAGn86ipDnKAPwOE/oR/lPmGEO7Ij +II7TQKAt21a266Gb6RiaJIEbEg+ZWNpztWS5+yLj2mvrGPFN/0Gle379ZmOa +F4p2EpZVnO53Yflzkp8Hnpc0nQxNhnZurMir5DwcyRsu2V/Kfg03ks3aNZmD +i6ST/JOEsSIEMlv8vBQhVCexUjE5WYwdpUdYylyUs/DIQZeMqh5XrKOFSsLS +diljdwQIEC2poNktwPGhPuKK+3CZw6oIW05N/V2f6SC15FzzRAZKLcQGdDeU +9rc13ndIWPvmP/hRGyPylNGm7nzfVPA2iwFoVy5nc97tDity2c8Cek8B1QGi +35M4eNx95L0xiz5qbupSucEBEi5Z2FRsNN/3aXSEZfGtOj9MK7gm5C9pppXl +CRw43ZfNQEY/jq7VkzNtGIkimVBl1+QPd6P5M9lPMwZwZ+HsfJSi8NEKX95/ +GVTe0Ke/+Xp9Pr/GPP5fHaXenfjOcHcM00JeWlYesYZZ2wqZUPrI9GTvRHHO +1l4/uGQcfafIwUjR1ap90gzLIfkusk0KB4l8y90ZZwlTxgw3G6SXKwlMtQF+ +Js4+wKkSXwMWbfo0AM/6sRswhR3qaSk1XHdP2ZCM1NADwKfFsKbAfeFdx2UT +P5QSif4TR5qvM0ABXLs04HtMbZIpKXBVEU4ktPgcLU4eMos+9svFpygcLngI +EwiFXjihloMli/F/lBxPV8qkkv9M1qb2VYKmTLG0/rf3E5MjfFR2DzA2N1i2 +uMKq6JDaV6oPN2z9i3VsLesdHm062EfYInumM6o3GNH0+kCFWWWA+ynQLULR +wJ0UvfxItJ3oInXW02et3EDovJbCcKST/8sKoG9JidigKB62a69/ChpFBdHC +Occl9ikS/YN3Qw3LEnF3rCPCW3jQomHxzZMDzJ3o5WHVVvCGVXkkvjUYVvp+ +J5OiInpE6uMiU3Bwhj0N8skQ/hD/r6vc/tsZq/VLlT41w5eks6NrNXWXMttJ +yuVDYSh1heVGzDOXDV4Px0iMki8DvSZ9FERI6INXUmPaTbM8NyOWxY6Sp6cM +CkP6VL7/pyrOAmC43GGe8+pLTlLvBtAAANwYAIEAABWY+bYdj5XcDph2kaQD ++HQlyVUlNRJIU02sR3bkXTInvg8Um5rhK5nWqREiaKr1syyuuVsU0EM6aRh9 +rYe2vCkCeChuFSoBLuJfymChEAZQ+5J+VMBfDvKY/N0bLqFbmje0Lr3OY2GX +jdOdTMYuAOV5E67jVD4k099W3Nk+QFd/kLb5JlyfrnRw0PM/MX5hgK6rA099 +AvwK3yV1YNlvHsWFPTpIbyQUsCBIrUGD17fD/wIDhOJ7YFxt6dXGMn9voRpy +PGLUVKyy2NzeaqwetU0PynrjMeg9FfS2DyjAucMd7oC3kRsXYxro6XKfMT/p +tJJmA+Egu4/49ZQYIMhDYBqZjXt5mu8YvF3rQ3iHxPORaSvgdaDfNWMFXpBe +bYNMGiPWfcxEisq904lL9fxF+QfkfD5F3EeFpk3rF330OztmxPHd8nEidZaS +qn17s7pQwov5CdNN1luxxw2iKTaOq1b6zj4s7BLrX1OmC9goeHhEqlGPlcZ1 +N0f/FT4sVreys0GlGyUdiJpUliyH1K4jZeRqEYoAlNpN1/896wveg/fdtSum +FnoGDFbMl4B8MfH/6fmcBIGABX3EmUbScydYl6f/rtwRjV+/nZFkVVESpw+9 +OqkqFcOwnTKziNJdlpYXmz3E8J0AkzDBrPxmfVxzZjWeikUu5+CDJSLdgSbD +qRLP11hIIDi08eiCgKYK9JUfABUOTpvsuc4WdPTSoAyOXz3ZCHmDOku2m2Tk +3G77pSasMOGrDed7E//HAktggLUBYEB8hQrq8rTryhuNhf5aDcuYQWKziz0R +tZ+6M8nrFtBJANB3/c8EKPnqWDRJkyVCMQAQIC/QnpFR59dm9wpGQ6juXyW7 +sn8xacsHyMyRGIyeJ008YSTo9nAIRGUJQgwzhNyRPTCZ1G1CL/suTyGGG+RE +JGPhaR8RXe84zOgbZRoXWACZkODSqr1S1r973lRwdEVYtd1KnVu44Xj4qwL3 +KBNMNylyFN7A9NqhF60Tm4NdUxJJanqigbHdwapLDExRAsi8nfT7vluFQM+c +SlUSwaYPF/lqlkcx2ROf3FEVFgEax/KIOjH8MBEynjuocwzL/i+1ERd+JIt3 +zRVA6g8FyZJesxIeF23oDExTLRM/eDheByHBJ+QXzNa+FL7dMTmP+yti/L8P +4j8mWuhvPPmR9ujs32TkfP8sfyGJuUjqNzNsnTEJiN4gLuTDdVocj4s10oZy +uK2S96G8yEboMy7xGoBqjhiYtzgjPa/tws6x9MYy6go5xQPwm15AsEtwhLRY +iKFvlaINeBtpr7VBGPzYyTCtA2/LAyswABgDMgcOyKcczRLXvRKtZPZWc2yg +6qnMyOv2O8DfqxisuwrUGO+3S9qcpsAvOQTodPKw2vG8zUvPL0b/Sq/5Ih6+ +2kaky3pCD3jWhVTM8rbYLZPdfbqYNfJR1vXbjumdC5m6vzbaodp1vq/6uPHr +Ec/VvFSWJQmkzCjZbrhGnWPQTdlzo93X6/umrxV9VJwvAF0Q+s74HbJMUWcC +JTrIMvQ5KEF2X38FbvMPgB9yklWsEv8LnIu0xQjS+3lixMzPasy7lIwjVB9/ +YRk1Zze+spy/gHSvh1P5mbaquE8vmzVLqYjvVt9p3gUDfEWqxP0yuM73Fdss +Aul/MEX/bIxXx6sW0fzQJ0yp1yFHrHa2sgbvcezWq5uU76FZY6fRtpOs3Ktl +7PTnouJllu4aA5w605YErqTn8jmTI6c2o1Isvp5H+0IpsnqQon+9pi4TwyTU +rqB+AukwkFznzoNboHx1AeT+q1gAAAAmWTGMwyPH1AQJRHbJKDCegjmQohyQ +Mgcr8CJtFles+A5zgYCXXBuHlZuN4YxkY2QwInlZSFpoxhpJhCkJNRhW8KIR +qugAls3kbiHCbyXoaWIzOBhnUi5mFryvnynanuFnlqDEMMxyir/HCXKy5PQY +LvQMoPtmq/EaBrQR++ZhLOHZsDX6RwJxOS2MK/XemMWlMAyqGFoZfYltHCeZ +nk5onIln2cOAxRy33HOgbuDJCSwxXkD4frDscwsM13QSI1vP1xBcKw6JYAAA +W4SSpxcWlEMHJi9Ebiuo4XG7JfJNbRhmvIH82Yg+XWYBd8Asb6Kil0Zbp7et +ffe3MAIC4I0N8/ljJmOyu3dO3QdF5MbmyNSz38FKcxDZgnF/PbuDWGgDJ3zn +mLxldccRK88IQogHho7R+dHZS9WxITQ4D40elbQYGl6YD2zrfWc0JAoxN4zL +kAWSuqemfmtFqInaGwNJ4708YY68Wy2sfXS2ccPXq9sWC3dgC4fjs5BBI0Ob +FqOT4ikbq/tb3JtDihDG9khJIsB3s1t2cegZco+n0hph1SSOVrWQKKMSnh32 +sWooCKkpOX7JUaiNpR/EV11CLAZD49XZNdWGEDKo9HwIGjXtdufp7tuAA8vB +KsMhAa3QmZgAV+DO8qSLuiLc6qqr0CwkENhB2n8NaOBHhp615Gg/n3jCoLYr +vOThzwW8lWVD5jXOC/Dm04bzCI9lIYN7VH5IdH5LNfhbQkp+mLS6sAsr3dGh +dg+Rs5lCmiJFKpu2DWeLcXFi2y2nFT8jl3famirw4g9pw8Rx94yC8RG/w32m +7KNF93tVBn19aT9072oX3wMURbJ9rkCAK0mxPu+jBfKhL+FAhf2w59YqQtHx +ThqD71yGGELY1ikhSfLwZbNOqhaovVLFtUGQPSaDA7t0Sm1jF3Kry1KHCl7p +OQ9dzhfGxKxNCF6cAW0Q4lPo3RsMTqzHO/r0Lled+cwRS0bJyzL4p2tAzTnj +pLgKAWUVLUJ5DEV8TLJzA5Vk/Wrp5lQWAtmrANr2mBmqOkEmgzUVjx30VQTX +7YCLJNe5zWVEK6qOdL/jIXNS8O1/U4LZzqPUscN5cPe7+MdYaiKwch48nLO9 +zC6ko/X7IiawpUaB7GAHwUGz8zAZtPLqXMNh5XhqdOh9P2mZN3v3Ah0ny9+T +zDiXwDkR7qz7gqtk6gCNBgh+5mpzI+pFtTJCNzDyZSFMbiCAuGTgeoBr2/EL +VR8yKOQMLeIM0aosh/GgB1TjcHwBW+32lj8sk/9I8EaMBTlDWqooS2/y8Vp7 +dFswYMN0rxVH8KUIzTAxEGSRVsiMYJadeFS4uqULt3XkwtEhAbjgupA6ROEP +sPJwYn54HGK59Ag/qXvzGBeQN6sfXuION86Nn7ZQNHjzte42KRYJXA0SuwkC +bj7BJvXOcfEFn/0VispWgywGABIp+6F7yjZf1RO/zGJy2GsANmqNn6qfDF4L +G9R+J2TdiQNW4XWhGzwz+sQb+ayiuBlHXsT1dRDqclpMQw0wGhzJphYZCzaS +KcqnMpZbLS2H6mk1LVzlUqF9DnUOi0f0PxEFSASNGMjXHPckSB2+u1ep4Tqs +f37JJKc+kJpbuoZSORzSWKQQsbST7d5YKmSeGasZtPv0CwYR02dRQ0Ba9tB/ +PxgXSWkPraVKFiUTIKHY63c+26vEhV/m5U4rVemEngOPRkmo5HdrRFyNbEfw +LRJJMGl+fpcwiEyeDZS+NfgZXX0XS+aAZi6ADop5K94h4ehJlE/o8JokWySA +RnDFrOHDQ2B+YSYL1/xkflaHT9rjSahaVoMr1Vr8yb3P+7Jg6A81NafhS4jc +W1Jta5mSyc/qZpXWhFsNLOSL1ilTf0yLMmVtwv49zjgcZzzNSFqn7nVwQT/3 +ADZfSbLWF9hWedoaSdCPCRtNFiGbR38vEwNYQ/O7UOy7lr/tPE1tsBp5W7gB +TzBvSQxIgtDy+6KXqXqeOO2/QgFzMbznn2ExldjixJU3xUztVNKylUxWa/XY +X5WNFeOuT78bL+3PANsgLFF07dM8be0X2Sjr/zzHOaBAaviWHjLL0MTnQC7K +hBVO0e40SiJjeKBwIfJobOz22NzTLh4WaRtMfOn0ZP5SVxWfsUQ8PRF3mz5T +NVs8n/86Va0Jd9VtOHdgS83IHb6d2r+4PDWIbxpCCOVEHdCooxGXmYmOKbeM +9Pvi4BRx9a0JHpifAGKwTJV3lrQ0fF9KjcZ37ayDKyGG7qyNDeJtqK9nsEtQ +QiAztNO63GIc3Fos4s3iqy1PnmXIK+CHRNU0v1i1RUyRY22PCl6610cJ4Od3 +Gc2xVxEcDNGjgFhrtohBFdaYk/bbaYlGj1Q2JExJEEQg1yA0fGAnzpkZjgTZ +DdC6obN31vvTzcCDHowGzM6j62bdeQvuAVS93FTLWmMVki3zyuyL+gHpGsb4 +11oGFKHuTs86/zQvipjIghPZ0qwzREei6ElqxDbBMBLl/Zi0821/NBJHwuXZ +vthC6aMKXpeZQ6PrSlGYrp/DNSqzhEr+mAX7KwsZEUatct6LI78wF28DLycR +YVw1uDwq5eOW+4EzXCOR1y8llasqIsOLjLZtE9cczV2lq6GY9vjc0AyZUWbz +A27feeX2Fm15lo+J5HSH6NQ/zyg2qFJDHEIVKI7RvnrK1QiM4kya96sfvHgp +ZdEzwXkTunQt0QHluEQZo/GQ4bTJ3EmLBqFv97IXucxW0hdvlfwIDpAb66mk +o0VU/gkJmmyZRL32fFEEJ4q2UkovS4Us2EznLO29p6SloyaMOyObFBQjrW/h +70k3yoD2jZyVJfZzeRnai+Gr2Rf2xZ+MNYzWdpECUQUwoiNez7OhoA8s5mif +5sPimEALdDqmAVDlf0OX2z+zJQSYc7d87CErY1zFR9Lu+BQ7D12w3QvHvvAQ +9c4M9A1tBMD8g/yleyv+2sp2THjBi93EnLzhV8nwpJ+NZEKB4StmZqMWmugy +Yi6MVBGxxew+u9qffCNZpNpCU0EzuZ7YO7SkiM0u6Dfth5qqh0GClG08z1Gt +C6D7x71OhIwSDzpr7n4kebp7FbzWzZWXGwSIVtSFDsd1WW5wiBrIXSGeg8W8 +61ldngnCcMjuaiX/ILjC+VAm8GuLQQASz8N/1tX6yU8NmTpuz6VwBBAMR2mj +8fS/e/o+qEKw3T+8egWhYwxuUI1FP7vybqewABeWHCJzplqdtW2yoXyBAd4J +tFjh2f6kUD/twG51gkiJrHlMYydWDZdWzAKhzJHN5qDjLUmPodQeNnXR+cjN +K5NmPTiucRxT7VoCLDLu/GL7Oy5tTwQopiqN4MXZcceJeSrU00nEMK/tNYxP +8IkI2z7KdDHM51WRBbz48NJUnaovUDqacDlM4/DEyv2hO4xhsZFkr2Rffya4 +3bc91SX7VDhkvcltt38T79ssoyHG+HVlwLoAsSAukZdeRlmVnj6+xKJktOM0 +US+qdXpMbJG/OoEPbLce8XLfQ/uBajSebwu4MMe0e3p0GNsMccuOKRIhYl9o +x6ZrpgOWW/O5dE2P+KoAIKosaaOG6rkrx5vaCgsfhNxrMTWKCm1Nww8yaWLa +39qH5DtFSM/cXDj2t61NECiVO4zUm7zgyRGUJux+Ke091iZQwBgAfcC1yF4z +hYyQMYv0d33btMJ914QYVRRk4rX3vXOfWDfB1aANEUvEKv+unp1dqyk+kaHK +kFxEkuScHpZjB9fs16PLvdg1hNps1Pd/hmtAqUJW7e4Pdtvo7LK1vKc3BUsb +jCEs4g6+qXWLytHfaHZDrwKUTHfOdVg9dMndIW7nbflD+CON+beXg5UdV/cH +/B08e4dLvf7bmglnYLl26NconIQzz4nMgP44PbSd6MO51M6KMjp9cjPrydxO +UwNiDae7SZWgruW3dtUoUjyuUlFKb963xEm7nnq529KCLqQE9n/nzInDG/c1 +nUkGacuIRNMRfCE3vkheTl+/uZiUqrMrgfOhn/nDxKQtWwibDhifw6RlR2Pm +pICXptQX0LtDEdSITkV20Xq8IfKAc67jkbgbl8BlImC9KcG6QpyoaYzrh3U3 +ZnKy2n3v6CGXLC1TqBZD76oh0f9sj7gtjn5cRHX81TtGkwWj8g9F6m4Oye+M +L3fbCqFaU7a00nIsCzmC41G6xLTEnenE8BtC1zHsoA1INkWEZGYHJ4cy4K3X +fCZ7QGZjxHqgJkGWifeglOB4RoNuJvl7GgGn377D5C1xJ2jGqiMOiHcl3sFZ +hDbva8EzPa87SuROKirPeTh1QEGXISTB+G9bSFvFvNnGt8tly8Sc3hvkyqiW +ubk86pW7zoXcY7AL63JFSBNpWTePOBjA6O/lDIbxWyRWphn6dq5PTZzmOUJt ++9BzPdVH/JKCavgQqvrqFd++txr4zsPT3LfsOpA0A++PYjWU57zh70s7dFEb +0z0km57g/LydLLvNVQeA9RgGoxFdKMci8Dv9ov1lfHBpg1RhyZpTnIj5FKRd +PrGKnuvEOKjzO0R24aZeheO3sAdbycLVKCgNCWxYdJDnK2IazYNCJbOcq8OD +B1pMKqezMvcxVRGba8Gx0oD9ovOW4ZsL+8jtgq/OPWl/CoebIwM6jNu0KHUM +Rwcrufg/oUpq5b9uuuDgSuUYl2mWOUrjPmLRvTCnv+PePtktQQ7JD3pHE4Ys +NpStQcwibD5g9H+eWSpK+vxX5w6NLk3WulfgkUNaN2DxXKpbU1q/0J+uI5qV +6m4pbyCt5GWcmd4a99pZhFlOOgaH5p5KQo2TlQMalq4lHPBTcPemS0NLs1+Y +amlJ/SPELoLYk8gbZngw+Gf5LgaxBnmOnI3qnyf+i+HFK/AGPOVGVtAwM0sV +vsnpvozjZ5sYVdKd1t5txSq3f+y/5H0+hc90XjqCLq57qsY1LbbAALkGHkwQ +5QU5GyVxXM1yiai5TKlW73CrjJ6in/WowN8uZJ1dsnJzfRRafWKAlH0WswnI +LSqDc6v3nTS8WSLY8QaLCxGLxl47jcZXXO1q5ufpUJjuheOob+m7VjTBRi3m +uThsQ2DQ57ZzYUvyosr0kEf6AI9Jh5FS93P1ZnM0c2we+dVI4tm+mqS5C8bT +Z5CRvszv2YKnLQ2HyVmAFzIuvMRQbj0HVRQmNp6J2lKh2SX1ua7XOo1abkLv +KN5bwgab3rB+DeVmaXnt3/Es7yIv+z5hFOYHDneWC3oe4NvTtsEQ55jid8oi +8e6N9HMatpxdUjI/e+zvAsGEzCx/2jjav2GRpW7TN1sUjS/rRV5WVkmSsIrl +gm8MCrnAzKkfZW+mT30myEzbI/5ckD5Aj+bCwO0yslwse0agkG8yODGM3hO6 +DB6CGYz55QPjmJ+JicBDWWDo1VexRbIKKxvRIjIY4iAI2/Y/GsxVu6TDaIll +To7Kd3PPYSe9HqxCH1SWAanwe1Qmk61LdXzKTFDtHlFnyzPVTbhW6fVO0Nep +o83BbwIs4gOxdd4ZABPGM312WdRYnK5ol7g68LxZmQu0L3epNlpASirzGkeu +PjQxig65aJStgBmyU2fY5zjmoi8p5nlCpsUyPhn7LNE74g/zt14doAHV6Plx +aTimrzNaYexPoJeJorkfPm70eZvq26JLZUPd5Ml2k2phJaNneH1LcgaBjznV +ogVFa2LfecYQXL7YhjxBWgH5lRdezSwdboA8ThSNL7/PeSYdJsiAClwytfyZ +kBDUJyJtCN8J7hDXhvWsD5ugvp77ajgGG+ygB/k8qTBNum6dhL81paJat43j +Vn+KsDhTosdnmAfmRJU275H5MnnopcmcO40I7fKBrzwwzPbOMTijj0ulW3Mu +qXBawntSVBY3P9CGCe2ED5fo5QhNNyhjlZYSjSaA5GZ5Rlg99hEII3VndM9q +aigRu7fmjgIjEbX8VxHy7waD4ulPTqhOQ74K7OS4ptxw6yRbdKP044fNiAPv +pMjg/UssNkx/aZJ2jClGShOrLE5IhE0yYf4ZJeelt2lJP+02ZxyWUJiXjhPb +t9xN+rymmPhCbKJNiztOOFNIbWXwuE+52Yg9zn5QOh3un+UJut0oAy45G4rn +a0Q1xeN5arGU0g/hCe4K/cco9ngexEGthgqyMOYObzgNg6C8vYm+VlTbJsgg +5j9tVLw6g+H0gtRK1XkqGM9nd5qzT4nCeRwrCVaiPdtIKb2qFoSyYwAb844m +K4zDEfkCN5V2z6swyIBcjLbyJ8Ue9kWs9WZShtVwgWJxEOcwHQNEMXWKvRsG +hTOpzC71TUrHiiNGRQtMtG35HcohEfdWit9hNdVL4nbluYYsPeH3i6XdH+Nr +2EQX/6bWmNOG+sajaJZr/zFor6y9ciNW7ObDAfJbbhzUu529iOuiCPdPczGg +xg+53SPo4lF0GK2M4YSsglC3O/RgP/WL8dAPwbQygjA6ftWe3mspNgx8xYWT +Up966nSb8gqjPceMDGLyQaIv4IEASWH59aRy5GjMhvyDbTzvND5IsRb7aPdr +EnE6ki7YvOzoPs2x+BphvG7eVJRaeUlvfoSQsq15IhWo0jmCU8EgGm/NRE0/ +qftcnVgK7XPj+JjKYNc5MQOBX7gnKKOH1jc1N1CDFdNFLWkbJcYWp6iw7TY/ +hhmfVZuejwF7z2KQxDtYQ5m9s3TpEtFcnXbpAGOU3ArWGSOGcHSXq61jUo47 +HqgMytjHQlw6S/k5Mi/WekYuqx8h1kzHxXY/D81bMUg434i35cRDXoiIxq9K +bbKYrWY40Kd06RQlgA4Fp0ZIZSKaBASo+q+9UktgqmNOjOnsU/5ye5Tu1eXY +2Y3YAlD0FSwA63YoGXwMMyyAgaN6PiDDejeDRKuqA7SIeFE4GYrRB0zYfCKr +ywDGUP0At1QmWyOjL9/U00by8A5tMq5eI60cUeyLv54r1qzHLj7CqdlVsMP+ +TDRNDxYjfDniUsFrvpCctdULsYw8lW8kPItu7zlc+9s2TnZQ/NZlu4I0Jxki +2ZqYDkcawXEerI1x4pADGNdl1MVUrBBgcZW6F9X5xbsIDusIcrzgDA3owgbs +fmiFhZa2MTCi9Fk9ln7E2j/VcSs6snHLwSGB6ox0xOf2aEO2xm5MJN4EAYoY +OvJ1CA6pDTBAAr8GCKBEJrsOhOzEquBDA9xQqZUBTC3cwEzrZAhhWhkf7qXx +67JiksTqrvXpAF36Gp+sl9REjbYsrjI8d9jcwe3fdVAI786+sLgJD00VbmO8 +Fji9pH6oSkW0/qIqS++rISaKClKdh61E+f34sckYBLFJxEd5y3Ky+SP8zrwM +zEaeExqkS1vJMvWwYnQdS7pTEdnIwvAJJQ7ZaBm+K+ny3xp3jI10cEEdCNKz +eu88966GNbcVM0QsSa57IFftB0pToe/U3jqd0y5wT4MBnGktlfhajZRaCnBm +i8YjpGiK4XA63D5P98ph4BC2XBkdPVRodxKn05nrVB0djZ1S9duu4bsx7GHL ++ejWSE6ebhF9TNRxhXNpkZQxNsNl/oYw6fE52EaTd/eyOYftG9y5OuPhVFvx +4heV5d02+ypFgbezqfsPcSBes2NAdEuAmjApmePTqym58Ey9BZwMM0NsfS/Y +ODM9A9HFuI7Y6C1jUcRhYH1g1u3BUOrpbjEYdYKpiSI5d+rtNqVHPqPaoQzL +2N+EWtWeR+aZ7yawW8chAXB+uZMPcUFeaQ/zcVluoJE2nxFWTYXmbkh3FWZ8 +bVjd5aVyMOTTkj5h5iue1uODLSIRmmTNi6DiQo3jYdur01P2JmzfDS+OVPaC +OJ3wnz+IaIA8Tj+iI1SgwS1iDSH+tchIbGM89XezStvcUl50w6JFlQOOnPDW +WLuyjVmwx9bZfideGsMuWyoYHILFJhmOHAJQ9qN482qV//EJTo/m/LzeGCRN +D0NWFTcrhXGjNqEMM4vWJaw9d2hOSQ0EO3YGvoy3qDbUZQr1vEjyWlmUcHuD +Ffud8vaOW7SKYjB/u+TGpxAGiLGkHlOGaQd2hDJy3sL2OOimyw1f5SvASwdZ +gC5CtsxlcFHJfjrSIl/1Zm6IyE5gn04V8TfZYcd+ZjF2YKsZBf6GaOioGHkp +1TC0yUpWJeEi8hYIm6QBasOOWsQfaX5EHF3Ad6DxLtn7F0GfoeGJSGvdwsIh +9FXeOVHZm+GJ8J17DCkTRtbN7U5qM56JQa5mHhm1kIG689SY4D1LsFkuTKEi +NI6DlPYfhuvvK/w6oP3WyZETwN0X4roFvaOD1vIhArDMKRxUMtDXHye0mQeE +qKy7UjBefv/sNYRXTJ5EXiv4LDZFHdD7Mb+uL2zDWCkM6dlp6qo1L8watrvo +h4V5/Hx1OkYUnhgfJ8aO4Ky0JHQqdGTw7XCyhwiUJeBHCSScWpqR5gekeEmC +SvmPUbb5loDUTEYhN3VimBNueZfwIeLQ76T7WBx7csXegMlTYh79BY1Oz/vw +RUY/srlFVdX04yorbinShot/nFhv+bxcs8cmjU2sPzFIG5dkhLsh53zZ8WEd +Exr45CXQxJoFYD9NrsW74ySGIW3SEF10eS0UjtpwBr6UTz3d5C2gvvJKQizz +jjvZfarqfBXEJj+ypAcVtcvv+bSXoX0YC1uGwcx8uM+d5UkrlZEcePdNoRVm +HuxkIG/50NGNHMydW2Jg1poqxm4iQ1fWUmc9wFgwhSuB2X2LqtzN+NpNgbeH +56L7g3Lq9yseoiqULmjn9vIOxjgrdGsMD9fxgHGa3Xr97Kxlnz9jlH/klYVI +3PtjC7GF5AoSawQoI7MWm6qBEq0Q4V+1nY5PTIkVMYqrFIDIk3ONCZGuv/if +9F/2m4nVqsNmsQ/jD7xW02G+bKJHvLLFf+JplPxtigCo8cBZmmgZVBsVdb4H +ME2iwm0DSXt1lu7Jo220k3hoyHNA/evmEb5ifVlDjV6gE3xPz/aLqGxn9ptn +yIVOd6+Y0I8Y5uvwoHBD5sYGRNOMYLSGhqztoQaFDjl/WmocpfLMQ2Ak9/qu +sazmRnk1IPMZEQYNSzsH11LC9DxsP3Qp2oh2jDHj3KclaPHH7C9CDARzahDQ +1N+9psVBBtYx6I7stnJFjd51s0BkeI+oyZMb+2224Xk2LO69NpokWAw7VEVH +c9Ptm8LSHFvwt1rD6J7EJnlWl9NWyRAc4N1d7hCCrxmPonDHayvSxLmlNJVl +82U0aNiKESE+QqUZ98Vj2sm7SMUUlRyRPBKfhOdXzFFEzfRM0PGahlvL7IW1 +gW/y+9R7X7rcEGOWOvTrHFGvIpKnGIKiWyrsseXyWBWgom8DfZinuZturWfY +AlgPCFzb36MLzG8nEy/BSZIWu9qoFhL2khm4gjdZyjqWD55ZbL8V+KHHx/Kx +bMjjWcKJjvuMKEgOcr5nLSx7Mg4FLPwn6uw3Gems47+s73o/veNvKuIiwvvS +WhDIHpTn7NCp0255TGxxb7xjc5wf+hpEZR3b5DPVUVATKNLM10maD/LIRDwJ +jevp/D/ejZr9U8/tXsygpO54CaGWcSEJj4RULqpXTBmLQKW2NI4qUQcXbz6a +GMvVkh8rr0w/yn/ufPCnN0xT4N3oX/iGrH6KQYso/X/Kt2b4a5FnqIdJyK5A +H8wPUGwiID4w3ccoS21tkieMTE2kkqJtTv0Srvnr2iQvqnFeyMcKhgqCiFNJ +BERPxmZcxSDEhSgDqEYVyGbMuHeazpokUyUTrnaK+L7tggKPqdjRs4xggtC6 +NcssfL5Oh/Uesvg36LH8HCkhKH9xtbnZ+nLKMgRi9nEKyN38RDRfWwGraPeA +Od8u2uNSmii2r7h0lVk6Xx8u+6GpILm65n/ozTfwm4qOOBuwwMmwdb6mNXIg +uB8rOAAcbUy3nofb5nJeBGDl6ktctDqU4UhnyFNt8X0pPQB5VswmIlKNXVfg +IM/i4RWYR6F/06DqkFO54D/+C7DnYntDD7IsyZ0gEnmbJO7tG5ripwbRpOIY +ifaqiIPbeebdZJSZecWWG5AJyGf+DAzcr1JTnvEMleBh93jQWl2qc0bSTWAj +NKts/Mjtf93+N09rx6Sa9HmamcsAfWJgM5uDvhq56hVSjYuhTH5qvKu4010O +hqIR01sZT9XeLKNDVArxPZ4ECBbDsExz53Wn/ndWiIqXY8apHqbqp2yCSmy/ +RSIEzlLDOo3ePDYVZKA+EH9iRSJd39l+GAc8hXJy9HaTIWXyKluVyLmYDGUs +iFw1sFi3B94IlKlkZ8R6gbbe85diUNpanyJqKKyuBsf3kM80xr+mL7XZsVb4 +cy0NCJpHl/SStD5/haETP6w0lg/T0q0UmgQ2VBEYc/DhQDWbnMzw6UpRNQLK +FCcEux6eYN3Cl2A7KagYxDLI9ZUHSPeV2Erq3Pc7rhXabtz4GeXOM8re7DOE +nMRpbUXDF9c82zF8SgMTWv5eSpB+Pf/0Sty7dfjU4FNTLSG9MOS/0EWp69Dm +gz7YAAIAEA3aeXp54dkKlCYR+bfG+Sqcbt8BVBsozHgElrGS71opVYtOoovf +5EQUJaVGP8tbxtmWMTSy6IR+cOpzn7c3Fgel0KUzRfm2bs7NP+bptYnPGM3g +hnYU9kf3Qt34gDuxJ4OXpGrlutnXJwHVhpY9rLx4WaXk6fq0iGhPpgS4b1g5 +C2Y12x0b1NUtlZPyBHXUqs2+80pgFwPL2csQvabvhchaTdHpQYu2oTIS7JD/ +H2UPyfadsVH6kbZ1fkF8/+CLKCbrXtl3qJlIT9T/ISpWIK2jXIWrhPNeOVcn +wl5g9aP2ER6Pwsa+f+C2t1hUcD4sHg8eHEPlzmzBaJzroTGySHH1KIO206vl +/uYhRueBimyyO+zR08tMXid0CmrwgTupDB7OmAGiEzq+/3KLWdfyg4pH9GZr +nAf6DoR3v+XyLaSE97bTEG5APLPdAJv/XXzaYjK8qSjDSj3l0k+xHlcFx6xL +bMZAv6pgp9JmFDJEmbzFqE9PwPZ9uMY58aGbB2N/3VY/fJQGpZ96NXrCvOD3 +0j6k4V/BrFC/X/BafkrFKXKMpG4xD9MON11NUk4dpo2q+BxhSEA3qQxUPisk +ROiRLg29Ed68K4zvR3Lj9QLbsifyzVWVaCB/ar01xPrXqs5Ei9VV5WP7IWgg +Pi95WueEpoC6dW/cMx/KnRmaiQplc+RYvPUvhZdEXaW5PZ8X8eg5SQSikjJv +u6Kj3fwRTZ5uL+i+jg+MzBT8dFN7TTPcT1ocWpNrtVrT+FMpM8Tg5E8LdXR7 +EsAo6lenN8RysdicBQvmAbjRy4yvDsIT8+6RtW7jlGmDkTzvMkwd1B6H4dTy +AsR58PqsXbbGw0weAzaHqof2TUy8ooAiLDu4h9pLN/Hs2VjgM2fI5GEh+STD +ZisC6izHp533qB5CSxvbWbZmRcJJ5nWWaNOwSPM2+lcuoqqSN1PUz90f3jQF +SuY/e+gE+yuXHlf2W7ykgcNxOQZdY9D7K1+ue/QOoTkQbvutD0cY33goVtmu +tkLj31bodMUTyOa+BCE6XoV6elLMGye6jRERm//34MloTjualKkfbZWdb66i +hiyXXtG+vyI/38qmw5Jz55UUSjOPwzSqFKG4xIJ6mQMdbuxgXE6DOVRdU8Eb +4/ukO/1110ul6AWtOM8jOyz91Jw/5k6WvktUUz3BcqEBSQk1Km7OIf6P2ozv +Nd45eLV7o+2ZijkFa+rEHXgBMdVdlV6H2YhK5NytVuwcXR4icVcYKQFgkkJO +9qe+uVSbNyLmrFzte0icFlcB7F81KcODWRxOd1vzKrWG3Hjmo4yFKXxZuuW1 +PcO4Wgjsd8M+OVmMxE8LC4Yf2FokQ9WI3tp+X2MhRFhJ5kW5/KsSYC2Y2vPI +MOYHOyLHLW7szWcUXvP5RJU+nE2SRcpMUfRgNDlJckzjnML231FWBQdDmSRZ +q3ApPVcnzFnBseN/lveOzBMjUDiCWJX6z790AT2f3COJEsIBObqsXwp5Czao +dE5HF4SbXBIVAjqrZI7AG96CzgsC5zONC2lyWfJ/C7XbMBJIyjqqKoucxjLG +3wQr1JPt6V23feyEuvUsgIJ3CXKoUsC/SJl5dliu5bn+kFj6Lqi0cagavbz3 +uJIuOgwc7GigU/hgvUUnZsltQNfk66yhFrENDdJfRfynMsdCjixAfHy6NxZq +oEpKamMQem6DyTHnLopnnwqiSqBRdN5a0rPYtYbB044hOKeo0aUx+1SePauY +JrdJnb8GHOUnLhN7/jhsca13QrfAy1EjFwi4Dro87UY0oMuOORAbye2r4Vng +vzPPMBF3cXHBLLv2RJqDmxqWQfvfkjBjTKAmlm1GaftENdrJVTA1yinly0cr +Dj4aEjzrUUciQkMct+DKW5Zl85oSSgotg/WNIYAf2c4UFLz+alnSEJRhKKwB +llgva61zgcKsOHegLynRGqyipqrUFNSdyY0YP6C7mR3T4jIUNYe8c/H6KiUI +/uhuZANbob4TFLtiq7kbxwZFaxfgWFKokIxQwzY1AGOyThVNxOh3y8C/k0Db +9KClzaPfT1OCo/Qwl9JCeiUAkNS3P/xsF+esQqrW8QUn1V1dCyEkXjkJEhbB +eCPzt+O5teaNJPER21zUsJCYqJe6MSuxdF2jFR/vXctHhos1D51Ru3F8V4qX +3y+ITkZR17FCTAAAgQASqNmTlSnwsjujS4nR5arLcYu7Hq/agNzdkjVz+HO+ +JDG1nZ+fzCjEdenwFJuEuLkwLJZrgqrVU51VGl1/nKHeNBPIplgz8JZ9sZlP +faa/BV1l/B3pc95IH6becNJLoL8D5PN+0mgZpHVJwN0YqI2cpHmdeBdJT3I7 +7vIQ8syaMI1tWUamSslUjcRyavTyBXOc+EDPlqOVAGiZwgyiV4a3Lc3Bytz9 +OMs4+fQjcxHMRbIDmLWODUhGGS8t61GX9kTtEraYkbkSz9/JCkom83oGBNaf +Cq1vtRLhVtfpRtk3q9bRMyRWhRgjxeP+fYVHkYnIKErO+AnXm/Ns38T5ggnz +FxrsoZ9iX5nLGMUfPrYMiOaLPe/LnYWEFAN4HPCJqk05ZHFFvP46ArJutCLG +L/hDVAJPNEzTce8pLMXFuiZ6GuxnDntfx5dqyhpBAksqVK40lk0CAjWh4W7p +SsZql4M4DNCrjq01vHRt4VesBlkEQiHk2HII/kppt31knH0FEMYx/QB1tId3 +nwVO3GwB4IgpOUBh1InZZG2oxibflfWqeoSyEzchdb4+afnxy8/kwxDX18g1 +MyAiZiZ2bDLYjjInMrvjLWSFMGDjjnrYe2GHRw0Ak1nsLAcDYKpnNiC1qjrv +HFuhuXZbZ0qyTakpNlpPdOTbPdkRSWhrxo97TJm8dhzYUfRdifpVH5kUW3xa +N0/zjOQ6C8zbLL7gVGH+exojs006wMEduGVVOGukWhalBCnbLL6mF8kuwnE+ +csRcJZ00TGyV1d8p9fpgcNPFOdoIU8DacHB/NGrzIm/bvybyazhpm8axpgwI +QqAnUmdbPWYJb5C861x207a7PGWCVpEncwPPKbwJrKbjIw5ZY5AS8B9IjsMC +nWG44JwEYc2Wb+shvwGuZSFJ0z2WsoFCuVw0ChZuIqT4armO1IFO7LBFwMKB +ggGR8T+8BDOPIvFUgrZySYFA6QHPGdPWyPw46Ehxwkafrz5be+c8+Xos0TFC +Ih7/jVnyp1AIFTNmm7NS3f+UtxAojExGKg8V0x39k7uLixCHPGffh7KjTSRL +4pVADANlsXxLMIxJ+j2Cao4GTahxKuLUHi0oXq7Y5MjT4CzCPmQiYdKSQtq1 +0VAUvHdawGU9qmKxS9uoZRO+LII4j+f6ZvcnrCO/1QuUfT1+DMrd1h60Ywcy +7B7zCkA3vbsXzoIB9Taq7an6ORzTGcfN1Pqa8IXKPYlFx/un8gzY/crCkw4q +OGy6eTgwqllUMi6JgmtQpNkaCEinYjQnpjlt3sXnJgwGLNK0rsHhB0LsyfXx +sUNZJdjC0zr0Jm95sZtWhVj0Bobi18A/aAIjD3qW22Sx55qIVl2U74upfPNq +MdOiQWiI87KC0SjnJOp2YJWa5ZnU1lsX/fFFs9mMkqtUEeZNxHdDDqvSXOQo +N4uCrpVPbP+Afk5v0l7O/kTxz9iSHx0dtuFE05YtNWXsNYse3kst5RQbRP5E +xd6a9Mk1l4UoGPvqga5kYhXz5XV043mQOQP7ZV7nEloBZ7HUZlMgzh9+F67b +sY8CLbGLvqrp8wcfAEd5sPE++C2Nmo2d0v8R0efW2oTo/WK6c7wgQ9BK92Re +CeOaa7EUfqWNkf6qTSNcprx6BZy4ehY0CWC/H5/hDJQhVGznwKMGkFezNEJp +VeJSrYcIoaD2D97XstRw3+H3kPUiQsWpq/SvLYR2i4TKazB9ULmFnltaKYpJ +mraKvpyMsAJbxObxFI1/KX+q2Y38Sy5p2orJ1rv4wzXSX4d5d4dW8e1gNmbs +fRK2LySDitXKkyV5AcfhNQFa9g8JxrbxvDQOCA/or0q+vO+0PlhxWA2Uwxfb +vIfGW7fekOHe4rrkevE5z7OYoNVhuZ/xoNhxNPFmilNRxPYCpsmdSNBIiX8u +z5R6DeUfJ2IINv1+S5Z2Sl8W0oRD9e4Yy2VHKje+GJYsIRL1cDBMNvUjzh91 +hIN2uGVWaqo0KXJpYd7UEyMZoCKNALqlgxMefNrjWMVfv7IlUrGfknDr3pdf +uErjL0kWgfn0JR4y7SGccO2XF7blLwzZA9pXXifQp7aEMkvVgv2jUjS8uoIv +Uu6anp6XmXUGNsYSBgDn0g+yfOBUyOsc73YxzlFNS7Am5Bl0B1cs0BvhSpmA +5SpzOijB54ye/PzSKoi+2pvDF5E0/ywbzESo1UcKZ0Pvcqqmxo0ly4J7Eab/ +u/IXlJ92sX9MJSeVSMAeLEOyExSwNN8RtD10WwEFYYwpBve6IE5tI0AkR7gj +48+j8dt6P2E25XFnbfkNpwmRSf5Dj4NreGFnmxAc5GQ+JmyKM20aMqKhd9g6 +TQ/gXXg7S+lxi07L58e3DtfpWgtxGYMQx6TOLWmecR67ZkKFXxPsdKjE4tCu +2dky5ZZ2tw/53qGrdelWGDxczAxsZZo089Zaf3qTCcL5ZX3BTzskFB5OV3tG +HBUEdGkljOTBDZVudbPc1RcbMpX2vc+tuUI6MIRLwfKxe7r+5Z81dhwgzE4F +YqLTiz9G20mSD22DrnHU10XjuCfn1yx1pxH1GNIb+Sz6Uv+kdg+JR7a++tMR +7nmfrEdZKJ3oj9chugFmTrBmpSG6W5WN7tAXH39jMxYVJSSFveA7MPTcOr/s +Hy+Dsm3nHiO0iBqoJT3Ie9KC5Z8KchHsQp236skiwGqyQhKv93n2ft5Reykh +H4uX+rN5NTjJRYijh76OAT509LE5bLSgybFFdu9JgNz+lFf4Rp2c9+OC2avj +yGcF0f9uykoVkbTIUWlV3ytQMDfQKGr22YDDxnLXt2u4qQqhNWmkyIhqwcd+ +cQPJr+bcWgKW8yaywvnU5ZYbwyclAkRx3YZdzkBpJWYp/5s9/dGTRADT1PG/ +vY1uYOzMXNXkVEH0Ztchf3SeTrgNVU4HHgJaKo9QFfVjx2DnXDXtAbyPbs0s +UXy9X/4xZqm3pSAg+/mdn5sE5dnsVwyREkv8zkMIzDP46a2VxTe+onnNies+ +a1hgIEhgj/dqfxsdU1kjznjqqqtl27oUwFnJ6nd0K3EFa1kegxdzYof9Nfxd +993rQSZyDPlIhRBtduweISoqPlCof/5dkB60hr3vfN3whr0cAAnMHk843NSa +paBjdSi11Vlxfvj+0+Pxu9nhkYo678bZArGOoFjZ8fb4I3V7FpQCZrIXwdeH +qEIm9lpzUeKOSJG3trd6Sd5zpNKhR/DOx3GjLu3odZ3GYzNTxru9cPWKVcSd +OoFwKj3EJK9VNAW8oWeWj5YFgAKotM3WU9DrBF7XFJGZ2/w0ePsISodcuKrN +vjgpK7f7xxL4xhwbjNieUNslZ3m5zhE/ihEJDXMsUVGTLHuu9EA0i/hXGPfT +05I5TO/CmflKnOOsHTiAaT2t4vbwjqSdRP5lyhC8GeiEkYo73NUKrmb+zGc7 +Km+LND9qtfxhf5zLIWFsWKWfdjBgdcwsXtFYJOVbuA7wJylDMRiXv1OWUF1m +czpJzlnpG89Mh15cyKcrjDGOpYQEAAA4CCuL24YstG4K/PVHxaVsliGTVmZv +0YDBxXBtfDi74hiZx4r1BLHHNIAk+DRJiuvz0ouacQzbvmUHeEP5HdZ+5SoP +cIvB28HzUHmAf+vbkBB9B5PZyNYTgI11AV87ITXB1KE+Z0JjwzHi7nQgJzK7 +D5maOVBEAZKUVv+kPgKVrMJZmN/JzNA23IO97ChsB+C3UUs1DYwouteJjn6S +EK93W7/40QLexEXif0iiPvNbK7hmznFHPtNWFakmMjiFZ5X+VtPBF++l7HGo +PlQmp+sopx1W3VSSZCzSyFYRJ8Tclnc3JFkSDkI/P4Xaga7xzPT9GkpYy4/G +yyuYncP5Sm0SbkALIHSfdatKVmmKGeJkjYZT4aFe799a4z817ptP9SGBir5X +UurNCkRGgwBVcrF7AGZAY3WlZE3uaZq8RFLDj5Pw7AcSN2HNcRtumT0arVHv +OTgSbp6Cl0Qn4Ofpoy848v8TM/ve1qbbk+HeYZx/xFsdScYNT8DVK24pvnmK +WVmMpJVZ0XhnbKgS3RMGChPQxidE6CnyVf9SNTXvO4/9TSOUre5iopdB9ROG +DgZ9WCNucdMFlPKYNq1WuAdMLsW7UdNF5Z00VeUqXQ5L9A9zEq9vlNzYA3bE +q5y1a2rlJ9EHei2HgtVdaxQx90iP654LNKkzcD0j7D+NfeyuVyTS1BZ4tV1a +5wFfWQXhuwOnFDRceJ/hk6P0qb3TTpGQ/d4/I3VLjobpg6z3ULFOBkW4pgvb +1W44dsrwpAEroX1W6KPgwpdCWIvKHeBAAXQ1IkKmZ+NZi54GuxuRIM7a+niX +WaaPcjv+WBbdl37MCAUuQ1H2z+jDkuf8Is/i3hg+h9C7OdN8y5ocHQ9QrsQY +ytVTm6U45DbfuHwNZMlSRvu6Heg2liEvFMD2RKdjuOXCZptVKHQnXYzCgdGp +bohIKkBUL/Hiii8lqQh3Q8ovuOzu33pPo/g2EuLnlNdSXjqt+7brs+KTUmBK +h3Wx3QzxvEDMaFM1KCxEP+L2uJGN6VoY6upLOMFFAtjrRKJ66qzDDPs3mZws +i7+P/GjGcH0J8XHa/E3g3PjUSdGN1atY21iZ8ik1j7eHWiKqWgX7sdmERwZC +vWaOzV5hHiieY6CMsHLuZ9C+FRL24hT4nQENnfKz5pSjU5fFwz2RBLg5+Lih +1Rf5EKaFzfh0QNoLfkxwj6DMFVZOZHn4xq0sH4rcTZuOopHqpX7wm/OWvv6n +cVrVDoeJ51OYrC+WnwAYSB8pK22VkjVV/VV6BhC1pR4jtxfCzekJ/EGoAdAN +qbPpZK/xDJwwErgc0ZnPSDPHIlEZuntCY6tyhDQB9mJ46pYzNkp6fWGHsTru +SnPljzo6YsJaQPBtbkJWvF1RMmS92Kh4zKpWYvwpAuTlw+hlcY+fbZZqxi7N +XkQiqnm73I6LCZfAy3d400EAAAkVX/EdrpLy3a1JkTpafHMUvEggE34alPpf +kbCaw6K+Dj5MdRzJ1pQhw7yMtrQZZc50gCC2/LPM7Pg84skV1fBoEjPnUmDO +/PnpI/iC0bols2hbYyRcP6EXqTo6jg2btKuBqRLZ6F/fO6fxNIasA61E2P0l +GFkx0Rp6gexGERX3Xy/zrAVEeiLYiusG62r4NHWXXPVeKp6lgzKOecLuHzSM +5FeOAqzHTDAbp+hs9Fga6OvtRrLukt3hXqMB1CAcO6XgXmU7uzLovTn9BrMR +4YuvYmYmMaq9vAODeZ93Auhr/qzj+Qm1YKGx8l5nDh7smYpurAYxUk61iJ36 +mvbYZ8u7oPLJKlepuNJkhvdEh/r1SnsU45TBAiNKI/6Lakbzm/KuwdAb1f0q +pK0NbBKdI/MXw+haYmvOy4MsTzjgx+UXgy6OR553Hn1c/W48j6wxJNnzOEzL +hxdHOWvmAbPCNjPQd8tfZ5V3aNuGrMuEcTgdHy4fXSoT5x50hFlwdRtW8g8v +q/LKUVm8XzqzONtbXGTVSg7xr52F/g93znV1FSJlWDYYpK2FsU8oJBC7QDn+ +LwXZgYEw8sEDMMnR7OW5StdoVEsU8KAojNTHOftC2hZbLww2kU0EdpmtIBbW +VZ+pcpACV1BVK5XT4IAYQaAXcR9y655MEdZB7nGB9ruojkTc528TdsggbJ4c +HNx3g8jeblwpJ/RNGvzpCyn4g6zld1cGd5gwO4+d68iPXDrrPDRaQoCwThuF ++zRMlANxUfNzBTzyipKJujVdhEwp+c4h688h3mmKOtHtUVVrRoif3UcfoPQ9 +y4hrEDnzNfnMzzR5zq7AWD95F/tYkoeV0PO5l7OKhQH15TCLtstC3AQkKYe7 +h9uE90UXRObKgG4TYSj/UaUibSYUIbpEGDwGH+McZZ9B08NUu8DHm9gfhIx7 ++iffc9VojyR3cxb/MSCxm9JhuMG+hPcxK15t6A84Bdu69yiTW1CoCeqLP7fF +nHsqjnfCnbzZ/h4B5914A4AApQc48zTq3apu+vid5BQaxE+V+lSMik/uQtu+ +an3J4drc794p6JBb19VyaOnQCv3HycClZLH9jNwZpMzlOAH/sAOVGnB7LMgY +EmY0zfdsRi8EpMsJZw+ZgsIVwZDYYCHPR8qqbKtud/x0xR2PLjsDmz2IJJXk +kiLFVAqK+uqc3DVV6YVHzmQPvH79tzc0y4j302n+/mdOy4YWRc5nh9U9ZvYD +2OQZcoOHjv7Q+ABj+ev079nQ3daC1vzMwAW2Z/qPD6LKI0cm4YX9GTqz5z35 +E8eE4TmnLc2GjE71A3FFXHlTykPX0dNuobCgOKdxzvPqtsOhyjtWLdbpjWBa +nVoRFaI1NdAZKgit6kEOD4YvEafVIA8UzJ2rubvTTBr585J7XJXNfFJPIkW9 +Tzwbmu3GZW99UvzDW5mTxPZAyA9AvuvSt/9vcnvyLx2BJ11DhU537KdGatze +EEs3RHbDJY/8Tei4sSWAV8GicYpcBostYlXrXDbrIvYBr5RVoY3gavo4ZoVH +nGEgNiYWMjkSO3grihNO6VfCBq2S9IGXfGMCf1ZZwDval7eofIbYZ+UXmgfy +0I/IeX1dGICMF+QgcJtNEXQ4ct4aVRQ/3hPorVlvEJfmn1qx9yaXO+mPuh7P +QT9dhWJk/dS7UQqx0+MXZYc0g6OTSpuMI38f1MzXWFUP+ZHRC/M2VQoSXF8+ +T1WARzZNdMuxs2qMUl1K7KVuRaHYVXKEmJ+oMLJrIUVHR5muvZ7r65M/GwPX +7qxi/lzcrdPJZ/gUCAA6gfg+NfB6wAtQA/GSSMaxC+8HXJt+8UJ5R183k0SX +ilupMdLJpbFIU47xpPnOdEbhjqOVDB0LOkzCOHj9b6krr11rclUyX17vDuwt +IXdZ7PiH2z0SOa6+qErTKZjt7Ji9FlCU7RF9UvGjbi92VyLiHLfzpSNMg5tb +rSE/vF+KUxvNHvBTj38q6lKENNcHoJtDeSMUBmYq5mG7Ri7v4F9EFCV7cJgR +iY4nc+n1XMG1yhyXpD+RQZpv6apQFaMv2O38sHrifyAcRn3paInZxLU3ddRu +6E35z5ySDPFB+jQDWyHiUPei/Ty5Mebq1VVcuxxOGoNh3BS0qoREvHrg3iRW +afn7najsFd0K4pdQY6O5LGq6HEuGnrj3jPTiNfR+8LUhmmBIIWR6vFUobiku +E/DIBKoNYB5NMqRfFBCmJbgJxBoPUHPQJq9YMIJYY/doPWYdk2QVSys3rZKm +Kwbcj62V2cP5URPV62ER2y5Wnv3zUcAuqXkEC6wdpfjzYHUIN1QshFQb0bts +tHs+sOxCbMtl7T4ApfHNt1YoKhHhTuP5gthoCfavrSrhrqERqGDPMJiq7p8+ +7YaiOf/V4RqTdP3tzPmUPBFdXB7+uldMAiihD5OrJUfsOTzMdHgzYtZ8X+Is +ADFC6n5gqIMA7jhmCz9ObRg8H1ZzzvdrMQAIk8C2hPC6q317uusTC/N6lgJV +QslmCsaHayoRy3oBWwnEbjoOQ40X3XC/5A3cSJKwu+ToajeT6xzJlrKPcyzp +Biy/cZJMG7fZv4OUy7Dr4vY6H9jFZwu1uXUKmiXqC6u0nGbU1sIBBmYKR1TJ +6N49m/IAeAcZCEQv2YLQ85pmzUR/6JPJ6UBELzDX8JSDAiQgq5EPk2VAGDPd +fTHD0+GETTWZF/G7WY6gwa6qKShO1Qh6ioPMgIBZOu0npFqYDnV9EpYpJQn9 +bx1ZdJ2arnIDgCAda/yQ9vX345euj3whzISn2wSrLdjEbNjkplhWyRhpJys8 +mA6bzQnVA6IuEVWO9wgway6sFps4jP0Ransqnxis7aJYIJyb3Pm+es9IL1Rr +1WJvZnjdDTPX3QMzyi4lvHffHv/+1VsenE9GkouSk6pNOzwgCNG8KXnoXnNk +3OWnGHRPLDkdBvijGy4yhhYcsfqa0YkQiGvh03hNbGtffZXeOLekBJihm4Ex +GWX+HtHZNG6c/228rWPn09ouYzOfAnZcBm4yGbRmhQljiysSSEWR84RP9cP/ +9qYro7Gl0dgdYMCZxhdpT/7QsVB16WqbhLKd0AWJ0ESwUDumF2h5JBDlBdJW +8zuSrIsoKrrWPibaov3gUwd7cLFeXGTnQGtegkuy4CzCP6TV91t0ftvFGnYZ +OiXVEZ6g/RD01VNtCNKP9gZQbsR+hJ3gh3fdm39wWhMhD0QLFfrj86v9kOxF +ulhtJCVo6/SbKm9eKIU6osYlVGa5uDNBq28mCnj5MEMc9kOnyrr4IMN2xH4s +i4R3HUrnjmPSz98S1+OeskPnX8p3m94MfdkXSsEQa/LHpKiQzBDAbGdZyVeD +44ZltaXgFtGVETKdGQAuGgHeFR3XQlqWbKlBVf3ppvRY7IRMTC1dgKPggsoO +eTcdAJ/ajU5s8VBlqP9rGdXwKm/uDg5uqbr9G/bYvNM7okTdxDwXJHPiWIOB +NhXkQaKzmDzI0dg8dAe247EiLUPG7cylPx8QWQWOa5MYVNU+jAhQ+TPbDnIX +o0tF4TSMwyoUduQwrsjsdWyGYW5fRB9dgF5VSMDl+KqMxk97IdbHVEs/pdRh +QdzgOeajlls9ATmfIeAtlpyKjWOkcalRSFPdiV1q7Tn4/BKz+njBAMJtgJid +Uyy6FtZwazffHDpvbELOX5rX8S6Y4Co7qKt2Z7tYvbH0Q0pnc0nI/1wl0VQH ++1k5ONLdUNsnxi1BH8cHpGAgiXKlUK1UFarQwBI+ch7OJ+oX9u34zqN9PhcC +poiwDm3ffDifs5IZie3FSUX0F13dZsJzD0XX5/QX69ZzwtTqJfGeETMRUY1Q +bYgVSUlCHzwNwSFZF8IAm66xEmsP833/CAlJPxbIciwYGDEWoQ3/nHMRToRJ +Sz7ZFerhDOFFeebCmA04tz01mDwNwTwK9BRlEVmKaJ1Gs4R7PXXl+MswzqVA +6cMyhf5v246TxHpXw8HU5zkG5nw/Inr+YBUTRhiRwJBTpKCmFTo6Odc4P9nH +iwopnPe4+bO3sp0WhlOSlRw8J2ksSWa3H6CjLqhD/fmbt31mLwAWiU4Hn3p+ +6MqrjKBZpp8It7/yh9Ku117gEX52YdObjR/6k1EVzZLrcM7edSAQ/uWIEuau +SRx+By78mYU2GeIhxdiZv4R3W7S2uEyh5w0+Ygac5JitPCYDNf2VyczR2Qq6 +Axi9EIzD2Mc4uOyXRYa34/uN/RoxSiJzPBGDyjtDkrCfbB9yUXgTMuYKH5m6 +N+Ljrep1RJy/z5qdEXf6c0RzGksICfIRYNYhhfLDINLvqFEdv6As94nFueud +i3mo8wiGSnXG9NBYjl18+pvlJt3hUztLJuMd9BvbQofPAtLl9MdquM595zg6 +BrcryXqooBg3CFIhwp4SSS2LnRVAOAkzEhIjKW+TQ+r1FzATLczdNma+YmiO +rw+kXVEJdcnQUnhNjPutrTXHKk3aSS/vS3F8GSFT0H8SKsTGg6SyJZIp/y3K +MgdlHE1v4XOGuoZ24OLaqEkh61jQdkVlQMstKBeT1VyGFSrfIKNtQOmwIhLy +rkaLSJUiFta73dHrXaj1EV8l6TquSazOZH+cxnhiXGj1OEfRwrnjxmGom5tB +q6mvCAGuf7+dqGV2by/5vBgIUZS/YgSEANAPQYAIAEVvoQCbBggX+AwAQJoH +Ymuq1kKuvojg0xGndkO8pggi9rVZ19igN64uglWiGiJ88oVI+wTafP2/GUny +ze1n5dnoFsRbpbKh/7HxwckS0OsV0bL1ltxmNL6qTCNWcWd00v0CQHan1Wws +BG4yVLEIY/bcxsh33jx6p0ArOcsAWeN9+zXUKRI7L7qpJ5LBAc2aONkV6f8o +nhvm/39xa/dyV6hHVKLsA4jT88OsSSEfl1KUA5kIMqVz+MTqp8m6I8/P2lOg +TB6FbdY7tBNY2uxnZFMLmRCDrcJtxF3R5o7rbNsRsvybJsIwXFKwrIvV6O2F +7cacTf/rwAHuEIY6xMxuTc9W/lZDlzQlzGLF+1n4CwYYYehdkGE2CzOozAa1 +oaABMJHCEpVPKF161hgAL4XqdhDAUe9Wpm9j4cAmLnBzSrP8sF8I+oMAA7Bl +0mtdxhhQFZvi1zrNSakWxOpL1IAXNom0dkjocV7yJR+ktkjZ7okxFSXMUlHV +daTVOglwiTVhCjrPBeWiXMCqDkm1874wJPe84sTmizp6WNUO0kgymSZrSs8j +0x4y48hgoxQePEHum6uRQK7J51wphqLV37gwDWLs+rU/bEvflRBxmJiGg6bg +HSRSw7SeM/7iLyCM8ywYNstJa1j7dmlKFd8Tye29ItjWCFSEysO+EMPDZR7M +h0/Xmb7MZG7z5AzNGpl6g7k2ZHEvYPeMAu/uKTa5eLH6XmQfV5arhtRxk051 +DNdoiie1dhenHrNdGns+q789dRrrA+oUR0nauWk74nI/Nr6cJP4UGAQ4+rZF +iJPuLXa9VEQpm/vsmnqIsicrb8pWM7eT4HRuH3agK3QZVKi8e8Sg/kbRZT66 +kSqpwCfh3NOMC/QdU90JESL1ndDan6hQCps82dAThAgp6a3Wv402D00f3oiY +gI71GTDLaHilW/Y3bZVkN0pRMNMcd7DeArHwv76bKAW4cBPf2n1x5Sah7X3U +YP42G4szmJLUrU/vn4RN9EMs6mi2/oMBd6fe2QnKWonroAZg/Zi6BjCU0KVm +lC7OPFRKUhl8VqwJp+zldjvGfwYH0h3mK45j7+qhN0WPy3XaU8jWhi2D+fMU +qwOT0EYV9iE55OTaSVDrnoTmHpALTt4oTT00k531GOP4y33YTPXyTdmFkCtv +cb2iB3ozkYxnanzO0J4I3fCFxT3mM5ULzSiDVHepQmtS7YHpysISJess3ljA +ummj8FdRsFAF1DjiuH7k3DJs2sKS5n96E0mj/cdK+M4klKvEO6aV6e+yvTV/ +hehZeBbIzj/Z+y/oTlUSrQ6qcyRj4YI7jX/bBhWS0zUt2CRdK2c9tEeldNYP +ZdCkwWTiTwPLubS9VvQr0/4PDxHIaighlOJ85/WsmTV0T4mWxoDRqXvRjQw2 +biI9vEiNsFP32OZPvp//LHfzputF41AnHlPKnZU8tK1av0IkXfp2jlfj1bvM +Jn5yS0dwbRjNsHRF+AC3dKjZYx7e35SbENJqWfXEnkicawvzJtRbJicIfrkM +poZwMc8eRc5Olh0It2yWn6DCdgrRtJwDPguBAbZ0wT8/NjI8WW+PTQrZ+XWO +aJRw3feibXZcvukZP8IMNKYrWJ2rM7EbwWj3Sws/0ztDlPe+JF4Vcn0ecsp5 +K3Ioy4TKM0VYcWkiH4xVOqJzQX0huOHmjCFlw/yZ7Ak8+lSA/aDww/jjSmdk +xtshbzlIg44mb52biecZuPvIM5G5RHYL+KEcdKlEvjmhjvl0s0KSp/Z2DH7Y +eIm/Cl4m3/d7z++tbhPzLkiMvHZQYk50elFMquVqQl7z1gDzpVybRza4pQgU +KgD+e36iYkYltdeqZjVDUjJs5Pb/CBPkgDJKk0cuw2kK84yq6xuQINOkkN8O +so2t7mETpVH4qs25mi2Or1Lrtca53mTRznVJZU/UHc1AEFZBo901yl/O9n4o +jTqAporoTyiM11jWiZHm7NRI58buqRio3kxTQMPZ6IptMTOYZVdoGb+R5ONf +2UJGQpGcVJQ5X9s2iGI1yoNtIHsAF8joPjyKv7O2hKNIzQZuTimH+RJ9pQVP +fQ+VYVTxYJn7Esd3NsaXmDSK//ShtjziVhYEscowJSDrALhs94UgpxKEr7jv +/KHvtbumlcW/OgYzRbeob7a+kvplS6wd4l8NhsBSK9EOT9qaOQOIih5fG7iz +7m7wT1LDMu36+WGcgiahGABnNZj2KgJoRYc2i9Wd8lRCORcXt/ZKcCv/TS4h +pIzrXiyQClrRMG1kfz7otGawDqiL1tSUgFXdiKM3SZ+zfCSLERsBqqCFQpCb +0YzKCAINmPsAZ6vAw8NiKN3lHxTXL0ToyXT4ZOmsYpOTIIvVGFrpzVc+6oY4 +jZ5wintApUXIW9T5jlP95+OOA4s/F3fOSk03/2WuXW1t7NfzZv4nre1VDLUl +jfRxDGdjvEgT1mUs+O05Aybf/3ANMyaMa1hPrWAJz96GXniPHuV/s7MmWFJs +XQalAToh9Mpm/krm8g3Tll9cD9dJ1xVU5HcLYUTsN5D1pnvHqa2Q1zPT4Pje +sgAydwbVLCGY05UhByZSaswvWvdyHC9GYkJedBt1BN/tGfhUaSp9j8Bwgdi/ +/mg9UpQZpjB9MxauZf7nJUgmWphis/Q3NEB7jLf2Kl5hgAHL8Y2o7lPI5Mrj +rNN7o7F0YFYXnViiHRyyqKC45I5zvwWWJQVqqP9voQjX2tznlRykQt+MObB/ +ZktaXQoTl9dBtobZ+TwKIxGHREhyG+oAFAd38EAkFyJnSxGb9W3RDjlLz4Vp +nK6H5ONfW/St5hJV6Pj29JJ4L/0leRmLfA3LmqviiqKCJ8YH2hLthCBImHj4 +0xy/v2Ee22KJef9OXHqvedFgbJmoEdlaukVi7n9yQrRa8lszjY65+k2VhpZp +w3YBhk7dLy10EH1GpKpbibB1djfpoVTOvnphi7voSJnB6k8VHnrDijM9GlSP +ikdF5aFZpvpb6nzpH8Wa5VWvtTQV76igICV84fpSfgZc3RrpUyGowOJeib1v ++a3E/R7XnkAXjq7iNr8sv9RZ00f5Z33Yb5CotndRJvjUQIjKGXZeoUstq2Jo +Oe92TD/g8vKWBrRFaHSR9fInKzw/Z71wvtB8rqUdegkYdAQfLWK+Fizc1zkd +d+tMc5ODoFhrSek7FC8+3EmnPB0qA1nr6OM2fGR4n+VdMbGRT2GeMDJH2j8p +sr0CajU7WwwpdB9FUnLruR3enJLdlg65zLz9YsBrBsaWtKF3Kkb0qKwiV86R +OISNdP4S/ZCudxKR06TPiwQ6oXlu1XIWaBvW/JYZp3B66sGgKTjaLjTAclEf +GnO2VpjOpI2OWIN5VG5ibd1XxsFF8eIMLI15OyP1aX30WM5psWGjRDTMTv6t +2l45Gqg8xDPreIOFdY77cC84zewaS6HahDkqfyPF7rDQNeDb/N6N6fQk8hwc +USfK6ztykhTUUqvwA0M7QM2WxsEq9Ovrt3K6vtzMxqdINm/ti8Pb799jfXue +EjinKddVk3rSLLOC/Oc5NEAxZswVcmcaGDQzS+1NNIw7bfnKMVlxYaXH29nT +1PkKekB90nOp1/uVRB9ePGsrVFnC1BJTmVw4mDaiYb8zc3j6OyGKFC/nsVRz +J2BsmYFN35LRXchqvRiQ16vaj21uzOmY3cPSJBzs0hsQ/NoBIwXtQ4TI5YR8 +tE8uhKe888bzjJ1f5jvDJUJw55D9HmFsQHNnfEqtH05sKHU/7DcndrhhOohu +3JV2lJcrOHx0UhYTPPw31UX83kx3zeAuBwa+XotdEMDPlN/muLCUKqcm7Bl4 +SzZklpqXvwDnbvUjjGlHjrxHnaDHK4aRiqH3hNu7amD5We4vVS/SBpm5gsGi +G3x1+spzKpvJ5BE1rNuNT2ZoClVlg22NKJO7T92/g1z0L2VkijH24Ykn0Gyx +COYgA27ziDbJjch6GUzr6obvCzP3mkM+HRKyAKEXICsmvd119gTsZlNXY89G +ME4XJx1D321nasXaing8OS9c2N530P5M6mLTEvmlUZUnSF8OxauVK+0M7Z9a +8AQi16UWd9hbDH20VKwzb58hVESPTzS80KCvgjECEwssK+Wx8OASlDcibfuz +vZZOt0o1fYlh0h37v+F6tzfFwt/ja8dFUhOBAXwuroBdT2yxthvWQt8DBfPN +bu0nCWTBnWyIReqPJtddkObKV4wmOXp3RQ+bmtwktwYlyMor9ihw0ESmOpUL +54shEGIkfUeZF0fEklGWxdjg27olFUoNhifk6vyIS7t77Db65bv5RjD+/0mB +YlWh+meBaiTJXEQQJ09qCuv0Dleh3hjs515+hzR9RspYn35RdNBeqmo9HfzS +SfNEsZmLupkOIZnCC2dHltv/AWFuliX++xj36pfPYJKDNdZBAFBnhF/yuHB6 +AxqdJXaSGYgfvULxb4DRZbN0bBWd+uzGFVmQP4EWfpMBoRKCAAAs+QQqNL8Z +Dmflfn4/X9SEL7f7jxEnRLKVcMW5yKEeFn+Bd5xyv60bt54rW8OfmSnst2G8 +mljYhiTJyTFvkhkPfX5gf8eJzLGmp1E1cpWe1P2dBSct3+czu+t/VdxyHgOI +mEd/PWeNeIuT8t7pk3BN3rsGEWifZD8ycCAeFHo6wrBRoSVEWqMlymiXKRYU +KGYYyijZPxxeRQ2ipzTcTw/A5LXG4wXlBkdzzvTTssadxCxG8mz6kCebIm1/ +sy/PcZRy6pCKYZKHRCFipmytf5SaB6bzAlTZjjofZvZvmIpI2J9PPYmnQAAc +h6twAUYQlUCbfa+Wst8pLvSqedk/ecyVUbiMT5kOtYjB4OVF3Q3tLAuz6K0F +EhvrWtr3OhQI48Crmnl4xTO8lrmlgGXL80rum2cawYu+x+kgbMj+XNFoSVc1 +perQGojcTYvnrwv4eI+PzHd+Hv+efx1GrpktzN0OzIA0rfxn3rB8EyGrTVNR +RTtHYiCFABeIrc66lg2PWb9jP7MeDabsNoskAAAAZoVDqOEXe0IIWHSZk3OC +T+0roDJ2AWjjF+mV+g7fiGHfvwzHgC6idG7h6aFWAXNbIiIUCbCS0jPSQV8f +m67xTPgS9N+4RMrEJ/O740YvAL0Mf6IQ7LKcBvL6+c+9LaoiysCYA/Pv9TY3 +DdpvURXM+CzOrjEycJxp81kiU0JRcrRjG5WY1aeYJ5i4WjEzx0IxVyUlLCwe +E5PIETZgAd3WCEspxCwQUjacBI4fQ478iIkTY8scxYnRzKGlq7iGyamygtUk +WBH1OYdu3pYreaNidFbVJBelB/y8o4veRmy9mWh+fxyEDhtXN4sj+j7TJwlb +8T/PjnWjaAkFqspRT4TqaKVxohWcC5iokvH3BfmPXfjc2o8kIi3NSg+7Ys99 +XblowBhhMDgajEpoyhbbxAwiCh2Up5FpELukT1mn1hC9YQ4w+1UlcTRBWbS6 +onjp5QOTNVktTooXGEhOkK+3gM1IK9K2dULH6N+TFcp0CcXeRmtGo2L7ZYUp +LlyOocvExjskdRGN5GUlArsDisSXxEigfSMkrzxyzBFViH/dQgyOpTR8AABf +VQnAobYPLLK+2uyKmMan+4Dscw6M8d5A4hQ0+xk5vl+FzT4rHsSDOMGAOgj9 +V6ysVwC7BmF/GFdXKzd1IFKQQg941+4a5QkBX0p70ZfdSDJumXZuVQ+GTldK +/riQdg495ZDXRsNP4hghnov/KCax5kk93BIQ7Kr2iZKkuIMWOA9jOhePMUz8 +UcK4Egdip0KcigdCXIDIYbLrDptowulD4fs0uKX6HtYhVvukIjs4SQmTR7el +x3gqy7wKmza8z7wngsluMy0dGZm9P8OBwcg2wagD8f4lJKvMCD2yR2iIhCgy +GYO9ooGQIUs20xg7l/VbY0IUMUiLzF08MlxTVshNHuQuvH6uJuyLIQ/GnqJc +kxeOJeg+3gzEi//h5MkM3MOq13bjTvS8U2HqLL1qpb+Ongsv5saJepLETxPR +SOPzhn/b4lOM8RUB2YMUm0XiJH4Z+STR6zjXj1JlQM++l5Ojgmrr+lbC6fhE +YO+phTJ2ehj0XWcdtOzLPeKen+flxfkqd86II4b6UwqB9RIXGqaMjUztCWIV +LO13hthk0MyQmeWSEAkl8+9iphwpYkObyWyNaG73aEikDNKZg6wdDOKSzJd0 +6AINgU4hITcuTkK6VbDzZR7pigugbR45GJ/N+n8qooXCXFvxGEwPUkXH2TjS +DKsAHcG8XPOaLncNda2J7z1yw9ZL1EdTZAmJRcyNNGE/Y1KZOuhFgwk8roaJ +SPnG1txgoaDHLBgNEBYygIoK3exAnL6apxmqixFd23i2pLCwzv+DU+XAukxL +tg2wbh94ZuWi/BBWSLhsNA2Xk6qD6R8mD/py8iGQK50cfkDbdsEtsUpLyHfq +aX6x/B8qUEL2/ossGSmQbfzpr7i1xGVMrFFuHcPqGwkXPip+5+gsB3Hqq5/d +1ILNwsZmN4WLIg4jMVWlN2mUhhiV4njQXN1cNYOpeTwRY18Qxo8t0J6orzz7 +HKu0mxMBGoXrOeeuReLGIkT/4Ypg7QQPKx8fhVx+nAR4kJh5uhEreaAaYAVl +pJ+qv9+MsGbJMg5SLcDl2+fmHzT8ksLtSaVkEl6JU5WMQD4sEOzvlAeqU3H+ +NTZHwCzv0mhXk0AHDpXOWSYONPkoRU/ehvYVTZmozHz8q3YaWQgTsOMEhiYf +QQ1YwbuHLfgoKmT2XO6HRXMv8PVHkaIQLxqFTEgq7AZ6+BJZKdaTzFXwmrOX +6WGqi5UZmxpCWSBe3BhwqVgYYfgAK5i3o5k2luy50r+MvfDHRJiJuc1L1upw +OW2qPH8KOLCT0bErz9uqvHi9xtwQKeiBzG19tSDEAkK+HY25LICPXRB53zXn +XcGlbuABLwQQijjyyV6dqxjyVhDdEba6GZJbV2tyFBl4X/fDcVJN6WtX1h0H +GDVKOxGmP1CBChWYU527y57BtDGG7CTMzbsTfE+DM0Jg8SdIYaIjzDr50kNg +ek625xAGkgqMrjyF8cVBN5bqlRGrUdIRuDFWe4fWhAv3ZKBJ2GNZzNbJTs0V +9xMoJlANTLZUh8uUYFMk3dKZacpECikq0rDDbAAaoldAd9yNy5kaXapVDoWJ +WlRr93nOW1gzKZvdnsmAJJUxT96enEpw+w7zGJ1LgFMviZpVx5WBHltbUNDk +wrRNM/ORF4rYy8F6l964nznTCbBT/zKYItkgRpTSowG9EXv5zIcYSYmjpgd9 +HLUndHoNa4xLalveWopVShcEh73bIkVjAefH++GGbcl3VPRRdPu8djmUSzak +yqk9PO5YwN9S2L1qgNeA+pVHgxcTOnzSyQpZ6kCW72Tc2cVPFtpo4LuwRmEr +MNr7bW9aBQjHIyiHkvCTOIRIR69SpkEvSJEaANNJgTvCXiZ+bX7noYr/nkF0 +3WDPTH84uKGttraZ5bTaUU3aLIfR8kHOQnIFQU21Pz0dRHj/WKgR4cE5zHZN +UHIGry8JIoKkZRRqCB6m8zIzTYPm8zjfXUcxd4wXmLHn1bLObtoJBgyigWW+ +s4dSVuySF9dSkP2hEag8kGH29/J4kR1IizFoI2alMQvFw+0BtcRXrMeiDwwF +6gVjZ1CCIkjAQMnZ79woRieeMQgZv9q3iGTFH4vUFDFpXj4WHY2jKJLRWNuW +py+4IilMso2e58xq+4DpzydoXe83fPlKZemT747c6kFVUrLZck74HPeWL6SF +UpuYTHzcOBdupE4GApp6tl5lhx1vnWpHBeLu1GX9Hg2z8RHb9N+nu9imojWB +ipjAv073sbCmrfTJyqtdMBi1KNFi2VTkAx+aXLJLMT83wlu58kiA60P8Q1og +mReVXyqRrN+WiPYdHSVk+/XLbibudrhZdBNAd56FvUHF18ZMKdYuL9c0HNYT +HWrncMZAcrcd5OQTjMMz/7g2zF9cxZrVG0qohgVTfY4CWxFcVbnHugKba14o +MkEbFd7/CA7SKMJpACU5lbLyFqJscEtLpj+05CGnHuAYvUfooR7Krmi+1Upd +bF+sbLVwQxMxxYzJh+NCWZT8B2bYiCud86psY3nq3UBTrInFj7ufmKvbrw0S +J+xFsnujJwTMcU5wCTkX+CEVRUya2F0zMiDsx6/bAAL9pFrxdtOqPk2KLsi2 +hxkGXMJv3WJQryF3h89+qEjeIk0wqvVF8pc59MFVoJmoZy7ubSSepRnOfE9g +i41S8ygP8vqUiMrU4PFWePLYFvWmwWzZDJ1rciTdGhEuLdNIBsRBipKssLlj +r26LosT791V2Fxxkf+iuMIHaD5xQSnDpaKNWXY2b1Qbhjpxj8vK6s4fce7nK +gxpTsmRFG2cLjnVLoTpV8AUJZxa5esEPcS9jNxPzA2jP5feIoTMAwh88sDSq +/X6HkrF9EzdiVzQtfzKIS9OvKQvKjSr1EuWgLLFztNOSqiBw0SQ9JAXqay6H +jZQueOYk0052pIBLW4+FSxpTMOEX28r+/vMW5Gc4QkorUyNSndIUIaPqIByr +kAH37qgxVeyAjCIwZbRZAdQeKsYrW/pSaKp9j1SchMjomhvcFlViaeYZ9ICB +2pW/erd/FiNR02QCvsPcwWIKNSFi/Wj2U+C82HfVsRjMPuXsHKKvT82KiKE1 +ySoFVIqeLGzg0OVOlOe5ljBae4sWsgB8PYjDo2MtP3lIF1N7yEkSUL+kUe3I +TKCOLAZxI3ktCoEa4hJxgYwn/zhSsNa2eCOLE1cEBtCF3jrhXFhZ4o/Ly9KW +g7f9TCc6hXIH2HdB12OJdl3fBVpKr3na3aSxZcKSYkYlLfuSZ1A0NRxZzOIq +fO+OODVMbU2lihOIINSnjrv1s9DvS5rg6wQcm1c3ubbpqnfyXrigbMRz6Lj1 +jaG6wMEVJ+ZHB20n/eVscAQV1M6rAlm1uISHUZh2OafPNHU2VxaDYLYrP13H +M/hhNSKs/pY2Kf1m8S0ccNiQgplZjBB4CrtXk0/8MP9ONpI8xzdhr4gakNmP +f7b+66wds69i+OzgQfEGTnjZ+Il+CPbMU6sElPrPmBcM1tyZl7Xz9b2us76j +M/BWk/o0Qs2Z+vRxZ+7/yUkDaruZkTFqtvmlPZ2BaMScOKt3WgHR5qTqfafp +IdcB2J4Ot0LMeYKsApWGQ7lwq1L4Oc/TCJEesSRJ5CR99oVA5HAqhtvxruST +eOkG5PBB/DfABQBlhmbno5VNYKhyj0af6BTGOr3GEj/JlMxmDyB+HJPpaEbZ +6fnCW7JbMBhQPpHGS/VO2gkBWYGCHy3L8Zri2lY3qy+qwtblJYHcc0NiCEI1 +3pcT+FXYvgg/8iSLFYSbA/EyiDHSWGkygOhkeIp2ZnQ6veF4pKiu0wu8Ietb +0ZCgW0D+R0vx2ECALYhqhC+g7hzQR6R1h6YZPSkTqbLi9pMK/ups814yLnKx +oZADlC/Bzv8lBI9Vk1WlWGWW4PvOMYxgAOuX5AXdDamYT8QHWmVDDmAt/lmg ++OD27/+2o0L1AXqbfhhT+ZKLjvfybiTdEkHFTJpoEkgX4ms7327i5usHLuYu +CmWJsl5p0583fuEPEmUBh3ldLpvKEOa0GflPljCprMgz9YVDu8gy8gZ0RKcs +zSfCX+l/ei49CRQGPMYPg2CG9jKh05m84HUD10IUNWOEakt9Spi9umFteMS2 +W4N7umKvOuH0om86Dw3sojdBWZKtEJoJBqIuwWE63b2oa6YSOo9al75C2w1S +xl9WEac/KZG9f2OeXVStaDpNC8dKoaJSZadowiI9zvsx8V4q7QoDipTItgGf +2VKD5Mi/Z8aGkYmRorLR7LdznzLjT7msDGt3uKpfARzxgL4UOX49T94YVlpR +IY8oputMIJdy0PBug4iJrua8ZtmTupMb1Umoc62dHzWsLabWsEzk3sLcZ1ku +Bm4im5vzvkudrDW3sdsHD3e8dPuYQsDNNdMq1dTnMRvBJN6aLyx5/xvwAmZ1 +k/kFyURmnCRp7Wf7EIvW1OT6HQhLSU9O6V7w3pkXCdIGwOrp3L0xLe71Pmj8 +8J3/bH0i4HmyWHFTje0KaSxC+zalrnCxoV1Yb6i7noPC/Y56lKvWRdz/QkRU +0gWD7g1sC5AmdWUqMCm5bq2SGXq6YDK9YlO1Wbadp5n+28hfw+82k7PFA7LC +nAIpDOO0HiKk0jERZbp8J8OcqyvCVt2kNTRbWSb8+nzd/1KFkrbqLJddbmrx +eXR6FP6V+/i8aTBowhOrrjye+L0zXxtEdy/CP0M9KKEQbVSad0o8gZpjPKhK +oCM2kNYEAOvdRqc1neuLl1e4302bGw7Vj9JONwr27P9jlXxJaaclxVVrzUSx +amyv8VXH803Ga5kY4mldxxXOHYOcJqCqUswuvtNIsRmp3S4Zy3Euqj7yLl7k +h+ej0RhwPby3OSaK4njc9ahsQGdXmU026BXYX6G2TBvtYZphMxoRJ7x136c1 +4LmUCn7i9hxwcmiRYF9rU2Z5gB5J4cng/5h9ee0aXReNx3Gc4JP0TYD3zaLU +KDkzgV2VkUWuR4QlGDLJomNhOsdswLspYF1CnffDf/b5pfz6WLQ2qwGvBx1y +sQ+HwrEoOrvp8c2A5j39a0FfihTtWXQMzy9SOypu3axYl0fq8pG4c2Ss7jRz +LHM5AnQteH0HsngvIHFOGkU0rZnjMrGwBfj9WZ/0mEf4pMrNu1mnqihI3k/U +i86s8GHTl+1LgBBOmVLKA5r/x1TyPCLZVVcCJrQnqPSx27LDK92ivFNiFJG8 +mbdsu3KA29cbk1YrEGNgx2yUfoMiCnMahFrdVcLip67/vDzJvoOaiXxLgkf0 +KK23auhU8XBBNrJ/kTvGW3GZFn2FQw1gYsmIUF5EeSTOR/jsvxlzpnY/eM1b +BM4xNR6u9rCvQ3aKAud8EEM4Qt6xoCERw2UxkCltPzXe0cwSiiluW8laf81d +pynmEuhHFsoYKIi5CFY4vRQUCk/7Mm1o5nX4Y/Ily2k/1Vy4ooy+xtAtczj3 +l0oPUMPz2zbWlg3w2Kfdz9ff4ffM+XXbcZUOURY/EwSFsxG9sItX5yfLs+6S +h1p3IdKxkwlap+XW34mwwPDnLgDf758rAqhr+iPpHzQ2KfwHT8GKnOMTKBEI +NUv3mlfkS+X3jPxXC97/vZlGZ6fqzXVE8jrNjv8/hf7+5utS3ea+S70sVJ0J +KAsx9PD5aqmpzu7xS8WNgpOOR+ZVcj12VRofRBoq4cueZrS1ZM08xzEgDFeu +58sSJIvekPtkh5U46Jg3eE9WpyjVswaciIgaAMUKFgvg+Fpi3FB7f4vFN9Bb +5S5ju3G/syNEcnpfNHNfLGzvCKeZ3bJ0VK4uO63x3urDXlXf7Bg3nzxeM9n3 +CZ05Dq/C41mGto9m+Jo30yKkTA7PWlYTQ6/gCx95EZVQfA4C5FrhxlabdpCe +QZrUB/4S8mIFRTtqT7ipx/fWZrGVapD5iyZfRB/NxSCuhNwini+YiugsIU6x +4+lGDw6R0/lZ7lDGNv7Ep1dntYcIpSzB5hOPm7fHHpOEA/NdU8CQKtDnGHmg +tS7/nXWBkzDLGmwPoxjixNDe3w38uPgAg6QV2UGQLpdolgqPIxnDQYhO0lHl +JSVAMWy9S3E6G2xfzcrwsehiMQbnVSmEL6DV057OxyJAT8WrYqOKc90kG4Jl +88IZOgrQfTyB/jT6t/qVDjX/vljLG+nEN2PwKnRbKAAiuSk0OI2Ms62qZEvQ +OzzSLA4c1Htnv+jgvmVvLg1KGVmx+q6qe6usqH9I3tqZdbT2DbeFeDmLLM8b +oqVnUR4oEuQbSBvgtsTC99Ow5VMHkON9Rkbdrqf+bsox3H/e4RfI+ja4iFYm +rVQY5j8wvQQNE1Ek7ktLFPQ9TsX6MeSGf3+pKLCnB5JlwyJ6pXPZu6qmXJC+ +gkMrPQ0Qqsc+VpH008GWIfkB/12sNesuMVmPCuvHea69l1NHdsq2aGc+AwIf +hQivuxYYV/dTCy+TCpMq2wVkldjR0oO6rMcxRbo6rDG1OkNboPDOsmtVLjL6 +hIO5r6bMwd3+fWEtTpt2fnQi2VobLPjpxYCGlFrHb3c2I6qTmu08RseoIbct +M8OuFfNZuwquZJcFkCfNU/IE/K5oRkTK/xWlVqoKafJNjIjipzssJ6IWHkN0 +fLNUNetuacQDRfUo+g/Ugj2OHAJczEn5q1ThvAYTysQOItXmzG/pj1Azzi/H +NhAs6GqxybgiEhtyoCxnYESp83bs4mqMAehQxk2u/lrON1ENpVnGKWkxX7BS +HZdCLNukaUrcnw0dyhz0unqduWufNXhIbwPMeorWYEy8zypBfeIlh8HxzOoZ +zyPibYqhOz1x4QPiw+N08F1YyR4QjzDsZJfh8KsRKsCSqbnzqjP3q7wiH7kw +5OmS26xdOfZ9opm1dkidAgEauLLDpGvXl5U7fF3NRDioi3o9zC0K/pvIP5wa +mPYSckKJI2NbSrxzXN0XZuq7QhDqP6fsvHf+LKuXUf5g6jousmDPbu+4VCcd +e+h+AbDeFg0vjWH0S4Co/vIFvw8mS3sLuhlqw8h3uXDLfGN4BR65S0EFzrMI +I744jWTusVqh0h6ffff2Qo9xob7immkZQPFewWHTc75/yfC8jE+zRv29+2is +FfnEB26AykrxThDQ7tLUQWaFos9SBqJX+vh02VQ6yZSBKVBzzjZYJFptb3jX +3J+3WWmYmdHKz3q3HXLzFlBxoK8J75oT5KwMMaF057Ug9MuVYQj/N9mLNZ/S +rV6JlKDSlLm3/l0gUzOJ7j8Ae7rYqd9OnLRpKfryCog0ykTRXUduYxOVDOvx +UBGMZuornGKoohNTwWQ2A8vH1xFuTTlBhl6XvLpPSvU2pC7msclLaAo5/6aM +29bmSi359n3mWJDUMNztsLzVcTR+hHyt1BXbdtnMEpUd+ZBtRBcWIJmvldop +I+cJwBsisOTtEhxPZk8c+5ae+RyKAm0CAGhBZGeMQuVZ7WE3LXD9GCOr4SJr +y/mrNgD3RJ7Z9qP/u562zKWLES5XeF+RKenUTMBy43ShPtHkVgxSH35/n2Di +pRKm8ofpQtHFcgDTkMCkQdJfIuFP7eUaItubA8eUK7Uir2JzMgAENbRJHW61 +lh9tpSV+8mOeY/6qqdwCs3F3eRe7Wv8FOwyxSOMcQQYT6/8wBv9Z6k+fbEYC +NMDHbQKMZHaUkwj5o5BhrJ2b5l7rJba4Eh7cxChXv1cOl8Jm2zNXvKIdKY2/ +RX0Qvpn5WpTNBkLD+RhL1ueBHgzGU+HGCdZSyEbU4y3k0+MO8jugnnG8wY+r +ZWksygVjEPjJfZTGIuOhsGgyixO9LGuTuEIQ+KZgy6tmCuOU649ZKGNDq39R +dDxYDWD5DV4ENZYnIDivbmV39NUxdVdGbYjM5rqhIeno4fZ/fAPaxENvWTaz +GyO7QjL7NuRdtoWF5+eMkwUltR6ThipIlDQfyNcPJGjmJvTuWNZ538qxhSKM +G12NlY0Q4LWs1vsHTyd+FgZimIuOoIfpRuRbV9vjX7iQP3I7zSj+zJr6nwkk ++tsR3XCDxv8KZAA5h9J6b8U1Hoe8FB7l2HEVfThd4lS+XE/Fe9Kbxy3rLG6+ +GgQGTDip88KSK7qpxmxMKyc/mwNkNgMfiAgH3iqlqxW8ChwfrkhyT/r4Sajr +ssJBDvcCX2A/NqLodsfiycNZnscMPFnb9rUpP1w1VF/lpweHUX93eFR7u9SU +9akmZAI1uQ1PkEsiXS/PoWmBboZlVCl+oQEdDaCdcW20/pw1hZA0o5/jeS0q +HHLkppNg32vSqtgXuOspQWpoQ7jT7X32RpDnI1w5Vi1a0sGkI1U6BAu8yPWR +7MveMtDQ0RuVPEicGxQxtgHWum4IaY6pqwx96Hx0yJhepg9ookSBzM+zZnWp +Uq/8PjZ/ymXCzL5usT7DaWmPxNic0q38S/l57cwjAoq0X+UXbT5E9IbsBSj1 +CDpNIoORAmKRTM1Pqy272ru9IvMdekQYt3uNGtkk17Cgf+vEfk5rFtK3dy/M +r5l9pUKxyVUkVdiytePvcWQpSTccLuo3B48ZZP/de/r1LNhxMfQ10t1F7ZIN +wS9Q4/TSKlGCF1G5iMmuqGeOTnvCG8BVgucTnOly7UbNv41DBxgvoCALVekC +ii/Lo+6cQ18CqotSbOuqUtE9Be2Txz+u+qxaUmqvz8Oxaoh7kWQaaqSbkfXp +Bsdk43JRzQmy5UexC98lHPmS06WJ2+jKUtZYLGPrS0JAbnX0BiU9ijVCp9+c +4QObC2F3Zjc55aRJfyjMpB2Skg0XBBQIg0WBmdmyn5D8XGzwIVegYKXX4+qi +Pl49kIdO/zrW78LZFGqCnsT2BjOooMqI4PJEMlP3MivnTG1qMKXYoSTHmw6z +lnIJqE82wEnKhreEQflxRpHUmeFq6mKlNvm+iiil61T9m27dTqKDTVbtpdn+ +LRwiPe3D6+Uk6cAEsvy0X2bzUiRnUlmyVUi6Y/TEkzp3KZF7EI3jXU0jsSJn +Dq1MTRFGmHDKIlxo6As7LPOyMEHK+4K57UOfojz5LSESW/ZBHHPYiZa6goKe +2JE46BbfsxAi8VjmZlKil1+qaYdg0mT/BY66a/BF8tg6n1LKKKalMe+nE9Zw +5uQk3HCodhM5foal5s42WgP7OkfNogG8S1k5pGxkL8wrAcOTNYbGzkpvy6Rp +OVzyYxzGMCAA8AwI9A+UHwmmlm7kET7ybTZA1qRcmVvZCMLnGqYZl3q/cNpv +xDVif9seYpywVqvcYIN8eU1CAu0KePojnltRHn2DajA04vEpghJmDoMsY3aH +ItEBBJPuaJdwv2NNwVs/XYKmpC7cVJc2A8Dz0qfFyxPWrOEJVyrCi2Ng6UVk +cLU895lEBa+jxN/0RP99WbWRSRwqBgt3poE3B5/zpl+8VOoex5mvYIvEyTrt +jYYj/Ar8NtZfQb/n2D7JmYDtdta8e85qguxMRCTVVDavfsEJjTkGKKh/tBxO +6Eh7r4AbaEz+XNujeFKFbie0xbBZ5kFkv5bUyRI9CVKId/u0H3KitplW3/i4 +O5uE3B4+tdNrIp2LhcAAKrZKnRLdqCPqK5q66gpwupXCSKJpUQxx1RFHYvEv +nRSLNcoSVQ+KOXpPpRyDwrGclJRnkXpSBehERv6cTgIhMJcPtOMxgLDUkOOL +YUDpv/LKW9heqhBS7dnF148PFXqAbSoF3gNdnnLpwW3OWJzP+EiBOn6D3zae +F2C+UafVNw3e1GMVEPNIQbQCFIGvsNlEodCb5nZ82LfJ/UYI/weD43C32ooP +i64ElkT82LFlrG+iJhoXWHzCqkLtl0ZPBqz+Ltdq2A0YIsIZ7LEn81gQS8oc +77gXnBgzxVbdO3Nbk591y0XmtniGabp6CJgFqmjV8I6LhqYfScQCJoiljK4G +jdcyNVretT0pV23ZSlpGyR63UWPKIxuKuttdv+U4SnTsUHNqt2EzOAbHugQr +Ex5vih9OhzS+BPAKLl/KCnXPkXHgPqJUziGdGTudEum+4XaUpc/UjetjTKwD +F/i5OQrYECiSzpPY16qytdqwFIbw1dDbYhEM0g3Nl2lsGCnX8n78U9CkymUH +79u62pLj7/33c2sZXVFwAaQf/VD6n3ZnyRw++a0BwqdjC8zjNG0CeUkTdmGm +WBtG9Zumzlt7QK0y16dJDb9T1RMI/8poWq8MLCtQz4HGZs38mg95fsRr8NEg +hpCJi4wKGbr575evgCcd47COzaWwRldufvL2myYQj8ZgKR1pPu19yHD64wtX +oJaLXyG7d6SaMhVNutj0inKpluT8IKeTQ15UF8uLaN5dQgUEw8tluQRcr/eX +d+8V8HSG3OP/HR+1ksfLHf4sw1Cf6pp0GdXCuGaRt0sUFRpF+1TNnd/Dmd1U +mq+ESnncHqAbJKhVIUXD1BJqg8JhHZlI2INvYChzzKgHtQ9JggqHqfjyCiRU +KxHGLwe7sdDuk55978qoaKJ61WpXRA+YxI2Hhnr4OD8kDov9Kq2nz0YUYoIU +s9yrzlbH3h7OAT5+FOpnhF8AUW1cggFwJD30hA80ob4xRPiOeErbtGDCgoDj +Rs+gHSXfIpGATNS20OFuiyaXV3t2PFH0QevKEMLjHtOXbVgOWoR8c4qDYbV3 +xi1ZZdfYtaFYCUZqZYhYWUaKPx5s9R2sF6r1CSUOj3pt7zMBP7MdgHBJFf08 +wNIIOgStyc1VcX21II8fzUH9ti6wZnsZ6j3fe9ivOjzOaotFbutyND2nNE4R +SrZ6658qhRzTxRDKAZePd53oIRfvPKilRO7laaA8nGWdmpMoDLnh5bjGIO3Y +N8xbiPr5dV9+XKdXMH9qbozGllbuMCV7K9bnpvTb3Tw71X+uAoyEAlVcb3CJ +Ez6v2ZqzXwO60ghs7au/70qw9iV5ZR8bAsD6bE16gz2lr3LMJ6StJY4Xb9t+ +MULGiS0Nx+YUwSo5mSzOeB9Jg780stwX3ysB8Lvcfw/u8ZmJjmd+6DxD4jEe +smX7Oof7RvzeEBFAX9LcW79zjs7rrrnf0vMySbW7RCt4wMB3qiDjjYjoUPd+ +yx0rXCInD5vF8pkEU7jQWcwctCBtBqh7RUqkfeS+gTBUdNsFjOv6Z8RHwdms +s6X/oG946ID1YqOt6kVG3ZhL+sH9x2NgFGdVNeRVUqmuoUGgopZSJ3O/NpgT +ztonBvI3prMlVeu/9FyjMEftOXVswF4WhdIwqCQto0csRGFvYww5fjgQbyET +PoHNQMtPBil1jKcpKvxU09R4LXg81r81EG95PaBJjKsIXIrWoIdt8Ugn0vse +Eo5uFwN0LDhsZybrqSdTDVCEunHK0xLGLew7orH79ba+E6t+t87GWtakCvrH +XtSmQHIERJiIwrzIgeNYUS8szpwfbpCDIt7/0+1DBpq26A6zld6pXTrcqTRm +MmrHdYFFA0xp5LLob0SekxMO1iB1+rFY5X470lbJCW9UnM+I3ZzaeYyNs+m0 +GfQeiau7DvOXWdExXjbzkuGVlSBf1WuFFTa33THtYvOGwrJC5aZLAnviTOBB +XR04BoaUPcqV8ufh7WgaG5kZKFrxtZwPMtYKrhU2js8T1L8pbfwseQFu2Cm6 +FrNT5j56UZeJfF/4LRDA6+jLrxpFv6XbY8g5fYt0SWTE/TZO0fvWNFQKLwtZ ++iX+cAdEQh8eKvxrFWvjwuYYVaLpRq9NXZ4u+m4yLEF4oZifQs1lKusi7JC6 +yLA3IkQUkbWp0giz5ZoqP+u0XDEcphOoUk5bCfpL/yhc77ShIA/XcJBTTjr7 +AbwI9ZaYdaagJZG231yQJ1Lfy66wI3y9lYjZF7bjEqorxW7+1wlY6fszzzC0 +TzDhjZ7g7izCTDe5/bzEN5O4Yl+4L8Rvj/T/iIs/wEEVHUpnlnbxr1wRZj0x +fDb4OxycAu3cGVMYYn+4zWxSO3UIbf57z6uP2u+E0SpspOSI6lDlzPT+200c +k1JW5T1F+c40fdIdP+Inn9Qsfs8CgOmLolFhFs3y4DW6ftSbdCkQULr2MPs7 +xTSiw38gVoAaWKP8djWoVKbM2tc1HT8CfjDDN580giiMdjCTavSnNiw/LrGm +qJq0+7zejibCDRvkpK/Rc1S0A15udADqZA0Vx39qDfiPwfctP/uYNjAaHeQw +QJmCvwKmM1JVWJfMGNmt3hi/YQeU4/mlt+ruyKZzKTd90e9CrDAE8cVFjxLA +RSJTDuFRZk/wcHVSLHjm3F1UFZ7FBG+EdLfbZfSjIRPxfd9MkhYytilNCOs+ +Pf3OCiw7oZsb6TcwRwPQPbNbpxh5gp0scz4TBCbkU09JjY5Q+KzhpGHVSHZN +JXVb/r0Gcku+MmK8eMjn6+0QQ/v/Mhhw99n6dPHs6twampDwmrBHcVsdgsI0 +1Nf4sWvjt0TJL/EEuzpiVw2IQ24d4TsTKQ1h+VEzYiGoY6ykViAFvDGoi5VN +ULPSbxV25Rw1Gf4W9f3YRNx3bW98hG0SDlD2c6fCdGN0Y7DKr0PyxF40l7PU +PZw/x+0M9RAWAveYfOOrXPGU1puF4N61tqNYx5koqHBYZL+7hh9r4fECzK1H +Rl1nem01W8eWq6kri0q5wR/J74o5VsxUEn954kKfovMuRZCtPapr1bQDTVAQ +q3Sz5z4T2x2meAhKH4NqghuVGUE/sreuduf/Dy1ufVyEn1gWhxs+MqkYRqHc +VUmWHYmjcoCKdOm2hFKZ40sECA5QYH4tkcjUb2mpqXvOCIe8Tlgfg9YJGWBA +4lXjo1OQ+IZfmd3Op15nOdOg7dzrb+YzshnjtD4T+8NEXx13HnKaJPQDBAVu +yM4Q63AXZN7sP2pnDirvqOqUze85FBQycPt2BGWvFAbBS6GchQchalDgSCVK +EgevwRam5bv0op7L4sO3hWA2L5idYbRgjCSI5usOo0xH5h39nysteCW5lxuS +tfI1f08dXX4sJGrwiiLrmftRFw9u6SfpAwu4ZX+FiDlwq0aHZwSumRMFb5aO +XHavvIdUbFtUXL/vClK1duMPzKYenIfItjr1pQylzch/O+5jT0iftLzmFlH6 +GF/jf3Une49a/apU0Ilu+oWWYQuou4RwSbWm42yYrcJpPi5Fy2KaWzq5mc1Z +utWrAEAAABUxgRpeOATBsWhA1eQTQ0IATEfhKRKobCyhURXTMe/SSDlfCA6T +Ri76M7mdcw46v138Y5DKxW1yucUZJz4EAoPFEExs5f2Fy+o4O03vYOf6vZ90 +gcqARACBAQoMAEBYbJqjEgzJNLXCB7XMSfer88pG5N1d3mc2BQSjVXZJQpNi +NIJeAHyYTsBVZj3+AyVIw0EMU5yPOGBGHKkJzITTGVPAyF50Xb6IF1P5UzZs +PIRbM65hsQ6QzsHDn/XJ66m2yKjexxxDBSE55Ou8GN6eOMwHni2FOn9MNlVn +54FegNvI8OKNg+Sd8KKkx22Vlyer+NMU2Jo0r8/z7ZvfJfMUAuaRPrZrENGP +592yc3V54eNwMgu+dY4GMhdIpC3qk80drjPJeyNLzrAvQhFfyiB3rSXT3pnl +pkiM6CAwexhtjwbAfi5+WCDHwMa945eL4d9r5J6g7z9EHpy4IIWdS3wU+8Jl +zlF9RprYrCj8IJNrtQtKBpXQhRa10D/nLoldP8911GZyfCefzp7zVxWFDWQ0 +e/Ib+chAYZlLCUvdmv0M1KrHCToHNm9I7kCk4zw/FHK0kKHI64ojkCuefyL4 +jmBIIERVynR64cLswKkWCDx7fMKVmC2CfGPDjrVQFhXgXmcO707OojHLFaQm +bcP5vmCLhwszvIpSDotBkZdZTvzNvGzpbhbDThCCB6RBGCN4kYakFSHcbkCO +LmAaRrz9WV5D/NJrY+IeSKVRCeYLwHcJp82w9zXl+Hjd8wkoH5q9xFgwnGLh +wJVZGOyJ89c2fSWlMxFxpJ5HP9Wb4QDYlqSeMj5kAYpmQFa5NWz6j0TwazE8 +tzR/+YbsuM7tt64Y/wXhcdpAzlHpI8uncutropSDcOIVNIRrHvqvcOvM9uSQ +6Ra6yf2rsNEj1ga/97e7hkz7vFy+d5fgL1Ayzy6ovwYAqjrmqtE73LO3BYSl +L+vJWuOzLvZ/fFeIq1fCH/s8r4Q5S9RBtPkBbIxoHVbqfK1jFvPMmPS9Hvip +g0n61JivSzOgynYyBDoWoWxn4UixfY1vGx4jfJxnl6c7AZvT21Q14ejL0ao3 +74kuz0yNp2ddpKwt+0bsWPQusMoEjk3cx1VeEymN5EBMXxre5/8Xl3Y/6mrL ++OrjcToGNxyA9fcw3Oi8E72gZp5/cMENLh8jDreZBXNktmj67MiSN90nJLXj +rfGgdgI4QYRrLSIBtmU/Tyr1lYFMti6dSLyLLHKod983bE4NR5pPWL/GuHP1 +t/RNXrPhFezjFH935Kzcjj3y963K89nRAw0c0efzdl7YlC76PchW1SyPozYa +iCO1Xr0FAyGmamCplYwSI7eKzBKl1YM/hFT/Ajki85Q3Wu5OLsJZxuZlLUKk +ANHyd3SeMtKMDS2MLW0AqANkYkwGg2amw9/Z3DWw0OVXTToVqShxxm0HNpTO +rxKaKyV+l2WJtfCBoq3zstTOp59PehjoElifdCf1Nf+x5y40bZfC1E0i18t9 +xql9cuPbHhi/h1mG1/0Y2QClRLK4Sjs4HhqaBAl6xVyqf4blueOZjsUeOPeI +zhNCMTxwcahq0aUGUqmIE2dMjzheCHSR09pE0ShrvF8XZ6WI8DEO81escBvc +NSogTljPDlT9ZS8Qhzn74/K5t2n9epyvtKRb3hn3ccQQyS1IyPO5ThFmLKLx +X8nO7vfLlpl6KLXf+xyEGCqyCf6dqMToxE+riYkeDHLFvoIASm6qYNvGrKWh +ezoUITZV5RHusQXcxUTAaO/1mLPvQIsZ7d8FpH0navjnchXNadW7h11HAnxw +5p2cYHg2L0DbE+3qO+hwl8WL5oBS+KCcKlEWjZS0nk++um/J1NiFkN+us7mN +KbWamqiZ6RO6XqL0X/7Ry/0RcuMbl6VL6GT+GWr3LXNgkyqzNhVXjErgW7kQ +7ckrbxR0le833eLCvBzMrauSY/vyYIKuzGMUHYn+ANSkz8tu14ZL153PqtZt +NZj/kZf9CE9gkE1NtTbYnqQHwArQ1vEgo2FnahXBvuzNnI7ipQ4vDtRqqx4X +6zD4mzhwYrd9FBUJchf0CMSJwmp4k0WM4cNNabU28Rdg16k4HLX21XMdDd/q +fZxikpGNDmOYFw6fDcr9iOaQsYymF7saOlkZepdg5Mvf122Psl5hSuZHkM6X +B3/Ud5fu3yV1YST4W1ggW/JTl5rrJ/9FJO+qvteogO775+9ae4koKmL7HNLp +mrbXfCB3yfC4EeFfPBzcu9PC0HKgbyVCRmHSZT5gzNao/6g/dJQ63QsLcHJu +zTo2v0QjXDl876SjxCLK/MVLYULvEKDjm1vscCuvidx8yrKkvanzf+UzEbUs +yPuZgGfwKQz+CP3gjN0vdw2t729qYH6Jwom7IHUtznD1dvOrfvCqZxO8yF2A +xB7lnukGSqI/mbELjju5owQljjN463cm+S09FQfOK06WCk9R2ir7gtHAVEiZ ++51BUbtC4FnBJMQFQFH0wXGLgKgWXM7g9A+LFqvaanr1p/sA7XL5qScyIjyJ +qOldrRJloPq1LpPO03IIln7A2x82yaXOVeXofEys0jQ+xW3xJ2VlQ8lc1Ynv +9LlpvtN/Puxz1oTt86TvUPE2QbQ3rL0+noO4B+g8jHORAyrIv0G27otLrK22 +hwTeXBi4toPrpI0ZNnGFwTQhJoDKZ9coFKlBpDYhPmxYXthLgxhWtOzsFZJj +Kjh/kzQu5hOHe7SY3rWi0/Qn/0NdYVTmE58q5Fht13aZ9gG11Hdzc8fh8rlJ +pJB2qLunVMG3aqF7KWaRiYKpOps3UoXxX1X+WBmI4gTx8uFgWx1W1D/kPtHD +4TXPxrVF4KnqhoX7Vg8EIeGQNRZPwlr0CxXKNrirp1k1wbacEiqyVJtZCi1P +kJR9ZuzAN3gGMsVhlfWqFS7rH5lVPiE5ZGTe+5H477M0UFFpzBNZ3JisujTh +cWIKqNRJqc8y3z6r6HO/GMVPJjdRy4ZcerBmziqlBeQozb1QuvlRkntSmtT/ +Ntz872zoDdIHRZMaLuVwHR5sCPuUB5GBhX/ysRS0ByeQV0Tcv8HiZBxEr81W +iO8HhofNXk6+NaIJ6D74wtTdx80mnFguTX3CpZAsmnRPbJF032ITEDAvO3la +NZ+irG7fnSyFUfSd7T1mxX43aYkjF3Endl+zEjdAHyz5796taPsXPODNIXOY +j6rCcGRCqu1NL4ahxI6ODQd6vpz0klLlibO+b3SiUsYTaULu3ARMM6qnPdRP +l0Vl4+236Kl8gJBk5ysU7IL217HYfIqt+ZY2ki++XzPXPdnvlH/Vl5fqdNbr +SWesHRqZftJ5J8pEtTVCjnvxkr6jsd3Lo9s3CeqjCZtR0xSbrKqXFoe1pefw +Yr1kyPcIwLti0CcgQhpMU0/99ko/5hMBKW/IxmLqNfkhkbd1fBvKuirMVv38 +vEtUBaQPmB1mO45dc4NnTkpQbrK77TjK4lIcXdPcFQLw4iWGjQdhfVKtQ3s5 +Sy1ldDxokQ7RHRavscyi0CxIgjRC7EluafqCkeLxeK+YKLbnH9iNNdQUHPbA +jgAziia1dY/I6CEtivcXO9x4OmDlG6+5SqosLMQTYfNxU9AxhgH9OquF8ZFI +nuUUrrpjZ6OBTNypQkdGeZ6IDVFPg0WyyUHtIwKCZHJYmjGS0ezbC4KEnzk2 +b5PB5txwXqZnOl24zw8AmJUPUSJIFSrZujdgnxDmRUmqxm35V2GJ1a5FUUxl +upzbCAod3/pn7ybA6mproz6/qjheIxm/sM/8750WUMUNQmoh7lDRRAJKzxs8 +sEJuqwiXKMg6Rio3j/iKdQvwd5BH/woXpZmF2R3zJiZzjcvlgrtPiB4kO8Ae +YcDhnyusFaG6Q3IuoFcrsMU25wnKKZ6h7RGxBNebWIOmT0qH8zH06RHIQ9fU +S1T6HDVeSFDjnFTkK+NC3KvDH5Ir1DMvVyWlxNWH664s/V4gHqYezB0huqUk +Wklgc0Zba/ozH+rMgBDUwqYbHZF/9tVeVEQSf+LFVl24zofa+o4+emh99up9 +sgZibNFBiFD972JiYTeQ4zpo+9AcGinuMBZM88dUH2qh+vOvxN5kEMbw9nWP +LXU7e7SHt+RVWp8Tv+xA1xu0YF+cqWazGOn2GejWqlQhnOxJmxrMcaRnHSgB +V2T1XMyTtxusaX865wucMrQfEvHuDQQwnIxqhIAgQIAEAC3Stm2wsFyCjjxN +9Y467MgdvlFN91ipBMoxjVtFJ9ZFmLbMH7XqfUnXU7u+r8nimhm1RYXOfSxj +L3XooLyXVCnoJzSFyWEU5dJFBjRnFNm8clzF8OD7wby3UNTUXo9ZXv1zUAdQ +YSsz49YsV6uAhoSh36sQseyS12bszlfkDSYWGWf8jP9albqSh2h6/K+0LRix +7dLJGCVnFt4ZDOMZvneYdWucAo23rU+74/pDOp5gsux2FzRvyBbeXbY2CZA/ +kO832A43k11i85kko5dus0ZRlfVK32znaUwtoUoKqTblhpBALUeTBUb05hSA +Z9+1qOm6Eeijt4ywh+p/xQEO5/Rb5Hvhw1cNtsqeQyHw4YBZOFYRnGqxb5W1 +piGnAtSt7ePK4P5ZNQm0PddhrG8crGiw9QWPfs+jn4w8rVjuviSR4c119ISe +zD3R+CtiKmgSf+n8B6/CTOMyP7IuGuemSfnlRqYlXqxDVdkNDf8DNgVWxhDT +ZQlIZdpI2qYGf6Yyl23nE28VlY+4jsNdOnC9OeYCC6Uu8bnEmDgnBixkYoPg +NbPOK0JLP/z08EQb+a+FG0exWPTq8tVEm81Z2y+b4QsPj+9sB1YX29lDDH1p +X9XxNHSpbovbz3PmwvZ6fskxf1L0yPwkjSRHReagHWb866fM15qHdnybHv4F +uoD7yXptWw9Vaa5kgZFYx82zi8jdawYsOGDrGoI8rkjO68kqmm0NqLQkLA8K +bKIdhNd872k9LvSj441128Oub4WuliTqC1+gxgW0ardLgVQ0V0rAYTyx1TZr +6gd0jSxNVo8f++/JL6MatoR/KepsKFgbKj4VxMERDmyj+XY4D55gQ8BQ/6lR +qwRf8+8kaQwv/Y3CWQl24OMBG2ZQmKM7tngkwWHcBvIvftZY0mu5Coy5O+Gf +eIP7izNyOrqTTxLPucLNpjHrl0+UwxLLSgh0IaI+YHA+PzSkNY0QSeN+c/Jk +4o6SrwF7FOb2hqkSlwItz4ip3rnDeOTHuf12/Bmtd8EcKi1nMkmm0U9iYiHq +cuxDd3u3/W/K4O+juTZLtVfp4azOnLDMVMIwgMGg6Wfr+899j+WPbUq+kl8X +bPvTRCiyvrC6fO5P7HWqVbKCmlagUDEPhAq9U342iUcBsoxOJe7BpG7JICHs +mKJI1gyBtl6ddFDhhpK5q9Fw3RHsySnn7yiQKiW1f/S1UwVcHc9iJh4iFKlQ +mBkaxSZU3KQoWDD90Em1dn2rphLlvFLC0iOpwPSi5nUYm3YyR15Is25pVA90 +Bcld2HJQqIAjX5kzcsKxG6KI0gSKHLnJdxbnjSTwollCF52x9joiX8fRWUHg +q9Yks6n+oe8X4OKFYn0YLz/AKMaiHahWFVLDYzW5BQfR6X6zD0Vu8yDgZMuI +u4tLPNhZ8gU1mF2mt8jEhoMCbhtX+W/wMcPUG0bR4X4rJW/9CLN6NiXWIfzF +xtoc5eID+4MXbK4Hg/Qg+hPzxhADcjhO9fm7l8Smm/YgPJ1IpYh5DUyiR8Rf +0/o6a1KXAeuYhxaK3oXbjvxH5glo6Nskplxrh7/GkwNadLeeh+pQ7c4Ow0yl +QBY7q55ezEdxzK7JymXTHbnc9Jj1lexplswcdUwz499A8BhT5WQwPUmLUUxi +haOj93v6R+ePY9fggNlSBo2hMHWd9ntmOPZNXGThSVG+yfTXpvLP76Qbk7cB +/xWGJbfuv56NF8tLWVYukezR17+DfJd00xyoX9lQsPhg9GHI0mTRW6U6XRgm +Jwkq7uAplbIaaCrUI+0zA/0x2kt78La8dEM/H7vBlZEEnOIqaZF4jDoNMoOw +MphZ1eIkLUT/aKTR4UnavQ66Iv+czhefgmaTWFI46z9aaxM12WtROu8yB4rY +v+okBh5fZD1yJtWc/2dCKEyEnolQBdEkg06iRjiKC8Y/GoMuJQtPXteRtlKD +fpKgr8wQPNpvS0RLjRwY7WVKf1FcC0iSgVTo6YPStbQgO/Wb/uzM4yeoTY9z +yXmRQHpFxl+g4aGYjgttu7HyDLuWwuxhf/lE/YW62ZzR8g9cMDJ1H+vLzGHD +9UlnMCQeFudYJ+nOP/Vndz9gGmuMLzlXrZxNfBm8TF8Y3R0OrX/hnPlhic8O +xbutAApWa93slcy/xQLzQb4po76UmP6MOgCmeeZMScCaejlt6w2/nkH1+XEG +Ynf5GloJAz+uI2SZPv4eTJd3QWa8qoRn2tphMCxVsbXNe+eStu8cjW4bdE69 +QKr8g2oiE+O/pi2xCZSc6ddNBDqg8LMjl4hb5TuBR7HQnXKSuJzsoP+nex62 +ssqueOv5Q0yO0xWa7k08p0lf8OdHTWqRq+JO8p+JnIlzOd4igDa1uhrITRm0 +eLPrare/zQtroDd7O/z6yN7kHy+f/QzRw1DWa39h6VXW3LedbOjw07etHqBN +T/la1Tq7KFoK1MfWE2fIx4haALtCK7WSPOVdfH5M5aJezs8MQFEMD32Rcseq +D1dsPGvLzdhkCUHLtVuMRX45jqCYFiFpbORHj1nBKm4/RhwwPCrUcABIMmXl +kUBrZjA0uP5kiVRweH1IEzd7JCwNCX0s3rYKxBD1KwSV8d21PrnFFIeopxGK +P+uyi98w5Ltbg1+TMKGs+kLysiBSmii33m+CcYvKq/GWoV56Kl/Mf7qZYJF2 +faL3zpBdPODyqtHXvxnSNNcWyM0GEZZYMA40m9YtKISKyCKDKuqeHvPRoVbe +XtxOy3INxGuzGg3viXj3goZNJ77HEBN1qU6Xw+qzJCg3ESEOTkOTMVxv4UM5 +kcxHVYCzl8TMwyqgs2iWRSRE3RpCzTzFcU9bueEi5mPEvcnlkMF2qkwnOF+o +jbtEKhpY81gCs1Ga2+8gzvIhra7/GmcJ+qvZDtNdOzZmnCpvbGMgh7G21LZn +8BsxU60iveGAs2GDuzLtT3Jpwlursq+XCCMepcSV7AwgcoRe6qBqqRP+GHIq +0KberyMqaqdwSYTMNT+6jC7Uqt39fVb8Pfc/uaBaVHfbfcEZYx0GOOVj6RDB +fmmU/VzPlgYrzYxMpGukFmlpkGsbvlltH+N5OyKsisSU/lgEyMgzOZi4+zei +29o/71oCLRQFobiBfqpuoxiYlB6HnIApv1w1D//Zh1NWGGuTBpqnZVhXKm3C +RnrUey/PUTJ518BTV5rAY+jFe23n79DMRzwIf/pjK+8AQt8BMVMfYWQ5izHz +aLds5RygjKlXC3IXUFz7v55SSO+3IGOoGRRSYHUnPakRwuSuy4yP2Hq+JMiy +WorIQ6wYVCi/TN6PrSiOyrmutvabNNWyA6pMzJZjtRXf+iUBIIKfuHZ/jifs +SX5ca6CD2sTsrFi0TGdmRHippH9TuE6QgnZk/wFaeYj7VO/rUT1QFIGTxViF +hTSypKtRJ6Zg+DihZ6G/AdQaHqhSwzog/WCwD0imcSyUcwpP5hdbpPQ91mE+ +iw0s+0eIPMdc1N4f00Calh5+ZJ8/BVl21xHx/MY0m51HPTM6W6XSsWbn983Z +yVqsYaqDxm+5/6xuJ+mMHaX9Nuqot0p41VaK4VkmsCLzNmrD8QezjhKz9hsO +Np7L2lJYXClSxlvHmEkdaoY53ZbljrK0tPJa02MyhqpOcI1wu2cFWoLcqknd ++DumpVu9MHmVQxy+OtA0tHGw/Xyr6rrFquQYtWIWPf8qRZ3uID2XJzlNkaUS +GgRqbUhYiVAIorhWJ8eqRl6tIRjtRP7zFRb60Jgb0uftBaJ2FrMD2zuqOs2S +4q+vxCzZpd1Y4OKFsWSD3LvZVtvDsQjOmCyyr3AsewzTES7MB/ezarbMGe58 +T8rJbxckViNMVZKG1aHDNlAWCtC9Gz4phhZAAgQx3ExVhN6KafXTaMPx4JVa +rtB7LLpyNXcuH7PUllPH4Eoch8LH66I7WkYCld1A8kAqgKPBdD6lT4MmW7H3 +EWzjy0G1mnF6ciyqBj/jIaT2ttpNy63eBtFMco2QkJuriwDYI0UdnvwwY9WX +DnCzyt2pOLIDn2QDsONOFImtGY6uxSR9bjLAu1S6xnakz2HrLaGpa1KCxo5D +z6qE+YRlnZMsd5pHeXlp52qv6IEjefotEMTCOOnDkC4vTTD91xab79T6Q27N +Jr8SeHfpo4sQxDgMxuF1Zoy2LD14LKQXOfg+Yne7PHbfMNM8Q0/b/9Nv20GV +dXiiVW9nImnqTaefoLwdRKicgwOeesjQctj8PMLEHGTFZnPXZSQnO0rCi3vF +3UsGyHpeqY/t5WkNvVFBbDBD5B/659Z661V7b6LOQK6g9LjwDwfut2D6nsXn +vUuSddA8Bm/rjP2m2It2Cn0OOZrTKpYHKNJT9BQjEm1I/V09fMCy8564GsMa +cTiBRucFtqV7B+45LOkYWOvcwVQms67iTtXLeL+D8BarmfIola4Y8T8x1Rv5 +GUYTQy69AOdP/MOsc6QfR4/d3YIpZhGhO6aNR9yrFyHKKJRiHfQaYWa6WhF/ +gbjkOD/QI+NCsDhoIr1W2Zu+L/aaMLCex3Lc2mxHwubi2UXX4EFFM0guU5X3 +DpLvsrc+kjba7rH0TCfS5Kz9Xdu0jzMpw5w98lzoJVgeYlKj+qvNEmY0NhZx +9vKUNgu3OXQ2Mt+R3fRGUKrx3LuROzbV4VIqXNwbNDEZUvL+GpsXp0kKEnLN +S/QSKs1Hn8aGLQmOi0M+LXERdUwfIYWP7qxadjRQWAuukxa36SnPFr8aT9rR +a1CVNDMm+mID7z3osk1RYV4WtA+nivdvqU3N5tbdKP6HUN8XwbshchKKa5qz +74k1q/SdwM86RvskkIPFgp61R5xbHJaiywwzOn8WISk+k14HE6VnVZDKUbct +iwCw1iQBScxtflEarIIA2VcMWHPLyeYlo0mj+EnGNUuymbWlZeCU2HZ7QVZy +QVCDarmz2IujVetxCL4B7iAfLt4vRFAOYRVv2R3yEW7c6yaNItXH4rweZd4M +TXePfd3vvffJIbZlkMYOvUKx432/Z/cEA272SPvDFcJ2IjBUe0kiOnsyp2/I +HLEvJl0vKlZBE8b2mZRQezDz5BaEioRegvQB6K09ewDDEcmvGGkHBo2d41hJ +VbDn1JkZ7RDMxvxGjeHyRT/7gn+Bvaw7iS/UKnb7CpiL1XgqroKq3oNzVmjD +uF5ifVMbp0fhKmnr56H+VTbIu2s5U3IAMOAr+KNFfz9WYQxxoq8QqnbR1H1h +2uliuzZsMl7o/YlJt6eawZwHEmZWQmK7Qe9lWtGa08pLKedn/7uAxrF7vs8/ +yaFCDYpLA/iS75i0d5Wt+DZOXzLRdGaiUG+L0hI9CRUUhzcPsI9wW9UEzbIH +BcLGsN3XHYpskc8+9l81UoInKG0NkU0LvwyTbm40DHidoO6Uk/IiHOplnrxd +sqpPa3H3iyGW3bz1q2dWbp4biXJW+XMFli5JudtJj7cr/DoeEPeJ/FrvoJoX +9ZUr77w9sSYlVMBr9UVgH4WLC0yuLfPwQoPiF1p6DUZul0vfmXQXbTK/gP9Y +A8yu6kmuo601BKobt56I533L68DPruPgSn8s/ypOxSAWsw2wl6Ovhw0ULv7C +s946IAWK5zp1M8NeNlViTVoB6OOwl3t0Hr7Vt4nhG/Z2Da3owbxyyYtqy5d9 +cB0LSY2H4GIpzSjK9VIqL7c6YA+kj/zFp38v3eLeIU/TI9OefvX0lHB5YfxU +S82gdHQPRgcLtHZZis3TXL73H/jMNIqzzkCjK51kyyMfJ+TUdlx5qP6N0baZ +iRr39Ss+ofbyVxhtRVEpukwtmhV7n2tZMj7maJUZS8r+VS3BHVzElVDUYNbB +iE03o2j4z5WUE1UVo/ugPMwTS9FHb4r1tu/+N2QdR8v85qSpf/OPKRZlkWbM +G/wJzVYCIpYIjdX8g1aumdKuqNRXWV/DHrAjCFQbWW0AtpiY3nvP8dwpTluC +3EZH0ekill4a8MbRk1gOzSCetpz+r3UDel+vI6Zka6F653IhjYpD8zny4x/G +wqeacTwyLLQ3hF2Cq57/7cxBniFzXUcWFdNYc6Y3z2eskteZfaai/N7lF95j +LUucOioP87VGoaltHwiyRGExwDoEX3VBy1OdTEpGrKhtIDujpvTjrDR9YOpH +KVuCYQpKQakL7M2HmRS66akplL3nPA+jkOgzYDg1MkSNmJsfGYILhtfXBonH +inOBktPwAVBl0PCroMHHyGKqhvQxShjNUOXt6zIMPc1UGO+Lg3UjIYGiqEyD +7dyOMa4dW0rifNbMeGr+ImvfWvwQs7HD2JF/qxuBMvXsj407qgHtNPTJ35uA +bsmjPHeqS3uTqEUKo2iC04JWHWYCmiEDzS0PNRXaJmdhXiIPqMP1rQ7VYIG3 +nundymdFDnpkU2snTsNR9nGmmNkB3zQ1xcq8du/z1dhWtqc7PM2zZtMosPyo +iAgIK12ElmPi8wLxWBX8kXPJNsjtZQ8tpUhecLafmLEFBOuwEK40pxNFHl8i +8TA5dupIv6aL9rkPEd4dk+f9/sPVL2Et6jWusTFHIcpEbW01FRyUVGRa1wLg +lb4L7iLtHqDM1XEvg/2mZqC3GMtuXWZZlk6K4aaLNC4vnshX+AjlSs/qDmR+ +N2zGbklCcpmbF9agkhAh+y7UN47PCRrsbl99R8118sfj3jYg09NUDkQ2Lb8M +QOZ87A9oVnq5fEdh2RXMTGmGloLqHuUKS37ZQwAAQnTfL6jzLu0kJEhCR4SE +njUNHCiG3/x6Lcdy2L3uzdP2bDtXA9OaPIuN1Qx0vseIDLUSByNd/L4xeONU +y9PXECPz+UYW/Nvu8XxIybBKiRrx6ca+nNJjU7Ztjqi6+PppWop2KBrxwvxf +j2vOFjpqXNJFTLSNHCtuwggMUibUgespUTqpTmpewCgTAG7CVDrNYLAeqs0x +UI27LCwIAECA8cpLn++m/P1LIIjkYewJLFt1BwAAB9ecojLbVmWOssufQHyV +wvQTkxiv+mFtkIJ25YsNAg3rOR9wgHJzgMwPa2+ReGWbHwLLG+uuM/FRUInR +OJeR/bVeoMTUIQb2crVEAQ+m2UWyCNSIro467p0ay1+JAQkS6BoDYeITfGsQ +pGxn9+A47n2kFB2Y+aWOPfI5/yofbt/vI9XR8zfLp5TLpyjiFaNZ1lWTRRsp +iDba4KeLaD80LnxmfjOggE6RsB3P60X816EUcgoABEyCFGkUx8HLn8x4mBg4 +YHrq9948ym2HgBmgusLj/fP3CIFREJ8SbYE9C6vCmi0NbPIKldB1tu/l0hSX +UnhjU+Tk2A3v69ltM5O/VJ+ziIHi95Vw18iK6mgyuh+GF3uAnuE9J7UpXm2r +qFzOjnglYCY06A9Oqy0MRQ1X1KoahVCGiMmcge4xCeMqKmDpAhvbkLUpHfU7 +6tvWtPDkhFnISBAePeoJwUrefI+JAYC6E6EDiA9s3emXYyJLYwvTAefkZqNe +TDrURAXQjRc2kduEl5v87TDi4N7T6P+oqIWMbHhXGOueWpFH9HFkhQ5Qc8T8 +y5t4voXrvF6xNiAKcdAp1+lUprB89ciAXLEGo8oUB5MSE5TTt8nIdwCYRlho ++YBhRN+Kr96o/EQeUXeHWzoNfXs8AkXmhq4mWWQC8MOTQU7YPvG1vlXQvO7v +TNybK1DLk9AqbQRX72jK8Mh4GFh7V9zGOKN4ro9GHOTTIDbnRrJam1e0+3JX +/py7JPpgszUuBPzCG8zkiGpYha1z/31FOMRybPJrm9r3g9dlY2M8o0jrrE6U +dBbOTgc8uW3HXVSGAH/QW9T8emK8/l0MhiACACLIu0ZK+D4oO+9EcDWCp+LY +LX/YP+6DVILamf0VXGxunF85kwGwfI8R6ijm54ncbgYKH6rIy1W9H1iQiDwY +At5CPQzG0nTOzxMk4d/13vHAnzFZYkR0r1cUT8Ev+TIxfmZbgD2Ov+loWIMb +NDkod6sj1+8lYTkQjVF0d2kkW/SW7m2DnGU6jVXayqszilT6vatFV8zsLHPU +uWCxN4aeEwN8i79ESFpwa0LxLWAyV21yfNNYnigbGkCz3Le0Cvbjf+Y3Vb5k +haPUv5ZqGUXV1cvAyeZ201LLBq2UXO5lDpJmBKZ9UPgT6DAX4/z8FaAqwu1E +WW6tl+Uvlb9njXn2Se33pP77opqAN+wMXzm9P9b+ky0uxa88xA80XvCwFM9H +fucNPP4VPuuj5m/LYxCXcHxJ9qqV5piAIijAWknnzmrckFSHOxB5csJF60Le ++xqAcXRXn0RgZrXhRXzjUh8G4mRy3IC0NmpGiswRrivdy8AoPiS74NnjhHY1 +HGj4duEA+aC7BODT7xOws7ZM1tOE8CgvHfCcVmNmZT958XelKGXnIfgN7mQy +oxncn0HLvBwA8n5MJ3uj9dfnGqblXV9sKrY8ecwtTvttiev8oxyAMCVm+ZnO +t/rjvVfM/ht2u6T1WyagR/6KkV4ymlgQB3SLQkEYifpBE//MUFZJlNZzIA0L +gQDH//////////////////////////////////////////////i+LvvhKfQB +LFrARgHrQBp6ZU+NGNrLVznIxuxrjt73V73Wu4u5uCLc7HNrWx3attUYt1mt +2UDc2PvdfenoB3twO+9b510xm5ZBSSk3FbjC7d2m1jNtrLUpWtx1a7NS2c7L +tuw0Hdtbblrt07rN23bO6uiqszo6us1ptum7daB2WcWrramxzna7tdwzk1th +UQRNNppttu6u7KqxlI2a1Ua+3BXQ95p9BApQE6wKAkgClQQAABoyQqBKkURC +AACFARJAASoKAAApSmc99tFcazbNVZ4D4kaAwbAZQAAAAxg7Xp9u3dp4fX17 +7622h7p47dtjNm9NNWZz3xAkkoEu9PrQtNS1TV98Ag+fe+9V02++H1ndfAFv +l1mMF3NO3arbd8AfAVkAAAAAJ118+L1tuB6vgRvnvmXXnxQXRzcADoUFFEDP +vn1Y3aeC97xu++31uGhtjEoAq3Qj19vvd9xESABRK6+Rofa+S3176cIkqAAT +Lq8H2+t5zo0AAt0vvtZ3u3xQ6KAHvvW31m3pFPoAU3T2r4r73r5QAdG+S+qS +z323z6aAUO+nz7radr580GqBboe+621m+e+wDd62fScX3oB9O9YX0qc+7zSB +3p7Jz3wFNgGIBEQEAG77gAAAABN9e3c8AD1W7mb1HeAAJAAHwAEAAAAKKG94 +fEu2XbRuW6znco03r3jrul64u1em9N7rnd3O83peze51jzPXXua5Ktnajbq8 +TvK9jta7lXW2ddzjuqu6urd3Xh9RDn19tJs0ttaVn112o27du973rx1I5B3b +drQu7S01dtve72R67V6V5z1bM53bbuuuS7eNve0CTx7eJXuehU969WU2e5uW +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 +nZ7jlav15xskGe9jv8Euu/Ea+zLMTsnfGRvOfI8VPdlFbdiH+wsI9FeU8luY +PsjZ03bmjjxhXzBipAUmko5Io3sb6jSLXkc+gcGyAz4r+Tk90SlDf6Bh+ubo +v1Y4C3G7Dd4nyFJmEK6XnvmpVY4OGHPokBat/Fzx5M5Zel328a0quizh+Jn1 +jOYKsKwd+ulTlUXdtpCHUP97sFQcKc/ftB2ammt6fTEzupodt2rh03UTfRlj +cqJR1wyi2FesRbfq2bzro087uhkuPEnvujLwlGR2jybmGctFCyWJHlLjPpn3 +I5dTToK1Fu/2TKbdmuYOybTzArYF1+8zCZdlJK06M0ONt/i1INXM9LS0LZ+N +lKL8iVtReElEJCZunL4CvwWFlGKYVM34bzK+pJRETBLnRKu6b+5kGDRzHH39 +HdG5Za5kqmi6QKRSyEs27dBN4RYl0LdA+qls+81O00Y9G1VCyGuvxlx/ryTe +iZrzFXS44bwWXMmrp0atrFKyefenYEhlq0mgYPHtnyoC9r3eI/4bsPKExaqU +IzA15xiNsPcfodkDeQ2P+lmlcl/OIQMG9RX764Z3wnSZNMndZdu6L8psMi8n +YN9tNIhUvWETw4ae+0fdhshnjcfe/q7ckmUxiQjHSKOC7PnvVv1p06/4UciJ +AATUoV7s9Rpf5rXVMSzqOWrPlrY5ywxzllVHVReyQ1+5gLEgC1aIov+xczVL +uSrMhHYLrYUyZIH8WMatVLTb1cx7nrd7tGvfsGqsp0WDrbBd1SX5q280uatD +iFThhP+hT68+2aFQzbu4va9x0IiTnBXUoH+cCnFG8ePem+5P02qpNZ1elwO6 +Bu7Khoc1weVdfduHxTLhrrJrwhcF6jiBJ+q7uJPTvNqrylzo0tdcqnWLYy/N +ScvN5JqNCO7ztj/JyQiFTjzGGi4kfmzh0QZreX7rGaWD5yXnhCiOF47K2gST +FflBCTY3SHP59z9Tz/0+r/0a/Qcvly/L/4fve99A+PFOIECRf8/P/XeSJAdz +qHgeqaKTqNQs1HbrmukCiQB+MQQrUQcs/3sde3lCH8DlIhsg0fDeCQ6VdFlU +SNMWqo5Ld7qrsH+a4NZrLhO7N/2RJ/EU7wL6qvtymbmB8/1211lZMHsyiOxl +U0sPcyxdwmSynWfppiHQmK5C9uXehlkdUF9WE2NZTYJbOybmzk5aqbBt/0Gf +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 +i7d3uW9z2t7o0aN5xve6SznOLzu7W8znOtysYre6mZxjG96nOcXlpVveca2P +eJM5xV5qZ1jFO71rOt6zvWd53vDxd6tGrTq1+EIBxURQT1WEpMKCgHG3nIoo +G+FBd6oiwIrkACkKC74DkVHLUKqGQaFHfihpEVwoi6BFfGNGstfKBrilB2lE +BEREAWiAIAAjI7zKiu5BpH9TeniIn5N+S20k25/ydDgqP2vZchu+T8P/l/ib +3tP/v+nJgCA/7+o6pkKAJu9+873DMQU97178XM5qh6P/jc338Gfp/malDzf2 +8Kn5PiMAnsmT1Pzf7u2/T6/2XpevAA/uiKwIr2FR6wAPbSAaCiKlpWCaGgSk +aUKClKKSgSkSikSgpCiqpCkYqFoaoKTgKPYlHl1HTriK6RFew7KJIoOBFfyB +Fe2dx3uXY+4du1/geL3nC7j1fc7p2Lh778r/YJflfyvsfsv6v3Oaq7+yxrLq +6erkf2V1fseZvNbWTd8YxxuZeN5rS27eLxner1NVrO5vKuzNy63u3mZvGsVu +pztO81iVDT1E3mdxvUreb1i8KFvW93d5yTdWsY3rW0rq95zd41msZ2LBvN6z +OXma3VaMzjWND1m9sodUbznLve3rNPOG9q53nGtYRYsaMGSijBgwXLmzJo0a +QBEQ8bX+rzP1rrGb+BmFmbhvL3ZKIwXb8rgCIAlCjywoLyyr35VE7+nIqOgE +D3ajyaJq1RJVVQUVyJ0DhTJ5I53JMgZsAZjyZZjnISByZBlByZgz5MhMwStQ +LmcmSpyZyZmi8mZmrkydaknlEFwcoaM+UIcxhhmYgiCIIAgCNY5Qw5JEE1VX +KEcoZY0CWA1GBHlDCGUGSGJHPlDLIkpgqCyzOz8qZhypmYNPKmQIfJFEHx/l +fE+G7mylaCA+cxh384IPj/OT87vL3GeON5mnM3UsiJTxw74VwpZ81EQGMWTH +zVAR0us5qvVIdjPGJU4ACSmyarRkp1SNcje7WnebuiPm2WVvtmd1qD5vY8pD +6JB6T5uea55cBtHzUGMMBv5vWoiM+cqQL0zd+HhU5YHzUQc7Sbbg+bOeLzx4 +yq56XTes9NS8aMPda3mpzrmD1eLvfTjiLjfLiePmz81b24Z2OSjk3vsTCNGc +v5zHXrizuunSt8873qOJmLgu4jXQcbzMhqaoqIMidaszWOJU63jO4T4zni71 +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 +rpW9nIMx5IAAdx0cGNZC/MRTNWI0Oens5gTJ4RRuJPSJT44mw9E6u7nNqLDZ +rTvmCgjY7aqdkq7eRYnCBKzPtHmMBpRWdkTvv/AYNydcJ8Y6wqIepuJ0c5pb +WnQogVWAFBQJso88Xw3IWjRtoi0R+3yd4Yj6siNDooWvoxZeXrHMwOzZhn/0 +tioi7iWtG4F3A/2NWtgkMfv91sVoCoGHaRAtQoL9TnwC0kl/i8W/UGywdPhv +1dsjyEUnC4fNBUFiBPcJ7C+OOShfNVTPvaHK6AAlmRfAbkyUuZfx7luGj+TQ +Yju31cRfA1avEml+prF37QU1rquMgeFP1yb/nui6AmjhIXEH9JUkfDHZ5HEj +XS9hvMI4q5aIdR+NexFb0gOCinSVfVhCexebcS/OBEbTKvcZHO4j6ulNJd8F +8vtXDHReF1cYd5Bwe6q/PzJNLxRxSe38wTKIUCVE78Zh3NN2HrmhMFSQUOBS +s/Q2XGmNZ4F+lUuJnRZRoJ2us2W7CKXZa5QiFGs6HvJnPnZ1a9HkP+xv5Y7C +0Mq7rYWE7pZIu2vHfnxHlNk2Pl9ezzjr33bBTEiZT34y988eqx9cSWOKWXyb +5uJ9NVtrngeMG7BZWcviKgXRHT7HPhnqDIOjyIbJIrCg18Pyv+PUORKUuLMl +RuzcHPRGCaCVPbUdJDTI81k97dMgIVeNXGldqBp7hN55u9J+Sr/lNcY49/rp +K+9Tywkvtgfc5Hetzx36oLNTQoEcD1AfqQ762P5OJG/G6S0Ow3aDQTgv/VTH +5Iw2nFLtdHq9G/ELgUZd04D2TvaUBtSVSwbLoouO59eKjwJYE9xaiR0BzLTV +7Plx7ogMk8K/Va/sU4N4Dn5+ibNO1avS47loNPsM7bKRiSRibrTOD2OtvlZs +n594doJa21mcyR85yKiFycIHITjy4n/zPsCbyKkw/QO/aahKUNKzOuOHh6v4 +gWtC0pi+oEQ3SNCMkSZJJc2Q10f83CCecVfH+ZsM26U9/XPmd0tvcBC3QfU7 +H06VhAICIvDN6XaoEE3MgXeg36tH8i0LdtqKG/NF/13nbyGjdmaLAdf+0I+c +yyv/P1Mv972vbnU4H2yPtm/7bxuScR37axj93zns/v4ajXKM9zvcqSX18C0X +v+0xNd/DPav8zreQ7q/DKjv8o45Wn8rv08Tfgx66Hlcl9na7D8rvPl4npyde +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 +DwRDXInR6rbUmkgFqXxLft8PX3PK+MarTC/zeVRzv21WohqRbbs/qaSImGqP +jAWiCA1pCxBAACjIOfLlChzfrep5J7qoA0Rr62nJzIEzikxBiTEAG0YRMLKB +qDCgMKCRseHCQ2isr+LWL/Smv4Jm1rE8vF05cS+fkOTq7tGOev1qeNdWn1b0 +dl1njtfJ0TVcHzeukkpOOUkfwp47Vih3M9KSxWjWFPdYK3fM9Ccadbvrzkzh +c71zwoz3zPPQvHFzAt80MSOGpdjbFQdB/6ltNNdmr68XhLBtqNHRjEXxJfCW +tJRwkhJbRklAkM55VRfZ45/zfp9+KSP1PkgSShIEoSQgQgXQ+Go7iPSwhESQ +3q0fq+K7hteTyxjKzz/a/S01p+84/z/LDxip3qqRgxiWYe8GHms3q7y3nGb1 +dDlpZ1m9K7vc1etbnFuW84VZzra1NTedbxmcYWZLHAA8deNQopCUoKOcaVNS +UU9RT/Gpoand+zyqxgEACAJkDwAhEOoZRYgI+nGLX4GnTmmU5znwD4B7k9Gf +9nfTtB786c8UeoPZnqTuZ6U86f5H4j/o+YfYOJycVE1MpTQLS0pMiUhMBEUF +BS0hQHQIdAPEhQoHpiQcQUqDMLQicjaGECkQDKTQCwwDysByKoxFMVURJBER +RNUUEFVBBRDFVE6IOghyIxGJgmmqnlVE5pMl5SOdgdAn6Ok9MfSUNjat2cLv +KZENiDC7KkKCNIF37/QGPCvofH57a65OOu9lPCldUNRCPouhgmnjgQyiiXG0 +tMfZ2uoHbezNuDSUoxRSqDofPm5WsYE+RgFRWfSZ8LDmgaw1m6sFZOnbykiS +ssHvetFIVKpAIEsqYzIomakpiZKoikpqhaoKpiUiKChAqkjTjEjFVIxUSyUt +VJRAUWjAYIqYNicTEUa8mCKaQygMSNA0tKVE00GUYhqJiAoKNiDGpVA1hSUf +DCAO51rvKjmKGnedH1MXsJHEeumOR2DkjX4AaI2dO7rFBuZHC0jsCanmjeCI +4I9CQiA0+zlJZ6iR9VHcqDZz757u3wHeYO/UOhu3Hj5RtuEo1UZhY4GU1/VC +kBKZn0Al0iQoEY2a6nU9DDi4SjpNYNZEeRZ113nusj3gIEv+cgmsojxkDr6k +cC15MoRykOIFiQNDpRIOMADCAhujxQ3u8TcW4CZWEyDetPFMKaJpDEFFbw0G +kDsaLMkkiEfVQIPPNEm4zwRDGQHpUNQQoUaoZERIz3cQlJRH1KFBsOCjIWAy +USEgM69V0VCxsNWODtGAahKDSlMFCQHB1cclDiMIIUwdVBQUcyOAEQEgxJKI +SAOuHDbgOMtAoJ6pM0hKyICgQHU6HUO2TWY0ZUzE81Q5lKXEqUiSomUnVaV2 +lWh5YQ42LEhjE5VFohCCzBg3DPToMjNddKQNbVriByqqbqhvQVOCo/cEVgAc +kTIFALvIisIrkACkIrwQRWFBfxiKwiuAAUhQXMEVgOIEMrEikwyBERESBAQR +Sg0FLAOhRFqhViZigpapiVoaQKKaFKUmYmqaSikKGgYglQQ06KSkaWiqDCqJ +AKjAohAYgpKClWgoUKGqpGmhCigBQ1jZ2TaFNICo/QBEQhUA1hFYAhFYABNY +EgCAEIQBAQ3p+IgEf9zUhh4e4B64K5j/5pYvpnOtJBaupsqC+Od5WfbeZkHP +Hsry3nvMO3ZFa0XpZm5VMAUzY2BOtT50ul2MaLutEDlUeJohbTA3xOJ86D45 +1CyKyoXf2aJE6senNoc+i7ecFgBLKHu3XAGAFbr6dwF9iYqsvjhbTm/8NzLl +Q9zmuDfHjunl/ce5675P4fhu99P6H6HZeF1URXUoeJ34hhBJZiBhCYSViYCS +ZCZkhCAJkJkIJEhkkgCYmWZCSEmJllkUgkQmUmWVgSGQmAlAkKiRmBggGQhJ +kmSYGYGZIYFJaCAlgWZEmmCaCBJgYEIIZZlghSCUIJUghghmBggggIQkggIS +UmkhAmCYGCSWVmSCISAZIBgxiVmkcEQEgkQxDEAEJhwN8YRygUCBTKzqrBES +I0VQwVUCmZgEEoVKaQmWkoQShGlwCBNVKBBIDUBMCQEkiRiXEqYATDhCgFTB +ko5QJkKRgFODKOBVQ3vPdtzBAfked8nkCmwbDgFQPj+p+/kIjmbTgiIpooaC +iKCGrAKDiQMQIuJEoX7uSojlEIDlIA4EAfVd/9V/b6nyWsgOoYZFhCIkCAIA +gCBWRWUIAhISQWQWEgggiISAqBIKGYkkJWQGRlE9xvPicp6X/jpv1/9PAbz+ +HuZ+VcFB3UBOmwIcDJRx6GqmiZgmgGUlHlP6PJcXNR0ih3Xhcn77tOkAV0tC +BVKUA0A0KFC0g0gUUlCtFClIUAlINUChUo9g9dgUMlH9fa/Q+Efd61/9/p1L +2u9/B4HuffPs+T3x0HIuBSIAG4AKuFDDCgRAxRKlBQIFCEQhDBMi8mKGR038 +/X/a979RwPueB8hsKPX/gbmSJugAwp3QRXIEV3chVE/rAREOfEVwIoOAAUkB +QcAiuAAUwqAjmo6QRX0wIiEqiYRVXQCiGaoYkTzWFQ1SGQlIdz8Z/F/B6v9Y +6fyONvrXLn5N+b2nT4f0yrg/PBeuBmP2LHeQXYZzPhr726K2aI3e2cBjX1Dz +qTwswMobi5xJ3XKdqrRTcwDP9jDVXWh+QdYU4fzuUeh8FPqFtzQJOSZ/Hc3T +Ze6sZHvSxNTXmpS0//RfzzA/jRuxMt21an97kKc/6QnFQ7Vlko/iQF2pbN0R +WETHDnQYzNWeYimJWaE8TqAQxDLedWHzFJvSoEqSYMDjweUA8yvM6rSOc2aI +5sUUb7TWun9JPpkiINxfj56aioMEZy5S8/4QUk4Z1jsY0A8xEyEqU2U7oFFu +rJQf3GA6hYK/6z5bvhhKn3fBCQ4EaZ76RaLcZfefAxDLqv52z9QfGc7PPoEv +P6Ld664cU/mUfCwZVCvck1LmlReYDbPwyybmDV5D/TbtCm+gzF3R+2shlL1u +ZlCv5f7HLnOl1bcy40wOWZR8J0dDJtY8cnrLoYUqG+yzcwkCkXzvsoHd9O6K +CqsKqLuJ48oy07467bA5SFParyaYZVhX1QQMLprq2Ot0rLywAffULSZSw40Z +eLfEcRuy2kIKMUgsc7Y0gOD9rs68PJ13UlO2B8mmgeEE6gzrv9xiU9O3swI7 +U/mxxvpsLlzTR0a1o18HHRVR/v8iWsatfpysLkB5EPjsNTC1tR4aM9AmNlP5 +jrCz5F9DPtUfFaahw84PoPpHvPef/dh7z2wujMGIsYxYjGMGMfuQQQe+/9w6 +DR9Drf0PG55d01ZZZZZZZYMYyMsssssssuuCqh8AFU+qKHRCIBzAKhAAwisA +IdAo8mHaRFZUchFHeiK4EBhFYAEyvkKOuKGlAQyRNdHCjJhFAgFRTJR/1Ucg +EUQyQBc1DAqiYUcIkoYBRQSHUowqKYUElMhVQyFBcAiuZBEDSpEBQDSsTQlC +ESsTEUkSESDGsKhmkTLQzBSxDLMSxkORkZGSORMYDDEGCEUD1SjBko6lHSKi +mSGgzMIYLBKdW7b/Z5DvPsfIbdETl/3zwJSaZlTGJq+o/SCsJsThQTKWwP3W +w+P8Aa7jgVzpKHGNBWexO39yRHB571f3uKo9QEVhSFPzwesZCK5CnR9Y+39P +0fVEREOtjFuufAICI8zo0TZXaNM3Klp3vYoi/sqPl+VeSFPlcWUX4Vaa0ECG +wKDEWMYsRjGDGHAYMOCOYXmVIXucPa2IF0b8rw5p5zFjJnDSPud8MQc7ke7t +t0TIUMoy1j+nL/qf2zMu6cSCKeecEl5Q8x9cXg8G4QOQAauZh/zUiPb+9EvH +7nxghwL11F1voqTfMDl9sf+pVv2hTg50fx4mxeq3GIqlJXOAg8Z/ko3Qa8RA +QEVfXleoHPP/2j6IQHi/FVA7zso+iM8tpC8tZgRAVDSKcj85GFoui9zMzMVl +PGp2l96wb2O23sEwTC6ACICKv7W75QTBXVuknzgiICAABNUXOZqKJx5iahVb +oeb/+Qntw7NWHfmyLUfI0ToVwaSJMHTGROMMLGmjv3yAmQRU0Pe/X2oHsHSH +qJUZ1ukuE/ZUl8aRloWKxQ91qXVKJC64asNnxrzS6NtoenAabem3rC40eGNr +dr1qR636CtA9T4HR1l0+X3Z1kQCt53+lubOLCWGLsTcMWiy9/Mij6qEAgA3V +2KorIDK7RcXBPtU7SZZXY3mksK4Z7FTEfwLbromifFTDLB73T89cTxO2MmfC +zBn7bBplSLqlwDYTik7VBlIzEe7KHIIi90Xr/Ta93yKJibRYRvnUkVfRGXg2 +grHMauOqUrgRkHM0LYlxxQtcBvxlC9W+nCskXeWS2rjaPLlM17NbQcg7d+rh +rSL2SLyXR8a7ULCORnfsgx7gBssQ/PUccsMaK+ma/jflHbmHner3KiQ6vXHB +u/ZiWYLmA+UOCPXl1R0vRgSb5VGNbiIbRBCAZqw4kIPb+JmfHn2pTr/tDqFh +f3njUV3l/c0Xfa8Ty1B7bOvA5ePfpRW6xAXmk7zvHGWgaGrrdFQ3tf1E/bMW +lTTXQx9u5NHExaBRCz/XwVbKF1UpuAvhEBcwA9r9//YUxhQcZIGFVwAS4BBe +WEVhFcCKwivvBgAgCAIFYpRAkZXAisIrgRXAIiEIrgRRcCKwiiwighCKMCIm +BFe9CK5AoGcCHOa2HUebUeEo6QAdZRyUYUNAIAZIntA1EUswr6fIaAAoShop +KGmgpLWQdIqoaQAxptr6BgAHIAGwg4ENQNlYVNIo6wuRNUDEkTLQRUQxUMpB +VDUSUMRJFUpMlDREjRQRMlASRBSVVFSLko6hQ/6TPTmIrCK6VHQoAG2KY0AD +mGpIQhJElJVYhSWBgliUWCBoqggJWGaGghllkTYxixDIkoFCOk35kBARHb7Z +DLzsRz+x5b3hYdODa15SIm7zMU15cmUdl6mp27t+dHTHtg+YDTQe/qp8MzvG +Z89FK7ZF2H888eustrptIXoHH8WXI5zYACIgIaQCCQggInUQAUwh04KQCGUi +YBSYPcjj9+BzIQDIIcAQkZuFwIrGGwEmVghHIBlwgHVuDkef+L6HsY9L/d5z +5usIPd+L+/9f5n8fieW35rkoEAcCMGBAXggohgBPU9l/7/68p1u1hFddFPi9 +l2BQTMRX2f8nhDUge/hDyv/uDeiguuoCuCQYe9ZBgPee1/v9FuKHD0nW+r8T +aAXwGgMAqwQA0bQGECKHCph9R73vfE/9/o0ni13u6IvZoH50L4rtGAdGvhPZ +eGwnxr9W/und770vQZh5iA9j0vSfg9x87zKjqURIRWRPFKMKHJrx0JlEZOdE +B4QgDhQ3gpmGhlCEgggkKAmGglggmCIpXlRFdIAKZCguhADSSJkZKulA8XKR +IyUAw0jVFIRDQqUVQA00NNJQOQp3hE0KomBAESUPk9uUPk62jGMYxjGMYMNj +bbbbbbbbbbbbbbG222223BDbaSGk0222222+JmW3MzI2222xtg24bbbbbbht +tttyomWNtttuZmZmZmZltttttuZmZmZmZmZmZmZmZmZmZmZbbbbY22222222 +2222222223MzMzMtsbbbbbbbY223MzMzMzMzMzMzMzMzMzMzMjbbbbbY2xtj +bG2NttzMzMzLbbczMzMzMzMzMtuZmW225Uy2225lqWNttzMzMzLbbcqZczLI +iISShIgXLSgQkKIECgiAdUk222222222222222xttttttzMzEogmW223MzMz +MzMzMzMzMzMzKiZczMzMzMzMzMzMzMzLbmZmZmZmZmZmZmW225mZmZmZmZlt +QGMpPG7CpkiZKPXhAHSZKOpAdhFB2lU7KKGoEDXQNOsIAyJmYEAYFENdHUqS +KbxRhQwCIOhR3DAiuxra6jkomlVE0qokigyKDKIsoiyqQqISICQNLAsgpTMC +zIEKQiISoZIm2oeu698LymkdhP+f/Po+F6Lx3le85ec8L7D9v/91T1nDUeGQ +IySpMErK8LABgAQn/z8r8nJ5MkSICEIeWh5ZGDIXUYEfh+YwuhUg0cz/b2L8 +rxvf9RsgE/ij/iEyCB1yE2EhSVIZXZUsGAfWfY8rjz2g6NR1GFT/r23cevZn +SfmYFNShIQDvA7n9PxxzfrtSfA+lg4SgQCHpY6mp2jqfGFM9wQvpeOwePhBN +8jHLbz1uT+QADP8EJsagMCeU9j/B4nsGgOX+J8/z3+WgNkYSRlXcQBheNUhi +cmU3ACfs2UmUUkikhAQYn2d3OMoPg/Swv1fKfM/58lyPe+Q9nzX73NifKkAe +9d87R/r2/jfU1dd53/n0vEP6OygGAVDXxhhooB6n+P7ngNGgGATmoqEji7H3 +/+/TaNQ9z1jKggqqqoqqKqqqKnfZwQ4QDKL2/cuBlnr/kZP0MwxzyITilKtg +DYEDGStZoQSEEMRDDDDDDDDDDjAEzExZmYYyloI4HOd58fo/k0mIKZhW7L5X +X3ufreq/yayeZ99hNJT4LDgvYfA/X7No4IbnIawGYUxM59Z0ABiACIBXJpMy +pvFx5ayNBoMnJGIq6re/8/mBkFHyvFaxlAJraByKiYpklKIiq6l/5lk9683l ++drK6wATAkpCC6TNMu6so5ZU0FHnvXf37Xu+j08tGtUjQTAa6YwUYHZHLIIn +7diqqor87q/5OWodQGPooCEVEJFJBQDJUJgxpJIS/Vy5KMjCmSzAwSZDDgGH +BhMRUV4X3X/u3v9BpgIOw4xEBrCa4BMZGUkp/B7zL7eeLz+O4ZaxrZjkhDRE +M805oZqwQZGaJIUKFf6x/v6DMgwEJebcAoASQhCDUGEMUQCipQAHIyBVU1QF +LVJQFLVVQUBjGGisOMZoORiYIvp/p5ZgiGf/0Om+99rog+R+Xo/InfbmAemj +b1da4ndNGs6ymNyychMbsY8B4f4Pl9HM/U7hxg2dE7AIB4jnE19IZliCZAAE +WENm9HkpI29oElsPqv7ZO1B71aXaJj9VRvVtujjGZDusW+fcgzKG9dwGQ85v +OLs6UW8bU92xSFzOHZ9eTtSoRFWarDM7ozxqQglipxsULFVHMgVm17mlp98D +K1oKxanQsljBNTF36hme5UThGTkUhbwtNcHve2G9+or3IutH+Lo4c+IIEfw0 +b0k7MadUOIg5zua30GKRsIqMe37u2SRO+vkkzSI/Msq+rq/FuHnY9VED+Ewi +bsYYYgT0WN/2jjpLmp7xXJ3xb3bYIff3K6EKinpxhigakwqQMtkcXCaBpnck +FcrLJrhPZl+/g8+8m0eolngo4v1edhVZ3KV1FT1w8A0JARQDh/hJ3Awy+4lU +gBDDMCF6kU+Rxi9iZC4uTZHNqJLKdhLaNtDi8rdxaQShoRz+/iK1dbtFyly9 +4rOgnhHJO7mugnsNXua3XI1TI5RoyEE+niZ9iVD0sKDs5KNPqCHVFwyzO03X +XJ7h1UaW0/zbQBM3Y4SRnlKXaul8sSY+zDcjn9RXXchD4VQ+V914plPQt2x2 +pcsYHjB5zcHNwk+cpFQqsLqW23lfBk6jEMVxUWl3qkKlSlDzqkSzXoE98mLS +qvq/YtkYYDiTy6Hjv6ESZN9B4a1LeSsa6kVZpjHTWngprPplWmGOrEmYura3 +7gF0BOt7LRjLq9uSd9rHdr/OizK4DsbTWyrxwnEth0O3KRAJv71YrlKW5XYE +QgifJgUAoAHDEQ3UZyXX9aSL6Z5IqD6+Ivwh27M2QoXgUWMjSIMppoK7Ls98 +8+Za2lW8bLP7+BVN+NIIAAtQ7oggACmM+6VbY3w+vKcj7VxdxoEuSgU77E1V +qUpu0tDXF/72cCP+hzDU9GeSbSURKzwU9/b1CQ8v6YPNvRPURDt7Ea7vb/g+ +6HIa0mvlOhaYm0JH+fvd5hG8Coj002s3h0RvmEyRv4qieEhC9n/CZAGLO/v4 +PwppTlmXSf9Z0l7kfenojmYW33QN6VEMPqDtlXcGDZjYKkyPSnG18pxRb8to +KhG64IAspdqtOXH5meLwJsGR/ouqcFLjgTfIkVi3m65YU2vIxnqzMemXmOmk +8kH/Wy7N1i6Ozg8Z4uQFB/kQeLJa7M4xkcpn6UdKtaAYzNeDOYMZJniNiNeS +rtRhozTZZX1LK+6IJ34vQmMhHZZLaF1ePQ21ahRe+UVgRaL3PNG2VZ+HBKYK +bgsLs2CkgRYZa7T2Mt7jRcdHvHWmDd2qI8m0NBG1GDmipVkeqDk1skJJLfBI +vSntrsX3H6i+Q8mfsCi+qMDedBAc7iVLFJclVduSQRwEjxoatyOUd7SiyiIf +q6zL2AmHMB0egfVI4hLtUuya4SmxhZg81piTEIE9eS1LCGw7ICiTGjIREQp4 +zZS1+rB8C3Jr+m1a2ZoxjZ1a+2d17IKQVUfTnwYcLyLFRLGBA1P0LlRJZA7H +j8oONVaVEbviIrMHtQEkPKjUCFAAAK7aNTYF7rBPpyLjuvslnRP9rfX4Tr7Y +BqXNbBJKXBygs011K6J/TCzV/qu0wa2FE8ftDeW5BMEvux6uxOnNiq/8RhW2 +s44csPPkdhqDZu4gHPvhAfA90ED42moX3oQ6UeVtf+u8B1o/bsQP/qZX+OzX +fIpp3ZZHw0UKID5KcgQejp/zrJO3WuNrfw6mth7UJXSPP/X2bXNQB1r5Esy7 +JYCq9PH2O0tedjes/l7NL+qwAABAQpEMPA3VcKCGDF1eZPHImSShdeaCdAVr +3Nx8OudNcpOARKIR4PfbFZCT9iL6pHLMpD7i7Jd/ANSGAacdo/STcBrLqT0g +qR3xDPgLhQAomhS/TKN+Aa1BGTno7TCpP2+0yBSoN9F3cxIkUu2fFgO6D1NL +IkTRzRuLwlbIGLuri25qrT7rRF4ayRsF1oEb10GHmGHt+hsOAiV33HZ9srZH +eKzfVOqqiVB8YsZSaA7RwwIHcCigieVkUxU4AOOlArfZ3Y6+LU75UDWdtM2/ +OiK5V+c0ts8xnqsiasF82rfpUm/NlHogMWrQBp1jE5TX9HUAAiWX3j7E/Kag +PAvrHcGchQ06Jjjpxt8u0NyMq/9zQTI4q4zKnLqi1TQgkGwfhozcm1EYPS9T +0lYyNYdj/ttEw/aeVMQeiBnyCDwY8cMWT9oXUdtfTOQkPMlS3dNePvEr23Ma +nxYTAEYMkWgqPg6ERuYnYYCmg6zQfvPvPFbMGA6HLl2UJZd6zBIa9DyjH5no +6Hv5cEsggHkSA2wWkiPjvVPXmwHzMv0vQVKA8Q5s5WkpNWtG8cKo8qsPuQVF +Rk522hvT/dcOLbbCbWG+XCjIryw2htS7SU+Gpbx9krYT4rgUAGN4dtyHrn33 +I2S5d95QSyNH2cA5cEI7yKS2gyvKxOCcbsuZFv9zSrQWAWr1m6HuzsMhZlzv +TWgePzBuEbL6FWlpJZ15Q0ej9Rp1FOvAEuzkiV2nJ57dVX9NUEOrapagCYqt +UH3pmejpXpB3a/Hjr61n4/pTTLpv6pK95PLmfnOlycyaOpDvnxOc5yC9nYRz +Ds30bYTbf9nvdG96SrhQUACghaibZMGj3yEh9oWntVP/J+LoV6VCQH52pWpi +zd/CCAZ6vyquZ0Ow4gtHXKngtD5W4YSXwnQGdPNgNV+rEOGbil/i2G/QC035 +T1G/zQ4pdBcWnq5zINBKIcDt65sSflwJistd7ibod4hA3m+ZgYLVF0U+sKi5 +1/L2PdlFnZw9LgXKVDhpL3acq0FiACAvyDB9Dl2TTzKAyMbru3CeXrUrq6CN +arLGMeqAyZ194zfPa1ns4l0gNL+P9u6KqfrkPOM61f78CKwAa42nSOndm52h +FlPMTNV67OiNs2HwuGQotBdnUvge/CkLJuHqHyV/mankL7yG2gOiI5zcUVfk +lSFRYDoAclsed/vnpR9Qt26hezEewcBlokvT8pM3VirEF0QUTiQHJY7pkP1X +xvOJI8aFGJAD4Xs/3/M48D+z3J7AjvuJvfDeA/e/g95rd5819v0fY/d6f8fw +pn5WuA3h3i5BXecVqnR1x6Gj7lKviQGP72O4S0LgzX8JILcduYckkhEXpbbT +fErPP46X4fmxANgrOs71QwUnyhi4V6MIMLmkbl8RGvi366XhhXh4CORhba+s +98+JT3+fB1mX47LY0CpbbpsseAlbKeYD/jMNqwfzyy2XABGa0+bsUsAAI+Po +zaTjXJ2ldP5Y1e/yuPEVHRP/bNPMkZhb9S7Hgb/fo7ruMPhqZHRU76n6sREF +JURQAQEKSbkYY+j1T8fy+AGrWEP0BcYYpUjelX9WIw+H0ZTibN7dKYEcEgQA +QAB0YEAATyIYVHyfualRecgQ9To4Pmf2+j7/vA1vd9u/Q611/8XG/T4n5HDB +P9oQoQEXpBBBB6B6v4TreytWu9wWpVqulnX11U3GjztelUGIsYxZw8nDUMWq +yVrkcRkd+X9AKp1MX8cGLKqjUkMXCS3WVBnJNH/ueE9QmXlltipse02qSZxX +J005QlMLXn9S0TJNsm5r3kU4YzrJ2rMo51LVTHpXlRjdmLwFReEDdlIkJT26 +n94bVQt6hbsZmJzuR0fQxYShpXuHvXJeNjrFSxD3aKJM2xRQIkQ5SOuAudwk +lGCOYU+/Rv+3Ab0m44hpBXxSDpFsTO4Ya9qd0nEZ5r6zRV9qLn0QMGQEG14f +JxRVzUwTdQOPEVcv9/CikKYeAAnS28Oa3gYfJZBoxAL5sP5ecE3GgRpA0MvA +Y1Bi4K7ELa7g32vpsIpb75EhTxn3OWP0WHQg0J8v8drG4j6GlaDusgONkcGY +qoDlw/1XsXHilhESb4ugwuoBi40VmlDyRVkD0cjKcDVT1A8gUEPpew82hKeM +J7qa3Dm6vc3VO+g0mdojb3sFO3aXcISK5iECGDl7mY00WCQaGixACYu/iUk1 +D0JaBpAGAiWpjavl6nnnwCt2K6smYRxQsKWvUeht9dvdpYqVDnu3PZe+5W94 +ff8VLu03M72dTBDZkzSD6pzgM/PU0resWHG1Vh4UDtS204aK8eK5T8I73655 +4boblvDwHU3yc7hOKb8oK1X1OPCf2g1c/w1S1nQLkEfKQH9X2GNiVfwVOKro +BbpiLx7sEqTj9fDc17Qd2KZdOy4Ek7wa5SVILBc7Ed+OUxZutCEGF51sbbZP +9wSHtK1jC3ZwBajSPh6cV1iTyzdlMupgWYD3GfH0MXMm3Wwh7oz9BGmdjPQe +TTXgMpTARIBOXB59FgEGV1HE9amBAEhOx4MP6pGxqZlQEQFp39frvzbeH6qa +XoQ2NhA1KK1Ycrb6s+UrVNABOmHk8N4YOCkUZRMfxBhMCa+seDEcRxVCXQ+2 +ZtE+jTPh1zehc7ek3X73f7I+T7wgAICktohLiAEEAIJBD01myY9hf9fUUhI5 +rdt+gjwtBrPCwpzT9wT2pF3n+H2fP+u8S9FyZ3M7oBAGBCUpRkPt8z63rH+W ++/O7B7Hj/Jmx/d8aQQE8F8/bROn5R/ds8fpvi9lpDGhAUcCJOmn4l3yZpTLe +Whp9SqqNZyvN4Zp7DRN0HyclBvNKiJCX9Qd/nR9IJLR57E/6777SBfYdlaW+ +U8q2GE/SCIpMHz+PnKm+haWsn+906Qznn1EB7YeK5VEfetaUIRol2Ew55yLe +WiC0cipnk1N6fVNedGaTdxefeJQ/lJjeWpWGiUvNrrLadACyBZ9TfvQw843F +ntBPdk3zbqvELjTtL063Vx/ePlTz6+mA9Cm+ziQvxRa3hYJWPNKbaymbSixd +NZNZJaD6wAlqb0kPymIPEdjQpbn9YqjlIOwjvcJJdz1tSujJnlMfcueKdu4q +M/RTb6HQoIugdXPcI8EF7bQrVp56/rLuTtEI33BCQAaghiGKEJwn0qojvkXw +kfjcbTHIGq316FtTHsS5K8TkVJ+xjRI6dwdx83GP/iPdMzPHaftde01B8BWF +Z4rSyP7GOD5s2yU7dM55YX0b2Avetpoe+4NxLh/8i/9ry11L5zW8WjzdyP3T +S/4lVwZi/5YfCLYkt0dtd2fV4UJzca2G5c2F4hnq1l/JlNMmslcog+jimoke +D63Pdoupp75jVWZ9274Bys/hmTUkFbs196HhcxOI2OglRgbBISm3VhyTAvdC +WczrfuxStMzMhP/89A/bBPHIvnHJcfsACPsN5xROWp6sEOyMZaITq3m7oWXL +lCpM4eHpBVk8xvfwt7SM1RT2iiM1zxKpeYg9XQwrZwrbMXauobAgBXfHs1HY +/60W1LUIFAOWR99L3l6o70tg2r2gVaB214OT99br/Hd/6LmsjREByqX3RYzy +P27edn/n9tMqRHdm2z8fd+piOdmXSuwliGneX7GcgNYFo2NoUFAChUn2DYAy +uhd7qgCpQOqihv3Z9jJ7xa9OqfHzfWVNOY8Z4waUscpJYAo3csFsRbt8Ayhq +uotQ4AkQBFwcJUKjTCvourADSOtsGjs6gCZa3kaYr5rq3N1oPgEHvun/4DJn +xXr4e9UQNSLyzmAJLzPgeynzRnRuhISAEob5gGTVTaxuWaiE19YYVyWBMxYx +OIPREt07idK732GVlU7P7alBcWfYS7BM/JdycARlglsEAPr2jat02JGrvmnK +26+mcfjwCAAAj7NcRclg0dT7dooten42Rbe8weATwAB63wvifgfX7r4Po/Nc +vsBsogQsooRCl69RgOvIzVVVVVVVVVeK6H3/X/S7z13bPYdL+39jtXnrbaXj +lGxUfEgBr9SdBjsFbcSAGha5tvle0EfMUB38fwLb4MFrlLvs+3FrnLD8ez7x +z2KRkVXaPpfCVU/C+9egAAHKYoNcMIaw08Qb4pn5bRkxZMv+T+xfSV+JLOsk +AvmSRAIlgMe7Effv4M+wbK1wJEv8Av/eXupjXC/wWrwXozC1ldyaLd1kMPRi +Ytrf42/a3vtNyAqyqBakKjCuhwCNtAfvu0QzBSH8D9g82cDAXPOI15dBLZWw +mKDYhG5DlzqBnwS6UfzxDseWcZb4S+sApI7wL21Xvrixyqhyp668/BZDCs9v +Rb/tiwkyWe1QzMqibJfsg7Z2dKdmUsR2+8RSvuhEGtWzzCJahNM97FN9daeb +a9iVZ3GfMm+76RpeJAZHQyMLRCPUjDHwOMIrzgb3MX3KH0BKqBdKlPVotmLP +oWPq/QPyzAh+EJshYDlD/WhhS7M3vGKozCj6TvzMmYzeL/Nf0rAsd7IcNU5w +uIBwhx879awidYqmRpip4Xvwbg6gSTCGly07uZAWGtxiBK8tVyJvyjwzdzeO +0ZixyxxPzpNeQaiTj9TOFBSiE2hgYHSMRioWXkQvAHCd/YbnCmev4YcsAjZE +DfaQvlfZ/ldv4FXsAau5iSYdX+Kj1qiviXWvT2HxCIeeouCwLKj9pcAAI4UY +ClKyoRXhyR3tvWykY+3Xq8re05H/qvokUI/B7ehxZ38J4mgfrEAAB0hAHgQ9 +XqeKwo9IOHjS0xAQAIPd3eHHe1lSCHuj/tEKJXY9iCKnyn7MupFFolaoYXZy +4rskvi2TOTbV8tXqiwvCtiFLCDNeF9TF6Ad3EAtBl39JYU4uTIX/hqBaWHwv +OnYdUXzKoUICk/EoPG9S+MWuJ4OvDJSZYMR08pniajzTk0vq+grXjKwThU+y +wk0BcaxWEY3Lej4FYfrWTc36eIAIynbXeu9Nna2bbVPi1Fopx54Fj4sTnz9A +Y8gZlufmttN7rzwYiA+jxMVboXJ7hM5L5AAIDuPPTdDHEQFWx8NKLeo7fvWm +cF9ezlHc+81K9cM5DxX9mV/+N3/Qf4t49Cxtx6OlkRsLyN9utNTt01UaohCE +ISyKASEIIAIEACCMMwQyRBJCvGyslTCj77f/Zx1P0HzvBeF11DXhvffh7n2k +/mjmPM+5851Tecx3T9fi+/9j7b63kfyPXbnDB1yUe5daKRTFDiL4L9atgtG1 +8hDE1g0J8SHPhtD7pvH9DR2RWugRT8EVC0YL1pcuI+Mr1FiyclGIBV4AdP/T +tYMLK8nA6ANgxA88S+oCGRHs9hJsnpRjzUkVUgvz8ZMg8D+J7qglj/G06MYF +MWeSjBzNMe5K5IWKqJMEF8LQjfO6bjzHkRcbG/fhAAA5hADqABIpuHfr38wc +E2YIGVpJjz6p7huMdaVr+dPz6TC/CsuzopDRWEFUhjpxSP6kIoOHZriHsYLW +uOjA/cbbnJl7R1myqLCu70XBs231lXdapZ5wAICgmWKObPFn263Y8Zf09Eje +efgHloszuTXTFuITQADh551ebSxLDdN3loWy6915/L9KzCGAMpb8HabWy+Ix +8czEplWfKKfTTR54XIz1U3o00hm0552f2mrE1zefBRxF/UCaFPxI6e9B+MHF +wBFPvnwNgQ7HFdYbaesfI8xFrHc6mk+kW31Jn7NlsE/ddz/p6SKfNqXnZIHq +hclvZrfSHPGUDWXzrxGDtgn6ZklTU0GcvH0dmoKAIYAgAoF5s9vMe4vtbx6C +0saSLC4FWUbcow0fFSxa2IR7mR5myr8MqYykymEUA5nRPUDEAWOo72nAF/jJ +Kt6W05FgffL/dO9KYgfZ6vj8FXqofnNFNiuK2Fv5bdf8K9JyhjNCkKoFQ/BI +HfghtB8f88HYCkaRwmAY+KilxE3Y9a33uJoAeHL9TmZelq0XyfNAoveCHkQs +1vpz69mUY5Vsl4DchO7Ozr9kzncPPJv/eBAookQGis1RjhK33dHon0AhwXhX +VY71sDyeIj18Mh1hdJq98lCICqBNwWgmhJg+aS1i5rUfUxxO8hpqHfD8f62W +Y60RHsv909eGPt1AF2UwyJ9m5GTDQrEJOKP1SLYsuFlaiGPnmp1e+Fk3o7vJ +X6aIeCCXx5aUIhKVUcE5nb+i9miohrs3rnjio5+CnOhwN73VW/wZLYr3SvXn +EnTF173vBEBLgAgOOkIcxRaxoZ2Zu3f3+i3svn4/iu7LveS2vUL21GNmGqyr +gaKP+PUQhwYsnSMqzUoURKCPg2cYoX29++a+3abtrr9vFe8FgykuqfBIA5mL +WvA0bYwBQAKrnNURkBDkredeFfRB7UXusdSyP0/SPiECx/fRuvZa26cbAZBS +s/h4kos/WO74bTYSbEu9QF8RoE6bOsfkYM8i6OWZz2Fjq8nXJhxxwe1GyNLp +ifbrmtC5fGi+OkXYkbmYj0donToFR/osWhSvvxedWkPvaGEkHosCDJeG/6Hz +/znLszX7g7lZW9ErXABkvejWn1ejSC/abAaTAl3PMBHXdg8pIXNb7PWnZ7sz +zpFYGTuG46+lLQ/9b0gXGuRZMPt7IdcTtGvHq1rNtHm9RL5/66zpzYPqeECm +BCjNoaB320SCxuwqQECePp6dVGJNTpUzn/oc+rKmhCvoqo44Gd7hSmTb+hAA +9aEgiM558Dd8p5E1He7R78eSYYMywC2/SPLciHYJWUMd/smDMFsoP4omvXvm +N+V+dG5qPZYCjKf9ZqZ3Z+HLukbEiIdh5MgCPgkJ+5TOo5OIc34cODQFURUd +9ljDZ9uRrsS2V4hrh9XkuspwCAAW2Vt4NVlKguiUq8c2Kd6TsnZEtGUgfWe2 +kZ3TnWbTU/qIotHPrN4+B93tdrUdEmb1dKSO/8I04fxHDuqDOiAAQAIWDxma +ucohhgxxRVLsFvnKT+be1Sso5qYZTTH6njJouYU419C9zZ8jIUBcs1Wo1PTr +jcYtrPCersvF/BJ81cN+qBYeEsYr3IkPDe+ync+dxa9BRvvEfL3MsTMj31R6 +M3UJom4ixCH5SCBzMByj2PnwLuDKfpLMLiX+extRQ5PKNDi+2YtnO2lEwPFE +43GY84CbrwNOalb6Yya+BzBoxsywCk+TpB8KoBeuUpAbdbxKBPrnrWll2n2j +xeMcHgF+LCmYCb+LWAFZF0gmYjtU6zr2gW48uETAMe6uN/YwSKhcYHL+2TpF +grruD59qY7aUWRVTMfzH2BI2QLuzD8tBYbrdVy0Fomr1H3ebIdJg10BDQgQA +P9dwJlt4acAh7U+FzF9X3OE8sPIzlw31U3PQnI+d+1970v2OUBTsnK1VVVU1 +SERr+S/88f5nsXK+c8X4DxPQ9X/n6n33t+/35DG/OxZCQrIrgQZEDESS4UlA +hJNj8fodjofv/k+y4Hr/M87l/Pr8l5j4Pd/Sc76L1vlOGokgBCEAyBAASpcD +f/dpL62r7ufQ1Uz2dchRv1hb7HQi3zZuJudepfjgF39881bLgYaflTM8Irvr +Lh200fiHtYUC8XeSsq3L8T6ZyTnc5rZHulEmRW6m6Hn85CYQ5dL9sp8U739L +iZlJCZWr5AY2MharmyQ8sZrwn22S+E73Ez3J2WS4qTI58IcKOc/8BPlP+/2j +SsRwwTIWN+oHYmJrugdl7bWhjbMzz/nxc+O+9BG9mrnt8iW+qqD/MXbP3nVO +D6NislVr+5jKaoU5OdPG1kD4sK/Srk6lB57YHAsxg+CY7lUSaYJgnAuPJIpj +MKlQOPtmQRjvBSbz1/ZGmfmOZur5+Bguginr9YJSsXAzHT7v2sLmNwgIzVL0 +mE5klCUKpoaR+yz38uavNSzglCgeZl8N/dhe2D41LFYxEoQOd1jMhLQyq+Yc +3gXB0NbPLl1Q9x6/AtIP7YF0rb+9yPykOUsNbFQ53OIR84vC9U+yLXHUE8Uy +uKXG6TFOBPqLmHZlgpkFK73Q80bsVnl60f2d8nsWJGlc8LYlXjG3GlEDuT+G +2tv8E77f0kXX9bJnAIzbA3cRgPTpSxXbbeU2PpT/TOFFDn9UW0z22jEdyyPS +s5E/mnXcAAoAU0+Cxc2/ppfdzmZCPVDYAaiCe4TLnYyA/7RwsCj3Xv5noPhC +WpY6K05hlz6rHghXF+gAn0MyUuu1smkH1/NN+cp7EgKo2gupqmE3XmTqPNtE +AjOP8WYiS+h0+WKrY41FnFd1RLuLUrH54AfrqnxmwKjZfybdz2VwppZeTwgA +BZSxb76/7nbNdEPSI/+2Jca2R+C+YPHVCTUZP6NWIxpXbze1KTryO2WDr82U +s71GGMyUWqY/T4uj8NYdw37Z+v3+Lxdp6Cy0sfeFAALjIZOkDaKBQD7BANrD +ZXTRrq12OQkF0lKwOTgPlrYxKCVLfLmqxw5YPxOD4boGjHH8gbc2Jaoe3SNR +VjTzta/Mvos2/ctKJQ9icpPgj1lul7p28rfhw1W6zyx9tt7fJg/3ergiAwIi +A5YFABCAECgnaf1HfUZOIOnN3tiosOhdGBW87mfgc09idiUQEBABlfPLnEXq +Pq61L7rO+ON7o/M0RMic/Ajmzl2eJwG000TP38jDKCFURo/WDm7Wmq2yOQ2X +xbd36jPjXMMrUNduLtDvYb/tUKxDhffCgGuihRVIBt/6czu+ZGUx+6dRw6Xj +KMJP7I95VNpRMveKLiBuNapfkGvSA2aVemnoRXXgklGbmUW4E3jKmTtEwpc8 ++OMy8WyPEROWRkYNqxZakLnPxVCV7l+oQxKVhwCNN6RS2coqQWuucUAauYka +AH+msJ3zq2+HHHh5ZP+rPfqrf6vMkRy6Q/IJJtcdEqWlwSdO6CR3ija8h+ed +yV46znFJFcvV3F/ZtQkl14RHxDtT/cQXq9Un+2oUEasy8l6ZvPF9NuJlNG6F +eSb5E33IEoEvnHNElSohEueVeRfJh4Zq3149+yJ0aijUGc1GY0In5LXDGmZM +NcnBL6sH4JFhGf0ND+E+jFX/diuNrxTOive7r/pwgl4OPc5AIH6a9JVKni3f +thIKl3AiVg5D8ejuBhnT6FUkfDHifYZGuYTcXhVB8B0ARtgZ5WmqLQSjp/x1 +LOeO8WUAIgQz5VnppOqGJfX7ohl8qTzZMbItngS929qJSvC4k+se4VpCrgFx +8Fp3eiusq8eodosk3GPYge2kmMpbxg2qabIUMgnUpJQfI7kCfKD/IIhlOTNi +eqpbzFL2pnYSLCMQCEUj/2rgZO+1qgBgMzOpDjqCpvco+S9r8NrOrP9BIHRO +mvDkgyamLu4f93ftY0v48xM8wjTkIFEpxyHs3tBgChy997s39lsvVaNyOdxw +QZjO6OEOPP38GW8TIEDWSnNbXZFQqeTI3ZjoUzhjoOMFMY5eEmVsfJFurrb9 +sD0v65DmPA0ZXvedtvKkGiEBtJZE8GCAQPVvEfRa3Ck3Oc2VJi5bfCxdeg2I +sd002krUe/TbjmIY7J/wYE9/vI0dDHCt/V2alWbAAAbx3yXos9e8FAgcOsWU +DFHWMdTEpQv7CGkHmkf7pnjjjhbPi65bSkGTGQz8dOxbKGBkOcTI/+qrOBQE +KKvCY5bB5EnhytkwACgBUU0ZvfgIeENSU1cYXLscY+1YlT8NubeXxu5wOWw1 +TYn2Fy6c0hAa0dPz814WWMTFMBEBQ1vO1RO52cNA9GNls3GaA9lA2/9xXGQ+ +s307sHNbJu4Nnq9WwJDLy6u1kZhI1iyAg4fc/QOGx57Gne7nYt2bM/c7ntEA +Bqobo7+y+UH1LhZz7q2vTuH/XVMqheSU5jZPakd/Rp6LJM2wDRJlXpnO9+9S +yIHviXh9a7ZRaZKFmcRFg9nzyOkq29AsUrcuaKaBiv12WZH8S26ZyO1YvSrN +lq+iABCaZ7LFD1anzfrBjnCWWbaxLKwldFujBgrrkK660KgASgJU3ld6gjjA +n0c8sjlc7xHUAoTxEM5mF8ObL9rJXDy4wYqM7P6xSYh22GenCikmCZbd1meL +91wrl0XXgU775nLPjs3D464E1geM9T0mggQIcBoKD+Nnt0ifKA1YFsPxMCl1 +qbLgpNGVRhdB0KE5/81wiL8hztzW9nrH1ieYBWKSXbkYyeTeA/vDj9feSfhJ +iogNJpFQiBPXuVw8fS/y/Mxp0gpuHW6JsOZChjVnqZhPN/apaWuE55qzFF6G +d23lhnF5txgzehxzzBCfgyCAclIwUAlZ5wFZEJaf+b1tM1i7+NlXCpdfW4kh +nfieBp6r0vNFTxx+G7opZVqPDTB5CV1+AAPC2fpFV5fa76g+uCE/Kr4e3bsa +lnX4z7oKRf+RnFzWTOTg3BZ2Sa28guYttPJV2t27+K2aHjW1Pe+NDW2GDGvN +bUmWscjDnKINcnKuXdxW88DILcVqA0FamQpBAxF60DQ8nO0fNL6lZyNPhFAO +/KjTnZUUL2yERh/JANKDsvBMeXbTSl8Srfi0d+l2fd8gR3As8EQAOATO6Aqy +REhbsB+MnBqpdvJ2Mrw4MF9Bn+4U6EciuLtdgKDTVAaGksVZTpTnKN9ogAAW +sX0NhFNsQDLf6+uFs6qboQwyCEwTk81yRAnt8IJVlc55s+/WkRDgNVdozGDC +KJudkbcslKrtobpwsxq5DWBa1VYBBwmD39CQBBLQE3LP8Y9wnvJbN8fZBbuF +VS9i8CYSBiDRN4WXOguKpOP4yxrUybbkF/EAfHo/2CWUTYx5q93BcBOu1AYx +fIFBQArc4o62R4p3XCiE4nQw1254pIdVhvesgHXGIHDIIPJe4udwy+wpEEAX +Gd6dozxky1SRTqfBNUKvt+T97rgxpzNb4ZLABATvQ7J02gg82T3AqW/ABAaL +2fLbxjw5wj6jRUOiooP7JdyQYqnM9WQ5zMBARwVsBSSzfIq4uYU8PE+KlMms +wIANsV3t47hR97BKDNhMrtBXpDeDI5pIZ1f905ZZFAXUcbXlwII4uBA8Vc00 +zfV09rPfwPP8c+8ZXn3XOgUgAAASRAAihQwee/0wsoSJ11yFDAiZKEoYEIyI +BDCMqRCByv4PdfP614L/3z/4+yc5s/+c7GF+33kURfVd7KpggqaiSQoCo7cE +RoVw/UMjoTLECYDBgcgMIuEDISGhCFMS4aYIcIYSOES2AgRLGoaYgiMBcELI +oJiCIZMszFhpYiJgHI1Mw0TDJJJiBoYIZICggcASQIaEEwiQkcIiWxJCSJbE +EwoklTLBBJAgUQhCEIYxggRoiUJwTTRZZsGRkmMiKMCZDZYwYxhGZmCqDIjF +VBDNQEQEoSShASEkhBBAwrVMEAVMDBMEMRBDUQSRACCAgAAaDZOae5raN6TT ++GyEMBnRtz+P8G9TnsNrIbbYku67vu8HuVe0EBQNzIcFSOKIe6it7SUVNLZ9 +pDVq9PZQhwsaeZrdXRoFa2gRJR1nRd6Ti+0HDZwRDFbiF5xrsGcWL/zt+tk4 +I62l4g5CwglDDoAr+U8C+Bw8EaLVDvI6J1qqX/CGMdPM1GC9yX45xKU6WA0I +aJtQVg0dR/FcJVn5ZHVFUNcRxDDF7RIi/hPLyzSUhOfBYGdQiujuUHXzGpvQ +sHuDNyWxAiGMovdcPF93fMpbglzL0+xh2VDkR1SQ1k7hlOsGsJ9cxvxXxTeY +lx5DzkRMAKN1DbmGOqvlbRqPhX7PvzYCWTpT2JeGkMNXHDR1iOa6Q6h2sBjg +sPTbO6wN/ZbvvtWQH5jZodXzh53Sp/OavPdmOuHYIJHj5uoT79Zevn7wxW5/ +JUUp+QAssuLhzx1c9joFZm46PNYT/I3K4lsCCRHb1QSGTwXrr6sIdVHycKmh +E6DzRO1NK5Iv2HnjkY/LDGRGNBYNGBIuaZle1JhSWqwkVen7/fP/jFw7zxcE +phjTrvS26dtILFsEM599viv42AS5WvVMz/5QLEyw0yYthM2ThwPvJ+C9oyCK +r2/4Drsce97wRWgg6jSPaCMjGnab9NeZmUcxNUcutKIntrlucTm/4s5hQxqN +57auIl2+YvRLArD7qGv+vjdFVCrwRUxV+/Qh8Jv4BOqI+RMbCcrxLd2nD0eZ +9DSNzKwGiX0x30JKnpl1EstPxljf3oSL/xak/5vFoeQ/vHnKHbU5SSZ9vZp6 +nMVgbWFGrdPa3twEnEl3QH1zWk9MCPNCdcb8Vq/BN/Vx9qKLhROatn/gkTem +97NvZaA+CklAWQld6WYxBYTtnw2bDDwuT2xdoG2Yt2BBIaVwue7CS2A58e5n +hPpfd47wQTpHadPG12mQZNwsiVWpFnDu0HhLZ7oT2JHu8DtEqTc4FvklKYY4 +TwSyjgEoE1YZPKcLAlaO4wsKrWII+FjpWLs5zo3rKJ9c6TQad76435kDz3/m +6kZ0kHxDsW7VaoPHSxttjXd7WFE+5ad5LUi1/bTpMSTGeTNDgyXgED8eu7k5 +t5EoLE53AT7swjeoH5RyFlcPdDfjuqP7j2gxu5b1/kjdlsHQt+jXGO1mtGrw +zYc3NHP3/vERyahlUYtDeS5qchLuvluRNJYGU5/YpURQZz2H/yyHb4q3dR/h +7KaYmyg2g2pGgAABo2ceZdL6DQXc5qB5loc+Ru8DDf6FTxqTPLzeeXLpPL2e +SD3Zvqo3LptkgY9YbOR6pXf29Ah/rpj9560xRan/OLwZmbwpADv8vy+bbfKW +a/cDdMlOw9XZbnCvtop605twA4/BT+6a3eW0J9dWg7m852fT1gOmN9KWmfSD +ltCJx0fD2krwNVV34tPcUkXKbPf3mFKhOT+RUn3eGpZ2qN/Fv1FMMe6q5eGd +oX611HUKwSSQoj1MAkY7XHqr/8kgV3/6/ILDI+mw4r9AiUhJbSuYicrG8Xv0 +ETKzQytkd/rukNmabMU8y7oxBuwhh0dSrKeet4EcZ05Nx1byKJTeUnDWkjjZ +RTJaGtpb8b6gbKtMyjBS+N+1mzJnm5Ql5+4RjcLYHnhv8TUt8W3JoKkFGZ7v +rdhabSaNbRC74Rq81dRfc37O8hgfZle4gIkyID7GUNr4ShTfzxmIG1NbfEYq +uQVZR0LkjINzhjuEemdeRORL5pjl4hLGSvj6wQ90JPcB7ALJpwxQoVT++o1I +mzY088YtE02rkhZG4M/32/Qa/5i9Hiieeh0bPW2eT/CXt2MhOeyb8Y+y9+rF +XkLnMWB1vJDovq8mVcW5f1kl6uQMQLvcigv8UqhzxOwYeBmto6eKwTWaVRWI +BeJXBi1UPM14R+8/iA6q1XfmlSKFYLaxqCpXdS960Lx/C+SshkIh3Rd7wNT9 +Z2O069uqgIcABERANjNlbbqZx63X3wOVp+pw9OEVfu2U+IiOoIc1JDEH0cfx +O8vsUknqEAaudLRAzeqTND40hlNA2IAnGJ59qeCfT+NwKJISEgChO7yMTFyV ++evIC5cC+8nXUT2z5R5VLW4FrvQCjA6XtAS8B2QiCi8jBhs9hTibUiKsQ0lS +FixWihq5m5eE9WQb9Nuc+FShxV0LPYCXn4kaGqAuoO/mFUbiDbWJX4mPVuJ5 +agX1rrFUkv3gq/tG3fZXtgUhh2u36oeKofVudBDHvo38vTTJKrizPveCEpin +0xulAR1l8/offyffGVgRjX5TCcNeGFhvSm+6RY9gKPca3yqZECH3bzzNCTdF +2ga/geF3IlNqxVXhlkip846F70NT22tCj1U/p5DNiH7S22grCrbOr7YOZKZL +Bvt5D0EtsY3z1q8NCQdVXvFDH/vsnhu/7Zv5yEh6Dg6Ma7rPBocspwhGv7ir +XV+kOGueB0UJ0imrfuxoVresFj9u45XWBKNnmFGK3DHnYam9M4nZGgf5esI4 +upUDJ4UP+ezPlqJBbqbwS7G3loEKm3Um2Wo/RldRUxG9RfngepnTTqfHLhca +oGH7eQu0lAtd98UXdFSYWlQ6FL9gQ84aFjioJrH0O2ujF1GxWAmVlyXVrmz5 +JEhXR2aKIvU6Bd7ihVjCd7Y8YFAM/TjC6Ze28KcE9iUeXt0NINtGXtRHIeU4 +ja72qwCO1BLObwthRlfLcyuqlRPuEtvB+n1aCSi+xJEvrY2dRFj973Eevvtt +f1N0uv0PmZcFq3NWX7OspZGDdD1WwPLv4pPZTbN2dsAiA27NK2ILYOIg74l2 +WMzeSHUGKVIk98Gx8JqAGyFvgcc4DXEmd7skYm1POQolWvFhY0vkpbEAw534 +FK6khasoYdDiuah7zrVVI4V3FwNwIIj0gVp1IxUegp994vcUptdMWkTmEEGj +E9QNQY0e4IgPD5SMckvIs77sUO1yPdo5wDnW/ewOGvPhoxnQILX2g2vXWgAQ +HocuC3bdA/MiXqypBjHfavoOpGGqNVGB9bVdqEFMDJ0pSkqpTGUQns4V297h +U9zYhf7FQqzP4FpP9nUDzXaFEXxqKDl8TrP2On7rve6956TxDPle9RXJdu/f +/a9xxPTdo9R2Kdkm3NSIYd1CBGPS856eYlahsjEn60ONHYcfufC+giLUG1cV +1EzURKApB69dyKvNpSEOM6Wpi8isvLPN9YshDDAx1uSfsADnYEniZj7Fqcok +RWQexm6A4RjmPn34NXhbGdtJn7DcawAHTgIhfFFbQpBGrmpVDDU9DJ2zlddh +R/NdReFBsorQZ5vjjLrTH5TTJAVhvOnM+C55w+aaKPrrJQ5AYvwFI7DQ4gyk +LwOrsGADeFgNG03cRoRSd0fciy4YmoqlEpw6rDa8yqYJ9M+rN0WjzRD1S4uo +7TTQI+nAtS7SoqBsrC1R0etLDI6YjoUTBFUsskdllF7kcL6GrLpUl1Q1hhll +IRLT8jiCIamttZkwCMcxVvzB3uPvzE73qi3AoZNsPN1oqsY+PDVeQVbS0rcb +pkStif00OhHhiKlEfRPSx4seLXrJ8k7UO+D1FGCBbwEYjrLUPhBEytO8d3p0 +Mttj6RNvs0P56Z/XikfFHnSLT2jSdKkkhJT31Y1J006HXyPYfuGKRI7UuWr1 +uwsfutRkBNLXbbZtKISazaDd9nbN1nHs2lRF33XXOl6TtO9ndxx0PXLf+zEU +Wy1Hikd3/dtil85YCpXowVYn3RxGoq2aWzCfEyIVVn93a1RTOji233a3ioTl +l0L7ChywR+ZsPYmJ6dXZJ0SIWU2RgsyUXptI08aJYNAUxJo14XeZdInEGtoS +9Bc97zFFZ8w26GR/qBFqueynIQ1T4+xBtcw7Su7IZ4qVVGDvFNrWtBgxTRK7 +KUpJVY88MISwJJ4MfupadPmDA/BUm6UIv05AVKg7cFRNxkX550fC6aClEiOr +GmG15i2oM5WmXtzNAS4MnyQBQUAK25ibdfxs7T/H+Ymrk2cJekGMBH1ySX9K +tf+oF6IexG5RuZrm0kMaE9Ci3qvnLYftQnKfNnFRrrkO4iAAu3mr1UQYAfZP +UkHD32/3ETkxLpletpOygd4BQwIBADUfyGy3KKaP66TrAhtsTQqS5Vm+N7fv +Gc5rwZE9jxKk5fjyNykAgIqZCE0nbqK0PucFQgABgTD9mcGyuyVzgtwDpCm4 +4WRMCaJrLqyGS7pTDHL+aujciVZVVTpqx7l17DbLgPyo5k5yJe5UsCtDCO1Q +cl8HCAhyblcQew/Zbl17vMOnsxX73fnbnrC/SgvX5M56gDe7q7b7OV+16VVV +LZ4q0LTJweuWplrp/qwLYxXz1DF/TVh3EALU6zDjAYcsSRX817ktefB4i+89 +r7V0Nmuror2SNmJq1n3J79YkMJNL2A4CTLJUlgn4lmyUw8Hx2cXTb0JQddAc +xkcpBSZj5c+v7pIlyZVmSeuTba3VfQtV6HS+Z7u56vsZsdqDS1PG1YuVyeZ6 +sU8oSNx7R3VHr3MkzUdmLRDRqLgfSeUdqaG65n9Hd3lODVZYSdUFLZ9gCgRY +DCh1XNNys0rE7lBeFgO5QaSHJMjNyMi4eE7Pm2O2/895P8vb4xz/C1Nyzzvn +8cxjgsivtzQ1bNUZ5pz2Y7QkRFsVFMlx7oUWfoP924lNu5UcKtP4+evN28fZ +ZfiQrVL9YMXHUbRavpEw2q1yl551IlPAuVAdAE2pJDbxkbGPoFZkgN4/FQuu +kHIp3yZ0COasVzTnJVi0fiRECBbBwB32LtBSvjnahpi2+SYahWO1kPkRNQvL +jBEyRiwvG8wuGmr5E+Ejg8VEMv+c6WeNeqY2Bn78kHuWNTMhUhvkI4CSywAw +8pwnDSew7QuCgoAVaBWFlSrvVJEpZbZGLNkGG8kEKS9A9fTTAm5giK7AFBz/ +Bct3OuU2msPvPu7h2tI3nOPQpvG75nB32ogngUE36qfHsIXeGPXEmPUAA8F9 +z5P+UJACRwAav7sR6uNBZJn8tNfA9HciI6ytdNCFNsqeTScXKVdfZO/pHkAE +BWbJOjN9bH4AIDmaZP63zzlz9Y+B/UE68FbIvdOr6zt6U0zBhPbZi53DbLtE +YqP764I97zVrs6lXNdxxAPz3/U0dbdGSwnwAID82LR/vYrLWvNeobMRa2xpp +8PgBVR+J4d9xuHvNSVn9Jvsp1Y0FSAL9m4f39aTozpCZwBEGrIsKAAAbVVPc +uP3mnYKlH1q9v2X4yMVWFt3YYPrVazQm0sNvWIvtmZZh36qQ+6ZCwCAWqKXM +64RswoakHHjIPYCcfbb8AEm8AASHZ1X77NtpFUYFRWspiFAOdy8/R9ibR1WJ +pB/VEyykWIsniGHkskv2x/GZ+0L3b+KTAKPrt1tOoc+J16t2Cfoz3D0zNMta +Kcg+aaeO2kqw30k+G4Ho00NffPFRiHZUD1dBBjE1UaOig6KrAH3ejK6RTdjU +PLjatIc1NQ3ev9r3f6wFtkKvXlp7PvTHuaerXvnwMUZFsPYPDotO+qt71OVY +8DyId7dFWwpBzmaWK8AaJjsEeeC7vEBxw1DJQmxgAw7V5BRb8MoMsB25zGkv +H9KRObsYe7vDmfOIXsUZ1IvYENm5FYi2HKOkgUhbbTXnzdimTvaEKt+VCd/U +tJ5/DacZMLUXfj/HuDL30Rfn/dESgxlOYnN1H1zRACL48RdMYnJZr/vczx/4 ++cW12vQ+27Oe2EzMJN2DWFeVHf5i30BqtOW7WYPDbOzu7/kVmuAebhUsugV+ +bSIem1KCKDWkX8xu7eZrior6YycSrolMNItWKSflL/jN47PvzMyaHjcKUONh +1+NtS2ApaUMgfiYQYN6u8AlQgbtt+y26JtmYTFheS8X4aeIuv29O1178p0/2 +CMWRmuSJCgd9iSHXFewiibmnx0Ae2t5431WlYBW/Dpa7n+786PLsOwZXn0LV +ucp43enpLwzi2jexqasZCy+2s8ZqSdhD9p00MCt46rmmmD62nOEbKnZes5eW +RmElnvztXGqfbTqrkTswbg4aOS/t2dnzaR+zNbwM6m5jVwPklUlOAAvdHISY +0pcDACXA0uxDAoSQNHATx21KGcvrxw/sOeRL8kgQjBXOi0g3fJ2Bpec6GcXI +H1AquqRtIDKBd5aDe3S+yLgrxlJrDgv17B3vL1df5S8JMn/XbOL7ldV79/Dn +ptV6+sEQHNed2wfBxqWEqavMbYo1RyzyVKSCXp/YRutSZB4dND5R2QPyoWu6 +kbc8JDcrDH7B9VtELS2Md/0ddx/7jvVnWFrH6yGFxr06tPkZpDis2pZkNjR4 +JYb09TRr0FZosHLPWrlc9TI0mmLnt+fMK+udEFJOs6zv0G1iojs2bhuybbrK +0B50HuHPf0+TFr15mb/f52JeJUBABC7bFr1Owcdf7XXAAXACXnetfI/o6n8z +1fOeh6z7bd2jtn6vQdNmCnwyUeMrKp6Xx/3uTEQK5LfmmBlWjn2TbnCnUr/U +vyqFk7S4K3tdmpDjzccZ86EfZz17tnix+N1WSJC2CGXAYJnYcqs9PKf8N010 +pcM8ntJOZ2XYfMwahvHSxpD2Y/re/ijpvsyhN+u/aEyOK0+LkGmiXXithk3v +NQdVWR3H2t+cBIeJ6pKmu0M9YUHyfGjpJ6dp6979qc+W8P0/MRBiXOPY/OKy +IDki3JITp64fsxmPpWwMCghQr8VezWjIxO0wcn8KDQnUhurct0LG+lPMsaNs +bHUyCzGENgor74MjkRjSHYKcB1rMjFRXG8OXydZOOKNSL8fpCfDklBn7K2hU +DePt6TiEq80G1aR9rszZofF5O14TWXPrBpL6taY2Dmk606gKrBYiFQytlcpQ +1OPai/bT5ZyfFu1JRGr7PqBkPeXsSix5NYbRFFhG7ZBOqXMAt7J1bbGZ46H0 +klXQiZ+t8v6eiTBeMLy5H18BVlUxmJIgBIsKR5SyQ/hD/uWjhl3FATWuHFJT ++eHj4jhrqZ9mytvU0asXfW0suO0vTU/xN2VfC+mDbHn1RoRvocHDOeJTa/zQ +xqvr4jibcLy0EQhv+K9ZAAADdkAdQEABHggVDvhJAEJbu6DDAgBZeVfEy1iy +ouVkaEtK0Ed5dO27qmj7rNQ5gOY0XxczGxl9Lu72xEZ8tEHJPctvwOzFh9AG +kmdodVuYWPlBXsFssgyBpPO5iPtmYKYKo9bb4OhDdJDtEdibsktcFz0q+UNs +rMjUs0iQtIWmd0SS8y+iz7HaE9+rfWkymIK8VyMw1DPyaPi8RwDkdim0jF9A +kXn9gqjeoGeUI7uvNfjf9ISEJbFj5VgzXaxga9aytHb6xQH7PeUxHdlTQ3s+ +e3/QiA9J/vT6J4VN3uAFBgVkBu9LVMbjTZH45IBrxAQJHkEgZDigjFYPL8t4 +D+/peNj/QEf8u0/e+N9TenF5v+fg7WXwfUbHW/M+W0/ufxVwiAtv5R0rg/hr +X93y+rBK/bO6bUX30lUUHXdEEQAB0s1lo9Fwnk0jEIQgEAgEAgAQhCEIQ4Ab +WAe/lSnnh8YLdQ4vojNxuVGfaI6GlevlzO8TAGYo+veu8h/J7jldYDrwEBcv +YKgiKaiKqqiAAFAAEKACgEIhFVj9sM0F7MW5q+8ekwFU169Zk+3Sk9M+ruvB +2XEap3ST2pBSvg36JHMQX9RIX4vDH71wUyC+LjJ4RSoh9aShpcXwrnoVBzaS +cHcXZzns5mGIK/2HjfTUp0S6ZYyLcLgJjUMRzI3zxelA+FyeJBEWrcfTqFB5 +oWLUGrjwB3gSAjgxXAK1nvCG3vL/SeoTQPUVg8lFCIVMJVQDUJnqC5lcGcRV +wEv6021NdL698+09Jrv4wx34gFKNXuSlYSOQGtYTnSCTMu+rSx3QLeQjmljC +/eN1VqthYq7go5QvRgPe3hUy+W1Ust1v5nIzd9qtOQehb8f9Dy9te/wonh/T +UIUCLr4v2sMdQHqq+fdfDZ7CfFtcx/Oh1RSoneg/qReuVNc8Xf2TRWGy+7Cf +BZ38L3R2sun6dcwKVjJ4MoxFlE4WCETjn3IXLVgEW61vRpixdd6EpFE2krpU +DJb9RZMZHePYw02+DEiFc7nBPvN+4cX22U7mK7cr/FGk/0/QMCic17je+wq2 +mE+iGyG3Y9KaXF1+C6TOdvRHEox/ASxKVRQitZw2C1WBeja/677aq8E0HyeY +vVtFPq3xQ1kBL0reSUe9GJcstyJVZoDTjRmEwVRb7Y6tOMcuxsofgY4acNHI +8R+ef+omfXVRxwzpJmjRq9l3nP+H/fk77w/itdhFxRpllfruBUfm4LYIjUA0 +UO68tJHjorW4/tHixaFwJK6qvTEVQa5u4/CNwBaWjwIiL07DHBgABSBTQrHU +0I9lg1M/AgvKTHdCFWKcHGp21xinNszColUrJVQe2rF/nY26BNGIEedYymqC +BMtT9TjqEoVyu+NehRmL8tBopzL7cCs25BEOeRW8eKWYvLGNWeDP6j8ZL2hE +/a6iPE8FN3/Zbp/klvqRVk8xNpkva+Bci9Kq/NlJLWn4qvIdVx2jcHxx3O7c +7Dn6d8P3PV0btGF0mF9EOfBP577zkdrGc5R3R5kr0ZLDa76ru1S1SDf4QZ+l +7hvpGs69B0Y1EYkUj9GUObWsLgWIji/ALI878gIB6RDPLexobuZE1jMgXdIu +jl/4SF0auflEaaTfLEoYIEb0Rj1Py2reomVZHg8VHkSRc5HWUFj35xpXrdGO +AIKUpPFhoOxPobwiWXGgArmvS7h37vDgt2babEknQ7j6bSvzwGveXPTCJXrL +8WAg40oAmV2wZy87aw6FDSJyDGZLA//68F5nIvqqarneus42BHAcE7y5j6+D +1HicS7M+gmqtBFxvaJ8SRnQ8ygsp3h7txzf7zPFGFbEgzMOvsGEpDjZXD13H +n/Kgc25LIQvO/TobMIcUuLLlhK46duuqQjXOCtj+yQ2k8dxWDkyxNgyuKt+F +W2Ob7LQvJvZubDuP5a6y/HeSDmwr0wioa46w4q9ifqPoiDs+/TeZqMzR/Xc1 +zO/tVDQoU0MhR8tTR6omPO16habfewWAdPLLHAGgJjL276W6xHtumIh9iQZR +jmljFFvIjoLpdJAcCphtSzV34CoFlxNazLAjdXfKTRMoNl4aFwlEBMlC0u5p +YQJx76ZW+mV+J05jT1i56KLtPpGUl3jJiliEqGfXFRJFD9HVDChvH3zyk/UH +8Vh4DGULIxillcEtxt4HVqU8Cnm4fvz3+E0w78haew4GuatG4QO2l1F2TJi0 +ZjuBxZ9WqxDEA8JVuneuc3z9GcAAFACufil37PdBdODJJ4LxYeZu3bVVya5l +od/RiSSqSbs6gIrfXFyB4l2DaLaQ5ubgfyTfV8EOYuj+OBeBzd+Wv10Vy+VY +LE5tduwQCD7a5HhQyHscr+AAtV9PAk8yjw82269os7XdVORz6eaeeLJbs5Yx +vqQ5Qa4424/YJDdToDuTvwZZMZDbWX0wT+z1R1yD4KbaJZIiKjiEvUO+RMdS +UGps9fBRpRm4nvYzwHK/RK9N8o1hf86hOE0EeAtx9XVoLCkT62xH4bCOKr4V +6ZqQa/tMD+3eKypHz8CnNBNZUl1DsfWTE5iI/x4qY1MIAID3Dsn4flCeGW5A +Xm324ZoyA+Jc85eoepu3iZgVvFfrNiJp01aupVBf0BzLEL7VVQBBNjTW8iPj +tH7HmUA0AEhUBIRwCwtPd8er6bpv3vJeo8N1jP+fYNldkIFMKjYMVVUlWEDE +bRAOMkqqpKqqsfXgxkIDV+b1L+xRF8Wig/l7z2vseze0/d9T0fd7ZPbXBLdG +tNSEknZAQER56ywNKwnw+J/OkZRx9Slstl6891X7/oqH7Z9+F6mCEWJmFLKL +iAFPMvhiSmSNPKfsTSdDl0/DPIqdcTRRXJ35RnAaIOa4tU2VMwE9nE6RfhhP +7Zj3UYRykYTG6tvYknth+HIzG9ZTxUV9U+Qe9KnDdL18ZxnoE+ZrmbKkT9l0 +Bi37mvmub7EIW6Wa+/TTBWPTUzChwjqVAHlyWZcgI1Spw8Dn7EHxUL79xVeQ +6UH8NRyvOibmLq/I6NE1VJFFGnjCEJfJBZFvX1aO6y1kRaQkmD+IqvFVEUaH +X0/rhr9+ATzDYLGmo3X/T61yeoPxJFFrorte5mnfJAXbINcRM5DGvdCzD2Hz +97pO0DkykmtjGMpz8X2W8artBH5eRuUCHloksvlnjfOqr4Gy2RuY72eic5tY +LAVC9Ub0L/dckJ6hyRIj2msvyMkY9ij+tXT3aQHWYbAEAoScx8YHDhgxqo1U +KErdh6GcQxbV7SRz6bWXGbNZlPHZuo4BWopJsNhfU5nf3eChS7X1mm1XfWMS +HszD1GnBwlmPOlLCddg8WOxBimCMUx5ZraG7nSJ6+VKrRuvcGv3ggAAFACgl +5FHKZW82B3LoINAO82TuMShtvbTzsiOrRf3TMJ8lLHE5EUECOOzZyYt09ZZP +XZAFEmiUyNWka7TBRMqPb87D/QW/J4RjnSadKr6fnavr1Cq+CSUx+L3sWN8V +MZfaLAO9wejUaRH1zKliZ5QyivUqBSqZrl6TmAElAhwhJJo1VAiQc4dqzUmq +jNYxP90i3bIm/ut/iyA9Aa3O6q1qushk0DVZwUf/y/MfKPYyfYU5MrvMdDIM +NOM9gEV8/MCRSpH2zUD3c6PA9ZD/Ax3NRgKABC4ssqEIqgHvhcvxeDQzHOo9 +Ax96MaSX2BJcIfL8tjIr/5XKeehYAKaaLWhTJZ+g9G0g6H+E5CTEREm+IzZo +5Q5jzFis640tOFFGmAoKARVQjRSHe/x+q+Z4LyPT9X+7+r2L7HXeH5HdqqkK +ou/KCGMVj+38v3H/ur+H5hr6/Vdhww/S/I/Y1+m08/2Hgeh2tFVVVVQ7KC+u +71xvs+F4n8XT3vO6/K8Bt7lbkAQBwveH1XOVjGz93XCB3Dj0J48QCEImFlRW +099zoeJAxs/M+dxB9PK6Fv4jei/6ujKtFejCOypVEb6W1gEhR64h+z53igr/ +/edut5SZeHr0rJXs1icw7rtU4wpDAlPl5p7XahYcoMa41KQ/Xp20yjdlNUA5 +t9xYYPp4LQyCw052FwoLflUxxcrU8sFam8RoJ6jEDS/GrP0SsQ73FYq8NMSh +jYZTxtyWwCLYqrZxLoWZI8EREhYvc9Zsv8XarLZTvub7EKScZvMDjYI4095B +oBPmxVMPAC8DgfLaW9r7SHa3eYp7fHNgJTkdNljanrvm/FBLdc652K/7+sAP +MM2h3p7RU0Pr3BgKDg5XuTHc23N4/Mu0WcLk7j8F09y/ipZBkgkn4vaZ/sG2 +P8TUlC6TUcjTgqTd1PMenmZuXUCLfGFDbLHSo0QViYhARe8LfXnVy1F/Tz5Q +Q05KL3CaCuVLObaPH26kiIstcpMvVad7sAj5Y/xTrUo+HcKas9KuIod/CYUX +JtXOyHnCXIh5nVHVfcfbIsAJARn9LZViDj9pXo2V4S18+Q1XihPz7l5LbftE +yyAFBX7MoLaDeAtHhzPb0Eg5b0IrhM7vLrQ0c+9vPT1iZPy/CBSMTM5eGiAu +twJoq3TwYFvtlubW+aM0E9DA1PtVnZqmAxbzBa+Jmb3XGXH34noau9axXqfu +Mx+3S6tiTw4YhXkAhBAAIIEAgEASEAQIQAAhAAgkAhHFVFD5Edk/MrWQVrOy +kHsln5bZbvId37OF+mG18ZWd8ryIdRGRQkgBQoDqHWvA/sP8W79HsH7Xyffe +Y/39P3j1ntPJd1m9ICAArEAR/noSywCACZ6FrkpmVus11/7g7KbTU2cYj3Au +e1Y/GuqOVA71MC2ecCnR1/qI6/h/3bv/AaYwRAfP5LXjAAgLceROSXgDvu1o +pG55btSF6S/hkuZARAZCe7WE1fp7g/MfU9zf4SVoUFj5H5GV091MTfwYap8j +91SCICoP3/ZENpKLZxnino/z/KJ++9RwEBEZ04yGLzUKLup513tgICl7uEWE +ALgQNAAEEGLEjgKMBgKwEYwGBMAQSgYIIAAEACAUGT1A2xZz82M4c5V+jIt6 +7kIL9CqfvbU5Pcv9yVflUmjYqBREQETlA5ID53ksvHeH9N3XWUdZ5nd7l/p5 +Dhfydr+fvNjuX1fO70EfobrplpAe1SCD6ZRhVByOy/C/aO3/0+L8Xzn9HcP8 +/Xdo+JGhSzN2rkM/6SqrmN1yjk2OnEDq7Xaqkczznv/NixiTaYWBV1fH1aK1 +zAxjSXQVnr+wyFarEplph0eEHoksn51ZlQt5Eebdm3MNXmUK/8wH89fnHYYq +plv5y9HkrwFmzfZP97MVf+Wo3EEr1NnvYQTJkNIbibrdyUyitMovTRGtuQ9J +a+2yxM1pHQi6uGVoMI6o7oKQc0sPAs8VP4So9HNAd5sSqGU+0zs1VumR4jWU +YRMhd976AXv8gakgwLQA7RpwdiOiJpaRvc921ZFJJdzjdNCkMzj2In0xLN+h +p9RA2FlANxduppFdZkk1PB7E+NPb8fV0sDpqtg6VZfvBDj9TLxU5Nhy8CNch +pERnbhdGFjcyMwHleX40/rn1QnyZcvaism6wy2wXxxq74uAyLMja5iExuwL3 +VLXzbTXUQrGYlD9PENJZHY1gHMcjdkC/lL3JY2Uqq4os9FK/8AweTyjI3o21 +2k69TFsiQ52tMJi+yhShXRp7t2qLvnED6KZ6nMSpp8kVSHZR2TKfosEIguUR +NyRv6zrsIIRLjvjY3CUi65OWUa2D5IGq4YV/hebhX+kYbo6BQrel0FwRxUnp +lsaqLdLZsU1QwvvO2Wbt2OLEiYW2Q6SkNJv4UP/PjDr3i2Pob28Rb1uEFyjU +o+ScP20ixLz+894PDkSWRV7ronXNmuRkErXViNVhOH6EGZM1GH0G4kINtEK+ +W60OraQeWegAMDBZjNL+prATJ1rs7l6rQH2dPL1kICABDQRy9l+R5mFt3Uw0 +BYIkYrjm2Rx36worXerhLYRAdySkXYWxkudFKj7KH6xeCd2EntmgCabCw1QL +tkxMPrb3vroPXnS9uOE2Eav72SEmz/nZF+qbk3Bj4QQABYBpDeIULL7xS5FC +D6iSxJua06TfjF9PXlC4TsNZ+EKjR4zNCT1ZUUm84SGcdPKiyfh+HRPKwoQk +I7BG6Lw+Y24c1VfuS17L7Pc/yL51btgq+ujgvVbQieF+6XzUfZq05fNYMqXJ +7mki0eSRGSeRAIPDwWgs4/H83V7v8QMBT6lYLhkLbkAE/vjTPz3EixzxxCQl +1f/uHqUf4YpD5iAIxIeZsYusTvzqYzejMdUe6CmxLtUtLq1HK2tdz+WBEv7P +Pf4jWzivus/18Gkw2LgsjOy14i55lbQNMNSLqKgMpzYUphy8kKKxFE+JAppR +d+WfP1ck415/ndDps1UACBGdTEov9TJFNr45zSVOH6nSFub4WOZfLT1DJau6 +wKtj8F9DS0iS+y6U0hmMlFKfT5pt52d8m+zpKp8Tuz/CwUT22sIpiA4yEwCd +HvnXEFrtzYhNokX8FkAILVeVRiOCvL99+8ME7LD9su2wojL3jzX5TBNoYTO3 +M48ta3RZy2Pf024UvV9twNxRde3eljSzQk7anuLNqECiBiqiPdHa2cfR+SQG +sgoK6oRCkhMUQqnXOyw1/AaeIRHnZ2/Dymw2p7lpMDYmGDhxB2vq4eOZkVyc +5JroO6uWbjTwUswaMJGyV1oO/yGHRMQdjfiDj3+1+jO+VttmmaB2ZYXXVbwN +dkUxOVpDM82EaowEjDaZaKDIniQr3xM3ZNRttwY5HvCfGP8ZUYseL/XhRT2z +4Q8Bw4FKMMp05YCntP/AlQBaGkfsFHDxrTHlm1VqFOA2N6SCaK2lTrIotBWY +rIi+JqZgwF6CBTp2recKh9Kl9CjnEYC3k2iWn6mHq/lf0MKopyV85u3pXO0W +p9UEFndSBADbHunZymIOulsdvK8Mv7bFfbKIq61PvkdhMjU0apl4PPrQuNLj +5qRRe8ZU5DQlZSijcQYEHd6FWaQxukv5X69rGr6Dkrj9uyTAvhC0zZVftkLP +eNFqUwh5zdtqzNqYxh2T4yfveKZMSoWaS16I/wMceN0A5FQJ9tYnupxo4988 +hPznh7ylZEktcTRuk0uXtUVs/Z7xsNoUACyBU0JbA9yMgyRGBJiIt4/ouECD +HbKl9vN20ZnwwBOwJpUCikun+ViTwU88uYXYykR1qtnV6iFd7sLhsR0po9lV +sMP66Uy9Cjnl04lCwiz4QZI+JQyGHfqFl8uvt0ukM+GAtSiHcbkZ3Hhpx8g0 +uewI816t4prnVt+TPGxZFaIe+Kh6R1jnKdkWWvq3IiE0KfH4iXH6P2lWXphL +vpeP8jnUO/Pxpg73ihsLrP5zLeoUBS2sp9R2xGk8jDd+KQ4OXrbJr73CU6VW +Zguo/Medi0j2BscYjiKOwLMhoKt8VPFAwLEOnQZQ9HIttuwSzXFPLrbXfWjK +wx4msArHwZwqpJSFjYE+nVlewR+W6vauGh0nPvmMxJqSwfJHisi6vrYhNyzx +3BFVZWK7MiKj7VX7+elhBi+b5ia4EqpCHaUcjFwBPZTMZxxXyU8hwT3zf5V6 +crZbPd+VQrqpqAmqSM2LdrVXVWinjl7Y5+4ABdTKsxO0axRqIbL5uJEr90ju +znnwM9A7CWEn0f+MPvOiL6G10atxvhZ0gN1oyLRVsQe/tfjFHsHIh5i60ksj +QO+6S1rVss2yRYNv/lkgdn+WLYp/m6lq0pSNN7Ogwt0giR18wnZ+0B3XvFAl +HMbH6nRWTgJzTXYaORss4ooo3T7Ro6io9KVrmxXQtA4mKeQuOlnrpDtGUtnA +0LR8LCJsrHaSTXHru232+DLODjBraXFRlejpi8xmYaODK9NRs8Wu0Cyg39tV +WzzzyUKji/AjtqtlgNQOy8qsgM6nkGw9YsPtgZMN0mLzRDi8QkRDdP7kZJME +iab5YxtvB5X9LD61JRAD4MnuZJs9+XDuM7q4uWXVYwrRYPpuqbh5End6/br0 +ofFEhIAS1Uu95yAw+VTSP1FsA1XVfFKx++ollc2a96rZetHu7R81DNWG2yb0 +4NP/3lKTV7XpsPsJPlswmIHe2AnN+lp7gzcAn5Hn+COQb9MgCNsiExxb5Qiq +6eKQxlR334mzWtXLPkc+eDsVGqWD9ChyFTUPqXHsP6CMQdXeqZTenKCc4/5F +0qnYJY5q2UGyn7smr1XEppFlLQwX5+pWLJvPw6xE43udwoQhXUlgkEbWMIb4 +wqgx651PpXFXfD4SqEsnVxAmQ6EN7vTuTw7e04RQtVgSxF6gXK04KtYu7cqN +s2W243EEyLMevwzPDT54j9+K8Vp0yZmRGGnE+9N90YrgCk47cDaMrS7/wG3l +yugrzjv7P3Vc7pdxUYKV7yotpwq7/sgqbUbb+ZKXCBofAOtQs59b51REJ6WM +ptI5f9D2jJavhfv8GJLSSpl2N3W6Zk0nmqWWu3iwvJm51pwp5oRrtUpHIurH +6NBvLq2vwlf0ZOI8O/OnAa7yk7A9v3PfBqkui230RyET1gl75h9HXT44z1f8 +Z2IXf91XeN5TbiI1oKuHiRaEBNxn3Y/fJWYlUIetpSfMDkPf1pvYdU5Oklvi +KpsaxHhAA262mb+NuPS9D22+dgWOyR2aivl24Ty8tfq/k1458kMRM8kiLhfi +HkeH23ixd8nxDie3D28qNVX3X2qUQSk2bJWtP8zODr9VHM0Uz5VtXpB9qWBw +FWxJCyEutdpOVlclIJd8hFYfkvB/15Ok5moOwlPEZPWU9LwSRgQTvY1aix6I +0Kk1ndgFVEoFlNTgkmmTN9TWkFIxWVBPuKCrxX4dMHJ0z//WOuqimZB0Hep6 +PNZ6GhsVZqx95/isSLmvRMcw5F6y+Xqr/SghoW2DxEvkJx6UDseua5q2+Mtb +0cMlum3TZpnwaSIWAL6Za9R54n3CDtbBOlbH6m5cfxpavcTEmq01KtmSv80t +RRMvqwxpucqeRiplCy3KRmSj0qb9t/4byge7yIcmVyTFB/lLf8OCZ9HqKbAc +3uTtGRsM2FBynA9+2E1SZUPv+KOBMCUP+PIs6Em+aOSQPPL4W710Xo6qUPas +Yc5jehFdegjkxyQascheumgFiput2/M67akuYhdZF1Gg3ReaEEN9wTVQcXf7 +GZ++6FXzE3E9O0RowpcmGWZ0ySY+Zo2StJSpVxBv4Tgsb8d1k7YWGn6e1Cn5 +EzJpLx8P0RKuMgbSTRb4YANr9c4/CelcWDzM13eXuFIitM9+0MEXsMWbTvqX +Q+4LNjJMDEtH949KCT1CS4jIhrWiRTL4PTHVU8FmfpYsX5QpLLN30Y6KWs73 +KyCjU+FLVH+gEIdLnvgQRVrgr2Q1w4NT1i+OshpQYWRVUgpkBU4c55RDIi7d +7Re0p7na0cLszb8201jEw4AxSfj9PX8qTP0tW1vYmgz+YR+z7JxoMw9zkoaS +Nnrs62f0OgQpzJscbUzdDyqK12nzopsBQeD34AnwpE9FV8wlfDM/xE6mUyC+ +ehyk3EUK4KMjSRG92JThMnlBZIaVXIsDOsq8zpeq5TsY237X2pyB5gZvkMI0 +EZIj1d+jf5wVkOprupPH1zNaRP46g1bgE8J/ybHVvOhuj6PMDsnrIg4LqOpq +Lj296QmwYlJI1vSuQQ0zsC8flOPjFgrUZxGMbuFp68bSSwNOAf5JMX2aaW5U +4rMmdrUpLBPdVzNMSPhTqjVfNS3xaBfAEOpW66vHBnX8pFq29FJaUpyciTSb +4g+e3fCeCWBLReq/WKFlasBmvbxl9PWz6Yw7WO1Gt/wlGVJqKwQLAPR/hyjT +Wu5BB+64d+9AfLQJANqzA/b5FrXGRlJBocYL9WEbnjbFvLxY8F9oHZVN+CJ2 +vX/EDVeCq0hmKWTD9kgWknqmUziJERqxy+zyga6zc/cFt0zqj0lxJNkxfGux +e9768Vkyn6bAwLjBLchaj/Jvu43v8DEhEhsyl1Xs0Uc/YkIzHYCWFFgri1/z +WanptXHWn5hLP31Z6fb3jKYWxMx4z8HBWh1jtA5s/RZ0yX3GT4KWnyYaaXDD +4YKvXoJ2IacuBYEx2k4stWy7J+oWkR/p699Woh0Tz6/5eMgBXNvfu/WGSt7F +s2Dqc3wPrnLwy09+guKPfby4xEHgtXegUFACpiYYVk6XdjTfCFzncQesm43x +teT2ZWtWDnt58Aa9fliUbXagLLDGRvNcHhUxqIqVpcRwQVMCxEOlmkz/UlyB +MvnFC/F/0GYrzouhLXDo7Klgb1Km9cV1Y9v3bgTE7dMr1KUjAFBQPXQcI+vo +Zs5U6sIAPPgtfowsz1X42tC0wjnh2FnGuMCIofzdNbv0coF5cMvs9Wbo1ZvN +iP7PdQMsrgLudPAbJKg9poT6l4IkvdAy44WZyq5ARHR9mWBzOnQnko+hLPw7 +RC3vQxSMkfY2xH6zO+5yl8UVkvq/1eq/xbekGFu2+duSwhHasNkl7tyaHHsy +DTbf5nDTKn/eBzjXyhyD78H145LECpmMn6spq+ws+y/wazqMKCTyvsszTnPl +2kadp68Y4zoC2FH9XbQpIY/gEO+/hpU0OtbRPbXt0+t1BHP9vPSRpH2ZeltY +5FV5GwpueHe/Fcnc5kkdjxYvN6LnbUjbTq73NI7Q/RPthevznpDxNqpalERX +zsnZ1tgNkit3FslisJmzXiknBFmXFPBqV6Qz33X8Ag+bLXpIEVS7M2OnneGF +yTG/piBpkHtFiVC9obV/GRkOT+Y1tQ5CJFGtAobS3TKW+jjTCAwJhteycsl8 +ETrKGCn7IKnmZjA2o6kvu6Z5HweEJ2wfXSnN1J5YmLHnGSkAjClNzo601mZJ +P0m6H+bSBvfdeCq0Z05wkHX0md9YaFwgPvAyHFIWx0a4Y/94i2c6xS5duk/G +Yut6wSN4ZWFFr5xvDsFWG3NLIZxOVVSQZATWouz3FckyuzGr8bbHeUnDQAws +PxtO5+KLflXRpryLeaFX443U3bNPEvHGZ70l7G1p+ILKVVhFciONOi+DLHer +8wNKLC8HPB4FaOt/ta/wwSXw8+/mRRZJS0wQKVa4UGVq6DVq+/0pCYTujB+T +oNUSpFMDsKXmxjRSDML+JFi5rFhE3Sc956I1Rf7tEPhLGrC5ejNYXA8BY3+O +JApzdlFsLZxhEV5A/lbvmW1RcGG8y3KmXre/pl+xzQoZWL8iNOKL0t/ezxjq +Y+GMshNRhid3tFJJ19EJ4yc/PLDrjD3Tp5XpJPfeSlPZUqqRUeJkH0uhbYNO +fWn7gR58IrU+fQ1leou9UZtTVliH/1tXwCRw14zKT/5yrxky/bHmGjWrj+BG +sJ1TVFUz/yH4I8m7Gu+5pBWW17sCAE/DnZYrn+w3wcTheTuoKniDy5VpZnFF +YW5kDEjn3Vs5b6b1eL5+v5LaRxp+hdp8G5NJtxAeD2eLS4jRN53PnsT9lLvp +/mxUU0ffU3lam8nS93aYNA3j9VlU7Fo71c7WvpJVg1+5Goa5NAWahobQFE6r +ZSZz6rkGhI2nFZVUSNOTfxO7/C/jQKtnDaSb55kTL01e29FT0UJP7jbb3XuS +RIiDG3ubV75aQCi1nvcvm1WNKbsBMY4038PTMfhYODiPZUVwE5o7yMLyBtAL +RAB3f/Tj3QTuOsO+2G6ATNX9nKSvQDa6fWy2zQp4JyBDD7UrgBje3eHMnhKF +BXyeDLl903rg85KDRzxabVYTFVlVU62dkPuJxrtBBXynxyg2cHQmbevuIobk +Tf9vS13av+bJ98N2+KlPvtldydCAHWMC58FcWs9uCRWMiAY7yZMWbn/JzA3u +L/maaQd5PNHvkcbk7VWR+GGz65gOowD9OFQAJ/uIzob4UaFpBamUDlBWGXf5 +QnrQuQfpyXgkvn2e9/aCp+JuuvVorjequTBoD8suVLQnNPL+crehuWIJSf19 +OeR1Lvnxzm2odiWzF6cfiML3xp2aDJl7+KX0LlFLN2dvKrEw2YpRD7U74oGU +RoMYqWuzC6l2P6+2tuQYYrDwhuk9LLMj/+qrYGniC+s0VwWk18rXMmhAKnKM +7e0JUbSa/3ilpYs3+j/T1+2BpfXv1fHUjfZMawSupl/lfgAEPwIAmQW0AIAI +VGO/y6tEl719Z5MEZDgB9Ju8wxdC9PEyxAcFrM1y2bYXNAJ+5WgCQDZjLuJB +SeSLgAKZKFs90t4i8hBDVSth7JRFMfEMCZ/oU64Q1M0P6jF9x92Xo/4WBUz0 +VwDHOhACvaN9tfM0KeJs0wZXkdbJ6dSQ7cw3uN6/zFk47BRwevvtu3/j04R0 +RZ0Ctq4v9Dj+7ykHqFt2nIH3x7cPvwugrpfd5pINiBwQuwyIQdKMV3iOa4lP +P9U+XTzf8fFxdW3UE0GsNnHiufhSj99PrdrVdU30A7MMQMMIRREkFDFEBEND +EJFFP+fuvp/X/D4Lpu8fta4IHnvc+6+X7PeBpJ5ePzvD4rwdf3ShEQ2GgDIB +DNzB6W/sGnGfM5VKPlTM9XgNEpIYKNVJr4JDay+9S7267cJiB/asIdDaoxwn +NUDRrpCZVTnODkrDa0Cx+uGETCFI4WsvccmiwzTcSNAtG6JSmAirkpwmuz7I +06Vc9iHJC/ur0Xe6UG0sQp2txz7yQqd+Vwtx9hZI4qU1UurnO1q5bdoTtOwm +I2oYW9Eg6AVBsQn6niHGkh+uJGhx75u1acfAcBSeQ/p/nkCSHWVY7Tpd1OfB +kd47/tbb/ZDKH0373y6iH2EM+iWOvLYHJ5/UrEOeeQKhSLtvqyB+qnvLZenT +qxVBlYyiaFFiZ+Uye0/qtXgRh19eGavX6KNXydqpFzwcYEn5iKwh2DEePw8i +THocu/IzlO70CVjZZhIjq9dt4rh5HGb6YOJI/eC+w4Ndt9Ip2ERU7aF3epNV +METIq32aJyQ2w5kjsh0M7/dmBaNZJ0MLthUhd6nTEjWbWQ9VIqV1lZEaYCVE +HgsbL9V9eUC3E0rqUoHQH2ueT2thCTcUwqjBLoTRHm2l20KZda2j3WPtv9pr +RLlT2gfYPck1VKaZCOFxU45Z4IP5JdfKPF9r5Nu398vfMFPRFm/05RMSVCzQ +SBwxA8/VwbRnLdFNF4sg3tnkKuliFt8G87BidDZhSoQUwF8WPjG5wkLld5Ox +b8csEkncNUtu7i0YZyV0LoQile6JWM/TKsNlDIgtfMULuZJeHi3fQn+gHlRg +kthm1OEdhLP/98quFoDmm60BqaH2cfXGK0fP9/JKaJP9fwDQ/vQhdOVML/Ny +Vkfx8WnE4Y2QmQRXBBJGBJJUhKfZAbZgZIiBs2wiS5H6vwMA/VywZvDrEWIa +M286GcuehMSphju8ZTtwq1RY4wV9YZTluGfc4Td7EwQXt4ccOwOdAelvq+78 +njs8KnTKMSjKopuIEBsQTUaAl9kKYikayKJb7i/0n2bb/DTHQIVdKrk0X4zC +T6kBOTuGn5w2H8LuVqEuLWOvmJQcYhTC/3+yD0qFjaOxEYlN65wCue6cimuk +xqtNfGpKRMA9ybo/zD47iCPX2oIIYIU0wwdeVEeFzeDwuJeRdIDMMfYyXnt+ +SI8bP/0qRBO89kNSUiZx7VJ3YlQWk+WL+2lmECu9ipBiqyVAnmE+VToFIzGe +UhnTOfsasYMlX3rH0HQzKVGUjyobyPLuFz8nMtufmSYS0dJqxqNxLfuo8Tti +pA+o1X09T32icGQAshFUddMWPceqSQ22pPEhLOB1GY/mZNjxiPdvWVGB3D4v +uRRqh2Elp/4N0DGjcFTTT/2TJVPy3zVcGs0y46Bvk4kReR806/AIZIV02Rcd +8YVmZuu2I9N3e8ANqHgJq5pueJUNYWcp9CyQDx0lLhKitrJam3lhn4xAvjw3 +eZ9lPuhEkO5naE2r4bLyeKwtz0gnl6jjwdymFZFBmYti3Hn/pcdv+xpN/bTp +Enpp+BWI5QcZNt8WaVa5zfz3dp8/fxVrzksDsnUl/7J4bxKG4KJEv/06wD3r +mgs+YdWwHurrzrXcmAc4IgwlKUqU6pwTYzrO0tN+QrW/ob4s4QKxqkefL2O/ +pwoIEndS92NZw9/bwHiCgN5AcYkXe0bN5mRjjxmx4i6+W0/zIxeN4aOC2kEE +Wf1rdhkabdTwoTR57tehTZQC2AUWCPUrh72F9H4y/nYGf2TM9RcEbAXKsTNV +eLyjnDe5obc77+DI+39SCc6gqeWbr2dMlrTf8Ob6/u7z5MnDVqvrWwo46k0t +7bV1cvYIpLmvgNhRFM/D9vxosUJT2Nz+u4h+dyKGmUb6pRykDmZgN1sH8+Nq +hJG+DH7NDVDBueDlALbMnCK3PMK2OD1u+EpvIQ4qubTCIirEwaVUBo6j0Wy9 +Wp9E/RCkACABwS7RdJVZ1Veu0j0bT8KJudld72lQFs/Zi9JHaOhBeEHy2yMZ +m51f5nJzycTlwi4QyS6TftMPpnQA/I6CrUifpgcSdySTXAxJ1R3Sc/Vj/bHq +x4Okt0pzOE5lKK8R6f7cAEq/S6VpTWfiMCnLJXP97Id8uwZ1fs/H03vIkGxs +L1lnRt+Pm3AKusqc8CVPRLzdHY9aYj6weKGpraYPjKWn3LwluxBWdB4fK+eb +jKT4EKIT6CU0IpnfUM3L/+P15zIIdxXGyDesHfeGOGFdy9TcSu5gvbuWkrJR +1c0MMVyr410cbk0UbrJZ3818oGvu2t4wd5Hd/EUV33323QnZrw1HuR760yxf +7xqDxateNB+ickf8RqK/MCG2JOoSoTXFG3zOsCymDPM4wjF+CD2uvY7/m/6C +zoeB1NDAxtdUhVa7+sJttA14BDI2wlu64Iv+Oq78aCtaxcZyRyttfNG0naiV +N/brVhP7Wj+6SHaclzCPDSuGqAhF6jTYpF2ADMklMWb6jWszeeD9iQcQkXl/ +R9Tpp1OZGVKMOmaILPy5q/ZvAsIrT86J/MvrQ7OkRTL145NWh6V0yfVYh2Y5 +bp+rGNc09SpK9gWtVed91oAtEoHb+iqXO7csthSJR8XBEtOykbH7Lhc5JR5u +bqilwNuMFv6ci+0ouO/JUMUng53Kx9nhBWBuTPNXx2ICWFXRJvlDf2AhISQd +MHXKO3fZwcd+C9p4+W/Y0h7DvAh89Q3SzzPoF4EGMc7qlhR+OH9PKDYOqSHr +b1d13TaQlQq9PJGDTeZ3CX9hEtWcHwcAmDjVRyKZDRQsfzg0odJsjE2NKu5J +efxVoVr1AqRhQeGQhZT4KC+2YghMm2PLtUTuflfGy+LITakeSJaGYb4JLSpT +u61JHzU9gf+GLHTSspFZUqJJKMWgHJh92UmH0GSN10lY+l/sg65OFIdL8W3D +JwmaroR9Rl/WqLXbWc/a5f8uzS08RvYIab1nA5ad/MJqABVAAWhbTmM9xN8Q +UbF2ABdUsgMIq1YwuU2+z/avpczAth2+HO06yxsnQi8VFLX9uJDM74CyFtvn +tk7nEsiUz4I/k/77KQILmQJAfvcJ1YWXJ1oj47d/jCHEZ6ETh7GhEUULMUk8 +QMVZNd01sb8JogBaCLCLr6c7aPtCaDYe6WdzZQ+jlnwLAUHHlmZU2Y/p2Exw +phe4M/hSuLJvAWSJQW4DocxPKGzxE6+pe+r3h9Ic3Otf1zbXFQWiq19Ogl8I +4rmEJ3ikZTbSN0b2xXfT/u/XdS5YS7+iAVZKjaGutUSpp314GitQTNs0p5j/ +olvzRwSi6RT0sX92ZrlJxYnXMw701OfS0O5Cux9CcvNyNR4zo0PxWEB7f0uH +/28eQVVK1aREU25d0tRGQOTCpV4sXQhc8W9xzjF4aKbmDhl1ExRHemE3MjgA +qVJbMxb+xmynCrQsc4h4ixjnpwKCcUUE17ghnp+fo+5NffJrZNxy1qcZA9tD +DxVQ3MPbPLjODZf2rglr4UxAs3xizGsWKt9Tf5w5HYNQtHFH7Wg2O3+rhjWL +HcvordJJIas0Hmg4bWnx63Fikqkqfiy6WcmKQDrrGRSwNe2LeRhQ0OZYXR+X +CR+eaP+8x6/G3hmfBnhWW/aUP/8Z/ZEnn9h2UtdfT6vzCuw17PQRuSROIvL6 +pES9/q8RGt/lPloo7K0Us++ip4y2JE8yPpF6L1asWfAGSgTH2lg0S/TUk3rZ +vpHse2SpE3SqX9Mp9DQctjgWvTdZa23K0Yd4tMRdn7PWwLe0KIoaXsFZXbSW +jYQ4Yk96Ox/W3e1GJbleJ4W71CYjL+wtLjuAAQEBBmN7MiUjTjs/9m67j8UR +kYQaEWagTYF0H1rvRYk7cse8sf4cuOZ/1yaBKMOGX8UTYDcKak/1KgxMdmdY +sfUrtl+9aFTc2uGgS9Dyp+GhfHkqiIRg58/RURAWVdHdXBMQbGvsFYOS0xFi +d9Qg/XrAgTimK05LuUqZzHLJeNiZbcz/a15bVq6+7P2TdMmo7iRzwWHjGke9 +/Ry7N4TlXP6mi0afL41tWn7Oetlo1tbTr+uT9IE44Ccr5wyMGDBgwOBwYHA/ +ETBgoshHcQA2RUPa7b6cz3wdu93OPDOtYJrwex3p7TFpR0j/rIUKPCAwqpII +rhgBJgFJCFQmBA3gEopgXCmEUQwygCTAqMMgE9jcCuGSH6IuABcMrIASiQko +syIBzES7xDrhIqChxOk6XLe7uN9vt9jgW/4Bpxo0eS2wd8cBCE3oGAMCYUIX +AOGsBYmqaw4XDRL4/X3Nzc3NncNzc4ifM4ZEC7wBN0AX+Pb29rX3EANIyn4h +H1v6z39eJrRB8X+pd3ZB9Nm7v6XBBPp/S5z11/F0AHo9AHq/u2RKImXEoQif +i+/7S2RT/zl/3uwTxbwZhBrViKc6JjV4Cp1NXhprESVCjJI5j5yzJRnYmSx6 +zoZjN5ocfXiODLcUjZ9duzix2hYrMUwVt4mnvGDImZFxkdxq5xF1mcZV5KRk +kmOcGTBnYmSx6zoZjOZMRycZRW+cHGn8be9FLXLKW7nKqyGVSxjFwhcxERFw +BNUDAmITgsDMRub0GAhbZNKIY6bhJShrEtbt3TJdkoEGlgKQuQkJiUVQJxUp +S5ZDYhtlJiElDhIEQDUCURyhAkICDRRpbxzzWBc28vhXZR8vFJQUcPChCRSz +q5sUZTw8TA1k3ZRp7wUMZMrOWuiC7Fi5Sokmgk4dpKEKszIo4VKqhrBxZXD2 +YihjmcNEypaYillcPWNdca3Zzu91LwUcLpjmc5fHO5yc861dzOCjlTaueFvh +640ca3inLneRyned3xiFzmZWb275vSxvnM6esbXGMYrjjU4441quHnMrirWO +ONZOM441KV4c4zVcYhcftrMCJTDHyxmZETHeECATiZ7SSj3vGQ+mmJCdmca7 +6vAntEHrcXTfVsCvZbSX0ycOZ4ChS9MUAx3oKHzt2nLC/eFGLDz/HuO4XHSC +AkHu54PWocOlmD2nPhuIVsLCgEGy/tlxPZ6zIpHlpncuKTCFCiEGoVSh1E1P +P5cUPelDZftQLCnu0X0+lq66vZImG0WbodKazea5rgiIib98CLxkAZQTqvY0 +B0KAhPcVH8oeIzAypITDI/+KjJGHDMAmAWBYTvaHeFc00MwMRQ9zTwQnewBX +N7y4e7nez+QxjGuOaaHqAOxrd8w4MGBcAsIYR9pAJolsbY2xtjbG2NsbY2xt +jbf7v/DiPrCPZfUYx4gPE8zhSIGIuMEEBmrkAhkqmLFiIoYMAmA7wBsa8MO8 +AO9Ca7ui7GsxETQFBBMTQ00Rr4HdSUcg4qukcl0idvEUDgAawj0gDvY7HrYU +cssIOIxlhAxbtrCfbePltQoS6AfHzz7PAoooooFDaXjG/RIHUsIJSCQoqqqi +KqWSqqBOEazhE3Q1iLjACakHIFN0STYNgxoidAYXA4BcYqIwYcGQKnzVkANK +uxjXROG7M1QFAVURBTSb/DiCkpKaSoiSgMYcQU0lFLRRDTSYsUU01VRVVVix +bdi2UN6cXfREklVVVg1hB+bsWBB0qaCZ3NmsgyEycmZyVLFZK2AIEBJEN9XD +Qkmkm2220xJJCmCJIiBEC8bNzExJEw21KIxjEQTDlTAmmTCMERDhsjJdSq8L +SvLDuCuA2jXATvwAcAch3K0hpWZeAJ4QTCcRh13aROCa5mJkCkI6+VwQdfdi +d64XA4AxiogwYR0gMmtq3rmJsvI8WpmZolITJXdVNKsREa68NAHlleE5Cu/R +dSjoBIB4wu+VBd6qG5t23YsThnDOGcNixjGIxUzM0RipmZqtxB1CBAuwkQES +eZTIQ2E4oaHQicF2E3u91gTfKYcAhoeZ1/g+LO9eq33DEDcR11qwnFSEzfIb +SKuSiJIJIgaOJqyHaxVqTJ0vJ+325uAmqTckWKBGAgcZjKYRsn4jBxA1MCYx +hTGMcgBmCtgyzMGM0F7scf5e/Mxjv73AcBB73wYIgAUeE9boxLtzNIupFNzN +PPRGcObijEYKKwgNLpFHAJCJzipiBx78DAguArrqoR4gMIgOprOKg8Ay3rtm +kdCrrmuG1tYAzVzIYJdDsGeQnU5QWIaBiAaBiA09ZxEEfJCIgRAIdP4X4H/2 +9Nc19ZUDWRRxCBviVF3rsh69U6NBd/rlTdL6Dpts2O494DiufBrjmMVgxisG +nGx7A8UIykrIG0mBUR19mKiIPg1t3hQ6mppVLmkrNKMxngSJ/TrOBgenQlAh +IUIUQorArjFYFXWHZAoAhMGjlK07WbPJaymQMSGrkjCA8sAGWRumMGYCZgBs +G0Lkg5ghyY4BTAEr5DdNKuQadGrDhExsagSgTQurqIgKdNOYIr3IHA0REEDy +U8B4BcRH4/5f2/r/acGDr6YiODsc+MkjmSUZWJjLLfqagYkN1lVS1sLqGFea +1JNNVZ8rg0ug1AMgxJCSkSG94pmZOYLIkEDIQkS8LYTAlqroxSEMIBHBQMGH +GVEU3DwYiqi0IERZaRVJMkETKUzFRAAMiLCCeiS3LLLLIyMYMsssjLQCOxlh +H+XvX8/peCdS9H2vkMzvuyBuBwENsGZRJUgDnh4GB4H29c/15hHTca5hBspD +LJMQ1FQTrCkQo7QAQAcVYHY4mZk6GCJYmJd32/ff3dByGxYLFvDGMseH7t/z +4zQadNvTmR3BIMYE5Xi6DlzNMHFd+GTy7D7PemYuTPIKYBiR2hOHhNdkjcNC +BkrBAyEJEu5uP/2waTUCWkRk2N7UkhCSSodRovkCN/aVBZCFChRd+5AocDGl +Cp0ERTpNyQHBcgbCCiBigiOvoPX6j32g1M8mYLkwyEyTgYYgE4QcIIYaKIiN +9tOlHQiu+z3ckkj3m2YAF1wVNbDG+N8b4y2NdXSgRKSkcUgNoUkcEqOsuYaT +Toy2NRgqkiIdEiagHRC9TQ4gC4RGJZEZBIhRlYWJGQhIlQ429NiE3XNUOo+L +5vb3DgcKQkvQ0hJMYISSbSEkkl/69gQOaTRiMEYjBGHIBNzacIMCb0DAvBwO +F3DCbuSOBkdAmg04ANpzBwhIO7o57UBUDEQE7wvR0n0/SOZ9c9DIdkwNHgBB +zB7RBpDVpHJwSJv/68Aa7uJg3RYEycAinYg/P4Hq9fuv7OuLyIbwiIYIN8bK +pmCHEnbfpHCgPHVA1vDMFHGwZdPKvxaCku5E6/Une5RbKS6vJnd54L5Cdpqy +qv3VIyRz83ZokJfr6oO5sJ/We4PbAQ5DpqUNtDQgXs2NrFeSG/2YazvA2nNY +ZCLWWIU/7dD/BHhn4eO5Cc1ey6C0l7j5mhehQM8AzUcD2QIwjN/zxF1nJPdq +bBdaTUUfGnZUdzfQj0OrZuTKIFrM8x7y5sMKXobG29wItyoYNZzcb9lqXxbF +abDQktENGKuoo/krKPHiHvCevV7+90399LIvUa0xSNUJQLnacb5pffF38UiK +KIxRnQmegzg6TN+RTsz2fep/Cw60QGfyba9TkmhVaqxFzEkoODN6ztDHxqUe +Hiqk3LX6YKb9iwv1XhXJtCWyQ3Mk1wuz/99KAOMLSjDRlNmy9/BlRK7X2KIa +XFwLY5dXzzefssuLl4hLr3fPNgcgoU5QRpfD7sipz50N8G+YnbrlzVzRR4+e +6bF+7axxNcWjtXm1YURyEMy/dIdr18oQROvZRRbUhehMwipJjfkePv1ee9kb +K8XPjH4KLEBWy7m6ZLxPT3sEdFiR8MQgsoKy6Ttj4cJ3XHOMcmhg2/LRZ9/C +oVMedf4jpBgAreElS94eQduRq4//L9/I/HhlAqf6bbe0KnbL4setCw4zjyB1 +OAfGGxio6tisKzkm4mrHxLt8SQ3ejqLoi+QE+BLDQvEVNtxSetLF9Ou4RIAS +ZQTn79jzs3aF4VnCAhW3GJgWhRLdyqn+HwJPE5Hd6PewZU8FF6WtVwA7d+jl +nZjquhs8m6ZVxbUCqL3YKIbKoIBreuoY963vYCbKKH3WQXhlvty0OEvSSksR +hSEsL3/F2fiOS8QW3T7RvY1S713vWizTBHo4X45kFH7okObRSK8QG/jpu94P +HMmYEtBrh9b+q1Jl8IhxaaaKKdqPz7gdnthiX41N2OslRRChgiSWXmVR3xnV +JnJdsQFdFR3Wn85BilSj4CypA+eCDubP1Mb4IWjkZjpM3IexophhiysAAQAI +CAAjm86pCzeXnuz3qTKyAwRHuJKpJttkwz5A1e+bOTnd6d/HW4PEN59Tf2R+ +s99JgAgNo97kRDIpP4j2yGt7zKnU6983HrNO92GN29zyHSotjSktypskTBGH +NbWQoKwboOXZf6uvSChJJJs5eDFu/5+6Xom6Hkih3P9Ld79EW4beYi7BiaOB +xZHzvi5jbqWDvDbNrLXyvSX+7Q0kvp2snUIzJhi6QgguAtV2/x+zhB5Oz836 +XK/3RothSc0aPCn51eJ5UpidosXjT5zZwOutvc4uW1aWGPiKCayjsPObZ2Jt +2lVz3hPkoleVFiB9CdMnqb8SlbA93wU+pLTCULVEmotGFkhdK2L1iITvXZQU +fveMDYGkqUapo61Z6PnRvmXKM9ItYPO3baOXTBaVHaptGEnX//HVDeXwMKe4 +VSgmrwAJY27BGt4GwrNQQUdmwe+BTj0216dYT8GMELwAI7tvfvDlMUA+MSIT +3PFDQhwZGt1TvDAgRc9KnIqPkklj8d1TKdWWAeRtctZFLizUcOSITgskWT4e +kRqi05YtG8FXM8/tkw6Ra/QL538va5wldXiPDvg/z/i6H6nRe1+x2j5X4+a8 +37X5W9/F1D1PyPOuCH/1QBBIxAYEV3VAJQJASEYhWBBoaGimkqKCiaoqkoKY +UhKSkMlHIDIFJAR/R3/mO86f0z/b5f9fyepeA5/sHvOg9cVH+jWHYDX4Du7N +UPYTITLWrvrD7kGyWWJjyTKc44kJUU46ixoRi3j1CWrLiiebfKYVvD+d7q/9 +QdZIpxb31PN/+VZYvSWN4Gtll2X52to9l0HUe7bzcd5ORQNdO51UcrB9//X/ +dZhUNR4L7CdeXBbR+YlTal9Dp0zzgazlPOVnFFvUqcqX+n+p3rtvMa0njjNc +Cwll06Jpf8PrnWrMCDdmpokuaVUYmlHbp0/0P7X8h6fT1NcEz0O13500dSFD +j0ozPd+EjrFVd3ZVVNorV4sswmYJqqPf9OMXfNdeokJCQkJH3meNZxgSEhIS +EhISEoSi61esYEhKEhTTT4zGHfeN8tw974rre+19feO1u5Zb9Nct7lo4/Fxv +jXsGCk1a8yeeQSEgSEgSjwxjGM5yJCQkXxi7sEgzi7uxISEisTIkNsSMTjF2 +JCRCRipkSKbEhISKuoqhISPS2JCR73fZ3zuRneKntZ7MPsPr2mnLpultTXXq +JCQkJCQkJFVMxxmZEoSjNVVCQkJDbISLnzbErXb7X1+r6//Q+q/0f134HJ6v +NnlBK7+71+s9XmbxPrpuXSTr4dOl7PZCUe72TIkJCQkJCQkd2xISEhISEhIS +EhISEhISEhISPW2fO/lPe/T5OUej0Au3ku5jycvyqROvKq337iQkJCQkJCQk +JCRzn/0dHKEj5Tfn/r52GcLr367JbQsLHwI+JTR6tsp9vyX/29mPNY2n07dT +tPplTOnTwJPi2ppaL20pAkXT4EJCQTiEeAohYCGU0i6RFXENPP26yWH+eIQ0 +1Wf+dRAVXM79KgAAAIiAiFheLbD4JQ++Grf6TYs/adFQxh/wKyPn122+a/o+ +d1ABSyJsWKkkvvDulqajjxiD25gAX7+PzD0Qxl3eBmvHt7jjMfk+t0ZkXMV/ +CVj4HMZ12HQsevwYFERvqkrKtgyR+l6Ti18W/RqXHavWv3IN7cNbqIcBARER +LNYB5AEBEdjNT88lQQPan6PBQX6vKeC714LsG2Xww80RAa4kZbe+QYTBJhRk +DXh/4BgzzEESXvFIShx98oO+KK/V1DqUVXxWYoTTACQpJG5gsID24OJoEAcx +ENwOl3vg+z7fHNnDwcb3ksjt+gUe96UXHghQ4o74AIM9O9EVXdfFKPglHUuu +im/0DyYbL5LQLnnmdt/66Tpt/rb/s++4OjqueOY+5+agDAAbrxH+rgcHlRET +VkqQL13Ty5q/ORNjz3z97vaLaVLnTAAmB3BwqERyfhSKUV3VFU/X8vz27rCa +we5y8143g9EdYMYxBgUiNolOR1w6oZBoQyheUtFwAYNBCGsMJhRhskDBgEYT +/nNMkhMkYAwEBuGSa4Mp17Uij6zSKLgEgORRV/RHkXAIjgcDhEDlDJcg5U0g +4Uc0AAwgohAosqIBtBsAUmzrm9DAGJROd1AGSbJuCjggSfQYyQORMOGZ0PU8 +HQRlu7zosx6zMTtTq06chsMZ7SbyIuIcfZ4hvBOWCRMhAB4KCL+2JKqYDjoo +CcMBFecFIAFKGXEYBEDrsovexSBVDjAIxo0vqwBXUZBolRPE+S6uuopd8kin +JEGkc8GAwZHOqAhoT4284KFJQlHERQNcRX3BKcc3GWdAhrDs5I/niKQJG7hA +HKUVgIEYeVT/zldgDeppUDYFLSj3zQAcnl5vf9w5P0noNIg+2Dl9pARchQyM +AiuRgMkACiXcCSCDAhkSIGAgBMxQEOp4HRCwEVRRRVUOYc9hUOEcAVUNQqm8 +gp4+N7rAauWAE1f/u5eZ+70nr+MCKahTegb8Jxhw4FQA4gQQHAAB6DdVNCC7 +9N7ugEiNUACmoTQhAMIREEAkoowT2EVUMGAOVBNkDLAHAw8+aABMBmD59OGG +W0S6xoKIoGECGiUqgkgIIGYAYBilpCBJQggiCAgiCWCkOfObN6o67xd+79hD +EZCNpnfJiFJCVIFZlQJhRfd7ImtUO0Q4iWDk+QvjUUSiGsEgIuAGEdB2QSUR +yyEQBtpRO4b0VBFTcDXQwi8Hqe0DkgCiZpCokEiAR1fve0o6AlhpYAopYRWN +ggMSJgNbBxw1GYLraN+buhQzlNJKOZHRwO2AFkHtAREQAOAMXCLkAEF2giEk +JtGWMnNMwDIdGAtDOMjIReRDMhWD5BHpCDBotBg+q6BHHkzRmPYciAYYA/wU +VJJ2I4DApIwFgiECEEhFCDDkkrOZAYDBhByVNAdWOkM0dYCJSZIVUIlaUVpV +CKlBAoFoQAiVAaEIYqkiEiVUSYpAmGgFiCYJikIiYFUoRTMSUOs7AcmcFE2z +832ntOzdo939Xp949dB5UOSIrbP+N5g5RT93nfW990cNU+7wkTz3yv/en/W1 +DpKelwoJzhKC/g1YRB5jQHX9PZf+e5df/X/D6v6+/7znd5t6ylhwy8FW+3JV +vUwEEQ2QqBTUWpEU6bR7uycfk7ozQgs0OY/u6zswX4SrjW8W99P7TrU+uHdq +QC2nBBZaJ1t+IXKmpgidS9IDzf97EnNwxL5ReJ1/+MKxKOSJXHpnolFTkaf3 +tG3MBzPBMUP2jDPLrxigAcfOWzGrDZJ4pjAGME/hvpxJ2XvPWiz6hfoo94bs +BWgfkuZD446V4/+NKzukWzCN6pVmxf2T75N8/IEv9y+vQH/KW5JG2Wtvd0o8 +TvZcTZYmrNXaeT5X94Vih6m5wOWgEDTBMaBCfCxFm4rgNjTX2TfRvdeRNfGH +6vGdN2tNwdNjdONiG9su7X0PjB/WnPXd68pQ/5UOdFnO+EUx1zOYcCdzfJjO +BlyamHht2v+vh5VR1TL4/u1nuCmGzzOz9XWV0yePy1maoK66DC03Xh9w7vBY +zYNRzzTaYnY0ueIgIBDP5f2LsLZd8Wegmx8jPoSV5qyxj9kPnO7CIbkdKDdb +BuljeAG5o3ba/GmxCX6bz5nE/41no9PR4/AFAF/8FgvQsayWpbYRKjtMnleK ++bKDMJI2PrfFyhb+XPsplNRH4ekRyD/OUtu+YmYFdJDGCXxcoF6jdVRHVzTy +h1rM+OzLpQ1Au9teWC7e5ecGAPM7+fT9Glh5syiktPxplubPNbaKysAABRLi +Mu2vKhAAUIPWlRzxNQV9KGK/U1pKzXaPpoJgeADBs6UUIQYzcZk3X2NbogAD +/4tqmCIhgBsvR6e2XH/cwv/2oitjvN9MSJCI308RilMCBwhCVFJ8HLB2i/Sx +iu4+C+t8bXNEbpOrL4mxu+X7z8Tg/oc7/vcp+hubcZQer09X6Gu79Xj96uDc +F59fP6DDwH8/PPp14YWhxbxr8x3xjX6f+n/Hj9dzxo9S9deXqm1f7T7pnj5b +8eflu1/sXeRefp3n4nj+c/gfr9Z6Lc+1v+6+Y7D1Ih6uPLf2dZBAe1CAP/Ee +77v6Tj+9+v1v2P53K+HyzL+0P5t/Z8m4N9a+4bgn2U/UYaLo+xU8W414KkTs +WRilPlx3OhAABP2ZQh7Z4xUj1uC2JwbXa4U99R5Xsy+yNXBwjMiuZxcdc5nQ +XxbHFCjXkMhrI+Ha/DqiYq++DLdcy4+rK48vnR2032Yti0vjd03mLggskFzQ +q+a8Wyj9VlbEop7iQlRAVABLAQzaGA5RPymSZYJppiY06gDViKaKLpv6g/u5 +/1SeDEHZBNVtagTEiQKrI0IMSxKSgmgzwg7AKm0bRhFFhCAF2gTQSkSkQDEJ +ECxUhEpEgRUhEqMQg6YwSsSEXq/DeW4mryNucDRwfseKxwdOt5b0B4brWnV5 +PT+f/b3PhCJ+ea2/yA6LeYDjnFrm+NmrzKi95MJ0fdvG8fgc5yPD/D4Prnre +m/B028E5lN/wY65wPJcxo1AanitSsEzJrZ2TFFJCaapkr+XUioRDIEQhACAR +A6LgzxlGSZY4vL8p0mOheheTVNg1/khAWeFMVlsAOWyqWKwqbv3fm/ud86kg +ctfs+g/Fn77YUVXjQKBEqCBqjH73x+U8j0eFHzSjwTkSBB4CcLA8Y4phBBeT +UReTE1vv77uXmem7X7b+vy3Q/l9U615XhiChyHLdCYVPW8L6XyfH83zfM73Y +V/s9aiCgHL7aK56UFu+eq+T2/9TQju+S/877tB+QQRQREJUVLVMTMhMFBV7s +Wwx3Exl1nCdvAg0NnhwODChgUJJcFIRgsRgxjJyjEYjELKI8/OWcFKYhxjDT +iqKjBkMGDKCiMBhRQMZ+v46hwDrXzPY7AHSHSGBfsbv1vWf0c1baj/pCo+MD +Trirg891PP/Pm/VeH4PoPQes/o/r5f53c9Wsyi1e/b9ZTpz9haOHxE7C3OBY +TAmaLn37mbQYpMsS9AZjvQ8lZxmx+1b1ykJwcpQZHY9BsK+1RjTXZTNNiaG9 +p5a3SpIwTvlsKKiFXFON5EN4W6xGMatzAu0A3SlTiFE/E5dwhi3Ae1dHJlmf +n6ju4H7il2kTOgKeribCTID55vqhGVYx/0HGzP/Ew1kwVAY5YUSBgpLbfe1L +Pu3lBBOwfLPvhqaIVPwUQt/wOAwDObnZ0IHg/2Vvn/cF/jHY+vNe2a9GplRi +C2pvnpnD75IzUpxkeLZD9bS9Omw/LEL9BG5KfaIqd2gxvDTmxvWfvQZDPrpE +2606VfjfWhIed3szEHlUcBLtZEzHW6QMUxVw1fKVWfFqkcrIh7lYvR4dPenr +g/wctpId4mzN1Qjyc0IifM5mQCt4RoMabwBvnKLWiv55YXAYzVVy8LJqE77p +6oh8FZI2D4XMTAfrsSd285dhj82+V8rX9jCI1zMkHSOfxzMGcdFagqChKVn7 +iNZ9TRPlFdDQliC3mLqwk8DGyzkydUHFpfYBu1YJSmVWHeHBx18FLzulJW6J +kMts2fdrm4bb1O37YRcB749lnk31Kg4rL6UZE5n/zh/LXDcuhXRDP46/bLpD +9Zzn7HEVDOqyZeaBPVrEYFLfJmlk75T/ft7/eftKTTzT1aJJ9YiIiAgsqpTO +IAQkCQQ0PZ7e4xQl4x8nZrouzxlxX+RAAR5gEjF/3VjwweonuIHiPnQCJ1v4 +Dicynur1YGRrF7F+fF/MaICIwQBygAOzgxER2zc3vYPddT+P3oeY48FAUhQN +AgfkoAUSwAUOcDOABQAJApdRzi7qycrL0HwD1bvV8T4SyjZZBGvfTKCdN+4D +B6XXdtyzJtK+Jc/A8eIUgFlAh0GRIQ7WSIZSJQw/l0NAPFtSiAigeQa/2lIx +tORATHA/k/OZLMcsW5SV/2ExOy9z88MzVgUFXfKggAAGLrn/wOm5T+N4bfvs +VNMfH8WEl82h05DTs/Yr6F3/AUW4eQ0zDkLGnvL3Q9J6+4NC+9cN/fRARABU +6n3L/OeJT492LaXGV7Zc3oeTaZ1EEBEAE/9uxm89raTl8Zd5NITeJG/20xv9 +nGtGW+cpxfuc13Dqn9f9n/v6fYP4/p+p896fr/S9a//Z9YXrAw9RcIPkyhCC +UJEVchwYfGEqI8SRQMv8b5HD81wPffmeE/Nx5THktoAd4gAdUT05OQEmOmDC +726UfMuhDxhmakRDTng1gENDn13hZfm+S8l77+39ve8jlyvbTXKQoIgopIiK +VfVh+f/lzubt7wA/uBEhP2iOKcU4Qfu8jrabkvJ+L7t9P8jzHPuvIISDHbWQ +kBjAQDEKJghxIBcs4wSxAARIESJkqqMrIlIZQWCDAghglBXCEoxirLC4SIYF +PEZKOQo5KQASmECEwhYhSOVDpeaBFVyDmwgfIeWFD8gUPSg66AQpKBoCWhIU +5gVHiRBhAFOF5jhZcTosui5/23l+u85xTY5k4uAIhgHIDmAwmYSZoyJBS5Iz +gMCBGAMyzIwYSAkgDvf5+AzzOm9JlmschwwIF7jLvQU50506VPBGi6q1NgNS +j5HQgGxsobgG0igasg+N0nQ+Q1vOc8PL87gcx2QhFVwcXEHcuvmXj4BdAyAf +PkcDKyJCKf1ayqpwkQ3yBwiUIQiFgCCIZEUBTiKgFzhPQ8QMOk0IgiFceway +Ih5nxX+X2hPD912BTaB6kCBAokAhIpIhAxCsKLAgQkgMASiMCiYOIB4tnaU4 +oBcuJzAOMYQ0qAhlBw2N/kmAWfpwgYFAcmGcSaSDIFyVgXCshkhlv9SmMsAa +Acx4A4IMDgtsddHzAAa4j70LYACQcDKwSOAwYO9GQOQ5DgHA4HAOBwOAcDhc +A4HA5a0cAQXzIKGkoEkoEkoEkhRZKqAqkUVmpo0ImcAqmQ0xOcOUGMWIUqJR +DJmQF+EPYWQF/Mthk+cLKiFTf3H6P9d4m+jfHQdp9hrm84NxAHmA/V/Z9r/p +yKOoXoQ8bhB4PyVHeqO+N+EGZGIwTgnDq294ioPTIMa+MbMKAnYs1Qw54QTA +DBoEAchUyUcCBko4AMKmDLJMgyEykHIlBYgCBiRWdABIhmjkABnDlESIkDEh +AASSKMIkOIxgRRyDVvjiqYgbkQ5MHGRhACRxGNQfnatgNpHlDWLXC2A2hT8f +t8KPdfV/J9x/JwthBAEB+heujCIgN2kcBY8TRAIHO0vFiq2mwehDHGrYXxaS +2O2tt99eXpXTsZ2qiFt3MIGvA5BX6mQp9QF+ki5D50vg44eg0uALzYfa5hTT +3bEu+k1467cdbCJO59xlkmL5STckuLl/Sq39mJoSVU7vPQEB5JsIpjhIpPyK +Atlb/83NWxw67/bbp1nJAVzOAqNIjN4B1tkuX093C+W67LIp1wvuwlhdwo5p +VGuKfaHMo8pgZnSrSH0PLBJC1SyD7Aw/zWIsbt8Xr9oH0OtHJg1gzhsvw8R7 +ucE07ePnvj3Y6/60EzRQUBNIxsJSAxUuvYO2YT8PoGOt9sEr6cJcuVbTrEJW +KPq6JxDlv+lL3LuE2GFrQ7VkmyVIxRbl1LfdwJuLSOg6SvkdVRCuhHVI1Uan +9m9BZgKNNvwm7GgU595ugr9SyAllMRKdLypALCTqldG7yP7A2hObLwZlOXca +AUrp+twdqU7S8u/Jj/Ibv+1bKzIe1YaaAR9m8y7Mkt1QBzYiGfWXHsVr3yVH +pM2KuFZ3eXKnpEdJ0od1JK9b2KdUjQ9PjQhtmVtXRrDwuipT0jBxB8vh6fCe +7U3XZPbxrAgKaqXbYxZK3LY/Bf+UxcbSbR/8h2qH0SAIqhnco8L/tzzcAN+N +A1lihI752dPOBBViA8glH7OI33umzWdDBHX+vyi1Dzj5aAyqyJ7tDO+ogppO +YZCIqRfHCn1/34jTCrdlgL7Vv5OuiUFile2GrFrY+XRZw/9OqZkqhsHqzz/+ +3eU2CIaQADwlAIi3EABAv2AB7TkBpshhg0ASAOLwSqqKYdKsGUEEOiwuWWgM +3NMicQmJzMiAHIjA5omRjiSoaERgglIcjAQxiIBl3QElQMECGIQmkhwiAsjJ +IgCCyjSCiEOSHYvN9J/J7jsH823rJfBFRAPLQiv9R3T7X/v6Xour89/l5vqf +0PkeI42tvl44Dxz0nD7b5rT8/lDBxjWwrN7PD2v7WEc7/Xr3c+l+Zfj/0/Q+ +j6n3eycMBh2xlwxr7Gnxut0X8eo//H92zkEVAFLw4MF/hjDGV9/LTUETREVU +uQblTMxPKCAgQCCAgIAUAdfLuKXZ5zSqXynflX/BqWSyqqJRI/OGvV6ndEiT +hSYixhZ7v0M0Tio6Cctc8pmD9CSkqhQCkzinjZY2hbZAWCuI4iIAJ0udRyyO +hwD5AoJs+4fpdva43iODlv9jdz2Pd/Y0bfC0/Cyxs6x/xjPgchloxrfl9T/f +6mKqCfB+X9PxvVjnCI6nCdJ1c1wUDQGdgUsFHNDSBQlB4j8n0HD1CIKhyKgD +KKgsEoBwVHGETCjIoomAkFmUBlYiFiUAhGBIWkomIAIIAFDL3tHZSOEoUhqX +0K9rcnhB8eCrza+k3RLfYZHabAca6vU+trIWLXRABAQBXx29yx7PvMGFUWfi +7PH6Hqwjr3T8yAmsXRotxeP7CwAmAICI/7L2XuzN030xsBARH09/yVnXvV7V +aDkz3eXOI+pGXqvDN5MDH7v5+niswAAgoCIAAAIB1tFNbvVBQTRRTBRRdO6G +AnNMB+xOT3zAaXC4cDhTJg0BDlZh2YDg9Y2fpec9x17a8XseR425j0mN5oAE +hDqT1bXfVEYxjIg9Eff7n+b1Tz/Q+k8xp81wNbPd83yWrf8qivk9Xedbb9ft +eS0+R3PooA+NEBkAdoHYRVXhqIQo9P/pv/MoDohAjAphE0JlHWNrhaNIqivz +OSXbT1SYRBP5h+qyTBQRVVBNTMJLzLkBl9rmLmMFPiII+T0IIPgjsvtgjIHH +TcaKIIZg7XgR55hR1G1Io/8IHHtySlMQbKK7wFo02x16DZd6C6dOnQaNgSZ0 +gPLnDRNsbCBSFgVwoAu4GjIDIRILNE4W9DSIcAuKIoO4DrqCSGugqvj/1+h5 +PkPcec656H8j7XI/x79UdyRUjiAEO6G9Hj8cdYxkXR/whwzWFuOcsIqvNqod +S0KJoQQkTaBTa2dnBkYjWedEeZEdByqacawcr77zHxv0vI/3HYuu6wvovR8/ ++/yPzuAIA8AQB+9wlEOOvA+x+h7bq/nfJ997z334vtuZerAAp/hr+Q5kV6IO +cFP3QRT/AEU4AivPPParJ0jyKj/koyjgRXw3cu2+C5jt36nRcsKPav5vef4d +3N6JHRj1cVUN9hc787P/nsvJdGIA9GIA9d5hRXR4m33ren0B14QUAHAquKf1 +qKAIHk7OxT8xd+h4BEBuvFGUfaeef9fXB4zG9V8b7kPiz87695CdaoxTLn74 +PwLIlSf6pE1r7WQqRDsFnchmDAL7IwN8LK+JZ+w2I/XeF1YzpMGqTYUwc027 +aGl1rWUhYfVfAKtpnZrOfQeWz28wbfSalZUzyQp8QwuYOi+CJGDY8IHVozYK +7I5V89ewqH8AdhJh9978N95XuCGWAlvzC+0Ovu3ItQURgQLOztx4Tq/PfVeY +esoqBAvHY41gVkK09JNcAq6+H84awLlYP1vsw/G1+drvNU768H/Vr6U4sNJr +0prsYshd5THYREML/2prpI8+zu+r2AJCWkpZJs3mm+T2qHAbx8MG0+WcmYzc +0MRXz8H9Zav6kxJahkzxyZur+/OjGvG9r5hDYScCiX0dVjdGOIey6llGPZE+ +B/7BMw/yeTyIjEd7ArxZhEH9TgqU1plx6fAESUcTi6gxdBZ2DExSf7AmAfPr +f3dpfAVOmek06pVCLvDMS8/rltLAKCj3TS8WMNF5zSE81OyjrKQDm+Cd5oJF +agIjDCFbx6QjbeNwwJlgnmNUVPA45z25pF/0wdN9JC5DrinOcYVO3daScj4o +C6w0dRnzw73h7z8YqV3191cUbf4Tb7Btm+7wFQwfIrub9XG0Zv8XdU8QWBCZ +ywKeYyxeCAHnUSgJEE7pYBliGgIIGiCd+6RzKMnGllC4U8yQrDH8yl3G7mzG +ypq3mMTftnyN+VBZK0XIK4TuPK3gICpBDhx73GpkI0eiUQ01CLm0eVx03Tf0 +XV//csHWNJdYOs9M6eCIhrkgawDgjBQBWJKNWRhKEKUoFiEigwFgIJcYcK5E +phSpiSkpYyjFBWkAcIOEPafXciMtb3YaxgATwbkbKq9dFWQIAkiQllhhggJZ +YZZgJZiTbQB3gW27AC7LCAGvAg2RgUcQjpBTcUcCK6RHZHByHbfBmDRxBxrp +gcLILn+SGuk77GgtZkCzZ0pumw5BmuYZTtKIGsBko7x0ZgiuvplwIridApjS +7JInlAyPnOyGY6TQajS0Empg6JTuQ8CALGRa2Gw6xIIETEGuGFXBCUqYBNw3 +NYNRoDWIRPwZAZ8xAhCzCgR3B1BKXOezYcGhmAUYgyCSSIJEJAKOwbLIZGus +lBYgR1QNBsg0D3BA8fRKMguQwFnJUEFlM5UHCPFEWFxQqjBZFgKA814mIjgA +gRngUDEURBQSCMhgwR2CHAoDvIySO0g4iOTAw7gISISIABAKIwVggI2FA7jA +ajQGEQk1jDpHWTAIa7C6QkYGiDAKCIkFAFaIXmvK+5qKFoo6EIOI54DtBBT4 +oBkeACcHB1g7EFQTEkag5oiDMHcsgQgkydI0U+6glJskOUaDJ1NwNvKacyDB +B/r+x2HqHNfse319m192t5tPBNBuIu6o8TfgApZCK/p7CqJHZfZ/++5+N+fv +doN7vCxFJQkJpoTSH4JJCQxpEkuYQhQkpaSBjYkMHDG03DBqSJgaEKU2MwkZ +Rlm2AIMRDGMMEPGjIc2NtBDdy0i6MKY0CoB3yHWpCg5R0ZIaHsXred/m/q/V +00zfNFHX41T3LxRkq6Pd7s41sNF5+RW0JeMccY5NlMnNzwxu1fEIWb53dZ1K +SisOT9D/fD0msQYjCGz/t9j72g8Zyfktd2x4o0klEQw0klEpTJAlIkUsyUtA +DFCwUFJVNUwzJATBAOkkDJY2YEciMEE5DkZCoZBG9JdAsZG90ImkMiBMAaSN +CjvSAY7CSVhJ/CuA+H12HoCg/BmA1Hf9F/d9KSSFCtJpwIahpALsewkmm0xM +EITElAUJpSVFR2mFAxCi0BZ9HYMJgdiJPaiRpyEhk92IWjqYLJyGRxT9EBEY +IgdEFMWNeHgaFHPlczGMK4GLGFMQwVjGKbbbbbWIgMIAtQQFKCkERSSgpETI +0I5RRiMSmCHBBYwGJGgcSAUI5TSBnZSDnUGcGUAGU4QCEQxAmwBoIaAgtKRB +YxhJEI3CNzEQMBuIqcSxbbNMxI+cG9XiEIZguKNEmhBiEaMEYJKhgEA0m2QR +AYMqw5KCuSGAdSGYDmmWlEgTJHIMKJ7fo/s+z/v+Pt7zea/A+t6XHh8eE+ft ++N95wdnZ69l4b2/Ifl7WLWXTR8Wl0Mycfqv/FjJDaU2mzysYLnKg0XtDSYgn +ExrOczJA4/6D2om4SMbQGzyEb+iGiGFUCxZ3N+eWTlI2hnEJBPyJKT6KHVOC +opIB8foyAomJumjfH6mQQAWIAIdXDkGXq8ifP9D4j6vT6tbVr4MkOF0mDZzx +08WMZYxp1Y1rxlSU6Fmj8UzRLEjRlr6r5jCYKKnnm88xcZRFq2cE2ktiHOUK +GSRrRGIWhIUIQIiHDwIQhfIy+gmZZ+OnBIgUBDEEhjUCnjOteg5U6DXUd6gI +bCjAJvBVQhAlGDnfOeL+HpVEA3yoolKK/5yAOFGUQ9T6vxHyf29nuuPceC73 +/537ozd9F3Tmdnmfse14HR7FmiQn2uxvOp9lQfYFnUiIKSUDzFoiiZoaKAAA +BBI30s82/4CmNkZ2kWFc28kAADO0fY9V/i8f3bxoIHc+P4v9XsYCdfTtbKYF +edMZBzGeeWaZAlRKkUIGDpzFCVEyNFOQgUQ3ANAiFAJEISZLmZhIUuQJblOU +KXK4MsYMYwYxjGMYxjGMYxjE8oo6FSQXsjAfHkSEhJIEsh+RtCBgagIZAFQF +Cau7ONGRhwZCEpKMMhVVVBoR7auBXSIZokrra6AaSaXPLWy1YzzwZZzJdDkq +khKFekkkYiIUQH6QKsWWNQtEZgyIQRuIDamZlzMxEXEZOBRuHBPAGwOkFg06 +BLYe06l1zZH5X5p3zZ/49N+UKqGrXtfvGJ8OyLJddylKf2iCirkTHBLBy3ES +3LbxgxoyMqyxgsZYyMXYLHUtHL+eQGNrZo86KPfZFMhcSiKmsJssZgPJqexM +tw9SBKhAduNYF9B/f3flfCbY69MnDjEFNO/ntOWOx9Pgyux6/Tcc3wqvawEA +9tb3leoc2dzfB8MMhNRg5BAOXd6jnmioP19iXAACQbcRRFURRFhRNYMaQyQQ +0Sq/ZOgCIAAKdQZkaBTWUfk/F6LLl9lU5lDYORFNsyUdjUQQLJPosKJkyWKK +YSEg4qIIoghBuFgR9GKAiVzBkGHgZQjUwhEdNhBwSDMxgQjR0JL0Y946GxCO +sWEnGYGLqRC9/5WwiGaLweNyfIhv3ehuhrACG4Hlvoc2u80AHCPI8DxWZ8/9 +jApzXC3u45b3/A4q8qmE+f+PiqPJ7vJet3nR5iYeY5Dg7eeghBABgIBCeR08 +po0GsMQSEClKjCj0gb3WD1IECyAhmaQyOP24BUZfofg99/h7rsuu9HySg8wp +krt4A6l5/MOU8d8ncyAfkeg5UHiD9Hun5XOp1WTznp+7eu/xARRDhAhy8RKJ +zzzCPYh3iIwwQ8XCiBzHPAiq6gXGnkDrMHauE9qURE3qiInWBRF0CiLACmua +4a6g5IB3qa50FdoJA0wRKoGQjjegSrEBrKv7MiiG7p29R1xRwG6HENuciCKy +M1HkzeYEXWYO15gIrrdpuCcLLdIVpAoGqpppFKWJh1gwOIJlXhko4IQJhQJi +GqBSFJYgFlCDYVHQbyNQDrhBhxo6rmGZmgvADbRPriASbptqbpp2nXHfob8J +Xb086ZgmsDAQQoZhAbQQ74NSjgDSSGFHVoAyAZFDfaRHRmGJFHBKtOvvDMN6 +HCPF8I0+y/O68o63U+L03BBEeBtBKO3Db5QDXBDaQOMboaMZAmQORJ2CmCxm +RlioxOMxdcFTqrAO5rIAQgMDCEsigbCcyo6QT0f0+GclpEHbyOOQVBEkgRDM +sJEfC6GJmPgIYWKFQ5uCCymR9KYB3hEDSJknJn5OlDSBEEaMEbzVWTpMaAA5 +QqcBSmQcAtMBDX1TOBc/i8kgIKBuFBoMDgMWA2QRTBgSITXzyrJABYFDIJVT +S6iqwmiVNahy5ZNzhOaIGaK8saUMssYkDBABYMKBiARZgahWXEBTStIU0mBm +UYUGBTBhVBwEKIQQuCRUMELQIhQgrJAsiMCqEbaHiSNpY2BAHQ7wzIIKq7WG +pgKddA5xG2GQF0iJrmpMBrI60BAOsDhQOOoO7iNkNODLCJCIGNSC4CNQ7GA3 +qgmWMBpkdhDJfw7/tlpDoTW4Rr8HG9M+UQDqRiEdjgmA4YupongwfH+uKH0D +kUEGCPeC+piI6IJDIdAqY/BDRdDiGWGNJXyGjLVAuiL8gGRgQSdhHASVBG4F +ByB3BhaOqg65SfZFiCwNqStG0TgSJhiYpBjQdoYubKMkaUcTw4cMGw6xaBRA +Xd2I5HU1ZBkiBR0IhCiBCuAjAGBFB5ZUtzeAmwo5KY2RQBgNhSUcxMJIYUcA +iYSSCTI4kI5GWYQ4F1iJKsAqh0IcyAaAIgglSJQXQcloeD1vSOQ7vMmEMCmD +HPqOsgGaCtOWDFoAMIgZZYpwYMMwQSJjC4VIYQJWDE4KsQYcYpF35KLkATRE +xMG2CxhUiBN471UgBN+6tGgjmd6OsGpDWDAIOk344AOQNOshoRM03ybzIzNk +DGlVY0bgJKQxQFJJKSgOsmkcxAjiKAnhf8tSG8DepzBvjPZJUaNAw/8/a+B1 +3rX5muvJ73f5CP3HicZATNSUZGPByKYA53dOYEjrHfoz6lCF8xesTxOoAcAI +NxEQQOCwQdQNhvgUYwMEMEslREWSGaHEV1KontPKf39R1b0a5xVE8IqCQWQC +YIUpEBACBi95KIqZSIC0COI6ZQQjO1+crGQmvZKLb9xEeOXa2l+8r/B7Z7Wy +/4cqLM0Gb0zUzQnV2lJ6+DQwUGVpNW/KiK02n7mwdbrpYiqBvlz2AaJyB9nm +CRqVTdq71lrrKvDSAk9HYHwJDy8lL8f0bcZZrraXDmMkUs94QBFvXnOLSXUa +6E5Yn3cp4xqVtT+DeqVMB+SVWCr4uyx3COdh7iqbzvqgjIyBc+jtenvXAz6Z +vPBJUYWvJ4PXPXufdWqCq8VCdaTtAZG0TFtz7qFuCAB+8bXfnktfVFQRLqHg +coS6B67un2TrBov+t9DbK7P9ELmH3rtmytJXFfkDIEU101TAuU7gNvuznh9z +tFq19ighJNUXeB/DpDKqETE36TdDBOyrmyTxLYylRDagQMLBgGICMcW3buvw +6wi8e1FvxlFgYN6nXCySFRSUUSg2FFq9ynd++EwHVHvsD1eXZW6ttNpPtZlb +vP0qOZ14COOyuFZu+GQkLP1klX318Ls0hci/wxosf0ZXvbHVLS+LZfNv97Lw +eGPts6YQc5AAEACGmyvOFosdEqLdBTdC8fcFOvLhTuqovN22cz/e1RBCb+8r +cmFwYF3MX9UA0lJ4XpBwXYL4EsqCUXR3c3zLfvcJW+hgIbnsmDFmwWGcPDC5 +ft98+WfNIIeX53AGUPVMJ0AfCee0HeoQTQasAGohQCL9mBM0YCJUXKQWDGEd +YJwwmDAGBSYQIDoOl9ud61/If9/r6xrkHzToPU+69/+96HuXZfx8UVTdj3n0 ++vd22/09O9t9carARjo8wzCDs3g+f6Xifqb7oevdi8d433PE/i6/4LguZHY5 +DAVTNMSIiGJzZb06G80O6H6K26dUzcF3reFljtUCAgWZmK4xkGrGQD5LNLuv +K5fir0TgujRBLG+QUFLhj57xEVDiMLn7ZCQG06knvS+PbeknpFD4dycOqp00 +X134Ln5DJW7QEQsfMfpPsY0T2MeyHUMzMoMJ1H8zd53SgIAPF6T2frv1f1v4 +fAda+X3/ZJKUPm0Pgc6l1/WF5jQqddfiCE50zfBVdxIRRFyUgzytTfl8ja9B +hEhajp9JIZF3V4f0fzPq/x+B/79n1vb/cPe9n3vVPA9g9t7nsh18DsagYJVd +DkAmFQw4ADveX6Xhe6/p58lHSx3XGAO1xvu5Ye4/w9F3E929uelHrGuHIBZg +bzc0epjQ6XhGsi562Xu93/HegPerw25jVucffcf5OzxPjbu1t7O33Yz4evnv +D7u457uFVDqu6myQ+xwJgIIgIJFJYVGDlfZc33kThO5cHVrBvB0oGgO95Kc1 ++Ds3SfX/+773z3P6Hv9xPObt4sAOcUEOXgAOcFVlG52yYysssWQYJGMugzxi +MizcGeCRwmIaQ2MSWYCIgwTXwQgiDHAAiAywUQeYTPQSC5kp+oqOiApEyMQT +RBFARYAUATDqBxEFBFRQAbWkhSIBSIGEjQN6v3H63x++n9H7G+1uVUjfoF5H +mP5ukz+dvTxXeOKC8DfQinEhBKEHha/GHoTdCaNBsh/fjMWEHpk1taMh/i/f +9Tmpo0o2MCd99P3rnfv/qfo6+73neCBgDLZR2hwXA/w7l1QOGdB1XYwuAE4B +NtttjGOAcAyBsT9g5lttt4xjGMYxjGMYxjGNj/H+LUgqOg628UJnz3sf0tlF +B5Hb/zCDggBmCFCLllgTGMgzwNDmmSDuEine/w+y+djyHxfCcMHmz5DwpMIW +IIiZt3WH7VI3D9UmAyCoAAClCKZeIruR/5ePrGdGtSkgRGlraPby4R/30L4z +qZeFvvjQqOSCDs29dVUG8PFA2CuCQtzw5mYC50KlgcEbzyNYebaSzaoSRXKZ ++Vn8nMaLivPCDdW3GuexZXpw19vJqyjlVdZik/zNgaiKXaavN9Pk/OpqyAW9 +mLXFybM2Y9sKxHCbKCb/IjPCYoK4iJbpwcC+4TwzIg/3oZa2nn21n9/1qSY3 +aK22KUqc6ou+1+KvSriS0JYoHg+a61t+XT6HzmLaU3g7ZeZodL/0y/yTBgmU +14OqEfrYxGZ5NPxkfK2pNN8Knk9JNs0/8ypFFsF5I8kx/VeMbpaSvVzP5Umu +hr3PBPSCRVDBd8evhbMj1wqCBWJxe+91dnmoUuOPde7+fYdYDHjPEcOJlGAn +/3KEQJWbOJU4uUDRjSZGBUdxm0bS2Jf/V3xG66fmrHMIv+exNA888QxlrFSR +LY/jaQITQiHCCBf6hZ6MX2lwEWNnTFLZUQrTRFB2J3WsO2aV1s7ZCFhSj9du +gGJJouVysTEDn1qMKePNCQWRcq6N5ccrTX5bjgAFACtn/FwqJTAi6OU7YBGH +uos+qYOr3WenJW930HIV9sjiFUlPZXJxYZibSC4ZC1qudwLZXFHVXQmws8a2 +zkcmRmfN/H5LpOV6U43tPmHvf8fc/79CCdc6dH1UgA+QQAhB69Bzfk8IAfHP +5+Q2u09H3br+sCO5+R7HL4Hzsd2jvX0vu/fz5ZeLg/P2/F/F7Z1/unK64m8I +Lw3hPEbaHcpE/FCG6nPhgDWSZWZJEPvc/oTZVfVff+H1flP/vg6gD5fhfUZA +HivHey+367i9tzP8qtQXUEX2HIZ/Sxbjec5uwc3o7SQfNkoxmlWwAAAPh9lT +jPDCwkACEACE/lwGEopvefqep8T9v+3weoERTWEVgAQ4Pnd9UmvmJ1qGz3Qz +q3J9zSdgCwpHN2h36IM54wI0mnJgt91vOVSjaZao28VY38+XdyNB1Xt+AA+2 +08iATDSIKUgCxitPIJo7oJUPhhUyXfKbsUeRTBtZ4AA6Sf/DCRNzEXE8ck6U +3deCmfB0LFooDBXcTEMLbe9e6P/7s26J7t2g+PE0wAIRYCICALpCAQQIEQER +RUVDF0whhXz56dXLhaf6vmdlHRCEsEhFMyTBQUEMTE/kJrID8L+bNRPD9B13 ++T8X1/mh+vq7F9rfBsqgHiJEMJUUiEREGBZkMGAPJijpOEYFHBg82vjMsBWM +YQ36mtqApDWBkcDIkhSGAI1IBpkViKqqHr2jLWbPNhPL6BD/f87kex4/Q619 +j/3SP7/BxzCIIv7x9zi+C5dROIHH4vF4A5g7AcYT6PufNdH4vv3vepe92h2O +W/t9L/D2z1fbd8ACI+sDkBFA5wEE978D4Gz2FREdwleMB4nxOeXfvx8xy/CR +QlN7Jg6Q70mvjCRiyDbBEMt7keS5g4+vc1ljwOtsgbOIcKMjgsJmCL+p8X1Y +ACACWEQUTzOUV2jthgV6LpDg54BFJBU4JTxR9tQlcrhuq11OSdbfGzXBU7of +1ObYMsgsPfqj0G7yKSK+id3OLHG0YEKFi654/IsaizGX0C4Dv0/NB7VKpq/u +6Gcu0snyJzD+tlYuen4JGlQCfjcpXT5Y+gp8G4bBI5P9u3I8lNgQ13T7iIe9 +LVqwwuVVVxYxNClXgDnWOgmkuzCnrz8J3tYDtwBOEGbyg/mLWAKgqaqFkY5/ +QrNtlPDumJ6I6qsJY9YvSQeVz6ibH9G61JwYMGRsJgFigsI0I9X+8TLobFQY +7tz3O1tx6Sl4IdwyDrRlhqie2lMkAgIHJRGYsm8Hp1cFF0Dz94U5t1NJoDGh +3DwgGSaGSTzTeJm7RhG5yIPCuUdRx0E09RzvwyiUxkrB4XXklpMlxHsA3sTU +ynKb0U792+2zKG2Z43VRSmEx+1529ySaEhMWWq09xXwY+HB6gzJrKaAVZPpF ++7BNupTdTVCw3oyb3X8Cx02k3QITBHtWad2LILGU7xUJ9r6d8yD+gtokyn+c +5Y+2pSTKVz2c2142uthOmuigJSRZD7m8OvuqSm5KcuUmd+XbsxMKaeHmI23t +goff0Cr6CxgwuUrzcAHLj4kMVLcXhISAqztRxPcXj7bZmbK22vl/OI1DaFU4 +GeY2WUfCRDc+zzfv/D8gqaPMR+z+j5No46a1Wn1n1EFrVr4AWEAAgEAQ/ZAS +FPHGQGAoSWCJGGRPRIGAcJECRMEGESEDBQWQYMAfi4vkut5prH9qJ8fYFC3v +Q+s9P4vLWEnyPYT1vs/Weu3h+vwZxvr7/2Oa2zUbGj/vqp9L3/cvzf7+X8/s +hyX7YiAnyvyt+AfmR83QiKYAOpd33/PeL739Hrf6Pt/1PZ46+g8JB6113ymP +uek0oCaUBD+4cKWEQAuIgExvojkRCv8fUs/TKQPtFNi3PNaxRJkJ9GVOjtK2 +iACAB7952v+bwf938vgd6B+nsAgnWQMvoc7kor27u23/f6j9f035X5V4D+eO +S6PX77QmMfUdnV7hazaJN8ew6pwBDCOJMRNupdfW2pMK3vr2UvKobeBo5CTb +Ipncr9hlgEQeLj5hgra4f1QJqT9qXEE/h6MqSqHQvBS4dExqYZGVI0k0TRVj +ulyA3qeiwdK2p03WfJ3a/0/2eb7D4L+7oOj4X5Xb/Hds8eoDy4yKG6IB2ayB +u5CsLksFl+r6jt3lvj9y/5jW7Sa6lhXYFVDtmBX2YgCwgEyrm9IB4P7Ih9MI +CWEJgPm6LRGLFixYsWSpsKCdQAjQv9odh/m5Xwmjb4goeh+3+D421EIJJI0x +AUJQRIxIsSBSJAxSlDEBSMQUxIkRREkQBEhQCBSULBEECFKNCgQQDFSEQJCQ +FH5yj4xR10U4AHOyuyIHEUdSDviAEkgiPLEhmBsZjws16h8P1H6PqvO+ED+/ +y3P7nMCG4gBwOFb83VdIEIGI3ysokC0DSpMMFARrdNs+H+t/p1r4//7YBD8/ +yfr8jyfhvSdX4AcJ4IqBwVHWXMwg8IP6PhdX5LxXTeU7547+k/56JR3jCBIG +8EUQDqsKKLjly8N0/ZOt6OVBRe0yConsdOriKnVwRVB4ooKCIgNkIJED/Fh8 +MfWK5FFeZx3ckta5XDc6S/PAKufHnes6nT9xt1gfYEAr+Wvq8ORv9XjoSQeP +oTHtPXBew2ssnssfeY8eaYjrtSRGk0UnUNzr6aGTL1nyELrN9UgsJNYQQliC +IFEEIcmi1l5GE9CmZo7D9OrisXfLwULeMnl/F68rcqy5vnxWtlx1VE4cNwFX +OfzPKXayCgENYIgNWE0BBEB+G0VgPgIIsai2xPR/thsNV2uw90SZVQoAREDY +b4+Nu30Fj29wTrDNj2zLdRn6mkd6M6q6YYMMLvsQnqoMWoV9CjD8VMQvK5BL +VIKzWKvaEr+0g1m0gaRub1d3nq6LpOxUXHfqevwheYbXEVMdRR+GqmXIQzBI +cVNtcaxX1fvFhX11IjC3FMEEQXvGw1NqsRlJSyPcLPA1clKkr6yO8LP5svPz +FfDusq04qDKbjc1je60lW/Uf0se2hLsCmXdvIQHpe+uiNNhLq3XOYVZ4o51z +1L5d2ywdtP214imXelQNZEtHwYTsZmfJZz/Q6qI3i5nHsq2VPy5J+d1/P1ux +5+1q1cKNvlAy41hgdMDyhgQtVo2RIs/itSuoa0L1C0u6J8aAMe80BDwMqnJZ +u7ZmP2Cp8tSKMm8VI7dJdjsem96QArv1NWdWVOaX28iqXb/nXkxORQdXdg3k +PGjz29bC/RkCTlLBRx60vNJtp8Lzd+54xFhS68AZJlfZq2w+yHCvY7rkoc4h +ChI+BgYzhJIJDpTBB2G275bAtTAwm3MN5Y2xFG/xX92NF4k/MM7foOm+B5DD +hktoUFADxan3g2Yko2EWRZl7SmHf6Q6IfximArTp0ZhLuCi/XVK3Cvsgyjo5 +EOtkTvX1z9J/iZ5k0BWCSDDaXSvDIGyfflZ/SxjTvBDne1crVqfMG3r4JQkd +Sh4YEHsfl2lrzTpnCyTgjsAIAynMIdBVJKtSbpQjY3sKmebLrD5Vg1WC6tgk +BMyVF/aJHcLn/pt8w/ND7XnT13qXbTNDx6LWhL1dJHWmkwVBjYhACAFFCMSH +U/2PG/lfj+rtfI1/HY6IBQT3/KXiP+//Pm+P8HvOv9Y7H+VQQc9mV/smezQH +yZAvC1YdnTSuMqFzTKQDIdaZzzaRKdPjm/hznBrkIPKbxH34RG4I1Vw3bbVd +Pt+HiufjnN3/zd9P+/ChQ3mU/8xZDZAIuICQBEQaQAsW34YibpxHV3oO05fm +wgmufR8h5H97N1gg7OmMJsBMD5juOQ9dTQqCYVWARCcJgQAwoEIqdk02aDAw +EmHfqLthAKQABkgBa4fMANCOtpAMB5T1X3+8dKLsEiBzXZJh8pgki+5mAmhm +Z0bJkEG4oh9HfG87TgMhT7AnwxRkNd0KK5h7DYey9+9qhyAbU+vOa9vyDcfU +JQGwwMh8g102ETyoqSJCcFA1bAZiBsGZzXcN3rXl96HSwLtgov3wUWFBYFBl +HXDjCb0BVBkHlOT32RzG/PB/69N17+3qfLZ+56r+z3D+b13lOh6s8Iev8Toz +7bwQ/qw8kgIdOCkgA4AeeMCODgGkcjoxDASYQNIchpFE5PnjUIpjWwh2yUB2 +wjkkAN0UHB1N2A5VOV6OqrtW12LpTSdHFKKEwA4OmoqfIb91dIZjZODfodWA +SAVwG4GhVU7WgOwiUiaxGVxF4gsBBK6xIYhCwCHyEBPIqMdw16qqqqqqqqqq +qhhVE1PWVHqCOyWSDricVFXciC2YQTaN0IwGFAwBmEI7mvxEwtFBBEcXqJvr +XcNdZDPEQrmnGXh8jnnA6QyVRm18MKhGDRLEF/FyaD50XHBhJS3uyZkPfIMk +WtlIMxRQRwZD/pBBHCzsDRwZo7QaR1g2dY0DsILtFrkrlDsCMoOuAIaRFGEV +hSABhEAgBDQZAi7BKizweJvw4BwDgcA0pvFEzUENhR2wLNO0Agb5TBxHXMIi +cVLLKNkxjZNEEQkkUUUUUYkgkoyisWgT8gQl5um0Yc8jAIR58s5EzzVDBgwO +WQAYDeIazraLS+d+T9jh+l0H6wZCocn4LinICyEII8WoXECBYwgrVAgYCFFx +K4CWQoqpKKFTj8kEg64D6s5Fwq74QcZEYxjmt9v4pFNOZoYM3IANYfVf4c99 +f3u+8fy+XL/8/1eB9fwkOEA8ToPKdl7ZmofueF93yvQPAIIggIRD68AHbnNQ +UjAnUQAEP+MHuPAdQBTjDJISsinOS4CVKQSVmEJKCQiEGIjljl7IPV98cs6S +Y6iPX0eOiD1YyA9So8iAJsfqqcuQQgUivZGEIYF4RlTDDXTaNsFehHqK5AdQ +d0rRmiZ5iZlmGsQL2BA5zu/b+uhsIDzR8n2o8zgAroB1JSJglpwEQIhoqTAY +OpjupgFEyRPQkpvYUhgApBglA1Q6oDVRaqgADQEIGiVNQaScsZCjkCE5hCcV +AOYGTYBCHZAHhcYwIryJKkhgYjhOEAwKO+ReHyiAji20akOQQhzIEHODKY2c +DiGUyRc8soooKQYRDIFC19jihI8LLCGA1kH6Pu/0fcdn7JvhHb9tzyjkIwJv +14BKLvxzRg5Dl/9fZeo5PzvaPafW83td96kB378rklOVOAn+7ATJDIuQAxzH +NfxeD838P0P8H/3e+Q3nvv4mBen9vYR8ifV14Xb8Ck2uRJgqAupD8EHfF89o +Nnj+HOFOGU77avSbPxl1zFpBGJ6X2XRPyPU46wVh6hW834ZmfbW/eu1Hyieq +6uLUH0pgP7aqQtlKD2LO/R36fA1JmwzD8HxvzloS+sVFERDfDwevfUbjo0nP +8aJjCgGtGFXwXQgBEEdL+cGJkm6b28+G5i/65d5aPxsdtn5iaCnukqPLN6mf +ZQtHPUXr7518Sq3FETUblsAGJtCF6B3ZXkll89lJ4vxanasQC6F0jUzEhuPZ +Pa7yDGTj2O+xQqCo8BtCjDYBk2K0yxNm6lNtTpE07GuNkmDJ2Tt07AkhX7bR +RbZAnGb+4jmGIoirXNb3dXIdccjKulbQ1SRdGsSQoFto98m+2pkyjcC4p8FU +n9aTtwjpP9g2+KDcF5m358fjbV4ZZP1E3I1mS1CQrOYQerlGYMIFn/vxrgiL +S8ohKJnRLoyVRcVR/nO6oBAmgATYApleIixG+/qtEmkjuw7KaG1Uhe0WbJig +375XOdUZK9lquylRxAZxd7x5feTqqRY/3KKtzsyZunV8ekHo2AY8ZDW4Oti4 +8VrRdkSU2toKDCnUI9sQS75w13v7BnWVG6pFu4MZ+cFv78NnY69aD9bP0+8y +3vsNgUieaPkSwhUhN8ahm4gx3rxQd0b70hC4mppSyggy6qSzr1bZtUo8ncYo +G/iJLvJKLONCUQJyBSvchv3NfwUCZ2NYk2GQYWSMXGA4ZQwFB4R2CGTNXVYl +uIPedeHSmM3Gk8261/L16W+M1MsLkivcuI/oxA6X0leWx6b26sc2fXU6TchJ +KI8hoZiuPm2hrp/5A1G7nbJLuaBh9ZapF+QKjhetr+QqudsG4Qs3DXwgmNf9 +WXy+I2P9DfA0+FP19co5daPjVhnSeFxExOorVtKrlEYqnAyU9r0f1t0io9Gj +qk26BMVbc7lT94b/sp6jc2Yy1ZJiTYvcy+U7Ju9Gdoxt7tcfsOfl1jytbYTW +AAX7Ff8Opp5BH3HeEQdgASAKK4EceCbROT8SoTqp89oO6gPTd+87iVWq5HEs +EvvrqN319FQXZxvSYpUWsS4l6GUuaOjIfBft/cigB7s8w9kmjQbaeozSppuD +a05Ny/suUdYJ4bOEs+KjvESDAbYePIAzZs3ga2/adApY0qHFOwIZQ0F7wzLW +QG4o0RGRY3vrVSbk8txtEcZkImtu9j1C69qj0rgPVfJHo00pEhHZ+G54mApH +n698sSrPGddcSAGWasqzZuUIiZX8ilJtg2wm16/GuNYWie6f/h5X49gSVFW8 +eZ1+G/nULEU+faxdTvqRJCh59PGxybE6OO9a81waw3tuf4vTchnn1p8O4gIo +fM/DnS7YD2MFJvKMmMBQq+Eu8CW1+bCEsVZ2QXkGephlw0kc9N4hV9fWzwZL +UxJghol7n5wMIbEnge4hFt8HaCAdQGnoaj944f2JREO/9qwjR1jkQk+3i5vZ +rnFIMierdW2bH0ltFiCXk+K93w+SKv/EKakaN4umvcmiUL4CJ3J2lrUiekaa +d4rF+/7GwvCb2hC7KsgUVQeXdlj3q5ZIvGVYDoz+lwKp8Ki5vy5iWH4lkFgt +LqLldrRCxmTyJ+Ncvk4ProKqCJhJ6HtJxwB6UmkdcfqoOF4EWmLLZiPktXvn +0iUylj2GpjHbJKjbeXCWmqaJ4Qh1DcydyQ3XvFEdzNCMN7V2cAuwRggIAABB +CgBYCCBAfrr1voJEbuw3lcw3FVuD8ydAAAGvlssJdmJwgDxedMqCzsPimi5Z +drVzM77XhjQAAAFL9qndiHgVdVznnb1jocpdXhbyINfHtf2jSSbC9YcwEq0E +yFvrFLOve4BVJy1W+qNCL9yjrTwuRU4BAUTaZLe/PYqhPO1pp2DDuy+T9oDM +XUcXaiYI055ESk3gO7i7QNbzdyXz7597LkqDGsdBFXE3EV/SlQnQRTFWaRe9 +EUxYIjm6s7zTfFkvfeK/D7/xfrP9fo+v8N7vxO7+H4nWP2uqKr2tRkYAkOi8 +V4LJPEeJ8Fl/x5jx7zv2O5ge6Eo6T5qqJ+gf6ngXB0/5/yvh7vgv1t3l/zu2 +cbzf3vfTfxsUgEkDxQKfmyMGGukWQ0v7hXLAUQtcYAAQEQlf7qUAECwum1eM +bkgXdUi6DqUzro/ho3ity+An4xpYFYgqSQQ2BFPsbU6OY5hjlIIgADq+C8Yp +vaByKpUoXf0i0LmYqs/Q35jW+uK9Svl4IjtKPtaFEw2wwThda0B80mdRODS4 +VOJL7+Xom1Sblj2lnhPcZUf6ct/0n6kj3dGfy0AaugdZxmQlMrC9WcmIV/N6 +QDoOIsa4j3yLsNI6Fux2OUf5u6CLUxqP/jaYj/t5PSLHVOKr6Pyarcb3Q1GL +uUgiThjjlhBpZF9uqphmugdOn/VkeUaNzTu0TTyMZmLU0mLkUyDf8J6KedaJ +Xu2r7NW9nTh43zfRQTVMfRq+yiH+eB5isGr2lck90VNq0ufLO30ImtWzMWcO +5mae/Szvm/KIc51KvTUn89rdvV2kuL+sONrZ/g0oZDvnsz7CU3LtWE2Tovng +f4paXo914QpYBng9P2OLH350dN4Pfc2/ckN5VUdAxEqVo9ehdndX0LQJfash +9aQOcwrULlq9dLKSyKv+TwVPhixrZh0QDu/YB5atQy9NIDve3Dsef2Y2/Oqt +ilDo55JbfSW/PLpVz5B8pkvayQSY1elLQqHQ0EPHLjsbUQkJACWCL/YRjk2o +5s0FkPURl1ELKENPSe1SIUjyiHYcMhdmwGDkPTxsjstJI0ZoPbBnuzmXT42z +DZR4aUSB+77n7fuLyfu/GdJ1/1Pif9/Nes6H/vv/2uS5v8Wk6Q6h2umFOP2B +FQczQEQt+0IA47GRkEajGGBDBjDgwEAGAwBgwQYwkkgSfZ9H/p+10+g0nKgI +ohsoKJ5mVUSgQQe8/G/Ht/W0AAonPWhwAMAAAPZYfOggjEMFAZEoCFtRc3Pe +3kwaEWdrlUTbv/P/q0odnBRhOofr/7/zd/zOswgf4qqn4eF6bNR7NyQfu831 +jr/XVBXsvu9vGfThxKFkWuLnPhL6S1K4G95XhX996EBiiTwBl7NiEQHdWukd +lgGoCBLFAUAnJfU8V2VR+F0G2o9r7+MgDKAEADsKOQiAkEQHk10n3zqCHohv +jwsqG6gXa67He24Mrs19Zy5GeqHGzWuklgAgJ2dJZgVfipOroNxkxoAgBQS5 +tkfEE7jQfzcauBwbUbx8wOLlHFRfsQ0rQHMOVH65v0fZc7Pm/2mt/LJgm1He +50MotVllaejeWLSSk46ae3WH/Sl5YQUBnwAAERKFWEMKoySDJD3VMJhQQkYA +VycBgCBgWDuawZwZAkQJJAJA/yYEDCkKdYBFJU/mfMZ+F1PeTZQH3Z9/we5+ +anfV9ABsoo+VUQ5chYIAYhKQVEUkYVEQyR4KCEHaJApVP1shgYgpyMslCEZe +I5hjAKSmQJkDgMlBMyUpUKVg4e8hIVAJE3qRBsyoa3qMzff09x8VqdZQN3fA ++I6jzefi+KbSKp74RVd64MGu5ZhkEc6o4EV0Qas81DNEzEwjGBTUo6AEwiRo +IU0AGgNCjCADyajKKyjmAeLyHBYYMGDAOAdYwrgDXB4uwKrvEYBzOHLkBqgQ +IIOsBKgGtmvDDT+g/64swDiGwnBCVNY3VHXE1GumvjCRiyNYQ2h2fJ+VKKKK +KKKKKKKKKKKKKKKKNvMANJqXWMJZBmv+/O9t8P239jSIqPn/heS8P5ABQTkl +3gpvGUZR+WG6H5NCq2yDocA4AVQf8Q/vz59DlGFpRDAiuacuECBhSDjqbU8m +Rrm4o6eYjjbkC4jd9TxgguRdKHJ0q6jGm1at2NWEdQLt7QlRJBKLzfnvDb7/ +Dufb+4a3p9hAwHhiMMhBDLEGDAo4XoRAwI4MCZKqJlAsAEAyqY50RVcxhFVy +U6h8Pa2bouN1AORRVTkyFeFx+KcV4oDxs5oaFMAHNhoNBRE5CcxjInJTkjXA +Q33fTJM02NijZHJXBlNNaeDpOCC8vrbG9QOHsbBHE9XpEVXayu5fx9p1ea5j +4nWfEc32rnvxbweIAJ1DdFDIRVeAoCHRbX+ng+ZFewEoB274iKKDkZKBsKqp +IPJ4MAqP/nUch5VEQgUE3R6XSVTBFXKmt7f0PH1g8Vs736Hsexf+7Z27qYdS +ROQGRMjdMizOx5GTptXt9ZQyjRxA/r759rptff8nyf2ff95/e7p+n5T9T2/2 +fHCHKIIBsxDRq8iWmTBe8nfZqD7VNzTbRnESE3D4cnobNCUf+UvPHmtFjHpq +e2O/z2A1/5IfdjmudqU/tq0gw1sf2cMwvS2Kyiz0Hse0EOIO6/jtnRCl9Ise +tdwciyYyRrQjYVxDmyhD/UU8KV+K2/lyqm7xntLobkrZvMrKJjBDlLFhq5Fq +5UI0DCGjUKLBnkWD5mVBlNRgnjkOxAeQwtWeBLIstlONwH+jtWXUEy1R/4e7 +FdNlaLHFxtatH6wsXtILtS2AxakznrmuHg7ZO10oVBg94y9FGVIXnm0G1Mjx +/uJoey1MvsNSAaU3+hx7S1tHhqD9QLmPQUpZCkUnlg01W/LZkqKMPX1cu911 +lVu++rHy0gry+D4a7OxJbn4JMNVmEn2+NnQI3w8dy/Vu7/EFNH613ISaxSQa +EwaLeSfCGm0NLH4UXXEzOq/SYejWqgmUkHQy3G/as5V7zw4LKs0NMeuCGLRb +476HgmlRqjWRaIwO2meTeH7oR1X37YL4bguWH/KThfdw40U0X7C/gDfKKZhM +QZR3Q9r6vjK1AOAIdtaw8/I55YkndU39q4+EXE9Yq6OfbM0RivkXXN6q66Re +HB8oYD9Pq9XSQslg7kC78YCPX/p3joPN2um8wFHMqzL1mymiCRD7+ls8uf9n +ux4een/XdPd8P6H0fceP7R+X/1/V/R+/vPQf/uuHZvdfQ/RhDMPnmKDMCObI +ykfnEfmf6fS8/vt8ds/H+fuHrvhneek/99/1ffgg76H3/ovL/a6bQhucb2Ru +uytzu3s9UtGrbnNFtGBGjV5KAVoABJIIJL4tmEsCAZEAARs7Tte2jnyPI9M+ +HTV20EcidJ+Qx2cJIPA6ZvkvbXPFWe66VtqESDLb+7Kkm8gaE3jMAIvL5n2+ +/S+Pu92/F1K9TxNtDq50vNWSHfP9/Wdw+R+T1tRETWURfHYAF/skVU5GEA1Q +IH2oBf5/gf09j6Djds+jxt4CAg1LnTsukvQXl41Rz9MwcbO97lGOZ+1zyIX2 +ebhTARAQEazpkY1sthZ7fWZsRAQEemfWjGqgHQl/9AHOutsM6v7fWdyoqNri +3ColCICAjPTzQdArhezEspJNbI2O+bctOHGDcWZ20e+nzW3nNsl5omq7fIst +fqY/aU291YAAtAgtgAAITIBkoEAZJkABhT/jNQO/GSmhDI+p9T0uSg8p0IbA +AS/96w5GT6AK6/oP1hEM+VdGi0hnI9L8gQfGCh5QFDTsQsIQ2qMFlVWtfxuQ +dAUeAw4JHNrapmBJQxGnGNVtCh+kKGNWjFiYw1jEYqqp9cOtiqqqqqqqqqiq +q2f3N3NR2EdkvYRRgEIBAgKCPIokspIYxwOA/yPteF4Ljq74AKgmjY+Ma28N +Qir8Pqerj8MBEQ4yg/BwCK8nCKqbGwGwAisltBMRiiAFTEGKkkkQWEUhTJlX +fmDiGkURbhTBFMEUwRTBFMEUwRTBFMFwYiODYxhwoQhppocIQhppocISSaaa +YoANAIZM+9jkANQ8cNBshvQODfQSRCYShDAw1NuWJgZAQk2TYI2jWxiMGRmI +LrG8dZFAc9GodwDGMBYsPJKOegBH0gB1hMH9P9Pq+NtoAeY43H89znrvydxO +AHGUezr5kjhnFHviH64ZCZDwzjGWWMGRgwHKo5BkcdM8co7LoMiMzgig6oxx +PEfR4n1ex/z/A8t0gIqg/tSAnjoEU4rdGmA50/T/B9L+HsXwuocU5LjnJJxs +dD0QZaXQiGjKQiQiQbAjYwKaTMNwB1MrqJUyCCIDeHUCEDQAKwfFlQEM1XPB +ybkqgEGgkyETISBhTMFPo9x6l1L8X9v/H1+v+i7vz4boQBO5As776Xe/9fwv +Ecvxfp6jkASjQ8jByKpYsuujhc1DIkzwg6IzMpzUbFloXC5qnIAaUTeAhl5D +l/5eP73tPBET+xXbtiXER8nBmzhZQd/Ky8556/MyNVh5uR9OYdcMLuWtmoPC +xiIzY8G/anAh7fqH2Pl4Z3B4UJbaolVnr/pZ7rQZ7I5fr5nQoz5zdYPNbSdR +l55NI9WxGLsNbt5qdwsjtTxxpBopelPLiHnf0YeSaKFdAiLPEOS6DMIhTQ1X +Rp30ccXrbOZMfh7fVYG9fMWxlJM659Mq0iQXioWs4yRzWTuUnA/CfEoGDbMu +ub3dbImKESpluwnTbs74tDXZMVqVicHpbFcv3pq1Wig60l5TvtKGCKM3+wll +nzwHOX9aO5gdEVDJN0UDagL74W/Qk5tZujw3Z60x7ua1zrYGEZxPErDsC7pw +z4FS0yK8TSL+m82DIo9b7l8UpYC/r5U+pCgzQ0/1h3rc1HmyJvCGu/2a16BW +xb+Fo7bGcPzxc6zNyee+NsiSESAVyFdmvDBqC7r4DOTSskCJ4mbqVekeYh7Z +QQm9K2msfrBJAT4zpiNUXb/aMpI8T2krcjMoVS2yzvQmKSFxQVJoT4WcQf1r +jiz5C6mDDzhezGxr14Fzm5RT+MpLNSjmFEFSUSyvEbOTAYw65MBY0dJqnt0r +6S9/7L1c+LXQkzq8nf4bsvlVgZ+qr68p9vTPw4RGb7ptVE/SuITPIMK9hvRf +AwumF8be8NDxR1dL4ws1e7xDtAk9VQrmz3Jxvwt2l6CSujZSXyDkKA/hterK +OxvaaIz/eIQTpCbVoNNunODwf2P3uy9J8v7vev5O7dD8XoujDdInMwB9Q+f9 +BRyAPbIYdBckujQpglHMCTsWBXEFBpMZ5BjA2AxhFWTSGrIjMzA0mFTNFDQQ +ZjpBXLCpkOZmYJTIIYIXDkkjkQsJCOSuQYWCAzZMCYNBBgwYEAyAg/zwWEBI +oLBlmSRWUIJAdGDQsXwu9aTMNkidBpUcHvvPdd/K4PvPvY/t9F4D1naPe7qJ +69kHtXYf5e45h3ThcI8yWfIhm2MYw8TLGgyxlgyMg0Hlej5vwfU15jSfN8R+ +Hue3wP2fGeMP/vpibW+I7mYXv32+zmXcJRN/IcmMTADwBR9yfN+14TR+X/Jq +O09o/7/97D2nUatc3AEPgy+UxuWnNBM1pVLCfK1pVqfhuTbOnC6cSbxPrNJm +30QiAprQpvRzIhNWjsLQnggjCaxFBGDr52875oDNnqeQ3OmFiyEDyx/zbf7m +uCK8FVFCVSBRfuwgAPjPT+m7bIkmIdQv/KlPk1feJiLNoUid7ZtjZcfbKkyJ +rjDVdXjVhGbD10Q9I00IAAAAvGjnHqhs7+Ah5mR6LyVXO5c03Sz8xPP9TBMY +HhVAAKLKRmeG99Zk/iKuYRSYhAF41dmha5Seqi0H+QNHxKHP+eQh+s3PJ96J +q10vXgYIAHXVGdGFAAECBBkEBIAFAAB6jyH6nSee8f9PsPB8Rs89ukiQqUiv +fye3AIr5MAFPB4f5TplVH1IK5oPxVREwY/L4fDIDYALvhUUKGRURUUIQBUxV +SSVUVVSykREREVVRVRFREVFRKJtCQeO7B6XoUQUA8Z5b23F3hskqG/aeESAl +KJTSwQu0EgmCGhpWYkhIYB3gQAmCQQoAMIBAjoAyRQMBmAK90ECFJElHNEUc +hF0ZGC0DiRHASkErkYDBjmADNVyUyIUzIQgECBQCJF+igkkkw2000CJJBkxN +zCi4JUChKhjTKCxzaLShyRaBLFkIToVHMEMAwKOohUBzHQBoHIEDIVWEssAg +HGAEwEQYSCVQ30EcZLAYCDiPC4cPVi+JMw0ZZYMDmWFNYNKgbIKnk8Chk5Gn +jnRkazsOxi7oGAdOzDRmGR97YUQMtr4n5mYAbgr3UEYEAJACBHdlFiCZEIgi +pBAAoApVd+goHBwIYGiiVF3yk+09Dg8F4n62kzDsqzBbGwgOxKGQoDrf6Z73 +l9CgeU+Bj9jXDCCG+DqX5Xw8h/P5ZDfeO8f7zuHt9pTf/T/b8BzKh476fN7x +3joFDnyQOdQ0H6eE6BOSM7IOW7cCG6BsD/6bCiAJ8PzfAXZkROpCIhCcHr/s +/s9L/V7PtHnvrc6dz6TpB51ZN4Q4YIYIDhvJmSBgjIQCQBkRzFQyAyyDUcQF +zUfq5BmAi6RCBEghSYXsPw9WcuiTEotLiVg1GAMEFGMGkzLAGYRlhRzhPFw5 +zDKOToRkMIZOSGNE5jZIJCGTnjPI4ZQ6BFwucMChAuQwgHaDkD/c/uDkA5Zz +OXMjJ2DZR2cG0JjZXaAYAMwMkHNgQMggRPl78Ptd2wKqPA0PNgBuAbhIRbxA +7GZY7E8+djd+OsqushqmhAsK2MA7xDsvmuqe5/4eDIgCSAVMcr3ZYuIRHX1e +jUulGlAIBbQ6SYsUKgobz+M0ftWNLsVfulY5Z7jPVsQugmR2hkKHXkv3sMeI +dvKufIxQk4pdxYnOWEoe0v7wpboPIEmXL+hawY7+iP1Ezzp/L8f5JzJzljdT +lKHcqoi4INSQiBZM4r9x0Gz/IEU05tWFh+24YKK3+b8JQNHUUkJKlc443kj5 +Yx5cJTHuhQ5vv/IQIuGEcY0BtgaElLZTSJmYef2oGcgauD7x6Jnt9ugBc+Oe +e9ox6fW9gNTqEczW2jLfVRCr+PqNRbH+J2tMW1iE43KlDUIF7YhK0yqQk244 +uDEMRYo/IgbbsoLSdV0O1mKYo/PBFZV5pxF5psteg9CbmF03yhf0HYFiRqPN +n+VXomjfBB95/A8GwVSu5TGwx68o5VemsZz0s5+MzNJMHXK0LoXVla3JAfZ6 +tijpBtNMEVYVyJzfmlLOrSPBHAlFgtnhqSanuFuemYQ0RhGJ8WZSTGC9Qbsq +fNFUHMT0ijptFkJl9Un08L6EVJaVjYmD5sZCzSlLqfGj5RrzkK27kKziWFki +8PqrIKz9EduRwKowGIwrjqajJ9cWEYUkzpNY4QEcMktFRAAAKAFBQNXHrHPa +SNaHkqymYELNf59UNxDoOxm7qlzy18OGlLsFW5FeAhKOXu7cuFGt9hbtpwZJ +3conDzLWAgoStFl7pvI1fqhL7SOVheYmdXgp2ar+o/y/vfP8j2vqXgPeei7R +732v6Xzvf/3+v+Zv/Dct8GV9gRygazjkCEcmFaZhIMjGCICVgiEKIyRshlUg +JR7eqSDkGZ374Hwf2DrH2/wc/7fynfP0+g/c53xG+Tyf2f2vq8/o5foP9/0f +r/88mC6nlD/7wvxw9WirnoUkhj0vUfho3xxz4Hzxx/jMGA+K8WLIeR6zMGrm +jyZzFj57d2eMad/Wir/eqKMJj9WmgTJkFcdiUBQkFAwj/De7KE4TKNOjrK/s +3hkqFVraUeZxt72l3eIkUtovY6CvvEOHi5n8KP6ZcSZ5IBTOJ3QfrVGgorNk +JRWS7Xkx9ZYRGlqGuZfh9Y2Ay/zJZdAYrF7XT7xydYgNvgo7p332OXhfi9X7 +z7HoPX+Q9txjw6RMQKJ/B2kDu2YLYBwqEJ3JMKQmRDkJapcJcX7nY+qauf9X +8rosBuCK+VQO1+IzABT2EIngIQQ38ghpDQnf96Hf7WUvy95dd//KoAGRxMgf +8hR7fqBPKm2ioBHFhOnhxwTW3NIaBA9h2vrfPfp8L9Dh4EG4ABjrvu/ubf4f +7OqoAHEPei/HGAQ4/3u/9x3QfW8kAimrlQB1SA7BK8Y44R3dcgeEIGwJy3RZ +KAhkLspRBEAQyZKIuEBYyTmWcBk+bDJQQJVgIEYSUUJRiVBggd6o6JXhKMwV +Aq8qYMMRkRKlNEEMCGRCOAyEcLBJAQkQo6QuPKZkMEVVQUVVUSogZhpFTegd +QyBwGsHKyCBoAD9YNA6kA1ggZWQXMRVNtBg2hCKAJRlXURgCDNP/uhOCgjtD +fljDvDUKqGA6/6T+zhHBVRTX4gmFRAMG6oGXFN+oaATA4Il8uuEMDYKIcDgw +BgwWDGBDCkMLNhSmw4KHFgcAYBg0fI20N+BAQMZbxHXGV1jMTQARBCpxu4+U +6Q8Z6v13S8ffALQU65Km0ARiUCFiChL9ewQShTCQBghMJBgsI2QwYFQlxjDA +YRMYBAkXkgwYACCyDAZkhGQ4UwSpgUpIiEoahSMglTl0UCAVN6Qgib6KoFB1 +iUADEkZYDBFCRAEGHA4CSCClTEK4lShBAlmokpsYcTSxTIYwYQiQVDSwoYIV +ThCQdGWsodU1GB5FABYFMuAcYVUNgeVDmDmEF2MfIVeXV3UHcB6zo1wYhTUG +yJConAH0gb4cAWAcKYhRwMYyXQIPBURCQ2TcCGBM1PrXxtR8TeCmFLzlhhpi +RJSr5ECv1FfXqYRHNGjmYTkclMKGUHEDLjcg4JIIoIiqkgkgaKX9BHnR50rP +PNE0aBNBaNFVSLqDAdT4yoH/ch/+iJOAHL+eIcsYc3w3Mj0hGneEAyJKEugQ +yURfKetFP0QP9Pj9L3vYHb43ODHPEA7Sc0kGgtB1QIR5pzEUODG5q54V54VV +GUeMHDI2uSh5Hk2eTzuMimaWMowem87up0YSCadJqbFqTMN0WA+LyvM7Zywi +uNJAGUNxjJ62WvmZqIAkg992erKOpRB+b1b63m/1tbueX/78PWf9/i/e/z+L +37sHvfGD7LjptpaQmzA1EKbuyy6ZZtGV1YLRUOF2M/dqXxFFzzWefhe74H5k +Hi+MMaV5fZhuVlHyGogGvjGDWfxrePnf2vrYAUpc925rX8lO5iONXP4nVU4O +EcbJ31lHQ1LwAkAAAiyePLGpIKNNTgrw4FshUOj7H4NiI8qbs5rK0oALjCKo +NLRfnpLi+iXwLm3rC5ubjm2rEAk+49kjnv05oyYFHHsgX+xr6o6urLWbRpxw +LMM9GroUTsm66jtwWlQWoM5l88BSwkK2JLjiQsjjj2P8/a8PdbdQuHiOgBHN +EhGKkJdGt0vsmzbEvQC9iwRpii0k7fQ3XJRtXDCQidaqPOvOIy4cRwg3sAtG +Eg+WyK++GiqlSlag0pZBBG24cxMYGoRMi+18uhrrDzGqUWaOmJIt7FjGOKv6 +B2ht/Tpylh/bB03LbcGiTDm3/mxVaO22BuOiMszxQgjSCuqa7QM1iuO7WPMJ +yAS2iCS03IfVSfwT3X1pGUityR6qqdZrp8rtZlD70cVft0BFC3Fo9EeT8AJE +129xsk3wAUAAVvxpBstRRg9Pv/0+lGFAdrRpa5/Qc370pIOZfMgoYO350GFr +4fQ/DiHCs2l/Kt+r5D+Np6fGxDqn0dwf2TBCrBjHT0G1HHaSHmyTIOx+V9rI +EDwZaSZMD+YaRDS8h6w+0WjbQ7M5en/8frjmsJvTNP5sWl2AM5NCIDxywCAC +Aji8IPQWAUJMRl3zMBVyPWf0Z9P5rwHluj1wBNkEV/wgFaP7f5ewdu/BzW3/ +X/X6PaRH13uOb+L2PR13jnc+LnyVnwcAMYec9HxskcyV0/vcrscr3/5/rP4v +xdb1KO6IdJtmFAOj7fvOU5funN+79D8TlOwcHl+u891T4HT9F7v4ndfieV/D +021xuven5RV7P8XjiK8qmrAIDgBGQCGVAUaVIFWAT5fLAewg6E0CUtCRA63V +MxQ+lCnSQBKKAcXAAKYATUCiGAUSRCAWQASEEBEBAjF+tjpFtf9lrundzXor +zdTi+bn1X3T2un8XA3y19jOs6qbE1a9rjOE4y9hde01S+LGSocxpJPk2zsX6 +EawVkPuDeOjLMNiIjnxqIC/HP1aTws5i5P2JJmLGHA9t+X4b038XI/78z5/z +n5f/h1jf/L9x1Lt3R/d/755VOnVhgDtqKMiLwE7eZCJmGR/dhBO6gAC3dBAH +/QRVfK98O8QYkXqqEGWQJ40TGM/O+nyEdH8wRqCNlQEP09kP1tC4FUSTYNkw +YMGA17LGVRZBn/hkYVa7P43X/d7oKdWhBU4YQqAwxDERFQtUcAVUJAHCEApv +BPghwwydqQ0MjEAivEDOQXLG8Zcd5EgkYVRyTegwQQcYctSg/7ftff7l9DTu +goa3JOBDtPmf7NKocY3usfV+H/h7Ht3lOL53p/Qdc23kU45BBKdaWHAQ5AgJ +vA5TlN87CHNnOpuYzee8l5j9r1PbP0vneZ6ZEXwX+v1+ucToyd9jCb9HfmM8 +OMYwgP0+GBww5x1nU8YTiIchtd+U50gDVqMCagdpAyzwHWDrB0H6fYedXIDl +0vOJYQtjmfSbGyG1oiGwxH1TGIjIMB5eHAMVRFkCrgQGRBHqBHtChkfSY96I +i4ixWZBOopmHGOJmnm9XT7w3SXZEPDXOdYwruPFRJRMECdCqRagBNhPVm4YU +3SHW8d03wdCa+gXp0GqYhSBqqqKaqqoKCmMnzocxQVVQRRVRFIhUyNNBNFVV +LJBT6TYFM5EM0zVJEiKUJApCCRlCJQgIkYgZRoqIIKIiiFBMNiYIiKqwmXNp +wzIzIDp/2tOz/113l/AeX8V/DxhUPg/mINWgF7HLzFVAMN2kacjdx4Kf2zaJ +b8k6jNM/FYJ+p6D08d6dlj7QjfZPw0Y9dZYmu1eK2Mf3nubZ8FhFjTAAUA/h +3tWLxHIu+lIeAepSvASlf/Fj/rmfgy0ODEXOF0z+0hCrWLq8D5sSut8vey+e +M/fGVVDuMTGA8F9dkFn/KFe2WD+Yk+ML2wWZng7ziKqM5dHF/GN8qsJMjtRX +9n9aBwv6VaMg5R8YXFxboP/+ga3DzS7A813J5bYk5csHrsuai14+KsC15LDa +cw+v9GWPwKBoPzCaHv2GGhVh1xOvREmnqvgF4J4dry344rzFO0wptSIzthBr +O2/Gpu/PLW5g4PHhXLogv121BCpDW/rKWnim6XY0cVv3/2KPEJsIw/rcs3bj +huBwJKTwrEEOGaI64dnpmzRPZOO2t9FiZIEvoDjs3T72TAbksMD6rYCZXwb/ +WmgQU3Jna18MgK88ND9R4zbOyEl+iWse3DlTYOll2uNCBnFMLq2Yb2N+uco6 +w+BkZEUxDeCFwSWuKfr9PmsEd+bF4kr5okA6ICJZf0Sy8/7ubH9CLVJeTjIp +F5gmvIPNhtQN8bxZoAACmErgoPTui3bdVMw2QHcIbKYdpVaMzB1ciDySlqiv +QqAAEkBsRK2HmhsyrBSA12unIKE+3DVMq+6wMo3zWMJTghj2zbNKorh8Wg2V +jb33bFgGKof/XXe2iOpq/eaVXBofrpK5YfFRoVTX7e8lg2r0wouibR+ZfzfO +GOcWu4e3fd+GQCcqXq1IwDMcEq59GEIs6xCVSk0it03KLNrdrOID85reOeBs +D+wpd4/i5RmnzFZI9BtIHC2stsB94G4NoAhhXSuQlaboZWsfs+a8Q76YaLao +RyeOsExkV/oBm3AqfFncZwrlAINVeXpXqY3pGIOwDpPUfpuJTeDhDTsNUY5f +EO5D8VnuM6QjOTJy4Q8d/OmFBQABQMJCLiT1qH7SzTP/nxhydFu4cwQ0X/k4 +th9/BueB7DzfPfI+15jze+5j5/6nru7bnsFH2ZCBHfBMKJ4MYAIqVCIEgJAV +MhHZU7ABt5GATy4nQLjqMwQwGjBp0JocgHRVVEGkCjJoAEB+y/NtHdZIZjwa +LVc/dGvEte4519Z7pP2M+1X+rP+bIMWmMUv/bghwvHr3bBAAAAD4QoEEgHKH +1V028WLMAGWerKSvFvNC9womdhh/5pZkocvZwPWBglThCLCyA6HRCCN5NM+V +BZBRRxDMCuA2HJ3IsrJn9SiyqibO+PbSNL8isY/8twWrmC3XovU/Fd9xk4js +2CX6SlzuTC9aeQZlwgo5Rc2WzJRLF/agJNhX8Wx5Tp4TVOLlog1Bbkdkzw2r +/5l/D6PfDY6FfEVKsr95mklr+Ccf9WZirX9enwVj2LsCzhLxqXfi812EslCL +00r7H+qn+WS96BwH5ttXj808+HCBhl/OTz+nHvzkKnHsHFWumDTr5X0MDbj9 +HJ9ctqJ0MBJHRyn+8qgz7GrxZ9lahgRfBufS/+LG5GNZul/zzMEqsAHQgrE5 +cZYD1ARGlvEu3JJ0w/6njwfD+s2GW/7oHI5ziIZOcuqFjvZM+7J6z30FTWGc +q80bGmtpVSTKuAH0mQbi5RXDMRZtbUIG9htyojK0IZ6qJ74y0zEwfhGkKS2R +YWhsTnnPjvTlHSz8fcK4vsUshJ64AoyadBOJBQBmoX9ALKp4ETexenWlQX3H +o/3zK704/iSg8IKXpSeTd4kBQna4tr9GtodBvC7f1tsjteD3JaH6Og6m0OQX +s0vy6nCQutEuEs2OnPQ6IuOuKVAIJGcgCAD4YUqVRx47L/qZX3qRsvOasyMe +Mh+0C64YJATsZ9eA6n/IUZEdE3pywNAdJ80BnBNJJtFFHx+l5U9h1j19/P5D +w31O//c/W/g81+PmNP0/W/++HBFOwdgQMRQFXXjAOPdJIhKKbqZGSQiBtCBq +IBwiEixgUwFHCsRTTmYwglBMIMUUSMFEE1KkSIUFABIkIJFYMLgaGwQGYGWF +SoFgQJEkAkhAyJTALgJTBQEQsgEBkGDsMZEQpmYNZRwZIuRFEjocCYlrIMAY +FIqpPIclhU+x3DTkigfzf3HUP1P8vK8Houq7ex4/979vnOt9N/34zWRQ4kCB +wC4lglWECTkMsYxjBKiZQKTCORCom+5r5GRq0RqylyMIWVGNU+j+B63e8z43 +42o6Px+PrRtjKG2E4LDgMIg0hQkQ/m/Q6Dge80Dp57BzxAv+37eEdBIqlwrC +Yxh0ZGCqoqkKaJJoysSljCWMC4J4dgZoHKByIcmRcmVxANYjAZOEEySBD0P8 +PhPD56gRTsPxNzu3YOoahRNRApCeN7JkKnNkgmZIMJ67qvjf0um7T/L7LLzn +vO8X8n6/Meh/b7r/F+j2j93hHC7hzPyjt3lOZ6btGuDrwnPwYhNeK8RLlIZy +YnOQOZO4ZiiB/XmGFESRf6P++2a4HWECEUQCSBACADSKGFAA0j6zApmig9TV +JGUhA0ChkCqAaB9R6jf6eSzSpuMSVbPxx0rdQ+p1ZHWW2+EwQHjm3XZgkSYn +tu5l95cAE11tIUzkR3xEVZWIJD5qO0/8mAxBt8GX3tg31tHZCtAyfJaXpTVI +k1BuYAoAAACgqn8u4uS8Ibipj0tZPXKf9ew+C9l+T+z6by37PB+R+ZzG7r9F +2DkEAyXukD3vGE6eXKMRiJCAbCGAhKCGgaahqGiGhoSBvCYxhMVjCDKrIgQH +dXCDhHQmJmEhAwJBBkQTCd7MlTAlmEkzUFODGHvfaea85/BpUdeHYkHEId41 +w4hmouAkfyOc0qnvQTOBVJAgEZAdwdICPLavIZ4Mckj1VLzucGCcGFEDtZKu +hgAgNDo0WWYvBIHBAlsAbKjs+TUQBNoVSXaTa2whTUqYHJBDXlBVXXE2wk2j +btsQUPl9hNcO79N77YdbXreqnbfRdTQA9H+gqKLoVANpgAU1YEQRv0vu5ib9 +NBjkXJMCJkECYhHASYIFcQFAqEgupsBgilVQ4Oty6McMRFTM4wJ605AP/B/O +RUHjnDFVDeKCm8HQA7yRD0oEQ0SpISVIDQQAbhtihyI4QEAGAQ3lupxXiuxk +KMaMKOaZ6H75momAWN62ekixjCTbSbYhMAyQdwREAEuCakSbbbxjBgXZCTQI +O/DeEGa6JSNQHvhRyDI1FLsKe4D7BmEZA/hHQoZgmSu4aTIksYMMDGLEERGQ +JfWhAjvARMzFMHFk6B5feOjRgEO2/C/NUDhqsAHsMt+Ced1IuALRhHP7XYvD ++A0G85A14kBJlAjdk3f7FEXkxQXfqObpSjlyVMKrAwqgawjyQDsACZ9FwFck +TLCD7P8ruWPUZqe17/8fxHSbIaTtnG5fy+8Tngg1c71LXQcxYYCGBDpvJeV/ +M44p/hpB9FKmSHQIwqBz3PvJBtbtXJj8OR5UDyBvUAOXei60hzSdQedzzHNi +6XY6ooOtp1YwYwEdXBUNBpQnSdVD8P9HhvKfQ+75Pw3jO1eg/y8PyG84HKnP +gihmYQgOYUHI5Lz+Zvfz9OQURJBApyxCYoijBAYQdRgEcAAwywQExUBCEkSt +w5EDJRqIjMABDWBT/7+TUAaQkIUlC0mAxOEIZUISUYiVIJDABjBJgTwlkhxt +bW4vqus5Iih2cCEDfBzKcty9G4L9nj9c1t4G4T7OFBTUh6P6/teBorq+kxkY +IFwYwUBQoY14RhL+HAmSqjBAH7fVeu6UP5vc++kwg5OCJHBH9JiHO6lAzUdp +pmLlKpjFTXQ2QRD1wfWeHOCQPHc8898ccnmOG7Gp8rN+xagmz59oNjm/TyKe +D1LsxfkrYd0i0eOvQ2XXz+7uGroRT4c0gL8iaWjQJOCa2bPvX5BaQtBhdduw +oPava2hwMeYgrQNqBhZflpZO7I2wxTLy5hJVkkx8SkMv3i0mP53Ozu++xIQB +skW8Hgil7XAzQaK/8rc8Rekkq/V2kbDe/ycOP/fuRkBv5aMs8zkWQjpVfcJA +ysochhE6dQNL8dZqqWJTYRT60zNtCTB2lorBWCzoWZMqnqiixnuKsDIXMCeS +YX8Zj1XSJ4/YW+OPXstzOSeGp+rX0NWTvqPD4QeKczZYlclr2dpdjPdspfVh +mlzVMWp7s5wEIRfCpjuwpingp/7kuNGNgL+2gJX4DZDHgzOz69vO+5VZD/sq +CKysLeCw2vJVJy/f7cZOxvQ/Ao5xVjR2kzhgAXwjryERw064qPGB1SAlOASj +/kGjvbAnzU2GZeSZ3W/z1rfldlPk95Tu5SH3/BWq/8PgyrZLghKnNi8+/iUP +KnmKF/3vL4uRCQNMifrY4GHg04HwAnLCghGnRi14XShuHRPYuM+paKx3nhR/ +LXS1aNYdq62HuNdD/osa5JZE3K2utZdSrrHxayTARuoj++PED5YdSQEepIho +OF67Y1s01q1GRpy1Gb1TL4l4yLHrZetGIP06Ag39CmErfBuJA+jKhBYG4giK +QRAiqqXZNB+7HBRZZYTBIoCJIQh5bKRK/98zIhRMzBIeBJcIwJCg/tAtpSCE +aTODuFwQUSgGR1dwCJBJEaUQEM4DASyGgAyBi1AJCEKCINC6RgylTSWk0BmE +MBA4IhQSEgwZACgUUGkHKhTBHmjCikGAmHGgUNCjsBQRDELkUbJgwCOChwQg +R1EyLjUSTZMbQIVAv6CDg2OkBcQRJgj5NFEH5c3mAWCnmNQ+ggwCjCIyctGy +SUOHDBAeIiEZZk2ZybUFAiwwg2jxs5kECKk8FnhQKIUCIUAo6GCDZRByINoK +ghGWAfVQQaKJ4k8Pxn95eyII69vQBLr/uvh8X7v3Plx5vqn+eOCblFB1cUwk +pvsbueREVjJTODvfUv0zP2/Z/18uLHHC3+wcLc796rH4f3P3+2+27Vy+yCDr +FEwbgQGXPboZU5OhjnsR/Njx2gdEOSSUIEIQ3EPP0iTmDRfvJ0FQJiaWJGT8 +/cSIiCQECc/SfQqZmRgnQ6bigmnI0lMpvE+wwoUktwGSSRkQFOKiIqZ3PwxY +IqbhxUMcXExRCiYcZmpaJDBkECCIQ1KugNQHdP+eBr9s/r/h6v6jXAN0JH+D +2fhP0Pb8zvT/fi410g7z3jjcDToNOMVTVVV1/qn4fCZ6LpkAbEvhe0acs7he +gxl8TLl88+d/Bz3dtWnT0GMfj+d4PPP8PM9Uzz9F8vowAejEB/d6vvMauSOU +wdRujMWZk66jiSkvKdTNnQTnoUTBxsg1tDrUa+eeagaUdXp9bfen6UVUNhUE +AEQ1WW8FhEBj5CW5yNY2WNkO+Qic0JnTYXpvErytjr/vV91rBUm5fgp+kvOY +uoaqACAgyGa772vfq++wcGW3YviuhyT4cr2jDZatnjo2xf9RMzC5HqG/3sSf +ZNvbF/vUymazd7coxEXyX6H7WDvo3a3EzRdi98zF9gaBgQER05GJaLgUBYoo +Si4hSJhClTNUQj6FDhQXCJmBw0MUSkKZlU22223aSSVwfVhERGMSxjGggQQM +CYwI5JHNGE8K5JnoMYrGBoSlJJloIKKXI9CXeDSGMjMzPEq552hIxm4dfLBp +zDQfgy15D8g10TzeDCoGlF9IKYgl77jp9Xduk891beDtiKDsaa3QtpTMB6r7 +/sfx9XYd6tnJ7DdAfr5KCcCkIcECZAQgkmGY//lqG+JrKogrQaB0wQZipoCS +gWkAeMB8TAOVQ6pcEog4QZEgyyIYAiI9RceLA/SAHmSSVDLgFMBLNIccU4Br +uoRnBGeh7tFo1eec8GHGNfxMjrCht7pv01awmsJBlrhuGuhskCQSeiYCZIJA +oaGIyVnAQJQJQhMDhRJQ3DaBFN4YQgUNZHGQcABDF4IYcBAoA8tAckYIYHZA +kB/GS7zgUCSpSxNixWoBxuVjTt56Q5M8aWQYviNMYqIQAWI02vORw4GEDiIG +QAzgmuHSlVPqOsQQ4vYgw0kNobSTIEoBJJISSSMZBISLrSSSSTbbcMbSSSbb +bSbbbnsjAQLgSLiLAMRBu+F4AHDU6hz2wfWPyvR8XYLwmBPZ7OBAMyEN0VUO +Ko7HP8PNRyCRNCp57gmRJ7bkg0QQiAQqOQYWCFnggdDqIPosAPoARykEcqaz +xc9dCxgNISuzwkcKMORrhrQG1tbHHNGhR0R3Hn9jt20omnkP7+85XJxEkFtZ +YcNVOURAwNVVVVVVVViikISsiMZYipxzAcw5ujP8z1386j2NR3qJwwNW5+PN +Q9foUeh8TxtB1fQAJkHGc6Qt5FbMGROKhyDIVeMKCj9L3nhui9XIgoBygoA7 +xFQHWTY5INrQBPQH8vee69w99/52nzH6n2vr7zdQA6xyHu+j5ZBQ4CkEiFJd +UFHBiTrcYVBAUlUYFWUOqEi4ViQDQEnywkcloJEEQ5ZEEQ6A5j9XqmFINIck +CD0q5I5AYDWyDINGgDIc6k0OAwYAUVRYICJtJCGBDIQBFxRQgmAdAdGkIGl0 +ARCkSJLMzFEsEFNAkoUBAxSjEgQhEQlOeBcsgFMKuEaXMIxjEWHDhxjALkZK +0RFEkkiShAMKzLIQwRJJKQsASFEJJAklJAyhJVFNBDDBKTRVgxlixjBllkZO +AclgIQgYpQgCBhSQoCBilCJAhCIhKYUydbQmJKAhNkJxREAmjDgoqkA0ZFJV +GGyBd8BygXOYcGDA4EcAYwcEE6gOwGyJo05rmmgB0JpNTrhCGADRkKbYIpkm +vG1wepZ8zuqihgQAA0lEKKQSqgZob5CelcASSgSQMhAyEg0pIQjLCSwMhAks +JLIjLIJAhCyMJKhgBwgmATAGAcISkBIgSMrIkCwDhMMkySOBICTAmFTCBKwO +EwBhJEaGkYDABBhwJABgFgWlkGCwrgBwCSsDADhwEJhHCwksIwpKkoYTCjhU +wJgTAwkOFAgXCsDIQSMBOEmEwkmEwyskjAYTC6EhclIKASECFIAhIAYUlYCS +WMlYwoEAygQDpRXhg7zeAu7vMIhvQNktK7rvd7vA35riAmwXUBlUsLgcNM2D +BgpjDGAnBGGbGMMhjA4xYYSw4cNMFgDCYYhpoaBlCxjDAEFM2DGGUglCCmAI +KZsGMNMwTYDDhpkLBjDTANgwYaZVdgADRgAsskDczrGYplKppuqmakUkxVJO +qdU6cRUgVLpkJxEyk5Uy5YOCW5cQmBMpOWQnETKTkUyk5FMuRTKTlwmEyk5c +QqkCqS6qm5Z4QXY3+sYHDHm8RYsOIIJDAEAmJibY4SgX04EIaFI3Myz1STVT +LMBhMgyMjIMBgQwmSZLkhkmEIsoEQOEkpTUyIlNKU3KQhCEkvMdCIlQoSSDg +joCUKZIEELjdCcdJSqxJCWTaQQhJChCEkIS4BoFGddIiCOuw5bJggiadiu0I +i4ShccKECgEAyabhKFNJJJJAoSECgSSSQkLGRc2ldpTNaiZwEhw4hBEcmdcz +LFKoKHLcjMZZ5ZYMFQJkaNffONZEcbTsO+AzESZQwoiIBYF0tKOuRw1ZjouB +kMhkNtttsYxxDiGAm00nEDbhtkNtttttgGe/UTXQdO/UzBCcYEUeCGsgaslH +NRlHWDrXo/tf3cQ1Khtba2+pyRHhbgqJmZK9T6fl93N1sRacGAiYLDlkYw/d +8X+rj0v9esaSeTNlCIgBKTsJIAhB0J77LMBsUnfUvoytEt/9ru9bU8rXH2et +9N1dcwv8xOZiVIdRS7vJr8fUZ8V7eiCy6CEaBlsan/FJ4FhfpQNxa5Qo7PqH +VOYk6bmU9Mu673IcWIlgPII5e+LUAOCSyWddjxLhr1uLhugQXsfdmn8MTkEN +PT+zXXxFk31iQ+g/i20S530f7S8eJMoHBYQR6oAdlJJg/wz2Sn6KWrUNk0Yw +9KM1OQHUKigvkfEnUAA3xZqOoWB2HmosNaQiPSglVLN1ve04hSRsrkxKR+40 +bVvmlOTgk2IY/MkfafBi+1A8mknnW8snQfSAS8N+mnnGLXjFY03FBkG72f7+ +Yy8aTtM7qS/5mAcWYUbOvUsvNVPFhworcANh+sO4LaABCUSDyQlf5jAonaIO +RU50CPTtfmQDieSiHlJYs5/JM1c9p7xogGxaZB4jnHJ+pk0Gir0pag5/+OOV +SeXD5T7FgIOuWxhZ6WewKfuCUo+jGBZQ5JeDb2QAO/n0L7UsYqwDE6DCSNuF +MhuM6Fx6YH4uECJoK8i6L+FSahLG/clKrovyQWyW1dARwqNcW0KdHSwb9wrF +2VQIdKj6/CIYTM6bTr+tT6BP2y6lM6GwZ8KnotOUuACvhWpfgiWKDBY3TF2+ +A/utbRFkB81ttg101372d8mn7QdVo4DmFAS5IX/myj4e3fLT7MxsYXzFVjJs +L9ukG3CGc41lXcwUnLfM9r5vyne//vA9h6DqvlOY66mgY9GHYwwdfRUHr4Ha +2jyGZsDkmcFGhB7KGAyp42jstoI1bCSQGkl1oU67o06BQc3aE+SZjkjlq1gw +6ETVqDAorJFZIuNwQVCAnEEYAQCCwYcuMk3Z9ZwpNmFCAUZjBGy+AkOBEGQU +RHAKKBFkhj9WDkEEGwQgOUREBwTFEERH+mDDkRRqGYRHCjkHGA5KohCGgoYi +I4RJQUHgcjRRwGf5eQiNYGFxhgOwsMBmZrrBkGagzBnrGZ9EjIjWAZgEjNEk +UCoJMBiCCukjL+viCCI2GQoIBjI3jqNIngeqdk+J7HZ2B3GnbFVDtqiLvVHQ +Ci4RQeLhAUeCWPN9c9f/v9byf/HxvObn73C+l030vC8lxfhcoHCLZR4gAQDp +RMUiLkHCAPjDgAkJAj8n+E/5/g1+L+ROqbjgZx8Soso+QHWino5U0actXOYy +CDdMtni733usKGtUoxIhqGaCIiH6Xqckyk8LhwR7PmMA+J8N5zSZiRBRERIA +UlKHBAMY2QxgcEGJN8YN9oDR/vpFE0BHsv/vH/sZp+lrKOBTiJJsESElVDFZ +Js7AuZxnPMzTMLR8jlczpYDWgjJCIwDhg4QIBe4Ebl/DoH8PLG7JUQigjBMS +YighmDEMhwxxDErKAuoIMgWAzXQKYRcDgHCA4T8HktwUfw832XmfJ+Z7Btgi +7pvMAobwHpe15Co9l0YVHkO/6ge9drU2dhz8Y3HjM03VE011RdV/DiIdtnkS +l896qYtkRrP65ucjiagQwAXRhuXioEPugCxVVSIgQhSICwJJDMEgoypARIqj +KDKsMJNURUslMAwrdyUcYCJGiiGIQ+LgEQMRVVSCgMCQAyoUVEVVQRURURQC +IbXI8/xf+Dv854MSUfVr5in8RFtzba+CpkrGIPxJCMf0ewzRTYozlEg91sAp +pBgURkSQpG0QlAQESkUJCuRCYiikVqlSLBYgiaAggPKYVVTJR7NoUe3eK5kE +AABPwEAABzk6eprMRGeIC9kfpWtTijt4uHWN0VC87W99qdptxqNfvNVlVmVz ++cC8IAAiAvUnpEyhVWjosCuuZPORj71LiWwB+ZLWubHgepf0eb4AAQFML7o0 +owclPyvG0Mb53iv1stmIyEoFlL6eZ0bdO0LeLrGD6tq3+q7FXRkxEBDUgAm6 +nmYGnyWjEuCcYMLE4wYO3QhlYGxFYsRixFYsR8PIEO7KeQcABhkXubGg69gx +UVTYwYiiiqCxh1lHWXhgaUcHdWCRNIkrgBMOQ6wGu6+jXBCkIWMBsi40RWSF +uIwB+YALBhFmCRCIYJ0iY0AQAZkBpiYM3cAw5pqDTlgMmYPa98/+8w5qOrGO +BbFWvBQUNBVU43MYxlkUElDElSRJ10RVdnoeDoB8oIrohAB5BUyV5zWb6xkR +AK6gB9UIroVB2EE9KHBDG6ajjyprwqjAEmptITZAEGJN0NRAzBKQdX8BqMvA +Rgy8QcbIzv5vBHvAU3gL6TtPOeL4yiIg+536ogLgRXjiKwisCogECCJCiAEg +oyiiJCIhz2QgIIes2AV3gEnCZOMQiicWFF0tzJBEo8XThV5TNQgguS0ObmEQ +YksQMBwh70KIvJgfrJ9kMC8ufOWUllggqoIJmpJIiIqqqZqoIGCCIqoiqiKq +oioiqiJgiKKSqSqkkggqYJZaiYYYYeXD5z+3lbaJygDthERzBBHRh+0j56V3 +PG7BuT0MjBUwVBkEWChr5iSq5Jqc0eBkGToEzEkNKhBMgwgSUIyKGDA4BQhm +AhYCggKRGFBlQGAhRCRQSEFYBRMOsjuAYHZGVNizBBhE1g4QSZib4UcHyPUd +55zX3mnpMv1f7ek4e0pvgHkR1wYwePCHBjfC93UV05OSEzo4IiAO0ONQAzEa +2EDMfGmFwuaQhgQhQMAhpOSwOsmEcw1/1b5Xk18NH/vLcqbJzIMKm7vUCLeI +5hnYeSE4oahFN4JyO9MJsupJVOX4dkkgYlrM6wa/Kbw5g3DBjG2AcVBCIww7 +iA1hoeoglIXhZBERMiSAwYlHAzgDCRDDnA5EZBgxgoQQCSSBgjwQVLBIKpwQ +yKBJCErEI6ckyMqKwGgwZEUZKYVMI5SkRKMAJkYnKBwRjLDMCYsFKuuKjoE5 +9R59R1gNbUqYFjUjliseD/09N+p+PyfS77sUA78EBXaFHfjtKr+DIeuIKqj3 +DwG+1Md+5Pofe/a5JRDeMjDKsUNDBBLBADyw6WR92EPboDYBhISHlVEXByAa +udFRT0SogG8BM0VeDAkSCkSIkQzKJEIoyKwhMRAABEiCVFJUVUlRBQEoIRBE +NEVJMhERMFJFEsVUTFEESAEkKUCMAygrEhQskMSAEkEUVBERUkRCQyMRBFEE +E0xMEEREQRDCClFFFVQFQREkBJQUFFwlSDBMBEHLihIOIsChgaIiwImFDUGx +8rVy+0Iu0m7CgnS6/r+Q+r6n/D0X+Pdd+hwGA58FF58EVgAQYERCURBkRACV +DAnBM0F2UeCZSAEdCY6I5lU0iIqZAHXuQrAhkcVIkkAU4YHW8Ap9uVBDZVTT +t6UH0HpPEdLwN4II8rakNkOQDLeEZ8ppwuRBBIOkIQDIgSMsEkhmHJkGDqhj +NB85Cg5yacYgxBWoJ1sIZqLjW0YxkL5eQyhIhkhRD4GNAij8v+TpvSbfTf9+ +P3xtQpsqrbh19RF6sCAjnOHcvh1EADgAIgIcv16bF1UTRt1l8G6XQBDOiAAP +t8egibLI32copQ6lKhz4gnU040Abak4MMg4DAULgMErhRwAmEAPyUMHKdWAx +gIzV6bpoMjd1nRkBoy0mjGWR8CrIXu5EAQAE1SRNFCDCECBArBKklJQUMIkQ +UDMFELEEzQDDpkJE2SGJNb1XH+vzHfeFxufYjWMOGAQACgIBftQFG46KJS7n +Td6Pb0/Q+e2UKro+tbCnZYt3+iB7I1hTbWw/lbb7ykyJ7P6SCSaq7LiLxXC1 +b85sZlpZ6oCKqlrdH4pm6qWilFO4HEFW8MX5jrc0kbI8JX6IDPe175hPVTpq +LDnqm0nrRCy0l5y7J4VaPMNu7DDJSXD3+wWDvL5qkaxdrzBTdgUdUpaEDs2Z +lhIr9FV0XGGvPIRNLD5lT8fpdRTySDCOHmVMLzne7LdEPT/g6hUvjspBzv7f +OyywFhKkNuWgHDgKeLCNR/aU3dwk4kGob69jqyqEPpNkVUO59aaJOviZOu1+ +hLKl9bANKvGVe0gRTqEvq3LUhHKeHfgONCk+vTPrTxlIlhPLOHJtZfUoFe6J +AWQPTMlmKyBOV+aoImcXnSAptuS83VlvAm16VTamJ7nYG+LWLUgwDoKKbjQy +Hgi3quSFtvzKeK3oZ/yOXU3w7BwXzh3v5Kl2317Zltv+3Qbrhkszq3xNlIKv +bp6sPEZtHJ9dVklQqVqLY9KEMYmwtWf8LDGMG1L1mr73tVpTgRZ4jWga3m9j +PMMiHPcrjHY2JM0cDuOXsKH3iP3R3W7vyke3uwcHw/a8ez5vMubwh3OQDiQY +kOe/5/a+h1vwXZv5/PbzpvS+T8L7j4P9Ud6VR+fTA/OFyJu9KXkuk9/NxkfK +g+hmcJUNd+Eqb8SbxeLPiwklt/FDbDONDNqY0VtbzyPl9u5YvcYTURJKzv41 +M/HeY9hZ3I3wOIHIaCK8LNY+gBAQEJAhwT3cQHkq21zHavYkoDT1S06AX89F +P7+f9+FbnPBWWHLcDqdKuozatD/B00vVR3W7qqTEKk4AFYEMfIyrw+6Tnq0V +b+KDBLx5Gao+milaocYONlPwrUp/TKkX42phkKVuvEvfufY8gaNpjqUSUfwE +03jWt2HrNvAdbvW7IbKKl3QXall+1vEY/E7n28a6DgOMxh0/iXg8Ksd542ut +4UCwmOAsqsMELn0HmFQuw/f/Z3s1e1ra2Wt9iZtZ5QqS61vmh1YEkX+mc8ds +R1xoriikyS/G+j8b9b8H/76H8fhPVcx0n8Ple4Cqj47V1vl/p9VPZcIMK4CR +B/pOD78fv+U/j9FpQf4YiBqkf5OrYRH5KoIfe8ZsoiGNs0foqOZpPtkmCVkD +QZGQxBkUBLRUBkSqJKuQibRjBBkqZkGEJwRRElFGRDhlwiGUTAQDI1URYVfC +5ORJSs0FEUkgZGHAxJQFFTVnCiJhyUd+ZESKh4j6+sf4ygI/1KQB1aVO98t+ +7y2YCAZL2P3nlNsUfY965r6r8rlvmfsdv+4I/bCgKSGoSKJIqamJCpiakIE+ +oGl5neqByQc9yyind5AD9cFSAIVGMkPyN7mBngBDsAWwpsozgEXiueFE8B9j +7/kwROwwAnZzvj2dZGkPu9FZBUDYsWeDK8RnkWk0ASocMQWE/pBmkWIEIgBJ +AlRMJxADFmaxrtrWQb/XIAc0222yYUEkiQxjBhGAA9hAn6vntHUOEaNRE9YM +fZ/PwCIbY85g5ILcNk0IZH0dz8PovNco6UFRerDsm8QHpmQV0KaAOi08rUUT +LX90Yiz4AjzbG9hU4wIpIaeRcKDzS+/CF5kEUxkbHptnUPOQ4HCYABpQolJB +xCh6REkERwMJMGuAwQOyGsfJPCmsb4U1O6A66KbAgsAUGACgoZKHyAvo6kS4 +zr02i4lS4wZdd6iQk33PB4vCEqlVSecGqn0bxRgR4QrohVKdByaE25Ye/iBe +rVnRkytMpraZK9+L5y9G5CMD+X6IIVVWj52NSHLXv9DyfVtmbIgu0Fhg98UL +/XIJlyPNunmFhJWN2Hqm+ltC3mF4tmzYf2ZRhvDlWyHty/YQfuzqkF7TfJAP +jlTe6zK866qvQqM2LoO6pUWpNMSmhEQW1x7Mnb139tWnRuIP65h49S/9Pg9e +A2Vd3vFmtrvvb+Ujli/6glhTIKdK6SN9mzhFH/2Wzn5seweaNUWNc0KoQHXA +MeNhh0LQMYnwoMM/QCc4N18Yx4LrNel0TBHBVj5JOeH+qN7J8RCQnXJJo5uM +gSzL2sqBSe6oPxQRThSpslTs6BG9pJwIcEvNKnTwzMla30lU41yR39YPcJ4a +9j8o2h9O38hc5hrHnyHRuvSaJAP7lJRcW2aBFGESLGhMabBelyBCS3Pb3zQs +CUHRLhQeFS4ff0Mh9hsdOsT+RYKvthAEJHFXiugP0wi32KdJns4+YxQdYAps +PYDqp/CZuqcp7h94XhW+TV/uCEY1N6hDldFkLp3kaJnx5IfERMDvKWo/vUJf +s3fmmYQbFft55QR3dC4xQaH446hdjpBChorX+JSjFjfdlAWLpLjdfJ2lGGFb +v5TyYYUy/bhJCCMSY1SCCq6lCqvSV+aK0+2jZJIiBfiUiVnP8VjeQSbWNx1C +MLX4QYquRkP6yUCYZ/tFAkqjwZNpC04BhbEuv/C3pQb7rM8soGiZDt4/LMrw +AoAgn6dUssX8yobycVcMn0VdpzFYBbwLxPn1rfuriJFo8YZBrkEiI5Ln933x +fKS+IQAAj6Z10vd/sc3dgDxj/dyN9qCR7Q3Uak7xO2ndtElYv5nREBvCDpz4 +oREM58nwQGXaigoiXGTxv9L+RdmEM2zPbfkztOyeuXk4lj8+LvL/q/mezcyX +bNOCs6dAIMWuH2b1z/zd0Tp35MPp6zhFsCN8bINJSXYjxNZtd6Uk8b0wTAGh +IT9ORAwPI/XoRU6vsN/wjKt7lDbf31aqJpgAHfG7j5fQT0bQy6yPxNCIQYAJ +CAQKQRAcM+KxH96jozyPwFERl40viZ1npAe/gmk/JQ4OABUCD6RhAPHhB/2q +ibw+7ukEGaAbhhpiCYKIIwi/7Bg8v3H/L9rrPO/E4pBvxgoJF/dyTAORlOCZ +ZAhNoTbgoDv0vGVaMpOOnzm44YbQb3zBAUhVERccV1GtGEyNZjU6cVIlVVUV +VVVVh5B0ABrPHNsmA3EjcXkDMMhZFdfIwOnMP+9/6ztvE7d3jrWsptoTAQG4 +PEADoDewq5UtfoU4pyxWUv7TOsnE0RABBQAAEFAB41ElwFFO3DTsfd1qVbhz +bFKUEwPB0FDohRAABAMKeUUv3rf7edqVKU9BrHvY6zNstGciqKOgFVdnZ2jL +PrS483kKUtDfp9o2XxBa6MHUawFztAe53R4y7RIB3pMb6Tdj56RpJzyDmnPf +9IT3feftQ4MBc6LfcKEJCEMV+txTE2jN/54fE0wD2F/BS06aZ/V2BbOMbny/ +IUa4iIDsA5ptuqnmwInHWBavp5a0AAggCpChfohCtjqU8zOEMKAycfwcNVzJ +oZBhXg6GZPES8JUWrbfa+XIjcVyrw5YuGmo/n0lt/asG6rPJIOW2gnksZb8Z +YD3vkagMDQd2AQ3VJvYEJ95PH0XiVOCJMncsKGncmKVqeTIXWAUbmboIxMkd +cLlElWQGqVyDNKiJ8tbnCIy1hmtGkv4beUTQ5VNzGlyGfQZ7avIL3NdkiZxq +nqWRHPyrKKH75wuNZ6kTai+4P9XqgDYjxW9McQm5b2vqJ9Asv0dJPMyfjMOk +uc20ieqYiLXhfVWaDZpKfPnP8+pf/ear32gfdV9spmMHP5PYcvMhkbiCV/JR +zcVnzMKfvnzNlHTBan/ZqcxzhqcYlE3VECTt5d63hGdgycSe96egbksC6ZgH +iVkcaSoWKvs9oQvHEfyyMDwmYTJWHqUTxjijJEnaxU9k+qUIdNsmQ0JG/CU7 +jCPau8bQydIZfsrQI0gEF6LCmj5/hsRF+DmvWRaYlJT6KQx2OBSkE1FkC2Wz +L5Vb0McAFHaOQvLo7lgEBEe2+F0Dd18eVOWVXwPVyeBpJYrhG7xEEaXh/7Ey +5VCWJRR95+3jwUbXrez+nUcw9dynRdrOsfm997l10urAV5/Z7zaGsu/aHGVg +OX6j2T2mwaB06sHRZmAKy8b8bMzSs/b+f/UzNEe6/u7t2Lznh1FyehSB2v94 +0oT4+t8J6jNJBmuk15eFOjY6QU/UKmhBeAqLaTcVi1FxS41Q2u7jFvWtJPPV +dpGNpBHoAzMWFBrS3heOqDBLGnLrMsX6I/EJCC5FH3gmeDhMty20HhGbywPQ +SqU5v+5uu+tdrJhdvnl1r/H9c6ttf3jZYW4TK3AO9hH2stlGWMu7DLALmAiU +JQCUhgA8t17T2/8sPCkKzEfeOuAjEgiEikh6T8sP6tv9Dtvc/AgntYA/6/S8 +R5w7amwPvPwe05bkfoe+Pd//dV4ainM9F9ndzEEOOerCXAAZSnrv4fqfc8zy +fwfn+g6Dwng+xqAgHYJvbqCSEZUERhgIAgAN26w0sBE4z3qjMnglV+JbNeva +i1aPIcERAE3V4XUt/mif38fVkHfve+b5L+D/r3PiPBfpqPnVH6nZO/8T8n1y +VHHO28m73B66sn6+GMsl9Me3JKCfoBRS3xVzKs4kU7Voznf94oT6mWvnaaCX +bn6XSw9A/h944Ba7D/cYRHVLXaYCc0VyiTm76Y7u0wPuHpppCHRp4Wmxlthr +O0wXnFC2ehNb9vWk5+0xZPqn4Cjt3d6yg8uqsFIjSW50HofJFvKYj3zmvSyz +Xpu9O58uyWHMj8kzKLOEhqa2wWphDIZPLE7pixmyw6yFWCYQ08cPeI/pgtm5 +5ggl/GPZsxwf/Gn5hlCcjG/jyqdWy3tYwCEZNlCkIlmihs6Zm+QbDaQM38BF +OSGJ/1xIyPd8vi7o1aJ3GyI9cjD6GWUTp6mnBPoOwFwM+gZ7BEfu0I/E+u7T +y3qaGHhd+7E4yqOC+SImXySpv3RT7m4TrMotje0vWL6obyumu2yL7xfZe6A6 +jkhHovoFR+jFO3m3zqftnKZshc1i1G6nxo3BCKJQPKZjqbFdBTeBn8dRavEm +7DqkgpB0gWQwU2sJKfdxx+1Lv7OF0hAFr3MKsvLGTcG9vlaKxK3T3dor6GRC ++F8ey6vIO5HlTtfQnQVeC8J/sxnNhhDTO0uf6cs8d2f2S/7a4Doivh/vLWM3 +3nldzZZFKhmqt0z7d/c7/juZA6vb9gNAPwAhA3IALBj9gyDUIAAhZaim89Cu +Z31tiqXgTHFQBAEWvudkXQwSgSArfAAJdt0A/GU5sHA9HwvX3tZ1CPAIgB7H +2tykRFUbAsIgLMIgJBEJ/9UXVVtZlmUlA9tx7I7+w0fXdJomuOH24Eh6/v3x +PQc98j/H7XKoAeW8huen730/9Pl/6ed62de2lHLD0kCBg0dk5fWYW+KDOLgM +uBUZfwyqoH7DMX8/pOh+0eA7C6rvp/UGKaGhLJ+t3d47FI+QaCccTWcgmeS0 +30qmyvTdqgL32uuQFnqEx+6Wm4xypR/nlP6ruX3c/qz+H5dQEAEAZAENOAEI +0v+/2Pj5Ae+047/5TsH6fR6BdUoe89747y/l/b9mA9j2zg9P7LsHv/ffZ3UD +jhIn5P5u7+72zQqicp+v2f5fgvSbHlfxex/9+n7D9Lsm8R3mPF8l2zwft/a/ +M7AHfPmbQHU5UA6Ieq/E8ly/V/a9PrKonw/YegPlfRsuZpP9KAICAAC1s6dv +9ICIAIy3DfE389sx1E+MiFfX+3Rq2lZM40+ZorZ+kQrozuzIb9C9HiLJ1W5F +MYGenOXK8GkdnYC4a7QThmEvvn/OLXdg/Sr4iBj3jN5VFQwbbUl5eGyA0yLj +vOOoTFmubzeaCFurhmg+JO4U4h0v7MnAAQFD5bN3juigJ7ZJUV6nnBOwoDzW +0H+w6hB0OIhtTGT/HnW3GAaSxAWy0vA3l2EnWFmLYFpqlys+9KPlZdH0Q7c/ +GjU2nOHqsBeDE3zHnmhpGKBOWlzroDw8t6rL72Xgk6y4MU5wmt1WF1kSbfLq +itRpOti6idqFQf6bsRL27Qogq/XC90l1tZuflwD3XcmvGuB9TE4WzWKpOwS/ +xUvhXC4/DL/zr2ruzXGl/5RcbAABAKvlZsxlaKPjFIq1DikUT4clbMI1t2Re +MZRnQgEt6vOnu8SIxqx5Tl2Z77LSHIuI+mflAlQ6FjeDCegjuJVjVPOEaFcl +ze3WDezn1ArcT0lo3QctmCQRBPqV++p/ktNoa1/NDaJxLzy697w2Vm57GQDC +k6cLDA29TMUuHExE3z3bbV2Vuw+5IatTKRUyAeRvHNFWGaUirLOJTP1gxm6o +KuhW5apUOPm4y3KYAABQvxISAEnouE81t3d7na+dET40BVlsxkbcKI8TaxyK +jlA+vSFQooFyJrBpMCq/Zm3zmJ3Zbgp1nRA7R8nlnPo9P0njf4O57HPCf0nJ +mp7hxMO8Beqkq8wawBk/v6Q1gwMGNRpwBq1QpnqNASaDVjHeVRwKZomWfwAX +7GiNFUTBAw3BBTigJ3ZEqJMIyGWrRqdGMSJr6DOf3PMfL1xNQBsqongfafL/ +y5X1n9/Ldq9F1D+z7/Sem6vveMqhseg6M0ft6eFyOsPH5FzU/j736LmeYD5v +w8SIbna/rdQ9v1rmRRDfjO93tvcgDM28G5/VfH1cB1Cxz4btRAcgooD6LDpp +tNpsQIFECBQEB+sq+njXKac7B2ek2MGen3p+0haPdE9JWf9kUN6WeDRi4sYR +Z0ZDp9bES7VlY4OAGxqADiuhEwGEjhvSbQYAXTv++d+/M0fkCj+b874vavhf +d4XmupfBS55IRCWiu1VH/Szju3a09uexV0NTGNd7v0bAz9RJT6er6teOynMd +mEABMnEthLgAkAAR8indsSe37lRH9k2f1hodU97u63E+HhilxE7NCsjJykPF +EqJv2be7AAKQAkAB0DziGCVHCBCSBkrkh20MnNiAWUwBgFMKZiYMfZ5r93M1 +NIFKD/n/X7n0VSkTe0+cN76D6OqCq566pRI4e4DOz7maoc0KixABEBsgCOAL +fexqRTV2Do3DnxBOwcwvZPE+UFXIRP8eb8Wh7z/nYFPoqgBKEKhAsAKFEEiN +QATIqkSAoHU1ENzz/1s/h+w/5/e/P43m+bTaOD4fpgDyfbO0c0CAiKaGz4yh +2kBV+9c6fzd39XxfP6MuBLcimC2l8xV9MbfcAtYePGgVbdvDczbnQqlOK7PB +1u+EaHm8VzT8Lqy2VXh+PJ2KMqLXeODN7cVGOU89Tz/Y7hyhkPMcLoKGDsw+ +lik4rghNY4fmpHOgRrWavNzO+90rgwafM7G3eWXFodrHBt81zoAYDEu3Brdc +boODuhNEQgXFiqU/v6l/dzVMesmKvOhTi95hTges8vJK0PI1DTfj7t/AZBDf +wp0ZLE74L+tWz8nstSRrntMiq+j+IQu7SASXSFYY6H3RexSUhZjxFMKsnFka +qJuGkjvs9kTgxyQ5thoLFpvnrP77FWn3e2dZNftVj0uGr+lEfkUu2yP2bbbn +QJwNyoxyfxTOvoq4oyw9wF7nl2N4n0tDZhOL7YwUhnOOvwkltJbPQNtbzJ22 +Mk2965mNfWQRt4KzY8xeEvOZi6IdJEb0vGqfXtQw5loiKLYk0c22rkOHIg/f +YYb31bJYf2k5E7HLWmUo/IKAOuZNfpm7ItSrBeoii9XZxqLHLmDWAzRJITeA +2sf4bi5vQBMR+coViVBRTVTy6Sicunx9N0PZdUXKhCgOADVE8ZhhxDb3nRkw +4dUlySvKM0mvQ+uo1BvxvOYe/dr1bas19IaZZN3gTmmP1a91t2+asbrYOp+d +Id0QZ8agWxHtH4CJNlp98zN2O6Ah/ZIeYnp4wwvHRDwe+cvQbY+d641VmGRu +9o73xvnen/08z2PYDhkH628Du+RmQ5HI+Q/Dy2gU8+eo996PP3CEA1NGw59V +191R52sOCCOIoQCCscdXsuNuID0Yw+Bz3fTMgITZgJ7Xa/cZqO64lfyESAjI +co+UHdZ7ZgBmUDTa/NkNiPCezobniqujPU69oWM1F0uhQFI/4cFCMeYU6pgk ++F1uc/tFUhT26trNat0xWPEl7nlnIZPKCtd7Ha3cSbjMJgIv6JySWER0S0+o +5ODOcP5U7+j9BN2aPMdCM/ggOmXHT5GIIyICIDovJlwAMc84k1Gx4aS4qqss +T6AfJVC5YXQBn5PGcK2+ZAq1soXHM39x2+4JR30Q4s2slqXw8jazrlz4eYIN +MZIk0qU9YYAjc0OJe0CsXwzDJzgp5caZiXXUOeWMVKHUXs8yOXSEqDiVPsKh +QQEcnn1oaQharOsb5+50ApQAs4OVSYfpspEoGGvx3Jq/uH2f3RXpmXhjF9Ni +I/59KdyNjQuhOsXJ/keqNl5LVvDW6K2MQziHYzmK1J4DthKAxtQwUr6Xva9m +Oot+UkO5d9Fh9/mkIYNbA1nSzQcRyrxUUKpQ3jojVqsIfqcJpZpYoJXXLRny +qSEScapcBQ/3beMpVprYTm6lyDeNWkS7m/HQrtiDWuOssSxMK83wnQLtaYYT +0gPnMPbyx1Erlb2oncJv5/z4fxrwxX0k4Ir4WsO70GuQwnnZBIH90q7a6MRG +6uKwmCdeVPWOdQ8ucHLI1ipqIyAUy7E0KeqzOXE5JcqbRPj90RM0oJj05GMU +xZBakAfGa9q+IY1QvOAYSWZEbPdyT7SWGAmCYCwXTqUEcwSg1q2OIk1gqXJA +cbXi8FWApbQofV0pbve/PGhVG+K8ZIGx35/2eSMH6o42HsGuWnTauC5HTx48 +8hFdNUmJbVHbJ7V1TuIRf7byOyUKiXbHDIFEMD6Sn56FRUjHLlH3LLm6Wgfj +XsnO0iLN5eyEs7uXE7s8omT8N1XFKuQC3vdpLp+qvTzVXNfVOdF/e8D7Pmta +0qUaWaCdLAPUhQK4oaFaVtCa+tE/hL0kZ6ZJDliYIWICX2eJB3CfMZR/Qj7Y +JBJOiC1aEuaQcnb5MZ+CNcOlFCGp50+ysAl5F1TwVuA408SXpyla10Qz9lrO +SPotSO3HFq3u+3P4JsVP5rEGp2jWZJbyhaK/afu7qUJAAZyqhrereBvdYVr2 +EA5hoTViOS1g5ziTmHojBEUy2zWdcqE/ky/uuQ+ny3SyOZsDa3GYzOAd1+3Z +9tiI/C9ALjteBbOR1FZJRMZmPfj5+rVqhuRvTUjwI2R+kkjwK+XpSVYjJbiR +ZVU+bMV/HSYeXWSVAHHQC7cCtopfNT3q0IuA1M1nW0yeRCNyoVW+3VMy/I2A +jqT/ddLQiY7lBQduuma1uprP/fvp30Iiawo+kiRv3Ae7PDSa+gZBWS2zdQ3B +uDhlPMF6cP3E9dnj+EzMvwlTFi3UpXJ1sZ9hrX8Ry/WzQAkrLDsDFfZgGRiS +4qmdP2/D4iovZ75ki4wey/eGjepO78d37kwQu3sPj4H5P0h5w+EDhgSyzLU/ +dfiXdkwtUVaMkwrR3th5pFy6OAZ69JMqzjuSNQVcx5HbzQePqv2Ugdw04pIK +FbiGwzV9zVb5HnMwDAZ1rlNAL2hs7meOTm4J686t451Y1KQYkbMJQXfq7sSk +fMrXMwrIuD4ZMRW2kykDRqcH8w93mXvvyJ8lSKUqfG5u0WJ4wJOCBc6pKCon +0i7H8/ztCE4EhF+OoBHFM56wYHPPtr6TFXkm5lUB/aJM1ua1DEUmlb4mNz47 +Y0EALHlI4pNahD9VYKuBNxDbdfpuHuCgVGFVc6+5lARYTq/G4xuMrn2bhZr+ +2utOiwXnMTN169rqjoe6E9t3cDBeb9LwY3lnOOL9oiVTdYqdGQXxfsRgdYam +qWi7gD4LdbthkPZBGY+nVRCQy43XfPCFXrvnIx6d1VlB5x08s8d7/WuHlBQW +qusD1xveguJDl8rv8D7bg7Hw4ElCwlVTjAZukYoRysAcZoOimb44nLaElRl5 +tPyj9UlJlm8C9Flqc3j4tfRKhSNNzkPlu5Ezh7COns0faPlbBqUx9fN86s05 +M9tqua/LMDeBYyiAAABW2BUAAgnQKQW5KBZnNHNagcMm2XjvAAAQB/fmENsh +Z1RlEx7CyH1hmjCWwoK8VMBIgQ3CT5JLILNSmVMupDekpNoysIBhrh8VqL5i +IelFSugshxb85BV7o0lOTJavlSEMqUslItlVDpVOlGyQsu4cEvD3bU94vX8+ +Qu9jMZI9ijNc4sW4ia1m4fOtKjdpHIGcP8tZ5U/Vnp+JGmkq/YZ8EyAiHTVA +q2kvBXLx1pUIyIeGMImg9+Ms/bgu9cNfMOrg5rc1scR9W3kY6MixGfWdsv74 +3ZRPXMwc067mo9WTd8IglRFPfW5KXXvi/jDBOV1msMO2qzg4vc4P8ylSA3hR +o1FftMeMRav7yNsHbpk+ArBwLIEErkuR0mh15IgPsKJG8ccmvFetOrtvvtPz +K/bfsgx5fNt5WEzrVI3DTzMdBTqNVr2cyTTaYcggjSts+cuesVrgss3m/i1L +9zhEsQV05tkmbvbQECUnwdK12RzYwm9Zq47Pp8KtdWlENe1X0xe5LikZ7U2q +miRM6dopNoi7sxia8zrszRO9iqzu85aoUtsPJ1TXYLnf9RchN4KoNfFjHoxQ +rQ0+6M23z31eluP5pCAe91RuPsurQhxdf6MgUoxbeg0OTNsmlxwyFC/vnG4j +GPb3vUmPX2LUuynR8RYaEl/UNNGPT4n+PNsjuyJoCw06i9TvOXSkARkVOkSO +ADWiDmtQm060+M+J8y8omHeVDD+b3mhhkhsJNz0rqHx0fAOdlG71S8Prbdd+ +AtOHUx/4nHpgj9rat3Vw58K1yvcqU7j5iVjVpyYBjY0mexBQQue7yaHINFmA +L7ahQSGESSzPWOsDq2lNrZQ40R6Xkqn2UqaUylbfoX4UZkMg1/idw9zxFlVv +mVY1V7D3XS8nGVN/vUIvEXWYlHBhCfInFFOE507YYnSYESa3gqLfORSmn6WR +3nR42T/QLju9A8TxxyZ1rOruqRoackx0u9a36tOKSI8l/hGHWWuOXc5c1jJi +4Ybm/IBgW1w/Y7tzPShAMMh9oMLfLnL4shQ5SheqCLfzDgF5ZeD6sap3iqn2 +446tzBkhkGl61LmLECihfb8uHnuJ2fmk89h8g74RC5QvucF7zHZuffGsfMlK +6lu81xDP+myKYEunn7nzOozoH0IpOfXW+7fnRvo5ph+Sb2NVoxE22wagmym9 +8xJUmPBw0pgqfWfTI1IikYys+aJuQwqNlajIRRFUQukZ2JTxB0q4N5B8mreV +Xe8Ejs52mgpmhGf7A2gSTkikett8aZh/BCpyuzzropUDot11C5ulVh4d/pSF +dqwdmtl3DHgYv4Gbn0OMubNceA0A+BZAMxuvHSiOApwnGxWExS2Bo8untASc +sdG6aa4hYylgMU1imsVPpbuZSKnjS6WhjTpbVoUqQGwBfuzp1TQRKCL5/vyv +vYVWkBTAgB40ySF2nIiDnBjvYKsewfn81K0ORMmcelQx7RgmipCXSijpMVgD +T2NhL4oeYI06IrEorHdP276VYLyDHIGAlfPC6DdRIzaiGKGN8jv6qftegeCG +gH/LassVyWGsqPSNzV5mUoQQWI5dSGEmazFwHZ8XcirR4gmArjHfN/hs3NSg +JFORgfrT0+r9dwN9lJaiZxPKZmwrqh+KGHVrRdkvBRiczZ31P45XQyVtMRAW +DdH3mS36RoBCUjCydvMngy57KeFRUOBDGdsX30Je16/EdLcwchlcm1/EMOic +GWSIqu4OZbb2J8bt1k2yH4n/6ejhPUMuHu23QubzC1MawW8mqoQjcwTdNxVe +zPBCa2z08jrDUjICLvi2i+oJdDbyG0wXyFWmW1v5FZt23l5vFiHKoxhEtq/y +zzlcg5nDRXJN478E9Bs5y7DFY3i+vhpwwTwK5EprNR7At3MgAKIyn67EoAwZ +g2o/G20dEYXCOlNTn48gXU53zPZ/vijW5OdYQ/yHjGziljHTqygsfS28mQGV +odDKP6uzqUq8AYX+2Dix0j/PgGKwZ9BOx2IaOp8hOc9Bkx00pL5al9pt/kVv +DXShZ3L4MmFvKmTCuttUWYyJN+gi3tuhGIoVHz5tl/1IwfQVvFzJ1Q1kit34 +xeR8I2JO1t4mF28o8PW7OhLFlQDd3wxvp1yLEz5sLYEqlfZFIuaM3f45usR+ +TbTP80x2x6FtdXJLoL/cHSE9wtD8gWP3HKaiVkR4kxOgh7Qmg4ja0Z9R2XnN +lB6rVrZ7bWn+TtlEl34RulopXzj5ezIiDvfgnvyEy+Y2MvW8F0JbjIFgnyMY +Tg5ymIOz4XHwXIBZWpDtB1IRarvVWftmccrNbKjjg/p29z78kroOCNOGBdae +heV7e86567lU40LjYJY4+fG+cVU6jejHcUFk21FIdbOB/30H+V+CjKG+rGOu +SWLtA3xSuh1Hx44trEuWFLOj5LXgzbry92SqcAv+6RJK+aydUM96g6ND293G +WSFh06AwVnxWHE2+OUM9hpBPddaO5iVwef9sj1iRp8O1Bgu9u6g06Y9U9OWm +LGA2u+Q1/bDsFzi/0yFERtOcl3rG71QHUYDooNW3JaDeZtUxC+M1gnQOp/nD +eyeN/DZdemJIx9zeBYfCsPU3gHZirtL9DfB/E3fZbC75fRKil943wzpaRq1f +eZbqK15RzJy8awJciQgjZE1+iUn9gxsdwV+/M2PKkYyXlhwH9n3emyz+8e2A +NbiAPNcmt3SWD+3rjbxXxR77beYN+Ii+yKncS9pVlyO3QOhmloYSmmHmSZ7+ +LCpT4v+7kF75k5JsamstK5PhJbq/hfW3V+36G3Bwhh5TB59p0cqekTyImDg9 +mt/z1IHLyzOWdsA3dfSEg0oRCIsCUz5mPWLmTkNiX795pWAMeK4ok1LosNP2 +JecbgqrkeHZIFQnAV/VPAfknPf0OMhMx7kzSe6QoKAFA6ot1uWclekBmbSj3 +zBVHZpBpGd/GYqeHBEgo/FioR3TxdWP7NWkgIGJYgWILCPRLo+TSYjdLu7VB +JNuRN+Zpss/zIt0z8FtcIUZdqlFltXlL5rdXkcAmTwxV3fFEsb05GxyeImj9 +oeyXyvyRukGUuXgY/DdqIk45wuRl1cYszVVwjjTZWqaZ4yK1/LZP37wjWROx +Eyjxf4mdNU6d2CG6FCjwfea+EoWD/swvS98I7PqJG2o+z5QO1ku3fDxH0thW +wuT5IUr9OXdRcvR4TCdtqM/z78967qusVdlPWG3SMJ0IXUJfWloGe2pZBF7k +fuFdx/OYSN3eUxhd1XchtnxPHX9qq+jRvZzSc7v71g9azSFennICaGpdFFMn ++SIgITIiAhhANsP+LiAZVBateP6kDwZ2Zpzc/0SaueR1LXTrgkvPVrFVy9OF +SX/MnFMqTrbVyD8ZE+COSRbnIJW15hcqTl/aE0kSh7e5UtFRfaNDDrERdNU+ +ycG9nwydMKyUld3g2KvZVc9Kv6DCbnZMAJA3RqhwJc0/qO+GkHwBVxeZY0dw +EMlCpKU+EFXjLRchNzvZuDJ8MZU3eezboGN3lWfPZll+0xgR+EVSjGE9eV58 +iIRbm1RPP14cs2cSlTMJwU+nNQu1j5FYBy2LrDg3qMoyeI/vCriDKkL4X9EW +tDERWQAtG5f3jggEyNn/Rs1er0ve6Pr4fmY5FgdLuvLO/pqf7F9Cp8Qvmrod +HZWJB2nS/do1CEmizVQeCRlSxShA92RTRmvm1rCPyF0R1AfQWoMxsH7Qfrbi +U0ajUqJCwWJFlzb+BrHuFAcQ99nYA8PN9o9pnLdmfnIOMWF9F62jR8cJxfs5 +pCHJ/LdXlOausfaski3eqe3lCyf7uOQDACIED0CIBM0q2Z2FKhrL35P2Ea92 +gACiAIECJMxHRx6R0W1RY4h69Yh6dp+trFaUfGJQd68NM9wdiwAAAoRgAgDl +ygubcRnjVodoOZ3ZwXBS88xqVE3hbeO5gSsKxqANH4MsFLd/pfee5xcTbxw3 +hlYDNen12m2cAE6BTdy8pOvt1uoKCvqEhamdeX3mBk8ThC8/TqbMhSzjYanN +r/xTLPjnxvoshAACQFvVA+crh/3NYZfHy5XcUlJPPapMc+cqYDRKsrYACdsE +0nqCq/3fnLuXOr/kXvAACyDdYBpkOSJoollUlW3ugH0qFkZn1MnPlsTXlFBI +zCZOSR8jN92GcTSjUUDsQIECrujGog5ACf1h05mKT3YvYAUmZANcxujrMirY +yAsH0l3r8PGeZ7lJYJGmaKJy9XjTyySi74K4AbqF9aaDrWPZPhNQmnthtrwJ +HEV21W7v8gXEITg61EXvDKBXRzdFfz3Fom101r2N3zt3ZmAZSl1zPFOnpgiP +cOETBdkGxQdmrMGLVRU03NS5WxFaDLLqMB3spFzsnJMniGy0VTJB1veN48qm +91Mf46y1x2d/Rxm3gxwY8HMpphK2oT95B+gfR3EBCMkovfNnxj9ZkuWb/3op ++drfzvXt3di0YStBTjZF+c+lpGKt/KaDKrrzvAQkXyFXT3jILzSmSncO3qeo +QhPt/KM+BRh8J6J1eZ1TPck2hjdxoEGZe+W7jFnf0stR9KWiz49YgE+dcjHk +EFrCb2d84LBf3S26zzpocN1wKz+RPvUrNFPOCRpJMNzaT9HQHyeQJs4qSSzC +AkbzH93zCvLCgLArYfXqgh3LBjA2LDw/trOGIbNFVfYgABhBe7rZQ/fmQkqE +AdMAq6sBGYIsZxSaYRZlFAuArbBv7HVCw4vfuodKOwnaZHWluV8emIPQcpSw +gHQy0KRLBo6tHuDJpU3b/SA6XQQQRJLNdZRKX0MO/gn3DLKikz/ir8gA9ggA +d4QdA7LKionLr6SsegnY73Kyw/NPuL+l3I+aGWmo/i3vNUjDCqpNnIIJXm1v +c4CvaEEADICAh4eVHedSK0W+BuMWmNo56r7QoaU3SlqUDi3sWkOm3GLqiJ3v +sc/RjXGd2l/oVew1aVPHnfpoquGK7k84Z7zj+djlC/7fSPzsA3r+j4ZO7LFu +5IXGOW6pWr7I1MSMNukKGfWNABBRGhfh9c23fQoGVV2hKdOE8VJWTvd2pByS +t0f10IfuO55yJLpACEKdqhTV+AK8j2fUy7BswGoxqCl+hlmTAvLmzcjURYP3 +oLOGb1x7qmJtbyqRqpQTi3cghJ8rPg/zV9WfdpvU7KlN6KBUh3oELJVEnBNb +piAMqSnYvr9Lv8gEpx0luoc31mzJiymNB6gubBVtHbtFPHISRKJwUNEOKL9y +ysROmhhUhZgL8+tSOP3Pf3CXcOdybIROdZe69DUGPNdR1CQZcU4kUCVXoYyh +WP+a/lVPF5FEJZuujJdH4+aQfZuCTov6kwfxEcfA7/xTcDK+mw2zP18tSdSD +BL3pcKHU4AOyoudCYZWLZS4LCY33dUWCzLyc0uJv9xUYcoiz29P88p7V33MC +M/utN6l0dJRpGqHe6L6WGrFIbO+AyjHOvTEJWgmAaJfmWG5eBezmIRVcP+5w +u+WPUAQjh8FKEUV+inTi0VE/uVnXyequnYQ7dh2AdyiKCf9F4Wh1U38u4MVS +BhHIUbvfoFzzKkyGup77D7GdJO/aK0cYTvuOyuDcyEho5DlWv7VS/kmDMIGk +f6zQwexnkRbWNLqPTIMfH3V5+c37nrDu7ds8bNt2TpBI7v0bi/kwWQbEVMdt +D3Ft6N4JCYjN0KdHUmYEF0J2Aq7bem+HtSpi1JFjcfLkZLwAlOOYbuLOWwTp +gGrSV41q6ie8IS97zd/hi/XNqmqpgGWsdd6nbp0jReWnM6oZylt7TJa4KjhC +3kM0XouXlLvopKfTPQ1cfVOcIrMAIxMnwjpjiciagVu96dLNR0YyhFQNUKQj +ygUABBF753bpuPXCautcPZzXPZxapE3AfPoCpExTD/oo2roh9ofap3uh7M7n +2t998ngflDuJM46AJucPZhcQDi3skW6Z0amLwZwR6MuAAJACTxxGWOxW544C +SBxJWnl0n2UAfyA4wazgMS1X+9KD4ooUcQ482Tb8Iw1wr/NGw9PCTUrGkbzh +f2KvDxK/z8T3xirmNGvCat/ePi33PoB0vqAy/uEVZRBt2/Xw2ktLClJn/6+6 +fWs8JrghkvpiuH95lKbqA60b1cmZh8Xn/AkbtE8PfT55K2BoUbf4fNWKDuQb +2Ih5o9EZotn6Fq4rNLt+myq/t9JbATxEH4D6mk0zSPv7yZhFzvEwXAsX0jKX ++NUZmC9IgUXkg99oT+FwCYdxPBYK3xyMsVJ+2PILt2L+xumHOiP8LgNLCi6n +w2a3/3xeJqoGofK2GPdHwp/Pc2St3NDAt3djuHWZiIvzHWWI+2CBo4KRBM+y +7/yW2Opaglx6LwRPnuXXB3izn8JnzP5L7IJ3fOygXjegkuOtCVEjJ8kFDqMx +cOKLJXWEoyfhz8ByzzZaQ5PWqWfeTDM46RDq2i6r/5dZbhY1X8/3Bapx8qIo +nZBHpsNPjy27UjsguXyUYKpFTPo0mlDqn2tsQVMZicXQzhZLAB+CAqggEWcw +B4fzvafpo10nxEkcyNS7EriVt2Dn5gRhmPgj94n+fdDU3yt6q0fP4yIMSO5G +ZS8svHKQOaFF0M1g9DYJC28eube7Dg8SJ2YQHLfwghoIzVYSJiaWGrHIPwOH +HPBWn22nEhCO4ASGljVeVqIxyKDPnpw3kpEzINp/jdIggiX2v1cADEdmM73X +pcKJ/snzqh8DE02OACjSNFph7KIpmI2yBi7YHDfr6BNg9h98l0HjlDSparPs +M1t4+0RXWW2ZgS/L8eFE+OBfFhcgGJ4A87rKSd5LHYHxPmnZ6GVWKAJ2dpA3 +grN/LeiNxo64TdnC2xOxVidZ9MzdTNqqBanjhBSdvi5XPxi08+jeRx6rSql1 +I/RspCLBncxlhtVU3pVWET/thODoAk3KREZL/V3qsSUZr2ei2zpyGq9scuFx +SJI8+aRM2zgSB3g396C4+aKVmQVR/9p94AGJJd8Ec9RnwujltIVSe7AsgidZ +Wj/O9DdiGkBPitUxXJPlkgKOB7WXb97Qn1oS2dhhVSVrWJHv7SnwSdPkmuzY +pFnPASHqe1K9x7P/+UV7XxjMaW6eqMPr4w+U+y0fK21A30NtQkYvpua9Qe++ +fRb1Zo4KZxgCblSIBATwKcHGKJA5vVTrZgoxPnMXCDRWhsSEo9TntPmTTtHP +jYZjHnpHrSz+04AfWCMgb3VZriD4xIRf/xIEy380D+GOQFJEctYsXv7RnVak +Xu13QqDrWgyjVJwlITRDzyoSzO7tOl7aVdgmsYymzUYb/hIpgvn42K3UgXaQ +iVQT0f/Z5YyvgzejGKhXUHrQqkYmGoHnv8/lEWEMZ9u1Ccc+lMEhSl8eeDEu +2Fu554W/bdQfK/mhVSZthVrUhSWqYgGlaTvMcWhYHMvrOs+N5imHqDrenEU3 +zlx2RQBzQng6FrGBr4I9diHHthbxWZu1W8cnhXzZjigi8cZq3B2tVbSrzNvU +P2dNiCnOaGZlHzz1T3e7bj/IpiniIdYYveYLeWuylh44dHQyb1x75svamlr+ +endVFBgJwZ6pqF6VxH5ntHpqlzSClLcdLH8dYuI11dHQDP25jMy+ozuGHLWM +IWWaVqyf9+dPJ3cwDbc4RSbQXe+3e6+PK31Qs1G7tKm+VDpII+PFnkJiOzAa +cVdx72jp4yNJ/NzBrPEzB1V8qAPstupaz4El9Tg7rnFkNHsbRGY+lM+zwhh6 +chlxL94kwIeA4SESx4w2NXGcUkPUJ6v4SCYNgwWCHNgKA+GucF9tw+0m6gLM +y0ikLU5FbYIuinzmw6lzjhXsW7k+6721zPbZtvNpo7u7yuwkHw4xW4KIJDmk +6sVNSftF42n13Hkjr6SteidkpfaSmofaGPiNiqpFTPDEM7fKaKXXi39+u3WJ +o6RJL9Gpe6lJ73X2lQTMtGybS6GWlEz6cWKZLAAKF0wLN+4dB4gEiH0Vu5od +X2m6QG9frBQVrBABWz0AubRJhHhlRssi6/+xKFKQq1H8AQyNtym97Qc8ayu8 +0ZPbhKDzUUk3tuhWbT6J2rdFZzmsc+amDZnMyAX/JxU7ObG92l4Eoy1dqGrI +IBSU8XQg9H5B1p6fe4CzqO/USzQAxKzjQHFdNbg0yB7FHE0v2t8c5Z9ovynn +ISTsIFZfsldDQ0LNGpPVq4Vzie/28/nG+LPxxwZi+zSY+nrg73pOPZFJI9ey +yITlOLuYCYDBWcsSmkW6zS6Q/sYe8Mj2a/89+3RLKsVXwPcS3VjIQrQG/9TG +40BRvfzRGne7bv3ad0uIPb9F59dMhc2pVxaORZPGyj0qwdnqGMfa1ru+QrC7 +9xHkohyLzrAVWXJuAim6rENSD9NQUKj3JZqMelZGoAajuCUDXmWvbCvTtIIF +Tpmp27Eh5hn2sDOPdeDENn19uND7s6Q1bF5oiEhT7vux/9iSwu+vNTi2GtFW +gmOegWQiHtbz8KEllBJ+VWZzDmvXU182tgXFAl9zYhsCb3jjduuEFp8bW0Rz ++5RE/WoWOAAJf8JCUfC1ouAjr5CxDGQo1r1RkLqgQWNrZSzB+FsfUmE7/K7P +lps2RW2x5C518MjiKTAo7DnIB6TFOWG4vyjPnPzQp36pFwQCHQGbLevafunL +VKduhuR/pMDfsXMJ/jFpgyWRljJJ/JcoumpFXWKNJmWZ5pWC0GVZT8P2a+C0 +OeMJO3UhRNeqvtBpEkUVn37AZNUcNv1GPYDphQw9YAuxJIUSgibZ0PPi9eG7 +NwrOI4IYzqtfLwt7hYupocuml8va1m9xw0qxSfARqBy59MoD8KJFA3kOLrvP +mUdTbb/D/UU5P1+pdTJAkmZ6bkmtvcw/MqwCpWGMkCub4/Ppm3VRxxMXn7Gu +qNM3JVyLdnf2GEDBhPKJI3SFx9cHxRAABHJcUTqW8Qf9o3p0ZUUq80u4Qk1l +MG3Voxw1KRnk3h8OyPk7sbzOfOQZP7KQ7YK7MPwKWORnwAB5vTMGOMBqkib4 +C5F8mVPx2bFcK2FY/mlPg9u5FhThSPrdGRTg7DKQ4BJICqV/gZ7nYF7e5SNJ +apLKWwJ8cOeByJvDMrbNTo7q3SOh7aFyV+Jf9LfLx3Ohp1fZ+Qd8xwMUpLdt +WXiJe0JZPDawbTIyxhudoN+WuJJ30dgAvlhLReSalomCZcy7a83wJR71VypY +n2j941HUML7s2GmUh4jaTB1ZX6bDtZlk5uHEAu3zwHTfU2JyT+iMW0eWnBw+ +u3MsDSayKzYhRPk1qkloQBgIHHj3T1avW6NR9PHiqvTUCzSoCdx7ZY2KuYsd +yP6blYnPPLIf+XaQ83HKxz2HM1QCtjCiHquVXcUuwUMBg3IR4TwEOfuWBixl +OQR9gsWVApOFy/tfFw4De+MCmD+BUIAl3JfH+Ykw9HR5qZTqipwcNPoRADn/ +C6/N5BxPun9VZI7y4WAvAy6trliZCbNNYdaYkybRIwM6EvWz4J3lx4kx2WGl +p2ZzXuKHaVG09drLb8ZlGMkwG/qQAaHD6jNIhBZxJONpSyCSDM6jCNwtf4t9 +6ED3D+xLs6z0JL+uHAYB1Z7PGaEIGdyUXt4kfodQ2T1CN4A6J81Mv4j7H24d +E35pBNnJ5PC7kPu2WyvIBZssHPN2z5+wnmtW6yLQguDVS5supg1IdyQl8+vN +YP4kz1lVTEx/ioQFpJ1h5XiePuBeElH/uQCuENjFv0y43ulptkwYKEIoWnsb +TINfXRDJmeodf7OTBhiKMturZqZqB60b0umrmY1+klGL5j5dqmro/QhuiD7x +FC1krwn5mBPyG06pM06clP6QMkYOss5b8CD/2m58VhQuiP6upwi0waOwyIy1 +UC8lGfj58J/0i+MK9Kxvvrdvqs+ODGSEvMMCjVTVi+nLIfEtwArpd/4YPJjq +EYFwlDhW2xRB/C32p6ZnKXUhTyTjiE6wMMVWwOd5DK/bH0stIQfVfck0W7mN +B+C+B9PaoRfD8iwDZKnrJDRyBW2cTd0y/5f3Q0+jL/jTXPSEM/GMn0DNE606 +nWpB0dWe36lpE6kyMGgy2whaclxLemwg1KKAdMjT+msZD02yVxWBcxRyMEoQ +QR76UMb474i+fY8m+PpRVnTj4vHz6JPj6iJ039Cj4i7NmaicMreLRWrtRery +qERIST1+iGAfZJ+iuphwaspfSx6gK2A56f00ifxRIDu7N8PshL33PD3DHYSb +sLIuO/TiK8ysAPx7i63z+4vqV7mx70kWfrILmPMwXwSTpXHKwH61FNKe9h20 +JIu1ke+TO0TeIPBin0TtkGtzTd4HRMALVGTsH9VAdibkOIBncXZ8osayYtd8 +iSGpiKiDf1a+xxByDGD9AIDoD1fGCLz/nBSQsuJ4nbKkGn3FNkOuGQzcZSVH +MOQ5I3nAvyA1G8VjlCpunhd4md8F+P8T8SGj7cjyzN681GuG6bK9fsTYz67q +Uikrs0jLhYpSncAcx7i+r/nqGFWUpwt/BiBDZMPo+XMz/IvlZVawugq6mPiW +NAIHPKSASnw64HN6ar8TWhLH73vRZfHKzsX7HQlTZzE3euSasg/g3JGaYk9i +p11DBgw0gg0lG8qb9OBr3UZQ/mBZqAYWrO1JyzQSbO+nlkjRoyce4NCwhRe0 +m1gkmBAS6/ePYCKwL7tSBf9vUq6jbVeBie/8oqPzlLdw00lW8BfNd0shbV34 +h0eikB6CXFa5l4jyjMW9nZdZmygXd4mwk7AhNOfvFShlhUKMufUU7PgLG9s1 +ocamMFsHGahrFiueb4jjOSc2eAG3HXWHwqeo6oDAUIUOmbsAM99jus120Xju +nENtYMBtecR13pi6J/LxiJj81lyY3RRGa30FfSkjxoFMPzeYlWFuuYm2NZfp +nwDX5nQJEP+W6NrUO3fO78V1Hpj2tLv1QlHJLmrbb+imI25nSvpfY6s6TBaw +D2VayNYFIZtUr6gdjvrjwldFzejtpPeDzcgbAOOZZsuMQttaNzee74x7Petn +quks6+Zn7UONLLIgFPbblJU+mHURZWukEp++m6UiKpcWPB0NSLPagMx+lNIn +McqDOO/p8njSOD4PMSu3f3JTa8yRdzfs8pUUVplFLP5iTQuP8zfOpKHSCHCZ +hQUFQVn+0Bb2uZ4gZLPcmK810vTmQKR9W7RHzRYaWavla4TMSjOvz/JZCrAJ +GPS4pjK10Gz7o2dlfr7zvlU5vHI2vDSQJZJyeDTAa8Yoo9wYVYoWmDtzbJKq +ThG0JGE48dwUdYtJrzYBtbVb3QLKTaFKPZHmYo9hC9FOFOT8pdwWhQz6pKEL +R1vtDejHqOsXlreZZkjVDc02ecT64Do586kJ77Iz84YHY3/ynsGUyUOpJw7r +4ixdnVU1RXlN1GwULgWSzHASaP8o1JZxturqFRM1suOKHAa5Sz4+ikQecBrE +6KdOJYPQzeuWUuMnIwGGdEEDKyjkOGA0syw7D6NHxJpfqu2rJcY7oWaMNa6d +VTYtYIsqRtXUikPmefCmMdXpdwNxWuiJ4m60MT953wJqk/y5CezsFk2xbQ9a +x4ZTTUlj+93zjzItih5ftns+EoWe5nWrgOtYvqi3wW40De+7yHjIGeQ0+3sH +VecfxLzMU1IOttcqGnGltXPfo3KvhXWq+/uRzzpQ/LQGNyjUDmcwUT1PDZ1h +bBtsaVU5u6QKQa5ATlZB56GwNWd9iM36+pzFbf3lkZU1DF+SadBh8TE70fdM +tpEBFbxo2U/mvyFcVUI3/stUC6pbF/5QmAT3Xx81+EonczOcAVjfklXbnhyB +Qs5T4yhGiBVJCnqiqtMGYYlOmABZ7FMV6Zb8fbc4zwdXttrSJN5A0QLtXPSH +tVvB4pAnF7PKieM1ij4aEJpKEwunRcUXp0tjfFIPi9Rl2znw/GwvyTcnmWx/ +brHfutqViHxf4DYxdQjh2BSUZr4tHrWPXZ/CnhddI1Fp6EtW1DvmkSGfp9ss +gvbCuoyRZNH0etI2rS7xrrJ+k6/2uJvhpk+/7jn18FCxwbRJbZls+qIKujp5 +p+PlLdnkBgQyXNDi4nsTSzI6H5o/ynG5MiAF/NZ+mGnsFCdSjdArR/J4datn +0Q08vVSB2tckhLtrOvwHALa9/lIZsABj1bHukvgCEhFf4AmSCA9SFKQSB5Ce +2v3zoneFUKW6/meTUQHo3HGUXPmurMd3EA6K7ODGpZ/LEBeGWZLfggCIF6Eq +I2Nhfcftez92R+cw/UxUlyV1bZTVcO1wPol8hpi+0DPTBt/3ih8Pn1QBNICc +2tFtavb8yOQZ6dGpDYKhZiwwQKCrStMdHWkuAkAq6ETE2LRKh0XjGd8aJ4sR +6yRTRhj9U92XINyFPT3eqe0qfS+vmGsoT5tBcoq8WnOnxPJrDK+g6gleXmWr +0gZ8I0kqxpNCUFDd6PAYCoAAkAQbxp9Gs0dPfZouM/nN8Lk3X3F/ZOZmFlMr +MUa4/Um9mvq7hL0x9/KoUL5dZHnYTiwPV0o9zz3Qs9a/kgFgi8kI77Ae1YFv +9eQf+pvI58PbPWi7CTYRAQDcvXDBAhZX71DcTxkhukRDNN9TEDQflTmRoGIu +bU9OT1VsemFG6V/2Drfr5BOX1b12wFEZ0kPbvyKpYcYAYld1EZAQoDN0cxss +Z38M0w3GVfm/q/RjpPU6JyxRoenz2apk1EodZ+QjW/70PHtnKJUT29VnBUOF +5TmcGTTdgtJfCwIvOOhp0GluA4j02djfnTOFN+eyztcdVsRmgmymjV6Grlvj +qUOe38SboDdgwbN1WCUYiH803tkEKEDS42p2ECgl4EA+SzKEGLtz3z2ewTh2 +2ETQmzhfcu8DtIMr69oNdRPKn6Pq7h4tUTBGl3R1pDVei3YLt5/e3WUQg25U +mwUJXKcpxVP0qz1YzgK5lejs73rVqnxIrvZqr3hTHYzuQh2F9slLT9YyMfuu +L4MzK+FpM2tIPgBHpIVjJ8C8reCW2C+o0SUxGt/BiVSvz+JFC7fPkAtQtq+k +PcK3cRWr8cYQIhqs5h9Al40AMOMN8GkEPcZoftnKUwaCxB5OjCHC3kf6mlyu +WSYAeSOTBWzLfRnVR0Tmx5WZdrsBr2w6fB1UIjOHH5EEJ1FhREY9DpRS2jGh +ZIfEyRCpBRyp2g1xyYjPkZhEtzBd/4uVlio3HwSEE/UDpPD6DcskwcWzo0G2 +XR4B69bS+TiQyiZE45s8whQI7s0UE2Iv0rh9Jq+dnMdI1gyekOsZPFWFh7N/ +kmzltGyh9BC/WXRtuOEvQ5MZuixI0E6KW6BTtNgnLzDD2bZOyWszGbHYZhVM +xGWI/ITo7zSh0a1xGKbdLTE15KvfzDWIqpLhIBTFEhwvDqW5Tqsuhk9Ivfee +H9WOVO9F2ebHmZbGlGgCKpT0M+/NgwtWMlwgMN94zaNcWwLvIGvoAvTH4VWP +RPw78X9Ug3UGWEZ/t4BcVK1qaIOIX6MmwidcDcIk9FVrf+C9eqDSLAZI/Qzj +maFHVEiYXjSvscPLw+qTqm64VI8mp47PkpwjqC7g3BJnNrpbBlBqrM771ZHd +HPW1kWNfAAAMmhHC2PqJpV8KqNvANwkGtCS4hQNqtdR06EjS9Vaqgf1JH3dx +tYggCFaQHQgiAEIaTSue6hEQPCvYZ2Xbcr6lxhLavgfjp1K9MKwm2CIY/Tcr +TKPuKqKv5OxoJkH5Ie1JU/hZvs3mgdY6pl/NfWwh4NNv6MbnYICyW5Um2zoV +wXw9XabBS4NkTO/AjkDjU9gACgBUTFHHM/8xsOi5vG2M1BVLXSTww9NRPcpU +HkSCt5rrzWoxri0g3nbInptaHWNGf/Cwuteh7zLtXUGvPCUP/O4VrG0s8ivY +zfdGOynhDdwj2bydyIdDl8i3uoR4QfzDUCMhGwjgYwjuqjwc57tklFdGZ3Jx +8LnSUmIDzG20ZIeC2/26JPsAnVMbK5uhqOHqJCx1EPJIPCrN7umD+fHFk4qd +ITUn3H8b8yn+7HNQegjWMAadtw4vt2d1gjoURCcq8/picUYhkOsly1JdPKjl +VJ9LbH1GA46hy7jDJ0/BbM5Zbdy71raTcJXj8evPAyv0Dja2bCNx4L2Zg9si +Jw1Vehtev/CjRaxSJcGzBptu/RInAtD/zDStXKGxNne4/uYVbg7nsWCj/kAs +Vs70TCMkJ5hgRyEWhcZYM4FCVmkgvC28RVKZejgtADqqlfFztprbtFBvc1Kf +KTnrxV036Sj/QiJGf/GbFY81S/qk36N6zR553Sd7K+Gtszpf48IpTB4vAv6v +zd4OrLiK1Ke7pcMsABBSWerWEgc5g5gYtH3JrHM97o/kv7gtH9akRSw64E4W +P4O3F5jDlmcZcNhfbPaipkkWjNNuuRcjzdWCoBTuV7VjXnNeYS37sp3baWg0 +Wf77HQUrA7f71Rki1y/JQ/rGVxMbJBo8kj0bky55+Gu/f+khn6GAfccWO5A/ +hquiNvID93nL89xvy9sYnI/7eOQTyTgZOvDPEdvZQl5iSRU74ZX7qOIJ+FeK +EokIo77WkesZNUWGvzGyEqvx0eHULkBJq1SzVE8HkN1QyDGf0hvq1x2tyNv2 +ZUrKvFnfd3th5KwMaxCzfo1Wh54504OIW/1jJytOdDP3OiIjPa/zc8evVdY+ +iwNp9rXpWexLcuC1slScjrVx94ffJU76qm9fPVpaw8PlIE/uY4bEHyaxAd43 +Af0KSkq0bKxIAD7ghsmkrEzbU5eM9gkZOrnaejUKdT2UYb2Hbsf67zpY9Dqk +efZnLCNKUTHP16JYduQ/LLtIVb+mJJ+V+cB2nC5Ki/zMApLC2WBdirtdQP2h +O1UoOaW6ime/2LDGDNeOrSsCZ/xPx3sB25aZTesfB6Q14BSGa9SbzFfK6377 +g+L/stbUF8vzlpwf9Rf45dFIQ/liQdJ5RxPNSAXoQvxNBU83jISlKN9l9tw7 +RALzB4F5wFqPVYQ3ELBCuqTYRvtox9b9Yq8LlrwYwmE2nLXUTse3XCNi2YWM +eDjlQcswRT1w/5kWwhbj75SUFROCP2pCVtCIWaRrXb0htxFZeRpsvJL1c46M +tNhv5tyhFP+a6S7viWUDxB95zsdl5cMAWHTt+WwYdY3woTVBlMtxbSlcBZzf +ItmlRqrKSEwTF5+vJtT4wuIlm7McyJgcwfcSjylM+12yhTc1hl9889gpDELu +jEZJWHNdf+VpVpdhB6kKhMqjW4oCpw8h1lWi2VJh3YMEwNLY+6n7B4pP9LFh +TqldsB92mEM5l3rx6THl5dDz0LgNw5kuioXHzw41dHnb6yjJ8L1dByTqMYht +eFB/j/U+kHpc3sWIWb951wRe5jHvNYwq0VMKmcEpVHg724Lx7I+6Uos+eyFw +bqRGvas/vujF4qd6aHWovEN2cHO9Rxt7/SqMZwlauM3dXqYozAhIUI4m3diH +IV1trYESed3MrXdQFgEUqNRGQT2vCM38qLzVVW6hg7YzdFtGIj32Ka6zOAf5 +gzjF8p+7Mlx/CWL9NX6eHd0tIl9OURKlyJOOEqgyfHxkpF9tl3PugqvEBZkt +48yDGt9wjUlEn98D4nW2n9Hm1yeTsKDuE4VoXADLIG7MUZKwbjz/ZRnWsr6y +ataYG+/TxZvr5ZYifU2BYz2c2myZkHOuX4hSfruYw5xDvo0d8FbPNV/y1VNu +5hv1iDqZ9IUvFvb7wbFAVKl5zxY9Y1vta2Wp7RUoa/Iy0IyntGTy0Zckb9y3 +OebfTLJo+YwELIr+IaHqwagpVHfIhqzpFWc8B8nZkXkfdE05ulMC6KCp8Qvv +mktOdcLrO8K6Czie5pbm+j1/glYX9oGKmWcJxZnxG5D5t7paBc1ZJn83Q6m3 +7hlevo8yeiopaQpAqxbcA1Ir0sad9RkZfa2uFaGfMKetKxnit/zf0VLDSM4b +Jj1houJ0403+w8+kSf8mOX2RB3cEo7lSmIsm7WNs8HJnusvlBLpd2OcoQbdf +3fjTxNYgUamo/axT+aJHRL1L5iCxeL7FJ6hruK7nMyY+27Trq/a9LFyQIJHZ +QlWgQuxLRZ0vt2neYkS7mh99DcqLS4w1xsnX82ykvXWWh65UfKQ8kqje5UU/ +1iKCdCQXV7R4+YNbwY+4ZOZwz+RkHoWp0dTxQqRf7idqttENnoa76JXXsjZ1 +ZckdBS/DRIIm7G2uwwR3IBDgqi+HYKTbG//qqVWWGa7xuyQ5y/lHYZN1zBX/ +Xj9ot5vhNkPb2MyTx7/a6Jtz/1AZE1VXdtvIlS7qhTUEUx5+SBH1zn0i03EI +0vZJRGijHhzq9c6uQo0QtDfYmsbXnaFNybLT2CDi91qDqJRYNMQ3vQH+MV7W +5Kb5583TmJIYyaazh3FuA6E093HTZSyjN4nV3Tb7oaDg4zfu3d0gX8d2I0B0 +q/yF514kolcvJr045VExNOAcDOaMgt8NqdBvECQTc/Sn4ABAoKCsjLiidFsk +Mu5iTvY+38/qJHH83Icnk9hpWOWplx8JYt4UZPoqV4d2YNoWIF1LnGLSCr8C +8+hYPE2zf1kmuO0dwgzLihshG+S0L7PjejSjiANNcLyoA1ilSKXLEfqb3KbY +eMKdROFASiVFBXTkudqVDeWHP7P3wBhYgxdnCtJ1xKxr8pez8NxUvFISN5OV +yJtn+evC7fspMu3l+5FdIsVlb09UM0qLpqd6iXZYiXjzDED+EBT6syjGiwAG +aDbhQsPEOVB1HcKA4drT0znbXdestI/wmNf+H+/wa9S7WUXMwHlkDTRjxgIy +IJ9Ff1tnfw5m5XQxKs1RfppefYDoiEkngZ/fw9/V8FVJ61CsVgvC2bjvc22B +tDdQtf5+bNoFuVBaJqYd20v6p533Z62zN/FGdxIpQmAVOXMu6yYkC3yUf70y +FW9+2sKULtaFkX7Kw/iJD56XcBamsLuCoPjAIsEpJup5T1rprqMh24ib4kSI +OCaIlKFt8xzxARZyQuOvgLvawk7u0XaamPcKnCruCVsoeB/RA8BEbdHmW6Ny +lg+BqCAv5uUHEUYijUSfTsg+nYM00Nj8aRkE42oQfDrRKGb1sBXW3p78LfqY +Ih9RGNkxWHn3IBSGrxfT6YXRZHLpbmT9ruI3eptkztkzskQJ5eOeT0Rt19fB +M+A64R6hH3z25/4AFQg4Cfo1Cw01R1/pBzrpupMGuIT9Au6LKsN/yS09/lJ0 +Dv5BLQDeYmwO8mrU92j+J7W8anQGh2fZ7wND9H/Mdo+krl1jJli8HaIivM/L +hmjFNymh1h4xmbl5iDiMHr8kwdHLJBkSoJOza5iC6OhCP8Jr+SfMkzGe54Ps ++s2nTsLnhRDqr/LWUQ7YqcIk+Lq+BZXe7i1wkbEdwyIxkPNRGkUL2MiQscHF +FqBXhNZD/l9jQ7W7ue9cdMx1FZDLmBDJxIRbiE3bvlO2/mI7SiuN2pX0A0uc +/vMZ/4yMezEUOJ7Uq6oAJC0uzdy1SE4W/0ggkaIimsQW8lDuHsNrQf43TFxM +Cx7LncsPGWeRV6cOFVF9auMkFKbCVDzSXLJh62ZaPjIWmWIETr0ebEiNGHD7 ++oxtrqEQMw8+txII+EFFvmiQfIZCdy63vxy6kQiAkaIftjTh52VugAbdl7ZA +zw4HWVETDgw5FZ6iVUztDrg/HpW/9R/eiSkf1UQ4DVb1ObnDHPde2r5iVYeg +soZjIfen/0Nel6AgQrCyBik5uXnCamdDvIJZPa70eGB0eNyRcFOU1WuJZ4Z9 +hhPZW78iTYQrWuJF9YET30ebizYSZBIEWXiPgy0RWgs/jNxo0nXfwTqyidDA +QCQZzXRcNPN35xIZQJSjVp/tXaImCLT/LndORgSdjomg+ddkgj7Yj4Aaq6KP +t2tXwmJq/86IU23o3ZxGrhcFv9IsCqvjZCirXAQltBOiN+g7vk24j2zvPwt+ +DMnv99eDb4vC4GM2e9pWo54rk5uqMW/B1fMgqHHsPPLOKsdVlhHV8a/XoOTR +XTjQZHRVDyoCDM8jS+IF+otDyFfpf2ocoivzFCw0MreNZDWhFg5ttQ4adbv8 +lJRqRE5FrKcUAO0rZRU/g2VhPZ1cR7hVBnqSyDfKY858u5rRNCJn26UKF75y +LmYKrKHZh+x5WNwRpjNBLdhqxPuRqvNLr1m7iD8rJ0SwF/+gb0CBA+4SIUt1 +rVhb3YahxG/uPOnB7c3pMU4XgHUkjc3w/vSEzNI2Lu+k3Wf43K96jMMgkrUJ +Cp/D6eoyvL0zCxnhqEkBxcV5txKQGI6y27OsRxl/I2ZozGBUNtoSmJPljHpn +tcWUuHEfwQViGOnb7qRSTG3Bera6LKTh8mSMThyLX5fH8TMiytjEeW8vmjx7 +Hzbk50sMSBBUzgvYWuIEA+0F+Te3JWxkHjNwsvehwrR/BLU8cVpwwHeHqQ8T +6HpeWBIyvuYpi+Y/cJV3PUk0YXNngZQsVCfhZ21unTGKTstrU6G3ijkDO/VZ +USJ2c4bfoLQGC05un8BJLVjRl8/LEXGrwQkhJ/wlrp+ec8M1l14gdf8gzOSj ++xyRnEQQPzteylRUSFfB9M/We94gskhjCRtjejYXG+jYpKRTJdccaSvFCnFY +CtEVi1tBFujJ1KCTgnvr5D5H+sV4Lx9pvU/pR7zSRm7mxrEfkfumQTW9vtxf +H/WP/Nt5HLCpf9L6iOqPsDr96Xg6P4Ff5mOLV0lnANJirelY4bpUVPHbkHz+ +TShSmDTF4vWpn5D1hzIY1ys+By+TjBp3e6qaVJWEYvLxPOIep363sjffBbzs +06Caq5Nkm+vF6W6UMbEsLPtgI4ma/rgiZL+OtR2ipIDGYpSYr7uOoTHyWsy2 +ovKODeQaEFFODyUfdxk+g9Fgz+F7gYiERc5qcALNuhT1E66vBifdcBWO6t45 +e1F2DqNI8mCaSBmY2YOrra6CwanaJDMfLr1Z1YFdmO9vQfPrUyGnTWyrSin9 +fF2jGL4dPQv8kTRXqXAGSwYVh365Hp2gRpiKYryvvEx64M0wxPu5Yd3PEQ41 +Jx7XITfcJ9iB0fVItm6LOIY+Mmhxs8kI5wUzO3pGNPnLWuZuzqfXWzMsO+9f +G3U/9imnjIRMZEHo+7MQPYLpwQCabEZVtWc7BhjiWPjkyjOr7kyNADMHo/UP +8sOWAWn5FhFmGUEI0TNCEZRzSn/9tz50YdX89TAAmMLLXxcP3/lewP6iev3F +XxtbwiisfV43DwJA9M/dyWyMuuW/S3/PLxJLAv2fGwzM1yAw6xNB9K9TH1uW +VkrOWISO4O5C/HX4trzbyPR53/9G7XVKrpE6O+TxyJvevpr8iQrPimdWi0kG +4nST3+kpW6ZGA1cdqfwOvod57UMMAmsJn/J99iPLpGFRzIhb32CHdIBfIyom +hzHVXU4nMOn/YBTc0CoEol8tyJnTQBUA5mPJpgYmtaitSQH976KtrASrrZE8 +VSfS3JdxV2ufpFF+3X84UwGQpGK7+J6s63RHSvQqrcvNOMirjbEc1Ru5fY+u +L4MWx1rMH1Ufy16k3HXkTbDOFoUUJRitVdA9m1Ia+9jII2S5xon7qal6F3Xr +Bh8ZjOdkU/uLvODifZxh7EcO5jGFodr9Ho/SuuFQ9K7ZvsOXsHOy15015Hp+ +g733md8NOz8wJG3muklSHFGryQ49XVyGn4YeCY9gRH7CQwG7uS8vUaLC8gJs +C3gLLN+96eGGkza4NXBG2qjPuXUewJv3xK4PSZcfY7EOxyeLnsoa7VjfrAa6 +TODHp+kUIvD2ArsCqIzvruJI1ol7FiFukYwov6J+gWatj47otkYoi1W1GeC2 +7AepN0/CrXTiWyYuPLTQXAbOfD3LkbW2rG/+orgHJX7UhYlvBY9yMDkPA12Z +KB1RpqzXmBOevgC8SHzpGvFKS+sxfO4fQbOXtefw3igGzB1MI8RUZa7Txql1 +1C1kHQZTRpsaBsKjYSEP30OLNEnH+fMj6O+v9IgfHnlwGsf+1kmxvmHbS3+c +P134N+oNoNILqU3tGY55CZZBSf83+W9UXDDs/jsKCmkJRV1TF+oqk91v+G5U +6PDnCBVOeijb9ZoDnZH3W9W0k58x3pquxtZgkt3IPNQjDBHj+v1QgkE+RNo4 +TVLEPfBZ9y5lxOscbOfWUY2QE2vttsMGZE2Jf+5j0MBxzUhC4/UPYzTKGOTH +XT6uEQWDSs/5Zb2POm9zHzfiF2tntEQtkhT2apcz+oUqkx6sD6bj6JWqM4Yo +RL9wdcVs0c+szFrFBuFpR0VQrp4W5zu/Ein+NOO1SEM+ZChJxMxJfVr8OTee +sARIyVLnEeB7cffnC9FMT3j+lexiNAzXij047/S9aV/ERWOLptEzitnpxeAu +097YrmJYhjMG2oms7+v8SGKFKxyJi4Xar2t+izC9vIUqhNfqtYJvf4I66K/m +gGbmquwT5/xYfAbXu7xrbOZUyAXrvq7sR5QBRdViy9Hd0ilHcyJhLfVM0J8y +TbFqGHdOe56QUH7+exVDttdhB96TJc8Pi5e/JGjn8IkV3tszsfEVGNKQNB0D +w74Z2vknfVaLPpuIVCx6f+vZnW07bFOcvQd5HK9tpK/IWXbUbwLGR7mEbJVe +pLRNltLxttY8O+rBFe6R9WUiqwIEv4IKlvwHRqs20SC/ZPe2vNtLN+sXjYry +th0Q8xJQNHcE5zTUqgfJXuouxPZxauOU5ez+aMsKUCEewTP2Z3jbO9VIiGms +DOZSV9leHVopceAr5EjpVUYaZlIEKAWByyVTxWRaLtwQRBg/nEnJyWJ4Udki +eBJEmEdcziXIPnMHoCjVi+nHFPdaMn6261GZbvU027Vocl/xgMssFeyo6h16 +/8ftDO7CppNSBOYVOOkvJ64vZeiYiKXifuctyY/EgpHStB6RwmDBxeC27pmt +9NZgFwxiwXLg5OmbIslddY4xsNzHBPX1mtx1xXJaOlUoggDl0aJhJL1Yffwf +AwPhOC2clBRLHMpkDTxhvKUKlJ0BISApl4GzlvpXfv47FRDxnBhfCuuuuSAN +DB8vTxbz24FapDGPWuF3lS4xgYu0L72m20XS0L3p74qByM4gFix45Id7ZQf3 +/WfAAKIAjnOwFOmRsCu9Jl8qluJBFWeSLJE0AAArBAADW350mtbb9WAsT9G1 +78UFWqwPuofyQhMRXtf2025zl0iJpHL5poWGIYh8hMl4jKlMwvDJO8OufBy3 +diz5BAhN1iajunxp3nI5pjUW4b/TkIV9pJf660Icj6arHVPjauFUeEXzeZ2Q ++yAX/aZ7HgJBGpARFqMcwfjNfd1iTIa123BmXqQuxLlw5SAmXMoxyoL00Lih +BHV3EImUcG5hWdgzZBfbxSXjlAMntKik8Yahb4W/JJIfwQQINjj8i/0CN+9R +hBCFIDp6QswKO+a7DIBI/JBuEPxJ2pimgr6PTcVqBmWNgJSxDTcNy1I5anpT +ObmBz1YXRdeRs4V43MyNrekg7Bfh3SvNGS65T1IWyhItLAvWFrXXE/P15pkA +Tj7qlUHFSqo/Q67VMFsGe0aWdTZwt+SwtbCTA9cCYpbDRbSmt1ZU8w6GnG4D +gOkeoSNnvxiEHgczO5vu2NlaIs3bHzZENPYR19FyHLjMLxNWN1zlkFTi7ErN +uXVY9u9SLnUoqr8h8eWz96ddL2MVpTutRCOEyODk9q11wNUmXrjiJzlh2XKx +eYn7+/5VETEwivH17bDBxNZoffZ5fdITr+JIn/BVPa9Gc32xoDF737GpHLUk +uBg2KxVegHmV+ytk4Ozcm38ywM70YooiA2BmVPgaRKNU4kJx1LDbz6GUGW/3 +nvJ6iyMnDhaWWyPU4ZGR8l6okitkpkseNNcacrMMpMZ2dpGYfFeKfr93rAV6 +Mm9EaIjJlTpPdaoUcFVsO34i3uhGtGjjYi1+lysIP7xKCWAcIISEgMy/w2SF +uJVeMKRdhC2dP591DvvoHApV07BdKEZ2BNFKnuqBnaUEg+ZuJaFNC285sttc +G8xNI8lyBAz1oOqqWifBKblseyzgH52MYOj4B2LA184Tm9uVIyeKhsPhkG3X +en0JfyNuvCAitFriCnI4T6albdxsL3zDQFY1OzQEMprIp3ciPA1L+GG/0Joj +NIFE4VZwAW9jpcKPbSk3sL2mid9MQfIcO0nmKvulalIoejS0XolSZ2ZZhNMx +EngTf8YZ7srnCJdWuSGudGeLmvRTmodmoC0vZEAYnPtAzX+t/4WbVbimhEY3 +av+mXqjj5TirgSySUaOOqikymAJWz4qjEE8jrZ6qMk+65xngETvbbasmhcbr +t8rcBkiTXaPzoN0r/LC0paBaPRGs+Oyk5TIaX52qDbTMWbBzW72uteBu9aF+ +wcQv9+L/3CMW1Pewplrswqds1h+pvfhSxRvmcUYPLLI3t45qwPo1D0ytUZy8 +ciey8b4hSS0Eq2W5EC9koIfTa6WaIZ+ctbVURu3qktAn/ndXV0qgAAlCKKfC +4JzJ8niFIQGRcwin+q/L7w6Qr+K2zg9oJn+gP53iJo3JOeOfaKS3o9np10Hj +9mwM6jyEXKtkaDTU9fQoLbeB5eWGqnvndXIH5r1bPz1VeDRLskWynYG4Z8o9 +pEvXsopLEB+ktDVlbc5sqOM/A3pYfpBy0/AYVsyyXtEjv3vEW8F04sMEns2L +OGUhsLmqpI07k5syQaSHY7AfMoAn/mq2jghzaj9YKVnEuJNjBj8kIlmmZLg5 +a2dgQZOfMA8GYf78IXwZjK4KJx7i/SwXvD4Q7S+MVqBqcLkh7N3Tc2CjXCPC +WfTsZ9q5vGl3r9v9Ypk8pgTDKaY1kAOVpiQ1Bz9pZPEtl7y+d+zqwi2sZNZS +UJ1KmGPszDnZarRBDzpi24HMFvoHlXQJCGNlNB81ZqwbGZVQo7ml6IMnYeXt +sc/pi/KeCeWDr6e1+XQIvtQUX9GCqm2gtvPTaD3vHc+A/XmOoJJVRzXGAU14 +G5BP98oFebmdLVg7FDAKL0bkT1Mll0HlbPRo3yFPG7/qszCZppbM92KMThVN +SH3JE8iIcNrGjz9DPz50YL5LJJfSc7nJ+9Okf9xavYunRykyWuCOS9/aoDQO +YGkM5FMVhN4DFXeZpp3xySTznIr3nr9O4dAdhoOX5iitsloc3PJBtJ0kwdQP +9P2Dd0xCzIB/K5zvHDy+WdU5VOWp/vzoVcrbk4EKL73DBPNh3+4ioYZyHQzy +QKgACHtCd5nmVI9PceTWFpCz5AiytmR7an698t0D7kfZzhtFdOcscm2Yc7lS +jiJgJC73X9IdbBFEHO+Gs/ewyZIu3C9CGs5KSglNINkUkSLooNqYwClfPjZ+ +XLjd+Qp0JpEgWFX3rCe3ExRbGF/9J4kE6rimNg46sE/T6SF8y71G57Gtn6mf +1c2GyglWFVBB8+Lk1lL9kVGLOuFj+wEBXlMgHU2CrXWiU7EFmnJJikpJc+NS +GP8lL2iHWbabFW6obvbeDV9UgO2oPIcfseyWbk9mdQyA6twHCACEC+sYAz7/ +pfwZ7yvboRFcOGYJN+9UKClj/BYCZWATf8wnzGsFIyMaEzdd3jbKXku4VDmE +84G5I5d+qj67609JekGLL92b+8go0HCStnVJcIwRFlsl0IyICagF5i3foW3u +v9K81YdEvOsEtEWk0UYohftx7qmtuxI0fSwHIG89DDJefPV05JjQK4yPi0gY +Wanq0PtL6l0zF36yz2q/vbAFI4LProNk6CNOkkgTT0HMH3r5GP+2nsb4PcjT +ecraDoqsLIpOAopW7emBy3KSiYSrMrXKCyaAfRIPZfpXIU55MZ1TdDsVL602 +Hk+KqKEZ6No2ztMDx0V+Xz8VCcCfLV5ePUMgSB85195hZihk3rxIHY9YULO9 +382/efcUSJVkbNF5U50U+F9w697tb7OUZkT3UoVJ86GZvW62yN7uxfWuhGwc ++NfoqbSsW9EAAICOaE6D3ISX1zrXmb+ymaOFqDc4MfuF4EOEvjhoFHeDMUN+ +qOk+axrVI4zljO7zwPtkKsnbKB7Z8A1dnzjwAFcXpg436RtKx2lRdoqqIYEc +Y0bpnLxhbbJysKA73G3wjZXhSmwlojdC8VHhzNpArs6GT6JTlWXmRMh8Owgm ++pc5NUKK0lbKrtLkup8lJMXK/dFvrRGaplism1MrhkHeU35BwjSGBS35iool +UXTvLnEvtGTT0YuwnEUKmv48Ts4iHi2bg/gu9emP8FD7Gh7IDiqsojk3QyOB +RzWvZm9rNqw5bjL+Bjz4Ma5d4b5fRk0qfTGqKdtker7vgvNNnT/X+NHY6whl +nY2hy24iGMg8d/mUx8tx/Jirj1zX0Axsg6QBY1O0DnL7PGFiSj2V25hgzRm7 +Q3wRG799RTHV9gSGI4xMPIQpsi/Q+gRc2YWcDOt/Zln5RkXlq7qTTpuHodQc +Lh7v50GlGPjR5FA+1lDXMtDPvwIu5TE9UZKzNOlTQTGnW4DvK4Cw4qEO1VRD +NQKXOuLNlI4IpuUn5QD3KmCLzKmNPDvvXVfZmBGnJ0NOabc1/E/PcfatYe3P +q3Cy34UjZRIXuGuchCcIC61v4eTMeB6reDoLsagAeQJGiFZxHnKHJoVEcEsF +emXjLFoyArahNKcUhXMw62LzNWVkcQovgQwpxcWTGE8tq5XTm1E75cxwHLgK +L/YZHu3yZU17hEh0D0bSHRYS9cICD1cXsPJWJKrpUMS6MYrdngm/lXD7oYJV +ayC9uASnU08tT3sGaIl5pUIfHfIWcDnrthdk5PEwvNVuHYCUVLslxwRdXOwH +35c5xm5ib6eT7DbEKCFfHdjN/GvxX6xxf/Wl6KE0ry1e8L/tAe3tLlGBtMRf +h4g7RAREdBnCcFAsIMq2h27cNPmVqbXh5/Lt+nnxvVfkNNHxydEPP+DplnnC +Y0hX3FICmXLhXY3R9SWSh/wzTxuuFAujTzbM8szhKff243mrYVrq+ss6YIS/ +RxiUdwNbr8/HR2A94rHl4perDucKyLf1W33JyLfdKqZ2nYTxpB/PQ9U34sji +eggQEYRoDU9L8KlZgQo6fUWXxjJf2ZjHKGFZb5TZa0HQT7TGgteVBq3zRD4f +7Hcd1gL407x7YlO+8OxUVxiWTn2WG2zwqMYmPjP4SXnPp9c66bZ4fEp1tXPq ++2haWrIpCanz5ykLEWAdcfs/ub8xTPriWZDqwSuGfxXpUW8LleP0S8YpN3xI +mjMpGU4bwux++5anoo+nzWvOt97JzS6WqKLigWQIc93E80NQai/L9Bjhy+z0 +WdVeO/FR2/qTkKvsVgtzCfBht6d7h8RDN7Q6mab3ds9OVRcpHNTV8rZ/wT+S +Xx4OVRqGnny/6dzwyekehvbYSnc0XTGOvGY/u9RINugB3LsPNeV3CDzNy4pD +sk30FMv+NfJyiJ9X0bRGuSVjhwP45q+7sOHbCFf8su21k3RQvkz8yy28Usen +nEiwgK3g7rryeMBVFgxfpMrLIBZk4mBq+962DbbPZvttq1y8yHTCk/7qH/Nz +GNUM9c6Dkde1eqkViKYukkrKfj9X81m5gCU5tzSJ4XyMSohy9GjjHXxbaxDo +kEtCAk+JkdcyNOmudBWNYAdExJuGvXJ6tSHYR0jG2cBha1iy6z74rXulgU/5 +fiDsKv6caFEZJYb4vugBOPiSSGCFcy7qPNjBRhqJCqCpTI9r5LDa+Nd5RGTW +L+q6pIRTUgNsbuiJpyLjYZbyS2sfVODTTTMCT1NOHJQdAvbSwz+MwQ+GWbss +0rHrYRjbpnMQ1rwYBDOdwoBAepf3TiuChinz0Oi9NZ5xWQlCTv4wnvIeseLp +JbfvjuW150Hkt42NGlaA9JW7t9cAPD4yOyRqUcUaJCqFfJwkHIIBEY4Jkk6u ++M+tN54mlWmuilAiL2N76c0RfaRmEih7D37hj0jfBHhAAZSJ+dyuvQCdoo4a +aa8iOK5eoZETl+5DbIzt82pCcQG/uRaAtcG4o5i4RO71/JJuCIJ20WOt6yya +YNFL6f7pu4yoJhDn03nsMo9JoV/qMmzLjXjWLpr9TB4pzmV+OXwN2zX67RT7 +Q4TVij4xJ2GBEHsyy7f9FndI3zHVVleMAlOdDK4qX0a9M6zmOjA/STUrgDZY +LkdOfW6a+6COxid7BaBStqiaiHjNf2j/WjmODgPMYr/us2OK8fWJCcELSWEy +zggWMQAGnS6o2rhewyUXwdyT3HLmoRXu3e/Pn4XYQz4hEO9KI+qRPheGGemT +VRoipliVi9tzHwZ1t/vpwEfkto7mfiEMXc8/J5mxdao4Pz6A6JXNND2kURaa +cXpVu0Dm1MOKuOzOob40HSCr95AGvqLXb5E5747Um9mVZgQAAeNdnvfu6nap +lWVF2loqhW2tucXol9y+TEBJlrc94ObmNXilKt7PhVT5coCwuY/8R+Xdyjdi +tfbtDNBydrvJ9DfGwxoSDRPwk0A4J6sXum6H3V/GNWXVmJbtcw9FWjyZaNv/ +PgGnUSPUGLC+6bnzxTLzKAWuMrlj9Gtoe7oG2pA8n4DtOLZre9EqT8NiOPdW +7v+Xt8XYKNX7QkP3z3B7aOiGydR0tBoUOPAI89uMFMG/aeVjkYcxKrHDgeox +VgTtHUTqUk4F9VdFz+jL5bCIfPdOb08Ge12ztPby65wlV+ltmWSsSm1So+K5 +raB0IMqSXRTelipqW5tF0gcoEb0ooEhRdRkWCI+m+cBYuiLSikEhY0Ww7cFV +VNFt91lF4S2Lsq6+nNbZ7D6UZtw9Y9pEEW5s5EI3uDCOK4kTs9/BIoYJrOEq +bX4kph4M0G5R4Df0TJa5F9zHhXvpMAGXF7Db3WHm8wUVA/b1pELSQOqXRdPe +zt6hEQNkdtoxymetqhGHgwOBC6GXusoVL1e0UwgAozALa4lU+3wZFSX0TtlI +n+y92pduYNMOUCnqsJwq4PnNSSfnpOvN1Kr9lXg+1pO+/w1AE8BEdLgvS7ZP +DFJFnHOhxvNoR86AY+ZnqPUXeMYeay9bBAnMWFX4Z29lHLhDLBmSl+l1kdwm +IzSr9KCPaZu5ZiKu/eclfQEpP40Us7dU6LoH7DvUXTP/mq+qiJFpGOjazDKa +YJDsI6k80Szhkb+Ououk0SSegyk1DVL74sDnLOzOAk1DFE9oMzgp8uNxzUsc +nw1fwDxmU33qTUlkjrLtf3q723jp00dj6G5cf/q6IGqNk/ybAP7yl9J7Q530 +62C0eqp7FugZiOcrwhOnsA8HPGuww+VhmqYJhbMUYQOmeNMLjETcBNZRLIfd +LX3KiYRSXZJeMWX/CwaU4mZFnYhiIIk9a4BVOD5F2OlIUfFPkEKKrHuaaNLn +MtHeUy0LjPddK5WO3o1UlExgsiz3UGuxlRK8jbLPnTisVckwzSlVvxBpX3of +alZzOcIX88sWquxOLPBI+mDSpVZ174cfZ8TkoZ3x2R/21+uL+u76+7qsBeqr +5njtc0ww1prNPJbL+jvtQ2HJqIUXMLmTr+j2+EPDcQbuFduUBFhWFgk/ZQiP +zdkpp+SyBopjqxN0p5WFax+Lc7iMjbnPpqyVtE6C02EMFP63h/vxMrq1iz+j +vzUrZqj4qWlHCx4C0ENkwUaPiYtzrlXFXhpj+UvVkuxWUkRPdRwYDs6vGHG1 +DWTEpWB70ekyNd4Pyp6vqTxyhR+eCWeNOXNIoivfTgVizJP/gw+kiHmev134 +NgOGzfxRkBYGI4nVCmC8LuD3kzg+k9uFKyZpY5zkhCvf8YoMT+RB4ltn9EVf +TfbCsK9GXpByWM6z8RoYITvA+uJEDFb6+O4QED/oyKM/YcxetxPziaPMzheo +3/AkUtcJU/pnpJviKwTikHqAeENsIqNJcHgw3m3elD9q3eF+2i+JDms9kLEn +b68CSx8C0herrp8q9uD000MS+S2BAzM0nY7k4R3HQRJ+zFpPTEUyfHrP9sz0 +iAWYfAQYk5JYTOTmFmSPg8Q13OYUoEduEWAY3llEDG3lDicNCysoeoC1sT1J +uMBe3EHRaRTVPIQY12rfDX9+W9H1Eoe7ovPRtbbJtsANxHeo2bw2x/ZlVPgq +4CHMcErGBoXvPPRIobDpG4YRaq0XxaF68elSUvNQSi5EJ9bAo1xvufIBdI7T +cQYji6ELeU1iiaulCr/83M1sYD0wPd/6R8Tcvb2VEXSTW/zNUiTwQedArgKr +kGrzaERV3txh6U3UalxvLO3kuCy1YzVoP+EEtGUTyVLhSg9lMfTQ5jm0wOSG +PGhvi3i8cdT8ZvjVTJythbsrtfOR9xnjfklT05iTxsBZEvKPD3/zOPJNS/jE +AZ4OTyIQbay9VXyCtejNB9Q7cEtjK4Q7OGVsG3GPpubVnXjh7UMHheB3gjcL +YLp6tNebUj4XC3qKKXuqwDG1suWJCrtq+cO/+lDfljfX3HKaPEu6IIu5+wzB +zhsIoAoP1Lpnx4RGcXE6XVACjTfDPj9dkHYuDGRc8HxispOdyZ5RcbpiiVkC +G/hgjjivx8ZZUsBTBCcPWNpp+TfQMjjCoFc12daqvR1CVY8TBur82MPapecV +s4BEnnS3odi7O5rsdbCCuXmRhDRLwXlycGQAqLE5Wluu1KRgvYB5+xhTXxQn +/FneGrqNueqiSyCWTKO24HW00HU1JYggCbyJZvEg+ZTlfRCS8e5OpeCXYbPS +GhJL+zZCtQjKxDPG/QkaBi09C6NJixyytW6W/X4dpL1BIrI8ZtFlsCBQJyG+ +2IFUsSoPhjCWMHoBfJp6EikVS+eDtOJ2Z3Is+ZnFbk3dKO1bda8M491YkySb +DHV+eGyzmYlfVBbraEr0p+vKOsasLtDbsWkNt+uSG17pxGnNb8vugpOd8REo +LNFAImc6i1sKh3xeD3BUOZ2jIkyTD8iNlcN12nOEeiy7Xsvc0SF5Z5pGrS+O +CUYYTTcrnO5yaifK/y6LIyVjBlX7bBq7tzKuac77zj/tOv0xmSWBCOd5kozv +bj/v+vyG5VUrjVl7qwQWjUPb09SZh/odN2gE/67HdBKETUfVhzXTGcuRy932 +2SWJ/qMpr960ZsFchsILijmVcNyq+MDd3wkJmtD5om6N5mBrCdUmttzl/V0n +7f0MJrZtorhElG2GtPWZaRIh461r2hj/ZE0wthye7JtpjSGB7PVKKCwavGjV +hlCuGRUFbe+qlOlrSHs7g3qPD/dFrlc6TV3niql3ddS8zjYmLuQO7hX60rS3 +AePgXJ0IOsi7Yd5/qk37iLl2GZ6aKzfpzoxHDe/27kPBjQZRL81EmSGQ2xNO +CXZ5SHqstxcg+fHhVRqP3eBQqT0+FySf3KdTZFgqaUd8Wfdnf2tAAsiTHIfL ++aZzP25uy+wc+khSmJFFeVUOxziANex4tTqJSGHTEFuizbbpA4qvzYfEPszi +A4RnwtzhXDNZNM7wtolKdOO8fxOBNDbaR3/IpPy5ZbLASQ5Et1vDsOXUVjNZ +ufLfU210WbKv6gADvDQvvKHEvJsSnc11Bdnpf0ht8RIw3YSTzVAAGYgZ9Lcq +q1CKJbUwWmqtTZnV6In/e8ALlxtsRInBLdr+K7J9UYvjx1UWSaT+IEat/Q5A +HvPAYvgPNrtLd86zv+QeK3QL+Lceb6g26pTObt5UGiU8fvjdDhwySF+QBBXA +CQk8WXi4GoUpy/MCfbDP0nUfWT1W7FEz/B4OCHi4P7d7ja+bN21yFs4e1c4M +Ay1sVd+ilv7FBeuKavUs8eTMvHkuZUNsWDDa1nm7SqN2RnmCs9pjjh0Pd6Yn +IXZltmxNJOKB1hJNmTYvbWHigEKWd3h17GtvFnSz3SJTVPKrDsf704iyz75h +veZhXqeEpur0IwjytVVO/N9Zv4W/TERS62Wdt/xwwDW6bcjGa1gti4vZTdLX +TKa5x0f+VjXGFRZAGc12UUElZyN9pKk9gmlnPTm4TIsMjSzD3hYQsSr9cL2H +QfdyH3ddTU20xaVBOBfacFY3ynRPTqK/VL6QiYs1/2kGDQR8anUY2GlPfIhi +jg8pENDarAfWJmTQ9CUHEyROd/tHnM5maBVY77r/1b3wvFlwwnq86thBjUv6 +Z4Rs+Pa5aCQ5k3d/Uz+32iNXZjVcP/G+Hk5P+OkYeNK8nv5aeZnXXbezDGwu +pD7q1z96EwJtw1L9RRsJAtNVlrNFSjPgTerO5e/lCicHiQlexw+uxVxDaVQS +XDn0rEWqUZlwJagdnEzIIzIPwY3NGfjTM2/++EPZZ97XVgy++Qz8UlTo9nWY +P3ES7ljl/20RV8O8QJbsHlRH0B13a27a7zDDX6GYDtOW9Pi3PZSBC66r0QXE +8qrEaWPAq1LkLMextC6G5QXGuQFe8L+34MZkvhy7PytDCofri2x9g9Pq1C4i +VavXsHWcLVjJzbrbpLuUzLgXSTixL3XsTnffQTW6G5v+xMoaZPhnASdgG5Di +n8rrFZPImuqNoN1fIv4LY6yY1Knj7UlEWT502vnqKWE2XC2fLjZVkqPhmf66 +XH+Q821snbqUn7spqWFqwjBjG472kVz9qUUnynp1VMMr10m2itiLKukRHGiK +HRZjTkZHOF2CCm+657N5qXTyvtfRFO8XkopXbzwBHzgAPA+mZgtqISb28O5v +x71Cdgn5TaIgof67dSBsFoSK5kJzCwKpr9E4t7zEiz0V0XY/BlUB+9x1cV1O +69uJJuSsXRyD/Qj6vZ2gEmq1x4NPABLx58IMUewRiLebBV8gAAk1bIBo7g1c +goVbmvhLdzENJP4X8cRA2S/WIIO+D0rrxLyFo7NQb5ijVDyTJ4cxl9DIvcol +GisBRDHIyO9M7qRpYRl7wwfD9hBcOofDAVXyAhK9x3tOjnzEtgI5Ad/41+cS +VIfofKYaXgeJvlWbc16gyuE5nLNgwOa9WQ3z7hNaFEGfaKy/78M3cNGMeg23 +vfw/q475rtarmm4/cfYyMnxGiJ/5jUQm6Xg98DbG0hKEOoqjYjeT1oB/ezX1 +idlM7qUIE3nv4dQ00Xe+7/+fb4oJGDaup7ZI1NP7dx2zvsCD9i/ruGMjlhu5 +6l0MKBaP+YDUlboMe+N4mYazj7XSVlv0vvPkVb+r/VqWz7nqRAWF5Y5yQE+O +hX6CtkqT9CMU0QK49HS60TiY7BTbvslKxCLelzJ+cKgsq8u8fE6FdDj6GolK +abVIT84pxqD+moPlSOoxhemEX8t58YCV56EiMaUCGWuv3PradEqJers5FTdR +UibGQhsUg60617NO0I4d3C9PgKFkTXH7Rcu19IwfpffCgp/YUydL2Vuaj8TC +Jltd9r34wFGTr9SOQ6YskAuEZO+ZqXLkRMxiMSJjNrHS1az3XGwutijLbJmm +mdqaIpzDi5ROD1o6hYg4UMNCCPRWa+MxqEphi/ekWSrTEaSIWqcRfW+4dsWv +5AlapfTukxgSa+aV4xF9nsngEmiZUn0KWSz3ITfvDyg7/0VuEct5cYoejP3W +1UgVtcNn9RJh2Xa+9VBB3a57Im33C9hhaORoIQlrD12s+cWS9SDtVl6F9vtI +x1doprxWAtYuyxJPaMHdYdt8ZSMn4ivJeiUy7Ibt5UZ3MeFyxVjI3NR2ORsN +Yialow422zBPWYkotLOiUvFEcJxT4aU5TPcHpNpS6Kxgej62+KN9iV1YAyEz +lSyn8IS65zplIdV1cZZjnAoFOn00+CDPE3JTi2qjnvAruWX5l92OsLEw8iE6 +i8Ho+izLK8i1j3/h952bo4C81/Elp9AYGRpmH5pbyfxJmFN3gcYj3HswfRt4 +5Z0l7P8O5PIFIN1vzKpaqQ+V7uG0ppdQmuc9p5d9pmluAQthefEuDXibH5ec +Vel9ly22FMZ8eeVN4dWXl70oneGxdxr8g29qZVynKtlWXVnD0kZbm5WwKrWM +8SbzEbiWMEx8+3nYwk2sQZVUwN5SyFKUg3DOgJSHY85KAxGNblThcR64sc37 +VcvDMs+HcHV8yMJfji6/aGp30ttcyo4gGPB3ilRx43lsIqygRqhbHrwVNRV+ +we+wWqVkKy8beD26hF+MnT4za+M1GroU+9hf1fYbSz1MPJdJInQznm3epG68 +bRdpJJWfKabb69Aanohi2KnWRraXs6HVA8dFLffnu4Ln7I99852wn/z1irHl +Dpfba0eHk+StmB/SeKu3qogwCn0ikA1VYnEm4ZSaTsoLh1/9YpARlEWu0SEx +Oxp7pwYoajYZxPhvk1g4guxCKq94J5wT9vlr31itrhpj8tP3Q8TM81NVhSa1 +/6sO4JCyb4DxX10LBf7Er3Gq351eziwZkmbwtGAKy2aBMSadCWQcKz+TF+PV +my0aq+97yqEPseXNO1d1Al6lo/WlNgcXJWOeTAQH1XDP+kFzgWW63qekoXBL +WlQdyJjHixNe/FPtwzY6fX8q88e/Oh4+0M67x07HkY7PSIjgocTEzdeki45z +LH4AunRueyIV6P2mKfZhxPC02ciOwEHrvppcqjPlwhg8Tc+VJpeuHiaBN8ht +/H/K1329mtyvr1O8OOTINFCrxfjX0HJd/P9ewM8uqf4myO+b8DceyjPlIVx0 +I7Fc0EtuYFNQAnMXAtldMsj4+BnqvN5l6eZKEZuSZit5OrP16wO9g9Ndj8ob +qPwbWovKX6GfUNGiHbpjTR1N4Y6D+q+Dc5cz+9rf7/X7qHsfJMGnOokRBaBL +9Wu6m55CBrhGnfTQaXaobd1qa+RqjCwsogi6ubEYxImyDW+Ss4Q7aMdYQUSb +cwDNVrYMBnW9MnGs1MqJ00NM310XTxrUgY1BZSN/J0fJUU1ovF3OUKQZrQLs +i90DtA7h97DlAPqhzNTfI5/GeOPQ9JvmvU6FiaLWvD1+SynAh2du3ra1RGgo +V/ldfSX57aXuTub2bXYpurPEo0p5bMXykpgzVrYJFjgY9KDDZ9Gp5b1O4jG9 +1Me453nrwvZjj3On5+SmL72/2SAIcO0Ci3FWgVKNl2fyYvvryaBpqyZx8syq +jbPBse4DxV3Qg11TxXHifb0akFcH1ItfvgcSx2SbAKxcvkbiDwhyDjrP7Xmj +HrTYxsMqLIsSrp5wZQxTLssXRb59IPpGPi1YY/6RdNd+ywsx/HUNlzZoJb36 +pSSjAxvqpbG6k/jJIUmJ5wO2sMscymm8hDdxReY/cupoPMKlwyHu681KjXwr +Y2rWBaRvnpz/l+HMe+mjYUBtNA9IClvaCrZlkVgUgqHf+XEuf3CoCAnBNNFq +utvaa3EwxNXbfGyekdRZXEM8dZammwN7m/eTl/09SClINU03XSZ/i4UOdzyd +NxbRVF0U6RXmyKX0jCLyKxEpH81wKpCezvgg9Nnu0Bpzpyiss9j3jFcWZ1cH +McTiBBx/e7Y1OxPF+erqAuLrWsb3au5fi6HhYIej95hBlRYNBYIjJ4hXXY6D +Ak0ls6lcMGY/Z8Vu6fsTDVp37vPBaWJmZBT6L9P4zlSXkamxn6CPyftMW+KG +rb5BIDBEKVvi1kAi0j+TNnzl6n1SitSvsWh9zRejubgtBqqJ7DZLfTKJnCbf +UQtaS1ttQaUDYZOqwO5oBF+zU6Pofyw/nUEhL2VeKwMxTIoPi0IEUsFhRNWF +hn4e/RqseP4bTq21S5njScQExqZxoyVY6KSG6Digo+nq/4fpQ0dS4yq19oyP +59WjJQDuY7HZy8tCMQjUjnEkBm2HsQrkegCixO2Vh08PLeuebFjKsIrHLlzN +1YnNJ57pV+qk1bsTATCeyBWt5sHsrVdqLjyXxcQyaeJqBmeIx3ftyDC0F3TH +/YYnXSromW4ZVcY9DF978j91xQY1fKoLZV+3rDSVT5CphB4jwidyjPIEdlT0 +JED7Z0M1ZRxHCR9DLjVfEK7rDDc8CMr0dDJSwCBHu3O8ky9+2bl0+ZboEzTE +ikryhNV6uJEbb6rPfcqR3InvD4xmaWsr9Zua7KVDm84JN4Q+Cg4c32z1TAo5 +Vz5fwls2ugp02j5deeBR3mV+oM18KQGeFKBMq6x/zkiTpkpR/V7HmUS9sQKa +1CVmv0yVlU0H9bPWL7WCMc/9GE859q4kjq69ZeDdNZ8Ucys1OrbONSAT2IlM +YMhe3LqgAIkCXo0aUG5qn7gjqC5eOkyQDomwP9lCGVQXWBX0Mb9xiGuDgm1t +pSXSZtqkH6SYkeAIy+sd/rskOgiAhkNBy4WdjE3AkkM9xMuTPZ7YFVmGiBA0 +SVxg/9AbhxdmJUq5fwuvTab/FAA4gVECSicB7BgBHu6rplwN7siVcycYCfRs +I2fXN0+8itDqzN0vt9Gn04zfPzmJUh+UeyV1TO6JHmjWIjqXgwT3Mq6WZQNo ++gn+TRVPv4vmY9czkX8iKW5AAwZJQqrpTeaYfeOExogGiH/0pF9MLYJyxBtc +4FXZpFRKNtmal3XZYyNYilaDMpdeFRRfzKtHX7r+6ljO901opEUvFrdTbbMS +1GAiC322u8lCuXs+e1eEZLFFy7sn5XRwJu2pr+s5+0b472MVbRq2K2Ykp/V5 +a80wQ/mf8DPgV3dhC0CeG1e1R2sxc8UmSoDRt+CHTr6VUvYIRAA/RBAA7/j8 +XXmlHyTPY6WVzvGG36m+wDOjqfBz9ouyv31fjD/V83wYVcyF+4QEb7u9wk2J +o7mNxZja31oYvw7mcNGTIKcxvFTJY9dZucIVIEDA0FRy/C/uY+2GXWcNduK8 +ce95p317IJL3TBlOZmi+azeY5qHalWLfQpM5I3ZBMFeRMapFBWiKmbh3B+me +tMmq1XJPx89SJ7/HEktJg38iWN9c5+tKx7enkeepu2rz5JXqZcQLhfX5EV7g +u6i1q/8/unVbthhUxEZkT8q3fltgLr7WjD1N0a8GwQs+H9n/d0YVB4/R/Vh+ +rqiqkWFhQmLRnbdzc1zFxZ6M623YGlxnrOK+trSvawaShW+SgFgEIB6gfd5a +o3QLp8JAAdeFwMA4KS/++IZwl+rgu5bmYpwiwlDuIGM1i6aflVU2SUTtLwp5 +3qZoQLCp1oBIgom+pJ00EXL2xn+qWIZ4EwFiD4bx5XARp7c7rZcsTkiW8uE+ ++7En0N4o6Q6NM+BCx93P8VfXCsKATkRUdTex9LvAIyTHN9tfokgAyZHn8+b7 +Dc4Q0O1bpsOjG9asDXIfmm5pccJSv2mYecvbr1tFUdrIRNXpdveb1L99RbHx +IHFoz9FWbfNOZTC1YLdHEDYabK5eZq38gpLHO/lqCwylSlywoasDsEZYcnbj +f5CnttVo5H/S59xqrUGolwOhtMJMvkV3V2eThp2/M/FVW64l+gaUZ6z25pop +1zucJUDVcxe3i9hPrhK0dhCtr9tTUxgIhM5pqyOZjkzmzw5hGgJv5owzf53P +JxPxiqwc1rnQ5hzbNi6StTeKsOFlz9BQsJYrSfll82tJwpU5reaTa5Bpqmkc +JBnk6XChWnQtI7SeJXOcmrDXC1euG2wjCZZgSW/hqTOhcpazOok76RWl4iI+ +uMFDmLUnJEvT4nQgTmGonC3nvFQB8BDNAU6MgAqpflZfyut35NWxBybpYYPU +s0/FdUPuMClf6IRh2dlEkLu/GD2BKcxkyEMVS61Jpvp07OgddpBWVa3cR4W3 +l3+2F4JGU35DQCY6ysxioXIHmKlFOxJ3R6J5uJR5GAGw67J2rsqg9s3LOOp6 +7Tlebn+8T2s6phN3tl4WP/FIdbkjT+ckZjD3HP5p70qboWpDT/8C5Xym7Prj +5Nli8F0905g10MSPUwbelc107q8gJyWsOu4oyUsj3ZNb4lre79KXFCGqmxqr +g9rd6ptm+azTx4X89Q9J0VLKjO6LEvl98tDWzNH7CWErm3X5Fckt2VT+sloP +J9BTNk9Q0oZ7BintrdFs7SBW+dVV5l8d2dRMBhZgYAyVW1fRluaPYPui2cND +0unmMeqwitVLKwXGG2UfL7So9/811jiGD2b616ZODEIqP8KLm9DmsKCF/Iqv +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 +6GCZNVdRdOrsFKaNbXVGGvDWMKKSkn8LS9WUjyh5MTMT7sv72PJxqNMcV6Xs +/arfviXdJCnpBCvwZY/Ru6UaUcYWYxsZm+upSZL4aVlaQNJBshHdEzuXm/h4 +rMNNFYVYMa1BXLWlMVk/4kMLdh+OZgFa25waB0TV8gfBPocAy5sR/o9vJ+1b +HqdHADcHKpEWjJaWgiNKKrv/Jy06/NTqpmdA4LJG4PqbNp+JieOKSxdVb9Ku +C0dRyX/wHNCNJN4Ftj9ka/0lFQG0/5VrTnjV9bHXKgGAFR4G6ETJHJUACriz +y0SmO25sbct6o8adM2z5oz3fhZCj4HGPj33OpCh0IRMW4KYzVA7IOSq2oZhI +4qxieAA2+bTaEx0qyL9ciIT7MZ1bZuQbxKcUGozfCuTatFo1TtnOdxHiJ3Bz +VunQ9o7YVkwLxg6sL50zaJSSFlWAN8bouNzAW42040DkiEqDe91m4FUrLo8j +qWU18g+2lWFCe63BqZP0yDma5SheGvnfdmpvEYAEB5xOliTLCVRazM5h1l+m +0uErJJ0GH4NVjPMeMnBDxGZ6KIGMyk/F/xN8AN9e5bnMDzMLXANMjXzdoI5Y +fH2evDrftpVYjDIAuWthq/gfCR/471oKhW3wyhmiumqKkzZskPNW4ChsQGF8 +uHN7+mbjrW+fqMbhLE/3FAnXV+GYOvmSvieKXzrU6vnhtvIDmy+pof+mQ+Nt +c2SO5I8YI57puIMy4f9GPxX+N2cYeJalfnobuqWzl0IwO7qYiqYYa101OZnO +3qFs1H3p4tYYjOiqJWd/t8I6UyLBXRqWqr6S7ddfxdACXYjsmRIiq9ItQmPB +3fJMCHsjYnMXXCx1iXSX69lr5eL3+JbGd1zlpVPueBsbn0k66HmXVW3vltBd +BeM5yWXhkyP90URUbgcS5xggfno2pbl1i2p1rorxXVoG3iu9gRo2FHVfeEUz +h1S9++uUIl6TTAZDppCzok39ueEUc0sXNjvECM8TXeYiYNSOzKstmj6rSwgx +cc9RpXY6ddZVvzWNfYSJX16EefmlPWh38iHr6ieZuUBZEMRPrMz97QIapha3 +JqPqTYdx+4RxR47iGiGC1Rl6WQMnfCzKFklPwczpbCNnLqJkS+jnMXAjToDj +TNMcKII6y9SOcvUNqknpwawsV24lZ4XL9MduvyXqeoY36aamyohNn9S74EKO +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 +t0ccLk3QPBinNdr7MQhNznK449D0+KT3Q9un4rNbV81JV0yXGOFE3ItPji2Y +GPNCQRH96TyW2hkOyd3w2bYjvqoyf9P77va4uE84U4GTTLOrxAa4xKk29bwK +DnJ17czD6TvxXjmffqlxHpEHxScW04y+raX0/5vV3sLNLrrNTCuNVnUkJLGH +HxrVNYCqDTnCVgsFmljvJT4ia0HQuVzi4HW0U9teuy/L4pPzl25C1ytKa2CM +BpgERIAgJBAIAlJ8FLg/QBH/+YoKyTKaye93l2gIV0P///////////////// +////////////////////////////D42zhvvo7Z4txx3XqAH1UlStjQolAqpK +qBElJZdfPvXnDpsd8fAoFUkqpSJIKlUEJEiClJKUUqqVFEqKQIoAD3kXmg+A +UKpdNbucbrugAAIDmG7o7ddcrVO2wBQCmtNFADToOgOnYADAKABbAAAFGgAo +AAAHToHvlVVvvZ9Dd1PTXeAxdA0AAAAA9h3vjxw6TOqFIKz70qA+mk21T76l +JXAB2fOx5vTe3TvFUR9mS++B6PgBX0AT6n33Hn3ewvh98PVAe+s9t6S8bFWo +PBX2Aj3u9956B77M5tjKDvqq+56PuYUAHR94Ht9e5BKgADW3R3X0AB7p51B6 +AN68u0NAJhtegBjm3sAGOV3egPHie4DHLngAI+PPM97Vcet99AaNqmoig33C +zB11DFHPrAB0AClAAA2Hx7B6A7gzlVR600VobWmYAAUVLX2stpFdA0ACe+iA +pJVGWKqS3vcHr3XOklJuuHIqVURz0GOpVUl6euLvTdCJSZYqtjIVPe93qve8 +cTtnF13olJKRUQkpFIbZSVXncHFPu9nwSg3uwB7YFPQABWuVtszoZVoanWlu +67uyWrmd75JBufPgaoAb669o9u7ocVVQNt13O6hZ1EduffLfXvZ309dbtdLG +g3303023x9rSrWrswIo7CWhnz63AF9bPmdktrNSAefd98Kbb7GpKUiG7tzuG +UQ7MKWPXvaqiW2vAFu2h01sGWqIEaVJ3A3W7dTRbbz5vCr773e8t5rKznbvP +vdTXhOyNre9Tzy89OcDQbPPdaqvfXz7mNVdk1wcdxoLbIU2MLt98EU+e4774 +vfN33blWhtrAyL2O33xfer6Vh9zOtLo0PPr7wAqp983ZGmgpmyUqABPh9x98 +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 +MoxvGCA74OxlgAeQUCmXjufMLvC36PBFpbNXylL1v04hjMifen8/TFk7+40p +pU54vZM1pD1+n5/ZxG/z69uab2dCcLzzvHb4+L7tFk1vribxN5I0QpxJ2aK3 +5yuDYfDuP28A2OLRSvxFdh2cpetpWRYK3h9sTxJo/16ztdMDmdJeat9HaVUu +TPtn+r187e9vywMAWU99+HnA9/n0tzi5KmA2NE/Mcc64W+Et/tumlfGvpfFq +SCM+68/rq/8Dvr/1/2O5qf5LDSN5Tc971VpfNzavbpn2dut5JXeHGuYsWdQi +kEeWVc+QaO3UaSxA4JjaZq1Md3Zd+dScpL6uxUqNzEvBoiYYYZVZyVzZoFch +ptt70gi7JAWnpreXx5IEMUaX9RHecoKCyeeIO0NGD/T/ZtpPVR16lsgIgPAO +FIA5N71h6X0BhGRgp/XW/iUvPdQY0ZTme9VZJvKvBd2NPve/KpCXg0/BmsIp +YTeL873zRaHm2mn3xPSjY3d7vqI2ps7/dmx0mvv1K/AnnUEnI+TV+qntdJf8 +8KyWBx3oQJ0VtbpisRW9FKphe0EHxbP+FetB3lnFkaYr8PUYMqgeo+Vr8vIz +HNxdTmcxC8I6/kUcJ20Zw7RI+q+BIEvm1D5r37dagdMpR9ljDHMmu5LdiMDX +APVj47tmyUF05VVZGPHg6XqgdPJ9OD/Dx2ZDDxD2KpWyl8hmsBndqzUOs8EA +GEWnAjXxqrf2euXkBqI4N9MRlrwWicBfUSvfCI3olkXiettm7CAzRcHXZY7Y +mPG+cNqmo7rpbnOqo5luMt/rUFFMSiPxPmcGcqQGGrfwfN6Ul6ti0tiSHOk0 +xo6fNvHx6ylLQ7v3azHjfyxVtGm0xX675D/J/TwSblfT/X/PQFuXRnSVGS5H +EFnU2Hxc2tjZ8Uf4q73KUex1p/TCzFAovaww1xvUXtBtGnhqEnVBBK0A+9oD +2wi3+8Hb5+odi+PSZ8NdDRlM2bmR2RZnGpxiG2dX7cgrAdIpLPjSop585BrC +xosuxMonX3HMqyzvkhGKG9sE7F7DCrPnNtLj6NesfI/ijPnfnuTrQOocyyqM +j3oaXHBs/uqg3WeXT1YPd3WifLCeJJ6BoN85SlIeDLV0Vt51Wvz9maeCowR7 +60qagQ5mnOeHNkzBYKeeLWuPMT/6dTd3BcSlJ43Z2r+MpbWJYl6Pf1v1JSKE +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 +5DXzftfqBVbNd6+yTWTPdJSj53H16AOVYXvfW2ItPZ/GkWOZ526z8GfvU+JY +coxf50lE9q+N5ZS4D9Or+giqcSKeB4oWCiZP5/8ssn4llnKmDkUcQ+J3+BQJ +tNaBTMFSPHlOlUFX5jeqkiI0hcIjktxjkS6Ke1tz0kTAVIHx/Kjf5Uiy5sf8 +EsTA3LdKJHmqt8kqI2Lp657oa4E6WZe33xALRd4zWc4AfgM3D0RYCiikw4EA +UBPNf8gKF/26qIj7yFZ/1hX/2Ph+lzN+kxdu9KCryW4N3/F46J/P94Zmzev4 +du1VHwfI9/twx52HfqQf4V1Xd+LkGhKl58jEMwXiEMQnG+xuiKeebpnaQoHV +1I9H8KB+lwy9mSr/y4+MvfLzfP8szl4zi16uMpmZpYJGxvEYqzmsXtmrXGMd +nEFinVc0keURTu9Q1U5kk7SU4SXzKSbJJoQhDQhd/pSEkWQJGUhC1fjl2127 +X7Q5nr2q0YxrRnN8ZvjDwXvGiYMRgi85vLvE1FarJi85tgxnV5ejUXKvMzET +qqmomXL1mJNOLO1oqztMQOG83mcZxm+cW1eqMu06mmzWZmpvnWr9+9bbZZnv +b5AffFGCqIBA1kZEJCQoiD8kiMTEo0KtAg0TRKirvNu/ud9QO2VHbCjBB24i +4qYEDQDMjMgjEIQRNWMpiyaBWbcnhxTY1SXe3Z7vqKd2p2pDkSLYKOKSa819 +LVLy/iwRogggCAJEerJl3wBAPuKr85fX0hYWVvFYl4gAIIAwvIEw1OCOzMRA +ARF/5meexKc+Kgez+30lHDE/7/iah+967+r71+z6V/J83JepSTCSedin9srz ++ZZmTK0hNRVRIJRBNfkIKfZEp5+KenpVvQvKMlD0MkskDYQANud5NkauyO6u +pNuPOdaY5u5pTWuMd/szm3JfwvtXYT5g+iPP84fO/FfDPWr2VB65Kvc+dvM4 +KrGPndGtGtLWc5LlLRUqSbFW1iogsTYtq9ytDIvaMQZtisEutPWtEzjGslis +VMajWNU74vq7y7ZmicFX0pjN9YlrWIqDGL6rF8WwVnF76zJWLWsTVy5aMYq1 +PNs51Vrl8Z1rWtata1sYtfQ3qNPGps6i2c5vdu972xrGGp1Wr1q+DUFixBnM +RGSxiMXzbVx3LTedYvjOcEZ1MatnEZ1Fyb2ebVNr5xmLuMOMcOXrKXfqdg3l +dgqO1D0Rjr1ypTeDeYZHpUpkkd8wjMy+01DsZVseNo6evoc6t5qxVoNalY67 +r86auuCk13lE2WldX8GW8MwXXJUqWVgurpmOE+gfOijKr7oj3BhhCYgvwkTx +3jNBU1IpJJJQi6XQYP0Wx06a1aq6dOvXObWtbjocwNwBibFe99asg2ZgYBtL +KKODgq4XJIDJk2NigCc31OxZCrVrlJF2KGiC5CJYYxiL7FgFAY2rbWYm9bRj +KBRO1Wl1MxFhkEqMbRWzgvf3ShAvdhZe0cUBIxI7e0oAlCFuQI0SQiNiEjix +1Ejli91t1tN3k2octz26tFtSvJuw4tg8lvc0eEoQK13m/W3Py+0qxiADJlHV +c0QkK4GhFwOoboUcrweTb2i4gpiOD2iAXtDQT6VhLtXkOjuPpt0rLVjsTYoU +GVzSWp6pWPJB2JLnteyuVcufBpe5heumklyDBYybnNHQvdkHUWS5wZDBYHro +LTmYmTC2LJhZBlEqwckboylYpZVgi5irlVVVuAYyYzEuc74zsFGhKarGLm17 +zJF73sWvdzJZ0W2ZN3eJi0zOtngvosXec2KoY3DZFVFra1nWbYtgySOKknVT +cqq1e5e95kpwQ4qiaoZFMHeZJtU2FoJDQ5GELKozi461a98mNZm+b3tObZqt +kgKvq2180aLrZxiYcxVPBiMbX0y5SoysqS2wgMaLya1OpvrWdZtiXtmMam2b +zii+XbWNDFSslZGTJNqNWzqIvZSRUk1U2W15jbO1rWTsTgmHiMTfWDY0Odqv +kutEkl73xfF8pbtaUp6bupJiZNb2dXA0lfBWN7WW299UtiTNXLli7bT0yMGM +Xxi1smjNGcZoznEZvfTm2xWKe2tiQL5Imdh1JpvbWcXjLmNjUsnM61sU8ajF +76ztnZlN1kznbWtta1mTZyXDIsVs4HrVW1sRfWCxe9aw7ZyosXIzfBq9VVYe +dXHmQ0bS9qdrZo1i98VN72vFyrFX22xtra96vnN72vOxaNtsX1sWsNarG1qt +F8OCb5IJeNFFFbJoiSMsvfFtYqqbxkvq2JxNytPWL31nO19bAbEJtaJIWyqB +OFCggtERBNjONa2q+s3mzCszV7ata1jV8XLXetimFrm0bWzqtWexjDDG2diz +2vEK21SJ4iYWYxa221potiKvisXzbbWKvJQ1nWWa1VTMk2Nr3IvJUXHaaKKz +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 +mPl/C9x5/6ND1lpthvI/T9XqzVG9CnO4llQNlhfh2+00HTSFKmKmFxH1E5X7 +YEhASexRTXxoC/TrSbg4/vGJRVDCoA5h0HkGmfDYL8YxSJhW/eeUA/f+Heg+ +0a/jD4XewVs+7Udyv+hyDRIIlxV2rp8XLomWdts3q//bAeREYLusJLBml5RS +KRi6JAQjx5SpSYzrL+2chlcSGJpWWXTHLXncDkw3cBE1oRcuaBN/OCOgt/Si +HdEUecHS+XICVe5cBvgrRsCioJ/Ox0uw0PuKDytoaCmibfo+WGb9Uvcwsd/p +HOLcgkf7n639J6n6eGfSfUQ7tsvYCCBy6vai9Tev6/6D/V+x+nPyPs12J7lG +FUybzzxarZUv1gr+w6SOg4fjw46/lleeoA3TupgLewC+AgCAIEVXDBqD/aXj +6uZf2UQvjPgTdc4r4wevranEYJv8bivXvxvA0cQfIUrzZwQU1+cKoCXBCg0G +CiijEk/csfAT0C0Wo6az8gltth5huW4hXGH3MTgZUYjfeLWiw8uqiHaj9zWp +twMpjHdhsWjbttJgBWQwjsL4rINMjeOKV3dny2fJEVbYBeB6ApgXDBhiMHCD +hpkejwGgKBAcANAh6C/LfpfX3s9PO4kkgqfWiB0FjJ9YV9gHL7bPhvdR+xt8 +ne1vuLVW2q3j6CfWPn6/C7bH7XvIt5vNSp3mVHf275fd3Gx0ydrbTbjqe91b +lxj8F1oXxj6EnSZ0Pw6mb9Pf60ftj8p9X6vbaIvGA52LWWrBDtzxJyz2l+rm +tvvMkl4gtGOlR5d5c+pEDmL8j9Nzx6p6P/jRh8+csJNzfq4mIULoxuHtjjWr +ejXdWh7mEYKd2+u2ifULHd2gyHlttxVtkCKh1qUFF9zZ1k8bgVXTPr4p8n3d +kGDX6SyDHOmolchkjKanUE8XzjlywseKBIgybPufIcISYakBIPAjJyUiGE5e +PIRw8hUho4cRDAGjb5QVLPDS2BvBVfMdjXXv0boQviws/F2G111NyG+d6WEq +6frIJwwYAwBgDBgoCgKIdiiIYNQCAc6n1RUY90UYExM5dtFAlJqmddlgZKh5 +JTroeFgShmJKR1qDegSWN73hHv4H0UuvrLdxmYITxhXemkH7t4IWvMXflRd8 +aQ1pC0XN5ebV0xZE76rLSlJv1wq0klV/sOcKVPGc1bDLZoyDvdFJ7q1g5iEi +o/XI27mbmud+Ivtm1gVvFcjn5wjyUCbzfyKCtia/Qn7yNg5Pp/HCSQcjeTp4 +exWpYu7i8hzr1m89olO3Skck34pfQuhSeDeN5gYRuwbp/YIfVliAYrGPSlFE +vNgH84+t/jf2f3P0X1Hzevp/1Hv2fU/UfUU7W/QaiVCnEWtiKY8Yl1Sr/5Vi +OXdt7+c+L35N+iM4txq3S3/+Qjy6jiJRN0zxGcKER1UAcIdrJ4np5MOMR5DR +Voty6atbGx70pe+t75b/tvs635cEDRyiqUQ2VDhx+6aA1DQ6I080jNjIl7zD +r39r311mHVyCkpf3McqKnHTRYuXvJpzOJl/qY1KIeRrDnWozXMk/f/D+1/y/ +qPrfg/Pej+R8P+F9r+z9XwPOdn3RER4njPrXLq7JWKxTcHrGLhVT+T/yVtoE +RfZS159t63gRZpJBmJlAiGCM/aEn2n1Ft3nWMiy7v6HFsVaR6r25Vj3PDNuY +68u+JrEU6tv+g5meT+c/2v6nHPlyl656+2ojozs46fr+n7XY3v+b51yOAvzt +bc4v9fz+uSSQOaLWi7Oedv2H322LYOm/K3PB61iC5bzeEZuI5uOZ+IzqYIox +wuLjyHZiQg5xGsXk87sVlfMfz8Xo40w3UkFjJtXyHSM1Bowe6iTQ/svu+/1N +uQ8bZgjtyLdkJ+5wcsvsMseV6XsF8Xf1f1HMQkf4vkfp/SvTaNct7d52qbdf +lP7X0Xj+U/cf4vhv5j/Z9599/PSdx7na6Vq8gj4e41x7QW+y3zIXLZrJg8HU +pt5DTkcYMGAkDRggA9OYgBv2CSQGrRVJ6uKap6MoDx6g+Aori2zkhJvcAyga +mLwRWl2sCk592E+D8CGjEyDoHUACtx/VRZTo0E6n1fy2nO/zQOBq1qIYPb1e +GzA98Me6/7gkAWQqoCb6Qcjg1BxOE/AUFXa6EgtZOMchVo2oXtnRWz7l3wYE +VATRnVBbnPdge7ADmsOVKiQz/KmYX75OG+hMWCTTZ25gslgJaI5FOSH8jceN +D6kUwK1bw9R2bvkC1HsbVhsrDGPYvUHXh2sFzOBq8Uq+Y/yfNfafb/S/93w/ +7n/Y/D8d+v/3f6nX9j8+fpvbr6usy6vDczMT9UJoES8WAeKMAYQEI0cNHgPA +UaOVkBRY6tA+L76bomAnCjFGAIMkrb/GeI0PPg7X390Zzd/QfU0/U/3PC+33 +RuPlTvBFNMqmFP771nysNmz9DYqafrfkzVyR7s/BzJr4tn742+AUHBfFzzb1 +ucnIzlBVKIdEQoG6GuaK2qi904ytzO+q0ryPJGpHPKQih/dbETRvM3rDqiD4 +2cyjDNX07/df5/s/0//v9j/6/V9tx7B4Een9FRVh+bz+VuTLWXfMQ5bn7X8b ++Y8F8Pbg328j+gr1Tr0PObyUOPkf0wd0TWC74+yIr5u/M5ujgoV6NjwjFtZP +tn5Zq+o4vyfUYuUBZzeZD6znb7BgAi1WlznWw7WW2rUbYzHNxWmoZgf5a2Zb +zs0tnkLGjaLhy4i5rMKPdWqf+h8b1A960jjYbMUkkkH6qeWumr+M8uodevG+ +l0jg6C6MUzuc56PHS/N+bcUUiNkb59XV0OTlGHmy4coOUd/YQfw5S45BG778 +/F0Fe3155WvfVkduEkKOv+b/F+R28fE6eOq3s7PxdOMTi3+kqVGlyy3Gx+tr +TeCLs3T8nEw0a513Ch6yyYxWmuDLJchAeAFYEzBxk/kxclXDHqN4fapYggIx +OMAYMQhogI4gAIDOIACgIWcKNKR/kU0wHpPQhpQnvS6oJyqtAVvJ2m9DJ8ua +7PlQloTz+fo7tBl2tmQWUJM6B4WAhHNDkXBihYQbKrK3LMXWIRiXtXfY9yxe +TjP72AUiuEDjI5zwghqWHYItv411I6Pqx5AYGxPUhxtrKpml/PE37Jvwb89G +v6huGgrSpAgKtzDa5e3Tt13BmaaSw3U0RJK4vxMgzwfBirf0jfeau6DlRfJs +VuzVIrUxzrRc03HzvCX1jXxExvecubR+d74Ddf2+2kWXnoiqXLf5v2JyaYRJ +Wl0MD1VT42oAC0UII7ChAA0VtldoRgxSJdRZeWAryD94xMMYkaVlmbADc5It +q0QdAciHKlvh7YIpxnUh8IRkmyw66z01bgilraSzZqDpYzXcNChtBRgutsly +doL5n5C0QZ+z/YXzuQM4hpqXI3RGwmGp7BhpzzfPU3nd3x0r0X6ennMYRD+k +cTZkyRZmKvISzAPGIV+IX5D8h6v6b7z+x7z/k+I+K+D/8c+B/dHpPR5/P3vF +/JY8hm+vJnNz03Mq4w1khbTtJd32e0BOJIMwWiS1f7v+3/K/S7+2b7tEH+8K +vY6/q/Xzn7IEfle4WPAsR4lKP3+2KyhLj/3lCPMcazzrydtgS+ihdmbDDWm/ +j5BHotALsD+6c+v7XWvHfpB4dkCRHPw7/m9bbMwp5P1df79zA14M2+yvLdtu +m2/5xAkR6c+nX1/yvfdbnuXc84QdpvfH9U+W+F8nrbvGPXn3q28zPrc2/CIt +gVLZkt73WaFJbFYREWdQhA2BUqufTDMYmwoyEvZbvdb/8+HEmWU8EvKQ70yG +7jbAD2Tz+lMPTMU3GJIgCI4gAAwORAW1+TmlYkGMi+SgAABMqWCmPHKdE5lx +NIiq5KqW5QIIAgAIBSbIehIvkb0upffVXfyR6lFuE8Is0mFjpxLuV2KQ3NQE +EEED543cjzhKu7p++TJABiT3PH9vnHo326vi6rrpKxzN7b0r3zjc1qRWeD+/ +hgP1bMQnZb/tT/nzbBAuvGpEZwZ54BJiCK3/UBGAz6oZ/yqhWmJmjuAwbXSt +v7AvSah/nD58Qog0+YMUSL04t+aYFP9fcPBt+wwOsL0LKySZxvTOcHwIVtjR +DaxRHh5SXtOB+L4hZ+stsMsfD1puTbKkE6PvG8/CC/snTNRj5ujnzJGTCIgr +9LcZeu5GNhI4dtcLOZ0zx+un6xvYaWMG0r+tX+3brxhs6R2KPMLJiAb3m9QT +PoByGsu92YuEhW6vfGB0Sgm7UlrylsYlvK5Gw7J5NPp7TqHiBhIOu+NKGklJ +PP67Oetv+27WUMNCW4Nhe0cP5m87T9Xh3x8zvrcgfEBLkYDJGDiP3mDKorbj +fWMXL4LEvUDnlPIYavbb7+CcXMzU2ghvhmbZef533f0H7343+z/o+B/d3PR3 +w3BBzfJxX8n7+681dpF5cXdylDMjZLHJ7Xyy/b+qgSPm/j/xHOuXUnoOj26V +g9MHr9fv8+yff38ns8txoPAWiPH6L8xYMY/5d+7ihqxJNySKP5UHBP1L7X73 +2MdT0vXLHxvK7uo35vtRte3B35ivDftixn+n9ZoN9lrlQfeWt3/tO/zdb9Np +gy+ep8cZtin/2fI/Kfa/3vT93X3H8b636X8L0DFXiuK93sLd7taSL7TQSvOm +bPaj0ToQRJFAQ/QgGjQEAQBQufiYjyU3ISJOQlA7AmSRpCKQUvct67B4bLyf +MhNPxJ77A4EYgFHF8z0oP76MYoEs5+n/1VSnWTlvEbpxIMzH1FPy5U3ay3me +/l6Nxrd6klmX8mOwyIpsFh85sPCKe8rLWqSBpR35onl86sV3f1rXeJq4fB/v +5T2mX50/1MDZQebEN/V+P+7vnsNWXs26Lm7KwlJzlwiHTasgMTuNrcOKPrSK +6OjhXVb8BotdqC6XeTbqbfZUKWEC+LqNGwhdRRMTZRNH6PXuZfp+c18Tbx1b +Jh/w0zhJqiq5XnmWCYZncSNCboa0aNMI/YAQQQAEAFMToU0MZAIIICyKI2ig +gdnC7y4imoqHLb7lej9bptr0mg2XbOs5gER+HmjLEU9R83ZOqEU3TjuM6f40 +/x+3qFTn/krTPkhsSZMAIwKxcYXKIf+ogMzMgrnCiIKPt4amB2LLkKCBiwAk +shT3wKMQdCAlGWJEf3uDiLQEXfPGGdyU/eqWdL0xJu1qpmRVBiJ2IHGDHeQc +QsjUTdtCDRBOIbyQwdVOSYSAkMqCQ44IhcuJrjmzij58PMwTlopnEbqE1dc2 +QprQN21OxtjiGiQZtVVYJoJcHvFTQJ66npbJWh4JAcRW2KqiqcANAzYoKC1C +dVdkQI1oTo1iEN5HCye+IHBXx1gdZcXUM2HS8cQDGVbklBtZ3f2ah4FGYPvi +E6AgKMkTIpChO/VK3QwFAoEk76dhJLhAGSMC2n0fB7L9Gwcf1nZ7nj4sX7P9 +ecqPddJ3v4tH1Pg+leRA8zqa9PYKiYYr2ffmHW8h5fc8Zxuq8z4nlfIxhHcI +pg0lERUOX2WgAJ1EBTwK/K0L4XBPt8Q/uYQvwMonx+Kk+AdrRJ9llUvnffvt +tqX5eUr+P/g9n8z576jgn2rzGqV/u+81fDZET4/K7f7elL47JH1v1WpVy/6P +kfwhgQQEd0Q+8ZjICTguyjlVREGhk7UhY0CQ7p928SjAqEi46YetjcOdynDJ +zLr/D7AYPPOq0a+j7BAZP0KnutsQjaUJv+Z2ip5wK9lbeGb+73MWDlV83V1S +aE/U1hM9t4TengcvTOcy1oC5X/5WgyY2s3lG23bb9nh/0oRDSiE+jhfaVtrK +Zb2lFz5rWeVUhAbAF1JCB/fpP8z6p/I0FTQMP/X5vwGIFKghnIY2P6baNuSD +hvgEAQBAMAIdIYIFNIMvvP/b6z/j8H8L4X9Xz//L9n9X6D7jskTtGVVSyZVV +YyCf2MqpNMqH+vvNPW43fSaTdk6mV7fC6fj/vtEU/xv2P+PoekpEsKESMNDM +Qcb0qI7X8m1ECocybvpObsfu8rTzeq4j6Qc5+zy/Q6r3OARV9d/I0oUdnAsB +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 +vf6MRWEzDt7ZHd9ItJkW85Rb/0ZVx7MaXCh8BN7b17fF2EhnksQRp/zjaZqW +QyLnRZVzeuC+82k38GF68rltUh9rNrFXzNkOepFaUJ+G+p7FPP38yVYIAACg +AoCgKKKACgKI/q1AlhWqwtJD+MmDGYyqopBppKGEKFYEhGJBQgCAaVgmipLU +FM1f+fCcFGIVCKJYRsglSNfdeLSzaR/12nfzWa/+t7weL1f2OJyT8h0PNX3J +yQaESMYbmZkP2eYH5Nl+9+K+d/KrzUsrRTUQyFZlUiE6r+h+pbdVMQ/iyInm +Qx4qtrB/XNFj7D56f6XxkW2W6UNQwYQmERJyDhgxqHVl8LY+6zZliJIhy4cD +5zHLRA7H620sbJbcLpY4pxL9QlklxkxYDluWOXI1WSHbGSJnva72N7OxtmcF +E7y50OYLBjG+S6xgcYDDxWR3G6RFYVibD0gVwkcmIILDM2oG3p4ujeNUdlzq +6641XXDqfm93/N/Cw8dkmTgZmBMgyBsyWWsv7R1xLZUbkjBkJkvvjPIl5V5X +u3GqOvHOcDq66OaHLeo5qctYsUFDiS0tjZaqImhhVLauasi97l7H7m6LWti2 +i+WiGiFUkxMmkMebFde0LRlwWkhkRLhZGEbFTMzac1NqmYqRsqIr5G0zFR8R +38vjP5fBncIaIUZiCGDOiijnYjuvPQiuXOrRMItFpt3EWNovMkz3YxaKJG2x +uHzjgabE8xBDV0N37uWxjlGxrE8qiJimyL25RaxTQ+Rytt5/0XWuo0xi0QRE +LqDnddHwXqTpUR0tIyLW6WtWrDY2xt+X+fW4wYwZeIV3GuhxtsVEOC0Zkmm8 +ohsP+Ty/5fXrgYxhqBxGHGy32N56y5nJF7Nk4XKi/xcU02rOA2cGcGJ20S7b +0trDj+Hp/Le97+Red2DXQOUIFe9FFUXrfH4jjPvHncH6aehtCIT3OjiQAacS +IWGLMacZ6PraNm0yRDcbssb+zn9WKpiI16pSnkRk4aR5BcVzsg3B/Ger2rkt +89MAAu/wREhSlCDKRaiIl2wNT/ORkdZzmIIiUaTBN7+gfVP9AIIebsOZ3Utx +4qbw62JfkCMiSShQSjBE1U/B6i6e+YjVLoyrTHCko6s58zBFqE0jKRQBLAZC +ySfP570UjCUc4+U8vyzMvgsDly998TwtkU5O8p734FYGOTd1ElGL4hKe7JTR +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 +ESm3vy6P2Ds3ISn99FXThr2Zu/cqEjm40iMs6VU+fL4TKtYsyZHLG+ZRtBFK +5FBnXJ2EVzmpAA9TloOnQ8S851W4dJcEtLs66eENIwUu4nOYhl8sDIHmGoGh +uh6/6rqq/pKoCAKXKddi63XfLW/U9RLLjdbmraXvhydQJvGgPRYB4NR53NJW +MvwycBFwcSSNthuQNj/nFhbgC2nuOCgQn3F7E6hfaZQcXL53N+97fpM/5PUv +/LWT9PykVnm/0UF56qnwROgmlx3jaqJF55GtHe9p0KkB7CzrF99R27bi/v18 +McKoNfcGPbEN/uy40ghTHjwGv2tZnsv/OYQh8qKdeEzrglfGSYrEh/Ksz6vE ++uP5/Cjs8D+c1r5/k127qZQSZ4HI7l1Aw+NzoYPuuE8hmC/n6+VU+RIzUBbt +wRy3p48OWvXmtxvuxx7UEe0XGPdOTxbAy3iwQl+xSrryHfnTnSrG3Wi3QLOb ++MI2blt1eKASTnUTVlZKqB3GPuFP5hD2qz5KbtyckrE+uKz4/yhouEamleWn +IfY5+rroRV23RGJslZWrYtbQz1qa+V7olLEpsD5Yb7n4ysLElOKL8vyfJpHD +/lnRAhmi71QT4Mg57nj6AT+BcGtD4jPxGkHkugsIEC84vqVCLSk+7tQeIYdd +XOPdwhGsdapm/lKupA8bGjLvZ7f8J45hpW0AATft8rqNHBOzj5NZe1x+BaL7 +wv5iwFcl4BaRyjKLq6uGhjySc8f/dgFw1g0YhW7BO/Da9lvJKIDqFAEq+e15 +JZahKWAfdnIztmP3dhgqLKppp89mlQ+uLTJ6WgxnTFn4SCitYIoWFIjPfI1T +zGbIn2zooopBUeUa3ZNwpRqCiSH3qHry83paGrwhd/2BAOnTH6kzN1hd8gr5 +D6uZEhAZs85gM9q48zI+dGtpaBQvAKGloXVd/1amvAqbEqTw9fBXnv52nnHB +Uv8BqyV/n5A/ews4lvGsN6nSX3y/qZdut4XAYjpr8VdSpFylkjWgr1V93eU1 +KYzromrzwWF0y3TTfuBw2L8u1V78O3Q/xSZTHCm63x6lhnrqFkvKYVCUoNIc +3/IUgHY5oXGpHmM5sT4gWI4JBPO5/t+58HBD2/vpFCIQ1OVOeCF1AZuFMrkE +Bpg9K0zbrXQLLayjug1W39bVNUX7VWzJD8m4F+CFTYQNmlo8E3SUlV7dS0Lp +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 +SYTzVcm077l4HISv7oKUAqYHHg4roke11TfQOLv+I29fbJWxzo7TAzQMYf0g +XkRiwmH07bEsO/8FQLp09VTRb6n7z986R55zzSvXyDkuqzTu6/UKzz/MD84N +oZO8T+TyuFVleDumfjF+DRekFXH7GWPMeJ7u9GdEgdVcCrx4u4JS7EwVkV+Y +xgBjNjU2FHSitPlOhF4+dCxErqor75kwFZjeEdgY/nC4ipKgv4LUkkdFf4ZY +e8YpR1YT1UKG71OEXkLO+PCwfMUfwVff7tqatP4/JFql/lkUtAopzQjhqX6V +ZInCj6rLh38rOrvnRPXXjrHRf5iS6bWxGeOpyMC6Fw5g68JBYP9ZI+Z5qIUM +O5+4a0IX2SLpLbuFXVI5D/DgxF+Ti7FDoLUjcZCRQzgZxTYN2qfHeoVKoUTB +6R+4/sr8VmODtU6dG6K3ngXCfxQ/UJI0i7b3kzDlhR1ycBJ0Fm9+24H5YK4z +Iit6V/RRJuSR/9KaRV95c9yMjWtbA6/dzn+Ct/p72eWN8m+DiUaHnMfPbJq+ +/WSMtGsIu6b0PeDJUoj9v2nYAF2Z94DTT86p07BXESGwSKwMPczNJymvMH44 +Sari2+zjVpFgl64/3unDWOLbENQ4/yCulhp0tdrjPymWDK3P+Ytir6bqVHe5 +SmZryeIO1GaoIW13Yb32oX/bOghaONWFczoI+kPC+/fRchNwmiVH4Gsr6sj2 +IfzjaXM9+qDReZ4TeFgDQz8sN8vdoJxCXHfZ/x7Jk2v540m2EVtDEWoi2PQi +NDulx4tJfOOYdLju/XXQ4ZHWfQdCDMGd4BgdPa7r7qAuLwG1vl2HkDc6IaMI +15261ByZxroJ2OVCC0R9RreeiIFikrymzm0p++HtIAXHwr7ZAny98b5v2YqN +KJO0iJ9Jby7Tc+1E35YCq+IjV1qiyP5iOgScA9Tmp6ZH+tX9dlIw88xFyfes +83/RtM9p3V79hkQXPGZAq/mZqwsnxhtL85zSz9d4oUT2RQrFjWQH1zbZ9i4d +DlgFnr31qfcNOUp6fPnP60K03veLrFVSZex+h+sCtr8giF6eU08qr6QFb9zL +UfW7pQH2d6qfas7M1GG7z9Iz2CycXPgCS9POjelXcNjyaNZo6KHz/fAv5JxD +qKbk4grijzdH3rFbds170Z1HUrvfqs/OkDpWtJPDXaz1W0+Win6lXoqmNoe3 +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 +bk6+9/sI1YjI+2ezGkuOqoS8X1bAaB6MK4Dhwlfk5QWo2eQfpzo8Fs5WWxPj +OUD0IT9CGOwYSAFO229LkQdeadMR593HSX6HOMNYXeieF+udyjC+tB3+O5Bj +VIkD1Vaf6f8Bh5XtjrUO5WJg95VOJ08GVCRKbE1l1MlYdLPWd7n4vNPJILbs +0K0vk9Ck81mujOySfiiua71lPt9pYjZGY/Za2jqWBnUGgpVcFwpd1nephD+R +R91uJI6Ymb2qJe0d/Rvvk2NA+Z1RGxcroGvbS2l4K8YIsw9Pyo+ja48/VHns +gux7TDzc5uquTQLeDKDaTo2+IqQxbhkebOT3dlJc49B6Lg8h/UBhFjZYpjJ5 +GjWDlXaKZcu0MH0EC2WnkaP0Jn9rSoRZf2c+Tt1l+6R3SVlJVM+ghHyKHfri +/vTjaMVaU4VS8ZnlPs9Ls7zSQenbCD7rAbdkvVOxOxbF4CpX+df+9MTEdRTM +teZMO/i5s5RfLbzODTy7j+4HXt+guq3Xsl2TN0+lPa/2lWfBmG1se9DZVnz/ +iMAodt8h1csgw5lcbCgrdbn6euljeXaXK2p3hJvAPiy27qnx5L4hPmXir3v0 +jiov+23nk40DRz90MMaRjNXelviMVAwoeH1pK454IaJHN5ygjEX2mVSzmKb6 +aznwFDmo5vl5Y8k3qGk0jG2dlHLlWlCN3A1Jpbu429BNaTKkJ71dne9nlU/N +Pa7MofSMafE40IMHrk55KCdx/vAQNe99z7+E8wA0HgVRbRUyNlafPF+B0825 +hxWuxirYEkZ1DVvwy/fgd3ixeT1QsWBXBgnuLvpm8pZSOBr1wvCb8zsV1kig +/k0xFY0AXwmRqLBF8B35jyVTUwTOCZ5je1ZjY25fX9z+g1ddf8KxW21WkMSw +wy3TwZD2l+dh4+X6vdlNzJdGTyfeOQNB16Df4JBE/eVv5Yni2m+nqntzgE2Y +F7yvxSi3MNH0MR3Le+rCklzpUoPoNGcXrXqP5rLPfXB3eo7n8YE5F8WuBx0Z +QI41D523Ulqd2Ktxs4rpqPncDwtdBsC/waOTbXN/arsI10vaQrnVhHnnJjDG +tacmGITspRfP1m0/PHTJBCrl4gY59Yx3YU+m5JWVy++PSMoGU9CVG5c2lgNp +dtnJyQ2Xr2sBKFt0O/2y4JghQIWB0JoeJzyD4USd3Jyv/BHs9fljORdmkQil +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 +Dhc/Lo5Fwf1gKszI/BWgxYdccaHdOCHE2qxAOHfQ40AymKRHA/zRLM13/DcN +8PqK/h+sASJnPuvBNfff22/fx5fnYDgdhIBN95/7vu1sCIiIxvd/D+J/ie36 +j9r6uuu/TsRFP0B1JQZDFAXjcSBBAKj288vg/H+/7vv9tGLyFu7j4XQ97syY +HfXl7kD2em+/5dVRc3np7UZBXRlFXZguERLHB6Fepp2n4ouEyej9/F0cW223 +3MaePveNt7R9bxq7fXc/bpyNmpfaZW0stsv7GFtXl+c8t5S2a861wALbbGIi +I1pINZrTfT5drt5dXW03yRooWwW27wbSPsabiO25Jw0m6HbSHbbG5KVFUscZ +jGGK0vNuVwAKtsYiIjar6sPIqyyrAw2X0di0ulgudbLlWyf3yVNcrviybJqc +TJMzJxKNHNRcRtzGNh1LFJLIWMCpQsFNOLLltW1stLkwWlvWlyWLkt1miZNT +JMzJzKNHNRcg24jHMnhLzbamlk8aY83ZqJxlL00XvOUk7cYk+bmdRpkyYuUW +SpOvLq7q04Qrz5usWa4xbataK3c2jIjvo11XFkt62ZrMJrlZZqyydTM3bLd/ +g4ZG964g8nk+ZopY41WRxetdXy1M8vbXK9lz84fQyev5O6JY5Ieo8fTxP2fe +/ceNL0NjDMxmBTmyp9T6ke+oSH4vxeb3nB8uY39z4ujbnWJ+/0PvJKtWtd1t +mfmaw3JlGLTelzvPvvzWVdzSYojcMI2xkFco4N4KQHMhvASLA8EDFAINk9L/ +wErFEVSIbLnVgi051mFwGWZPS/z9IhK3i2GpAVJ9w2Pt1TcFgJ4gbN7+RXgB +eMb5ho8zPOwteQe7RJ+yegkUxVDfhVJbqRN71Nkyzmk117Myys2kxKlSn6TU +1GmasXEeXm7xSmdfa8rla54cazHZ+p7Nv0Mqs5/T/o+28ixgymJ+cmmGkZjE +qNI05Q70lW7cRZtk23rVvao2ylqWyrFdHphblw24nFzZnWta1EchzzkiZmEz +MJmbakS5dtI3W6TdRqtSQyPST2lTDLSe24ZUmXK1FZNS5dNVrWrmma1bqNsy +YaprS6aYjTWGasmD/HyyEcTRYitqzQnG9tQ1iWt6ZvGrukm6eOqfHUnTXt5W ++j4P6/W+keKnlXnU1jMsisTWfMvW1b01el69OtresNeLwbB3rmeU3g3i5l5d +yN5du10u87WvVl4jst0uzZ3nnoW3pKeaVumjVmLJdb0bq1NUmqS2JN6yJlTN +sS0mqS73pGSMfn49p2nD4aPYlm453F30pXJirvHX3Pc3Tldj1DrzLOjtbb+D +S5Z1rLxtp4aY7duGno4ekPFd1QZYTZY3VqdPLJx81eaefL995Oosee5Znn5Y +6ceJz5ceXLn6fT2b8O52dvWuDLIvp7NRnrMRw1Oxw1kdMEAk2CW8N4AoZxux +YxGABYYHR3l2z1xXh206V0mR3btdprb0l8OviJDfPjrhxuLI4lHmqR9e8kkj ++Jox0x7rJJtTtMzF17KsO22c85L9nb3UORbmuTqbsWeOXdP1bcTScxFQ9E0S +RdW88m03Wo6bnWo1aXGOFKY4xdrfj40RLyuUyZZjl7ifB+mOskn4nt3wn8fs +7mKeSqq93mSrYO2wYwYyrGRjMWQlJUyWMXI3KN/icZjNF2/ief6L//c6X447 +aRgUslq1YUOn4PraVH455e3U2sbbeV+W5ujoyXmStZl6DklvKrbKKyMmjnWl +oow2Bx2lNBW6Wktq3Wl6n7Plwr3nKTzMLMFjKl2XN4h48LmLx2/D61x8Pxx/ +Cc/mPfk7ySeB9FgWGiekkURjUVo1I0iyZTrW9N7n66OG4/Zx/hR3a5fYa08D +5VO0rxPI1CcNGKmpNNVWpGVjBYwzcObk4RHK8b5kNSSUThVVr6thJ8kTaJ/X +3nk7+n675vlv8Ha+WfwbbGivEr9K+3cRtHdx87PdPUacHE7jaXeMZF36uqHC +lkXqpwcdODBxHSoz2+mvv7RPDUh0shqqsaxO/ZwM/DTfOUwSksiTwYQ0cGnL +WXDN7ee6x7w4ru9WiulXKVisw7yI8d9yRCtxZVltLLFlpUxEMWorU9tneOAW +2EuSC0MFuvNosbOYidKBykJwKiwrIrZsqWs5r+1w22X3uvJ8SeDw2862TmYm +vc8azuNNN3W2t27V2pFbMrTp/u+f7PpP1Ov3rv9R9NeSfsN/N+L3uM9/Vbrx +17tSeLEmu/b83+FebUyauWvwuKfYryOMzMzMtzDb0PB9jseJLK0eF04O01ra +P4aJUnJbXbZxhbissWmNl2HhyOMtrorJLO9qsVXkkx2upbW8MjGtJpo7GWN+ +STwdptuWHUX3557u6dD7K4V6WYdnm883x8OThPBvifzz5n3kQSa4e6/BXkX2 +deT37Pndww1xNujsnZ4PYxuGLHFPSnu6xj4H8O/1z5IH5+5Yru+KeGzu4Y84 +1J0vK8vn/id4dtnWpZOZ2e7l6ZHB8ePPTntda5fE+pp4XynU1PV4q1p8vCdR +yrlXlt+gO7T5ijlp7u3rPWNx8/L6u90k6a5PM1Dp2cNSZbSblSfQ8umpyXhZ +y2ZJresanu0b9NpnoV5vIPEeDc4TUyI9vgxs47V7dNOPd38lnZuOJ5u51Es5 +c889uGbRCK3e/h8J1xwn9t+X8nz8vXTz9R+b3RHs8u0knax8VhbZ4mcJjc33 +4jjrNmzc05ala9OXHaG40wfwb9Uxo0rJwc/D+KJtm81KyTJ1OzxOTLHQPCO/ +gV3ZK6BnOcdok8pERY/WSIRU9K4vk93XiaWGzER9Xw9T03lIfrNZPlZVX1+E +/F5lSdvL9WsyJueuvvSzwXFseZ1cNvFqUTqkqvbKRPGvQtoEtTekTt9fUug8 +eP2lkaNmMY8LHCtgr2naSz5Ok1GfZPpY1GuZqM+3iect49zam96FzeN2STtO +p2vK10Z0s9t4dTtkiTpkUpwKJhUpN6ePs279EGJcx4d6ruNHdSk2pvHDXUbG +nAPFnyO55R7wpYby1+W79ppWLMfekj8ImGNyI/E4693q19bdMh9SSSfZVSoj +kp6flRNE9zl8vHn6odnm5OJPjLMNMz4x8pj8vOHLt9Op1Hu/Cl412/BhjcmP +p9Px1b8k29Xdjl1Zpq2T+B7R9fuk4ecs+LJwpnTevspp8nzJZk4NqsH0xOtf +ZxD6tI9dTuX5W49dnZwcvvPkmpdDoZPZLKn1Hq+siI6eL/dev6nT3keZvHh1 +hw4NscHzubs9PNpjSXs5PUacycPZjRyjbwfqH19/OTHDL8KuZKsfMo0399oc +PCYjHDJq2VLbVXrmWMcMmRlaT2vscu8mRrnkj0NuTz+bpo+c83ZrqWpOimpG +liL9q5fzuNa2uXe9RxtPeGzue0OZW+Picvguvt7OO214iUu8bSzus+xOJ7y2 +q8J8ufwdSyvGk6emOhcOPk0cHmiEeMLz6a4dnY16yT8LJ5cuAcKTXHEEWKsR ++GMWI+nTx5dPpddHONQ78R9UZHbU7Jj3d3FRX2KOdnCuzDn1cpMN1nN5Vi44 +YncvXU3pc0XmT6a/Zl3Q+fHGxs1PSO252PLydWnC1aWN/ga+uwc/jSfVxJDo +Ys7znpdPHZicHdmuDjRXOMbxK5+PJo2MyZEyd56nbg7d3XC9Gzhwv5vZqSOL +I2sr7MjqYZfPk7fWddJX2snp6eSPRyzyDzydTWp6vtOefO3pr658s7cHn8Ge +ZVkYjMWu7Ticd/uebuOwkR+URJaa1SbUWsGgKIiI2tBEVtgiNtoiIiNsRa1g +AAINtRjY0AaLVRRoKo1QBtiAAAADbFUQAUQaxVjbEGsAERtiLVWYAABqwaDQ +bbAAAAAAAAqbbVqgIxgAAqAAACgNWA+qLGR+OP8Hn0+zC/wXskmh92cSWx6e +8TbgN8bmoYmTjET1ZxPqbGBpzKrHsw1KtUrbGZjMlsLceFMd3KaGjB7q5PEO +FZWMrGYXKsY/PY5lNO7NtD8XHDltkyoYadjvPptwv2zFc+rnB1HLDavN9U7y +8OZId7JvngfYxtLDiunGM5xPr90cxuKssrznCdonofCe/X2+U+HbtwrBPOvb +u6jXe38KeU41GNTlwndU+ppy7Nz18uvMPI+zp08zw6lk8M20j8p9THfjrmfB +psrX6R8JsnLdf3vls3f0fBkvZ1dQ53I+BZjJNHlNTmNdpuYOq1xP6qfPnl36 +K06rGNTJWnxbbbiditS5iZ6+5tt1fu83TwLOmnc+yfj+rR+UM83nPP1Wxqb1 +7vL2L9zwusZRqbcPsufBhieR1E0HAe3DiYdvgyvhsBBxVM4Chx0CgHGuBBnL +eLi5jm89zTVVNsmJpjGO00k1E1urVumGmYuVbZW9tGaxrhmrN2NbbWaxd635 +nwd/FbUdlNtdb/Ucfg4tV4Xp3Fece3d1/IbO5+Ndyz/+/7/EnR5MP4h7yHpc +pXB2n7XZul6HWWYrx+HmdfQvDd2NZwabX1OEX+T8HM2HXU0iEfE+jhD7OH5+ +mPI/PdiU1MJerk8PP8dvR9nS9OTupkyTycvxvrfU+O3yO3ZHA9nsStp5cPQy +cHg9zDybdGd/Nw3t+DxNOM6Q8Pd3c4rTbHw7tNHZNPD2rlzOTxHh+849fZ2J +XT4Y0StPOO8NxmPG5pX4OJ7v0P03G1k/SPywcykSHu/SOPnHpNNPWcCZ0WVd +WJ9HxdoOx9Oo+tw64l4Mk+81PkfHG58IsxTHz10+BJE5PC6p6N3HK2Mlrrdz +p/I3unE7Qc4aX4m34vsSB+Jb5FD2hxAbg86aIQcfQ4zge0B4Ha+1+i6ruu3y +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 +iIJJl9wa3YWBBxvXkO1ArongcAjR8AgdkUSSTQtfbe8Fo43zrdHwQJIDlvbf +roBKHAYpzbbbbdEr8/t6ePjzDOuraq3T4pz/bvlNJaAz3cgimaR537Cx8x7l +M0eXeVABdWPnvwf1X8SPz/5b7H9F+Z7rZCPcgyZ7666Ku5tAlPTYpg0ovwIq +49QoeiXVZSONHrjlftyfvmHvZOip1mi1qlg/nhrXa0sfmtU3unPtMf7du/gR +hjTvFAQAkoGiGYCgGGkVlr0Nf4WqrvRwn+bq6camxfzDQB0BOX28rlIJl3J+ +8be/9jlZBoScu92bSOPXvcCRAkKkBQDKJKgQhAD1kmQBVHV8v7vtzDd6JSM9 +jpdOU+ftC4p5d9pTXp1kaP1QzJKkl3AXCew9BxQpQZSOgyVwv39/HOpbIK83 +bMEi9eYHScMF2eKF37xwYAFoECGwYDGWlph9L8hqfxJ8gxp8Ux7CGPrvy/7H +RH1GDwyLfMkuQu2eROZDm9li1ICESgcgmZw/g4zt23pa2MUG4ICSkNf0u7Nx +cyKyHvpe49FUDAAwHSKVDVqGpSNZLLI1/D24PdIQA1nUFShi//DwjfGYKRvM +67IVqPm3djhM7VbvieQix/DUbH6Rtwo/PpvvXextsbwvlwvLxt3HSYMQggkk +iUG8F6mtqi0x6z1V98+3t+Xo7lpiGEmEY1WbMtKSVJqT+17bqmt+Nr9iNZZg +1j2vOGj4t63lw5Kxw4/F5bNsq+DcC9cSkpKqkpKSoqlUrqHwzy6zoc1phvlZ +gbtp7dk0bOr6K1U3VN2y68+0V1ek0zTXwVffNr71eK5cL4/t+VX6tkNqSoVU +VacTwSeL41e0tKRNNoilFNUoZpbbJlNVV8/t9sB675DwD6dTMvIeg/5PcAYA +L22bzCHMKbzHGh2ud+c6sXgDjmabJdrHBLodfc4K7adThDuX8ZrSXhlgm7JJ +qTyv1cvmm4n1vX3t071bXdMN9zOg3mwcD4sBxPqD37JBI8+JJduTYQ9sBJeG +fuPt8n+N4+tNGXLZxJWOq/rajynCphz351OJjjYzriPD4TseqydO85c92Kab ++DnA23tdfNSt2maZplM0yzay21sfR2ZZZj69axlXLiriYZWKLKp3Tt2pa3q7 +b1tLwdtssl6ZTGjLLbeVlqWaWVfaVtSsq3VZUtW25WUxU7olmjp2/3Pk9fLA +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 +P2OW+StjnrE41NxAcrISQQQ6hYEaZO8IAAIOjzFgectJLFyu4d6n8b4xf2VP +sq39mpqfZERgrzZgAGDcEczbt2pVXJ4smXEzNCvLtZCfvMcZPUvVTS6uY64Z +idW8XNTrz6S7FefmFNunNt5N45YnyPhAuHny17w5qdaageXAk4zeA1Oirpco +FgCREtX7awGYBh9P8ofQDfr2De78d/L18vEQf/xgM+/98N7PMMwbeYOO5Lh8 +KJreS8Hx/+v439z9l+r8h/9+x217VrXOr6GWSPXSnayVdiWKo7pimrBWYR5g +xa5rTNtjUbG3LcwTLTNNTKWCNqbLB6vs//C2z1+J+v+X19X5NeXl9/fHF3Gt +dnnFqxYq1YpbbXnEdsqWNc1dG35Jrtvqu/ArtJWywlFQtnr55q48efsJHp5+ +bvl0zHfvQ7t0CVFza5h9Trucr3l4vCKd3cFMQWLO4d3BDM4UGeOh4WOilYso +MsmKXnF6ZNZcVYdf317Oev7n+T9ex5ddu76vnx9/a9vXnr3+o2xjGRo0CYZK +tW2889Zmcaa89Xg5to8rIWonYsbqTt/O/1Oh48eHb33qXejxxyR4tqLQarBi +QwbQInBGZ3RdF3lhDnTTMKcJgBJA0gEhgJqJoP1CLbdEM0EAljVGHpNmvAIi +LYlgyAIASElmurs7MWiTj4qqIe5QtWLULoKBAAII830n+3guuzBJZAAAVyIa +PUZY/dhJjN/v6v85HRnmAkWrnIpBn3LqB5satcE3dFwHNaa9knUEBqbgUhDZ +IQ0IbkePiHXEp9EGe4YP75I3kPNSzW+sFmRIqWMbCVvrtj/8vDcPqwz2hY/N +xhHjM4ASVuYzCCHZZNjKgJGhQCChAIKRLpGn/nUROEdr8l+DfLXW7IExAhzC +EIDctXrlWoXIXsJPuMAwHsYcaKFV1MZKMKeVIrgh57euy7asq4zZV1ConOOZ +jLg8wJXT/cAeUdy7k7aJkMQA3OlfRR7XWHs0lp4x2n4wzc5HCeNAFjnLnc3P +nHl8R/E/aeLw1ePis8fR/B9k/Q/O/W+rp5DJ54xmmmPjPdT6npcKGMkx1St8 +V1uxuU7xxmYfikBvuQPznufOgOwHxe0D7z7Xy/wiYL/Nr4wtTYfN/mn/L/FP +yEhG/5TX89E6571xbrWaatVlxbmTmk5Ygb48780e38x5JecOn8h23ZHY8JyH +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 +2ylKba6u0ZEoKVCyrFAsCgKqyhPvdPfOE1QxkzMzK9BnDWl8Du0eFymZqbNf +f9r3992jVJWspRkFmblE7dqk2skljAxky01qIqLbWi22bLbSJW2Gvr9ThlOD +d7P+zyOMSZxzHpiiZUiaemignpSiaCqtISYkQzBStKRMGopGJCtpwBJ6SQo0 +ghwUpdEChin8v4z2bITh0ig0ei7PhggEVdqWLSwfRJLRCX4l12dTz0tUjfd4 +ubSISDXqWq+fC7WWH9OJoXqT/7ubu4LbPTa51gG/U4tToR1LR6KL2ny2f4mJ +PD3EJShCQlKQlKEddx13dd3XddzlydOxy7uu79obtTIpixX7N/ommta1o1NT +U1rWudttttTLLa2tjbbbbbbbb4a+TfMCk/aiic1JMiTCiYUT5I9kUTUlV8pR +Vs90aBGc3+yZuhwBlKjcknNCXtjKCrey4GxuBI2KoxSKphyMUK42pFOM2UMK +RioHy83nKbcIiGH3H/++e63z/z/x3hXez5B+72V4/6HOd2kTLLHLKRNV5hg3 +8//SuzBgGH0v3f7D53Ou+gkgkSgkSgkgkgsZllzLmLcrMxmMYzGZGNIfiCwg +F8CBg/vBTI7mp19D0ol1IIBAFkaB/I4Eezr64ggEARkgkkAEkvlHA626PPlf +vNT2jS+HY/u+/bW7fr5nO1rETGu8uAxDlWb1/MbO2j6aHs0FWJA5Tc+1HZwn +XsuKzVRhmNskKbXYyQH/v5nNHLgX0kEAhaQQCD7Z5l8TSJsUTekTKRPkVkzN +sbaVSqW2ybKZbWlWLIxgwsUMgxVqkTKRNFE0QoySmsLMlTKpRmqpWkyqyMrM +1rZJVjGVQaoqyEqyVJGSosqqLK2zYon2tImi+1zjzaNZZ9JPjDmpJzTYxwpR +NsyPiMZkMZVKzErHE3ubVzZZkSZhkxYVGevnBs4xxjQ1OTOW1mWuXS1SJokI +5jlCB5UtWaJytpChaVgxWVMKsZTMGJlZTCUUh2oYq1DqwmFRbLLAlqtElWxm +oaVNurrdaUplqjDrrslNMW0ytw1LiCM+S+Pdz+v2/1/23v3bnbWdF/MZmRmZ +ZlWU2VFdSm221vM2k+e0msWyVRtGpLClbMTdjWTNaLLGhJKk0rDZNk1U1MwU +2LtWbt2SlZRmpU0upbSTFlkWYiEWYmrC6NTWTKsTEtMrNhqyqzVbT4ru2Vh3 +smsbt0FYnHQrIjLBVXJrGHJVS2lUam62WtVWWltRVq8fLdDFuRXBlDGUTMWo +DbJGMlZmLMr44Yix/cfr/u25QRUvALJCabVdbjVt2kzl1q5uqmSu2lYLcxdT +abp0tfgvm2ttX9gD24xVUwknjnLZ8I0OUi6qpr+rtbWvwnm294zas2yDbLJS +zSlfWXZ3a11NLNhZtkpLZSqUlJJpbXNpd3z1tvMlLLWlDjFI3kU5KJpuzDPs +rvwHVFtBUVqNtZKtGtRbFpEtrZNqxERUMxVZi2yzKtaUpblkAWP5q6HaLJFW +HbOENSExIvagTVtxtO40G0mttvXrtV3dW28V55wtkOjnOB0pSc055BvlFToi +7sOc4xikqklIqS1VhSqlgqWxYtJbES40p5XxKdiJEcKSmplE5jjYq6p1NNuR +cZqUTnMcnAVVuKqyRDJEMQxBWRUsjeMpUtK4sh+9+W2vSjW0lJqqSlpqZtts +r2m2yVK03bZbXYbR6Rqp5c44g2mQ3Ukfl0yWN2fxvicySceq+vL4eWI+HRiR +ZFeCwWQsWJ1qZnsY3H8bQ4lSNRFRRLVkwpTV7/79tNyMynKwofT9Cbk2pWTl +LT5n+n9H24k3VgceNc9vMYtLAyijRUyyBuJIWfCiNpZNZjZasTjUQuRkSxqw +mXVyxXzVEZRU5WYQqcHD+t/stn869f1v+r2q/7qz3Fd1aJPKfFvHqODtMzJW +YmqpjKhlV/b1NLLIq7VlQ/VzauZhpN8oqLkQuNJMllxES5GhGQ1ZG1KkjUpq +WbI2yqZZWazJtSySzVNlllllllllmypZss2WW7ta8urtrf39jWpne22wfz9n +M4mJKcaNatWRdAVUkkyIxjEf1VapUhr8qa+iaJjCynHKVamQbLF/041bgywm +RkVfnb222prSpk1VawplhasVZYxMQYkZIyMWKYMSUr5f4ebtbZIiYlSSVWUO +87RtFjZPTs4UOjIuFNlZY1H3WFs21b5JxbjaFKaSShLHrbbbbkSZEN5N9jUr +SyuFhWxiMxKDJMDEFgohP4NRJMk7ptzpzFZwTSMMX138rhcaZYm6uC6t42ZW +6gQUoAJBF6QSCmO1cxVoribHo7TW8C6qdrdOvZ32uYaBOvgbB2GLtxe2KbdA +WllGalJs+IIjMDR2S4knk7DwSwM2L71iBZQwPQQCyaYGlMSmM9IvDCVgJ4SF +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 +aqZwAREXW7oiIgIiIiIiIiIMV1bTTyT3h0peF0j0NKnoWM97XDz3oNZms8X+ +mvqZiRmvxS2Sh/BPgB1X9Pd8RLDem9ZoTLmkxTZMqWXBZiZheiuacMwxYdwP +6Y4i7GOWZ9a8eOl/9FVejHT096H3nf2t7Pv/4n6P/3+y5nw8/PUJufU6Mn3g +bT6h0+F3r13d5vSCb7jm2y2upit8/0hLaJrw3O86nsfN9p3LbeEPvCLO0doy +CdiRwTzMiMjPz7dRJbpq3WNRN8+16u2TpspAmlNrLK2fTt8szLrcQevfw/W6 +zLbSk0J5ScwakmxdltzZmS5NzYPrw2Wy3S7q/qjTulDrxPDptiYmkDyzYfgn +f4etuTYduffy/D9ltqxT2kThJVVXLz1kyrYtuZmY2F5hF5p1QumWxMl5HbJH +X8753Oc7u5cEuA+i170rX232W+t9XZ2XGrsdyxLtY1g6jclqUMqxU397Hjhx +pguqny5fbof3EPbInf6H2kdO3AtibTSUdyNqFmFM2sY0SsXOKxG0iTayRqWe +6xI0OIYJ/TeJjz+aZJ7PSrUluSPPk8zFKq05YaYNrz0U4KBvcVqHbcB5d6KU +k5PKlts9Z/eelvxZluMy3Hh6vjVVzmk6sO3t9vfvrXHPfHY4iZCdhZduEijT +qKbstD6DwwMHTE+RRX9j//fI2BM04b1YswAbwJ7QSQSJSSSSS8P8PkknfWta +1rWizVfOTWt71rWuhP6mp+Q5ebjxpprXl4ucy88+y98+ffR6kvjD2vi2r7Hx +ALbbZ1H5p3DiWyRLZajSYSc1okVEVbLg/KczJErwmcaxD2lQsm7NTcBiLdZZ +YU3NWjxG8UZJOJ5cPjwBnjI/T6HD3bkJ52LKvZah0GIaWUOIwOisLZZLFYnL +WsZly1mX8E7T3cpVHU8pzppT640MDSLfLJacyHpxpJtI8TIkmSNkmLrzZ1Uv +f+PAkDtfC1fW3ieE8+0u3POtpkd0wirXw+jtuD7XuqtQunIXXfn6Etwq6nW6 +nI2uEtOBojajqWoONcLu8PJnGaYxkuKvF3VasSmBYFlKZZYyzv87Mzgu1Dx6 +zu91RdsZi/C2+tty25bXkiNxvlbLTu7uDKnDJX38hkTSLJTw8IqtTwG+P8p+ +s1PovknlE/TH9BtJ8TuqqlBACwFQkswKBCw2XRRFhsmRRd9R7OOsa470MB5c +jvrNj47e6fk9HoQbmJu/yvBUJ2VzEhyFBKB+WpjYPQyBxJh4IILseDNPxBaK +VL4DATRbMZW1uJAQZCZEY/HtdCfdPxV93+4Th+VByyXFDw68qhb2g6lpaWys +x1kRJotMQPBEb/IYAMbxoaygzmhstt1Eb81EKFrpE4CJkVrjTZKkYTd3UINL +VJ6O3IQkiwgTPytK4cMPyKfT2uJT6rkG37MS72r/d/d/F/O430n/HP+/E/9i +RJkaylpKT52wpNpsWrKIcLb0fxux7l9Rx+mrk5/4D42ta1buv4zzbzzrzyrd +ryRX5X1jGKIt5zntd4iIiIiIvO7pyIiIiIi67ooiIuvZ3tc87zzdb15ERERE +RRRERERERFflO6IiIi7uiIsV5u6IiLt3RERERERUYxEYjGMb9/9/V577zzzz +KvZRiIiLfk+6IiIvj3REVERERe3dEREX5r4er4b1468ee3qIoiIi+N3RF13R +EXXdtF1d0Xn8jeeREV1d0REXve9F55EQABedwBERERFERERREREURERFERER +ERERERERERERERREREV3PN4uda8RERFERERF5zzeOXW8REREREREREVERERE +RERERERERERfs38x7XtF7e0RERERREREREYwAGA855vNd3fmfs9/L2vov2JU +RfafQ/4/R8PqPnvG72+MkiPXdWnns7kcNffFE42jLbQojMzB9OxbPK9c7rXz +Sr/Ayf2RVqalRw4ZPXqlSz+jEuTMYtZir5iphqULb9FmRiwymMkdP0JqxY1N +GLLNva3ttWrV1T2bKplWO3o92NN0pMInRch3mXosTknWTtHOGHJc9KIw9MeU +acA5mpdxzNNNMW22ttXzv8X2b6cyKjJZSxVMso6jnR3KFO5wzVjVePuvId9T +g97HjLmvCwBqzkwLGd9UuKVL3Pa3ft8TiZbXlrVpl9Y6/FM1pYZI7q9XMKwq +qbkMptvZqG6+uKoepMk04ZB+bYfdKbSuIMImlU0UjKw6IrcmgSg+SSSvC9K2 +k9KbRKaVKLJEMoVXNyqZ2OZ1nQa2tXKradDcaVhPV7Td5WfBMnG4JMp0Zjo8 +V22eJmDPBTxGMRgc9O2CsO+dximZUBz0qDksMmMUyKRixKl5P+PVULhFThcT +3hIlybVXv/oS4F24xR4zLhbW7ZsY7u07lxeZKQ5Xl96u5xDMjx9aTxEk6YK/ +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 +NlUjV8gYnZXaK/sDyw8l4nU7vE8PKOu86R4gbY/JsB5jkeVCAB19rwdAZXpT +DjUGA0eUMOt7e3cdlxOU3tpk6FKchrY7Lm49nDXIqJ0Nk67M2VE1zm7Baco5 +ar9vdThTycuDtZtp30npbrxqG1J1Tixeztw4PScyUriqO5WSSTIHsevRqdOD +5NJk8OMCf11j4bdD0Ryq+JV4M9HCbt69LBvzPj1Npp37GpLWK7RHEsssnDDL +bUPMVyq0WU9jyb8zsdzGE9lcpxHpvuJw+buaUrmeDzNRux5Q28tZf5l3qk9l +xU9R4M4OfV67Q4U1Yx4ZJk3iPKvnRsp2m1351s7KediZ0MiasfTfU9nmXnz9 +o1rWo4h6+kyGhJ6T0a1Id3rNNw0WMcRjg8o2MX0PX1Cx5J247p8E6iz10ZpO +ZDR66SUp5O8w6KbFWpLo76kiTQo7Oe/eWG5HTZhlkTDuycJ1HpztlCcy+JUj +V2Uc1ZZGpUhuo4L7LHdw8p2jcjunJkGGmOpddJ6ZPf1a15SrenZ6zth6T10d +7t2wTZaKnwF9d7mi+Hoir7EXZqYT2Onp05I3O8nM8erEVXl5MevnGSevtuaK +3rGk6vn1jwebjASixLOBOuARAQUcMYIGuwQ6Eh60SWtTV42+G2HtHv5wkQ0S +EfX8ODxIpt8I+U5EXl3jxc15rzy83mmdcdZ1mXnVUHd1x3Cuu6Lq7dZlqUy6 +TUmVVCxVMxfG9dmT1iGmJCQ5tkWxh5L1sXJHX7jSf8X+z6nAAxm9CK2JEero +9Fy6ljZv1Yi4nxNRfpyxxCCQzvVcdhK4Le5RkeQ1msECGaEEGYOGNnPH+o4Y +5lJ0JSVLFWKFKWIqyss0mlslE2ymU1eVRosJMZWQk8lNoldOPHliaVhbfNvj +XnwvjeXxvJkyYyYSsrBVCeSiXyW29k4Hc7GHfZxbbVXi3LhUoveZL2b82041 +mXFwqri2w4XLdNOOF4y01NcyHEw0qzihyptNzTUZ2225rbLnM35ca18+dNbP +fwqeTbTjuXlZvP4Q9ZJJM2NvOteKjPO+Jx3lbWGGLJmlZmJZU58qmyq0qJQL +I3JLA0SyDdvPG99tc1zfTlzreJJC4kVetZ11jlvnVutRIiaFrLiLEnF9dt1R +Hm/g+8/T/3/hOqdB0ldlQtk9NskhlDR9MiRkkvtjM+LDPdnWulzb44ad29LX +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 +l90pzJqu4a7aszJlmXwAeop1VqRX45hGMmYUUhmJVTaX6CRh9DkmYK+Gw2Gi +xk2bbIwrK/8bdhTVNibFo2qG7KmZSZgY5nSmR16QoxqPHMxUwnaXvHXsXYZO +AaZg94y6O4+gcixc6RPYNuobyEtopIRjWfpVmrteDtN9GuuCadPwGiQjWGSp +KlJWo3Ica01JMcNNcQzFuatjShLwzJRMmU2iY5MXe5xnPLry7atnv12a7rTi +qOdM+MYIdHHjxzOmrY5p95m0O1XVdTGlXemp252DrsXHSHrJ6VqWREFbkeUY +i6PT8K6kB1xcFTBfWL65YWVcy3mw7d3Z0Piyznk5WlqhVL4w/s7w6pZ5/vSy +ean1tohH9A7TCszUNGYyFLUmDujw5eMx3Zwp6GMLwGOheNDTbqVvJvvc3bKe +4ew9RujyZwzWf3mzZlYpSpqYTFUfZJhYyQYxG4iVssZkw1MsqzKZh4IRGrdi +TDNQiO7pH+DzyvP/dJ4JJXhd2rVhY7lXdh33fqzNrY8UWxbOEuHVm5jL0f4j +iOZw57S1ct1zS64ynmXe6TaCRxl3b3TYl3wG7fKLaERxlIf4fCl7SwD7KFFa +aocYwXLEk0d1YVLnvNW+ZjOwf13s+Z18xyeSHBL4oCsJCQtCUVRYoFhVLw9Q +CixwJAxfcyEJ3/V6o79rWzzna+9CV8GlT/kTTamO5VaoW0v7VPHMdG7YPWN7 +OIHx4F48iP5D/En+3sN6zMSDkOoN0NjI7WFFO68Vrr+112a7i9bsYyi9smbM +gG3G1oJAUCAkoCgASAJAoKmTyW7ZtWxs1tmVN2XwO9x4FN5lH4f+zX5+OXCt +K52RczCc2HPi4MSHzf2f03H6DtfWfe/yP+7ruV0wHaOwJJ2SIYBJ4fN2VV9n +/T+R41Si3Pc/G2kQ/gfl/YfjfNfk/q/h92SebwD5tEr5zew1qbJZjcMnP+6/ +wP8H92c4YHjoxczZo9i9ita1pdE+TKzijUOYVH7b+9nd/Qt5bP80YmJZZbVe +VXGXgUr722WwHp85ZZmEj5X2ooM7MSCQSSWNG2JJb9v5fd0IBGtY55sLFNKo +pRwnsbQ04bWsYx6zGpHoXfiwMmGYNP8zseMJ/A4fv4oJz2JIjelQcLOoyxjT +WagxlKRrDm2GkJYWC1dRjtOKS1T60kkkkkkkvoABbaG0T+kPbmFakww7nmP5 ++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 +c2TG2mmMZKZlZlrBJabZM1Sk4WRHVV3Wq5qebg2pEsJa6113JxsPHyatTwtn +iqq3TbCx9wXP4jrr9tLhzMyxGVHKukMSjvH2Vdu0M0mpVpi0ZcEifOopIFnr +HlU6JVnbs88w8wqYltPlKs1hbLY1mJfebn1WaiRI+mIuMdqMXKTVhtPH0c+3 +KrMT52jMglpL3TITKJgqLmNB+/feq7Lhyi50vDkXZTxftGLMvPmT4Lyl59l2 ++bGEZMHTai5K23kQ80ml3l315TLp4niGGicbi88ZVeK3lDt8Lo5vLPLKqrJz +eKu6yO5OxfQp3dk45F4vFvKMZj4T8Uo+VSTSbcXDT4wqfaZD8sZk6q2PEUTY +0zBh4I3TUtllH0l1jl2z8jWtkbIiEcIwb/SxyAAwMAz2pxf5756CMf/C9IJA +dj9QJARQA0whOD7cu/vJ5ypqJLLbM2BbdXCpkqFfafhepjK0W20nByONyE/U +bnOGpvtbc7YHK488XSY/XxWX1XpoQPegXMBBIICT+HP5H9TrSyfrtzU0ZUb/ +kc1KAjFY9/6D47h4rtCFUAPTj+o2ScKOLJlHift/PjRKsVZH+Tr9149P2kex +PEcqk72c1rMzGRXjfndI/of1flOkuT4qkTnUKykZUyJUmSlPPbI7uSuxbnc6 +dT3rC1hjKxhcH0X71NMoSMiSbmKyDTRLSqlppQaZKZMLIxiSyVGVmMsUqZZX +sfbKz5sLkOvvNy743JcPT+Xk99sCAX8AkAOJKSHokEEAFAdRKTzU+PhEeTp5 +OTWF8lY1XsEs3FgeabznlIc1Psti0pFlOZytNNWmmmprXJm08rh6UpK6rKo5 +682HsFsq4WO1iqg9rNzGHPlW77amFksYMlEcJtW46iwww7tw4EfBfQ93sh35 +czUr43mldi57snFlhlPk6wtGLt1wKpHW12vS5lxXg8Ldyz+Z82PmXL7xgyJ9 +6p2Tvq3Ug+3TSYjzm91W5jpq6VzGnzNaMTTTRpvK4HuknIaTZeCXbxZjJZ6G +zSzaL1LPK05OW7ffLYlPMl97dyXldZtITttbtNr6axWTE9izpwZE+z3nU+Lm +P9u5k7nDIqqp8tmJ6Rx90yeFGmKPsosuiR2PNen7P+L3r6eneI9tW/fW3NuF +csfKffltW1SCqlNoyA0rLMtLGNmmkvqa9rt4eW7Xa2bWSNWWixtM1mtJrSpN +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 +BycfKOTbXqFahJ6Yz6rDg1TLcTcqMPDcVrTRl3urdSaNqrMhtWkrUK+2m7du +zP2Pu7cSt71zJzO3Ws1s1FxcNt4539i7Ry4at2bmaWzJgpa9E08LuRdieuuo +YYmjM3md9ei6M3NXTN7yuHJZVqqHHrOw8vmQn9d4PoelzToiTolR5Fvqz9L8 +LtvH8rWszxnG28jZ0rayxpp0pMzaxi8Cu8+JmrBlTVk8at2m2u3mu0yt7duz +TWvo+QS8fh9r13jqkIfVYqr2fu3wP5vz/4f5XTV2HnmJlnxSspkaiUvkRDID +WszMCNGUi2213lv5B5hrbvPj6b0jJLJBhgPGocBwXtMG7DG01/1+M6gqp4b1 +O3acCWfe5JPyS6l0/vtNOKa/SMbM5ayalJyN6TUhuUxnM3LxqSWxZVtqSblq +HHDeJqlN7lkQTdSIlhMwySJUd3d3YPzg9Gmm2TjUn8XU30fBJ7eFqlnSJLMt +Vm65WSn5yw2+Ps/LpaW27tD9yeTXYn6Q9Y9nUdltctdTX8Bm0yylUaLJeLWj +IZhMyTLBqUZR2OqXakTwPmNt/CsPr+bsPJOZub3bWKmJZaDPrHlrymt5dbt3 +1BSututvptu7udHs+qsswA3ravs74671b4WBAL218fh1d3d3V6+Pr16fJfVK +UUb7S4aoAARHq3t6763i8XnyrN713ak8LziNa4Sy8f6H5o7qI3/VTqe+7JZL +FsnaeIw9tI26jxmaxkazVajWebax7p9JIEaecNR4TOru5mKtuWa2jcTs4GHZ +VK8SSTxaU+U63HlTxTPnmS+HiT08S1Zaiyzo7FPP09INRTc5y6cR3+qdU0m+ +4/tWMsTnllzOM9M/O+q27uW3PWe/64/rjvEbHuhh91RqM99T83ciRo+LaL4t +sxZ622TGmpMiHuVVXkVVQuPRWZZkoXQqpLhO+zZOhc7w3RcL7PF35QcsWUyw +zKMefTWpjEkIYgYSMoxhljF4DHt5lNldFqpVOupVPQW22R5F2Cq4t9SNMCtj +Vqq8ZLEDE1CjUcMTiomynBiatscTRDRpgmoycNKjgrCa4tqsJibyEcTUjcbV +dq0VkS8RPsobvapNtJbTZmSSbJY20qipVI2sm2ltJLUZeykxEioNOMxOKkzM +zMbaIsWLJprTbS1ksqVLJSlZtlU1EqaVpo01m1NJEUsqUtJDO3ktvXnq0rm7 +ZtlpGs2lpqpbRUtmqTalqSVRNW8vbWSs2oFFtqNasWteZ6oqT4K+ad0myZE0 +4VzVkMtVb9OxdMtw8tZ2p3zUNZesSCdpk7DP1TWtS2IFpIzMFZTdiolLutuq +V0uruuUktq7gAA67i6Mmq7jqZSlSSiaw3Ncpqba7bNrZTVt1TZu7KW6kySsz +GmbXC6UgOruqKx8LfTRa1ZlrNlrav6yrNU65JLZSyW1pqKarm2us1XK1yWEz +GQZhhZLJVpJUiqiMqFlGWEzvB3eR47+SVt7+REJ5FRu7GVO35Rq3J00tO3z6 +qZqZYwUVS/4rKx+AuhUtm8TBV3jJPhZhshtrRDjWoJjGak1rUjGNXWo+HrXW +aUNMGmlmV63dZSlLes3TJSYZSy15u683cMqcs2ajKy4VTLJMXyMyOVPJJuSm +sTW1Xs8nF/T25dSPptuGOW0idiDjCRZRGSRE4yHWuMtzMzMzMzM39JUHxkT4 +15EJhylsk7OzcUwyc0XdbVJ2cpUcWxjGMpysWh0ktwAShCAoQqWyQqdbSsH+ +GysVv8vtrY7Wbm7eJ4091LZ7NPDfGbeNL1bZNLih0N/uSpGkJnW/8wONj39w ++g7qZPGd3xYX3eqOb/luz7H0By6+SXHqmmj4QKGACvfTT3r1m/Xve8n7g03q +4+7j1T3qxrG6HsHrLa3ayKOqQk5pO5qKMV+yiztRqwxR5akk08YnaueyMHai +Jc5PSd5ZOeOXUVxDjJzODUrtuJHSjVLZOZ0mHmmc7jlxIi1D1Gsh0lFbMiy8 +LVk3t3yP5uHZzZRZy56lO1V14OBNw3PRiOxdSw2WeOOTjpXJf3STXhyyVTgP +PeKdywk3PJuYiEUTcpPMp0rhRO44ZHTxnaV5muuWdjHDhKuXclppVaUwjzrc +1VqmzZrDvPJh3nPC13nWia2w7Yw8oczCeSVKTGblknY2Yk2eNtSTe1B6K0R4 +cPFZXaV4THJe22OsycF4mnmqdTKaN+O7ZyfCu7r2iEGGKaLUxS4Tjrtw4dle +zkOXKPn+3124ztqNLPRa9/TW/TJ6am4hB1HCQgwVViim8YSq7GPgPG/x+L9X +k5/A52tmanlkvzMSG9j6YGD1LZf3vHN93DVy5k7upIbtpJVKUk+K6StLlTMO +k278R5rxlW9djr3blJJW1GWyJ0VTM5bmtJpTKaN/U+Xyt9XTy7p27KrhM7iR +yWJxFkjhGRpYokwgIOzIJpDgQ7SCBDS6bjGxdAGfoXbHxapRakqSklX1Na17 +bM8d8ZmM4ZmzNYa3u2cazisR9EfobkkTiySJ/h1rVzbW/rf+p+P/Fet8191a ++nWAAISQFrbWyi2TVtspZWmWZStto1s2spLRra2bNomSVlFlZixlUYTvGotM +WbWVajUsa0a0tbWawAEkgSKrZVJqQABIEhUABJCC20ER8Hz+HGp89XIx80xe +zv2ZJDJJZd3I+N1q/FcVZOrzV4ZnMcNSaokqosmkZAwsR2OOGka2ucVqpJKN +bdu71Oby3qvKXnTElenStMjU4THxhKTklJ9j8t9R74/o/VddEr+T9B/S8+/M ++2/6ej/M9P+F4PE84PEtksp4xWPQvJnkLyi3WKvzNtBnLNyfmzk7VY7fh0n4 +Q5kZI4ZOpSd2cCjcqdKb8x3nCFWOOmnDH4PPPYwiOZpwMw+XpE3yki2RIRpu +Tafzrq2qqqir82lWVXcq+ZJJyuNA+V0zGZSefuOHbjbHY+UuE8DCunJYw5N7 +RW0GUxY7ujJLY0mGFzMnod1JVLJTQdvTjOdlkz/oVPaw6qrl+h/P130oCxFQ +ykTv0iZSJiSUMVQMgCyLKEqwlLQQk4J8ZUPAonkWHkrVSaFhiepkOFhqokIt +QjakcnEfb9jZk+oNMaTdY49xrso3yhSl64Ntm6ysNZJccQpPnNSOK8o/hUSt +V619rfgpKy1Nmy0tDMKUzCstmpabWVskEpokgBMTKzKSAgZSYEyQMwykiLGg +VNTbQVm2QVNTZUKtNbS1NaSEyyyy3W/QdX3PmndH3HiD19Z5Sek36ZJhZ3Q1 +MC92JO68WSZODUajjqZxvV2uxl26OJxE05MTMj1hpOMKIqi1KkWEWMmRYlMZ +mmKaSmGRgwZiZYYLJJiTKJZYhmKJhJMoDCmYIWlXTzdTWnpmH7zUXc1CrIUc +R5RPJFSZhG4pNC6Zz9xa0waarlbPcE4yHatmWNT5peefJcwPAuK0GrJ6kxNM +epS1HommsK/QTDCQjeItj0iCelFLx+9oRiyNrKFXYujOjUWMYyLZfWjVjGWV +OLat68hobqyo3xBskWRqvyPDb5pSkWe3gLKitw2fevGon0Po7RIdz9ZUfyDl +T7crQ/iHTfmnivvB5o9F04Na80a3CyaTDqnVTq2xap66RCNTQxhWTJO+mqUt +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 +9zUOSc2yhoGUQ6stWCjIhXjPGPGOdDzImmddAsKh3oHiLA1PVjNrV+MudzCx +AUReS/JUkE0IS9q0bVDp+2FMWS9HnDbcpi9zhcdakB06g5M/ufHmNAp0AvTv +8pUpykkuj9kg6Npw4YFrBf0Ms6vtrCoyUuH7nVdQYESej+9vvWDwL0DqAtq3 +69aq9laa8TaA6TAjbGdJwoF0R8xq8MUIsblgw0OqVLC62jHb8NOUjhrxoD93 +K+zPsuD8QUF+lX6sog1PIbWpr//2q63q6WS4oiFj9Zdxu5044ClNP1+DTP/m +bsbbQbcnxHz+byZeFOVjxibyEmzDzMLddbf+XfbAH7N3nrdYH82PbgMV8h5m +a2zqn5EyJ+1vW/qwK2ierxRNJP1aM1obJHO6NfbvfoSkYURk6IOlS5li7jxq +9HuI6Dvws5el2Si8uXvl44dQRtI5XhuhFZaCmjCdFbSuD1jGHMMP/xOK9g2z ++lHmEMTIHNLakejh9AR3TUbsTPVOI5lgyAUsKdrUdE1LzKKvigR1HU+x00cA +b15KrUuUzELypTXsv+3KgmNJdzdwRQP1dfngw/V/6J37Y+Rm4piv4rjaVtxC +HVS2x4iBn+UZ/w7+CknZMm+z5Cc1u/ISxAV7nAw1fYlAV+WS+QxF/qBSy+bw +yGRHiMeQWUVG/e29c3sfUvcVYKh+hNdpZfz8U1iDH8P0MyTS3klT8wKJZE6E +x/Cd5ulaOn/tY61FuA+udfdnQhKkhkQiDQcUtjwMxU4KItxVf1x8SZhtLKX7 +ptsHzVO1orILAQ2hec+tx8CURuFLiNl9pSyYXCEgTx4Pgu3weVjcNTQxv7G7 +ohqRZIOZKbj80h4xvRmhCtIzq0H+PL6f4gdThLOiM4dYtI6HDreVMO/TcvtL +Fsy2ECCe1bz3F35RZGdPFN7z4eSQU+Zc6xozm6OD6sFcp1qhaO6GymbMrBJw +h4A8sl78NJebGgsN7kP5RcC0XedZ30A1xHxaPivWAykUA1h2INgQiVUq5nfe +wpW3en6+mauh0gf+bQU2Vyzwf2YcE1vTd5Y4ebpEff6GRtjbQ0KYG93BunmD +HzihIaxKoP8Jqe/6NhazR4sXgK/q09p5+NDG3NqQdHslkeA0XwmJy9SBvfeQ +tdZLLfK7SeI9LDJKhSK/9l8oCbEgLEETlVvNLwwuzZjgdFDhNIujYAvGUL9r +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 +7OAKKHNtdTudbBQSpId046VUHQ0okAXQxQAEgAKCjTdal76S468gPtIVgAV0 +AAAAMe+W+AAG5ILnHoPpxudePpWAD7e+mfd96z7D59Ekvn14pIHPL67eAHev +uvjIKAZO+73nKD58wt914Le7fAGkKOfTH1J6AAHx18+8HoADOmHQDOmHoDnM +AC1TAA2pgAWqwAjWAFo+AB0+1fHvr33jr2e+PtgG2FtsMqn3a4waMndcSKC9 +gADQACPj7DoG8854p9tSQNFAxCgG2AB9siVXHTFERdr75KEinvOOk9xumJol +vcclI93td6lVOsWzBShVS57uruc57xccipUCQT2aqeCwTePsA7sObZ85wbbW +wqXL4fV76++5pkLjRqbMjWlCyWRuibc+fN6pPWoV5a9rHubYYyahGwbWvecH +l7FWOzrrKg717yHwNVU1pLY0N8WBjWuVbQ2gDqzZbbd1co7bidzbUL3zg6u9 +3ayU2d5cB71mnnt0EBe2ruvTe8aoqRtviBnGTZoqg++qb3adu9VnobmNFmAd +55wkAXcvd9Mbb603p11tWBRqxq76d57poq5hNtpgFBd5cDmxo9JNu9CudClf +fHux62m2rUoVVO+vgffZlQS22fVF2tCunaluFmugAAAAAO1g7YCtffPPgKHy +H12rHenIoXrYzNkew5SRXNtYfH3OvFkV49n32d66+91XvNVp31V7I942A1Si +fYNIolVVUVQEoqAUAEAQCKhVAoAkUJEBQQpRKgpSqAUBQpKlKEiiSgKEQKKp +QAgKEKAoFKkAlSogEgoFBBBIkokCqJKkpUJJRQAUBEVRIAkkiEoihUSVEgCq +vtlIBtpCqknEVEAAAAABMAACYAEwmCYAExMCZDIyaMTAIMABMmmmAAAJgAAA +BMJiYATAEwTCT001BpJAQAAAAAAABMTE0yYjJhMjEwRoYEwBGTQ0wgGjRkaa +aNAZABoGjQA0ANCegaAAAA0DQIJEICEIQgCNJimT01PQU9NTKen6IyZJoam9 +SPTyU/VMeo02qHmjJT2U8p6npqn6niap5qfqp+jU2pG9UabUabKfpB6k9TTa +T0mjyQ8oafqaEep6T0m9JPSNDQxMah6h4UEJSRCCAJoAmKnpplPTaSemU8Rq +emo8m1GCR6nqemkxPU9TTwU09Mk9R5QBp6jIbU9RskDR6gzU9IaAMm1NDEND +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 +szUlTUxAJ1FN8Fty3a0IOAGhqtEGpL+yW3zz1OgpEsByZN+0herfTBVPoCHF +KRsF4UHuJaPVPqSHvjGuomJGKP8XP1XssfaCOiUlyL+mlbjbWd6Yjze/0RhN +XrPTt8Jzk384CHblbmYEvOKG1nsqJdZ5SmpmhZn7MhJy/OMepne5jp5xkVYy +YgnM9odEt0Zdp1m4I13ZuY/wlQqmIORE24ye05Lwhz6T+vBmZqA1CIgEF1od +OdqBsQe9dUMtxIBX+m/KqCBPZ0+HCvNEaVCABG29EC52VRz//vd5XntHggXU +b55Vf03B5f931238ucKmIIIiIggggCAAgAreKbOe+Kgm6B7yPizG30B0AAA3 +AQHnzn0OQrfnNaCx97mz9p+BsDAMCECERAEARHL2FPbOi+U8nzPKyXGd10P+ +qbBZ6tlg/2MkAiWHA1vVPlRW+hZWSVvDAAM0o4oJXBQ6zCUeB4afmwkEkjVE +bl1wXC9k+xlP7FVrXsOrF2Ghjtpw5t8QHRYXf5U15j22llMASX3Ia9GmoTXq +qAlengzC2G+W6D94diKU6MN1jwZUO7nvvgQqII92VMF4r0ll2ABjAtQTdRZq +xXGIiBPyFWfKltXth3tpXH1ihREQDlfrGu5FrJUL/mu0F9M39M/TNQmdozeD +VuIIP60ynmi/JhLiRpJErfbTKt9nvSjKHbySYAIA0kCAAIB0y13Xyei4Uf2J +2mm5uyJl3vrLIdb6fi7rMHFvWWp3r7zFvEgzdX9p25xv3KX02//MNpZMPfPB +1+NBjS7uZbiea6GLDjKDDV78yMzE2+kI5ErICc6bNW3uxnzJ8fUf7BpCy4Xz +vfkUI4fbRzZ4GwyphiwzTZtwNA+lGXABb8qBRgs3V+ag2e4jopCI5AWIp61n +giXPKIjzCO2JBl7j54Opta4wWu3CJU/OZH/JfwPeMoxgih5tq4T9sohBQYQl +yOXnZCgC5K82PQY3jcMqFu6/LaXUY/yNXeW5XnfhRDoCCCCCCCCCCAGADObD +yLlRvNaH/7CdJk8/52swtL4dWoL4F21sxcIE3XEf66yepPBiFbAAgAA/CirH +yLUZJp41gefPL608RsU/1e56W3d8k8sS1vtORxfFFV/xQ3Ww/uk7kOkRSytS +NH1sRFxvxmIHsy2tT1qzKQ4rb5uofAzuqhBI8daUNiAXF3Fo9WJSdBPlFqz1 +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 +L0RKyjC6euTSYsRNpK+78RXo5n6dlVE/DoO0aepH0NnkFgOswZixmZQYXwdE +6ivZHc3z6nxdaOr9rR1UfmE5ufY6cPp6jCcRt3wVrTQLGIjS4zdqtNHuHslx +7SZiyrGDO6vZ9otRw2o8Ho6b3GPduTmRJgyJXJByOpjFxIg9lUY8oEZNUBYb +GEhCyAzbYDcksXNefAuAGG1ySJFeb0ck6y2cm+uWcPGujYXLBuOi2HxEMECS ++i40B5hKEKdL3EIeCOEMDhOkMOLIQ4iDPoDAbGDgwGhgyBjKKKCyWWXBkMQD +5jrNKYd1VV2JRYlFiIMohsiaYbHA1plPTVTxqvL5WGNobKaoV4VH71FXqNyh +ykiMgQB6wkPpTIGlPkYrIlA9ZoNFVj4hvqtrBvW+j0cXabUXezVDoaV/zvHl +ScEwea50eYYlQYQgUiFiASIiFwEKOIUxlEZmYjBZTMkemo3rh+ol8xFUwGDJ +1yu7hSyMYYZlMJALlCEIggIIhRPt8AsgoSEAlChRVVtKUsplCHgfXqrlWc6s +QWSgfMvWoonve6VRUntF96AVokGUlISFAIWRAhUiSlWSUAkHjyliEKHgnsxM +RJRMxk9wrte2nA+aqPKff0e5FRij557A9zTm7M/73t8Q2Vdku2bxNQaLsqp5 +2A1eTSHzrC6w9xOpMl5jF5lJaUw2buC5rzSvVWx1qZVkFeRjKj1Yq94qPDxj +yPfZ5O9pWmR1YzeprGWzDDeegv8rsh56jIZ2BWoUEqEkFIF/IOo6C1/hbC3p +d6oVrIinBQAcGxPfa3eHg0g82HlBNUGVDqS4QJVeVGk5kxTf6F/3SUKCsuFW +OWpspiM1hTns1G0PAvg4hnDwv2MIWIFX4Dt6mRaZYgn7yYGj/WJJFpTrD4NT +ZEnAltYHH2ZlShiM6K4bdHkaB6jZcR8dnVUA5FZAqW0H7T5xWjBC3+hL+LQR +HlgkBI2OAm/9ZYTFisGvjiult3sWB1Al0epRDhhvyDA9QyKcuMwP8bX2LFv6 +rm6iw2KJpF+jmHicLEI+AxPBlbU0UdHxRCsUaOVj/GAwDB1TQlcfS0DEpWHR +87NZn7fJQTk43yY37h+4Y1yTgbwoPCELqZwP8fWhiRrviB0vy4xOwJ1fheh0 +KE5ClZEQbtv3JniEbD2XtTv3Ee19Xq1hHpsu4UOAwwE5bI+kS/mcz3IZf8a3 +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 +lwqPWuG23heKYk86WJqrUto/QpKpfyOFRyLMTCQKVZCKKAkJFHsDCHcHD+cj +40TEMERwhdsNVVETUUzzpVe5FRfyqpJ3ePfLJisSZIEpQpEytKUBDMQkUg/A +MHxiSJPcB8z1RMQwRHqIXbDVVRE1FMeoVD7j4gp8VEEPQfjEqtVVVlVIYQlk +ITIAfM21Sk+A6+rMuvMzzJcKvmSwkO4Zd1PJpJvmYUDGKZYELGBrtYIzobTK +Y4btrxJoXYbLuEx0w3q9ltu1FiWjFg2xnsppuuRcbOFN2JtbNhvgZNsc3DXm +TfY9botnMCO92HyRCAx2XG5IKPneW2prOw2pIZGqcimzLdlRoe6lV7Co/zad +ZK54pYMhTO3ncwVfneROwuFK8hRtLITma/ytgaqAIlCIBoiAXgVCJAKwMJKZ +wqgZQhhVQhEkVmWAMyjGFqo0KieU0rCRERVSK/fKgMqBMHfpFTrzI8KBkDEt +gyyGqlfkfl/2f73zv7mzjHPj2cm5DUxdWWv+hnofMn5XlRNMgif2ZZauUv6X +H6dkoT9jq8MDLmBGTC0rEytHvdYdEbTlqoP1XyNVQ1HtS3k2XvdHaMm55q/u +eP/3s7pG2fnCE6vJMkxzsrLSz4U1QK9TaL/7LSxZRuLhYKr1p5gfGU1IN934 +oPsa4LS+Fz7+wqappcRXPsV5RAJIJEAAUXauUzJ2SbMvuOimgGoMwSkLmB1U +fj7i0wsY4P80ImDT0HR6jy8oVwu8O8AEUjoEABH8cVw2Rb0+ZzZ+12I2FasE +BOnmFMaHdXasD9npYqwsZ6z8y6Yz9mM/ugtDsurCVTCClrBIEFICOp13+95E +eXVDUCQAFDTPUnEdb8c5CjB31REveMRTVqhMSRq5DJUpECIliGJfyGDI8MAf +NIFPh7B91pHv5+e9j+82QcxgI+g9ee+Qj4KEZuluB6oLrqxmm8+osExkYVfk +tVPo/e8lFL8FlL9bUeYRpsLGEYLEYxiFU83n8KBYsIUaggOOVqkEGBWSoewX +pV+7+RfkTi8YiSiIC6UMeTsFi7/0mjaMCmUc8Sw5ZpeQm48cqEvauwXwNQY4 +wFXEThK5SnrYr37qdZtSO9VWJ2dmkv3sV999uqrJxQ+nxe/d2iTWBQ1+zhGg +DICBWkIJylUThSYQUwPQYK1TdpwHk9Pffn5i64Hj2WepUDLIPeMhv8RlPlqU +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 +VwesYMfsTXGoOyuF/JYehjONw7x4JgZR/bvAeAJA3w+jacc/Ym/EyMAMVgIJ +R25ptjKHEOwVxO4tgb8qrfVYuF+5FxLNPWqjNfpn6bFNBbuW6DGbRnmA4311 +yghXZRB+zqsxMMyPRatYZ+lrU/HFfafzfpX6f/J7B3nsvWE1wfYXZOec1W/N +RgAECBABtCd5MPb5X3jODSpF0zb57EYuDmyrfXfWl2ig14iKDg8OktTk1f99 +dF8RALAREQhBlUkREEQ5xbnGtC5eneLs9J7X9eYzDi1bqVm9r4Fz1K3qDHeW +sfw6F8r039rTXk9smz9Hnrur/QOe/F7C/oRieesyJSiU5EvV6W7FF+XlZkGz +8L/V+mbNOHA7ftH+D0tUq3YlV52VFH0tRg6ITEpVtsmqpoNRMwrJGFmBmQGE +zBqDIasMwsw/FqWQNYsYrGMRkVtKqMUlkmYKEQEYkjBiiRUFiCKxiRkAikVQ +FUiwkJ+xPUfRcfy/5P+PvhQSXxD9m0tmUi9Bi+m+p3Zsr5zL/mfnf4yfSsc2 +4FMdwk1iJGgRXz+nUqh3ahQzT1zvVAgjpf97j65+7cK2fcvr21H2Pub3jZ5l +L8ro2H4zO58Po44qou8kHu7pMQhPSIl/8mqL1oxMXxgKZ+iigOd97v+00vqH +Lx22B2OOMENJDJBWIhQRo60+LMKJOlHsywhjBGJIc2EtbUhfa49xRVpAy8lm +lMRHWcFNqqGfL98L8qjURIo6SfSUaakoqJEiSRkPfXbNW6IArlvf4x7/5yUy +6+blnOrtsNi4ln678kAZXn4tW7yoef9jsI+zos8e6gOsSNhkz5+ePymgLIYL +mtINLZ+7tTcM0tLvGeT1mZxrdczaquYYt0K/qIwvKrysTjNZbLAt3uqxFTBy +ThfAr50TCSJDwyOOFDxRxW/VEn+RdA31BvyVUun5/F6g65UBXzWIMa7+Y11o +nYkqSLtMsYAyc+bU642Paq0m6PMRXCL+Qc8RFS5HnOGffV+UvDLDVXHbOH35 +iG3tlma8gmiWevNObwbCHLLkMIsjUlmp6hfxIoR+EgqBbiilM2fhvsC/HsOQ +PZsrXOHVbxWNqNYseAec73DD3mMQck3df+NEQOyGWexBjSkhZaKhMCao2Ja/ +EihwLclPi59Dx/4zZFE9cGyixHs1oekQ8B+zJGdhzJi+qFPgRduREOzCG/vW +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 +ijCRsvwNV2L5niiO6I/4aiUJIxZHHuszElnTIw1Domco9JzhCaQSiQjdBxKy +oEMMSaQ1mK/RRmlYBj6egNqKhtiRHErTtc8gFfZKJxK/elAtn7NBXnB9CKur +2igmKCaWQu+BVIVq8aoY9dih8nZvAhXTO7n7Tv0/7liF8j+ZeCet9GL7nyZG +fzMLpex830/qb/elcNOuIMolVkjsTaBNCSaSBNCVo4aTnWf901ipduOP3/IK +plNflsXjczuiufznQ/Z/1b1gXshK56q1BCuqqqrfU0Yxn7V71WMVbiq2GatW +zvjjGVcky9W+lFVVaopFnRkJLz9/zwn8ir9th8blP7OFbP7+Fbb6/L4b5/I/ +F/OcX22Tm59+fma5+Md2lf5yhzKB2Qn3p1wn4igbqBpQMhPFJVwAh6QACzC8 +9vBqsYqqqle/j4eOfLVPHN3yW55Oaeebrna741jeuc81p3iqoc87zne+Oc86 +qqavGLxVVW+d61zjO964L5ccZzV44501xxznnnnHFXejY8a3zt4parW+L3rj +OeOedazxV73rdVrOeOc53vnReuN7pVqqqqqlpaRqlqmhqlqqqqqqdtXnnO+O +c8G9PPMx+dCH1oQISfaUFQkCXYxKI3u/4EodyqO4oGIqeQpOUWUxYxJixYxl +iMsYlg1SsmFjKI8wJzAP/lznIJ1UrVIcaVGygclA+xVQroDRexMRBC1n8VN8 +FF0biSEXqO44a8uk6NEa926ZwjbfVVAhiVTVotf8K2rUIREQcHGlmgInPZFK +85/TfQNhS/Iyv+DB+ne3vj9qq+9ea+DdLqbPufzt4TsUDCge3hP8NKfGIiAC +IoyQEYqIIMBIgsPuQnuUJ7iE9sCXCkdwYoEEWIQIEJACEEYgQGO+y03hVBTF +Tzl9aX6RmXiPcNtc7l3wScPsQPxFfRfR/RgZo92YMY0aIFmoBxIG9XxX0fJi +961zVUXji+Nl453oxznObvi6rnDWtccHOd541zi+V1xozh3m92ON8TjPG64z +wa3pNbo4zkeOK1xvF1aVrA73w74wZvdHPOsPOd1lzV43jha51u+Wsmc55zvV +WXvmtHHNZeLzq9l7pybEGAoKco6vfOOcaurbqkrO988cG+FTHHGuHm65vjmu +OL3jF63e9cabOMPLQuOM1k1jBcFNassRgDBEBG7u1W754zxmq3zfO8Y3zznh +u93njPK61rfPPBnYd4EPVISeJcPGSQPIi99dkJuLcMY/MhMVU8AysrKzHHVN +GLJrRqGMVllqsLUTBz1GaYbZQ1ZNMk1wpXnedsDuBPDxPKq9HnMK+9qsei64 +CmF68nXbG/T1ccBznrXTeLxish71Ql9RwEeOnTjdc56566443vpw8cZ48pCH +UJuWdPewAde2e2syZxnOUEUUX3q7c11ByNDVQ1e8VjFa784HOe9NbzWud8Vi +8c8aeb5zvmufe0bZAnYnDAeeOnS6ye9oyjxrrXtd/e7QxuuC+t+HN1XmrXPX +W8cOHXHPFZ3eK4rw3fN0B4AGaxo3jnpw89MXAh1A6kA5DrQSTjd9Xjp163wQ +l8c665hArpx03055vp03noTPT3rgcYzneQyhOek53gyiimfe3YdeOnGemfe1 +L67lGS5U1OueOvfnTfM4qr4MnFb1OKZvk3zxSYovBrWrqrnES8b46yHgk4DX +VWsq88aJMZ4x06PXDKffZ1h6ZxcOl7vms6u8mhXZAQBgDIgF9AMXrOZ7lSBN +nUymWu8A40vMgUyO9Heuhx2V3J2rDcJCbmg6uTop0nSGQo3InO5uFsoZsaLm +jdtTgMW1aODVmSE0HSoEmCnZ0LMQhk4hs6Z3NQgnEqQkuGJjnnIQK6HPNarn +Bh6a55zneN43xxxvHTm9a3xbrXNbvHOWrqXjC6d3z0hnprW+Om5ACaypmt1i +9a6c9ONgc88dN9NEj06Y6dN7Ah06dOeeedgQ556dOnTp06dOeeeeL3rOedc6 +543ve94xjFb3xzzxxxzxxxvFHO943vnjEk6EN8J04H3MgkAwwBlUlGS1etAQ +xYJgkhKpKxQYhjM8wNlsZ2KECBGUOiduy096Td+363ox4kgpYDnHsveVViGf +WHxWp4V5jOrM7tw249ZoU7k9q9XIO0oPDVuCHDeBNEIRD6ZHm32aCBCI3UoE +IwmoyGFwdAghQOkZh86fBH7n+4+0o3FARER6l/vflbAUXYbtSQ9vYf7f7LhN +qr9f/papbZAQ9DKFV3X/Z5H4Td8L4fI9uff+zfpneEOIRAto5a4ZZPceF0FK +RwjacdrNSZ4wrq1ag7hS4Qy5QDIRJ60uCLovpVmGLgQIMuhEQQE0fYWkr7zR +6XAQSxRQLYfceyFGY4k6fAmmxA/wQtHXH8xuB7xANR9Riyu9yUTSiNb8iGHJ +tF+oXuxq9LDn06J39GZimOEav2P5Em2a+FsNdxvQb4oqQfu5sS+HkH1oqj6C +KfZfXArBTF8+WEKQoiYNabMUjWiUPRXmqOGOJf4NxRFUdTIcQ9RV7fgGPZE/ +aaOaGPXuxYcfLU1THtoTuNhxFa5KZlnk1K/8jJGCU4XUTUqNqc+r7EzoyYXZ +KyObvlrOeK4vIL1smU/Q1lYaMrSUFIRdZn47eet5JdwSpUmjPiYZ454dIQlW +XI1GLGI+fnJiJbxLMKPI7xx+z/QRXjmN706wurRrl5bXR4qoLRsutcqubGrw +lEN4uT01h4TcajuLQ2ewdqKomc7al6Ym1ZytP56W4kH04AtPRDjNrRkTqnpG +G/x804ST1RpEpi/PQ2jyYiCe8lYoIgfvwiju+qadQkQrH3wQpiFwT0IQjnFo +7v139GRzKnXHRraqJUEpSlKUpJQIshFFFBRRQUBQUUWLFFFFFFFIoooowRRR +RYooooooyIIgiCIIgkVkiqsFUVRVVVVRVVVVVVVVVVVIgKwFUVVVVUFVVVVV +VVVhIwiKCiigosWLAijFYqrFUUgoBmRlLKLIZRZDKLGBmMwUUUUUUUUUUUUU +UUUZISgkIkJCMi6N931M41P0Yx2272+BeVX26abSK9xLwPJInkwotcyGcTxN +WfMCMyvk61+KETRaJroC/4iY15RG7MJJdPFCzWfMc95khJEYcuF6Mvzh3FQy +1ecYbimLIdzhrx7ScLHHzhFHU7prq1lYynUhmIA4Q1lIbCFptde86Lqry0Yh +NO2JDCM/43XE80x9e1SlB36AWUY0bXipKyYKjgn3MvT8sVBkFztCwRHd8prD +WHvSzvrZXvHOxBszlqjYVi05/JEe0kgx7/b6x70sa/sokI/fmsBkmmalqHfl +2KTyauWPoYgAPMbMyoxpR9CuLPOL7mSh6TCHT1YjDqd4+Vo+jXR0XaKrfehq +IrGjV60xyOyY49BniRNDOmnN6i9nkL6Lpg2qJg2x2wsTePceWIlidvj9Zklm +4RU3En4kSLaPAYk0xJHfNEdYUSqZ1+ZnvfPOyTu9G179GGbGsMUpiL4k/C7J +i833vm8b/F0JYwIwG7WgnzQFSnM6uYenQ97bkqfAXTs1BXlwbgdoxrAXSy0T +89/VP0tks29yq8ultTJrIzzZdOqxEIuDDNGudIxbIct+jl8SoXYvVYB0Wp5d +5cb+hk0n9pCqJIxKoOUxNzvG8Zndefd1wQvLKJI7x7/4vG47rPy2HeapSofe +k/lJpUkcSzpEOuREVqJkdYHzp6n1WSx7q09VHAOYVx4V2YRhGWdd9nbm2hkG +4iBArk8QhWimR/sNgaE1+hyg8cfJJIkm9kNEUnmP2hC2EJ5jPFsoIvakBYOU +R0wcIeVAirzkmLI85J+j3jkJ44KAWp+SJ8Z1S/fS4fumZY/r3XsCo0JEiuSc +Q6hYNRQk98DvfIWz+tnwuM3hxSnLAjEUwRke0VRGCK7nsOUJN/G0ePPg+aUA +kHoyZdu+ORx0XfA8bgHmHPCRFmqN8arsqwkgR030pzcbg1n43MnSpihOeax8 +zo5OyJGIRtepBNCEQHO8+YOEXh9DdFzC3Zux669vXnfbStE0uF/pIbEcWI8g +x1Q2zt5/EJxLQX0elGMY8rEF/Tzr9g8D2IEAANCSKh9w/jpMrzwl8lpV4urn +YjZP9xfApQ+WRln293q9nYkTlixCOT32NYOV44FcFLBmqszuP5SmYh0BJ90R +Tum1K7wkCfwp8SwsfN9tod5lIgwx2WKecQ+T7PkxYsjLGcFW+k2dwsXBOoeK +xljJgm7aYND6+S9MSpCnG5smQutrKKM1JzlxNkINXgvBlTXGg3xgHH2xk/Qy +x+McVwSXQCXQlyNJc5OphjAvB7t5M2SmOmfiTJpPtNa0fBmOOAbM82B2tyFk +RGVBZzGkEsa8L8+xE9daWs5FXZtDYCe1QByvsN+r4jPcwwMHc2yEV8mWB/SU +7hsxK9R8DQVDpIzpD6E5URFTj7KKvAasqp7vTJ4CsMo54Ps/uS1R84P32l5G +KSSTiYrjCvbHdHWjMuMSu7elrHHFoxrOIcA7ROjkjT2SP1dk2L0qUJsETVHO +ZMjvY9QcFo7Imc8sR8dzo1BuFobw/ubVrKwN4YwpMXg2Uy4/evCjjqsoWcXv +aov3ReM1lXKIGLOVFCIwkqgy3hfCC6BxBJznhxH/DGLwjiEzZwKQVEIhTKho +N8X04B21/gVfYVDTSQo0FTV7YvvkSHeMrSPO2eIdS5KmLEc8cZap3sxRjitF +s0xyCINgdtZ/KqwegwzcQh7/gdndKKkHydOiexk+rvx5dRCIL4JBMm1fisFl +gPjuxDP/FX4NE6wnsd3qIPhQjkSh7XUweqMaOKAK0bZqXkD+kyYs6vBFWwR8 +9nCvL7m/AeAVDVF6Wx+OlrVw94yMkS9lZj2DVesmrIaD3ZIz8FkD/DEWcK9l +4bu9FPKPD0F9vuQ9CgeO5bUHmc3FzklLRTISRKIhERi8osz21Y2VCg5VHt6+ +6Pov0oy1MM1P8q2ttjGYyxYODfQ2NaMZSafgLWrMY0Y1OaoDFUL/exUNVRdU +F1Uw2Eo3o4hCSrmDZRRgQWAgwjEUUYJERBixhkyphrTWjJnH+FUbLkwKJ/5J +CQnmgQugIa3/fOaOdJdmTsUdruwoJRCaadKP6cv7Diby+15OBwVY+druYtSt +QrKJEoEkShPMVBE9B6JUiCJFAjBEZEYLPUGCyJIM+2EkBmPcVVXRCiEMT8NG +QYRgT3YEr+vx428bxicaob1brWMTWqhTV6tvWs8EmjJehuh0aMFk2aKOBhW3 +N7rGt7kJqF7NXo3e98Q6wQknOFaIRqBRSUIVUlBRQygjKKkQSqBCgUUUUlCA +gyhKgxEREapCQURBmSYkkGGIVBlE9p92BCqZZknRUdXCqOaowThcFqo2VS+p +/L/M9+UDlSHuMj+qUspDqNjDJgOFZCjmQ8wDApHADKUVgYhOp6GgnAQNLipa +pCYazBliZA1h+DjCQmJIQjHCIIWPoObktsMInmoxqjNhW9mTBCslZKBChEYa +YGUxibhqzJjGTDErTSGS27mZpm7zcwzGMWcRrgJ+3P0JzCeY7lQnAPWRi+rp +XK9WnZXRU4JwmtQAgMGDjcE5S4wp4gqpcv6O5cYS6HFMyS/0rm2gyrCGvLNr +CjKQR0RxyAnj8tcgoLbHGVvhg+GKR4BNNmac4ANJdnmFQ388wwVs35PISPlR +8WYgXrw4Bn96PpA78fTnvhDEOLBKZOQWTwHB1hFFLjR+9BzDUnujaQ/4y4hL +HKn2uz5H2Pkc0oiMzkI8Cek19mIsIZzJNJwxaK7Mt5toSKaazwHaSj+ikUue +PsapXLEcDPumqEgclo3BWN58VsnvB5PnuhINiQ7MLh/peUmB26pkzx7Oq7PJ +PgYVXHY+sEe8dSAJUfDBV8XnmLKTp71ZIHPr4pPndWes5PB54+b7NmA+sjLJ +sY5meUdWq+mQ0I6rZZnz9bM78QIIqDEITSH7HErjDFqXRiKfJO535stDyNV5 +u/AnCEJq6nny2cTqjIkjlYk3cQCKzIejE4gcC3Gl7HfpdmgNIQx5OHEHzGwS +yVMs9xpTGbFygPOarTPgslb8fmz4ZAgrzEsQ9HFbrI5UWdo05xMuI75tjSH7 ++B/uNsh1jVFB8h6hiPLEXiLKo96YKwgkkCBAiCIYhKFsWsoOp6TOLmPOaYoV +Cffy2Kd1GTJ6k8p40fcOhUEO6WXNPkHq5p0hZGCOPuMfZnWs6WFRYkvxlU4f +PoOY4Yfuij1Tg4EfV4+V5NOBcJ5FwHLL3RnMPh5z5nNMYVpQj6eExhpD2nc+ +wuTG6II04prfwr9O0ls8HRTzkkKXw+0lk7WfORB1EGhF8tSKPApaJ+LTAH03 +54jRFaLx7xXPmjjTPn6QYj12KLMm8o+nnDGjAMAVY2Mwy9+GSzGdMeowhz8f +MfoL7HrUvWdM3DrQHwQBBcpboGWfO+ZRMgTO1cZcyzGTELOebx52SuBt8RAR +xoSeIBOqVjdia9jyf8jJXbX7Chsl4ysimb7q7VEoLNPs/s62qLlEbestO/07 +b5PzQxNtqHQZIIhk2UePGauXG1nuuz+rX1Wt/cfBr4TyZ/3eOOmdfbJs6Jgu +76CaNBR/3nx8Hzn/jXS9Xnk5uf2/DA8dHNX27b6Z8Ws3dtUKtm7bELMcea/D +eO+Otc7DtKOnWr51x/aP+U58PvOn3vTHfWvV9n1z41XB32c0rQZDy3XsW4or +YqtAtSiUIAgUIQKIQPohuubIeUOgT1q7PGYBoK932NWe6ZLPcK9I9985nGrD +U3Y0UJQYudBMwyZDN1cFmFcJavW1unitccrW9w7+t2MYwxsO3B20eh/5P0nt +H8r3X3P96W/KbLFwn8vy8sj5FKy2obPFOHFkURvvE/N20BE1uASMDuRKLIRC +6KAxj66kwpFgVN2y1IRv3Hq0kkpHkqBn2nTRuOymhb5RKX8N/J4aVfmmA9xS +oXtRP1TmR6fLILiJV5g8pWkSQh8eHK03w4DGl5lzlPWn0f4T3/6zwPiHef12 +O9FjLFlMpYYxT8t9j2/G/m9E9oPOfgQ+F9OaOpsUEUVRU+sKhPzxS8alXp4+ +WsLPt/owl5wN74j8ezvSolWSlJJIlEkpJSSkle5QzS/32oNRRROYksOxnwyv +DOmrT3FB1j9r4sGhYls3pslq4YY4xPgqxmMRb1UbVCOMxl/sBkeFhzBCafc9 +xwit+Fe49g5jcKUUvQQjmObafrdydJHXm1JM7Ban2HW9QkqRs2Ya7RiUGjGn ++Hk1O3vDAK5DkqljqVnGeKRGjSgyKHFlQhQ8DVYqgztvVDYcQJIzGoMYdyVR +jRYf1p+JJExGwKNYM1sUt3pdkO8Z3caNdwmGIU4QoooxvDPl9T85U+ApzbPJ +YrbiaWE3qDOb6p1htlqq/vZDvkSfukcDMm1E0JDUlyZQjD9E559sbASxMM7i +DfmrEcNP8nmNKBsS08ZXbS5tuT2k/In27rEE3eEWd9Mt6NMITG/QYeQXpNjH +fkoUy2JIo3k6BxiTIqWAQIEB8i4yS1xDzHqyROnaOIJW7ojfPwILA5tELvl3 +5NGFtkiZ6BsIQ/ZU99VQIJc5oe//1Z/I/kp8N/yg/aBcsn4uwsLtz/izWZJM +iTGKqisyGgqGWIywm/E/3qgdR+PVVJ+mYVJPnaC3xvjciL+kJKqmRwy6OBTk +RRG2SFA6NSXVUHCdFY2N8lw3d/VXIQb5EIH3PYVz/ygmWCIZFQLHORPr9hlI +UFgrglsCokQaatIZJCiYJiTAT4h9ePEG3fxo5/7kGoNy3/jnoJAh4fGD43u+ +0YMHsFLrXtG8+wqZdlG8XD4d0Ik/43FzsabKDFrUxmvweuu4byEK255cFpnO +cObcmEZ2rZl7WdiqNJnbdXTeT9H9yZocRCczkMRM7tbLVbDlaF75jaZEqcs/ +P9YmJp+nbLjG5m1m/mrM6BgSWJb7Qa0XiAz32WFWUSRI/acUIgyhX5jJjNe3 +KQJTh5iGIU0+LNacj0T/Ae8MqNp/TAmnRzJFoIghLqVNFxSpIo2xCDYR9saU +tj0TnkOqIbuLTK+kLxePourhSmOxcmavhHPOSPJ2ulztQSePPakmmqMsSrvs +7oVBSfyNW1sfmk42WhEY+przei5/oEw1Ab8ZSZNhPy/2Vko3+xIpJ5xx0CCp +OUOZndmMf7NDXrZejsfhkkdSS5zvzI4fSOp/IbVMkff+/VmrTo80ZzuJQGFY +dKXRIkMaD7+BEv/vRIPWPjbU2SkVhT0+Gx5jFuiE8+rCtLPM4JjDylE6gnnL +JLnqYrgzjmUeKOP/VbCmjvjSvvPR7Rco53DXHZSi9f0xxG4/NuWku4kNiDfG +C9Q7m2ypqntSOAczaA/kr2bE57yLu+RjqHAFUl8+TsHFzIWeVy+IRN7nDIff +7DoU5LCYOQ29c0fhtvq/zRlyV13gGTiBMD/ERwyEjiSIPCn4oTDYPKqXZ2CT +KYA0B0xdRfm17E5r2rCowSc+L+daVQg/kRGRFPrTXy4B6rHURv6jQoTsGzHj +pYkbn9lkRAcEx/QHATfKQCm5GLKVByUghyz6ePJBYBAgku52d7A8P0EMmzf5 +a8AX4YFVdslumNjKyBuZwzga74+wSqCYpsQRQlg2ztwO5k+lVVgumSEG28Zz +RsHA57t+y/iYUw9EYdOEHvKIcV+z+spQPUiekqr/FHiO2HCwZ7iDli5VL51J +DuuYyi8kbcx5jr/JluShhzSXCpLGjznsdjcnabXzVjuOyRo/kfduJs2hvZUa +CWFPQOZqDKYHdrAxDPcn8KwnF7DYMamUls0ebpHpOGddnLczzjod48cuVLAy +tqJ59B86xB1gsF2VEDLx+CjDCl13MEx0hzDAEENGZHz4Gr/keMjuNgr9nSfH +g+nuPdqVxKnhISVb7PQyxTkyfZc1eflTFPpfDhblChbiM6pUxWLJwv3DJ8hB +gWK/liPyUvVvsTOwk+uIEJQ/+Yp87aVaAh+76FFOd7ELJ/Y2eOQQQuHjfD8H +dGmCNuT54hNatKMtx4iRNvNGazqusIRChQpdITQgdRY/n1DIkYM1tN5Kg7Tk +fSgM94TDFrOacc1PLrx+W4Oqc/EDuXRW8onspyscPFiJBou4bwex8PSeM5BN +QZtvdroIZKEw5iiA+hsKEYDyoRRZzUQ4tl+CaMXwlAV4M5pVkBk5IzR8T6Dw +J6LoTtciDNZrSR6lUKTuVpLio1DKdwmBGdDK4fSHhIkcJcPkZmOMRjtCmkNQ +es6SQ49whW4q6PfMBNHaPqPCoavr48QILlYFQk/KbM0nwPQZg/q4KHrGc30N +uyTNtdHp3Zq8+N5iBnyGO/WuvnCVnkTfq1EQJNkZJbMOb2vPMwXiV+MRJHhG +Tv/ws+qKixhC/iJY0RsPkdA7mgZRzLvCooTZbX0q+RN+c0YuiNqZ0DXHt2BF +U7FdkSGz5VTBmXJgpjKV2dJq1+B5yerJlYFHfidZjIMfL+Y/GyPULZx/kciT +Hq5mC+yx1yYOhzRF7Fgp90+XOwIco8QZkz0ZcmKBEBt14WyIKKUpWZJxxTMm +YAzKrWJMyV9Sv8i6YthX6+R03MWpG0etWLrj5j1uZmKqpEERURBiqr0JKDpk +YlHXzHCHOLhDDVR9/UaVlS2qPGX0/KXAD/QE/WuNQ85kO3zGcZCx5hcDHbGQ +6nHYhNZISw2CHF1E84HQ8iIq5J6D0VP0WxashQr06WAUdOx4kIch6gvAbDXI +JNGa4wWGNBeI8Vw+P0B3PHcO8766a7Y7iyqpFIx6B4pWsXbCQPTJAYSTzkh1 +J67rKKWIhFIRVyFJFBY3a1nOLs11sXOtb4TcWuf9VNjPd1aga1rm+O6qbfee +QXaxvAcgSTnjrWFrQoKFQpiShaNAGiGSi8N6/ha9mr4+9edNmd3vZzMhGCCa +ODZwZDVbK3iRijJVSnYbN7HIavnJVUBWF/CH8HHTldBYCTlaKSIbpaIRAD7Q ++yPvsG+F0XCRE7HgKNUZK56Xe3ab3Q5qS0LTLlAwjijaUjrY33td40uSzOF/ +HnGl1hcH1HTS52vCth/rHGl0J0PtepviqzW/PxR0Nn5k97rav86q54oNhwZO +vUzCRM4s3ugwGzOx2ZJInU1ujCvxvzX3XyYf3j9X/2j0bj2VZ+SP8Z1vbHb0 +Qd1rKAdIkS3YtfUbEuWikNkvZhmMyPBvjC271FHNRcrCNZgT1m2FxoDhH+ti +YImkHszoysmDXTzVV05n0X3dUEDKU0pixotQhHGE4q3HGudWvGFIW1zDs7xM +mBHVnNCZ0sBviX/ovfVl/AUXgXCKTCp2mPPqYwr8jQi83dYlYYVSgk20+Z6y +ocVFmEQGnPHLgxSI81GOFQ6ZQeGj5Jth65ZJCPfkB9YIdZ53Lk9OuLcTJxdu +ycOOaMWDXFpCHjNLGRePFaqxQxmbdo8zJ7+/w2h+EK+TRrceiGi6QyPpXvl1 +VPsWvymnVRdXnOSTNQnnduTTG+YPN6fDKmxWsaoatO8cwfTZg3WxLs4zDnKD +8bcmiUcdEf8aQUxpM+a+yeN2bo723vhPl/+gsHMNgLauROe5YytDmR7RwEwb +itGoYt2RhblKfdgMGsOMjZFOzDiXl4qYkvCuI8Xy4H00KsXwbhcAEBH5EEBH +rsJXu1o3jy26WgubO7tiFy/K5uRCFI6wIZLnAhm4h/LxQh23ouYfv8TTMPsW +T+ZaL24FGq4kIWrLPub6qehc69lXltklKvkJF8kicELfmMd9a2sBlkrc5jUq +40jhWoNayId/VuX5Ha2UicYECAqvDlagwkUAICunxyO4TZMWo4nDypM535VE +6Tecn6eF9WpulWxWFtwucXnGuCoTSxRQx6Ttgh4DUv1f2x8p+J+/P5B78+M/ +xv5Z5T6Mqnz+35jHvenecW/sHeqvTtUW8Wc5rOfTfHQNGTUOb6W9Lxk4Yfbm +Mkh+K/9Dp+S+ze14u4j3FTFlUTFkyzDGZjJZDIKMSEFICDGMgjBjBgkEiLBU +QFBYsCEEFFkYAfm1UdSpyhiIqVOkkk0a7QELnVh8r9LE9Gqb+8Rr14LvkmWG +eRpSlJfZGKTNo5mLO3MjwL/JIK3NYJ8dhCJFzJHOOYrH66ZpHLCHihb8M5lz +kO+RLk/2oLIsmAexlJsYzCDD7rM37zZH2HVwygl5Y6e+E41x7pIyJxDb2RDt +ZoBhIoz3uKqZJEaf8JKebjKzA0QEykEQbARBxMiNkbfk34QhRGWP1JjUeUry +2FY7G7uyXRYcgRzodNuQz+M6TMWJWiISMEhgzNlgKpMGbE0fxMpCcJgu8iY6 +CXDQZ44R2T6Du97MgN1mhwW8mCgIopIi03vr6Q5ZGCvKkYhCBE+dC4Hg/v77 +4PKexs/suD231U1OdpJKTsYi0znPS6mfPkSTkTRXZyWT6wuYwKUmLtfz9sUH +OrxU19jdy7v9l0Nha+vpSc5nJw5uEn3+Omf+UyWcE9zPDFvbkxjr0qmZAwFl +zBk1xITOdlyEkmtY5N1wzYZSyqOMUWmDD25LC6MmSawxCxM3QYlLd1WLlnh4 +YberNtSVjW7LTpuYswmMTXMChMG0yMwGZ98dDR4GRODfJnNgUon54PyBMgdQ +//WdPIcZLmKO43Oj5XBTYMRkOnEoHGqPHfx89g6cPlOHxxXn1Ruuvg8ZswB1 +OedFko301W3miwEyhulTnbje+Ko3sDsZMc8Tl2WY2HJpNkxrfMymykMmDg7H +IdAOgcAghxuSc+GcCLqc2xrqGszPfnpDAuBgqUPvXiasSQuXs0LVXXE/1M1Z +zoG6wnV+8/w51n4DoWfQboKkvBzarREFBEQdootNfIgyAQ1qNNd4CHfVVTPk +d+6/e/XAQ+G2/m/hm6xEQWiCG+LRa7UtbfpUCcnB8c2jPRws9+eF0uJza1OJ +pdFFHSlh0gQv5FlhtB45wdfj6+D8LPyOaXZzxzm+TM8KPyPzGsEgWmGMyIgu +jzvOPMM52coXBHHH4ueKWpP8fMmj0i7kT30WuOqNZmOT7mqcJKiVtWHbtr5u +/u87hiOPeg1y0rWEPuxsCF1ZlIP0iT+AfPz5n8GV8/0aCkMJ88z59hYyZyAk +zJwVlaWbLHA9Yt42N5lvNGnBtG9vS1GsN6rdDVxQ5LBrhx48d3FmaA1jBckU +1WsaNYmoEpDRzj8NZa7St71vDhlJFAMY044oyb6De6waKRRBbZlq8yCbusCj +DQzmTCYNunTIaRSINpuaT8PLMtz8c7GTonRgUxbS7u5+S1RvPFy3O89sUu3G +6wXulG66vISaZIYEzqiZxRJAyIYEIWJRlqSxAB1dmYzFfp4TlHWs3dMaTPqN ++duqZgcI7DDRYW1TVWI0h00rRdMWjRXTLkW44m5yrktKwZV10VJ2kgS9csok +Ib7skNdkhVZCE046kjnVtcWVGc3NxNudqG64ytoNdm+qpHSnE4qbN5yby7va +y6lG2VLMEJDNV+NotlisFIt1TVFFUUOyEIt6yVNVNE6qV10XRLQLrijcNiuK +NgvuvavsP1LvOspfIvzH5rnhPuHqv0f/h+D7R0CuUJlK/pvY/odne8DxNYy1 +GhNP6E6KyR9MZVd+0yrksJ/f5/MoL6MtPYCUP3/eUIB6XCdQecsmrM7GWIln +FNgbsgBrxDmYUodibJjxRb0gZlNJQXSQm95xyjljak2TA8pDdsbQrseawy5V +TkifAG9CWEgjLk7xC9mbjOForlgC8bD6EpIQUaRp2BTUB/LL7eMahQF4+Jbi +boSfPbAoxfemUhqDrlOaUQ3hmO8z9qPFwctmYiudRjdCKIti+2sXcKdIypiI +IzIxSAtYUgSxjBwrzixw9CcGFLy72rabzru5zzfEGOp2T3fLfvu7XGAnRCOg +7qBVJAwHw+pxTh7Qco0wIzQOOO6uboyYznnEUwDiWdKKZs8+No6/BvpRmShJ +Zekd495pz77HuHPvtaMnDjTY/YsnKCK8yRN1JtTP8u6LJkMjoDdq9X/8VRXX +bBDRBDChDOxBD0Yh47j17cy6b6V5170tr73p+Q9lqXp6tYXZSj6r/9PYuc/M +IUiQQ22+s0z7X+ks1zXfkqDNJtO/9UQh2DmP+WFbmyYvZt0qQiIhLqWSF5eK +V5glikWwT3hqh/PYqV8zgos/2/Ofs96VyXec+1VJ8o3CahPdXjhNvM/VHF/s +cqVw3Y4vqW795yP3+yK6aQ+e1QSV+jkq9ye/v8X36L+gAQCRkMxmWT4WbMO5 +A8umI02o6q10oaJoHsexVGSGGg1fZpNgdsZS9IowXoNiUubG1CtSb1zC1NGf +0+J6jPQSRzRsSz215MliUUYJjjUZ4aBuPhEawfSFqDmZLBGJ3AnmouD402tN +wNZtTWoa0iCf4biRf/E7V7P9OCWl49gHYYqA8hrtmThInQWIVTUhgxpJGj1q +kbQ8R8iv22lJBhQuxIi1P6EtD5WhJG7sh/JWN5g0i1z/JgWUh74UYyHaxY3B +CSfofrz7jv8+X+I+ef79n4lr5H5PLeTWLHHBWapcgQklhJqKqxjIiKqixyKZ +EJhWQ0rIYVBRZKXOrcuTOoEkn4Q9RUDh5I42QiIg8bOsAnQRFkfowirrD4H4 +YhwpVk/kCVP9vjl15cD3fpy2aj+n+l0c6bJJZCzEU+5ODoVxriw5BqzGMi6y +zWWaSfVxJfPvmn5T4d74939Q+ylSP1n5q9bvf4bxyYYOc4zmZzecQ+4+Sv+h +d3eCVtrmQk/ZnJUJIQPOdJA+g/B8+Hq+i1nNc9gLq/LvDyGSHiYw515GgJZx +gOITp17bNGjnrzmQJ0hWMtVrIPDDvgnXtxMw7yjIIJU77xdZPDWevHTw446Z +PAfTzn1eHnG3Wpwa+1ZEA5vOO+d/Wu5rSnzdmPyf/KKEK7KiO6J74SHuiAFe +2Emo4u7RhKqpJeD2zJkvBf5U9PJPrvu9+/xx2o6ZAISRqBBRSQDLCmahKuHj +8X1X73fm5ur/J3P3nVx+818p0v3/iu1zeQ6G4m0r7lhmaBc9flf51i8LlTAd +res68CQ2Vtts+pMdrXmL6y2T0Rz+h/awDRoNWIm7Fm6YsfN75d28Pa14eWcl +RtXLpq+rX26uXKpeJJL1qiTJworYsUklTZkoJN+i81JaPz87drmjlJm0Xt3h +7VvDly9uXDlkMVBmozZrlYqcCr2DVnhdexvnRuzx8518MeHc8PPjqY69+3TR +nBjwNF+Jnpx7O74PI8Hg6unp5u/4PB2+v4uqh9+SrKlJ99S3WCrwiVYPFip8 +myb4jyYTA89iuOK3ZBpY1lamS/sMLVhmGCCkEEULPoghDXwHdJif3D3ACHCM +EL+B8l3mwdHUUYCJIiLAUkNBKtNQ6Mi1msrUZl6VWnazSsvfW632byZttWol +WTHO461k5e99oROl/Rfuj+VZ2OOCr/8S+vXGQJ2NpEZMoXCGsQuCgoChLhBh +KSRYIwgsk+mPTiQlwmGAKBEiFQglMIpFJKaZFyVosl3TVQqH9EYGMJv2DB6O +OXpxWOuNGhnpPqq6pDTyyemB5H/yPufud+HfnmAQYHfwfDOkL7E3uiSmd2qV +OMFOcWcjBS8QHPrMH7UxvZ+D4s6UHNWMeA6s4ul4qq1RkkBgG8m9yrTeDY6y +b7XZrOEyQg5N/HKgUnNUThCUkOgBC64rjqcnUxxmvvmBW6O28a5eBrJm7mNU +LC3qzTJ7pmh7MDnucFGTAc9LgHKumZhnGZTnJAyiyCXjP5zEAhNmMNXpRkxW +JpsUmrFRRADVYmzeJc3FZGBdBucWZQhCBAZkySYWX2X+zh+jgREXvwYrTUhn +KElbvLCoSbJzyEOARg0nxWMmYEqS3eo/+suJVeg+vfbcQhbIhEN34qyWhlVU +XCcVqzTkpLgb8xG4qGcd/46SZWiuvJ/rAbq0ek+IsoRwYGgq0SSJKFSN0cLZ +xvHIMwhty/3T8Zs2xL9gUdFk63nQpqtWdU6tKe48xUmY4vTLeIqBnnyH2ptU +c5r6jVEhlztRFUMqWY0tYLONKOvZTqoGI9Q+bNyK4blERiOG8HDE+9Y2qmV3 +bxEAXGw2JlMIOnLP8fNQ1iseovDqmaOwmksBYEGSmqKNXNgafmow8jStDnu1 +o8dQIb+VRMYeIsQwGtLswbRvOz9T+lUvUmNHWgv5nI/Bf8ban+95xzImH24i +h4qv4kOT7jNyXdYDLQGMnXtOiTTSU/Kv2GKq/tG6WnN/o6xndkhcMpbSUxSK +aYlJJKJUNBQz6GfNFDOm2z+l9YpnmSS73xlOqL3vqYFuKHcNSXxTNE9TGNL4 +dA/cRxDQCo8W+FrgiymnxfXR4DcmlNgXKY0R+U975ST5Vr/hMnwoQhyfQZPs +fzMPl+b+P8fJeag4vOczFYziH7G/9umrI4a6yfsZCAfmgCGZx5du1dq/Y/Od +PnLl5yY4xfYDp3JnbVeBmQPEvet7/TwCHWzJXfejiTQY4wTNd81dY6wIOmrk +oMDK51OoEwyBExHu8vc3i5njHTw1rvvt1DufqT+X/OP5P/Ie0f7h7GXJn+J4 +1k1sDdQbFAAlq3cAh+EiAExMfBUoBeI3X5n+6sMkAn3vN6Xo9L6X02/azhvu +emmdzQ7mVsbObvdVPTp/S+4XL/I2idjgoGinx4uVtfQcH3Vydzu8xEkbM/gk +/F7MVjEDsmSDB4rcw48e+QMRwtIDD0Fy54QCG/N8QTV8+iHaIFsCpfq8Pr+x +O0yc2UWV28FVVVau7qxEgXa2QLJCSdaMYXEgNwDpPHqI55L4zLsewV03cDTJ +d9D0GjmSHXrIF39hfTzDqEkMo48b2ZLOcGqrWuvX5rznyp19A53vyDzmcefE +tkzruAecA2GnyPIHxxTd2eWJjHY1ijt5z730d/D+oeU456e5i2S91CZPX6zN +mqOhT4w8TJsyazaGdGgMY1dWmbfI/hCWY+Qd746bP9L0Y4JPCbO/jeWFScvh +jefDXOMev1mum5nTxVeuGsZMYtUseib7Hbzt9CTZzNEDn2LrzVD1c+J4nU9v +1c68fC681+BXbGdePQ2Yrz4OcJzXh2J1yTLxgKLxv2enmYB09s0d+/SELmhN +fNAUHTb2HeE7bqswk7+Oc3144x6nsEJI+ri9en0Y67OUCEk5cd+3PPkZNCzj +dPU/QmJhMpK8uPUPh6jXIkuhKTdj1Otemz8abmoAh2Z49+JnnxO2LXEA85/b +P1J+eMdPXxz365Pb13vzYUl4otWrlaxuVs3ZwywgIJoSEIEIZceF4s6YTe1i +iK4bAlDGpOlLM1/G6SOgl0L0LZqhuPiXAjH8WKr2noIL76IfTYwxaYYpNZMR +z38t6z1fxSz9WkoWyVYf4KrRLRYMUYFomKp6zyM98fDvfutzKr31lRLmPenq +3vjeqfpmzsbVVT3V1XHmbh/p8poPhnGKWSdCIR9+jTQIOOTn6N2ymjoYiEA9 +fjJgS/BNEM3KAQ9BIiERfIU8iYcnvWPV1nfaoSERHvuVVLGJ5EdG0zFLtzDq +Xyci9umvb23DaV93VpzF/xtCYoFasSYYdLRKPx3SLNYaXhyQtHqbk9wqqJDL +F4VEhSGwURKEqSGcw8bxyEcuESyvTnF/Z+iGTyvy0oR2AfuGbU4HhEJ0R+Hk +ygunZi8/W+mThoSFb3wvSdtuaEybwxbFM+fwnbyufQvpYxWHf7Bwh5JMvRPE +6S5iBVjmTuz54qg2HSNr0sMpH7LJ3zQ1nYK66Pxt98bSfVwZBIvO39U+Tc0b +SrW+opXMUfVUigMNi0teKahJWYxSsJqhJVkG4uWixRNYrxmr1jRutVCCVRZk +bxvFmM/VH+NX60+mPq/tT+8fmv7Z7xd6j6tOdxt7CxGsP5iOhmDDDydE/ThY +2AGb+dqpHPYnQ0T1VFghJPPubWJUmMwr4ebs6k1MRCEPIyUkrNPts9PlCdPn +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 +dfI5C2JKk9EmmmmZtJLMK1atLPCSmJWIQGAREFQVRRRFRhiTGzamH8yf8a0c +n83Aqbo1EZMXYebAoJxVG49kWdawDuCIWljM7IFM1QAgqTww+UP35/YPt/uf +ha+LY3xjDeL9kDNj586+J+zy75HOLGsvIt7uyfJ4z0zmtFnFXAxWsuMSYlTo +Yz0C2CAUEC4VLklqtRWuWCSa5ewXrF+jJ+Z9t3Ph/hhT7xm5NuNmoQaLEq/O ++PnGF1v5s8+8nkbw2/YJyYxrF0cHyR9ZWva1W4SbycdsbzedPUvXD+NK7bMc +VXOT3jgox8brXu96TWOQ/c/lr5331fp8cY51WcrcISTbdruq316+GunQleOs +Z1ZfXnrndb5LMc9OD5Iu+ur469z9f26zNVsdcdbuzmFYz2ADZWbt8PXzPDO6 +6Dbrxqq5vxTXbtyd+/audftTvovm7nPJ7/AEJJ37OtX074ONzOVz7Bc1l69b +3xWeass349fynHbWzZ5dtaxzz5jxPw53O556fDw8PGwhl9Q+Pg+NZmDwLl+T +Xqs6aPZNV3qu3Xnq016DuYvjfGDk+8Kvp59V0O522cnU7mODma6MBO4nEPa0 +eVa94XNE1QCiSbAWK0klGKSSfiN6QBqTe1B/RDk4YIse73fWRxui2HZ17yuM +pIPxdDZt7pl0JBiyLywKmrNMbX9cUnTPahZ2o3+EeXEeW1tUvS3xcj7F1cAv +K7+U8v1F1V+Tv1Uu7MlUqC/CYNCE5JZNpmHsdC2MZ+a5tgSNLi5e/9JQ5oSv +HeQK0ncEL50zvmRF/Tik6EeR5SGkMeUl2aE0omCILeRteKQJMuQs+Vin/OZg +wh9BCYShPBGU+Ul79y96UcRmF87ZLmjzVKcOjYBTN2onlEVgPR7BxsCtMucE +otXXHoGLVECYgkWQMh1hpz3WJQ0ZMHAIe/nkR3A3pglwSBXNgQg6bQficPiK +Zx+8ZtxKIm74VBmDVmNJ8aL/rlXIusIe88eQj7eLVmgOLfzMFEaE5zwqNTEt +FR6TeFeORq+0cX3F+xYqhxutTxnbIjkGVfxNMoOvGU7lGt1OR3ueF8a+lvDb +v68Yo5p0SLH5NH0whVv24L8RGuyr5uhCm2RmCQFwaNu/ltGDoOx1SavpHeh1 +JRXCG3pl+ndw7vkXour2P/KHnK0EKPRkVaUJ0CE1jStc+3XuyqxjF4q/jHGd +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 +KooRQWEgosgCqDEUGIwBIAoREXBg6BuAxFdX87mbQsYVirVUZRxExJxSnGCa +lWgnKlYPiqjINQYoHJQOATagOqJsnExMY8GHNtqsxmMYMsWWMMVmSDGCzKsy +SMsMyUYZGVjBiwxjDEZEiSUSEoChCETRBEzxc1+/Zss7fnWScU314ywtL7dy +7jkKpvVlaB8XUuD/tYYLFKEpJSlKJREpSlKSUgLCKAe4Q+7YgxZJGRYxEooR +oSKqKJBBEIJFuSEkWQLZUnmTMjDKywZTIyyyyTdSb4UYmpvUo3VqzW2YW03Q +iCMIDIFEwiQRgKCKIOAAqrgUUlMJCBRRGqEBhEouqK2JNqhkVlL4X7r49wif +2PE+s+Bf0XPSU6KQyDFJdWsYYYzMZWMMMmZMs6oR1+XwCm5T21iR57i3kY2M +/s3/m5/yfy30j9o5RcGSzEMY5qksZMPg3QT+J7ThUuEskoxjKZZLMYpYZh6D +73xOVKviWEveWUvdHvzUDf1xmiIbZiWLnIJmWZxORGJSQe5MW3jWF4qBONVV +ige6QmqV8jSvE8iYxs+BoexJXj4E4EebkzBcWtWtarWaWLWEtMq3TWNYss1p +pOJK3qgySEKxJFiwFFICsRIrFBYEQYgE+jBBhBQFqUiLJB9ksFWKMVARCSII +/JjUkZIyAjExgxgmMtzGVWMhHBVQySSQjCSe2EOQ5IznJCFqqqqqqqqqqqqq +qqqqqqqqqqqqqqrYMhSqqqqqqtAFy4BLJcu4QORwEBYqqqqLgMAl2iJKBsKK +LklAMIFKqq0klKqqqqqqqqn84mIYqSDDWMrJsQ3hkMhkMpatC0MGDdu5kjIT +qJXAJzqS6EnNStUG2lwzUxmaxZMyZYxmVlZMwzFWpJsz0bcOJKxhK4QjkQ4x +MROwJ01GqVsIuYJigcqJkTio3UlupLFAxQMKZUlixLCUxJukymUyyyWSxMTK +ysDAyZMVisososDAxUrqJ/b3+B9X+o4nXi5saNQ1QwMzt5Vs5JZ1bLhl2oyX +0LZNDaJl9M2tTHffpczdXwXq/yvZvBCcL6J+B7+4epdbjXk0yNRfL+v/i7J5 +PCqf/LHkCY90yJ/Ofaackx+XrTwUv9WyeTVGPnXyGlx8/qaYoxf5PUaOFOlQ +hySRP6/quFgZhG+eSrvFEPvj+kclnxITgmsMZsozRxxt9Zvt1vyezf59j2b7 +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 +x2J8VCMzxCCNy2+SDcjEUY8cs9bJjRrNWVBvrAdDUP/8NoJf1FU6V5Uv+JX9 +XVakWTunK7XqNQukcV2pYoDbkuekxL2V6oe07B/HgFUguRitoQ8GnGhIM/x9 +DqPh1hE2jS6jWNrNAUZTfqB99+NKR5i28yn86br2FJZzDTUwhnWXdW+d6jH2 +B5ts4rMsEobfkvAcq+gIsjzVcTm8b/TWX0kpIUDsms20DrSwRRPNnPXWYL8X +qwUI2G/+h3F5cdzYqIsl2f+h+S/jH6X90HP8MfqPnTxEiRIkYxERERIooIiO +M7+IXLK6RQEQvHLZ9nEl2dmz/ULT72k6jq1o1HPc//eV3pDLFeO9dhVbDDmb +m/hjpfyC6ThxhvFHU8Zv/KvH4omeor9pXezzz5H+MoDuDc+FSSf60U+TQuHh +K8610IeF+/Ag9BpDWnwPre5stzWnvPsJlaagkciS3kyJsrKk/dzJD9jRQRkE +F8j1FUP6zrvcfy0+a+Vp7qJ8WC95ZX/4/X1HJ+rul4W/6Gc6RQfUYrQm47Ui +OfxdLVQfpnvGmLmCJjkHFgDZmsNmWHqLVVvpOHCChLg5cAbvlkw9bgiF4sTy +acmBdixuNedUQbUp01pzzfdozOl7H0jjUiNHe6Y3ZSjyKHLcjHCqhOxBPPhE +5czZLiYjYctz2nA2vaQtNX05cR8OSTvZKtY9ce1bIaJw0n99sJq6K7Izn7F6 +FMiUQwHkPh/i7m75CVhlb8PhBOFRPpe/SPub65H80yK3ka3C6eX6n+ExVn1t +kvGI2aheXW+6VdX34rXVVCocnWfaq7wms9MIZTsYybLVxw9W8d2nzJOUJPHR +clgE6uKxQE5PTIJ82dwTXiI+ZmLVF3XvvnbzMUELK4x0H1uLZjZOl6Jsl+lt +NFh1zVvi0MWWPQgQgmZdznor2lw688LzOrM4pcTlvzfXxXft8c1+lyi2SVxq +ih7DevSfxqNm5NbvI3VUvmEV1GIsGnwvisvqF3gfx+rAp0Q9mUpKhNwkk0Zp +JXvAu+tUcR+F/TKJEFGiSMVgcE/hl2Tclpqh5WK/JSiYMCoYoa6xyu3MsDEy +knoLK/mjEorDsHe+opF/OoPhu+MWn9FzB7zXD0fg/JeSxHDXEZTDcTc309h4 +i1CfHNmuza5s35gR2PCQA1npElfU4lxF0ezVt+KbPoYaN3j6E2ZR+Gg2mFi/ +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 +Hf59mecK5tSWPBGS+W/sulReTn6mcPOfASmeGTB64eQ6dwYM0gsR79P5zoxn +VyhjjBqGL6DGYs5TKK4tGREs4bgwiWDjsqesEoVG1IFcZBh3ZAFj9jkkfwOW +e8WT4mi0J0C+CplwO8jIZLGQwrH3bK8oG2C//5igrJMprKsJIbsDS49///// +////////////////////////////////////////8N/LDk98nWcbjDgD1Po2 +VswbLBQoKSkUKoY+l8DHtvDoCqQIkAVKFJVVRVUCgolRSklFUUiAUARtqY8+ +C2+oAbu5zcQDgEGybY21V3BoAVVEKnQAaDWwqwAGtU2YAAABoAAAGlSPe+zW +Lh0eQPtVcWJwAkAABQdi+DxodAbj6mzRU93m+wMLKd59Et7wGNPHud4C55bU +bWFvvinwN2AAOR99E8rvvgHfF4ABPZ3e5QPAdjz648rj7nfALzdzynSkKc98 +uodB6AAHu+FPnXPvgAAAGPenaAAA5uM4AARiMAAty294ABz3qzgAM5XcoAq7 +lzoDcq7776iCrcp8WgZ9ngAfPs1ALExsKWkKF2AMQkAVRD30954AGO8bvVUh +UhkBWTNgABRABZA1IVu9KEpW27u622zVW9ZzPJ3UrWttsw21Ig3vW96lKtmT +NpvWOaxqhGxKm6zjGbHHt48VJIlEgUKorTQG8c4CdvvAQvoyZma22T3YHKjR +lqhEUKhUiIJLJbvfKtNb4vmBG6+A9e2UAASKbUM776se+vrpqEDeF6B57bQC +CIgi++PeB7T7Zz2dPQB957774UiqCi2aC67osdzu3atcBaAVDWaTBqoYg0pr +d584evNVFMmzOHNC5B5570PMKtrI6j1nvD6A0YTUGw1UhKEH30SXfb2ec8e8 +tsViNGQB93xHSrwSoEAD7w4Ac9KYJBUBKEHvL3prwoclJQQvrCu99blHrRqg +EHeV5NuAAPSZhtGpAAJFu9bvgAAtj62TlslFUTYDAAAAAAO2ASou++m+A9BK +vq7muXXVKiAUumqutOw0qpECgR3g+3vWh9Dr75T7vbO8d4bBHYJm9822Dfbw +vtVAABEqhIFJKUoKKJBKEKUCkVUoKUAUASiSFIkQpSqqlCpVVAUClCkgpSlA +oJBQpZGqgAIgAoAoUFEgJKSSKAAKCihSgAACqUoUJApQCgAoCiqUCgFACSgE +IFUFBVACpKAUKVIUCgoUlCFUUApQqkgSCgVQAAkChRQCgCpVCIqKFABShUQA +AFABFQqgFKKJNeCqqhNAAAAABMmAAAAU9MAAAAACYCYAAAAAAAAAAAAAAAAT +AAAAmAAoFVSSaGgAAaAA0aAAAANAGgAAAAAAJgAACnkwJiYjJoyYRpgBGJpp +iaaU/TTJtEwJppk000xNMAlBIhAggggQBCNKe0p5DTTRkk9NipmptG1PUzI0 +mTGin6U9mhNA0NNEan6m0T09BPSU09qZNPEjQGp4k9T1PUeU09R+UG1IwDTK +PTKbU9NI8jKabIDUCEpEhCaE0AJ6mRoJqepp6Rmmk09RpiekaYgBoBpoyD1P +QGiGgxNpNMmTNT0mmTTAjTR6IMmjQNDIaNA0zUyAaaGQaNDTTQ0aAKUkQQBD +QTQmE0ARlPJkjBNNTxJmqeEm01PaU9qnontGpqem0p+ijwNU/FT9NMmib1A1 +PJoCeU01HtRtNU9Tanqe0nhUfk0p6j0wp4mSPU8FPKPUeUek9NR+kYKBUlEQ +E0AIwE0aAAANAAjNAACMAJgGkzRMATNABNMAJoyMCMmmIwCaaGJgjATEZGCY +mEaNMpmTTUveEpuXRy34da2+RC9P7XBZIbsfPL+b31W/5tfuetiOlNFix0sm +cziI9HpiIiIqZmZmZmZqZmpmZmZmZn4pVna1qtb7omL3vMzP7EAQiqqpmZmZ +m0zMEEERE1RRRBBBEREuSSZckwUVFVMRSKKaqsSUOSi0v3lFTaLREUgpNNn0 +acaUYARkiiP2ChHZH4Z/AgInZw6JBjRhxNj2qInDhRUERRw2zAJgjViZioSa +YMYJbb8UFMYvzJ+Z+n/Vx+t+0/Wy7fm/qcTGbfm6rvGPzcGx6743vvm2O3Q6 +vw9z7//YhfkRr+n/qn/3C/44pnqP3Ywu+Ce+9sexiXdUZRU0ssmTMJ+H8PxR +alxU0Luvx2yT93uueWr1UPmduXD2+EuyNZcevGttDcwvIGDQFKRJFVGtUsVS +UexwWFqHp8FOJisxUmYfi4+vw3w3y2Y/uLxPqn+N9K+nXS+mfJdDpyk6mamG +MxlVWvlVH/knQh0qEsB8ULTiYCCEJCLIjMUVfO4+ez5jEoe/yQj+GxU8IoN5 +XFiOiqEmxKM5XoPTWRGWVERHgIlG1cdZq6knscGsTuMTZOJhSfS0bYVmwVZl +rdjtq2p/vIXsMPA4wy9QObWtBN3eL2eIvFsFWvZvFlaHe97Sy83om7pu94iK +tE3l1fE3xVi0zaCJvfF7WvalZ4isWve03biW7Verxa1VRFYw8ROLc7Vn2//j +aU/zMkn6fHXiyp7ykmURpRE8lET1vuezr3BL2Wxp9zRQc1XLYvHiI3XNbWOa +50z1cxtXVRjnNzcOcrk9dRHHgbhzEeAKCNnSTVNobAtl3s4cRcbHaIiIL5im +pvRVEzBdjamoiIiG4vUREFXiKczExAOaiqisw7w7QXxF2WvFYim2GJbsO17X +xVoL2l1UVUxaLWuRe7qprEu2LuKirSrLIMSGvwD6IgPmxpkn8muLb2REVO1a +msNviBEqPjq+btJDYGmLmfPDYh9pcJG6PZsn/awzXVm1VO79mya4prDiln+v +2LIxX/bCRGeCI7p5a3HyIR+1vi3bq9a7LFSpr/6LZyrLucYV6mJa5wb+LtLu +tykT6FJ8il5pCybJTtn22XtG1qTaXeZ+9bvfVaHeusfCsJJOjoJ2Knct6Z4/ +Yz18K8ZxTolf0bdvVs/27dYmoPuu9c3y12fnUxivR9LVrZpL4novv+HdMW4N +l1sieH4Fkkjwq+sncZFyzoV2TXmmNhYL2uQdwvY3I7Br7TU201pePfZ7ZxVc +Y8tZEkn7K9ptjUvnYk5IpSKUlUvJIeP7SyPueX1ReqZtsLMSV5G4wSSP8XZ9 +0eZt/U45jpR9BcpfvYas4dnvatycp5Zo+uUWentvUZFxegUdP7VjCV3iseqV +N+nPU8b390znrPsMJsuA9d62GM4hIP4RSyviZ1/rEvzRT2s6v9PchprCl7AP +QxKcQapE39mOUmrPrDcXhiIIIDc3hDRefedemzSdWmCVt9jcKjIFzZnRsS8a +DYxElydh3l/TnnqejHYWRrWbT1kVgsTXcZVU32jy29rN+vKGpXuJFor4v6Mu +vxpK5xaloVFLvyTh+qX1P11FBdrzY506Lz+qDs0C3tkwr5lcc2r6Fp0a1r8s +AxyUPQ6KZLo53nOI9CXbxEchpvIxSpdRqpE27pKA3CvWYhK0rlSbB+kW27hJ +R5H/2AAOCcW5JxjHZg7pnZHFVPodysOtYSz9jfec4psGLgBT2g3i0xN5W3ZB +fOO/mv+pXoYkvS9NkX5kOelTBPyiiHOK5qPIclWj4vza1vHUdJwkOb9KVRWL +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 +Pn+3FqXZVRLFbitVa9W/q5STPfqLClrOahBq/vZtUOyyaqbZgUCqsCs3eSlu +nB92Gx6J8ZsGYWHiLAyi6MtIdREE4SM1mDZ5q1C0befjfo+xTDTWoN7Dnqhc +red4lI083RW7M1RJcqDT2OA598CRQLDVJj7El291tLXR9/dzvOm6Ir3E44nf +JYKCUxpfxR99QfOiiqqqqmigqqGqqmiqopqqpUqqKKKKKKKqqoaGkpKGklWU +/6YBlxb/v9bkXEzlhPUvpEEc6wtiWfmYKXUqVVQiTVVFFUKFC1BAMTVFFUUV +VVVVVUUVVVVVVVVVVVVVVVVVVVVVVVVVUgkFFFFMslFFFNWRgxgxgxgxgxkL +DFErFCFFFFFFFFAUUUUUUUUUUUUUIQQhRRRRRRRRRRQUUUUUUUFFFFFFFFFF +FTNFFFEMIQwhDCEkgQ1VVVVVVFVVVVVVVVVVVVU1VULSFVVVVVVVQAUrQpQq +qVRQUSiiVG53zGfiaTtGuu5eVpXN/1b48b43dvH958mzasg2zNJdrKlVVZxM +Qb+FPSpjdpO8TUf+YbHP03zaKXzWQYx4VZxbKqGiLAvkqbvoWqSm+pe2ndZu +0c+1cpHCyUdnD2vshrPrE1Wpzcq80vsE3ZS5QT7L0yuObAh1NZl1GFqGqp2S +4f4e5wH6lFXDlstDP3UxMXm6OrqHVoZ0UJQFyKZCQquZhHkkWy3JlGPOhC95 +PY8ynzFs/4TVpkbQ1t/lGM3eZTlpDMFunV/l0e4SMv0uHVQUChPYp8GhgmqC +C6LQ+73VNe+/t6E0SHfyBTUEYzBRDaPh6zoI+QQFvVrE1FVLjKkf+2Gl760G +Vh02HSskZcKbqfL5XFPxQmgk23asLW2w929JTV39VJ2n0/TPfaIfQuvcfCmm +OK8pzSEPw+FD29NSyFLEw/DZ2MpGi7X1WyfdCXTduH9vxaVw8c3bk6bQRfWw +GC8SNuUnegoi+LA8NtV9/TZPi9DKuJVk6JghqyKs2zQrdC3Ldt9LrgFY+1BB +OlaX2CCtJPp0bgHAd+E5Ch/dr0Z/f2rTIonYWH8CcKNEP45LFJPXpPvFVknT +aphUgxME+GGZv/WlZhhEDOskxShs8laoZaKX990rRbooJqFlU1jpKxkZcVAv +a1Ss/mOUJPbCw/XWhL+r+MLg15yqdvvoMa4ayWNq/z/5WWf4rSqy/ErZ62Wt +hfK3nPa5S3qTxrVN91+7HZbDUNOiDfNLEayP4iz6lCg/RJ8pCijKO+X2W+3y +K+4C+XiXt25T6cbSrft4ipSgPgwDmaSnMk3HVczVuNk6LlWXZAhKO/LCQyic +7cO/n8lnkEY2cD9kualkU0lPg87rWB9Do0rHadaMWp2vcmZqPxXwX3SUhRsg +91t6zg1IWRv/zfAtyrQfJChQoUJBBg/u4aTPyGlP5OBMxH+5iNZBvikjN/C7 +LtdjdX1z/2FE/hgITqaE/zHoWSeBFlS3xJCwkmxBEQOTBxIyx+1NhIheomBx +jowHCFnkFQdqr2Y5IbHOZ+DZUh2ZFR071alB4wUf/O9IRStsehcmxCg3JgfL +/Un9k/9hOwjoQlsqe6IdAnJfv36csKw4ku+UZ4m4FwKYMTc3JdFOC0ZI5uUM +cIMTo04k1lclhoCitFOiTHGljTcUzsGDYjgJOYIi5McuHB2wUxGIGSQqGUHv +tegZRmO3JiSgogxWHhEZWLAYJl6DJGBNK3bVhZP4swNqLQacq4rU2mHCrgK8 +TQ6BjVLNt+f6Td3IM3cOjTeKnr1VWko/EkfZIrEo6tjn7Fmo0xsU8AMDHEec +l7VH0qRql5xjmSmSGVCVEFy1O1EpDYIhAgD+LRBf8nApdevjKpWtcve6oL2u +sytMpOzpJNjZqMhKdBHgajrDum8WDd8Ck4+PHFVnJjPWxKMWIJ0S0yS0QGiX +MqzV5LyO7lji15VkoLlBDdRaC1U5WG/ULY0FxgpfZLPaq+vqq8LxIH6j4Vh/ +hqTQtscPpzyHpcNt7FMwyS/VB+UhU1g3VXopvOSagPyWTB0lt81NkNrKvNGj +nE2zms7CMUDJYbDT/0Li3bw51tF7e+36YLvisBJE8RUpS/g/NotPgGAYG2ol +UOcrSKLq9CzOCsPTSpkn2oizL+468W9O8U+VbQKObwsjtv5rjCi3UV8a8PC7 +SmpI2kS7evc3Bz5i0pbmhr82y3wd6+LbBg30vGjm4cxZn/k/bBjXiR9KoOH4 +OUlyS0nDtNJ4Gr+dIl7e5y6Ej+G/FvlLxS1SZu0k5bVNooiuTbKSqAQkD3Ip +LKctKlPG8fVUOpxFkWld62qOktW1L5MrmSwajnUVK6dRd+/NG9GlQSooW3aK +v+WRYUKRtd52q6Zra4HBXh4oo+NKUGVrGtMoj8jRJ3bThFR715RtDeEzr1yF +cmLzqSLZYc3oXTzmAcLD5hnYDVrG+FXti6dPSZMltb18DJPe7DYGlvidQ1Pi +2bzicIt1T+TeuskkkXjdJ8FWNd3dYAewE6+iNt/PFRAfl83ltV9SfiF/xPH/ +yz6wX7/C+NufZ8HD+vMlg22knLxBWGqc+Wx/2Fh8pmHVNUMqNZ3tW19PpvHX +N9Ec4r6W9/k8W5dNl/5colsnjcmuOM+6dDKO521V5h8kWWpRx7R4TgthjJxO +O+lyrb45embjWJgcwbQO/Xe8caznEQQdMa+h69jtjrhjCNm31aCOnTl2i9sR +eoakZxDfOtsm9+8V23zkStXF10/8crODwaVmB5Bw+8wHRh20ux3Y+s7+eokt +djKgjSUsGvUgR6gAe/WqmiMDLM333FtHN6clvLP8Jhs/skTU6KUKUnpvfeU3 +1qrRLz24m9Ksnrk+syNtKr/um8euN2UXZKUU3xY1X7/KLaq7DqebcK9RcZ7u +lnyqhfJ0GkaPVqcGuoWFE0JKwkg1SQBz/dN2E/sf/D4T6TzuxFTU7FhSopQr +ytUsknC3JgEtavbLI452TzLSfl2L6d7ranR4Fl6VFIU/esTEK1glSdE/ysVC +GuAjDGQiFOWva1WPTo1iiIKjiXxVtdaU7qvPVMWbad6Mg7sVcG+sQiefehUi +lkIRJfJ5W3CvqoPWt3Rxq0OrtXsl+/cBFXIVed3T9RVTa8uK2TP19qMN0nCD +kXN5eDo0RQ9ukVYR23IWJe/s/TFLy0F3QZH8KA3CQJIoDS1JxlLfH+v9ZDHy +pYyV9qCPZshLlgoa6wv5YCF+TOPufRwR5UUU0FVRRSVRUQc8fuzwn4QL7E8f +1yvB4egnXFOffX0NB21gxDGIkNycVy9ysPZZvSepiphzEDAlQ6Z/8P52Rem3 +z/rK9gej+y4D1swpJ9cntp/KgnRBHtgYN8lLuEa87QaDX9P8H+OHyl73/P23 +50+OOWkCBdvahQ00xXuXJg+GGfwdHgfqWjZY03sb4M/uNy/naZY3jZsonRJw +a+Yclij3RhAMONlKttEFhjLbWt/d17R07lr87SujczuUDo8OZMWOXL4+B5l6 +hFnD7T4u1F5mSYgxJSx+rm1OZ3tixdhRMNyxw8Mv2vc7Miyy8jKYRFMljKdD +JYRctxa4su2WXbtLZKtyb32nbpPhd/37hmiOIeHj9lfe+dpOy5u3ZEwWJH5K +tj/zQrqlk2aCMnCHrjqM/3aU9SptquOXeNDUuwryylQWv90xzCFH/ttmX1iy +RbNTl7yH1bALiqL3HeSFKYtBAWL+HBY/lcfBuw99TfNHoNEFFVxgPzpVv/C0 +LarVC7EU3rnM3bUFbEwTZyZip/8Isv+/XiM59sHh+reoY8j0SZvGA6DIRN62 +FodIV+UzZAPyhO25EnfLIcxh1DRCktIkKGx7RVtb3Ab9tKqvKQ7pU33M1Agc +fE4n5m0etdO/qIu0kVUb81h0Xf3EfG43wdF/c7J86/Jk1NdcWIQEBVWF5Ofo +yxOW2j46JmMgza6rwQEtRth6ld0Paxkn2WE39nsaHK4ninNutb5i2wuZeV3j +esFJNSkM9OWec5ZPpCuCOPL1WwatgJVIkQReY1ZAO68Sfqy6mCj9fYNdeVyZ +ajPDfDWLuwjb3BwlkUB9U9Vluk6Zx2ZGRSyqnc662cca9hoJtrD8+ZVXybpY +HVcZNrCmCTqm7L4qK0NVclnVuXNfPEoDqpU9Tmq3iVeTaVqOvqIUGDoMMxq4 +vA9q/VlV11XlqsegtEK5fxDFynSNmmBTMzXmgv5L5MXScFCCiYbBkE8qkh4P +e4aX+fnuwpDW194Ukgk8KAtKco8SBLNplaRrODdM5x46hfc5KENx3528SdOd +BYaNrdu7D8IN+G8fR/51Fcf5sn7we2mMs/8ikadGbvs3Dx55MqOjq8OAnT/W +mVFzn3S+DdROV4VN91fUx/njzCRw+EqgmjGpb4Hnabdr96pyvdketYEwUWRJ +a16k29L2CtHNZ15MRT1gRbGtloOgmrVr38mFzeFYKtvf0GlwyzehKtMhkhV5 +Caf3HusdlxSpsEbBxeFhd21UxVykov6VTXRmUFgfe+WZuvZF0k6aIJbFMggn +HuKf3d177WHzPidxmnSuGa97Ogej+Xze4kknma+5L1V5dchgza7tfvfccUq4 +FhR25q01cy0q2WFMhDKxERCKP2YhCH85ERMdAx5lAVUUkFRVVRVVVVVVURVV +VFFVVVRMghABlmZZXoq6e1HNtb17PrV0rvX4fVTkg4YolBQCFUojQKv5cEPV +FFFFFBEETExAHsUAOz2nrfIwIFkf2IJJhVPTIdAnbpRceMhOII/pfBwEoEMO +UgGBkZg6HNI+V5KMwixZS0dTBz3OySK67ZEQsUE1EDw3PJa17JIkV9UlYaTE +vNgQMGNKdxm2DVslzZKMJ/1ptMFwYw1BKe+qPCxIWMAtPlDTGQx5wTeMaSGf +p4sjZYJnpcyMZ8/kjwvr9+9a1aeBmZQkHyzxxLdRvlOropxz0KsneMr1N2WN +i2XEkpJLJJepLMZdd8xbPnj+M7Rk2VaG/Q+7yjstwGH9o/EDJ80EKBWLEsdh +hRYIID97X9msQ5+GiXLabbTP0ec2yWcTqc5IMGMDk0LBRYur6jDdFWmIjAYJ +LFzNTTxgq82iM3tVO8YwU7u06m5IEQmzF4Jbi0XmszixSzMEu4UwhWzaRoY3 +fVkSWs7RGc2RTEr4zeqh6VVd050USkMmJG2GXLzBROWXBqawJ6tFlYlkF2F9 +Te0MsMtGJIwKCc1dixcIay5tqxrRFqm9F6xcdXxe0zU1OlODV851GXl2h5vq +1RMYl1GSoqxWozhuw4MQzObu98Vir6mnOM3tmqq9qqJjMGr1NXnV3VYvbRi2 +ctzfA7YvZ4xol1AZp6pXUs0MhAywywrRbEQ7uxCi8Xkyy7p3IUXdsxnM41Ym +qvCy5mps7AyQiJ1mUUNVi0hh1ViadacDnMkyOHYmJiw6gbmKsWLO1VaSGis1 +q1o1V271F6ovaYp1Yq9E5/SyXemqZanU4m0vETVtdPh7PT94R16YosFgppts +Ytoo21MUa0ZzbLa74bhgK1sbHfOuiqgzkvVnGWW3tfOIzlznO1pvnBOtO05e +pd3F6rUVaC8OQbRLiFLgGMghBAYMiqc2gLQQUQBASWCLYt/R2vanrEyyocN6 +/lHr/MfZEzZVB/BKqqlros2508Xp/ymURF32Z9QE3W/+4nFUTWlTVIl6Q+v9 +3pbZ1S/pCkykZV42eO1ZpAz2CsRBOaTWam8SGKEg6KBcm26NDMvJSn1eBwmh +RpTnSszju1kZnF0yUFa0ZqzCNuiilI0nKawL9f5tP+p8hVNT25Rl8GxexJLs +0k4dOMs3om1e5JUkbu7+etMU2aFPwpD2par0sbZfXPeaj4h7dCyyroqysh6i +Jqmrd/8ytsgutZXlfXY5uMVGIUel4B3lHSHZt2iG6hml0rQ7GlP/PUzS7xd4 +YF8b0vWqutdexJtIrsk0KAQWOPQztelHme9bp8ZIYh9Sp+z2b0mC9yCVGIgn +RQTYH205xI/yxeswS9b99dNVc7hYT3HPfcgnLNlc8yN7VSoJXyN08Pj3wN23 +36b2nJSJzMbREosD7JyQWdYmYgEFUzjn3Xdz55FveVKHys806TGaNMn24aHN +baUdad3dOygnmNsZCbwdG57K4WJ910DhwJ/GLEQny3MkPzasWGLiP8k8bHik +dn92vvD+d9D6vlp9ajuU1TSNGiS7YNqNk79zRUFDySGHLmQli5k4SHCBoCJG +aoJolIBxaYKnqmi4cXHMuA0DWnUzG5x5JM8gxJyBMFkIHEjq4cgOFgycLka4 +3IICbBzlzFRzPJ4VcSZCC4W5GiZnWORD9kW5qM61PWmNBcOA8Y3A4QHEM44b +k3Nk1oaqttayHvMaSHB7APlmMxKxSnb8n7zy5BMiNHdC/E8nNsxsTYW8M3eL +Wo/Ubyr3YhzoIRb/ukjqr0nDaqJrt6krlce3Y5RkQTjTSesRhWV8R9haD4uL +oFGuyePn7MlnEYfBpnal6meBZs7hqcxqZqmpmpZl13wZBYV58jOoJpU9ZtqX +/Nc7aKNsk71MCuyEo91Zk6aIP5i63zhQXBf3cNnXP1CSamzfOspgs443w6cB +wPr5V+htb2m5t8MfIyFEfZuPsP01TQfZfJklj9QEWHaw5UsxiDB9knJdmA1L +TYk82MQQ7uBws/p2wqs32SKt9jnH4pVTI0XLFxTA1ljW7KkqDSG0p0wg/Hi/ +JG1XmfqDcRgujRhXmwJJJlqICCEWnmFUEw27NpMNCe977xlQFiioZUFTK3KF +1YGw6spRQysVG50iCOCjIrHUmI6sKhJ1zaoRFRLcUSiQP0FrNBIypZG8ZW1q +t+onq+TDhc5h51IR1/9NKjcB7XPlZX2WN+xvpI69BsboPGMdfpLE6gKDKwjI +yqGLM4d0ietY4MiRW3TNHG+qQfWDLlHXq9jHjtn+Uc6rzMI3U4lNPtOMeDu9 +6L13crwSNRNax577Y2Ze4GODVsUsvBJjNwdSF8WvgGWRf0WAhGVbEdnHI4pX +TziSinQYitKxyRbf6y3IXGDLgaN94sWGMiTLxv1vBl8GaZk6zEiLlkXq/fbj +N73qeleOvL+xfWthdO8R9JisUxwqYrpWMmVwjOFsJZCZrKbhp3ATTeQhvcE3 +qs5OfgTR7X86v50Ms2i+gTmNEfzP2TyRe+k7Pfeq+H6I1nuZa2bvg75u018H +4nJs4PfC2yFggj4K+boy9jWm9NUEBS0IWsmsYF5eeMj2sZxtthfEJWfneJtq +T5nW+4RrDwhH9v8J+CdRm83L7XvHIJhmWS5DZYo8tv7psjPu+jDv66lLYj/Z +dqXZGgv4RlJYATtmJCZx9n0GmXmUSGiYljmkxVtVVkbBcuXC8Sx0dGOiDp04 +YIg6QDoF49gwloB2Jpq0WESSTASIoUkCJJTcjHFSvnWMYxtNflG2WZYlTEgz +8rtJWLSZB+WSSHgwaGAjD1k4wHZzp4HkRcvqHNog+enfVrGAhwEkPEl4GG16 +IZVjfFF6w4m0ibnBEvFVNWDAfTVjHyHia3zi1tRtOdRMxqzkoe0QxqAfEtTm +ZHTCVFUbEu34yzL8Vc5qa4i/TQ8xSJ2VMzZD2TrfD4tz+O5uTpRgZBvoqpko +CmU93TWOc1f5/iZ6ONpcNjbd3onniVLXGLTZ9NZkic1YqDcAWwlpydfOdUGx +NJq41bTSmx0844S3xT5qnJvG1G+KdtRiOqXXVdiuNU6VOVOqrraFtB1kcu05 +S4ZLpZVc+CLpiZxNUjVBvSxyDjJVzrkcDrjSy2SrKdYrhSE4LdKdJTixWapZ +RplZBtS3sE5wuhKsVHDanQpZDhJIWCX7Cka3r75MYnQoRqf/P0eTghOuSF4E +QAL6P+49P0vX+6+c+g/efvNaznWta1rWta1rWta1q70a1Wr4zrWta1VTWM6z +rUzNW1rOs5vnOc5zrWs61fGMYxjGtZ1rWtazrWtatVrYxrWtTa1t0kH8z3PY +j3EkvMX2x/zqImTUSzFLy3LUPdWvM7zGxdPnZShsqDneKi3bUxmlh9N7Wde3 +nRTmwyfNRwvxfmccleVBmzG1Nyt28Fkot7wNU66FypHWT/vY0dsmZVpc9+8q +hVnsJdQmoYVgag8MSqm9WF8UjR1ZdhLV1nfjnd8mbfpS1q2OqpXjcu7Yq8fv +lL4xCWSZpFNeNCstOURbbdN+wSn1JYHX5qEuEXdTyK5qrkXCveN271sziW6a +/L77Lmnn+lBLYJ5EE+hIjBbb9P+bwEhnWrW5f8Szt2psdmMpl8fPiZVBPyN5 +vencDyVvDvidy2TunPaRtnLSNXZVioJ8etueebrbDzz4hCr9oAxUR7kL/F+W +dLdKp9jTFKH2vH9o2qO1R/D1CX7d8yczDTlCuBNK6IJh9q2a7AaikYAaX+dc +kkhfJHNe8U/svonDgH1fynbun1+SGomIhVWFqBMAg5qc6JU7oVZZVPrl9T3a +LTeUOj6SJp8zq3heLskNeZ91emp9GfbZEpr+FUdyt/4r4o61SSetq5vVm6MP +rdFJdGqzgohKXQr7BWN3oU41zyQ+UQlpTHTbiNVteqPJm94KlLaIEDM7P9T+ +B+336r8b11+q5u7rx1CiJ2D1Snj9Ah1FHlUJeKlt6qrll2Ekh7lSQ/Mokbm9 +ZxnBM3h+1bk5F+zjF+yzks01lumis9xyVUxkifmhCLaiT+rfRV/EXk9Vo1Y0 +5atboUfY/mPSdLbbg3/iYtQrMbF783qLSyX9debPKBAIi6XwdefgOlyqL8T0 +mc2zkzRm1WMn3p14Oq4Zu5cYjq/pqvKf1/WM90leJimykKlOJDCGNNJIYMBX +uSKySiCUOHksCME3NsGHZXAdxoauRCUdrUTDORdV0uurtrC22jq7HYwq7XI0 +AAGAbYHBoxBBmNXioAi+MQC3aRi1VxczqsuKMFVA2ikwbWKRFQEjMRVp1Vsl +r1YtAaJDMhJIXr98fM8XvtnO/HG/GrQhIEiFLocm7YA2jWlNNtHRrY2xnCUQ +QJVgYS+oIERiZik3zWWdfvXJZD62eVSlS27Qphc6JHpHYZJhsbPpp6ZZhfDq +qPaZPKKn90nknU6f35WS7ucSm/SacSqR+aS5mg0O+yqR9CVzeU4mGnksot96 +sNI5LiJ3cZ5Mt9ToqPyDyx+lWIxnWPf9/3ve9z3Pe97w129Xq9z1e56/c9yP +yfx/b+H43xvZrv2jf0+n0ev1ev0ejIZDHZLIZDIXOJyWVyueZWzH25TJ5LMa +NlsplszmF5eWMVmaUqopJJHRAfJsqNJKvyQL4GQHwVJMldPQpqVNYqNmJvuF +omxiClhhPVA6UAklIIlgoaK+8c5w+87ASREMkSNDSxMRMxjLGZGYb8Pl3zkg +PxXTw6OXdC53PevHp4AKQ9jOImQ4oiQIGjnn4482Q6vInl1AqJEvshDu8/WC +igfVjQCFrOh2Td6qZEjbxEiL77OYGrNTMGaZitBuZ1R1DpCS2MRBJURK3l5g +nXOigZmgI4gxk9pQxDCRBAQNJtDEg1/Y/kmM/k7Q464rfYF6jkh7LtoDZxuk +TicY5G2yw3BD03BmYHi8xcbAxJ43h4K+np7p/nHidF8/CQAKEWDMCNb2LZhF +mpYjLCGiWhXxBTQpaKGDB1B+SdWObUUYc2Kh4BVaEghoCpg/JMgQFQIV4xGM +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 +zkjYV4lB5y2uRiG48M6wkU361elrnWvqNYPC+tSle4uNqFFV9nnYcPXpSsTT +Oygk9gICAOayjQUJN/GlzfLy81Vd5+KPDaVZEr/p9vMQQbOFCsm3MW5a5Y9l +N3ZnD5zELmoEw6/Nwz+Wj1KZtQyO8/M6jJsZLYlsqqRSpFVVSlK21sOcZv7H +G7HzHtOieeiNmaNh0yyUJCJvJ2d5zU7Qxp8UquKRFmJBAQCEOZT04XDESRTU +ph7FcVxXJS5jachnsHM/VBBAfmsrVMGxq7Ol3U9UvW1lSaFTZ5CpmZAiej+L +/xvp/vP6M+f/BPTyvQiwiKftZeFrTti7FbMVUhea0/93y0kS5RTW2otn9tnv +kr15bamJT3LbRTKSzmxTyU2tCP411RYh0MdEkjYbBtOwKjtFBMzFHFX/LNG6 +nfpShvA2z3EW1GzUr9qdybG+ZxMynnjbbAuSofilqRUjgOOiWGXR5mEIbYnN +uueqK7KDF/6p2ZxMXlE/odsjbWXtdmBTzwW1zfm+GKbB+VjzVmtb+rOevaxu +2Mo2DjmtOi8q1+J1jw81kP9nFY1UenWquFQX57HQ5fOWNAnT3VvR3lSxKhsd +anNLpSUprI5O8/88hvPcZOx6uGOS3Uor+x8DbtZzdrT8lgbarj0vu1Wr0/4T ++AEBZMniXgxjJcxT+947bGutyd1vmsck09aI+2PsSKkbvjnSOc4b+f1fSfxZ +tdwZJScCo11TVe4fqJskSRISE40NinFSNOuo7ircqUN/IaQue0pr9bc0TgvX +l3OdljHQe+j8bWITB9P4PNTt6uq5nfsdIYhE7xD3HkU1l74xaAzrUrlKWs2i +T1968Tvn4qqDbt1l4YXS2bkrknL5r5Z8leU7d3O7xKVFXXMvhRDxzCJSbKLZ ++XNbxibqsy6LQ+1hU0auK6zFpEkXQY5Bq2w+NVFa2NfD4NkoKy+9FJmvmp76 +ZJMvqMSo+NEd6AQWueGekHnbTpsM6qzIhx0L93vK41MAgxvgkAe86yqQLlq0 +rGk1CqW1I6p+Wm9Ob5z/yoMBUVHdu1ajgXlt3akrOLcuEAJqGivBeg/+6/rW ++OcJo0nIuFt+mlySQhZZRYQ1rMz+j+JqH2kOEiPudnFgzL/em6RYpdglFy0q +s3ZFnQvCc/2eZf1fH1beXA6DqO/vica6DaXLRfBdN8mtVxqP+7DBJsnfD6km +eGg8ZlbSmT0+ljlNuXFzqOrf30/wD7NA/toHW22hpmo6eSjjPz2csd/0hUhH +FgpNEce04JF0dfJmH4nSg4SebpiEJ3PdTSQ5uaKK56hNvRVmfVrlfSZHO3n+ +i1DqVO2JH2nkZ9Euc2iocRdFHcBTWkp5DLFolta52UuYGz6VX3fykAn0bR5k ++/rbUnzOi67POXfsf56iSG73rUXwtPbc4xksf0j7KR58E39rckPYgmxP09C/ +z5j77/7IcA8n8eg8PNRlVdSVUalZpJGKCgCIhQglaS2AcFKlEREEwTAUERJQ +lSqKqpBYieUtspS2T/D0m1P/OJ846vgL+RfkMCyyCV3vfHUsP4jS2lvA5FuT +22OXH5HouI7NtzXzVwGrSXZUNTUhymBEMmDvLy/GkbeOue1GeUXuylPI56XZ +TNN26jVgEDl3ljr02nvOio23f467S29U3ysk2qhWVgEgih9yyoIhTy+xDaLW +ZRdm/enHOor/uab+Pxcu9k8dUWEk/pob8RC1MbESaoU2d51Fxev51CYBqW90 +0ri/q1jspY1bUPccvc3r6eeozR0df3FaVLtWrT5E9iuh8+zbBRlml0zVhGdj +5YBBu2GcRZCC/KX8DmOHeFkrCkNnsnCfNym3fJNG5dRanOpLiNXRFjXqKug+ +CJsrAIKj74gQ6ws+r6YvjV7yO0+5FuPc6PBJEn2z5Fev6w7Nr3Qn3M07DCFw +UpVUUYW08JcuVVSqqlM30XIXO2epHkekEJCJFDJdKsi8SWMw1yaYZoXqsXdd +Tov7jM79fs9KXMizfdRxDkudB4GbyL1dRUUoTL/X5TV9H8vc37TJj8WBfeXI +aze90k466RqayXwu617sX59rlJC9iqz5r88vlwTaVTVv6dpVe9SXIqSGGfyc +0+dnv63ws/aw7R8rSHy9pidjef/TZi/YmWqR+JBJ64Duve0zMuK/tt/8Yxkr +nX6Y7KFeLWI9KaNqplusFDF3ZD+jj2StJ/42/sLRMkpMk3CJv7jMlS2NduuP +fVb4mpvZJTJLu58Oh523ebouSXEoooopTsncrJ0E4Ha9yevxq/Uq95zZ27yF +hQmM7GnrUq6IEAjKvos9dr/Mkayxs4oF7RNrlN7U/UP0wC27Jir40rLOH5lb +WBjtGzbKsMhb3KDxZew6EZfg7vS0Jtn8Kgt+dZxTUiTpkVlk0x+tO1Hn73CN +9N+zknY5U2Ngv9+9bFc5tbMwS8JNyPvrtUcGGuX91thX3ee6O1mLnG++5Lyd +mxNc+xmJzgoIIDgRV5fcpfyxSbMDIEgZ9M3GY+Ia1+UmWvdzl1luzHIoMMu2 +LetE0tdGSVxKnqdJwEfaGlzqYt28fUW1I6A0l+Xlmc0y/cXiaurr8MyEugEF +ETkaVKnDaZPz/M4TkdcdY8DQ+kf9YbDsc/fxjH9Y/VweHZ5kHrpL9UNjD3Ni +6z/rslGgnqDQFo3DE8aZftJ1x0uhr6LuxUGWby5VZnstP8gtFCrvQ39qZTF1 +JOdU3WvaNh2QXhOKyvC69SgoNtGxSnqf1W8luEXxOG9paNsa6yW+tL0G7kLl +3VWBrWBUZQGTTNze9rPHu/A0aQoNEh1GQjr4TZUS/sZ5n5+8tC47tZWXHlRb +iNFe0Fj58Mle/bOntAy7GOjDLQ7jBJJ/zVX7TNWqKqsY385ZxbJGlcEEBdt4 +0HelDuv4urMol2HpQnuIZb17QAgLBYkIxkc8CTuyo349aSJhoCAtu0/6KsL2 +pAhEmwG2Vnzt5Y2oT155uzTp+hYf+TuKcJUdCkNuUG3PPKETeHnMtTlyVWRv +4g3QUhq7OgsrVKW9jotbMEM8D2MXnfvSOdkF4VROHmV7fLOgthxGEXhOF/RL +MvqZNQ5j91QYVeOa27EubxHImcOlTJvxaylrJW3yTm+PXfvmb/Hu/W8bCjNl +5krZVBVSDM1/HM00zNPCprqtG2S/J+wigMagmyEgz6/NGsosT65MnEGAinjQ +WxlVOwiatqs7brOk8zXHCt5Yk9+pLeZ4kcjU21kGhy8N1P++mAQRPhz3IW57 +eWqbOtuiVNWr2orAvNb1ifHhqR8Mc9SfiM8/3o7Ev2SQ8No58bofK5Z4z6tn +n9w/myvTylFVK1uyNMysWD5L7p9+3bw/IZhqLipm3gZkMK9I8GIhrdRRRX71 +/Kfoz74fwzvzouh9eKo09MfcWLULRHXDDWGVKKUToWuZxnzlnVNc+Z1vXv49 +E3v0p72Es6HzHovvsgey675Mi1CwLkwqEVV52ducjc9Svhn8z332YDLMy9ep +i68Miw0+aZVcUg1zQrEtCtOksaDdZD8099afveri/WVTVxVhlkxTRbmQiqFd +Xmu2SWuIvxqXiVTsf8qlchs7bjiLG4Kqauzpz+Fd0OAZtsVYYn4cafR5h1/e +BHLuw1PmJpWLcJ7JC9K0IxwfRmohdFufu4+Cnb9HxJWvrLT5Sn8MKsC606KT +5YLg8TmTOvUR7Xn/h+akQQIUJRFy+nFRF/jPLMhSGtbjbjUt++cRfV6HXcaf +sKw6Gsqj7wK/Nd8n06YvLtK17+G/Sko7KPsXc5yu2qR5yLlTYSP3KR1ELKQ1 +YbBV4/SlsvieO0vmX+9UOmmaEatkuVBEsbT3rbH46dxu+x8whoVekya7+Y/q +uqG1NCHMcJ22U6qOdZdPwnfkeJ9GA3r3O4we+XhQ80lC7p+8DOsPKFVyWyR5 +5snY/rxz4smuTGbIf5rDWozXVu0oeH4kQ0lKxMrsVgkwdndb/puPW9SmjOKq +pmhhEDbmaWLeoJMUT3PDuK7bM+qm/p+bLvjd+RpuVkSCqqt47zL704V3fWuY +2puGA85+NWc1pzLMMpLnueDGdNSfCx/ac5/58cY1n42WNnzQOru5FG4n0Euc +GmMs47XrQ0yqSuTLpC0n3qkryJYy349dFPURY0ufxiXzswtct3koYhHMJ9Od +nsKyrfoFBEXaTtNZgprsmfb5tEXZNY0mzT0v4UtjOA6klXyU1dxdixynJeg+ +n4ZtcponNQ3dDdRg1u0iYLzvoTX4C70tX3ERl8usipMpyTLwpzFO+/iPEHEu +k/ato58myJ9VYQCDNOJJVlRCHtjNc1ieXOXH4FI4dfXywLfN3I+78kwRSvwC +DHYKCKahTnlfyz3cZIYt3+gtLa/ynxZl7ZoxTwNG1gkkP8wgb19IxV/9LoJz +ERbIjy0YD53P5hfS9nAyrK0t+e4p8DtcU7d7lGcVhos7Ky+qvMJjE+3sLbhU +0XeL7tWkklfx6MGw6qtJxPemj8EslcWkbrdtTuqoOVlCr62yJyuHLdTQ0VtW +edZdJijGgZ2JjKj6bdqHZ3S/5Hwo3klAVvI4S9XaPrWw0zsfKQtXE6haYcBr +VdVuzIskKzPa7je15yaQmrrsu8De1DwSKkuS4reTH2pE3MmVZHPX/B+BSjJ6 +o6r59f/GgmqNMfjxOwuhco/Divi5Nzm8ve4b6SlVSqKKKKP4h+y+xA/B9bGp +f7n+Hw4J0iMr+o/b9K9p0/U62vYS+v7KqqquV6jVfSu3aqlVVVVVnX33RtQ1 +T7WNY5SnBjKmtU1GSbfyM28yLuz3Z6xzybq++Z2W3nauo/OaClRtYioF3rX7 +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 +ucmeazLns8smPP8FZWvVooVpArLgmuY1Wo+yCBQChLrLHU6Tj4aUlYWaua1N +kXWRwFwUBNlI/p2khaOT95W4UKyvTC2DEa6mStRITHNF+c8kqT9qOpA6jM4t +jmh0yEI8js2g18Y9BJO2ckf0pjmq8niXZdr1LeynN7SVz9DeMiwL08xIU/U/ +CP+UV/FyfOzKD54BB6Fdqe8zfUnavsPUeRY6jKUz6yndhN39Ka3bzoe2otVJ +cojx11D3+XjWojoUibxyF1UezrM07F0pFGw0z2prFNxxH/ddMmzQFMb6mL1J +2Idkz+ueBT3jVdN2wTTEvO0rcp+nqJ5dhGOXtrXLezTIx7mIaJ940k1/dLYJ +2iTsuO7zuUi/OAvnrt6a9NcHxb7zWBc1dVzcsCsS2ou6RY2YepmHLU1p9b3W +PTvOVlL0WXuG4ClcutylKqY0lk5SoStvkcuGhdplUNgVc7LELktSVwmbXacK +GyroM2oneVf7Omqto+H+O9s0/x3WcL51L1P7Q1yFQodcejXUKdfVf36PGsSx +oh1aj+yJ4UZiEU3qmNk4HFZhKNdJ1ftjh0B2/QozFudTnHUTr0B8ESbeRJlj +nDTve7NO4quEuQp2k6XpOW4ESauLy9YXgWx9XBaidok5fL4t3W91OdnuJZGY +cdXVKk0zePZRlB9iBaPYUpIo7VksX1EF0Wvwf8zPQvTreBhtfXqXTbRD00et +AdBGkKWDs+JL95KW4W5hz3DjN2n+0zDT7QgiIIIDtvvTR/i9q9z0mRvlVL60 +Jv8vcu64qz3ekJMjKm9fMR2D2VsQi/Ytg0MlmJdexQDRI3H4GuY1A85fXAv5 +d5phPxcG35bCSR7D6XoOqyhta8Q7etXeW596W7M+ePtYZVI2s0IbxCbWzrIs +av/X4DgtivjZotSenyag53if2r/DejuqHfXYvGWcOUooljP2COrvOHhanl5F +4WZQ6FvYkSdL3+aW/TPttMk0WLVsSneQfzfv0lG4cbA4CV0dUVV+RXk08qxO +z4+U7FVs0o5sG3xayvZlG+ZFW0+cJ5W45yELAiyfsO4azJMpXs5tOdtmKdmH ++bfTNApb2IPdVlpco4/KhTpUF4fkksluWDWJ+21Uv6whwH4Vtm2c+y7tI/1z +15Ls6LS9ZZGkkCg0atO00Tr8JzpE48U/pJmytiJt0ziLuF/XVeiSjwSmH6nB +oSoqbQlMt/xEpKvT06YR9VwWtGrLUU/qapVHkxjfNZFUIxf+wD19Z5n1Rt8q +2m0RT5xOhtbHQ6/K2VT3aZdI5Grbv7t3mwa5pHWUmHsNI624ns/688xG2I5u +RiCNp7yu6uTJL1VXLZZMKUlbOPU5zV7xBqqyc60ehVWNpDJEaaCVd6OlLeaB +QfIe3KNN+td4DeMu+FzTBx3w10jHv+7E/3qzsmK2hetdYt8cE4iCoPzBKYNt +t9nyjIQEBzGJGYNgoMYnEAwEMxpo5w2xzg4nktCFAtAhSDoApHS/iVQ+wQiD +lu48+gUlqGtYTrzPKOBydjiaE6VTXHJP4Z2Eh5X8ij2Fr6E48FZQym1Bfr+y +ydM/PX1YedKYdB1Uwa5s3Nky3It+dEhOR4PvUpVXtnFd9fdQp/zspU86VZ1C +31aZykOeR1mlRVEGFuzXo9mGrfxhmXcN++k/1z1IjDQpdz3MwT3IcqCWzq3L +30Mtmblv/EqbsvqrjUrxOGjk1BS2tV3IU97khS3UK08jYMq2n9QvnfaRoqjj +T/yhXkcH2tCi7RzJZXVgLGr2L/FCWN21fTrozdHW002n+D4INXX4t7GoU1VH +THvqhQ3JvOAQaNpcuGLinyrn/IwvHhSK2uTkEkTOUMs0nvS9YqDV0/R7GVC2 +Tpb05U7coT9rRY9Q9bCZZvkYmMrd1U5FsUOSlMZRRYUnnuT9l01cLsvC5D09 +aa6dIWFsSKLwlzyfmLKjy3WTXXurladoEtYz66/OX9vxbeMZt7MynLCtIxas +d9Juk9+e+2LcDSzlvfZSMS5/TSGny9oGySpWe6qXbRHLTCsJI73yKUwLo+Om +2uMYu2K5ml9+lJG0Nn3R4Wce350kNqUREbg1djclTW+L7F2LDtq43YuDYTw0 +UrsLbdGuB+FdV7qLBZHCYTn/yq+Ujm4xOzyFhhcLg4KChUHCYVC4RC4XC4Lx +AljSoZexasSjGc3PZ/8f/WL98H2Aoj7NpU6E6upetlpeHqPahTfxvVTVEqh0 +XlURBEREQ/3AML4DwY/Vkfjzn46g9OrOxD4D0APE1j9iCGigiRKKCI9QnkT4 +qqTgIHjFHCOprh2eRHwBHR2eQTbs485w46moipqGK8V+oxwiMHPGtv0x7Q8H +imamamYiMZx2Zxww8OBmpgqYKmYhkkKCVCgscWIKFZVZHeyUDJqVc3LVXU1E +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 +AX7eXiMiuYWEwbGC+1kGw3nlMcx610mOc9da8wmBesO6X2nCNEZ+aLl9Fq5V +qtGu4MgyWmXlt7dnOVSqSqioVF5eaRrMkhPP0lgaN1DhHDPP4r/nC9N6bu2u +tW3dqjp3q7zCB5T8CyEDDfjwnP+Ztzcf2eloEJMmplxEWSBkqZSmSIsqYRV+ +ZZQNf4vs35V7fyHvuVOhStx+cYwxTarFPCz32VCR112BQQwpgcmFU6X+mPvZ +8w+8mpam7Rp6CW0hJ9xIXjNWkPvX5+ZCxYgwWs0HYeb73m630nmfB9NdDE8z +TRoLBTMKJrSqfGhauKCK/YSA8DawJiwxmMEeYVUvQXqfcRX1CoyT+dUfv3Gc +knVk6Mz52DwYSy3inyn79/Oeu+jcH9H+m10p601qMtGmtZZaV7o27foGXdM8 +TIfI3aGe4XvWViq8H0G4TUZcKfz2YwMMJN4XToup2DZaC66A9U9N507z1TaV +yKqWWyf49ktGzWMEa1Gv6TG3USddSwYZjMMUUi9SUwY9bFYsSkVChVRqiqJo +aaYqiaaqommKommQqgQmmCqRCaYQUv0mRBzKlsgJmqiqJpppiqJpiqJpiqJp +hq2VRM1WwCJmBaRjx146yWOB3JXuy7WuKuUk9hULBLFWTKZIzKimKRubfc+Y +i8/RKR4nBpvHaMTrmyFaAhXo8PB4eERvjPsw+XyWRCdGHGMTUUWzGKj0+Sdd +XWhczpc5gSQXEHI48NMVVQqJ6A+iwLNJ+kbTgNnJ4qVpsy5DlGlHXgt2OQ4t +Nq2GpEtmbaasNaPaDDZ8LMzGmbzV25XWyNdjvpbeb9I896aX4yF54X/F0knL +3SMamZGjWpqNNUiZmYdTC+DzboV0OJcLY331syybmw0SQrjIAET4ACCE0K8g +OMIxVIyaQQWQCAAbHAX1zwkOiOTxDpU1RhxMoAGlnm8tzqryeDx4zHRFpltd +C/qP8nFSiSsM5LVNi3KGlcjlL0MGvbDN/WFc9Oi1aHiEnSC4wkl8LZNRj/7U +reoW2FxV5WIzIVZUyuvA923R94UjRy/OQm6q/zionyKuj6KULIWOloTAP4S7 +k+5dU5kahcdJWKQhRXhiCGR9fqQ+bQVjgt52mXkLC/rkaN9E0V1ClWRt83sQ +1LW2hq2ItQnuxrds5Vl3311nypYq9IDfPVwzsN/fXblmf8uwdZ9t3PuvuPH+ +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 +04hxbjGrPKXXfwwh3VliSKyixfxz/u3T+iNb0yxpr+A04uVfgs3fc9DmiU8G +MzLNnIy4EwFBMNQgy1bDESgsGGHy3a6oGIwJKhUwUWyMNgkpYQqlhei/lirS ++F1dua7oTAXyi+7p7bNL/eF7xjENdbvau463Wvxr/HydUJcqyRwwYWbaoAS8 +T8iSa/mnhjAg3YDYiBmoXDpBQQF9XkLUvLbM4sltKzFMZwPyPytw2nsmHvjO +sC1alFRicMuW1+Bz7SGYycCakwHl5lsC62L3GF+t3HEfxzDYMy13rH8/QY3D +NPcau/1fC0QF4pMqirCREqkrISklhEpRRIYbxGlSdApwTHaATUWNb+SE6lub +m3iNQd5V+y7inoMg/IzxCGoNDypIj9szxjiXhfnliVmAYoxhWYGEwZSrIDEM +AwysAiEqKpK0kkQqSVESqZLxvZZa0opJnoBm3oIlB2x2UgRPbPtv1KdBp72t +iIcjrqoi6g/8g+C5NvW3nMI4D/Hi4ledpCE/SubRLuv2urdy5VfCib/viryv +Oh43QhiVULOMC/MHU7hkVXrKnvkpCzP0uD3L6glQUJUFnViuqm2CvwOvdXjv +y6bNw1Rto9D/x7FSYDjoly2w76652vJGz/ZUtdkNX7E8SupI/Tt5eMP72/Qw +zmXBMe4rb3+LjWH8NPbII7VOOoSP8tSkJi6ahoCCCUuD8TpM5vVT/FbVAP7+ +5+n9rip7pso4+7dNknLk3P7rO6Z9bPA794bx4U+vdFXFYWdapqfRLUHN1wTD +jPcoPSCAQF3IVqQiKTHdMXS8vUZDdES780jGdsVz6MD1zvevyyipbFp5bT2M +q7fattk+bxaYWlpXcq0k0srvotU4DTzVS0aptr0XxkXHX5vO5SskmfYTNqOO +ickh+t2lmgZ5vlYbfc1RRFjemR0dGpFNtXjXfpmwY5RV90SQovYVkQpH+tPn +iyC6rQ67Atsr0XZVRnsWG7sqqF9Q/FzT7umr9bSPTtMhdPurWMFSE1jjnY7S +rRuW2kc2sqsOR1GpWhB71/yCQx8v5lcpYxErvY11pyFOEwC8pr5UPn13kz1t +ex6Jb9xX4RtlGo6SKMS2bfU3j1ftoc3CiuRRH6pCjx13p7mWWSCK+dkV9ZjG +KDbGFRbXs3zmvQuiQ5+mJb9qn/KytzqqtYXQb1Ju/OtylbSMm+2qbxKewxi7 +Nri22har/RaVheT5tGrrmMVz2to7VPXiL4sWgyfv1W5a1CLQr7tojnUURRGn +ymFGujLpXa3HZTVy9vmHU2JqhAVyDQiqzJpHfadW3Gh0wZd624ZvQvV5I50V +OaBc+ShDZRZtuIyaOwpgeI/99J7rk/0GfVydv5b1d0adloci82qS5BbB64pu +2QZxSmkf10IcyF+Udj3DW55HiijxKyw3TZmmzQ1jaH2bJx1tWGm+eGo88jEm +LTsjriY1q+yoz9upZFnz7IMjWVAiCgRh2HEXfOxtSW7h3TetE3ffysnZWXqy +9Yle3bppfCNqqiG1hXl+hVzSmx5lCtNDUiSl1k9qToKUwKN8nGuspSUYSQoQ +/tz6WjfHZZjXEYJJXZSXbY5MKnlFOZK/Lk2DALB2X+YSjbBEWJwrDtjUnmQh +9lKaZ6+bsFwdOc4fNZ5onJlVeU+9rRqlb6DaPe1zM3lrmQrbCR3nPg+6TyhI +Gdf7V8FE0V69JUKaOg5y64pen91a9ahr+JMIqli+oYxq2LorqxIc8L0qtFeg +zzSrOjc4dj3SpFtg1ijMD9nFyyqrYh78blZUa8L0v4mrp6RfW0Ttbo1HSnl6 +N31u5zWWtw2EiLcV/8Z3tMLPFxfvKWIZpfUPW/hZ4wyaPtU9JuO4bwJcm6lI +lPEUtFtfskzEq69q2tIrGGS04NhfU87l/8/DHs/mbC0jPsUxmpi+Wq+ldJ+y +wupL4tV7bbXFeyttPxo9CHxaFv2zXFE0dnkXmr2IS2C6c7Lf40bdxfotmiSI +pkqzO/LbQlMnqR6BbXtMLU/Uh70OWma19py9lw7MpbJPw4jptfY/8Yl2/E4L +bY6W3ZPrQoDKF9RLq4jVP3qb83CThEN65MucDt4tulIxly47htG1yJT2BgYZ +Fnm1qw6dZsu/2b256Hm0NJ4/4a9y3hpaav2kCLbJP3Idlq8ddmyUl22/WbN4 +J2lS1WXe2OfG3VJvsWnfkQ6fwjvvmqDtxDWZ9JL+2LfchcWlj6SpNwnIpKCR +aRPn+1E4ttZpuaQg1pRFWFKnMWR9R36i6optYY+tjP9qTr+orOUm1NHjnLXz +M7hO5v7ew+9uUt5kx+GiwPKmTrKHPUiclIsBCv/M1KkZ1SWOQo15VFXkt2jr +3tv1Gw/Nr/3eVc3jRl34+n/nQ1eHhYpVVjbxU44r6aujl+Qm7+3Fy6V+v1Mz +92uamWGQT526Ic82JfoZCeGBBHhDXaCCA3TPzZuX6OnZ74zirzqp6+Z5/SQU +1KoIIDU0DRvO/tcp0sqRpTX1eTdNWqbS/Pkg2IsEIYhh0cq1gbVXH9uk9SIy +Xvquo/Gnb6uSpsV+fRcN7Gk2GlQxh8g5dpavhIUrdSVxl0EV9JENaTVrelqO +y5sly9Mzc2Wov6dLdX7VnPZB9/SkytvY7WhXL3Ta/M67SXsGwyuo5PEdkH2c +jAPrC1BX1lMgjFfpLeL61rLIe9+s/5gGxq/TgYxM/w4KPt/JyiIFyksJoj6Y +J3QFc3CVvaiTKNaut26KpLfxoynVtdueO6lbqMo8JmUClD+/BCkYWSCcbNLU +siqugsTG4tX05UO8e8yunoiax2pdOjo14lYbBSXCXNQEsTaYUa9MSu6qQzkO ++3e+b5mFwQbX/NWnfSRoGnZR0EmRFe/ey3WRR12t9uIWV9K22zPL1ZWlUJCk +8VxEtCrTm9LyoU3HyWtzcGg7Jg1xdxJfF8XFpLpJA/ZGrNZYk3aEczSLwitO +nEq/BO1uRah/egsKwJht1fS9WFF/hBBiJGpCUPn6+yfupCa9NMbpKnMeC3qJ +OE2sDvKAunMXXZOc3iAs+/VNV+fvHhcpjkdlr3VNh1JXr2MAnmEcF9NWrKmo +++Wcfz0VBWRnae7C0POqClvCwFZmkoRB7Wu0cKjSIKgizEuvkkobpgpZu1IV +Fn3dYWtJxmX5sU+HtOujzWNWnNDL8hNosT0JLxWhsf+X9zxUWLxrWos0b3/d +X+Ykz8WF9lQWKTfLxUhXk0XJ6229f1aLiI8pf77M0EAk0Kep3H5z9Rhxptj/ +2z7jyJ5i4GBBxsH1Xs9rO9V+yEg7aste36nvGrDJMIsKgpi3aSthi2yYu+J6 +lFtu6kS3V6pPVKlC1rIsWI3vA82fYmpo6U3n5Xn5qUv73Poh8xUJL3XZX8py +2KUMmjCGIOCZx9Lb23scl0p8iDaKxarsoiHNGoUQni5/Cpik4W1qFq/cjrwk +v3zW6/wnmCX7Ur8s1vVqG7UZESKRvhf4kUVzq/TxwplEtV12FwMsTwnu0Txg +0v8uMflkJVmV4sTGxPksXsfIpLIPndFFQ5WbK8kpryQvFM1ASpWPur2Kf41y +sswkF2I/FYytdwU9m+IpOpRhyE0ncXdNI08auR/fhPq4jtL2stbyd9dGv/3K +t3yU1qDB39c1CeTVrUliabZOm+xbq7R0vFmUttvDfVFYCUtuuuq2+yfemKAw +mbeZvcCvaUPIwGIqskSRD9Y3CfKrwyHOG/tqFEeJuksnOcVt/aSVFpUuWVFs +Tq6kimoRqiOsw+wzbC3ZzVMXvuaHW33Odhwmto7e5jWIo06c95VbljVhVTnz +J7G1+CvJmiHaqihrnOXEcVKnv5dZeipv40t+V1QF4sKHOKuLMfRw07fVhGev +iL058UcTHWLzWlQe1TIWyCu+5vpA4X8xk+iGYLjJItK6LCjH2SLyomyDAv2q +6VOAm3oa5Wp9foG//RvlrVtcV/5qQoToKRtYZBon1phIGMfSnC/rB1UPlvla +kWGBWuW4uVrm3/etjwKzk3oRsx1LjOrrj0qOqS03jO5jsOjinCWJOJXSnJyK +USaMRnnv3HkuUFZ1bj3ZStIog8sxqGKzS4OTkkD+N8yakQBy3nWFRWZhyRpn +IOCw0UejMJran9aSFV7UqEvC5PBLdy0rxNDdKUrdNU9kM+xCheKoKJ7j9l54 +dj6DFMAn6yNorb2sX0/dnK+RjxSB1v2XSRqq8zqM0orl3+Qs/Vnl4Tgr85Sg +9BeHWhqGrLwXfisLddjnfTl5kB1IEv7zs6rrv3bEMbycctypOrQP+PZ88I/8 +97iQ57X5XHtIW3lv7rgNxMVj7uEeOusom0bwLMKTm9I7LRqEuvh4zo1h1M1D +kMdZoMbLk2V+4ddntvGcLoFfUZh01XVG09juqsWPe3gO8ritcewf+01iYBov +dCrP93qdF602ySV9T67HHqPtKjLmC4usWF36Q6iYTNZHsc71rciC+M83sxfJ ++aQo/H96SJq8SEpkyib3bk7j6uSj7ZwzENYldeSpumHW6TMg87xsuzazvzdL +DL1l82+iL9bOZle3sbS+ueskeVJhMwx3XS9C6iwtK02Gv/XUTONY7/O0LF7m +9q3gJbxp8iiS0jDxla0XsNy12iX2i49xV94SHIbtHjXqKy5+dBhG28SMojis +cPqUtcVVc74/tWJ9ikIPfTqJcfSSCcedrH9IUtTdBqEIomAUniu+7pBkUJq0 +h7zoPme/o06U/+Y+kS++DCGhXGh2B7qyHT0PfjlSuCTqSySWtPgcV0aZvrSm +TsQRpWfrbpLlseaoSLlxPT57hK4jEs5CmIx4PZcOGuyzUx9aPJMxKSvCo3ss +XJUlZtTwX1otb2FYJs+aJNgpaVrtKv27WKSR1Jy7zavsrq73diU2nWRTOf7F +pUa8aP/bPs03qjqQz7ZNg4bSMg3T5ryvsBYuGrjvqI0bFVe0vH17W4qK69/y +hvBfnc5yswHHeZk9E50CutXVl6tujdWlDf9Lo7dIVqtriPujOFcxH+y9KBex +jOcnUwVX5s+tzgtX5E9Q6vZxG8hz1HUNfHhmiGydcZtP2/WFqVi8u+cikejW +fwmCr9Wk2dU3E6KJYZkn3d9wXJWddnbqVphW2e/9oRGkT/7Kct11ofnM/FNU ++RFy5o3a6UZ4m8/v5LsjzSJerdPWht/hm5cjb2OijsPfFOEbuSfua+i2qevk +LG4Vw2iVFb0s3m9XFDJJOUa5PYSbcu+jLGnDVuc3lVfVeHjy7Rto7bO9vXKq +k/Uiybrs31jRJtksr62Q5QtSiqe/hqtQkTUbxSKu3DhNq83WUQrdxXd+FK3c +RQSKJw+Sd+doEbflkEtQlvqqsqXqWot8TxNPOoanrMT5/tXedYjzEcTfFlha +T9pm9bwOxeJe4XNbuFqcsF/d1eF8ZJ8nyVHkN6nizyVmqAhCmo03TwIhHaY7 +7pM0+ftUdfGMdxXn8OKvt/uyVOVIViUWwv4ld06DVJW8zgKl31j1mTQvz8xY +kVQKZOuiVsyK5PkxtHbKjUFHlfQQjAISlvoreIc1IVnelK1Bcd/Cf2xyM4yU +ar9u8jf9O8p0gmXQdzzdKtDlWG4sekWGT1S3mbfcSnqtg2qaKrZ3cpLBKzHo +quWdRuBZB62oRLS/1eEA/tWnsqei01vYxNP56vfZ1PXRa3psv+ax7ywDK+an +ohJ0fu0H2Sq7slWV83F066f71Z9I1qxuxM1FtViSHYQzyr9c/eiPD1FQ5UEE +BtWGXNRJrIv0fA3zurAn1NoT71yXSdKE+VfHBpaVxDBIa7XDJfYhZNFW+rKk +zDwJ17y+uMhIzgKnJ3PRlkU3yu12a6h9X3ccfRLkfSLWurbpY1M9dn0pf64l +nvjSWFYb5oiiaHRnQbWW4F5KDA5jnuCy/EQyyybNQuqlStNNq3c/32z9Hth3 +9BJS5MisiZx9rbfkrsmvRUxhlpRhG1QRh1GDX7hvq9vncObwpKoCSqmsbCre +idjoE2dNlG54Gkt6OW1apGU54UZWbYq6E0Ja2Kfy+BA3y6JxkuqkFOS5St5F +GtVRB7NVWYa/8mn/CfqYjSOvcnT/fHtKkvCVQ9q0nWWNXV0mfa2R4B8FBiCL +uJYHsr2aT5c1qZhsLDx1XWXh0Op8d+qZvKhIKx3ZUlSVPe91n2rbaRj1I1dq ++7CHqSyaPDP69SqvXI520qTo22LvcxwH7yMms1M2j8K7S2VjmkRXbKBQ2BTP +UtGtroLAn2O8yxKghWuY6aIHVOg/WO6L0sCyaOtO/1eJvRmzZ9hkrUeCbBgF +G/Erbdqa/X1sRBQUIfj0+W0zh62zYLkwhr2nbp9X2dfpvs5rPOY7jLuQ0zvp +Vx3cQXRtbExikLAsPtw13cV4M7Fagw35fB9myhOXXdrl6dlv0FkWOQ9JXgZb +SqurngbvPKFwsC8bE07JqulGthm6QoT6KBLH4Lw6TutN3+e1CQZiM0KqpI/l +9D+UKTlqmjeza31QNehjKv9+FqyHFbR+XHZJ3H59a+Tqt2u+sS9rnpW3ahty +82B4cbVS2/8926Y1G3ExDUv8SNsEyYp5XlRnGvT21z0qrJmyK9L+n7fa+jQz +WqKyDxLDc1WalWFqbleIxwLpepg7KZ21x2iu0nVZiHoe7TYLMJe461rk83wl +TVu+p3LYZ35dYe4wlHXWVKZBK5RGea/jW+wo4xCwrgnDPtg3iDqD/oQvKqtE +yU8daG5dPkkdx/TytLUf3VXHWiQububncGmkKkP/c595wh6y9fX7/lIGls8+ +qe3155h72m/1Qmza5yWOYdw7IiDL12B4fZXtUX9ODFXvmab+CSVDQT17nn8i +/r9UHNlKdI3gcEtFbZ2L7CKpMnV5YdVX+Oel8r07P/zV7+6nU6rAoF5HgwCh +K16fXm96leO+fOyNnateUJdpkHdcprO67KC9KyrJvYdpUYSB7lv7LiPBxGOQ +1dbjUoGYyFhlTxaq7qEwbWYS689Q3O4/zfXCrSr+yfF61H1ampG6b/JYl9Y2 +6zob/r2dPtatR2MbZJf+z7LeFH5Pp15apzHO3vVX59bBQ1g3tNWfcqq5SFrn +WP00CivXCEYyydYy02yosfDz9UHhi706SrorfrFp3owixyXGXD51OeLoJzLn +52BVn6dl/jlNavcITJi/I8vLUSEoW6kLe2PyZe6HKHOeha0g1e71FQbCuqTE +Wv9Unk6Oo5HaS68FAXhg7y6dobHTI2ln0ZrFtfwuUo7FuynD7o3A5G3Jm2ON +YjT6tWkAtbRvHgk21a0oJRVD+SMbhiFBab+mUSLV+liojDU6+tecCiNBYuVq +ay6fkXtnMOjLWJVT1I2U5Q1oFrcVXmHai0uc9t/SCHI2jKHadSn2R+VPRs73 +tPmymKQ5r2EUdI3MnC+++N4B0VElV8bLIIxqOg1SURxj6l0HU+USicCwbyLD +UktUy4HoSlL1FZtMEeeJ9LL35X0sLrInh9ex7Rf+dWR3JiWxSOAi13VtyXFa +59NJ8XDyTY8H4qXtvIvj8NaiqTID4dFcKXQ+2tFwZ2dIitz9uAtL+dRKJEmP +aLirkB4WFo7mvRWE5bNjCGbr0tSuedea18tJz4SSTo9cH6LuwLpzJLm2WDvr +upc6TjuLclCKj/+s4hUfJXvod1W28PW0GHVNSkbxqYnpwUl8heHdzvgVreOY +/hNHoOJGzLGQ6gNIwruvBPuJ/SHu4iacyl4//b2T4kyLqStjYa0rCXZ3YOgn +Q/hu/lKFfU7vrOjmXwSlqM23X9K0I5YU3jmmaCNT3bN6/9SdnTey3M8T3BJo +j83XJ/fTXSfN0/19zkod9zwK2iKMg7ab/yhb9s63w3iQMyyMgrD6O2iXUXlH +pMl6due03/MVkb65chL8qbKeB0VYpbbexvHdZVgRCcJZHDg0BElSKCzUiY33 +owhf+olh2zdZ0Prf1wvSDpqFsA1tclbfJKmLQNAoMLp7OINSNC4OfmrqI/sk +mrzwzVPU5jpZgn1I/WKzTJiuSNkOT6yJWZKGSXfw9xpGn918rwvG0ef2a51S +sz9REHf6lDQqJrHXp6GVd96i2xJFNlLHfIpn3oYgzrN6NtrMkyb9tbPcrDMJ +sn7m7+KKMtj/Xp5SMPpPZUk8pscO/61rKo7tpwtyxOA9LqT99n5wKXR2nxiU +uu8qxPkhDSPSydfqCvMZ/LIY1/TurImjHImyrsVGuqkqyifGj9DiPpPs80TS +45Xk4Q+nMrG3/Mek7pousn/kdkXV4Fu1a55Dh1KLP07DQsqjSZf54E/clP2p +nOzZoxiBE/MCkqUuiyun0vwxX1zNxd/JGy435IpNYx8791sz2jjl5z6yu2iQ +rlqsSSIohjAIQpyra96EKR1nR+oXk6K6CgJ289ra2UaRkFSI8gTn860ovkWC +X5SXXQKd9l1WsqaC4a58Jh69YVBfFVF6XljW1kHxOLbkUs7aveeTWOKlvY5F +ATHBs/UmFhNxO1KeCsNmsr9dw89njnjzyvPajHrThrWSjyiqooskotDu3Kns +cmb4Xuoz8HdaiMXaTyp+Nv7jyTaZtc7V4RjA8NYbLDsSrvsS63qlqUs++eny +py1ZSZ7KmuWTeJo1FG2kgcK4sspbHptgu5wYBQk6YTnwxP9g4+HtzJ5K83pK +nIXBJu5m3Hxd0eZXYkkqDfZUlwIDhpvVEVdTzrFckRsrUmKhRlKTa1WjzMa8 +KlKHqmPfz58wzzXzHNb3bpe9DIqBStcvaTKsjz8VgwTLuVCwqISVAwCJmiyL +jprjXB+6CXy5pWbcxoIrLPA7FO1Hh72B/tIsrUFj2KeuPu6SssuXB9q3xnXZ +NL703/d6W5R6JipS3TpSpFoS9eScv4r2wTVqIpCjXhfFl1jLftZW0yVbkbVZ +tSmHS5YkYpbsLiiTVypVWOcztuD4EWet1cC8KavszLr7XSZy815BXz8oY+7b +ro0al4lXretOI/H556Z3591E3/P4y9rIhXDahGeC/hYGIRpvGC+vScGN7tvN +FnWVVGtRhcYW8bxP3/m/bZATPNzyR65p1Usltehp1F95r6wo7FP8ZxaKQ4SV +Lun6ieyCBChO9DQzwIt8mz2OcbRevgkOHkE/g1jn2EqySqu1qqbd16ks9Rvl +HkSTprs3P9NUTpj8dDXzSZqJA88vK0ty4vI7TH0vf6xdGfkyKR7eNi3mIQis +O2oKtddC5bav4dxx3rZvbNKqFcyb3k/RT6l4adN39tK4rbqI2+2Q++6KUr90 +EC86MO9XLA16sSuAnniSB/rhtUjD9qX7MVqnB4fcbtX3oc+FV9xGYe55ZukM +JTZDXsq6gZN96xOGoRimwEzcttFyj7dNL4lPjIuRoJxfnyP1bZMCwNf7v9e6 +mqvsSojIrmmK3sYipFoXLXS1fJ0u0ombvdFf67CSdeD0GRlv1aaQYNUEwvnM +R78aR930cN8mAbZZfHtvG7fhTFDK8rdUYhxrLqXzxMlmq+xfnV1grivLA1Fd +6W+yRqHuI6yKI5X5LOnyyKns6xT3gVaYcJD8TeFuibQK+pj5Mhl5QqEHNlUU +J/3ytQzLkpa80hW7msuzbALc6iNZhtyDLXjaf2oV5sjQU3hs8i1xUlNIfino +XhS0yctIe2pG72n5tmhTRJWnfSuK+yTorOnOp1UoXrHtWzXAcRSEtcatqZhe +MeIwLlrZlUGQRqdIHqf/NYnOVc13luV1AtZdFs+dmsFq/1VuJxnV0n4kCYsC +rCe3B3V+vnSWORuEos9U1YVcUll34zOxaF/T4N0rSYz9R25b1FEW+TV+zV12 +1IlrHBaDeqY3jPME3aqJS7TLac0eQfhwqKm0lfBQUaqCLcTFprlrGqvbpqvM +tMIkryU4lxH6bvOsK9+ngdK+SCs/FtbPdZwPHqWRsFYsS5JEjKSON9Z83EeU +5DEy0thlLDKJamV+CnQNV3SlvN0OcwCMoiwHEdtjEt5zUMus2iiv/qm697kb +4rfbHYaZDMltNcv68u9DELoTzIUtGa6lu1qsM2912R2AjbwOG2cbRf1pWRmh +TpgniZ2ksZN1c7N7TtokEEHqQgkym/UjX4enIOMjuiuDCZReXtTi/07tq1cE +pd9n5A87lRN1ESfBu8jqmmadmGraxhGBm71qOa9tGfmKvPA2l7ZIwzsP4Sfb +vhUZYZSmDDtxTLMuLAIpq1ycctnMmz5X8TdF9+CLr7Krd40ced3Hif0r+uzD +nsi3LNv4t6zPo9Td9bDsWqCntKk3STOvUaIIbWNb4U7XJl1LSK2vmybQOEoj +6dKccWAtrl1fg2N5HDqmmjpUmj/mSdC4qIotfyCesspUbiXJTOZfQ1l4Zp87 +YzFA2yIOUiroxS6N/WHIWSE4a95OO6Na1SVhXVBnb0UwlPtRVZfVYOzcn2Nt +5UlshWm/vcVfV8cdmnZVGlOO68907FN2orTd97qi4hMEpXN6ErYOk9FNIoyD +7uugWsaNSGOYNnGLX2bqg4jVTRa8wzvrr+TbpgnGbtRU2uz8koZGZcZ2cLoI +lJE0XhWsEkmIbxf+m6KjvetfwaRs7QnrW6BS35WRcULy+sn3XSFPnDdvA5ZX +7/6kzmiHphy2dWhpXYZJKlz5Dmo6xOGV91H/I184FHk1erZITJKeqaoMVFGT +dNd0iRlbvFZXgtiVXuPKs6CKIa4KMPS/1jXrt1ZzTn8nMNy2zDsaiMsUJFbV +e0e6a/z9G1d2bS+p9mwRtaJbY+up3xZ1qsVrW5krSsM96812vaRC6m/fHfPR +4TmILUSeDRSfeVxNpv0zaDHvxhIazMruEvnDYKxnVebDurfgV2Q2IoukS71h +PWm5jHrJWlSoMNhqKIi+XVr2SSiioCkdrSpyy/ZdFQeG+OLWBDU3mC8STCrG +3iYMi8NzclGpjGKExffXBosmpqFBV0ffXUl9VGcJK0T20r1IXjX9V31qImWP +nCSQadJPwlwQlruxnrJdV1RlSWAxrW3GkLZCrNX8ZjlCfdwlhTx3G+R/8YLC +KgrsyqScfneKTC30uNHaVUUjSaiY1NWP/x8F2bVh9x0Wbe2lLjWs4hesqafo +59Y1/XvmFkYVGX+LM2SFJWpdS5Sn66TkycbdbeuVF+k6Xqvv2riSL+9i87t7 +og+L7ts3CRP0v64QjAq6lmoojdSR2Yp04k9CnIOfuyycIrl1b/8N8nNJeRXE +ZfJ5NEvnHRlTFVYF2FmwbpT4urGEEwsE6SBQGxXDhQbtuq4/zapxnzoCgOg8 +t0fFIrswOX3aiYxyN0nXHTHnV3GolXMJ7il+iqo8tyOtS9pY/leeK4lhfy3z +s9XgKisXIlrApD81NGyed9uTbOLrGAkLA0J7X4vn2hSsY9Nld/1/2Y+DnOKl +VL+aotdMkh7bgeNZI8zyO7lL16Vb/3KyLA2tUFBWbIOyp6ftBDY+qOsrjN+4 +8iOsKJVpgMjxnwaZWG7qSUoRAVtEUj6EWcf3XlR+481rVd2UC73NrSgN1ibZ +mk5iyMVuDc5d1v9SxoqxSgaOOr7RlnZZrn6aNt1km8uexsefYWtZa1u2hC7K +GmERUvH2GpXF/k6faFxLawtMPFC7Y0Td523xVyNZnIwStIlapidKs8DIrEsa +YKdzaGql8W6pKKoiQOR4lpkT81BYtEoTif9Xbgpq0AtiFBBlW4YO1etekhS/ +7Fo1Kw5SUqc+xMVl5N+f6yu81O+Vt9e/7s/TBYUEk0/Tuqs0oyZIi+GyhKa0 +hl5ZHs++7eSF3Xj09qVO3sSt7QP7n6V79n/6nWS82uvSMMakzSIahTLJcqDY +rioCXTTzrG+jFciZLmiHuopTpTHJ2ze6Xt+0iUhKsMrPIevdvZL6z4KjR0cq +Kyedava0/CYdTHpvCctXykMqDBr4m2saTApQuvMyGzGAQkGd2E0oPYm0bXsl +yI1VyErm7rs792liT1VaCgOk6Wp01mTZbOe3b7Pw+8xS9CWQr8uZydOsvTG1 +nTP6jnt+yjKk49DTyOEBAoevc0r2gep3NT/TcdTz4rTexQZQq6LZt2Gv1TW4 +JgGSXlNGziEbMftefNHFblrkpWW3KIrdJcpw3L874sU3iMpe4sgSixbNk300 +K7r17oO25RJe4/zTsp/D9pYmC/rBFKtd93YdXh9s9T+nabJP0TUSf5Fded3J +f8pXRm0s7D8FX5Qx6DloZiMkyascjDcZeMBTn4Lj0+PpU58jKrUpbfJW2tzq +1ud78vAy0SqrnV3kbdXjz7t9H4St13ZaNvVEueOgosvG/RNn9zHMiglgtvN5 +7kaqgIVa36YN9NNFfkrNb/eCSl/KOGaepGP11uLjnZtPw21/ybVhuU1c976d +d2nKWqC6ytGypSmNlOXebVZG+un9CROBBBAa5N3vZtoKDQX2freTilvL8EmU +5/CZsdQ/45kNaaGsOgqMr6rOzgHFfReUDI719FNSSj+RQPulKXbPFJRSmseF +rGEZNNUwU2jtO9L+nAVm0syw1AYRKO9jX5Nj52BflpfJokacpgvBX4IIDDwQ +QFeVJ5HcdRxFVWd1UWgUGvbUKewMveHj7T9OPynEYI2L/l9Z5zIS4XC+ajM4 +nqZ9L5P83/0cJan9amUyJGu7e3McmeMLtm2Q9/U15HaxajPD7UjTZ2c11/7c +tBqXYR0JqKvHQQQWuFj+tMzBfBsEeZ5l3BZlMFnrCdqfw6O3yoeVVFjeBdOp +LHaqeX89ayVO83tRBN4jTnIWVI1Qj1LnT+fDG0GxudjD1JYnmfmqiXDWUOUL +IqWaVZdWrRrnpCh/kVWeblGko2SnMgtPnalOq5sm/RB9XvYpNmAW1vOM1bUL +iqkU5MYaJNUyX9iN79nokn75HQ8iQWn+XSQuApCL6lGV+U7lJ7hY7SHa6qpq +68bHUBNG+wipXlWdXWXvTpwUQ9ylqslFhQKTr+wtMkL/HLTniKs3NnT3UOda +GDRdpZIhG7k1oXlCpQ22k1fcc57kXsUj5koSREV/jRi+3u1pZDvkdl0HsB63 +iYRiG9UN+Y0SESa2tPzv05kwVBiXj597q30Za3VClPhkE22+bV5CmhJNOnO+ +6/qfMpO5u0RN02XSeLOWtvU9cRUXhpvzErQ54mYaLpa3L6NV1ZbZsmsTvosf +Q34ZR6YavjIXBLcWheOaDCIfXOvOazZ9+qvlVfqQ3ozWWJUv36dXIp8q6SOL +w34Q6kMjeXnUBlMLl3rQhH35YJUbm2m73WtWZYLjK28adsSFq+7Xud9XFbSV +INLGGilTBPKtfckVZrUEpb+UU9iEa1tPWtc02lAwduf8z76qS26JWjT21WFY +UNdkWu6atKtDhru5/mzXgqvCb+uZrk1/ILxIPrykmzt+Wn6Flf3aWj/lq3Be +FOIhDvFaFq83TcuMqGwdGPwpy2cS1qGiWtwHAy14d5a668LjLij7bpM3C84H +XIf/MtVB1Uhbp5d8+8wjzDXBImZzDqfj3/BY2uTziq1lUNZpRavck/btPWpX +FpUNSH526hphh4GI8t0bVwmu7yYP1y3tfG6o2hO/IwpUU21SWj4whUXD+LOt +akCxJg66WItalmcr6pCkLmrN4ZrJldSG40KhVWeoruOHWrZyLhVHOVpYW8cV +/vBUecbZmkKfloIjRF4c7qvIrj2JkjZg1840DL26X1/Dromqc7Nhk6mC1xr4 +1D7ScMtY1AoXV1C4qN1k67bOvY6+y3SEo5ZdTK2Ee9NfoodkqbkKYxL2fmpr +IwcaR+vI4le8haB2TeMkrSbUJGUJZ6jKOtSduX2/H8YcveNYNPNMhm8TnqI2 +zVobTFIwiU+i9KrKtN9I3g8PnRtlHSqztP5juXSR8oYxz0OQ1aSv9UP0qG/C +AujBtcqjmtuma4YpsmZui6THQcxdKBxXeZiu57HpdEu3F1dCmcR88NqdnVk+ +SftdB30+mai1Nn1oeXafZR8NXpo32EVNmFj3GfXl1l83SULlt+y0bmLOobTS +iSUyHqWnCo1RQ1D/WzhysMXHK0Sdd3kShbpZUN6raWOE93Zabs7LPq1Jcm5z +1cpSlJjSTrC/qA/h3H9ShMqMzvif9zl4oKSeTj1mCD1pgsVYuH3vKpEg0qN8 +S6q2vzRLG8R06wh3P4+eaezTFIn/lDx1JNUaFrTi13q3Pfieq1zkWqvCfLpL +aWQZZGe1vDjFh5iozqjLqTh1T1FQQW637JR0bWWkStFsdOGF2cna67PLzm/V +vZ8JVOpxof71AJnuVTUdDI8IHQzDt+6h0FaQjjvh0K/LqsFR2zxQ335hFKkn +DHe+sqVQQQErfs4WWW9nymoKP0lflXYqrQRT8pfPFZkjDJdtF1YrCMph8hge +m4fY1bqtezbyUxklf3HxtuySlbdKpF0jl1ia+Oa1TyZq0J1WLu1tk6DrtXvF +Jl8dClSsWNycIwyRMxOmIya5o+labZVSXB1t6UJYlIWRDU8SNvMxj2yWSjO+ +ikRh6h72VsKt98+EyehH8tQq4snDvKYr2hqE+f4phzrKmL3cDKMK0HJYDRQY +jWO9lo9eGwIJx9UKzpU/dd3EWLaRZ6mzVNLGHzkkYF5b+9T2tqtTGJeoyBxk +KbN8kcUnss0zFdYl8mkfw4SNO+pqiIF91OUFaVCyDSZS7zp2V17Ldt+0zA5q +bo42+YTyGyhso1bntcntM4tat5SJOc8y/N2vT/y21XBJquK3yxp/G7q8/dTW +lmakQ1/uRfp2ljRhFneZ3BVOubRdURuCJFPs0yn7sIQ3rdt+9qE3RT3FXdwL +hX0nXpVIc4zUO+qyZahedhrJHoJJHWbU0pKXrq4G5waWtUialsPrGeW1Hcru +EdTtFP3LktY5w7/yqi/nLtEwKqPusSMKUs7nNooKouVRV0P7jUrS5z46jGfR +1noeo+e4+rWhInPTVZ1hplpTZdX3r7ltCjzqPhSOn61DWPeWN8HBS2mv0kEe +X1jddI6u4ywuChcBdnnXPa4dhI2vDVz18aunHsWTZw/uzVikwV12Vi6j96/M +pC12Koiwv4s7XPmg3CRl51T4zq7rfIw5TWXvtK47CvMTRUQkHaY/2Vd53zQ5 +F11fedp7wcTJGHRTAIu7T1N7rf2s2QzS5c1klSahnXdUdSfoyYwKOqXl0Xf+ +TtCWqXPP0J2VD9+ibx5pN46/iUIaBl7YtqOoCIpBt2epMJS927wq7OUFYWOY +B469e1sStf3wKlJLHSsKlCLlr70lY5I2QTFBBxH5oJwhIKDwjkPRNGp4y4J6 +uzYuzJaiik+TZMlmf1Uuyk7NT5TVfkKIuqPVb1skpi0Oxfbkt0clz+XObhPn +at+xqqjMc5zM9N3Xnh7jJgkHz5EQfmbK6wiYNoka2eqEKQxFUyyPvZIGAeeG +PYmEEgk++7C56SQsV3RP3G2Ys3x5TEU9dmwnzVXZE0l47m613GfotldKtQWm +XJG0ZRJvof3EuT1vFq2HLVFvOFgNu6CKZBBKE++GY7zNSlicxr4qq/prnXRC +dMxFFdQiSn9N02qOoNZU0aheXutmYyDoO21kkft2VUdSRTj6TimQW1qEg+Tg +RBE+0jnyKVOm6tst+8yX39VSJp3TJhLH1xHQd5mVW5k9xfmlNDntPT9ApnzJ +Kpzk7xinIiFyUNiZ1tnJehY+A7yMLdcGmQMhsMT20VYdSu8zS2Mv1WWqjgJI +qvGfFWlwfVtlFSKdVNI7Y9LzWqG4eXJojCn75maLiJx/HZe1invYtzIc8/J8 +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 +2Qu0PQ2r8pXJ6W8SVJ1X4nQmat7BZLqrToGJwLQ21HUfYf/UkXC6LS2ynrUw +Lm6a9ZNk1W/iZu1H2IZtcnpdFTWkTb+UOeiwyau8nyV1K1z0iCJ2q9DWvRtA +wDkpJXrTP2Ke+kmPdj7KU1ca3Lk6THrZJvbPVHT6zolCkrgISu3lVdWE9Um3 +Ph5kgblXl5fJWFaQv4JS23zQ9wVLoaUOA+jDYPOqe6bhMVP18bdM4zYXFY53 +FOck77xqNdGcfO7ex+KTxmC2+6SuU9hdVjfJHFQnW7QLX6HfpZ2FmfFxE98z +oWh4pwi7QzqmOpwYNo7ktVlK23f4jEoUVJWYXROElR9f07Y5qfQ1Ugi3KvCn +IY2HDVx289ma2ia7dmT72e495NfIX0z7P9RcmT4fnexZ3OfN98u+e9brN3dy +qbN2UQhsO21NtY+x8hHmzbX1OeoLBvl373l72qkmQVGhO7TFNbDjvSnigf46 +0uU5ONj9b8hP4fWjpZPm9Zv/mNdqFxjmt4yNAUtybExKuJsnED/mNUpy+x7l +y3uYdki6e0O8Oo8T3uSwzzqAxKI/tWciiHbTOc9tmY52bAm08qlCRX0KXYXz +2BikidtPEOrKT1aOQxD2AxaZL14b4tTNPxCUlX7S+jPvDlKpgfVJI5R2YahD +ntcB97epVxmPzQzj8ZiEP7C6Jsmyk/BS0Mb6VYlvP/Jzt0SetTLnqPY8i5+u +aterq7QQVZEIh6opfvxdWJTXQs2ib1bVqZF3HASZcmvfW1bruN+LqgkdXB+W +V4yeUhFmidBSK6oSzK8xqw/L+Ver6cS1205sSRtK/HV0vMWqoyv2rXAuRG2Y +x1CaZ/FJVZPmJ8TwKUtrrZtS0ywaXrPw0d+Wzq9xtCCWm0dhc2EdzzLfOGwu +6ipOzyMbnLvO5Oi6z8xquu8/NP8aJtQ/CzsY2ld8kuddXF4clfr0jt8bxLWj +QUScxM3jbe3iK0RRVQSCXLNJf2xS5KJzNP7XZaHCNC+Sjr7Zk37m+3jPT3DT +zGqM1Do/wwr1PsjuaeiWNnXHgepqnQWxmIXaHcW9XmXTTWqpkO/yu2iNvft1 +XH23E2DZY1/3AqVOfyuzgu67LBov4EEu9vUrTf67r37FzGf36wJy+iNuki0F +Pn2yHD3DVO6tVvn0gmEQgPzgfqi834C+KizWcXVbHPZ1u5H/bRN8xH2Y/sZx +b3DljMtUmycbFMm+Qta685C6vVQU2Q6wMgp/Jl7QxhV0Lc2BTlKE5eaLRpqn +dIZ8Lg0iqbxTlXZdMm5fVpv23qmrds4Y9sOsCBf8yLiYa8sJlWn7bN7FFPFJ +P2jzE1ByEhdZRHtUyquSvU4WvrRZP3NaR7Gev+waGq4tzlGWnUtVzdeyPcX6 +Zx9cGqZlnuijTeU63q3oH28kevXK/17v71TCp1QEOQhnEUZRnbTiegwj+kiJ +uuCZddHVPisvvd2b5d/7fdyXOrq1f6nUc6iDWmmdF9khTxFIbzk+Y71aesWd +Ft9fE5aFp5rSmiSmH8ZzXyUuFdzHIkzj4q2jTtsLyLOj6IpysqbvS00RsLXP +uxLyqs1E11bNspD1MR1hPM06NbSedNFGpb/8JfsFsXN01GetL8iuyDcq+JSq +e07dZW1N72qC8JkuCWJKojHZpx6AsEbQOM2tZSCjJ5l00V1Xtp96So9A7MaQ +quNoyae7+gs8sSdM/R0Dhfe4LBzZg5IzFI9LIrS3sWVdVWRXXYN0tdKWfGxx +f0kbxvO+mz+J+6rQP8Uqcs4/CDRTP953EOWp61Amq8INu7Yn8Rxctojb3nI/ +tp1ulGrYOUetNVPjpo2iq/6jXHUBTWkmPoUVlVAXP8kY+t6kZx73zvhxTQ5i ++bGGbGj31LXoXKX2BC1FQOIfRtrs+rhvI2Pnw9T77xskqqDd1IeYtqzaDEpL +vHuu+/zVL3xtImabKuxqPNZFxlOXtmko5X/JFpUg2L6EKpq+wefbdeZAglnU +3MOO7d7Zik15JVVcONIcqPZxDVWzYM/K3oclYmuTdXNRDOr+98l7QOc9Fzel +wtO81foTOV5ubA0c0nT5rmr18uffWJOfzRquMYlm9UaZOC7nFctQG2Ztq3na +dl1+T6bQr4k7buQuuVrTlvD4UE+r66X6Mi6q8pa0h3G29KtsjY0kW+NyRU82 +xk6bpUW2R4sKJxRMYq3T6KwtqKsfzNA62TZBXXtlz7qkr9pX+7Yy/cPGNXeO +/LPXqMzM6bfExyyra1kVWSyqo1hmqe1cna5sM6LR9Bk1/Vtu8PYFPTJhGRVS +jyGxsqrjjJJdKv2UVe591IUNnVN5DwMAiMMax7nmjM8sEJepNct4apz0UnqN +uK5kQdBO2VkdOyfuRyIM8mvcXVEVQVhOEi/WRZ3HyRq8I3zKqOuJkkjiy/Ji +16K7DixZ1lQbnwurckmWRfdfuOfmsj5HgiyMJm+u8f7woW4SJPm7lMUaKMdd +n5fetTOrr0FrXlz/SwMe2Crytk/+cpFKc6P4I1E2xi76tSGmawTFr+kynpdJ +yLIiazMUtERQzb3BgPU76QMP7NTs/s4LZyJwbMtUB22pnljy8mmVTqr1M63k +a6rwWJFMdwW9bK3yb2Uu9/xVC9Ouyvx1vXSTF/2165L8uyKT2+JNO3M8cKQK +bXJfIUtzyPsgW/5a6KEvqYPcxUFXqJi+GlCFZnE81qm1l1NcL2WXUskwt6Ql +10W/pJZPZ6F/W+h7Lv5jUs0DOJj+Hic+grJqF2p151ipMTXIpI2IWTgymFLG +TU1DumvDjOk6aeThYWAocJY7Cnamuor76/Np9s8DTqez7l3FpdLkJSlKrRSs +8djkMX5JO3CVKSvQcNcWV2+usKW6Rcq+ijUqUzPITFTJg6lK1WJzXijqCi0d +9vokShIWxSbzhce3PXYyPP9elahvVpTNOn1co/hIWHIfb+VWEcbz+Kg9XuTR +o3LR/4Yjgtdz7IlSBb1G9Gxz7I8tCRozdkpdnrpTY8yiESTe5Okj7n9fgO1Q ++g8FHTJuHMbCzVCq/8kdv7jaQuEQcQZdbes6CqSjS/23qPot0JLV0r3EURF/ +kpYleHC/quIvaOrNU5XnipBoad3K6XN8kFgeGj88cpC2+VBH7r2/3B5JbHCh +iWWdnU0T5hGCfCRVaw4tek2UJ+T1vPut+/XiqHMfOnLO9teoIICYuDgmaZF8 +lmp0xbHTKJ6qa5/azbpu44yWv+RdzNbS7zbUSoEpSrY1OG017Xv6iOtL8WcY +O6ICAd5x3ZTBTWbbd0rqrOW3qnqy4Lr8nCsQhlppURXBLOXacveIP5nym5xs +vpUjeqzoHN/tg3m/bIcE4/8rNBBAfnBBAavarjq1pZdkHnhmgVjtLAk8aepy +ZyhNiZKqL1McBSUJTZGfdGlXXrkaNSJW9PqxXaVtQPTN07cDbvI5l+d/3LE9 +64POhSoSObIkUbutT80D225W9u3tU+XNrHLSqLhaVtU2b1ZlefhM/ZinkK4z +79JuqKd6v12LgoquKf4xQVI2XggUI7rQoau96+352rKoFAWxkm1zsusuZr6R +5+qM5McUhCNtsq6bLqm7stsszULPL0BK3+Z96HhtjKufnMOvLaq25qFLC5vI +sjb5yVKZstq7Ko63l/B7neZBMqKtL6LKwKENyl8Nyz6RrnNwwO7TZMtncnJf +XmbfyMauj1y+aqe8a0qUkFaj1Ofh2tzkFnVWax69K7P6A+Lys6lNla9EWoWG +SOMqDwvAlPLX6QP0jlQf7+JE0rEMGjuEubVK/y8jXto+H9mL7kCeeJ+Kz0zf +qE7qlKu9HmcZf4ugICVXRo0U0UdZBtk9b2sqhKq809ouLoJygmb4K/dJ25lH +WWg1iZqk6RT8g9riNe+ylMHyugyjV873PK4lzbKDRa/JC2rAWTztesT5qs7r +i1Cwutbfqk7wLo+CdMU6ru5VPlouCQpEleG/twZuhS62rIqYmvtX50GU3qiq +gjq9af2P217IOUjit4xgHf3SEN571RZBYHIeVT/2t6IoesTLLY5TuRvgL8yx +5WpYBYYjz0Ydyb41/TQeli475lsfytP+Kpk0vXBlZhr2zfVekOzjsIpR2pY/ +6ZBLXO8rrLy6SsMiizTJZCselji0Jk5AsC3tde7k6ubqdxyLdOQiiENup7/E +C0aMo033iWDNaJpl7m+exuimCfO9j51vWvw7WuIo6uWpgau9TSOh/Mu0K73X +0XWzNh6Vw0iQo076wou9jOpTwbwhzXOhIkrv9fTKKuZVWlYJ/E29L5KT4OdQ +3pchfkiepqVSrXVR5u8JycBXaA6v10Hwe1KcXXFr9jp4OYHSltE8iQPMlXn5 +ykOeoTxdth3CYqnMWxKPKEV7zPHLrVZ7hUkpqL9nm+V1eck8hrbxtZqb84V3 +lK+0v3PhYE6v8NXZ1C6IF/CrIosun/amXtEmmXOgUFVmlYdZd2rdRU5jcVgG +kbFdIT7lK47xLaxrNoWpW8T5qshMbo9yMv85cYYQ31yW9CZk/gRdAp00y+2x +oHJWvOri5PXeqWuMwDTI8ky5xlGVvdBhds67hPoyf2mc4bFC1BXiHtg8bTRx +nngVGBd2ZxBJL6vKlTFeoUxzptpEOi2KBWJNdMadWZxOFdhKd0mtMu2OKwP+ +aiPPExSkMdkE3sitIBdFatWuZfXb1yuC/FEbxVEWLygVXWZ0WBRf/VVeOLtA +v6JLi5i1SrK211UtzzlI4nSyMSxD3rsqHwXluWliFWininDFMI4+bV1Yn0si +3yGVBFR9VEWwaxOFvrvRErT+FwWUp2yT2X/loKIoDDtdmH4R7leZMm3dZpW5 +LQwKvIcsuubKvcVbMzQt2bZ3sjvbYzaJOT0U2lTHuTKrD6Xq3mjijWzSE9Tc +Km5qLth3KhqI2iyAuqpMSsc7bhBazLrohlQbNrWlyjNJ6xmp9jZLB13FcqLS +Ngy7oRk1thsV+qpqqnPLf0o9a59WMPvp2ySity8b4VfRCashx1l7SwsA56tI ++5UKqKaUxX0JTNyNu2cd77M7tr4vjWPatMlmbFrXYvZhVMUFIr0/nKrInavu +7Fz/0zmxeAsztw1cwDcKC9n7djpKdf+Qy6Es0oK2JDMb3HIBPXcemfJu5KPq +rEGfgHJfu4vpNltf5Dc/Z13m63wHVQitsgrME6aq45M3uRFT1QZefeJxf9fR +MUVZD7dmw6JatUVc+vENc36QO+qTvWXRMq2rVUhDo1MVuclEt2pyjyNlpMwL +VRPBr/lMEz0/S7vLO1yxM1uETT+nXWjzmrLh1t1H2rmTPyR5kGz8Tqr0yLgJ +Usnq9jSxn0QeN6mEp7Oou9XO5kNwLZ4TQpEPAzXIXeDceBRJ9lFf5SCyMZHF +/yDJIN5n5aigTzVp8ickW2jsywCFoZw3tbN4vUtGy9Zmnd6C7MRHF9fp/f7d +aRqWodAbOpIJE3PRKC1myYKMezj9ZcUM4j7abhM8jTHt3h41zmfXC3cleWvk +rnvJnq6ui3u27tovK89ZnOOj9WUtqEgk7PpQuysIFJ2uTig81/3h8jZIhIFp +Se1ItiLvZ8TVnf5WWTBpLbn9EV+1+q3WHeYFTVCbDwtYlima1ZluUBkFxVlY +WteWXtA4MqX95W6iyEK9/zwvOya+P4ZLRTpXECl7orik8IetTs6z6Ntw5D2u +AwsjaqFpAtj5KDDmXVzWpyq6c576bqV/RFG6ZHI9lrHC+lomGSRRKVfdhfvq +wyrShLVfdpW1CcuQr867rIRFm+Ri7eiIor6lDeahKx4LSyvyT/nRVAT92UPo +EN2kHmFboLmvw/yEqYhTpvMqCVsyjyuoew6Xf8y9VxPNmHxRdgGaV5EEQbzW +1GSQFujVx0kx9zso4eptnKTFsoSYHweNXn8KZm2lYVDVGZZ8d1Q/dpk4aZea +hkeOyjiyfOnsQ1M06frfrStDmPa0q1eZm8688LWhk2R8jrzdfnpuSOrG4KwV +rIK1slakjZJgnScxHc8r+2ZWtIWDs3WYBmmtT29OyrDgMQljtq9PVX4clfax +ODsK4P7kDOR1Ptc7a8v9WDH8BfmpvCCOA5tle8QaB5Txt5CHCsEYRRDk5Y1T +0JzzjNX8Ldsc3Y2wWrdzKNdDaWK0tSpfRwbxozimVZJPpHulYiTFqili5p+4 +qLWLVdX6P9aBq0cRN2GOQpgZq7iCeudKLsfmqdAlCstui6+pfoFLdplXgpGD +5iMUpCfxEl+6SUSWyZ5Y4Rb1NbRt2U6KzURP0aY5Af2mzmXZ8qFGPv34W+um +T9Po6mWuVCXuNNiRq9Ssg/G0WFNX0WNHGwQxM8pYUPQaTtUrEnnrS/xn0va1 +nuRQm3jDYJYn+4U3iSmlKk8TW/F3apUaQiqdLOjGCThbnxTpj2QaaxuE2kBR +Idvqy9ny3zBNHE182z6ZZeVJqiRRS3I/O/k/CXLZx6NT21TFqYe+MxWR3zlJ +yp6IX2KVx5HwXCFRVymLd/lPUwftSLqspqdC2CcKcwauZL4YJ7eVnef3/s0C +qqBfn2ljBoRul0pDd/OHuAsLdVF4Yiire+NTlN+LfsIilVR9uHNaZqrrk3f6 +nA6rD1dq1RYK5X/g0e9u6kEO7UjSburQskE047Y/C9HIXhglsXha9xHnMzDF +NRHXJt17caSU2tSVyOn825Y2y4pp3u1zExlT61ZVNkk+hyau3V2WgnMiiHoh +WFSVBFFNdFcLQwqJthXEFra0hyotHi/MwL2WzAwbfIYjTJdKGUjJ6uYvCk62 +NnoUauDBVyKt6i69UrS8LBaNOp0qMOy128lQ4DNsqtrmU7uQhf98x9dZmEz2 +N1l53F9CUsArS3yfqUhGpRT2NaXV+bh4puITwFa4k+dpvHEZm92b/XMZHpKE +wCm+bCqM4akqSoSzuS8fEyMex3AtN1dbKrGiDPf5qVaYJX7O0C6OP/LuMGj/ +wxKvu+sKINq5EQjV6X/qLEkH6XZCmqdZJr7oGGcN6kfaGFWKRxfu55/jLwhU +c2jyfLtQfikUnS+N9avtm/KErer68oWqd6QxIpi1rts7hlLavxp7X15nCbNw +xzNr6tDVJm3zu5XoRdyvNK0WRy/JK0C425DkdzWzfRAvK/1gq5oUUxaPqv4J +PfGdRuLuNQsemlCa5NWXcBqW6yRp1hUN31jszOpqiscf36kyRd050kFLYr01 +Cf4hiVjxD9KiiCNqq3nJSVdIZH3auadOZt8Y2Szux+G4aNPWSR3jxdw7tmTB +K0+Ztw7Q03kuiOe80Lpuck7+lCZh02pR3ecNs1zbOHfVJGt4ziV9v2AZ6pOE +/rBWxLv9kLBKqlSiMm+xErI4DKdzdb16K3G6B1rQhOqhK+nCyVRaVgQadeUV +RlGU3Nrxgoi8PH96rsqi+9X1vs6RtgzLfKTqGPcN2UiSQljZpK7LZLkjympa +5ag6BoXKVN3FAcG+NYuCaNoqew7qrtBIsUwV7Vu+IplHwU1vIm9ccdZ30dcl +OrF2UlQmhsUikJhMfwbhKG7b5Nc2y8sw99gYy7Lzpdklj8J8/8wNf33hSp30 +Qf4qTzOJIps+KBaFNOQ5TzO67zoKI0ql9GzWPLe50HjKxCnKpkRR7WNg9saq +roJ1n3eY74V2RPr0GPUViGNwTN3Bsqswj0d+O9mXr8nq+OShSotFylZRK756 +aS+1Me/iYqGtFWWKjvbzPXJWrZVhE1b5FO00DdTVmUStbyTt9i+Xh4fMwyq+ +ymJuimefQxi1rFTOJVkkRRi/viHngkler3e1/N3V9pkSRL/ZDTsZSGPapF86 +36HYFS74xFygpWRzrpLzHlQxzXsatS62dn2ea1i5wra6LNEPesOFdBPNUpq6 +MI506R1GH2f+i54lRXfdtu2Otiz+7GyqkrpvO+0qD+C1MHVubxE1aBdZJqLb +T0CmzPLW5WmmV1ozm05KXORRAvw77VR3d0x+FxU1m01d2SNYwKSd9ksQ3V9b +1mUr6SRLIkDcJv5Zi02ZX9W1ied3HUNy4DB/zPkwUaPqKsu91K2P/JkkcN+X +1QqUaVGX0tfFqyObJRaUk0GhSt1+8L0kdgYD0qK9KNR/rr6nvib1+GYYGH27 +YatNmaXdZ0nb2qLROVlSto8HfezusT8jkNG4uOaHmPcRXqrD2KmiaQSB78O9 +6UqKiaTrEkSe4LHN3dHVhmASFs2ATKZOMk65tSgvXbHy+HjS+npDxtixTDt2 +oLOXRKpDbF0bDd9dEJDilYZ9QOKnc9br+7p3WS8HeinjlPdddmVIZFN1JbxB +Ja8yWNQoknwX1ijEGbVdvkFAmPtPk4SlL+8zTI+lfXcpoMgwKJem+J9JFpT/ +zN7ARmpQ+fIQ2EVTJNXTSirfwrkYZClyVfWpWn4uy7mR0bqZVoY9JUgayhT2 +6Rba/bxb3g3mcnOVRUHfm9bvHs9rx3xyb6nj5vStr18tmPYwz/mDdtNkRWht +F/k+9e11XHVvW/d2K9uqMg0FVEy30G9H5YtU2KfhlI2YJdjGK0ecR/evxe7N +X1fKx+GiG4cJH6A2K/uc/RfmG0iORbDu86ifMIvf7alRYOwMEw6dNowvpeSh +edK2X1bVJ68mDbxFnsrT5fJulfbt3X2TtS/dgImizPMe863OWq7hva4/efVI +3+q7q3ZuS9MEqCc5Rh0Db3lSLPNC2zfrJpkPSjQpItPo8M5UihXaguSoKmud +TjDPKgnkxMX2Ku4CMb6ft2xFh7NOqjZYpFUpUXpamq4KmWRBylUOyxf8LFym +cUN37A9COfV46v/U6WR1+qlUj1fQiLvyKhu0wCoJWvyNxxx1jV9b459NPnU8 +5D6OmzjXT58lTfNiZC9iIKOub6xl2vjV1g9zlfw6NlZGjqa3nKbnqZJitfkm +dlNem01RdCV5nNAd5K9rQ3kdJVIg06RsIp8QkW8cV8rc2TSxa9UWMcFcnkvL +XZ9EU66HDc1TWUbHYtoUpxUamaxLstPXRB/KcuB/FpdyDeFk6Pbt4iS8rbjU +ElHrhmj51sZvcQVb9Ke7sy+jTpSpBePcqb27Syo+rvPe5TmBeV5YB7F1UJm1 +dWtP1z/fEytnl8Yt81FZf+shqk48bkaW+PNKGwmSM0nPXNLvE0bPOOquXi89 +pEJSTUXijL5zIx+4dPUw/K/TVjvHlLQtDZNHSWexnkxz4YtGL8zaQP94jrNW +wVpefmKHNX3NYxNo0NptLu1lVZH5Evg+ZR2321wa/2Z/TKI63XwNfavLJpdl +XrrlKdwXPkkg4u+vyBBlFVU2/0O3InPrRtUkf8mXCYuy+JZt3vMGuvycRAv3 +yGK92M/T3I5BL99M8gb6omrX5lG//pPmbShFlWXmKMc2vKwz/a60DK5pKEcm +trYdyprIUfYp446HfW5KaYpk31soyOUWmrJJ+C3xCM66+MJzbjvWfRKcthpv +1+3VZxFXF0rL6WYKNxvqobtJSiLuuS1c3TgUhWSyECgU+N4lyXOnS2FqCQ1G +OQtEaEwPGft8UHGqLHToXJSFrViVSxM3kh8HQIG9vvUFMzitOk16huO/j5pT +nonWHtdtxcbgmUsTlM5IENh73P4mG2tKLVJmHkv3QURQEtUpd05YlGkk5baq +3r1voW0vTYyHUcr9IfgkgwqT/JOKlI3ZoW/hD9dLPodwdysCE2xunklVlcbS +dhR3Ue1KV/eY3ylr5pmOqrgMA+z2aamMy8iuM94GORmOoFFKLwU4VqwQL8fO +/pbo2UZrn0Jx3PedcIbR0KrqGPC4avxygNrDiHVVvcGnrEp+uCQwN9lVws3H +xiJtahKGImmKysu9fsyzkqKyd+fpP3AcRnIm7O1a+DQErjzJ8NTm3eYh5/pn +84KCh962O0req0zH1FeHV7ryb1I1zc5KkQgOvbIgoknmz7rQ0cf+OVSdL3tw +j5fbqLFan9OE27UIcj+CfZfsXZZ9goJx3JhDy+hOUTaBMdGnjSO80rOuqlzr +WSppA/8uHyYdC3nvyGol4uQgk1lmAXuWL+kTwUdKnZySZeVK5d7lqRV7Lixz ++2CTzytFrlqjU4dNUVAYBrKpOW/cFuF20kyd1R2QQLTp8+3ZKnIrB9l2Rmhv +TstghfVO3bgiH63tPElWbStp8T8Vwcl2kU2jvpbU0Py52ZmmtGeRUkOhTM3x +de7K5K9Lqp47zRtlaHP7/ERdE+4lKZry/XJax2LN2rcvzCZ1HoU/c64lfcjr +4ykf6lDvMQqMSbjSPW7SCGRai/e4LAd63Zvuqs/qnpBKkW9SkW/+tk8VNrHC +tqgKCtqXZ9J7s2mZRJGUierVrPD1s5a2rsmj3po7zb2awMRZ/q6i2rpG5hZG +o+x3LQ2jNWLPrN4fG0/VdhPWESSSWLpucuTS/a3/wo0jFHR+D48uuDiME6i+ +JfR1hVa1TbruqxrPt0n0tdWcLC+312BkYOBL2pm2hX9v3AZtLn9pzVELd8kl +Wc5eCGfz36bG37WtX+FoHB7DhTRPmNmijYviOveEfQgrLgse6jnb5e3YhTW0 +BsZ4qauNFWv/Iombo9V4W1rzU/zStT/LduW700SdhHdXZ1V3WBGFRWFtXkiv +CaZoXM/X5rDHoS/Kr6RobYqE8QiEJSzz2K45ilbhoWOXVy0/Zt1bUvyM1zDs +Ow/HZO5pvitklqubf2tpR1UcV8JS/Elig9iI7E7TxNVg7DtKtkHTRps1BmKI +Kj2WQ/NkQqH6nCJgxscTd/VapqkMXiJuzDtf4vlNSyO7C6rAmSwuO/540asy +H0HsMtMrdJri8k6SN6XJwvUkGl5vM4ytvMsGeYxVWQhj69JScM2DJr0ti5eV +vGHv2LaD+ESZFqeRT01TlBT6q05UqGyORXr6Iw9Lvvq/hsOl5HxVFlGtUqjR +fGIY9rS2xwN5HcU3KjvfPGGxNkQ6qR5HOq1vdz+oQOZ5F0g3yYNN5WoCHMZC +LZUE31CX8lf2XhsykaSSeov2/aWs0mKMVSo8uFIwsvcfBKdzrZ43yeIj6Ea4 ++a37OXtwN56oWXUnALv2sg/BnJSlDTsEmy3uJZFobRpXT4qi2N75elb792Tt +pI5FiITNlwrbjLXvLi5KynD+kfalCybI1tECo+YTB3t2qyYtKotH/vkpg5DI +d5NHRQKzLakyJJm9VDfhAbHrO9YWiQhFHNTls3NYaKP+qTZeJjdcyKZUbo29 +9lUmiznFIFHaShvPmU3UqWw1AeBi0wic+4bR0VF5i4KGRny9Z/jHMcrDPdZW +I426qqi5jeaR1tGpjWIovL9o3Qt6mjJ9NMUj8HrSfUX9DYIIDCu5W6KSRdX6 +9p2+neF6iJ8hN2v9s958KLoitol4WK+5tXLfZNFGYnSLe/KFqWyv1TCHQqQN +R55dw7OyKSEI1c6TBg8sjqaMw7axOslitl4wVv7LZca02RjuywjtO+v833ai +OkrzDRxJlNSpz4NoGj3jT2CqqI8F3Re70fjtvGXyizbtI072ROOWZpUFLG4e +nDvbxmMShGOEmdDuehTSf2xzvUyWTtjIs0uMVX5VdtkLszjen8PYrSSXiJ8s +wd9aU2WL2/Kpld6L3OMzeZSOLTpzVjjWv1TZu6+d7yKr8hEdZtn16ZTOzDO+ +h+rAzFYubW0GmQqT058Glfiuqik0aa56mbXved1unCX7NLo1zarneO4qXx9q +aP9dHzLrUrY9fIf6+rPKU1iIyqMRidpL6FmQZHwua2cTuNd0ab9ayt3KHhzD +M/Z360ndOWhV/r+R8znsZMUfX6xsHIuGsai5NDPrYjhtHfUU3Go8CoPjbbHW +piGQfZgpul8xWxhFKVl/MRpiqpf2agkW94rqqy6bRNq+NRdWX5ZmGilGx7vw +LU6CVUeHU/FVdguxskpxGx1C4OgqD1PI6dgWt4HNVpaE/Qn685nZjvVCZ9sV +EV1V4IIJHCJehHPfxce1l0a3cluNwe54JV9m6jLo8jLfqsEv+espHRKkt7Oc +Cw/ai3rpN9QmcXm5QdKvO+7b6VJkaXPiyC+ZVDru6a/JkjMMtOyZOnrW2SgI +hJFyWpCtjBOslz+3Ac9iXU+a70BS8GoNIc1OPapiLyBmUG9SqFq9T6vReMau +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 +teyaSzqUz9wKnJ+riUZx38JtLtYxlof2y1Jali3ypTOpMxa9Xxc3R2n1bZ5U +KTDaXxAwu341dEyTTJT9umDaO9Mm0WJoNh7rCcmVWJsKy5dgcOvfNW4rq6y5 +eUWb1sHs0qbyoIarmricic9gkZ77LpSkqOQxLXvb9T1OYi3qAyS7qr19w1GC +hCasXtlBYHaRVS3gexgMdqXquTGK9zHN8yuxWd8BYETV1acMuSpT9i9ytrQJ +radrV+s16jqZ/KdJO9crUZPZ0yvtw9JnswTaiUT60Ovy1JHzfk4L2zSrtyx3 ++u3JY2Sz9K/nb+kK26SLSOKfrH+lYEQVVgt051xeqIPExW/pfNUq0MirKS3C +UrRufxX7VIGDRJVlSblX8k9WD0D0LQjGwfSnUNsFHbjtEQoT7Y50GdUdglPf +k/2RKMx9jYys1ml/Cs11wl4TZqnhsL+k79SL52MMmiTDLfYbCkK32pGGXT9F +EQ9KRrE2LbxlJJ1bl5XJ/TNo5xvNP1rmF2ZiqQ5vWukzjKJZ1Df88OfhPDTh +mbmWJ8UYqHk3tH/fpW54ElkLCJq4uhY+mNzjYFgHxZKsL6pnnQmRwRoX+zW6 +K7gestLTxpRa9C1Y7Tv5DkfFw7+xWTySc1qgq+y1jb9b2jhby2l+G+fVZmbT +R1J52HEl7JKyzuYwSCmDisi1qGorxX6XtrdaqDkVZUExTNuoQlxZdB7Yi8KG +sk1tw8UdojwMGtzX1JD+rzU4Ks+/F7Mj1r+sU1D31jb9BT8tO1N8+AoKLdFw +0tb9dGJm6N7Wlw1mm9sTkK44LEM/JEgd5hllRFGHpdyHzudypP0njjB6pVKs +hzL9JkE0Ri5MbE3Kj0+tkSSxKFroTSwfj/eH270Os3EC0ajctnlGXo6Nsa1b +GI5K8xlm7AkT5y55EzalJ6c8DHytDWAST+r2sKIL63W0rDjWdCH2Wta8H8lP +0qmObXkpWZepd4OvsZnUqYrGSY1BwGY9iBobGZtGXM4D0pi40NqTVqq1GZcx +X9N4LK6ikU63TJFGlYXybXUOK5i2cZQ0MepLnma5Vea2y2LGt6Lq/p4yuDde +3IJqzcG2ivuRm2ZdlpWTflW06Yj0exp4hUV291kQNfUXkPw1yONAskpY5MY8 +o/tQk/1dUeTRDlckmuZvgfrQN42HYclVXvRhzklTCIQ/Wu88CL27Hp4ti6s/ +EHjVy7qo/6Zc19FK+C2XVvH+eGOsqQsjgY1HSJ8zELfHdR7nk3iWpPQFSjUc +xrF2FWblKsGmvo9v4v+60nQ6Nqi8v4Y/nP9bWEli/ui/6CCAm7TU9hqlrM5R +flfWsV73XTa6RU/ApU2umTpTNZZmLa1XGeY3AL9j9S/pjFavEA7Xm6PHeBf0 +MrkIuOhSzwVpQ31XJ6mfWhIE2Z1OXU5yEuawOLyyYqlR90iTuJt9F0WNmWAT +h22fdK+JIzVSuPZYdQNunfPkqJciYser1TR9ME8rH/tI9rYro3ax2TdLgtTF +ORG2rYZVWjJalcrY7dudUNVwH+M+kqvNMmckU9k7CqTsom58osaLrvhbbFVd +aeeMlkKrbGXm9FcFkcvT+0nzs77vNvIGPuT/GYUxPEwQvr7VCU/VpQGNcNUd +i1GVbB+Cj8NuFLPPPowyBMWKX7+E4aBU/ExFYU9y6KnFZa1s2zXBdWPssYSR +jXqT77tuxrL6q6NnGJHt/Q72qaxDlifB99w1WvV7N5CEvl4ahU5/q9w5U2mj +vt/EEFsL+96XbjB1O+stE0S0LoonfEWXjbs1p2VY7FrDqppM2cf2m0tfNQWK +nOvRWItHxkOrzC5CtY1hagjKJaLioX+fKoTl7zwz1d9zKVx4Lh491lMRFfUp +hiXOEmWicuGoq/rT2dJlcThOFnp5Cw2clWVcR4cBuee77mfV1XbV5ZdVT19o +jlUdnG3j7vpg/CbeyQfVa57jksQep8/zqrjeBe4DEZq8Z3SJom8b/ygkUcPr +5JNNk6cbmD+rDs0zhMrelVmFxG9hMpaVr+4yTsv+7Lqoeo7upb9X3Sl3Eu2z +/FmvK4Itzv+qSvVekqMjjYXZOk+d5RVuXC1LpwG9qCPsdPGRREsTx5DF0dH2 ++QtCmbhTfCyN33uZBD+NERP8S11mzzS7Lc2PTSKHQ/nsdDmn4LL2hTeYuqVS +ptF2fZxGXlXSeFONSiFG0vtcOTflwmd2rSLcjz6L4uqavfzcnn01hGbYS73n +XXFc1PfHyOK/Bw1pk7MqinupwbmSZcECkrOOQ+X+ZND0BEM2ojN0leHcUBg2 +oXFcZA3Dp7R5VN9hnEV3T+1K+b4qze3YbRQvW+m+cdZMhh7b+JDM6tFMwneJ +RhwvvrHaU543xYmsfnvMazSy9XSMKv170ap9dVEGyis+J6OU9PFR9b0HvnjW +/DwuMo/Cf/SZQIV7HBSHx/DCJy7iny3sqKhr+5+7yxJG8endhBKuoC2Om9zC +qJWsx7nlX4k0HmnPfaZfVFl6SesrpGE9XxXUaTGOfDLdRYYa+Mmy6eteiqKP +ojWV4TjUBR9HKf/MimSE+zo+uqoWsYRvI57ZcnFvQ9YdtO2zdp4WxmidVlaU +3ie0iHKjVWmWCmq2LshK1o8pmQkNUV97v1/X/PE7UR4d8n28bZiZariVUKjQ +zD/Rq808Xe1qhtJ0OPdmhSJ0n5avhKs/FBeelofiliStd2btKVlge7xPXYkb +bzGpkhVqxTMuPqW8fdCqyqH3zG4obTLZJH1/fD8uKdCgfxq1vYVcXc1KwxbE +42OJG5kGobJLajynt41j+Z1Fqj3M3OpusMqV9DZo5meXiTdK9IfF/7/iP8pv +G3/FvdWiQVea9WXfYbvo/uXKt7K+ZuspFXNfVBOFgoY8qtIJWrO/LSPa5Euc +2jUtPcJ2MqvOqQrp2T8+7kLzdI2n6Uf7t99GGKYuOOcp6dsP3G3jvq5is8lG +FlmV3ZVclUsj2YuRNx0GnQ9ui1s2g1oc9gLWiGHrzqMKuqHpuh8ncR/bxM05 +LI+1qH66O+YpZHkQhbHHXpO/OqLOti0yOofFbg28Wc3+lqc1M8pU2MZdM9pt +YNtpEe3qVHzvBQnPfFI7kjvw0TssAoLKq63E3WtROwv6rJI0T8btYEqr6fo0 +/2EKJBoNi3zjHB1ib8txmbVRPZjM9C5KZPufM09PXpLchSrW3TJMQxLCvHib +wptK4KYomGVr8I+xS7qmqXvTTQseu2TkCJTh4uI0zENWoj92O4DOsQ604pqO +bBK7Ioz0/dXWRXj+0faJkPlVOAjiuXtEF7dWbJd52AWZo8il6toUtUbZ5mW4 +tm3WrHbWXpqki/us0UqSGa3NTVpezq7zfJtRe92e7q9m8dkdF6EgkMIV/fOZ +3v9zaaTZFXhT1Y+Rf0TjkPbvMZRBsJrVPQlc+olkpoq1YKmuuwSrrv/LG4Zb +fM1nFdFtmUab5FMRvBS9unF2ThRmXqrwxnDZ99SyfK2C7u7BpUIoEL6YQgui +XT7CqArae0lt2wk7qbdk2KWX7Ia7qxwXkl637tl0gWOJY+bPoRiv1BufYxXb +mX/JLB48l3EeLJBYdFOnsiej3kycDRLGpkyv2SVOKZpb10flnPy/NGdra3Gr +ylKvHtHGt0aOskVRhOysak2Vk5Iy8iY9W37WLstJgUcVKTz2rokil1kTl2pp +epNnjWxyMysSMuOdF3EaZ9BOZKplLXhmP+Pf9pdsb2s67N9+n+aQ0uKbeF09 +wclGIQ8qhSeV05gon1GhQOLch/VsePttm9qjWV0HfbiOq9QepiLY6OpaJGP7 +ggiE+cX6lexHgTvZqu3alpw8apIZl1XyqwrZXtWszQ8NSN4i6g36+WxbmvVF +HlkYJ0dW0usYm58ZR13T5P4Vtw/dulWYl6n3vKmV1YJVU1f9F4B8asTzYrRl +MWo6yMvz2ccekez8qbosHSKLJbI3botP48amdXUi3P1726Vrgro/lkl5/DlX +BoGASOe+aOeR3ktf678av+tcVluNaUJSrZsVGrTKajPdNnljZl1c28lYsl2a +u/aO4J0pSvvuQuHrUqtf9Cdta4TDIL+FVxSmojpl3U5tZZl3TQVWeKM5KQJQ +/n6J3oGc7qJxb0KknzD76TSt5K6or8MQg+FnUhXhvF3k35StI1VXmQMhNkgo +T8Now72qo57V11KUTf6o7YaFW8y4Cr6D3Eyl0gwHGsdC9awrvycfVGJZPgpE +5+TpWef8k/1axt2p1bxtc+MN8m4arOvq0j9os5DAJ3pI4lL70Z6/g1VHdzU8 +1L86wzCq9AfBA57uTZ1nN3jVVZZXqi28V3ztoLnWV0dX5+yM6Ls160JzIc26 +1Pt1qROivU8fVzWmQuVrw5zvoX0WV8Cxq9GLhdVbkWhe1fNmmzao7vPRCWOu +sKzFVYbTqupfUTRpWw20PUJK6lo2NZVtnZflzUHD4ihLO36Nch3PmZhFMU9l +9VZ+alL5OlQS7GUlZWlrS7u/vGrVl98m9T8IqnTMIfYUVrSaOaxr7sEph/yE +Werz+kJD7V5WeHOLwlCqalctTH6Ynpye5Os5kwbJ7rk1elyOjnskwDmv2xLS +JSmd5rFQZP0IUuN6VZU55PIqrCDRPOev70ZEWsV+At7jzpVMI5fY6XU3tZcH +TIyoaDmrRwaA2KKvOyqur0s39pOlDm+DHPU+Flk6uI4iSuJMjrCZy8OHgMhA +p7vWbx3ivFjVZnEdYf9Ma2LuIbIGuSx00GpmNdGZIq4OcndtZFXdbWXjxnHo +LnT9l8f6v2pi/piwU1eiw5tWV0Q/M7FPNlidh8FSjKwPtHFBziMw9tegr8cY +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 +zcun9jPoteulx3RYtTlM8dr8MqRKQJR6Xx5NWWCl6mL7zZouyqvo6syl65vr +M0YU9B9dztuysfchQV+fSETVclmu0zdV1spoasmaoOZTFbalZOp3+tptsqC3 +uw4LQ0H3zFJXyex2ESYdJWcZTuPPyXVS1sOZgWhbxx/k0GQSztt2tO5f8jVj +1GukDLu5DFH2drv67XBs3NlsU3EecniUJFJ88XrV+pxis0qt72ZMDTfGosgX +xa/hWLr6y0t6lSWu2+nxlCpo8216dVlHzSbqXhKetbWtTR8m9U9cUUgkQ0ac +Ocyrg6Bgs0lyQvGoVuh6up1EpA8HCXJn/yk2dSBkLO+byaCVdZDoSrTfJ7bZ +7slQ/D8IJJcHLEzl2Oprp4al7dG1NfSsuZXVT07Xf2oKwKXBBAZxkKDOkNQH +g/300xyWvjEopt7clWtp8yOSSxZtwWFlzwp6yrKwQQdJo9Y7K6Kb5ng0a4J4 +xqpXHBJDeUhbeoJXAUJSUbIOBwFmfj1swj6G4qms+jVtanqu96EelKYrfVry +t0aWqa6JIjvNika0NpSYORZhzm8XRP0QqDII0jiDYNakef+bxy3az2qhrJJ5 +AQElmaYSw0F/T9PD96uyWsQ+i10DhLj6HKLqRndvfY5W4nOa5IUgzPhldK52 +xYBssn/DDRN94s9jfLWhMD/tX9S7tDi7GiyM3NCFydZ8qsMjKmKZHxIaxT// +mKCskyms1T7qgoDtG/////////////////////////////////////////// +///wsT+72fXN2c+HyAkokqElLfK+BOeASoUgRKqUUEkiQBSlG9F8PuQswLXR +kuYaaQBAxbJ2BrcGgdAZIoIoAApo2LdAAAOjoAAB0AOgAAAKOSoh99F9wXmA +fZQGABIBQAAFPse+7fAAB3KR3nifdwBxOB99B9wBHl726eoL3tM0XvrfA5s+ ++q67z4DT3328AABIvM+APfPtxdzwHtt8GhUrq++tceufYAAe9z7vvgoAW63A +APvPcKAzMAHsYAG7nDoGEAtdcdC7m7yqVJUox977vqvT3m98FAEEEqiD5GEA +bdmFBkAAArQABDz73AD7nrvglIKChI+rLMgFAAURJVW2BoC+758S9fZ3FHFr +uMaK6Ko5znRK21sTYGgubpu3W4ecHgEqEUg493UX3T5PtaD3e5oNlaCNg1vA +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 +TTRRQNFFJTkVYQIVCh2GmkKKaYgiIiiiiiiIooooCJoiKKKIGKKKKKKKKKKK +KKKKKKMiKbNNNNNNNNNNNNNNNNJTTTTTTTTTTTT7uKI84000000000000000 +0GeLIohmFuVgLNOBA2aaaSmmmhoKCmngIBgwBBQpQpQpQyJMrCMZW4FzRTTQ +UFOFW1YCzTSU0000FBTTg4qmXKBzNNFFFNBgB2aKKKKKKaCgwWrIiJtgs00D +RRTTTTQU000000U0000000UA0BQ0NBQULQUFCtC0BQUDQU00000004QNmiii +imgiKKIiIiIgiIgiKSiiIiIiIIgiCIqlUqlVKpVKpVKpVKqVSqVSqVYVRVKp +VKpVKpVKpVKpbBFoApBpWhpMoI2wWaaKSiiiiimgpppooppppKaKKaKKaCmm +mmmmmimZZlmWZe6KeeeffFHi6PO7nn9Lf03ojZjcZdCE70RxddDFvZp7XSbe +jA0qVE/Yqa8uyTkNaMhGMmcM0Vac6UyzMBbMZL9uHPJ6gdOvN2Nx3oHhcgdA +8NMzEym+QMmcSryE6MEdZnG0NFo4QrKZwLRkgO84pA8VJMkgGFwwhEUUMkTO +RViUTsh58d5eFlCMOqoxlasQYirbFDhKJKgYgwOBJZtYIINw1KHGOGaVSNiq +JZJWCAIIPai7URVRFVRFTAsSBIXtVtTDVFU0RAzURNNNUCUU1VAUFdHygtCy +asoyMLFi9oGTEsTm6FZzWVpUcxkvM26dGMyMTIsVJVhXyoBAaqIqoiqiCqqp +qqqoqKoiQYQgiKqlmqKgggJaiLyi2KkqiAqiiYJiYIqhgqqplmZ6bi3jGOXI +6DBlQs2i3XU5epZbYNUeUVCDnDiPOcw0F7VQ5HP6jUc2Wyyso661zcm7TNMz +Ik7fGil40miyWMquQ/jhhK9/JM01Jpuub4zqxwVaVYq6l/9tpOhgvPYn1HSX +j8beXmTY1/lflPcXCey4nHyVIwIqKID3qArC28cpbwn3xf5mfzNaUkNVmIuz +MYLk555w7vGON0aB33DcKcfM9jN8L8+87pBdLaJvEOj8T9N3s1GCzWgbSc0t +4eG7dNPf8cd7jC6eflO9MzrAvPhAOo/CNnCzhsu5zY2wOJsLqfsvstMk/Kpg +vENIihCZISToyqU8DnqnS4fg32dz4TGcdNOmtI/QNNSVmACQg2tclSUmWraS +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 +34vp1iWfD/nO8Noy5BK6HKV93mGLJGwNExuIkYvna7z1KeaLiVTvfzq2MCCL +NznL+A/4ds6j4rtfB991vweweMduf5fm5aEkdR++mBy0JKSMIACQQF1EhBDa +MQOeOMlB2xDAZ02ZuSsa0YMziKRIEAIJUBKTEg4CoEyHmTovOFJ0bp2jvaTi +scPDZYnmlT3fecO1j4bZtWHNFMJH1IiLRm1uAjnjlVeTqmzZuRW2Jadq1yBo +hhxd/85748VcAQkZlsVk5X2klZyr6TUhPsJ4TFmz0hfV2HfzYftga36YMdWV +CMn+HdHXsTDmkvg0i47DT2+GVzPBGDGErzU2cXDuTd7qieNoLyRanu1UseLm +A6VcM+Vwg/Vpg6nKbM7W9HqRY1nREF/brEsRoMcKB5vsuMxktaLA8ItgpeYo +zJHEL7EEThIN/x6tM7vJPHAMpvC/Q5Cb1q45e12AIVnN18u2POuLrdiBOy4U +A9VV2Lps47mEEY8Xi47YV/KS9uYrmSkTczfniyZOaElNAiVDJYPFbQ698g7A +db4X8RDVzhUzpDQJqkCpHowg6Yqu8TvkpBCpKBcQwOk15FGTenRm9NcI/zI6 +Uxk+V5w4anTaH0mobxbMHPbUyRUbnguu8I6aVn4yq9vNFzUfWWZ7CPHfEYgo +i9RX39XzUeU55y9jjD6UVCtqBsmSnNZ7+UJJyr8JX0LNiNGdsYysxZW8qlaD +InnNtispylCzoxaJsfRoOuYURRYx/SGwgDEMvkRjteDZndFkPirl8deNZCHR +3RWCkSSaaTkuDRusu0C2tC0kYOkVCGEZ2O6cs3YqJG/E/mMhOlscS7NKZ1He +pSE5Gq/IlsseU/XddqLJEzrhaPXfuBfjtUAuisJo3HVO3yTTcQ5qC0rdXNvw +otmH+7J1stDGEU39FmYr46fZFyn6Z+0ioJ6eZ4yuHRp233xiVNkODHdhYuSX +VGLoGnYzRJJT2h64H3dXPHxPz4RZWDkTHYHIgscWMyMhfTaVEgaXV5UhvIS3 +4jOKcTb52C00PdaCjm9TutIWWnXGThRhR/O/DQdo/RriodGo/DUUA1kmbDnw +xeHeI3i7vuNcuVa6dKQIeqIUdc2+OpkSWoDNtmi+PXN04i4IEQTkAgR+F7dq +f0xHdI477l2KMsyBFZzD49cTYojy6w7iaEkDv/qLXXqw4G2JDX7YcPuq6IrW +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 +N+/ZGGUFQ+xg+J058dt1RkGLhlAzOXOoM5Alc0f3xSM7H3PeGFzHhjw4Y6UT +IXLVt4nrDwHBci+UvQrpwSK+ESXDMkReTKDVfhSYS9MG8nW7MnijOY7pnwuL +rY77n1MP99mkvJ2ypP5JZuCq8AUHw+p8BQZjVdoftiNrpjD8CxlvJwoZrpyH +pjrl0eL7E4Opf2M4JuhalXcrNqQZ3vK9GVFEnjfFa736dE7bOKaecUBcBaI8 +bLdTIouhyHq3MiP5ha4mVO4uIA5zlimayK+fiFiOg4iOtfGNpAQ56vcfE+76 +ecyfU652yMc3Yoj4Fed0xVd54RZJrK5yDXGrSEcev9bN8uhKjyRPN5TMNp/h +qaxeXKCNod2Xa/6vwn0HuHvRtzZF2tFFiSpLQXAWCdqCZgDhfzWkv0YutPvX +qE2mFPIoJpFfL4WJmbi8vwp/wqecdg1xfBIK4HY7xH8unjSh35zFEwC9+0Zn +Ic0nMzMVn9rrfzzUqf2fDwdd8DzDcf2jM8YYbzJ0XPtlsdT3FDgYf1DKJdwY +McHKZweZL985QdyKJwYPcTOJO/6XgVqIx7McUffIKZQy5vKPKLO0dx6MyJ+1 +NwPq1whz2ZSmt6VPjS52GUOdZntOysZHbewV4kmf7nuXaFVxBK2a2j2+9Pct +mLMgVw+wXDzASEtHkR1uVorXcwcd2ROsBsO6WYmsJIVE8PuNFQok+e8cWJus +HhiVkowR4B5Kc1EgXepO4lmuiNuRWdqz7azzHmlzUp1luNl9msnuuVJOkRtO +QvUcof38IVsoTQ14njEZ0pzLkIXjVMXXT1lmvBwlEJ/uscWc1TT1BcOA4lMU +Y1KjzEP8xjfTJXp5/PcGiWTUT+CVSREMRdLogI0U4IRUFFS3I2CMZiYKs+xe +lfvCnO+nk8KmyN0PEVBko7OUZdD4jh2/Z8LCh/G+jGkoo4YiAMZfBOraqNPa +fQyWCgfbJy/kNCwe4vw2jqoHHIcnbYoZUsU/2nbDjmh/0tSnBFPp447J9R93 +35OL/F0yZe0e6rOqRSIec1RhlgYowwJ06sUmggxSyN6Ix1uwR/8KJPHcSI6c +/uTHojNC0MNaYr7843U6ewzJ5KDpKZkzunOO0OJnTXxpnOHNnN3rKcIu2Y7s +TOkwWwtL4aZ8NzGluNdpeVo4sXGnZYh64ZwkpDajqINv1dUfJpxRFuR3vjrY +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 +hhymXf0b4/krjtCwQU948b3UI53K3Fr48Lp0hjumQaxVRzqG2hKOtOkmJW9x +BssqUBC644UiVJS77Yn2NCKlYN3bFV+NswoY7IDb1kwdUsRk8d5UzhzDhGZ5 +mvoO7pauSw+K29zk9TiiPjN7rD7qx/2tPF23o6JZFPdTvNJ/4WTc2b0cJ45Y +yZkUZ8laa1N5MJv+iUdAINsezC0Zx0qe8nrMVBc03xuDPkWeYfb8SSRFcH+c +GGRnfQNYn0PTaqcdZw3vVFeTHrGvUIzYpWNMdErU83ZbAQJ0twXNOIazdjkQ +54BuVd0md6nQFe1i2Xs7+o4pnhuH/6YizZ6LyR2PV+S6foH83qfAtaLRYXho +xR//mKCskymskuoduQGVlr////////////////////////////////////// +///////wd53vPcR6SVBPfV854ASAKAJ7175zEnY113XNc1CloA6O26VoFABl +rRRoOmgAKBQdsxDTdt1qoqgatq8YZA7PWlwBWYa1l2DQCceeAAHzVvPWA2s+ +3ffV3eUF96E8HlevvFV769fbbH3fX30B23x7mGkl10V99iPnuZt8Qbte+z3s +ppoa+uez06A+9noB92d9lPkAe29AOmlU5aA3boc+AAfQzD318umDfFkNIcuX +aDLKXTslGbAAFtbBhr5ZUYjokhVS7BpACgABbWAUjKaXvh95sNIh3ddXuuDl +sa7ZLWt7uc9upQKXBjxvbGT5YaSVTA8+4609AFUkoHVs7d1QptTOWOhoSbLG +kT2yjobY21A7u4AfRoTZqnbGdn3tIV0yoAUPQyuwDXntF6b2GtMo87tcjNnL +CbTd9Z0Ep7D6NAdCZitHvnvce5Ua6dAk1rXLSigs7usVNtthkKYtd1hxKdso +Da2hya6NFKzvTHV7YyVZgGq229ugCj6AeiVJEgdNtlAAAEgCQABIC72einWh +p4E11IcgBoZsqqoTffXvIB7juyrT13pvm32PilAAAAAAAAUoEgAAAAAAFAAA +AAAAAAAAAAAoACKogAAAAAAAmAABMjJgAAAEwmAAABNMmExMCYmTAmACYAAC +YAACngAAEwAAoJKSIATEZDIaDQNAaNDQDQMmgaDQaaaNAZBoCZqYGkaYaGmh +pNMAEwAAJtU8AAKn4A0jBMAaGmgTATTFQSQIIIJBAGlT9ExNqZTyYp6Ym0NF +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 +eLS6tnntrm8JlWjynwnmeLv0tN7k3WNqMGo9e4uavLPQ1OC7TOrJ6L5xxWke +aPSjagepKjD5QpHrXn7DncXrtrfO5xMGK6+qk8zl6leRl2Dy1JuOGNLn3Vhy +MZXK75pZOr122yy7dLbs9RlxGrV13jzzZ+Nd12Gxk3NBwOwpHmqkvmykec1S +lMNikds8ianObO62Om93veg2Ti2rvpuVlNW4xel6lsNOieetJqjZbtd92ZGm +mh6rjk53WZcj669g7zDJvPGPtLk2Targ5zeew00tNW7duXrC9LxvoLffHN3y +E9BhAD9WRq2ERcykZFUXJIGyNGGOXmVaSypTKuBjvUo0eV6ByeDywPZQMRdv +iM5ujMc3u7ynhG68ByTfG21LJbXkvVZeF57y3v72rwut1dppsdGngxGUmQiA +GEShG6NUdCLclQrplCS5yXO0JLGEnRlIpmZmkZMakDFwJSqQzYg4oXMKRyeR +cxi9ieI2dBxPSPJbu/lJhcl4LwV5jTnN8LtcrJ0m153Sppt1au6YnQZTJjDG +XlaY7CtXaux1dCiEQqUAcUyBzcTp1kpcFYFC1QUg2Dm12HTBybGMMbGMNNGM +005mMOw0sNHoqnS6/G8ip8J2HYY7HNMml1dybO1jGnRi2s53LuaeQ8bdeRUQ +Wv1UFzqIvVM7mw0supz4FSsLUQbq5Kg0mpoc7ksXYm9Meexpvb2DqZVixvW6 +5TsmJu8huL5hub1e9aacq1bWzm7U4fODpJ543l51yq633bhOQ5OlniNuZu8s +2sri881NN3rrxtai6l1xXlaZOHKaacuKMedyG7DBsaDeZWkxhv5F3HHI4jVl +JtabHnd0u+db0zpNidtW1zt5mHA41mZmTnNnI6dI7qdlwt0y5vaaYx7/5COB +y5Ti6MsLxVSe2qozIsxJZiGTEQRghWCBRGhpVgkBUzAmWUqqxlJjBLEMokMy +8g0O6nvrreweRds1ZSbWw+Ee42vBwZTBqehhlqua9C3LkrF5bJptMmo2mT0s +nLsOa5TkedcraYbnrOba7FxaOayYyxtekw6xteo8jvNzo6uUda5TpN56Ltmp +68xMOtKPiNp2ezPeXbvJ2Luh3VZOzeNTwamzxcJw8C5jS5PMU5GjGGNpq3Xl +8a1NMaHNcTh4KuJs2nZdo8ribsePNprHa6GMNPLPW02N2NTktnldGy4NR++e +A2WK2vLG011eLyHRGW1ycW69cbWrzt5k2rl4tk4Hndjiywt3Vd7xOrGOJypy +nVstWMeysdkym2GduqujodHJYOU53o5xyt9RtMnjOWjqbTUd01eWcHC7bLmP +8H6r973TwnKeSetNT9K7FyHKXiqR67HI3d7dvVPeRi+RudpOpehl666rbLsl +3Oiyx7oZVwxXr3auLwMvOdpp4TXTlNuyPYxjKuSe+PUdXMeBcU3W9pbljcwx +l3Hiew98WMrGJQ7e2rJOV0nVzG0dgaWkxinixh5FlysnjNmjDdlHOxXTJyex +qXkna3e0yy5T3ztHOvBQJ3mmXN3J5CyuU0p553HOyPHnea53Fl6XNXrryHmu +U9FYug8c01XEvEeLwXNWdEw5LsmUnvE6Fe6nC8FSOJysdbrOU5G0NTctW9oM +ZOtymppmWzkO20W9wMY0X5TQ02ap8Hac8Vzk4PWhlym3Rt4981bkyMjnPWrV +WTo7bhvPeOJqw2OrBtHK5zY7KdZxDCGRZHaIYIRQUQhxy7IksdgQTuSpcOTE +xbLy3Vu+Pu/vW7vHlS3YtVdsdW1VyXodlXfOk6T3S9hvPYdq7ZlyxjBi3TVb +2rT3blNmwu2xY92mTzjw4rmjY5GFySs64AwxQ4LUydCKWUUlkGSugwjWA3XP +mBALBzST9mfMHMKAOwSWp2Kl8JywyHQ4tRgOkdBwIXIwuh2hYThInPJwcTU/ +KD0X6jnO+uU6TzTR4PeV3Rg1V3TvuC2MjrRvjRli6XgdlbMWLuZa92bWnWt4 +5NjUyNpsdqeLFu6uQ6rtvauDdleil3y8ej2J7yd3fTcdt6FanfVqxuYtsHkc +vEbV7uYq5jrHi9u9rtXLB69o1Bq0c3oLBg9fwzk9GtNa0160dIywx6GjuaaO +bxcXlcr1JcYWAcY3FgZQEG6gFxOgktIWGOyJJDmSRAxnoxyPLMk5ydGfL448 +57w7m/iGdp1ObwqcG3ynb0wd3rUmqvGed3RHNJyTQohJbgVRBYdFkbqATo0H +EZqxzvkDvrc2rhitXOZMHV28hLI5cUHI1QSZApGUQhwvzVLK0LQDIpcpzujt +MYuZ0snj0nJdbQ7I7mF1jsRQrKMIcYTIYYhaIdUjqaq5bWjNlKSe7rod+67B +3mWVd859sm3DUczuYMoVzCJLDg7l0XUBAF0pWxqqVI3R2OqmbHh3naOzkOTG +WW8tOGzji0xljc1dGO84pN6NrGWHbznZVyLm7h1TwObq4ds7jpclk4dg8HfH +fHDubJ7ESAQUanXErUgW3IklEK6oXWRIGguKdd71mzc3dxs4nkWNq1PROF52 +LtOjTvcx0SGRUuKJgk0HKFKWRu0EQOCopOXV5G02PRHKsbTutzwY7TFu4DZa +x7k585N7dkaU5bbV0tq3mlowxubzi7sRpu51Y4O1xY2rVZNnoWj0rvHJehzG +8MVi8Y7LIy5UmPdDuqHmSpu3q5tXdPJbJ3MPXd0xjnTqedl53g07bq7Z4nVt +ScR1m02jtrGXZryTa6Lp2vJzVzCXuqJWUCxUMSU5AOyJMSVucnnZdndT1XR0 +PTY63S73hcPPbF5ZuyWLgeUMHIVhzFNzOktklCJGOI6XEGGW4UoW6raMMxyZ +qWnnne5ub1MecpHN1ToOMtzcIFC3GLihFciEOGwEopEp0arJp4Oxe0c3gti9 +E5dXyTsnlOic5wtz8vMxOCc1YKZL3X4/pxHdzotzu+yp+tcnrIeBtmHWZ58l +zdld97stNM6zaxf6fxr6mLzc5pdjHgcLa7e7OKUKbDO8d0A4Mhwv5pXsxAfj +cOJ6JvG58X2mYj31KfOH3p2KovjesBFaIe495p9Hx2Y6mussnC3TDcT6aD9u +i43ZXouadEwubBMCeiF+38D9oUQ74weHRj0o4Io9AKQtY2XeqUWG6w4+ENGy +srp17lfULwrpLUbHl1stlIOLULqwcA7Y8IkwXC5g3A9OcSwrlDgcxzwjcko6 +RxNCFKYdbLAqXTRuUemFoB9cHrxvke3Hj3PuYGiI42aPMvKOqxfKlI8RzoH3 +5SNikaKRlA9Bcx4SS5D0UtPX/YZjf7PjbaJceX5094tGLYi12tPOrFrWm17X +tcrLWvWLsS2Ge9sDNce+XmrZzmrNl75vjN8Zzl6u2ZrFVms2i9YibxijGLZi +pzl2yNaptd2tUl2mHtm1XtEjVNVbF5rGLRa5NVQ9TjNXznLVNXa9ROcYeHHb +GHvFRi+ItdrTmrVYovUXu0te2b3e01arNgfGXm1TmsxF6Z4jN7SXxZ3vjLZZ +8Va7nsFC8LFFjIFLLKgsWKSmWIMsqossEllgI9UpHgh4JKYlS8UGOKaJghIJ +FmYlGACRiXKpmBZYIe29cc6XIdi61SciqmykXSiV+CAX9L7v6n6Orvd8+PdI +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 +1CDRMKUDKkzYvdN3NVjDGHVppGXLlyuXDhhHNjGqYwaVzdG0Lk5zq7PK5KS+ +/WXwTGM9u3CuPDL/ScK5XPm6a+M3L8js8KTlIvnUyfKu2z5oirU94SfYMRS1 +KDix3QRz1Vz8UGVEWlFLUFrliz31gazHgMdhcee47jxHTqne+9Jwd05fbdbC +oC0IQQJOBJZ7Z/Ta4SZ5/M4zO43b6BH/beziC/l+3Gym8ijjILuXXZpF8qvj +I7L0VXI99/vcsZiJypTv0dG5bKzr/zsebh4ltxXet1zt4DBxQpJCQJgnwUux +NK2r59pFxUOp9suLTVjGX2zrZfbWw6Md7uX8i7Trdn01t3X4Oro6sMm2rLhl +pt2kqk6cwJ0yMKF7NMmPxzISEgaliCjUcuMOTorrsD8INkf3VhbJmTMBAvx0 +tBSKYtqdZmnFfEZeV0nneS04YydXg2q2xk24OC3FPM1LkKB1xXAWofvhGUlu +KlsYUCpMJOmQMy2LrQ0WE6oMbJg5clvtksmWqHhcMrQDgtk6gAYGTCbhwqbU +aMM9QRF1xUKSxS4uMQ6qLQarLgLjNNCyQOJWCmTqGcYu1yLw3BYN9Waobcya +mFK2VMp4JxhMXr1LjduufmXPTheqL1aGXw+rzKxhOHJ+Bfg/8Xtvq+9PGofL +LRIzAMsAwyn1vnY23fe8Jx2OAj1bd7gYqFjKbj/k6p+RPkNNDSaaTQNIRp2y +AxETMHnnpT8M9PQoQkEQhE/jcYiZYPwuXESh/nyhiGAiA8SQPvb9H6dDsdER +ExPw2X3R4OEMdzwfT++p7lwe5iJhBiiIEliJiImIYMTBgxX6u/DZNRdDs3/o +6y3+CLhXchAYzr4704vc7WTy1HsNogYF9z/+5dlbdY98hOL/jjmYdRCcil7+ +PtmPw9NpMQgdlawTE7jCqFcTSBDZMjwsYaNAbn99fMq5/L1fMv3d0pOJ8x39 +VXfVJl7wzMZlh8zatQ7l31wWMq/kez5be8D88fAmLy7r5tY3nlau/DefVPif +534u319zui+K73ZO2xVKd2PZWRyb+u6szflymn7NyczofFuLF+JNOh2sT11h +piaXZZW4F1R49Y4Kn6RYO1GLhIYVAnMq/7NUvBFqrFgwaDDDEI5C6FRC0VPT +M7jO4M7g2ruM4O82OBzcGO47jicHe6vB4tE4SOWNTcU6UNJAZBjIqIGJkGZQ +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 +q2oJbVK49zN6Kvo++Rj9y3CJEwYDAYDBigEkhCHtkgQA4cIiR+V4OONB7BmA +2mMYwYmDEwYmJiYylVG/+njGTwt097hc9x79GpOV2UBda9NT3feC3RtA8Fx+ +cLAu1Yn25hQMjjN5nj2hSrPE2TZb/czHoIALdr7zaUv4jMnGvQHGT8Ae09eB +675D2nx/03vXgez++/cOAjMGkMQGZhmIhVggYZkIIiRhiIQIIIqkYGIEiVwY +j2X5jpU6Po/jJdxu2Mp2pgI2To6VV5GV7773/k5u6pcVvrbxqL0pKcgN37cd +sfp6ZyXAeaFCYFODnOwun4HVswuv4eiLNVoCNTqk8eKrhh6XXZ2eV57cgOsY +3Z+FutTyJ/EWBf7VvG2LGMGDAYDGDGDoNI/pzC6bKefSrdbVU4hIbZykU9d/ +wanfzDaW18npOHqvgkepImvzoDWvikqLk4V5/W01fERlDb03QVbz87OA5Uzn +YX3mP/PvfHm24LyAKcQQvk/4POSEi+iHHWUECX138r1fc+6oAAAn/evrv04Q +xPLBWz7rC1KeojybZ74FXTgLloklfZOLYeVAgTxdJybBDdsabuX49Z+s+U9R +6D+g9O/onyfD/svZ+YesfEBAYmJiYmiILh+XaCLyxNQXBNLg2Etne3VKE9b/ +SZyYBah4WwkO29ajktDbqKjBEwM5jwK2HVri0Uv7b4ZB2ktr4toQGDvNAy6T +ae7ufgHCwDg9WkXrEGYmb6/2H2ChOnarpBAUBuS+cOEd9aAOtAiFun9txPMx +hPr21+GqYVdC1+SeZHLV/mLcDPww68XuDfn1J/gS5LLfjzq3uN3VvRtRHMpi +C7OFuoxTew7EzBAct57PmdPyxjlX8KlBpWfCwXxvT+L+D+P+qqvZYsLAxn3r +5fw/TbnEp/nTTLExMTPyzcI44xmQgc8YZhmWWXykf1vi/kfgd3rebo7bB7sk +p8nS/tUxH9o5aljSTWrCN+ipsGq1rf52OEwcaib2A8QVKZf3OugeYdNt3Crk +kq6z3dFcX69rwjQpU0f2jXKqQ5z37sdFwYOcvkZsR3xM/S+ReCTYLP+lZl5e +sePAzAc2S+sOaCFj9+801kN+5lB863RD30KN3v9SECwLybBDAGLYHaAfWk0S ++k3erdHafKC312W3UyXbcgp+uwOT7zbIn0bdReKZmrTN8LrJaQgU7N0Plwww +/0gjRt+BCrl15OlY9DAO1tptr1SCRwUJHUVYSUMT1LgsVo6wlCF2N5y/eA00 +c2YPBiNcRORxMGfYfejLQfM9EEsfDgNPokv06edluKBiuVbtXEAGhDiPONwT +cLxvtzsNJMd/mUywgXrS50DrxKVeLC7iEJGpSEhFsUkDgB/zduJuJjCecGe6 +e/+mrYqrxXUjJCXUX2PqJn7XhRLUow8QasWHlk4KibEAhAprftn7x7bf2AVn +xE5DGdfnEGI8F2alVUJSp//34Hy4eb/e/s+dfN1lZPy6sL9/g+HDL7l8x+Ns +t0OKaVTlY6UcSY+dicqZe8F0uPbcBYo/l5qg7TB39+s/Is9sx2DhqFZ+ditx +MRpH0OifpleLihG9lPDKzdFtUS3A1Nj9E5GVeo4WHg3hqyO4ikqMSxfwoHzu +nHsDmlrqrTgPRWq32elxs//eKpkbp8Jt3efz5PSYmFpQFCnbKJss/UzY+Spc +twte8s/2ZlIL/8h8H8TCLNLWdlml4sKQshL5ROARmP3vijxXDyZpbb04G7W6 +/i1gUUUht/V9h8rrLaIItLKUfgWBuefH0D1uvhuAD0H5XLER99rnkrVpn9Hn +1KlLMoIgiYmJ+LQ2/r+r+z+9B2ZpH1ftfpPrPO9D6f/L8V8v/d9r9V9UP/sP +sC0RZNj9HCecO9XKHXs524TR9kkHxvOOcW6SeMiPmG3yv+8cn+WUV536nS+a +6Z/H9d29T+tr74xenS2Kuczp/DsYRxA+3K0U9pwfKTNjkEnwDvc+0W1IANVb +BpfFgTjFR/Y6psmJiwOLwujoL9wcdHbO/fXG/rCv+rzfFfbryaY6zPlcsQ+d +Tg3m5iuw5/lsi9Ei/Pr37bDFs+SGD0b9gTlmwwIi/V00WvQ13jxCtoFGE95K +aZo8VUig3FPOPYojD/AZlp4S+26/4pBajXW4euKPhnFY4GKaD0tehQBD4oKz +k33Q0inmzo46hZ94NHTt9TZe57DQfdqidx/6y/B/7ztrIt33tlXhS2sO4Z3V +tDTfRebCiix8APgkRHMTExMzATJCAmQx4hCRe0hIQ+YP9c3YbgCQgvmS/Cl0 +Ho7fgFGmqt395ooDoALO8MOza6lslY3JUifqk9VIcVAIkxYTerLnQv4N5m2a +TMznSKwqI5kirYvQbVvEZ10vNe0spmMlHWnOcNdyy9PueO0yWSeMy4mRlHWt +7Jwt4sBn9M2us/17lZIDvmGam7t6xfi0jyPwaHAOPGJ8sc5ghggggYGEwy7m +QD40qUDAwQdTq+mpUG3Lyfqfn39J2X+3sBLYZTrwUBUTT8Z4ST90pWDogT4Q +OA5wJcNbbFYdH7+3rXqUFT1mElBvZuQCbO/AoyAIWT5cJkW6s7EhIEjR0ima +Xf73QaZ699M6F5u4HvDEpaavcTL30A6v1sAr/JAfCfQGEsYJCCiWoDVAdK1D +ZDECimJYwTkMBJMKxGGQcBDMMkkIuAYYkDKy4YTITM6mNGDFjLH1fwf1nHyu +QFOByVq+5+rNAffgpZ4BsIheFdtf5thMeTm3jmPOjzVjse+wsFgttxXN70WN ++fatdwtPydr1oOsHsXFmdLdpVfssVEHVqbAixY/w/MbwvZQvkWpSTM0uJpif +ewfFWQEtfKs/VXY4wMc2A47spdVAyTsvLTKFMx1Zt1uGMFmLWgKvgrV/cJ7i +K9L32NS+/3yu9QUB8glh2xvDOgbhlNi2M+PqjnqCI4DCKu91Clx24ECAD83L +AEf1xNvN8TiZaI41b62PtQohLQA+yRqNppxXJFY/pqHiN4PRjEm49Zr5nt8E +rsCAX9d21d7NB76wSBaec/VV1ty9h4VugcpE9W0NY/ruNl1wDfL6HP32S0P7 +kRH53pV0HMwQxc3WNm3Uht0Uf6kb5/oeH74CF1W1l0fCU8LRO5wzjLsvWe5M +y9qzl0WqXLTNN0F9v1AixKkBMaYbEfvvSBaIqeXbA+VRW9S0TOxKx1uSx29E +j7dFGtTf2zLEV6j8Y9nyKVeYLLYvPzcs28qrtjzRy7FZ0aZPOo93Fxpc1deF +TBCFmi3J30TKnNa215QWOAENNGpR1U9bZ5Lf9hlAAAUhchdbAuLlW8gAB7/s +3q0X688AVzxu/YAFaUxwF7L+eyAWbvdzWS8HfHbZeQil+saaszbsD/47ulji +rBQBinmERTbzogECAPoEF1oB4AuwP0ilar9pFAwJKsf0XS2+XntjpXIRBxjk +BnmnJ5VSRyN/p/llJ0g29iQGnga5NYbOLkwRRcUH2IoymTzN6/VvUmh8SMk7 +PCvlXeNiLvavPOeJpPm7WUjXjCJ3Xk6mHh8ICQCf2AhC7rAkJrqd69wXfzXX +yh5u4muGK1WdTKSWgyPtH9onJ2jM01sDpVOfioTaMvPEEjtdbH9c2f1rfCoz +Gy0+qzi4gzEITUCSB0kj7TLJROgd0SsZPOYlCsQagzjQ93wmv8xL8M/Vk6FT +L1aSUzvAueZs8X+kVeNrNwHlEJGXYKDJ0aBNmMYxjGMYgGMVPNkoFqqEoEpp +KKEKblFB1qrmNVbdEcIwZMEEErBBEEEEEHOutjgPQwQc3LlzHRudHXI5JIhy +5BtJjgQEEJBMUKQQQDA9BAYIIJJgAGhAK4Aj4WHMhmF8rCRWxso8ePDYAhXF +ymdgkaXZu3ZORiMbcZca+kndeePzcUON8riTFLPF5prq3PAyEnDQ0aeSIJwY ++PoP23+2xvVokdPEJJNkHgZIj9lYPfSU7Sd1llUDfp+bSKQnpsH8hoTUNkxh +11gJqYy6kNUlQquPPdHrqgd8QrDrSLpTz9hAjYFAAIBJ9l3//320+7/hfE+N +67+ees+B5vxPP2Vd38j3HwG7D1vwakpoqqqpmZkKHFAQlRQwxJAyZUhz/D4A +L4gKgX4wK2Yu2czD09NU1M1VVVUyZEA6VFDDFEDJkw26tWNoJMFtbGMQSYVP +XIIMn6ewhD+QPpCaJVXMEUcNbGM09VMTDu8UUPIQUMMSUhkUiol2e220GDJ0 +fvvED267a1ttoMGTsLzc1rbbQYMmtrW22gwZNbWtttBgya2ttbWDBk8ggHln +1AGRBplR3wsB7llQ0wWGKwMVhDG7FGiwMSWCdVRikiQjIMwMTBAQSqMMIkwo +wESJ3d/ha222CTB7/+2+S8P/Hqvwf7v+v7sn4cyl//0vx1PMEK85mT2J95S/ +bU+qqwsYY/PTUyYrVPMR+BD2GzLoiqG6ROLAwYBR+aPEil8Q73t3eZYZZMzM +zkVci7l3lshU5pzVqSDCtLraobKTStJqu6tXW6mMZwrZZThKlonIbLQNhLk7 +GMtjJWRvWO1dr+XbxyrlOkpJzl0N36Rzq1fN+pT+95SNCisVKMqB2vGsGFhk +96XdJvJ51hP1vC0L4h6rSeq3sWWoWpkjoPOxMaDSwVYFiJhUsRPhvSrkNMGn +KnCLRLQ/kK2Q3vsHOo2IyxJ4sP+oWDalJlUlkSypJkGEYZSYCZVEyEsIrJWJ +8gyp/LWzUPugxJ3rNqjIMsFzU0qLUQsEmVJZKxPzn/hoHiyw8LxsmqbPgf7f +5Hr29mKfpfGnc/ILCm8DFMwGJQuC8b0W0aW0nsj5YA+iSUiZ4eeMCwPbm222 +4PDZXkzw4Y23SHSdc6222kkgeHDHCOc3KOEdADxmCaqoo4cIWWAIIenjhxCb +mxznOHNzhzmNzpDHSHHpyvDEQ8h4YOGJWXEQRxnY2IxwizmPTIv8DwDsMh41 +PSAEDQBM3TxdphMSNsbmqYDY7z7UjgxI3O3/REfwdRnnui9kexDW6+nWcXXP +fA0rswSNw3nM1lWzDwlWny+/lD5Ks/KzjI4a2kiwvyYeWilOrkXAgAgT8eGd +bO4QIItTTjm+UKX96x/BxPm+NJLdncJofP/Of+VypOqpZ8YR9wtbs+a1mqlu +N64FF6CQO6DZCH/RESGUsVSfbZiZkzKZQ3DaaMFb2RX6hfifr/9//Y10qvt0 +f5mJ8Z/m6H+aeC2y2hsYob1DYy1SmMUSQkZgA6h/Tfo8vIEO/9Ph5ClJH+jk +TWInzOS06LRa7vheUv0P8uESEE5yTU6jm5qwVPs/aXFchTxFDSEABR0hF0Qw +twpH643JA/2ppfHg+7x9LT2ZMt5gLVJe/V+8GJabUgOcU7VWoisEl0vobUjS +/wunNkmLDGMMRkLacqQGR8Ee2Ok+7pzg/bn6esZaR1+CXU/bsp5JeYpGXf4p +6FtCT+Hyv5PnlfRZWGEupiMrEsQ+RjGOsqlP3Htn7hteS/atpyObFl1ch5KO +GprXp0NYnknSamTHEbtOkyLVLckudP05ZGz5weRJtVEmJKZRB1jSnJixdAyS +euTZP7m1MMTsnW0Fu9CMGyeI8y2Uu2R6xXislIDrIL16wlajAlkskJtRWL+l +ELvregi5h3J68WivYWDYyU+NWU04Eq+v9c9VErkonsViLGKfglvVOkp2XqI7 +LkHiPmKsb/6sb1NDYoWLEqWCwEauhNCvbvKZY2luriXNfb/yvBHg6RViyWRg +rDKBHni/0Cqey8AeKyrtRXx1L23mq2MmU9mU87um1KPYi0u6TvGPAbzzJjFi +cxf8S9ZdGmzUvZT8nVl55WUwyYTJVKZYVhiCxlllQOiyq2qTAKR3STxXdMTG +QFBkYdNMjQqif3ReBfZ/HLuuQ1MmpXRUwWlSMWLENm0+kemo7HmTtGHYy8bF +eM+OGho4q0NRie6YtqVMXRYKvRYQe6ZgnsQuZDj3IkkgHfsOAyQc5snSbNTU +wmF4DwVtXNUWXScVziR4pODHyBHExk9yQgDhDGTiyNK1Yr/eXYahSyHKPKyL +t5lcz4+kwdt+7XheNnyPoOCMdh74sjwmDKPZqxjHoWtQfpftvvfh/7P1Xw/8 +n8E8ZKEl/fheP1Pb07y78uQzkVwqDlX+c3rvWLnVv6rWC++OfJ2JSQWRgsRT +xNBh773p89nl+T/D7+i1r/D5fkt77ql89EV8CIr8zPr/8n575389+P+g9x7B +PXevQPv8ppICQiViQmT8CPoa3DQY1WmWr7rlT6JNk2r4i1VxREUzAsECqRMw +I9DCxgjGSq5OVYy4PSRU+uooylRV6Fer8XFCKmDWBtZULXYOKIhE4RaVhFg4 +EGEDbGgFAxpFM0ouMZBbW33MMqIHDkgmClUgzOEOIwHr4U2k30D2Xt/xs+i6 +xTh9P9P1rZlup8hKPwYx4excncdyxPlvkvdAmCI7OMcJGcPDhLgeHDCwEDOY +MBggxis0xppuV56sVv6X01T+x3RfQHipEaMNWEgaqye/Hxw7/UdoZMYao8t3 +WWjLHSckQvwrK8JItv6PYQXcO5H1tSKtCtXbXoB5jD4WNHuNS2JlmJlevGWq +NxNzATjC8RDISJKQrDTCRRhjImDbBzEDBxkAoIU8tVGNNISIJgIdF+lEbCBK +l5HeQWv9X259mlbZi4b6stm5gv9k6k+yUjA2jw6TO3LcdycuOx8uB7Nfod+n +H+o3Pxe6rAVhggTFBiQ0mISERApErJIGz3HDhxPuk8Ojofe/f87f4vyPnHy1 +dY06Wr/XbmjTTqybn978sK/ib13oOt9ekJ332H1/3fb8r6PvvhfV/Y9vojzs +lnwMfU+NuZ7HIid681zrRo2002cr6Qyy3bNFtbt21acPmo4P7H/7+IIl9T8b +f5eyJf9X4T47/r8Kg/hYDuTJUqmSYkov6bELVMLykl70fmmTDIYMWCyRtRZU +7VjyzFkyYsDC2BwsbF7nrUe2QyisZJjGLGCiKAmKAlgKAhQiCWVGvqBP42iu +5ijGKsAz6yv6an1mlMpNTV2l/9uzZeSZPAaGpMUatWqXhbSRTUk8FIDx+vj5 +4sv2NKvsBxS5KLrOqe9Iu+NqRaz0T0r5oJnIREkZJykASd6+8jeDAgegvvx0 +BxUJPSIB08KqQhrDFlXdcTipNIwbh/pjBFuMI9TqjJ1Ko8KeDzJfHVVyZV3m +iVVaDySvtthapuaZMlX0+UckeUqgKAfGP7BIR9HUIjNNSgQ5MIiMSgbOAVHQ +ARmaapC1itWSVjESq7R5zktDRrwk+D+55C6QXsEUYVTEZTJTIsxSwwUGVFeq +Tmqq7bg0oTIwaWOkx6p2VjCjgUgYGEIZXOYMQJEmIjtZYsjEbVpXvGGBi2WM +OU7ebzHDy+gT3B4j7LqLzz2WGqtZHaDuOKMQYkIh7zgPBRQk4YmGSDqEMxKS +QkAq4CUvGi8YOAQoTLCzCkKBEoY02HVgbQtmaMWRjUaWSwansTkq9d4PJfeW +Vp1UW6fO+lL/5/w/GeE2k213xsVRPpZQNzMllsZeNUb/1YLChvjr7bVCKnMc +0b8nbCVGqc9CtHCAOQgYEOgBPUD6kAPk3iCGJlJGJVDnchKZxqMNGqyalTLK +j3IFFhpqJk0XKaTVFibzRjlsYthpSUOnBlICFSehwAZOMmRt5poyYxhMOU3j +UmytjQ0uGfFmTicnFkxYxsDMuUYpyq2pvOcSbyaMDY/q8zrcLhw5z2VQV1ZD +9N8r63hF33a7WjvnE+d5U5W60NWI3GVakxO14NRNl3Avg/w/2Dj4n5ny19H6 +/9bsBQfy/G808iw0Y0PVTuvJaMMtGUxoZTSxOdRBeUUmSiU5DJFNFNDRKBpD +JDMEJARKskoQEsy1mMSysYLGBiL+p8p1+S97/Q+D+t9FEr97hSPfeEKv33fA +KP2nt+16FV89UeVfnFz9a9SWMWGMWWWGGMYvQC2FfWTZ6ZE+jopkI1e9YiBu +GMBAGV9Mh4D1CjLIpExIJR8A+CZY8bpYxi+FYtF5bo9l6tScS5Fq8pdFjCxN +7k5Mg0HO8i6kxELW5ZLiXrxEti6HEq+ZtV1svnv2/Jdw5qNOryHad3GTYd9I +D0CekPCwTwuyOjlJk9BHpI7au0NlKNw3Uo4Gq8tUrm86jxE1F7uV8GV3bZnw +WGGTLWszyPqR9MMGxSO4PHKvj48HlpbywnlUo8qlHplE6N7CfKcr2g2n3mNG +0bCtIMRayfe4OEb65n5Ull2NP3u09cD4e4rgOZdXFAas5xAhprVlNLsOgIwU +B0D1h6og9a8Me0+lHzEPWB7UFekhiGcDgvwqvl5uamEuja4qXK6DkK7xWUZR +z4vhsVxaHS3t7lLlLEGIMhZCxjAwMqmVTMwmExVirlyrKL6Ni8EqYdBkd42p +U6Dc6J1G3/oHRuXR42Mc2ztNndV1uLkhzzgsD7+PCanVUMtDtpobJSOJsbSt +rrYUjuGxsdVz5jk4tThqlaYYZWje0tjZk1NMsmLkZE0zZXA2bWODlbKyYyMd +mp0tpN5NhqnPCciXWeN1bnO8FaU5m/Nu3mTeNZMoY3BSklKRkGVn1iwGIsbF +xKkSDqhgKHHjFtKdjdqGuw7FypOk8Www7MJ2Liw7jqcrnHa2ToxOVXiO51XT +cuINzFO6OJ15281XfyNluMt7I6umicWTk0WNVeSWOy2NFgzQ1GhTrhmA4abo +5TocjaaF5CdmiXROiw5zmvB4vizw4u9MsmW1dB0V0YrUatOscXcZbNLaadlw +38xjtu3jbxq6aMMnmvINxoXIDZErhtxFohbrStNutp2zoy1arqms604ZMduH +FzcVcMTnYyxFxZWaVOU6DwHRlFJmGUp0tEQEB2v3tjANwceW5LV3BxYpOs2t +DJsYng2V3tzVg4LpauM7pjmt2zdoy3Wy1NrexttptjHKnTny2SzTrXJdGnFx +N46GzY1auK4fQJsuUcm+LYY2swfOPoa6VHUhZJiquKmRObaiaFIZKVNg7C7L +CU2ZWv5v2H8D4nQf0ukTmsVLGAsYJjETvh2B5SP0Pup3IHTAjMPcwwRRRTE5 +Vpqtubjx9SzLhw62HndFLTJ1avZtsy0PWLQ1abLst03rnbo3tlythxJs5GNR +vYNmW4Yt7RpaGLey1bNMYsLa2LdHQ0cq0djsN12CDxnd404Ey0ETCBEMDEgE +58Zo8WMBx6Znp6V4C8CBAZ44cYsSK4xexZDKydDrcHCEyZMaljQODsVo3G9L +VFGDi5sMG9SB0mpJjEirEyqE1NWoJoBiSSpWIYjA7TKcT9KVZ5d+afAQCrYn +0EAEe9JR67ZerD0tPSTE9z7aW6nxzk1Jqj0oyNdZkPzeESU6218iyfAsyyL4 +dOV973Kn7z2a4OmqarHtAwaDvFavdvPOEe2OaulbJuywbvMxZLdibzemwyc5 +vPV2zUveyjm0OuN7gX39tOJ8kuS5WXm4mq4eDYOTL45k52HWx0WS5se7cppc +Swt2GMbWDaWGsmowYndTRsyTaWjdt2Xulxd86XO07lo++tLLZ1nhdzsOrvnI +cn25w2Ta5Rq7DFjLnY7LI45zU+EtlgWDc4mTYwZRgfYcwqOiyCUrFEJx1lFX +nEtXlHcJ4Xx9ZMZGWDVyctqt5k0MsO9bW1YshHpLZ4j2p9z6AeBilhVCrPYV +YrSvjWMYsIWE9urujhypgyErhdx/JtLUxj1V/ikKYLnVu+h4DzTgvUQ2uRXh +bW1WoeU8XKfef7/vfaqk/ISAHFT2Yrzynqrvi94pAYO4+eii/ORRe2SU3JKd +V6a/lFb1PQhuxVqqB9sOSJee8S8Hu3vx4LSxZ5rEbtLY+O32thjK3bOBxsth +YxjI2DNWGGCqdp0k9xO+yMqwMAtE/QOOf2dvGlqt2lvV3s2R1fiziWDEYMJh +MR6eKRvMp5Tsxi74ZMsGRgjvW1otrSuwatWWDKNDBapTmLnPWS53oqjJyW7v +vAPANWLDU1aMvu9PdVeDnVeyvIrxIfc90vFDiriXyY3pqugr3kOtlNPNYvOs +mXkbbDQ7L1OGm8tMHyJjdlbVajZbVdHJpOiWTlFjkGGTFlw0TGzWzo1Tm4Rl +57Gy6sNGYZZMMkESk9O2H33hwlI6Rc9Io0wXyuK7ZkwMj9leF8eI9hYoy7oU +4sAuVk99MR4NLI3mDupS1J28R/55irZ0VMciBwnSmJtXFWVXgx6h1cmVdyS3 +ReY2aeoytsLTLeRl51pdrELlVYKro4VdSZEtDFd5aV9xe5vTzinPv5nRTwmD +3cYNcOU9TmvLV0jsXSdZg8K/KF52WXQdul4XV2XJ1XF2lqcK5dEC2HANCxBy +OHA6jjq63SpJQibqF1GLvUpPkzwVHgOY3h4gth1JYMiuwOxoFq07adbmuQ8k +vCyyJkvejAusyhlJtJaFWDCyxHYOZzrfd8hY/053nOKOKl4O0bVU9U4bOFzp +Ge6WzT3FjJiXfSsonKcm62YGD39YuSOawMTDEJq6PI9qH2kfHWL38tWXzxq0 +WTdey9YY6hsdtD8HcV6g9Bh6islpYmDKxzsWS8Jd7QfINO5fQW6Wqtiakdau +9kyfJDWgzafkMECaExJIHVIGkFWWDogr959I2xOnz2xrNP916pMC9z3U6/S5 +y9ZOlfL1SMPyrZS77VvJibV65d1frrD7rSyaV9vn8O+2yUo836ylYEyzpliH +3x4A/eADjhMyumkgweqUHiHHIywthk0aaUmrCqODKNjwCDnDjAnw+UToCeAT +LOciQQEBJiSNGAx2HKnYw+4wcfAMR+hwInZ/Vb8t3AZSPGPe8cDMyjOE1mZm +G1kZNrnls/t/U0voKXvu/kdI7sCD7lkB9iocQzCQh19//f7n6nwPfwzdl9L3 +dev9/pn5W6OVl68Y8mC2MGxebVNVektr1RvXIpVD8L/n+6+L/h/E5i6oyGVm +SxPsJO1PTqJKLHxQ/FMpAGUcQGXEOo1MfWNNHklfQyxkydS9X2fSl/x8/pvb +/PS7Hkq/O5VO5EsYLGXd2FHTmtxvVPk2OL+X9xulPbu0xzYZYsMGMrLURP0l +ZGM9MFkedZKwPSr2JtbORRNMmjU+0nFbMuiTcNllTAzIBhyEewYZ4KnQ9CoG +DIfnWnSMnJlY4q9nybNkxN5p9uF4SbVli6U4rKxyFbkmFjLcNpP0y+zWn+Ji +UeNTtI0g7odWMai2H5hNCvXuxef1aNLSyyaYxGHaqqrKattWLa22222qtrRb +bazOczrY7CAdhNzrPTJbS2lpqwoxGkaVDvYtrpaFx0W3BeGJgOB2V5zm2ti2 +222HbBtg2ybbbJtnWg2yJth2ztjbLtk2ybZds7ZNvGqop7r+xYQ0iXYkn1IQ +7CEgaKy9PrqzV92m3HXYzlb/m6GI+PPka9PvrH3DGP7neYG30tKLjcFzqeG1 +/6Z3u+xB+LuAAVVJMSQLGCTCRxcexbj7fDfCYzPvy+w++/mOt0hX1Csu+F/+ +Og6uwx83o+XdS+56qUpzKRiASCLeJzv2+gSPL0WawTzcJGAnqLE9oKOAiHCw +kOCn4OA+jBz6FykMlW85lm1oaw3CwWBw4sineYgYhMokHHMzMzMzx+E4I9CT +09nOZ45ggk6bvpPquvxKFD4hkTsldqXP7r8fctr8wPmvInRUSPHKvgCfgE2X +2fwHXE9A9BsMTT8I1LTjsXC50u5eSYlsn577TlAIQ9IQJC6oISSE4FRBG360 +BpnXk5moSVo1eW0u6x9751N2VAcPR9bzU/7dr445DzeBt6Lh9paibbTydE/W +Z2mWeYoIYtKaSYkA0wHIQZJMktZI0jItJIxTTS/WL8fZbWMb119HrSQc6Xxv +f/QD7cZBkH97Ro/n9t3MrLD50U71opL3/9G+R/J//H77zToWCxf4j5Su5XRH +gTaW6DdQixJMrEWViKyWQWpcUp+Vl/FtifOhvBfsGIysQkQsjLSkMI0qQEAM +SFLCSJMLErAQCySBMLKMLSQQUpQQwESxMrEMMLKjDATKixIsMAxPyV6B6Byj +qXZZVdqc6dtkYYxZf3jInKMHzpAynKXKZO2ramSWK53zFfJrJ6xljsuVzGX5 +bvC4ZVxPNnshIkBAEEMgRCzBExYZYVOFwvudpTdO9ErwlWxgnmqXmRyKoVch +yXWmQ+WU97II9qIQdBgwdB+m/8X7v9T+F/G9MU3w1F5+ojNTqnLpOXshsLu2 +wqGBcgIEBiGIYhiGDBgABIEAGgvEBvHsC5npZPwES8dHfg38VgYHORo9e89+ +iY6cI/OSz+oNb2MCfFVIcK1XAXLxfXDQj/rnwEkBzYjBTy4veULQMTEJH5Ct +Qk0Ba0Gwx9UncBvZcGLFltSm01bVTVLCn101NTVWMMQYWEG5VSbMUVSyxKVY +aW36dYJzqfmmTm2cWyfhVTdHaW+nE/XitRgOHQd319Msqfm587PFvOXg0cpR +O2V+ddsy7thqymorolpsPsJ0DVtTT6BfEu4xiJ5XE6VYGKnY1NfSUj83Zc5g +tus/mRhSmJKYVYRLCXrHWAVYpXQulfWcK/5GV+G/g+7eMrCd+A9aemErLIqa +Vh3WTwYvSrBZMsWMWKt4vjEWVXmvCS5jV5jzKx8Vo9LyRX+PHWm6v4lTJV9F +D26+jp4OCeJhLBJCSSQSQMSRCL5ySAfJg9spvbKeDV7yvkNjoeNaMvvvrF6R +56OleV60/4Y715ObUHyQ7TSPSpE3VYJqPWvMHvH0dh2ra5H3abnK3vbLRaav +Km033N6d97HRyHC06tMwORiUBeiwWK0WR0wDAwaYVSg+mSohDLVDo4yrtu2W +zdN7qtodhdjhotm1imz1FI51SWVSWFSMCjTnHZYqUvfo8KD/CjKYyymTBghq +JaIQiFgkCKKCiVlel/Qe17NcnprD250HqVI9Q752gT0ziqXY8GhHYMFmZnVj +GWK+CmqyeKbNmWWxMY9twNszJsaWRqyy8LZi0jIZdGxDcmTc/STitMtm5lBs +ec8gsrBkraPkV3HphSywGMpjFWRgDFlgwKvglyOGSkffLLsQYkp+XsSXUVWF +Ff4qkGhDEw8icQu6xi6DEMWSaIwWX17GmMaNDSJsNBo8TRpuxG62lqpuwmku +w0VLU6kdy6HMsHFlxNDLKwjIGWXFR1sDbIXgVe4HyV77up7S9avdq5pbixXp +PkTKHF6qw8y9m8IrSq9zMJghBDQyTAkiEJDFCMKEKkMUKkQysCMMkKh6JDyT +o/nnvye099VdHsDk+VPeqgYMe8k7p64K9iIyqS76pipMDBoUsJOtiqcnovkr +f46rDUYySWQYWTyzOIkDpgKBJCQrYNHrixGKdkxAc46WnSy8kHrsWgWDpHO3 +qEr155rCYpgyYnsB3I88VQ8Kwku1kljKrLEsbDqyOszoR64wjKdCbp5u9eq7 +Sy89evPKLEv+32/B5nmgGDEAJpDykmwNDEpDfazKwmTdqRRr1wqpIZqXfrnv +ML7HDAQOkTy3p5YX2jcdLHe8KTC4nzMQi5lSiqLiWKlvx/JHF+Kg9sdWmZe9 +yHVL/ZHNAAAAJ5Q/aRJQAAA9xiCIiJZnmnY6JXrzhycSkP4pf8VrMKxlNvVm +k+LLrDf47tP5i9zTHh7PrPP+p+b9W9pD34CH40CyQ5MrxBhDg7KYZX3G4/2M +uXEOTc+q9/9x+M5XNVlhc4rl3/PNzkV8eTs6RVZ9KvCa4tmDzvanokky9gH+ +40F+KcBC47ZOKQsih3Ej1fzJOIhJzSSDPOaKd8rN+GUzX5dXDeUmzpRjnZ7B +QIa+b/cYu9TNUzH4f9+F67k06attW36ofdvtOZ/2FfJLZw7zQK9mgNdvpN7t +MCmky+WnMWB83LZZDFYxV9qpRpWY4yksfGqycCqaSAg4kncrAcGSRiIGOEy4 +C45Q4kjVp8wQA50uawbRihA5CYn6XuexD3p2NiDhnCXzSBEEfE9k/0tp0bS+ +6/XUpD7we9/gf/Lu8aZdi1MNGHguyO2eWk8ZNryjoOSK4K5MrGRqlhZVjEo5 +jcYPN+r+R/5v7f2vo899zb46Pw2T2MxVaAkKa0AJ8Qh9QlQgaFq0UNCRgRDA +jGED20fUP4SyoBThEvTPcHtw7CrupNtnWmGon4inlrlMpMVI0mi8GlQ6sFI+ +esKRpOLBmJqk1GTGPejAo7nidM8CDAccM0icfogMAnR0YLGw3oVOYyFGDeld +075PCYuaF4YZGJk3n78yfv60y1P360u4DkdVlk77U7xuucyOtORf0v4JX8Km +BWSDkHYNhPJV0J6XSNTACOUvPKeEeY2RRin6UqsTCleQ8F3jg9dIGHpjzMeU +h9J6joeDAxHpAgH5V4kyGSOGdnhjg4eSY44MOHOAPT9HmrwXsB7VLBGZLaml +pyRYpqTFtFAyplIDJV+9p6EndTxeZZKYxWTLH1yvSbbKyvYbY84XuGUvlhbh +uL9BStz3bbWZl1aYxpqIjEw6rnvBCZPEeQjJKPwkgoA8UvONFphgyahjVLzz +VIK9EB6RX8aUUZOSlzRalfb95N5G4dsr3863rT/LvU2nJ72bnFjcOAxIQxUY +fxGQv1nhMt5eJloaI83LakvA6TE3CRUZzOjaOf583x/88cs+2Z+j8J9Zm2y2 +QIZ8yN94rILKyWz6nE5/BqteUMJDExJV0YisjugbCmzDcxbTdpbBtI03ZMjK +hL+lgmvlafhPhfqeRFXVhIq/3PzXd+w+t5IqOxkwr9l4RRd6SmRRfh/b/2// +DuSU/9mJKf8+JKfpfpn8f8jwkF6JTBiqsKhc19AzLzD5yq8w2lx/D/iH0S/N +luv8tdXMr3iOFaGPsUxq9qhfZGoeEupXillTqDaKX4X2RUJ4Vkqqnk3kqYMO +GaZmAYsaYxrUlMrCFah1a7p9HVzpFN6vkBqUDwd0cH5NNKd6GKwGVLqq7bAX +mGRR99VTvVqdg8i7fCvBlXIvMoUHckDQ7VcL4CsyMn+9qU9DqxPKO2NLkq6z +7B6rxiF2qUebhEu8N2DJiquBsX4LzXKgq+JUXxGSZMADsIcwCeDQOCSAAKJJ +yHj82opHO9uEq0RT/67VX7k3N8mwZyUrWpqtKla7fsdbOHJ3/2c81HH/x+qv +ug9ve6uVdMGVVOANAQY2EhuLjAZMx0QmT5cLsdiBgBQsMjRa3mWmpjaLDQZH +0Ax/nt18+2TUbsi0Vzc1ktVYsaJjZpbcTeG8m8wt1saOGNK2NU0lugxJJsn1 +wHSdA8SHGJIxklemE4nGOHEd3myhxhCYDJJSySYkXIQBkwOAGcR4mHiZksT5 +qYnDL8PkaOGh9gvxX5ht/ixcXJjCkFi05W9dz+4L61FxhcinkXuRwfENBXN3 +rIyNMstB+z84/L/x+LjLDLuYar6RljRtV1RdrDGJslt6QjsFVXjWhoUK+v1J +9f+1+s9winn/O/PfE/Xes+b+0833wh95PPUoCTJichgIWT1pKnoz/UA+KtWq +pNkpPihPrV+Nn49xPcGO9T3CzJ+qEodPIzLERJISJ5SJKQ+7sEz3GwmSV8LF +lkRcW8pHFXEuBvNMSTeFNjiaEyZViZWmJtYTfEt2mTRZKZVMbK2PXmFMJlW3 +FYHFY2RRsYyTy2iRqyFOwuLTUmK88tJqR3vhrkE0o+MZS5fH/v52LqrVeM+c +OBxIxMSmJkE0rVahUHfG4ZK1QK8FhStmTa/NjumiN43JiMlxipHKrJf48Amk +n8fmQ2nK53fF6mU8KtDxNjusKnAYcVkVUvC6hO9PPRqx3m6TUYwxSbNmjZCa +jVVsW8wqxhXag6DdIWxhTZouJmVgsISQBKMABK9KyuF6HGegkSMZAhDEEBDk +HEsQ5ZiZCA4MA5QZRTh0cBA6DCbi4S0DZbTfEuFMtxOFiZS1Qu+VXJXUtp8q +F3U9ZJg3FuvfWpHFbulXVX43UX2mx8v/U/n+ea+mscbNP8RQqS99W17f2zXL +biEofLWPoe3zf9L2PX0QsIhCg0DBHoC4PqOAnGBEmVOJII5IX1hCSF3ug5FR +mNRBuoFGHQBFQHMBciFgm5/rgl/H9+rP5u1vzkHkZLwWB6qWqynxqb4k8sym +k+aC9hlbUU+QLJUfzWxco9VOgnwT2axlxP+Ob0+TV61F8YX3IsqGKoV+CHCc +YfOXQpRknxIwr4QfU/MNeLyN5MWo1MdHIlallT1L7H0VF8GD3tYWqeo8kjEv +VlkZgssXz1+atSvnaeql9tOZ+OS3AaqPaiU9yr26m6kmk84xSj2hjTJYrEZi +MTBGMpYDBWRkPaMFLU4S3WqnCt3oRdR3iel0KpwSLusqu4tDQ6LrNK2k3Pco +vcvdwnFLxAF7HsdTNQESw1t5JnJwCZAwRCFM6isVoxWGIsgwjEVlS4HYsm88 +BpBzu1vZRq0aVuL2d21+umN4cVYaarE3Y1ZK3jIuQ2aWXILU3bWpWMU5VV6U +I9EakDyjLDm5Gwr2B4r3tU3WpSp61La9Z2pzWR6dGRjRhtGw0w9+sGxtU+rC +ydVyVR5WyHcsjFhHil39Z4LTKKMTLCygTA+nI0CkaRisgwvZGqw8lmpsu9ap +MW00nJ4TncqWLJB6yJiZkwpmWYhlISMnrUULRVRFKoQyABExCvYDCVrIrGVU +zGY0RowHARZUDkNKLJBJISVZMyYhzLQdSTpf6samMZDwU1V4V5y0LUkX0v3X +1r/GGLC+9yej11ldl1eorSWn4o9oIpg8lDhcqvC9x2N359stGPVWMuI9+ySt +nmuJsHsLwk9lg/clIwtMO5GWqwsk1ocMJojyKBNVuthPkxPAQCIzNirGdcqf +fONkudrKFU47F9Gu+3Lt/H5cnrNH+0rMQbla7VzdbqezWtPj73SZJKvxPZre +Mp/fOzI3zoPVuCpkWBWTDj2CQCsSBoTdNgK+4/0Oh0fSuF9VUpixSi/lfzOR +yyMsz614R9V/aX/T9aPKv3mNBflikfXVUMCWFWSEWCrLuu+scanmV3mXkXuJ +iyUUYlDyjFWVGDMQoRCEkMLAGHCg5BJoyg1YosZA9KPp//p/yf9f+t9R9v9J +/d6j0fffb+x9J/d/r/63sxVD2lKPapAfH7BRlJ6zEaY9nj84SJxSwcVV9+Gg +nw1fEr3N/pLPb1qwYjSsq5JC7vd0bTixWLJTHENQqZU7lLHIHIjtqO+pyo6T +vRL0mSsGQnR3oyfWfj/oZP/BPBMJ8wjROg6bvj5lYr3jNK9DHpcZMW0tKyfE +OZ0kvyxeeJ7lTDF55ob3yVfJJl60djtODK0Gp1jtaodRkPVHcP61bsMZmYPw +PivYXNJlZFXgnoHg6O9ftlli5qths+yfCjBhimGGMQARJCSSQQJJQQJLQVjw +FhgIyPKqEZJJOEd6dCQUUTQ4pDBsk5CQ8iAKDvp18ao8xmt7medTutWnR85b +rm/Tb3Bgv9G/hhq+mRk79zoVhw2+QaRD3lY2CLzOe6AOfE8MjxMkWLrcjFd1 +7Wx9KlelZ76bsFuojQWXKThZR+EQ6B2E0JCbAmAk/XaEjrdNfz1SXpNP8X8Z +d9u+hpEhLeiU2W9nuMwVpi75+NaZwpvG/W21yOo05TEu1Xa3aa236NLAC8pg +LwQSJWEPjxhOEyeqZA6JhGCeLzgcOKZePFTPFxgG9mIgBsgxJMJJAwsSRAvt +DCmEoxkmSxgGKN2E1MmThqvngOKjgSJJIZWYRiSATi0GmBvcN7aUjLI3R9zq +kuGEqyrhw6W4022Yvpn2XwPJ8Z9p17Ud2ngwJj/dIHBoIU6UkcVJSwEVlWHd +alfWfffzfxN7k53kXRhmFow87LtssMsbTdtY4Q5SlTVSknw0yCjSwgtUKavQ +aGlpWqamyKOJNOH6L4O/zv0H73+N7P9O9r57zVCL3n7/+d53jGVyRT+7tbE3 +KH1DSm1ih/CT6Z7gqJtJkllYWKN4vvlzijcY/0VAm1Rh/OY9geyOdUdjJtks +ZJF7KHu9Py0ZR7dVSnE7YyplTJjFftPjD41kjAwxWWSxmyguCsJutsdzRtdJ +3kDkgIEhYWQiIMOVTB3jkyHCYZTjCzwHnDjF5wJ0y5I55Rg5mmo0fr7zESU/ +Ac0nhPvRfoaWnyBd47mq2bLwmTvvnK+BQVDRTsnA08a8a1PBZK+1cIl2IxhJ +zjeW1djy42nW+/DQcmCZQ5IPCrkFhO9TZqU3HbbKnEx2PZNxhjpP7CSna8qG +NpeNaYP4s7F3O54p2DaaNGWXdVq1UqW6eQ8BeyUwpWmr7Q6Upr2Vyl/74l8j +4FPfYpNxZfZ6vExGKpfUad6vAnvxXs1bDypL5a0p5LxRpOHJbWotVLSy7jtL +mh7leNu4UWUq3i0YaCbRk0yGzAOBAkiSjMzErDAsEMKlqtWq2jHF30gcU3XF +qNQWhlGt1G8D2VZB69+o5UbDHOMEBdmAxwjIne4ciGy0nD1Pz/9biuDEohfY +ChSGWHPKFRjhRzJgS6htIoLsFY6lBevk4Ge/alR8+1/s8fsZ0LHyCMJK2WXy +i+EfKqVDY+XNPQ+hG9rFkW1zahXHDC966q1bmMc8fdOfLk4ycrrXS6uZo+Eu +wm02R7M6205snRY4ubU4vBwaNp0TZysrS2G1N+VpdrZk3jk6H+e5DVuMfNX2 +toOxZHJ+jtr4c6XE6zr5fo9hs4nzbFNTLVsbTwZZbFunKk44q8W41G28sMm0 +6GMmxa3XK6VbNDaaTg5uy3uK68OUjxsDVsakyOTrN5qc7h04q2q4eK4g6jKe +Wco5G90dVZG65OEyrMR2MjVYMDtjtnbbHKMuhcm6ajnN64NMOWnLDZwyjU0u +bdXaxNVc65RrhuxPPbzyutzXa5Lmsm83XJqdh4uHYyc5Yua5N5z4uGmtDRst +DTVdK0tMZNMnB2ubVJzU2ObhtPKsYSwrDo2NBerPj7CuLqFDrYB06cC6X6Zq +SXKUjJxdrZdIxbDDoZassstHlzM3W1iaPuJteiv7n7jv+ZR4O9F3sHlTdZNx +3W1TwnsOfKrm75qk9Fg5LGM3adi5N7a2OrZvkYxcrEHBcWWWWLlcXK4sasMe +s5N30nN6nKczCcGnKd7LY8sSwxMMkS7GUdROivjYCn0GJP2WJOVHK50DsEmH +bq8J9jwu63sssotWKwDJIYIMDBg2U9G5nMGDMY7Co5nB6r5kOVg1bGiYuqy4 +cXO/aexS88goP232/637309Y/R/r9R+H+a/nbR/v+b53aPnOnsltCnBYQtSZ +IZUZKVGIPeAJRET3YUheMpAxFSBVVVAkRQPpQD0wP5MkCIYPTHQb2xOqlJ0X +NfYm9Yy1Nzl8mnybarSxI4iMCMYXvElmTo9KidAlxGTbcywZixxXebRbzebN +hQO9kgtsWWSA3mrUui1sHtDOTGHh5cinkmF8gTISzIkBD7JhmGHYUhM5Cd4C +/0Ve3eMpyk/WDJWqG03Yh76kvGdtsxwp9fZR4DKTk8o63dhswxllpZYMMDrb +WuFPoljZ/r2VDetqH8nzHyKJ187eYC9yjHjAk5yvPIiIiZ1SHiDwOLiCDGXE +wYy4nwE85VCjo5TEzbKd6LB1WzDJq9K8bKXKdkHMYnwSVyV9b2STuOF3Vpl3 +R9OP4A7m/sI0PGnyXcmFqNX6WUKfzvbqRVsrzAulIDsixVV2xdjhHopMd3us +erO/dX03nDzzLvGZRliY+WDVTVVUgwZLCW5aaWK9/aV9duoKXWoKX6Kl7MlO +AxTcXtNmx0eQeuam1bKgYgYZRd9U3lYPcewy5E4khAQEPDhxDOAmRXPATjKr +G2yNVqtCrzS4H2cVMo6gttMBmUxgs7lQ0SlrEgEQCFLlBqCIFHQCEQqFA5RC +lghSQV/6DGYCHI2WRMsXpWQaWCyxSZYkEwSMEpEESQTEgIkQgf1UzkPNfGyr +8iSKN31gLNNNJQU00I0lCUpS4RIQlURgYEJRIEUbViwUFKhQFJQUZYZUIQhF +UtWbJSUIFKFNAUNOWGQApTOFmRmFJhJkZkYgYhIhJhJhJhJhJhIlIliWJYli +FiRmEiEmBJhJhKGhoaGIYhiGIYhiGIYhiGIYhiGIaGhoaGhoaGhiGIYhiGIY +hiGhiWJYliWJYliWJYliWJYliWJYliWJYlyCKsjKgcTHCEmEmEiEiEiEiBiE +iBiEmVmEmEiEiEiEiBiBiBiBiBiBiBiFiBiBiBiBiBiBiEIgYgYgYgCIAiBi +BiBiBiBiBiBiBiBiBiBmVEJgQJlUmUCYTLKM9oV8pTV8AnvF1ea8Lzsee3tq +P+8xsHQm8TadXKmyl8C39GZM1rNa1UARkIiGBYhMDGDJkyssRBQEBmBcAQyS +hJLiMYUkpJhtWojGrCNCaMiTOKxiJgjNMkW20xOEnA4wDjDW+AQSHjMEAdIr +0PSHHPTDni6O4Hshx6u2wuAMKUlSkVKw1MFQUzSBEmcHmjDDwDg4YE4yp0ME +DDC7dOIp7i4XKqlAgAzlUyqassUZaUGpagMoWUtAbLZG1U1WE2LSYQaSmMFB +AMDIEEVDc1VVW2qjbVVbbbG2qq21bbbbbbbajGNW2tsRtsFVFETY2tWxbVtW +K2xtq21rO22thqiIqqqoDTVVVVVVRrbFRNE61FFVtiqwYNVVVVVNVW2oqqqo +itunhzm2xtjbLOQSVDJitsuQ0YExCOFaLQYIijbJgsYwTjOwYMG2jAQmTbbG +21K4MG2rG1tlUhQhYbNllgc47DwxmDEEMQkEBEsSMhJLwYSYQGHQbYTaBYEm +ComYYFgSiqKmHbbbNnYLbWwbMHYUWghAlDgyKEhUSwISwyYXrEWVYiYo5LmU +zqjIaqTvaOl6EecOOguFiCtxqUjpUDuB8Xf462aDEUUW0W2qYrba1UbYtts2 +GLW22222ZPHpucqKSzJzTJ4IKhddYTYKqqzJcUS5ymqrCydabnMJJzTzhWUV +HwTuPEh40O4e4eDjVVVhKwzhnaGHIgu2ER2xtjbG2NsgqPmgiq9x5qPmJBEV +YLn7mX+TTq5bjBg6lqleMyug8feZAvsezBcQOqqQUlyESEJQB2vDYA+L0e78 +n9hb2vt+6Zkhal9rf96ZIUflTMUVabI4GLovSQsAhEymLtaXdRRmMuZY6IuJ +94r/kc0+WQ2/TRQl8+/L2j6q+davdC9T59uxjRo0YYc19nPoJsdbPiDna1KT +Q06ToanQ2dI4XEbrS6dBg+UrotVxdzBrnXEtLnOVw3Muf06yHS/Pt65OSzmj +mOcze+puRcjaTmsOQ5i/SO22uVOwy5G10Q5utWN3Y4d7ZyGDLs7ptOJlWjC7 +mjKbOm7Q52l4Muds0LhWRqbRipGOpvUuRusnU2MWLtuHKbTZ1u1cGlh3Dirq +uXOF2W0b1SkQOjUcdBgmlKsoQwJSpRQoV3KG2MYr9Jbxvk3ODY0uXNjGNl1j +wUi4OThwdOltaro5y4nOmLzOC7rhpxaeRzdjccnFvS4SU5DkkpqlJuaQxOxI +GqjxGEo2cSnOmDTsZPFjGV2xjLi0djsdHScRkcrIyZY1Y7dNltZacx42mShI +Q5QmLBS4KAkHCF5T8n+ntx1T5Qw5cHaPFwrLC0yXA08TUw1PK5XFW0asXetX +keLLLedLLLJcHC2Y02ckonlAeJIDh9F8d8R5hTURQREREQQREREREqgkqKoQ +MiBPlAQqOBEJJSGQmGJlRAYomKiCIiIiCCJmIiIgmJiGJiYmJghiYmJiYmFQ +GJWQkgSiFlKnY61zyzstPPY3jDYxb25o02t1pq2pNHO77vuVyLi2aNWszc3N +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 +zCe5JWYClefDgHav2xzhs52PfeKJw/feZXH2ftca8z/Mhj6wwGaS5DhaO3He +tm9Jbr8Aj2hKx7saYjz4fGfmZhdYilOj+VseAAkeHRWQrpLCsWj1as+9sPPy +LlPneYc7zdyNnPNaeqKsVfJGmwp0Nba69bEuXEnYqPdtowGVPEDvvN4IQjrv +dRRxdzfAAF18Ha9F7eACT17XtztPtxyFyE4HBAdmLllecDi264rEykD3rryW +3GligYgITKbQ6YuHg6yxp2IRod6cGI4l7uE+LkSvRQSA5teQu+IqVg4WH6vb +tR3eRVpToIdTfM9tStQvy+uyBirui5954BB+0N3tzfLrAl6293NK9naNFYxP +9pCBimiwaBVD16UkRQUJApUXBTgUYYlqYU2ZVNGPnPTP93oL+l47sf7/V7z0 +h0n/52Ps/r/rfyXog+nMRC/ake8+F9r8T3/xj/c5uXNyHHA/m9dcN3LmaXGn +/JajGnh5MXcTSojhCNLMEOeeVzWmVptjaRkLJUsk/6vG3IxsQMft+aubBlD/ +b8Ocgv+H93/I50ShFQKslVCfkXFSzyPvqTvttUp+6/ep4XQUgARncAiIgRAB +P9bnn+Zrtve3gIFFUUfnIzZjBDlfYhiVD4L6bs+Q8dFVMygmXlanaMaL8iqo +sN2pBB9owfnn59STxJ9whVuyirQLxt+JYsWT32F4extUoOGrlWEip+vbpiqU +qpuQgxIkPCawiZFdOaiLKKqqg+1iSbk3KUGR8qHhhpcXCfaVwpbGLiD358QY +zWrYx7bm9pzeLt7Bbx2WU7HbR2Kqj4e9Pyj6iHBVH4X0Pf4h8p+dqFooKEia +y2xFBoUlColJPmLKqu8Ekh/H+zNPw/1COKfJ9d8TVcndSvJrrapkk4ZMY+lh +2o953mSnDulNOpmKuA0paFbaI4V9eWVq/IDoqWsUJilTBA3I33Ewwyyn+XaD +hYsyyWwGCu7q4hsu1i2K/XZKKPOyleDMkTtPmicpuPcPkI1AcwOKLojKzIsw +KUuKkp28ZSNEwUYshJ+QsVDYgYvdKE6E2pJHicLnwaNKO4pqLvrJqYk2TI0N +DZVB16crrqqN0lO0ypZhX88bZTfcxhfbsK7blsp6RiOVwhsbycHTlo0blvjc +VonufE0pulRZGRUsIwEuFxStCrxHTMZqms4KcNonpeMLl3UsdvmlZGVMMKKP +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 +u5maYoBk1J3p+YiKdsafxw9OFh0EynA4Q4MLq8+NHixDSckmxSWgrloaYegp +/892csu651GkqpqBAiDKKc7E1/KVQrW/QpkG4aZcuv2qM9JXRik+JpaK8B8P ++kMFQpYlKrXmT8bx7QUczdpKLr/Ya1Jc9f9XT+YdaU72ez7dFMWxphriu2hg +AEorEJlbBIm1D9SDo77F4ZCDdtOJ246teYgSfjYSRSO8TwO6ekwTiKQ5zYBr +6CSUEMDfnsI0kwy5tdbUSLZihg4YlpLuvQ7dKVtxLLcaeX/u3U6ZLI0wcW96 +Jw7pv6u/GgGt3jy6Y0zCOR75NIKZzdSgFo6d+5zqvde/grdG9qaZ6nlzp259 +h11SYtJCqcS1amoocxIV/Dv0nMkrmMQMRiMDB90OYf7higrJMprKark4eAnN +8/////////////////////////////////////////////8H4+69qt73Zkqo +qw59zwAAVQAABVeOfG3yguuzc3dluDSchdS3TURXVtrTW21UiCoaBqUttoGq +lCKqKFVRLTEPfKw8gE++wcANRJKCgJq87wAD7qrfX2YEVfe+l3AHpjz73qD5 +3jW+vPoHvp574B72fepUH027tyrxNm4C8JtPVeJo6ANHejdD0DiDoZ9YAtZ0 +DdboGQAusAS6G699AAH2Pezvd675fMF87ia2azTTdmdaiudytjesAA5KDVp3 +3HQ4vHaa2H1rlNMtMFAAUstaGDbVXvqJoayezdL6aiXPblRQO2SdNzcxjhQo +osWLzvbPuyrClBTKfHb6w9tr5YpUKSTtvvu9UinsTufbt7L2YlVs1so87XY8 +c6BzrF97u16HWImmKxAzBgxtFLs22liaHW1kp886693dbZpTy9c83X33uPrC +Zs4d04VSAWZTK2FGqjzzru3nevtpSI6yC++7glSrd3HjX2fTvaXtqVcjy72y +pRexoGM7nnMUAee++O8vn1yodq1XM2unebyoqBUp61vWKzsyiHaAAAJGiRVR +UAAT77PkKSvrXwQ46JyaFUGLtug1lvfXj1A897z7d2j33Pr19uI3IUKUAiAK +AAkFAKAChQCEoFAFAAAAAAUAAAUAAJAAKAAAKAAAAAAAAAAfFUIAAAAAAAAA +AAAABMmCYBMAJhGmAAJgCngAAAAmBMAAAmTBMIwATCYjAmUGUkEGgCYCYAmm +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 +OZ6BznpngznjmZlQ49Bx4BMwDPT08eM0EKsg1ajR3IcsvDR2ZZassDDDL5jT +Z5FpuankHE8g8FyuSu/dLc6XK4pzIdEsYRjDGHg002cu/D03efbhUx1UJIMZ +CEuGbHGqutWMkJ6OxQSjDuS6g1q7rVjJBzDfUh0cvN+RbvA5RUwQDoRnlYWl +g7FiOGFqyNWLwvJ2ubg4THLcTHOzUxlTGVNORpXCKm5gVxwHOBxARCQRAkQO +emeBDxnJMzMPGcw5hzIdDgHgwrwXoXBEEERI4OiCM4FYekMBhgGGAhiGIYhi +GIYnOMMTEhEOQgQ45GWI6GJhcFybq0xYmXE5YcFeOiLAQxDxwOGOOccYyEZH +ocIFJwZdcg4MnRLnjk1GGrRbsq9ipXWOZzMvau07LH3GL7ru4J6F3tttl0Pc +wbXSO5S7V2BsDocjQqOkoDYoQPRKMgW6xERUTTVbpAFxSA2SR9m7KA8jcJbj +lk734V77m4WXUwrox6MDiy9rzeY2HUwuHU5cuHDF6WLi8p7L4LBUj57kPG+P +11/vFSn9V8S9lJeSGi+ll8htfRavf6pPO9xpEh0hL4tHv/jeSFXdR6DCoaGE +UDdy2No8dmOTDd0uxWpwdT3GyW1dyyXwz4x6k7Dx65nGq7SJ25HUEqhh3Aql +js8eWGELj1CRdgcXWeOOWtzc+Fz3HlmK45h5CNq2hzqxOIRHS4BLU1YSalXh +G5znRc9/IqIfu/F/X82oP6fnkVQP63+F7T+b7qz2GIOiSSnfIWNHvmMfqZpj +LcY4YcGNGDHwDGPsOk89dmV7j4wz6ZmeGeMn3Z4kmAbnE1fiXU1Vu6VaOba2 +ra6xs4Xe4t3zWWltYmH3rTVu1TV1HZk+7O15C7oAhhKBCbvJlw7GzQfKSHZC +wbNGW7on4s1O5luaXW5uZov07aanCcF27yDKXwlk0OFBOwwKBAJD0YflHKGC +wkBVZPRHUklqJUZBkdk8BQwOW4EkFQcywboQVezkPSuxlDqBV6RlkdDBe1Yy +1dW17FbVoMXW1ebrcL3QnNpGG1p6m02YbTmOqPNu8LpcT0PBcu1+Nbtxk6BU +9kkKB1MlCjAdCR0UO5oPRMqyHZ/bvN6MTLdy8zG4YtF8rm6q9kycJ4Ha1XYe +ab1aHWV2ZW1Cu0QWPkYRfC9ti2vA62l8rdyx5W7FyZZZWsWmsaY6WOV3FFxX +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 +0Y8DJxdFbWmmr610U4t2RpTTQ7HSOFpaMMOLidr0WTWRhq4Fhs1d6AaaISlX +vjIeBXgcAd/E3Kslk6iuZky4UWO+OgTrlCgs+t8zTh5p0aCcyHxPNIYdgdg8 +BAeA6km7p3TL2YaApYHQ0GiG6EMOmTqNLquq9bmOVRffqlMArBJkVXMo7iLC +k4Xje+y7l8bpdI+FlzeFqw9Fpgy8oekxeo9lq8z2XvvItEyw95kegRDwtmjw +LQSEuwSLJ3Jw4cPjsPcKimDQGWSHgOAoFEeHA0TqyNzkNUulWU3CEl5my+U4 +eY0B2HvpjYPSO49nQmUsNXyX/Rh+d+L/F/nbfme85PN9b+h/zf2vF0806biI +rsrEz1smSYF15Vxmqik/ppxIF/DZLh7teT8MlNSBZMldesdLLNF+apNkdm2P +6PcFsX/975mv860aVBpNYkWjc96AJaOFqWbs9xZBjxPLLyqJ9Vwc6DEZO/M3 +K3GXH8e8kApBP0zWciAQt3+u0INVofzwfDltlGXeDiIJsyX8Lo4SVV/tRd3L +XJCQYq1Sz6agYIE2a3GDwmbLlFBrg23ljyneaPXcbRkr7wLf+lLOCgGORDwP +8O5iX+biS1VZ9XXDQQcdWtuSbePr3275YMwcz2bhocCQGfb1dEdQUCiQCgC1 +Al96emPtQs0mZn6s+YTHvSQS58IajY+CwfdNBsQfdsk4SN3Dhl+nftX4R+9d +3Z0nwhq7MtBaNhqN3kPMfgvjtXZwOHTwD+0ejdDDZkHsy+oeGrZ7no7NGoQy +8nI2e+nDZ+CP9PdfeD8l6Wz3fv7c15HN2t+6uxOucsye8hF1TjoV5qEW0ItQ +iyhXcS4quoUOC+AR2+yzPHP/a36UrSY/yazils4ze+IvXtcnF73xjFbGNRnE +5zFYzN74IjM0xm+sa1rU2rGrYpnWdXpi+qRmhjGNWis5zeNEXtW8YvNaUtjW +MUrQmNVnFLUzjNL4i9dWva5YxacYisYnV8TTFr2vGSc6mt711bVNZ1F60rm9 +TGr6tWudTGovet8TF5rSlsaxilaExqs4pamcZpfEXrq1y971vi+L4Lai+Jzi +Kxmb3wRGScamtr6zq141ONYzrGda1NqxqtsVzq2r0xfVK4pmxnN9Wis11qY0 +Re1b4mI8gEFOQwgCAQwklkylJYySxiFVjCSYwUXcwi6al0qDIlV1IBPZTIkM +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 +JhUwxVegXErFfcvmsukbWRkZMN27Y1aTLKDVsN2QxtuK001VHiXCv2SVMU8U +LYUnlIsqA8lIgbKI5RNLENkWrUenmNTCyYNpkpjFdqZRYYFmRBmVhmGAIZWY +ZhhmYQQuRmlECCBD4Q4cD4wiKeyAgYGQVCUCVHtqqmigooKaMqgEABIIWrAW +aaaSgppGmmhoMogWrAWaZhZlJhSZZhJhJkJhmGiZZlmWZZlmGgpiGJIkiSiI +QmQmWYZloBooCgKSZZliYmJiYmJiYmJiYmJiYmJiCIImJiYmJiYmJiCIIgiC +IIgiCJiGIYhiGIYkiSIYhiGIYhiGIYkiSIYkwUIgjKQWxtgXQo+aMciYZlmW +YZhmGZCYZkJhmRmWZZhmGYZhJhJkJkJkJkJkJkZhJhJhJhJhJhJlZhJhJhJh +CZQmQmEmEmEmEmEmEmEmQmQmQmQEJgAJhBmVYhZhfPiLnsE+3FjxM43WdDr2 +XXbmxXl2NlWLipbkWpxRyO9cdYtVaZMY3keWV2byAy46YiGAYgcrBgw4crDE +EUUMOYBysMMITCQlQjKRVUQRFBISscEAw5mCXCVwuI3auLFq3HmXJanI4L2I +hBhYhCGGCWUIk7nicCWJgkTiTBwcjISSvGQ7AQwEEIdjnYpqIYCACAXOVMXF +qboramiTBNrS3Q3U0jFLJZqGVTKRqgwwRBCMDCkEFEmFADbKOMGBQ6enKw8e +hBkQmmSEGFYiEggiI4AEO2qHGOykxaGk1VjJxVts4GirVRlUMcYwEJKZx0PD +GYMQQxAwwYyYymDJi2sGWIXCkC8BImqJhGJiZhyWNiK1rUpYqYonxlGFiDJX +RdaWPJGVaieVo63uq8R2RwsoS2aljcDkOx0Zh3YYw1KhxGAxONWXvCohw41k +A4IcbszRM1mqUnUrk7RanWrLQtJ4EO8956CLbYcOG0mdtYqra2tttoqNYc4Z +21VnOcKZUyBlTAphF21bbbbbbbbbYxjbbbbVttttttttttttW222222MY222 +rGxa2pqqmItra222rbbbbbbbbbbbbbbbbbbbbQxFVVVVQ6qqqqqqqqqrbVtt +tsW1ttttrbVtrbbbYxarbbbbbbbbbbbbba21a22trbbVtttttttW2222NttW +oqwy5dtttttttttjERa22ttbbbbattWxjbVsYFXbVsYFdtW221bVq21bZF21 +VtkVoqmk222Ciq21URbY2o22NrUWzW2Nra21FVtjasVQqCfFqEV7C9Biro+7 +ld6yuofvvw+APVMHaPJ7Wx/Tfc+tPYnyOo6G1o0XkvT+o/7n8G1ZKyWrWT+V +x37O4ORvclxplXEDFWkMbeARzAPfMbe3yZReg3KvYdEZ2hcu/MbviLBP/Yya +laujJgLh2evT5zkv3i0HI0Toru1B3LL0TGW5POa+tfqaKFu+d+TAyQkCkBgT ++s/KbPy37AHD9ccmmmmMdl+PPom3hdp1ttBllRNRq7TsanaztHJqOTSXVwL6 +oDCQyFXZhWS4WEkbpds1CHB6EGFcv9FqhcuGEwBhIKB84l1bjanVZOkdSfn3 +jbuheBh0t3ZDrd6uDixwMWXjNTcyrRidbUYmzxbu+6ulteNjrbjVTiMVo3GB +Ux3uBXU4mTzNmGHjdJqaPANxyykBuNhdJhQdmUKK5BoykOR1tuDi5trFXFwu +Vuy4aNWB1X592jmxORzOhwtrq7MbHaPSKqqFmrVLspkw3AqtwYTq1B0VJLMv +Vw7NQbubthG6CrhcIKsiotR0JheAE0l6LCS/25P33LrKeAMIS7ED1CF/Q5oT +DdkeHh3dNkIQuxWTGNMdLTZbMcUeS67exbqLThIMBc7xVhqUP+X9f0XBsw3S +GX/BgDLuh2cA4waZLrGr2GlhpfC63NW41ZXmpez0YIKplhgIVsNkoxLsVcME +EAp151fCSX5ZD8j7g8YiCCIgiIiIggiIiIiIUFJFFAlkVh82sIpgQCGBhkJh +iZKFQRqKKoKKKIgoIiiiIopooooiaKooolEGIWEISEP1IVkghUhAR662N+CW +fCSVShBajZga2ZCShZJedGagpA7HU6mC4FiGKRBVqVGxDLLRq0ag2cQXTASV +KtnZhll8QVQ06dOHLDdRQwqEryHxP9O09lKhcioXa7Hvc8f+j0U+Q/sH+b13 +F2X5+Jeyqx3LHw+taK5miuzO3MGgsp3bDJ7HKq+ZUhX1cIsrAE87BTkfcj7p +Xa+aeS+tVP+nMQphkC3S3MS8GZGVg2i6lVwK/N5T/uKh/ICdW2X5PWFSTmcp +UlWoRdaEWQiyFKWSCwAMlSWVKqYIv2OxAHW8TFMWIdjItQydaMlrLMsJVRmV +UhhmCIEwDLglFmFF6eKeIZ+ZxEeKx2WJkkyLTRjo5cMcnKexXTobLgxTN6Vi +c2Q1MrljlUTF0Efqq/pGVl0q8rKD20epCm61OCrlb1HHNlk/EmWTEekylqd9 +U4HFotWDGGMpN2hdJZPEtLUmmr616X8c5VcXUq1YrLA4mR2V6lNDsyszSmTZ +UaaO5XF640q+T0aWT+XVxlNnMxiysZjGO/gnvPz/XeRnPFzsMsVak0sUqfjV +bTyED4KwTKspLw8COCnOt7oVuH+EYjc5tJlff2gP6Mk4JPgsVuXVYX8LdTd3 +MUmSqczD331F52Xa0MRg63z1q6ynFtcqvxynzu9k7xl89k1Wni2L5TK5nM8n +NurxuVOTdi5CphqxZYmJgyGK6rL7zA8cMz0BIcQ4LCuOEGTJPUT0A4wRwCAx +GDipDiYODwcT0pKwdChDxmQIB4hmYpqTaatjJltNS6ruX31ffV0I3ByLdQDB +u+wqr/J9QoCKv9T0/cOCAWEhFkJAQICRSCYAmZplD9uU9sVX3TzH3SJH7yBX +pVdUkZWUNxTKakwYWTOFK6UDhewCYqe2KrRUpklJkQmVCpgSn4EqPlJ5HzGh +815W3FWTeO1Sqo+E8XK1uH6NYSReyp+bqoVdzpHZd7DLoqPjUpXrsseAw00N +MH0LSxwIXpOlegesGVoeJ0nkDOelO0VHKxDJiOCrEmJTT7VNsbKWMMi8QoO3 +I+xv2eMcbiXExOiYUNRZOSO/K/h9aLuFJxWMrLGWWBimK/Bsq7rE2BlUiB84 +TExMTExMTExESK/GoAIKCSSCpAAa39PR45bCyQwkNYdyMGlwObdqOCvLLwg3 +2Ggh2bWRVDmZjpAt6kIPhVtXwOkvJWEyB5fPWJWYNS8A64VBzMRSwPEQN1jJ +yE/FT04xP5w+v9909u+zHy89pfffE+YrJAAjstmbtwosAkOd8wrJz6H6VV7l +OxFV9pcmn0t1p+L+b3g+IxkvXP4zvivwlao+Pkr6Kk+aF7Z8ubDkLdP1m+Vu +psrNLGN0LYmUtQk4P9Hp6/C3y30XWpqH2P0RV9J/QAwr1QeyrqHgTyWUyxfs +73DJqe+3raYwYpV/hsVdoXiFNEvqvfLB/cHrUTLLK87aP2SfqHqN02uLg1Zd +bi3GzRY/pFhiwxY5BujLL6pqjU5tWXBll1H9t5E5iqL6A7X9EjFA98cyVytp +liyMWK8F7mWYQ8Vij+ZlYvXeDuwG10MdS91+bK4v4kOrlYphjGFJ9AThEwMS +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 +/SWdhBOhxTmmbaVu75IRLAlKuJCBKxJcKikJwPiEIf3lD5d/UcypHYn/Mm9o +47TK4ywxGLaY81Iz5zwynXf8bXrzPBng2P8JjQm6+zWqDU1hxrXT5MUfQYJN +TrymHQSCwmElecJ3Ty/ercEPipzjcT5ALHtxC6xg00hpxiq68rAcpgQ+AgLF +/TgQarCcX8hLUPoZC0wvbENFR3lT8Nsb1zeJVn0e/7zC9O3YYdbcFiLMExtm +iuIfb6zS0/MiT7I6znKd2m/vyJO1o/NZmBdYE+I/q2HnHZHpj049Mj1ER55l +U1Tw2VtNr5f7YgyrKKPslGMlbFd9of1LGxf32goKzqNVvXj+CTokorPKFlmE +zQejuz0HYBnIsjo2/6MWvm1WZaXvdam6tuYZTlNfhNmVPXeL6xr4l66a9rmf +HAPD7sE0FbRheBaVr8O247rLzHHk/h4b8PVxe4r1eLfZLbrtenkZoTVRZ4ew +ZDZ3LiMi4p0ejwxwu4qfwTBl309MdcapEZgwtFYXmkm9LhbGGesbEHIWX/zO +hh/rpjFIuu89Rt9GL99y2gOVwkxEiYzXXkzdYdyvFXhzqsy3XhPXi+d/r/fJ +PRPzkx5hI+8gWntsBJMGmlalfI5Xl744Ypefb+Z8cDBaG0A1GavqxofPT8m9 +Ow3aYu/Zvevf+ddeLPNd0Z8rXVL69Wpigt41soBHKyeifOta8mwJ398TSy5L +wWG39NVq/6U7Jqvmld3tK3rTvz7S5W9lIHjt0W9W6+jnWFmVvJ4m6m7bpXra +6r6ZsHYJ7VK4UI00TPswpZhDmGLRCWxQhEuMXB5rqU0SpWypNNYrPE7tpIx3 +a1Qz+EshQoW4ehwzIcej3b/kOnPTTn+/tvct9W652caWY497NpvYo4S8JxZy +HjPzWEaEFSzFlNdQPNosep4EqO71/axBqx9Yi2UbC8Fr3uWe52HQqE7S9+pk +VE9nNXZnQe9WP1CVxhz2fqmEYAjoru71w7yM3Gx6ynjxPHTg6LK+Kg/Dw62L +V2FZ7xyUYTLgkp8KCGIJdXuybn7Rqd5UHLjexu8CFiLukDPofZnixDsB+jme +TVGhNc4O7YOSMu+D96BGtXxM/YzvuxdBsORlyS4pJzp9FytwxKQazHVUFh5J +PpMBVn08Ipxmz/JFKlNrFBjI399VGglJJI305cY1SG1QPxpOJSep9dP4q8ns ++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 +IQJkBNA777BqhtHVtOwi+KuFCVEhvWyDMhyl2zbTJi5C7O7/56rKL1/tkmQh +60ITH8JqmXxD5RC5JWAagw+QusmQdOWXNALwUJKA2P1bEXxGmfnyg8VAQUn1 +U6eSghK4zcbyD7MHFdp9DZtIlarORkqT+5Wp6VenJ7fw/gsTFHpF//mKCsky +mszE0yOwEcBT/////////////////////////////////////////////xQw +j76AQj3xgABXACISAQ+7N83VCrp33c7IG7jMsk297u689Rerz3RTtr10XXKr +tzbWudu7Cs7anaG7a7JsrRZm1403YAdfF3PSbVszGyNm+26dHHEu5ui67itq +7a61Kmm93Uu3rts7dulwrt3LqzjmdYmzd25pdzibG2106lcbTNu5uZttcuzu +2W1tzsnc3NN2rl3Q03U7ubN3MgO7aWxqKV6zxb23eaH0AJJSiRAQlAEAFJRA +AQgqSgAAACRe5e+a7W3Tru25vviQAQSAAAAH33vBPvG9yzw9Pl7x9T60OzXW +lSkXWqqLwH0V3T6+y5u5B2Z4B8vvWL5z7u3u2+PO9PprrS3bu7ZO1zdG3dff +F1gClvb3Kvm7le9cXq63s98Ds29dwBAQD7vV9Hfdu4Jrq76p6Y+2SEKQCgvv +t3vK99d559jtqAAAAN9zid999bt8+3bj2wAAAu6u3z4HO33AAAH333O+hWff +WPoAAfe7u+9jVz3YH0AB3e5d3ybze+4oAD31nuvs3vPRQAB95l88+7X1PgUA +96b3Hfc7vvmgC733nvc8mnO+fQPkd93213d4ysue7qj31FBJRRSqkIAdzAAA +AF74vO++AOrXr6m+Z8AB6AAAfJIAAAAA94k++e7dHld6de91p1uejr3c3pbe +7c7LZQp3m973YMXkd1T2Zu929Tejnd73dnhSzZV3W2YLu3NNLd3puzT2daO2 +d1slNd21q3Vq66W0Lzd69c6W5u6nNsZ1Y1znvb29u7uUUZduN43PEx7e53lt +7la8G7s921c25p12w6rm7lY6u47XVOm67ta21llbZEk6Vutmatp1zeLu8UVa +7ddZzr30A7sBwhKhSQAEt332bdbtZKyvGvlVRQXvYHQAAACqN9X20+3vhe9h +xAA971r6vdPjXfd56oAAAB96++1XgF8MH3Z0oA7777u6PHxQpEFCUfQAwIAA +ABIAe+r5rg8WRkAYHTfXXQB9y6m4N7AAmuxvHcrs90AAHyKAAPfeqi+NXbue +zs5pRg9N7AAAB7uh7xrQAA7z3o8PoHQAAADjyPve9ruAAAAA9z1t7LzodmAA +fbnzTD7vvOnvbwAHoAAADt72tPPqURQrfYB0AAAAAAG+99dO98BCfYPmwA5F +AAAAM+qevtu8AAe7plvV4F7h7l7V6wt1e67vevbU97vLrwHtg9rz3W2XZ2pj +u2u2xardsy1c2665VcYtld5zdWebNt24t2di3Q4tnc7cXZkWmattu7p0XNuZ +ObBbm7tputylKdbnW6rO23c6ark64my3VzNrY2trKaq2tDCM7m5t3cru7W1z +drao3WTuXV3bFtiTttGqWZQp1cY6pq11VTsrZnZ3a5u7bamzrlXbrp1bOu5n +TrorlZtMu67uOt1dnOqgmkTPXkPN7uLud226q2u7dTk63a2lNi63e7tb17tt +tjWzs521dSzsrrveOVDtWI3tXE7cnDTu2bVSS7Vu7XaO267tdru6HbTu7pd3 +GrdVwZWYXc7N3bu3HRpq2bHdjTQd2duy4NZU2rattrUrY2bau7OjZXZc7dx0 +tHXdm7O2NVJ0M7ZrUpo93uGUaZtgNtW2bbGPLdrRV2dNzcW2Vu3FyrFHbdh2 +67tb3nF2m9Zlu7Ku0il2MHLXW7G67trSO6tDjtWHFl07l27hpu2la6W7glUu +d1urVt3dubdN2qomxq3dylSlK2YHVa7d2Lu50xaad25ul1K67S1q0O3dRjN1 +u1GWVOR3Y9tHbPItru3SbOuqNKo3Wbau3W4d3dt1qpXNdu4qV26lzXc6ldut +Yu7Wzszoqqq7HRXZu7nWzas7Tu723W3t0cg66pcYtjJrbVXbo6usqdo67Zxr +q527rF2G2l1c2m1tmZ2267tttqrsuw11iltottbXU7ttFyd3dtpm1sm0UbKr +u0N02eFUIAAAAAAAAAAAjABMEwAJgmJgCYJhMJkwmUzAmmJpgAmEwAAAAAAA +AAAAUKqZAAAAAAAAAAAAFPAAAAAAAAAAAA0AAAAAAATCp+BMjAmmTTJoZGEy +YmTEoVRTAAAAAAAAAAAA0AAAAAAAA0AAEMExMAJgBNMEwE0xT2gEGBMJhMBM +ExMVP0xUIlCABhADQAANAAAABMTTAVT/TAEyMmmTCYmjCaYIwBNMTTJgmmEa +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 +aparURjVMkqU1CmXySEIsvoGopgsO2DUkWNqZCVCpAE6d07iTJ07p3GcB7nm +fsenlZK63fUUQ+ursijpKhrEzSBJCKS4kVHiNbO7qap5EmGESnpa01l62rL0 +pBVIlKVSYqoq6etLMwQJk9VVPaqraYpNBNMVmJtWlitGGKiETWjkM9R5s9a1 +ilKTNXqlZ3soirMElay9VV1Noh0VrKq9ppSbS6h4dUYZqVhEqlXUqrS8O9oe +lopV6PWFaWUUdykFXALWcVLTLVStaaRS1YpE2mUnqpHu71vR7l3d63R6v/nn +RH/z5Zz9FH3Xdd9wW6dp3mHst0fEW236X6bJoxAFnI8NR2O1+IrzN3AfIpPg +an7v2fL/E3jyu2/T6H/neCoplJ/aUAiPscNuDjx38N32Pj+2wArt3c0qgHWK +IEVflHqsf0+699i3//eN1Xtfeb18rSfn8ziSumo4bgf4W9dy/f8X3vtPqYb4 +H14bn+nls/4+2uBRA5vaum8tdrInyfJ67c7v7/N7Tobt6KEjlDxAKq5GJvbs +gBssxPoNVWSD2oKDn+gYGRJJ0eH+4xKeFiW0MSeVwM7BQgPC45X46Ia+i9xB +JkodP0GgkopOjvkF01jv5JmQ4QNUL+RwwYfS16A4VoNXEqeMiwSAL4f8vZ7l +8Hzn9dy9N4jHPVXe6sa/W8jbuvAdv+b4V+1iAL2vQ7X8nk8BxSAobX7XqLRN +o1GB8jD13m8P2OH5HK+rm7LvPu8vrPtabxucZkMf99PzAoAegWpmQwBiRmYc +PFmWz/3A27vEwFgrNifCHWYWZQc1uGRABQFGW+BbZe/dyAOvxW6Ky/xn0USG +Y1eDwYzEFB3WfecCAPg7n0MIAVggd6QIYRNOOK4hT8hMST50qD00Hf9BX1JH +nzEEg4Ch3+mrEP4wgA4kiAoGHssA9/CMPiF9oCgK3OMbgCAFR7Cgdq8K8z32 +staf8nqvTfosdxJ/301g9z52jZa0pNbk12cOX/duXlbn10Px+sp7T0MAAcIG +W4kf/NNU1D/LlGHgcbwdHCAd8dLQY18tDn8sPQO/mcSMsJLyC3mKnZb9mjvO +No+Pv9/jnWxEBfVeJ7exwU+dwmks6jqfPW9lD9Hz/+fQuO38B6DYqD5DLyDy +CqVkTpJLq9L9Q4PnseUcFXHPo4REYEFrDQLBghZYwS9+V1Y9mXgOZnJffrwP +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 +aY02tNNk+mOzdbXOfftNnyUm6fPu9ZS4bnprbjvpWf9vDPHdVb88VpxLev35 +rPLnameQ6LhRgRANjeC93nxnCFG8L2SciN25ecXNeAzG22O/0v6AjnloxXnd +Kt5dQ1OlEhJa31XafIqHifaig/lyB1w0319ue6mElJPPnV8zdrWmZsjTqUuQ +6vwSaYVK8J78jxLJr96/CuPEF6rwKAsEMZ1igQkRIRKt8Xk8RsTFxZUuChJL +ydTZoEIP/rhAMYhua6NsRaYLb+76xi2mPXHubP4a6N+vq7WdD2pBRP3gFB++ +uY/cj8Z1wV5ER1fi62+CIs1u6WGsbJKWLoPsIw0chbYGjtu6dA36fHjwTRdU +04AmnXggE/vDPeNPK7NZM7KT4WaSvMrW6aJf+/Iv0ir6S6tKf4Rp00G3IrUu +vXOYe+vknzvRZSrpaPUmYizqA3bh+jgm8R14i1dxK4pp5vjimswVo3XPhO/G +YR2W7ne0sUBLkxHiXUhvF7fWkOpON8VjFnubdmsY1+yvp1LIYHj91/yg5HRH +jH3tHPdT6XsX9EjZWJ0tRqYpFc82AmzJmMAsGUQ4YNwRheVDisaIqKhtHaGI +hoCI9DM0eWo1SYdWf62RgZxmVFa93SvFKPcsnqTKtSIspd5qitYt9F/A/qfE +9R9X+3+6/0/0POe7/r/D/c/WKHAteBFd9JrGk1qmFRSKBQwApWGAAMAAcGCh +gNtHUNN9dpuzRWovlLc38vJT7/tJG3wX16wUls5NX8wQy2JbJd+r1Z35U2p3 +UgicvcwPFLQ7K7crlD2KRMdoaMFRwBAB5JBqElTjLzvvQex7Lxu1/87ntcru +sg5WeEurYcnfd8eYM+/RYrWTR2VHvlZzm+QqyKFS1K5krX/M4wOkBD4qVw8C +kqCC9hD+YELUZJnDQvYkfJfBQwfJE4CxU2EXCShitbFMTfFs1wI/Y+s978uv +3vxX131Hyv133/nv09u4HlvN8j0nr/Q+5+bkfL1g6s1pqYGr12uL9dL8FX36 +6Esa/FfeY0wUr1pVXsWBvwP9H9T/x8p8n8X+fu04LXXjx4cOPms4MYxXOc5z +jNK2rTOcZz739x9r6P0eu8N20bC+t909eJURHum90034X4NNY/Rzr59/P9Vn ++Gwqw2n/xgZsIZi6GZmBu1RVvM7NXGk8eXTluX49tY94rk8jo2d8y7d6Nfhq +0imKyNp7FO19+Mktx6O9bRbqffupHXzVNOla0/fcJXe9/r0TGaGZeIfRzqbl +3FzOlN/8zG9Ebc77jGanZBnpr8bTU+iB9iOTnFuW+nfNnO4rYfotu7iOHVHd +ubd1dVcnLfs7a2ELcHKI5NXsid/Xvbdv8QYAZsbrLOI7dOPPnp/i/MbTdVz5 +T4Pfpu49bN1sdjdlCjR2NGlOXcrMzPc7pHVV6dcz/p2734X7HZusuPLojHGN +4RyTS28pjKzzbpjUYAZuWlpxW/Tbvd7qyRo5u4OUDSO6DX26vC+/o/F304pk +2g65txbdU3bOzaJtN70tR8Xjjrxxz4a/1/Qeuux3uetnB9wjiV5t29arz6vB +PX1zGX5xXq239rBtw69//lG2rs93hyhybPG2JTjPYocmpThwpXly39u/k52l +Q0sLTEabFxmddCG/GwuKHPOwA2Ojg8PAKxo4aVGg4YSU5Fx7pKCfAVSvA+NZ +M6c61mhi1B1jo6Tu5M53EFWg3UX5B+W/vzOzPemMkDlkiFsmzGlc709K2KlY +Fulmi2s37J/xW/kj5Z+uRn+ZwATe4gKW9Ow+ubYutohCHOrqNKhzgwuAJL8W +Ff/353uHqOxh6jz3Dfx5b16m1LUml+4/ou17d5ZMYm/NLT2WOrfp1/Kp71xP +DdXTudznwfTgv/Facp1aNZtt5zd+d7/x6cej6Py9NWm7n6n/ce28/999p/g+ +j9b+D+dN7HXi1FltCAjYVucAwOTOnXnS9iynUcsbE8kP4LuKY7EYdmiKVPHE +7/m7GvtLlT8ioWPCLejxBF97rb6oQN1qiRsns6n/Ie+0FJmzpfcUin/otPie +NeMWDlTRMf6SM3AeK/A/DQfQUUNreBIof+6t2hC8Ctrin1wHUqOrs3cqNPFX +J/yLxH3WVd7WrLY8LnrETSgmnCELo4RfT5q70Reu8KvNcAPekIIJPk8yt+0Y +Uvrrhb28rT6YuQl4H9qnahb+Hq9JT0UZO1wC6m4DNAdBn+zv3wLuocG/3Sh7 +NRlBcc0rhrpm//mq0Qdwxk8jHEu33T/MYPyBSEKp3DzUiyySB2dLPmRNplx5 +FlpUyitrUG10aPxrECM4C2tCfl1u4z2EMmX5DjfrAwXXla464la0Az8dRmNZ +kEs+DyFYJ+7tQ0bhMFiL/Cp0GIIl0iJIRizi7iXysiiHOc8KsrZ8QrhDYS72 +NGehbtW0bP7pbogLK5MrKKbG0accyRTOjDsD1UDJ+HruwZFa+BdVlZYA1wHJ +/xXJpMOUh3iGSmnwUVkdCpJlmZJMMUpUpYJTvSXd3rabWpSq2+F/S29f7yf/ +X4j6fh9l6j+b+L/V/j9//P9j5r/5/OX3x6WmBS/YiIXzovr3rq+j7jKU6l/9 +WcXTkUojmqUP2U1C1eZuSdYR1EROeNjF3/I0a6EY+id8B+cwA7/tvl/o/o5+ +1/8/SekxP2X6tJ+JsvS934mhGDWNL41oyPS0xUvTN3iuFig8CelP6Ds56Vqm +zZa7Q1JNCxBgqFRxzQsXNTBg2LmS5JQhxQK6UVjNqifImKCgiKAEhUUAg+xY +ehaa0uoKr+NxMCjTE4bNbvPE88TkOlcHKdJaWAEQhabFYC8PK0rDryhXx7TW +l1BN3pFAYqiBePe1T2P+v5iger10veKbZ22968xm5fOL4xjOcZibTnN85zrp +f65i/mItrEAiDRs6zDGjfjm03Zj0SZhmMobludv9vT42PWvwi+r8Oj8f0L7+ +WOHPoccuG55NBbPno1Bgpu1gZg6eicYGtnGssMzY4dIZmaF3+p2aNbYeY269 +1p+R/Kg5zdPGBp3q7gjm80ijc21wQM3C1lAMSdT37eWvZQYAZlNuZpruty57 +ttT2v8W8ri+2eau1SixKRbmyhds8DYejPGHrij6TKcOBF/sG7Y+2+n9z268c +bHIc230YRo9nZ7V5Nwerj3fvtD84G7NnauuSG8RNtV2tGLy3Skvp57vGvf63 +L4toc21SWu8pXi3P+BtFejWBgBms0prU5U1ivSzdxVo7BwTcePcOvpy3+N26 +9Z1j7kMW3UGTcWwg6NPBu39C/Lq8PZuro9rLlRq9nYS/Dw7929py+0cjdH9b +d+btbS4dNOrRFWldKj6v1NR+3e2O9tDdSbHZrSm8M843YbrOam3dAGbHbtvj +j7j+zv5IMl2r1yNieHU3FueH25vvjF546U3a7uqI7n8H2v3nVy5M1mzqcObd +zfbdflybtrXq6qNbdP7PcZUtkX67Fm28Z1WSgGj1xiwY1aGgaqXYtv9t6f6v +Wf03jxfrfNeD2X2PG918P4zD1RKvpz1+N2xTOPYEvjIleNRGG1f7YvXvLOaF +AfglNAMYeu3vr5EqxYe7EulyMG9yEDRV2PoexQyjjRtQTxkdanQiFzrbrAgK +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 +oSzv4BJQ0XXNKRRYeDEYGgoWMICQSzfTV/Q7ki3w1Vb3qqN1seZn5ZWLOIfL +XNZStg0M8iBAtTCyi85c46TXSyE/zFNLkVP/vYODVHJWHARAFC18KLu88DEn +Tt49GJtxp0mSWrZfpP+n167pTRVvrHZ9dgujsecyneZQbr1giju1qew2oj0i +7sg7XKSzkxdfGy3VryglMoTP1aD4UvcTnqyyAqj4iP14RObcgbf8OcD8jwX4 +gChYyrKbdAcB12N9wcZ2GxvKSw22fMP4GMq/wt+aFjPJw/E78weHVUosshao +uu4gkmkRZOp4WeHAuBzjSEU03B9/gaIKP/s5/NKzAyoxtYaVWKI3QRuYQABV +CNucN53QOszG2vkiQxNat+FHKzfHTDWCAsxdF6o4A59WjwrrxPU1cWEK23LJ +Lpj/HRjKf3VLc8AGBiFKCBOdD9eNc7Ui/6+JCHnfUP0cKz+XEd63z9UoAIWC +7meqh8wP8tCpkWCaMMZu270yiyEgWOkp5MVlnLnh2kfM+sHvWS66pH8QVbG2 +nvtkbfx7MUszyeOBCE2IMsekGdmrZuA3hPYn4d0C0U2Sn6Skg1Y3EjZJantO +NNulePlgu8hufxtL9f6JXEHwRodXqhtMoS794lnBHR80nXT+xaq2xiCKkl0I +4iKg5mGQy3hZCxjLgn6EbfoL7JGOOzBGY6F78S+P/48PYMeVd3xx9vOy59cl +m5Te6hUrwsGThORTXjrpFRaMX02j3/EbVqR0eVbBVRlar6s2ZqcB2bAXNaWe +P8NluYmW3Xjjv7m8JNtRnv5NTE0tnVJIVel7ktsni2Y1ubS0lxHooBy3Vzcx +7dPOj/OEdIwnLKRxTlWgsSmBuAAAAEt3BgAAACBm8PoAICiEAcUb3CA19nuW +Ch3/cBKSWLaJ/o8D3yQ0J3sdgcKaEd7Z02qlUI/ZKqB7YbQCszt8QHwpRM9r +p6yXt9ra80gi9d5mp28jUgDAQE082xbIy4/38rEVQKcn/uoY14QJdvhx1LnC +xCrIMDeqEU/ZeB6PevBXI2MZBC7mYvvv5KumwUc25JL/dHMvAzZhgEVQAAAC +iXu1NUcC3/O+2PVdeO2rk65abmEXliVZwDGg21GLscgn3PHE4D41DvWn3eQs +34hAIADfpeWLOWS3+Z+Rz5DnuHLNbQ++nLPIX1pFYxD2eLOW3cBqChZlX+wR +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 +s2cU46aHw4i3fNN5/WBRiZBlaJXqmuFrHEaMV8w1+2i7+NtwWD9IeH73a7cI +hw67037Jd9vIpB5X77/SOPYQisgyza/I/PNAXkofpxSjVQYMr2sWIi6f5D0S +D0sSsUtwmaIsnfX2uV/OM19G69XUSJ0hv7WhCyfMAQCAA9MjHHvI3vPaZshC +s9t/eJi88nOP+Noa+tsjeqGCjelKaI9l6YPM04Cv1+f+GLDHoLsx+Csk3/BE +4quhEU2N7IPkzPtUkRQl/xCCOE4lZjpHIt1yvJ6FnwrP1i+yGD+sgmUz8JFV +WquAYt4BEDBXx/xNUbq5Hb6uMPVmkT7ZxNZeJpWO4HYUlAUKBTbgocoMfWsT +6K6tM+S4f2d1uiSnBWy1ynOfJP4Z7aNbIRJZ5tEdRDbHBQPqYHWyJIwyWiOW +NbxPOn8Spiz2K8i4jjn96cz5y6v8oKZo80xJ+xt3/5MZWNdOrBYB/dRtpDS5 +c9HsMbjTfCwjHusiFBz2zv0Mk2UJ7CseFLJmVGEzv7bwXbA8b7ZT80/rIXcd +rCew2i5XDAWifLOiVcSJGgWpTZ24GqHJlj2OXibFbtodk4kbZvgf8yyU1KS9 +pRurpVDNRkKOVDxlh0axP7Vq00tSGoO84bKec/27jYhlIsQx9UWtOg4hYwx7 +vCPUqs33IeKmZ+nQksU8tInx07r2GIYaTcd2yyTOABzjYh4+0TCl0SeXkDRV +aab/CaI3s1Xyw2FSEfEFjzhugI1n7546hj4l6vxIqbr1GwBUn0vRLQl3fPVb +LZjlo+TaaFpyviQAfjFYsJDwjSKJjhlm3YjhZ4J8ooLkrncmPFX/PnBjJf5C +g9aee15n8fH7pNHEVnbvL947KYrSQBAY54AxLqopiG/zy47/g7GmxM066GAX +IGjvmFJMmQ56iAMDEXC053/kSoSypYqZqb7Nrs4JV+K7WPmMmrfLsjlDrS7A +hXJNnlend2xHgU+IOL+/iEVAzWsjnabyrmF9lAABI5jg+Y1wPrUW9U4wwYVn +F4qm/GId/vXffxDmcqxFD5tH9cZ2GnW2C7SWtx+nFaLNL5DKasVPXEAwqFFP +gEBOPl+7WvXAPi4GbvsVNtphIWa8j8+7hF+oo5+WhIncUhSG2BEcRG09pXw5 +awORj/XkSNikGYUZ68S1O05Srj8U/0CnSQX+ZkyjGM3fDFLgrXDgghBO4Hx6 +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 +HOk9GX0+R08eo9NjvDjyXJVuoQ9jShS5HC2ra5qeMM+tG/Lktwq//l/gLkNb +k212pWo6zraf5OmVIsNjw1sytf0hymQWyB/iIW4qzcjKVzgYJLUeWdoOHlqq +mMmDpW9whljdwLsJfFR9U+XMq+gQEhrZNS6s1VJEz5ACVpHkc3fGiHel1C6u +BOh0dPa5VBp6hs7C3y1V1rdmuYnNGKJkyuUOI4vPJ9WDwbW1rVLIrSIsMRQI +GS/1o7zH1HRhsR8Pbz6xp78Jx48o/rAHsj4DS/J1XYVYa1KrHn0DB4hi6bwj +bF+H/8/bdLFjwEWwohmaWDyw/35vTOhMy74To/ly7cHFDo/rR1KhnyVPgXvZ ++dgaFYtWOiNXImyqQML+jvmSMJbFDvWu37mcIJEIiUmUH/g8f9xYSt07hhgO +QlXVr4o5rYzEPOWXilcPGp8ZjOVJ1Qw2OqmFGnjaWAACqMcQOJ6CfgKKGOiq +STETalPm5hsclFOFQt4HycMKWaChXxVYt0iubeYr4N89PBhj9gW3su05irl7 +2WkVbKf8liHLIWqyRvCYXux8JLGYaAxHuv20aku51yTtHie/hees6XuYgwBt +ASHkaxUD2qHM5yMoxcFoPKoDIlZVJPuZX7FtNodVklsn5+Qik2sE52e21qes +Xhrev4dQrN5IO8qPoI+D2V1M9rHoihjKtGpOS+Jt/2u6w8jXNeYtMmlkjSjx +8B2ijOPXij9lH3r9OobY/Egp0K7SB29Snr2/E0UYopXpUR517YWeYt/7IN9F +A8JNCKxwoRkyGyuCfpYOmYkYhyi+IN9eu85fdRhb6E+mMZftTsBqslaoyKgK +sGVVv3WqnoZETK8JwoXXO97eddpdiKS7YWkNpTegfLDUzcNhxvWl5nl3mzri +XxYZJ7ZT6EZ9U/ycs1h46xgdu4uj1w0qKCZN6J2fgv+hzHGfElLvzoqgy9WR +xTerJ1cbvvlBMaFYz0GXB8eOtsaSjdFlnYZON/5sIBWmZVTPbNZC6rtJ2Lab +5NoZnTUETxM5+eieIyiUFdjC+gXyAFXzX+jgeqQ0wJ4SqNHqdg9o+m7aQZqK +FmMvUz80EVnuvAQNAQs2mrWsFhMPjyFUCpiA8YmxVK8pFcPSUSXSLCZxKMvf +6sI7k0m0j07P1eN2ycuMYtbzmwzEbWP1Q+sAmdW7Pfx944PA1z/mXOxLPSac +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 +pjCFQxNkxrT/ze3q/8d+l2nnKdzxdCuio2h6OEABe4UuMQwBPAScwgANdOKY +UeAcqBIWYHir9kcKFZC7Z/6+4vLGiJoiNLzDulwIBBZJsboNGUJ43AHhw5Vd +G5CN0VorEI/zxu9Ie+UeqbNFgTOg7h1Jv7cxXAZz6ONiy8gLRgklPHCqXUKC +3aSOr86J+cmWH7zIuV4xj8JJiQDvQLn6C8tUc3Mmizy1fKG7lnC49G3/pY+i +59lBhpt/iNRv7YpISbSn3zgndMxZqSkifsmEWiNFk9GeSd4nsUZc2Li5HCEv +gdK+KJLR+2agSp2AUqFhNojiUbH9HXvZTxjTk+AnPpkI77Q7isgUzlv9w58n +7cOHu7cJ50orKfY5yPltIKTm/zepP9CF5zbTP9pp33vuR+tsYlAnXUuZGexe +rs8ZZxzP4GoSsK7klg+nLrX37y+TU5SIC416sHxz9jRvDg3oLqW4Gm+Wc1qW +Jq880nGm6n6eSZSX5LXpDm13MY/IWBWrM5WYYK1tfLjniN5h0ouU2LDL+Fgj +MR9OpbAyUHXr+ZvjVNrjRRQQ+ydgaEp8VBR6YfHlhbacY+0qUAONTp9qhftP +mpZgOw/03hlNs6Z99S2xRHlZgto95HtCRhWUxPF8DsS8B5diEpVJ5vtqJt4K +57TiJeMYBMOI0NRzgnut/pAwtw/fMGlS3BKefNm7mukvknL06OFUPjlAya/6 +EHKJyTj3OzCtdAOiaXxANCCNtzE2B6ur7DyT8+HLP81lvWndRAef6V7D0WIj +n2XMsIYxsdpjgn0mKFZzsZqrlMmJh4d/Tkz8ps7D+TU0Vt1+LKzIXOmO43+Z +43lsJNxYgyqkoeWmT3cJasffLQ26YTvYScBQg7bPZylDo/SKFKdBjY3yr5YQ +1DWWeF9+h/g4MaSo2xbnpQP3DCUnTEuRgqvoJHd2SFVVPPGb/zMVDECHv/jR +eh6MCMR9oB6sM0eV5067NQ2KNeHnygSJxiOyKgGDArRGOHnOiytFTkvdJrzK +N0qROz6eGNrD52zRp0NO1hVGJe/YFLBHt/S/18porDk7FGi1WFlMVItlM+8w +JS4Yy2oImO0JzAVp27/am2lNNly/lVWpt8o3Q1utipyblU0u/w8YHC2xA2bC +e4rSQVrIlG+4icfAWwrhHe+DknfxOVblyhAwh3JboIzbnTw91YbdqMSoPP+x +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 +NqONODwvc5evDK7r04CW0+XarCe3FUqnwFRu8n7Dyskt210+cz7q235UEfhB +Kvx4eF0kYgrtSyWmmrJkaFmXp5a8UZQDcSPjSqm+M4wt++seb+JV9rBNCrm9 +lL1YlcZ4h6dqBswxF/IncumkQgJ+fyeGg/r3Iqzby4ho1WUMT9IBT+XzIuU0 +umFdLQqLRu2SW2TJoePhpIa69bMVQY43cewsgAef3/3Xg1H4zE49l6iuuDBr +VrsoBx/yqcLZsz+boG0fIk1PDCRnvxUYjzyLJkd2MH+cWtfdwVDuUkKqa/uQ +eIvxuoX5SD87Mf2foxFYb5HzphEBhcXU0ZBLZkDcqJiZ14NIUfUqxTNEhYW6 +hQddUcYmTvrqCBy1rhA+C2qmj7hqXrjm/4Gp/QTfJXd3I3SKiRJxz3vfU9f2 +fa72rsavEidJm/6Nq0c1m+dF/UCZVQpUqkGzCh8VHzfTkkTrClXq9PoWaWTb +U07vmtvlW8ILDFXjnBSIaN4gZSfkjCQIS0lktPwgaVvrT4jhI1Lok8UwSs+Q +bdP8eym+RJxITr9UTiKttjVGWnwu12UDxJRp18d0v91XOxZCt5U+HESNFh2w +rwelC0JJYnmMP+d8GYPUyZj/zWZhGsOVgyTYiOXCC426/jLC072bs3tyu+KX +u6hnBlPdAMVJ5XLwfcEVkn3L8kjyEHp6jyhOwaBqKlIyBx6fy7Tv2LKz3akR +FKqyG110Z7r3Qgb4kfYMns5322SerEow47p0x6RDhWZnhwy87hgiczpVlEZH +I31+1mhDQsuz9X6Q4fJUCrd+6eN8FCgsBwnoIaigdaX+cnZ03paRLG2QjBQR +0jnq3HlwcoSe4bDaGt+LKzKV792jqoZfimSLFdPLyqvzxSbh07cLR8PbJdS+ +HNVsV7JXwfgnV/aXQxvjUObRJxIro0ZoXqvrOvXl3gb8ZagU6RXTUA+2dv4j +pGJIh7l95p4MchrskHjtnClhzr9u0x1YJ5kc+QO7aedPuS1w/ZhaX/jDqaUi +MZFzWXNJDUbZy5s4vc+TMjfUIplTwGC1n9Y/oneN95mxr/3A4kE9LK0I6yq5 +Je7uhqk4KMwSZ6mp20+RvcKf3ZvSRPqyOs6dWG8i1TBrRZMGDZxPJ8yN3164 +Op+nhS9sG1ppdJMpSaDZCVDTTWWAaHaw3paf/I6DZuleoKR1VwLTs9eo14xc +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 +lURzjD0RcK7FaAp/5r8aGbb6cqNSEjV2gOCBAgGGQl3rZFPb0SqOgQdb9fV5 +bTCvnj5TuomRBAWlJ41GI+CJlxtRiZeX+2yucW7LwOhpV0oGEscrIv0c9esR +2ad50ayiQd61ohNbt0sH5a8GeK0gJUPJ1zC4soGRU9otfsFlsOkaJcG/v1Rv +IZFBU3ceunFMpcdlKJTdeOufnaXpUWDsgQJHI2d0W9X9tEWAIAEw9saorubY +vSbymYzMiwA4AA6vJCivVXUSWZmWKVAUEgO5kzmfTLhHEEjvlZ3P/mcPWPig +6cfAADV80Q75RWBj5RoT4VV4fL/3e5mS4Xi/ZUQ4cZq10IafAQfLDx5GajvW +5Ro5S6v6l0MQgAndH1HsW0Nm89Ti1hr00OAesf8/9UcN/3mjAvkX/5VV/gqP ++iryargtwctSRFGLdIlHMKs7AAHHW9t/7WERAAD4h5u3ZuVQFbpVjFVMnAGA +CEvs0OBn8UZYdhegvazkqPUTOasgVPIgfuz1/cpnTVRtDO7b/C7PIxDvdAqv ++iaABc0e0UscG5BBPSVUI941t3NX/J73q2GQNYSyZWvn55lB4AnLtImMpCoz +u99rSiAcHByKIKdJtCc8i7oqCmZ9V/fqd5+36nx/D/y3vh9oy+g4zI7nmOlw +KnfgsGESAs/BD3lhBoEYQSIkAgEU/9ETyHMKIH/8XckU4UJBYh374A== +==== --- gcc-3.4-3.4.2.orig/debian/patches/hppa-libjava.dpatch +++ gcc-3.4-3.4.2/debian/patches/hppa-libjava.dpatch @@ -0,0 +1,142 @@ +#! /bin/sh -e + +# All lines beginning with `# DPATCH:' are a description of the patch. +# DP: Enable libjava support for hppa + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2004-02-10 Randolph Chung + + * configure.in: Build java for hppa target. + * libjava/configure.host (hppa-*): Add target. + * libjava/sysdeps/pa/lock.h: New file. + +diff -uNr src.orig/configure.in src/configure.in +--- src.orig/configure.in 2004-02-11 21:34:27.418499952 -0800 ++++ src/configure.in 2004-02-11 21:37:17.619625448 -0800 +@@ -487,7 +487,6 @@ + hppa*-*-lites* | \ + hppa*-*-openbsd* | \ + hppa*64*-*-*) +- noconfigdirs="$noconfigdirs ${libgcj}" + # Do configure ld/binutils/gas for this case. + ;; + hppa*-*-*) +diff -uNr src.orig/libjava/configure.host src/libjava/configure.host +--- src.orig/libjava/configure.host 2004-02-11 21:34:26.638618512 -0800 ++++ src/libjava/configure.host 2004-02-11 21:38:59.687108832 -0800 +@@ -115,6 +115,11 @@ + enable_hash_synchronization_default=yes + IEEESPEC=-mieee + ;; ++ hppa-*) ++ sysdeps_dir=pa ++ libgcj_interpreter=yes ++ enable_hash_synchronization_default=yes ++ ;; + powerpc64*-*) + sysdeps_dir=powerpc + libgcj_interpreter=yes +diff -uNr src.orig/libjava/sysdep/pa/locks.h src/libjava/sysdep/pa/locks.h +--- src.orig/libjava/sysdep/pa/locks.h 1969-12-31 16:00:00.000000000 -0800 ++++ src/libjava/sysdep/pa/locks.h 2004-02-11 21:40:03.542401352 -0800 +@@ -0,0 +1,78 @@ ++// locks.h - Thread synchronization primitives. PARISC implementation. ++ ++/* Copyright (C) 2002 Free Software Foundation ++ ++ This file is part of libgcj. ++ ++This software is copyrighted work licensed under the terms of the ++Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ++details. */ ++ ++#ifndef __SYSDEP_LOCKS_H__ ++#define __SYSDEP_LOCKS_H__ ++ ++typedef size_t obj_addr_t; /* Integer type big enough for object */ ++ /* address. */ ++ ++// Atomically replace *addr by new_val if it was initially equal to old. ++// Return true if the comparison succeeded. ++// Assumed to have acquire semantics, i.e. later memory operations ++// cannot execute before the compare_and_swap finishes. ++inline static bool ++compare_and_swap(volatile obj_addr_t *addr, ++ obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ /* FIXME: not atomic */ ++ obj_addr_t prev; ++ ++ if ((prev = *addr) == old) ++ { ++ *addr = new_val; ++ return true; ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++// Set *addr to new_val with release semantics, i.e. making sure ++// that prior loads and stores complete before this ++// assignment. ++inline static void ++release_set(volatile obj_addr_t *addr, obj_addr_t new_val) ++{ ++ __asm__ __volatile__(" " : : : "memory"); ++ *(addr) = new_val; ++} ++ ++// Compare_and_swap with release semantics instead of acquire semantics. ++// On many architecture, the operation makes both guarantees, so the ++// implementation can be the same. ++inline static bool ++compare_and_swap_release(volatile obj_addr_t *addr, ++ obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ return compare_and_swap(addr, old, new_val); ++} ++ ++// Ensure that subsequent instructions do not execute on stale ++// data that was loaded from memory before the barrier. ++inline static void ++read_barrier() ++{ ++ __asm__ __volatile__(" " : : : "memory"); ++} ++ ++// Ensure that prior stores to memory are completed with respect to other ++// processors. ++inline static void ++write_barrier() ++{ ++ __asm__ __volatile__(" " : : : "memory"); ++} ++ ++#endif ++ --- gcc-3.4-3.4.2.orig/debian/patches/gccbug-manpage.dpatch +++ gcc-3.4-3.4.2/debian/patches/gccbug-manpage.dpatch @@ -0,0 +1,184 @@ +#! /bin/sh -e + +# DP: add gccbug(1) manpage + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2003-03-11 Matthias Klose + + * Makefile.in (generated-manpages): Add $(docdir)/gccbug.1. + ($(docdir)/gccbug.1): Build from doc/bugreport.texi, + (maintainer-clean): Remove gccbug.1, + (install-man): Install gccbug.1. + * doc/bugreport.texi: Add manpage sections for gccbug(1). + (contributed by Omni Flux ). + Do not document options possibly unsupported by a future BTS. + * doc/.cvsignore: Add gccbug.1. + + +--- gcc/Makefile.in~ 2003-03-02 13:49:32.000000000 +0100 ++++ gcc/Makefile.in 2003-03-03 23:13:21.000000000 +0100 +@@ -2541,6 +2541,7 @@ + $(TEXI2DVI) -I $(docdir) -I $(docdir)/include $(docdir)/cppinternals.texi + + generated-manpages: $(docdir)/gcov.1 $(docdir)/cpp.1 $(docdir)/gcc.1 \ ++ $(docdir)/gccbug.1 \ + $(docdir)/gfdl.7 $(docdir)/gpl.7 $(docdir)/fsf-funding.7 \ + lang.generated-manpages + +@@ -2570,6 +2571,14 @@ + (rm -f $(docdir)/gcc.1.T$$$$ && exit 1) + -rm -f gcc.pod + ++$(docdir)/gccbug.1: $(docdir)/bugreport.texi ++ $(STAMP) $(docdir)/gccbug.1 ++ -$(TEXI2POD) $(docdir)/bugreport.texi > gccbug.pod ++ -($(POD2MAN) --section=1 gccbug.pod > $(docdir)/gccbug.1.T$$$$ && \ ++ mv -f $(docdir)/gccbug.1.T$$$$ $(docdir)/gccbug.1) || \ ++ (rm -f $(docdir)/gccbug.1.T$$$$ && exit 1) ++ -rm -f gccbug.pod ++ + $(docdir)/gfdl.7: $(docdir)/include/fdl.texi + $(STAMP) $(docdir)/gfdl.7 + -$(TEXI2POD) $(docdir)/include/fdl.texi > gfdl.pod +@@ -2736,6 +2745,7 @@ + -rm -f $(docdir)/cpp.info* $(docdir)/gcc.info* $(docdir)/gccint.info* + -rm -f $(docdir)/cppinternals.info* + -rm -f $(docdir)/gcov.1 $(docdir)/cpp.1 $(docdir)/gcc.1 ++ -rm -f $(docdir)/gccbug.1 + -rm -f $(docdir)/fsf-funding.7 $(docdir)/gfdl.7 $(docdir)/gpl.7 + # + # Entry points `install' and `uninstall'. +@@ -2893,6 +2903,9 @@ + $(INSTALL_DATA) $(docdir)/gcc.1 $(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext); \ + chmod a-x $(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext); \ + fi ++ -rm -f $(DESTDIR)$(man1dir)/gccbug$(man1ext) ++ -$(INSTALL_DATA) $(docdir)/gccbug.1 $(DESTDIR)$(man1dir)/gccbug$(man1ext) ++ -chmod a-x $(DESTDIR)$(man1dir)/gccbug$(man1ext) + -rm -f $(DESTDIR)$(man1dir)/cpp$(man1ext) + -$(INSTALL_DATA) $(docdir)/cpp.1 $(DESTDIR)$(man1dir)/cpp$(man1ext) + -chmod a-x $(DESTDIR)$(man1dir)/cpp$(man1ext) +@@ -3069,6 +3082,7 @@ + -rm -rf $(DESTDIR)$(bindir)/$(GCOV_INSTALL_NAME)$(exeext) + -rm -rf $(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/$(GCC_CROSS_NAME)$(man1ext) ++ -rm -rf $(DESTDIR)$(man1dir)/gccbug$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/cpp$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/protoize$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/unprotoize$(man1ext) + +--- gcc/doc/bugreport.texi.old 2003-03-13 20:56:48.000000000 +0100 ++++ gcc/doc/bugreport.texi 2003-03-13 20:59:11.000000000 +0100 +@@ -374,6 +374,44 @@ + @section The gccbug script + @cindex gccbug script + ++@ignore ++@c man begin SYNOPSIS ++gccbug ++ [ @option{--cc} @var{mail-address} ] ++ [ @option{--version} ] | [ @option{--help} ] ++@c man end ++@c Set file name and title for the man page. ++@setfilename gccbug ++@settitle Reporting GCC Bugs ++@c man begin SEEALSO ++gcc(1), send-pr(1), send-pr(8), the info entries for @file{gcc} (node Bugs), ++and the online pages at @uref{http://gcc.gnu.org/bugs.html}. ++@c man end ++@c man begin DESCRIPTION ++@command{gccbug} is a version of GNU GNATS send-pr configured for GCC bug ++reporting. ++ ++Invoking @command{gccbug} calls the editor named in your environment ++variable @env{VISUAL} or @env{EDITOR} on a problem report template. ++ ++Your bug reports play an essential role in making GCC reliable. However ++since the maintainers are very overloaded, please first make sure that: ++@itemize @bullet ++@item ++The problem is not already known. See ++@uref{http://gcc.gnu.org/bugs.html#known} for a list of known bugs. ++If it isn't known, then you should report the problem. ++ ++You can browse the bug database for bugs reported at ++@uref{http://gcc.gnu.org/cgi-bin/gnatsweb.pl}. ++ ++@item ++You include the information that makes for fixing the bug. See ++@uref{http://gcc.gnu.org/bugs.html#report} for bug reporting instructions. ++@end itemize ++@c man end ++@end ignore ++ + To simplify creation of bug reports, and to allow better tracking of + reports, we use the GNATS bug tracking system. Part of that system is + the @command{gccbug} script. This is a Unix shell script, so you need a +@@ -382,9 +420,31 @@ + + The gccbug script is derived from send-pr, @pxref{using + send-pr,,Creating new Problem Reports,send-pr,Reporting Problems}. When +-invoked, it starts a text editor so you can fill out the various fields +-of the report. When the you quit the editor, the report is automatically ++invoked, it starts a text editor named in your environment variable ++@env{VISUAL} or @env{EDITOR} so you can fill out the various fields of ++the report. When the you quit the editor, the report is automatically + send to the bug reporting address. + + A number of fields in this bug report form are specific to GCC, and are + explained at @uref{http://gcc.gnu.org/gnats.html}. ++ ++The @command{gccbug} script accepts the following options: ++ ++@c man begin OPTIONS ++@table @gcctabopt ++ ++@item --cc @var{mail-address} ++Specifies the mail-address to which the PR should be carbon-copied. ++ ++@item --version ++Displays the @command{gccbug} version number and a usage summary. No mail ++is sent. ++ ++@item --help ++Displays a usage summary for @command{gccbug}. No mail is sent. ++@end table ++ ++@command{gccbug} has more (undocumented) options, which may be ++unsupported by a future GCC bug tracking system. ++ ++@c man end + +#--- gcc/doc/.cvsignore~ 2002-06-26 20:27:50.000000000 +0200 +#+++ gcc/doc/.cvsignore 2003-03-13 21:07:13.000000000 +0100 +#@@ -4,6 +4,7 @@ +# cpp.info* +# cppinternals.info* +# gcc.1 +#+gccbug.1 +# cpp.1 +# gcov.1 +# gfdl.7 + --- gcc-3.4-3.4.2.orig/debian/patches/gpc-update-makefile.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-update-makefile.dpatch @@ -0,0 +1,61 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/p/Make-lang.in~ 2003-11-20 22:29:18.000000000 +0100 ++++ gcc/p/Make-lang.in 2003-11-20 22:39:58.000000000 +0100 +@@ -562,9 +562,10 @@ + # files (mostly language independent, but some parts require GPC specific + # patches and are rebuilt with -DGPC). + GPC_OBJS=p/parse.o p/declarations.o p/expressions.o p/gpc-lex.o p/lang.o \ +- p/module.o p/objects.o p/options.o p/predef.o p/statements.o p/typecheck.o \ +- p/types.o p/convert.o p/dbxout.o p/dwarf2out.o p/expr.o p/fold-const.o \ +- p/function.o p/integrate.o p/optabs.o p/stor-layout.o p/toplev.o p/tree.o ++ p/module.o p/objects.o p/options.o p/predef.o p/statements.o \ ++ p/typecheck.o p/types.o p/convert.o p/dbxout.o p/dwarf2out.o \ ++ p/expr.o p/fold-const.o p/function.o p/integrate.o p/optabs.o \ ++ p/stor-layout.o p/toplev.o p/tree.o p/stmt.o p/emit-rtl.o + + # Exclude patched files from language-independent object file list. + # Not necessary for gcc-3 since for a library (libbackend.a), the linker does this automatically. +@@ -638,6 +639,9 @@ + p/diagnostic.o: diagnostic.c $(GPC_BE_H) + $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< + ++p/emit-rtl.o: emit-rtl.c $(GPC_BE_H) ++ $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< ++ + p/expr.o: expr.c $(GPC_BE_H) + $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< + +@@ -653,6 +657,9 @@ + p/optabs.o: optabs.c $(GPC_BE_H) + $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< + ++p/stmt.o: stmt.c $(GPC_BE_H) ++ $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< ++ + p/stor-layout.o: stor-layout.c $(GPC_BE_H) + $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< + --- gcc-3.4-3.4.2.orig/debian/patches/arm-gotoff.dpatch +++ gcc-3.4-3.4.2/debian/patches/arm-gotoff.dpatch @@ -0,0 +1,98 @@ +#! /bin/sh -e + +src=gcc +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + src=$3/gcc +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 --fuzz 10 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 --fuzz 10 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: use GOTOFF not GOT relocs for .LCn and other local symbols; +# DP: don't use gotoff for non-static functions, even if defined locally + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/arm/arm.c,v +retrieving revision 1.243.2.5 +diff -u -r1.243.2.5 arm.c +--- gcc/config/arm/arm.c 14 Jun 2003 14:20:53 -0000 1.243.2.5 ++++ gcc/config/arm/arm.c 20 Sep 2003 14:18:02 -0000 +@@ -2364,6 +2364,40 @@ + return 1; + } + ++/* Return true if OP is a symbolic operand that resolves locally. */ ++ ++static int ++local_symbolic_operand (op, mode) ++ rtx op; ++ enum machine_mode mode ATTRIBUTE_UNUSED; ++{ ++ if (GET_CODE (op) == CONST ++ && GET_CODE (XEXP (op, 0)) == PLUS ++ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT) ++ op = XEXP (XEXP (op, 0), 0); ++ ++ if (GET_CODE (op) == LABEL_REF) ++ return 1; ++ ++ if (GET_CODE (op) != SYMBOL_REF) ++ return 0; ++ ++ /* These we've been told are local by varasm and encode_section_info ++ respectively. */ ++ if (CONSTANT_POOL_ADDRESS_P (op) || SYMBOL_REF_FLAG (op)) ++ return 1; ++ ++ /* There is, however, a not insubstantial body of code in the rest of ++ the compiler that assumes it can just stick the results of ++ ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */ ++ /* ??? This is a hack. Should update the body of the compiler to ++ always create a DECL an invoke targetm.encode_section_info. */ ++ if (strncmp (XSTR (op, 0), ".L", 2) == 0) ++ return 1; ++ ++ return 0; ++} ++ + rtx + legitimize_pic_address (orig, mode, reg) + rtx orig; +@@ -2404,10 +2438,7 @@ + else + emit_insn (gen_pic_load_addr_thumb (address, orig)); + +- if ((GET_CODE (orig) == LABEL_REF +- || (GET_CODE (orig) == SYMBOL_REF && +- ENCODED_SHORT_CALL_ATTR_P (XSTR (orig, 0)))) +- && NEED_GOT_RELOC) ++ if (local_symbolic_operand (orig, Pmode) && NEED_GOT_RELOC) + pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, address); + else + { +@@ -8804,11 +8835,7 @@ + if (NEED_GOT_RELOC && flag_pic && making_const_table && + (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)) + { +- if (GET_CODE (x) == SYMBOL_REF +- && (CONSTANT_POOL_ADDRESS_P (x) +- || ENCODED_SHORT_CALL_ATTR_P (XSTR (x, 0)))) +- fputs ("(GOTOFF)", asm_out_file); +- else if (GET_CODE (x) == LABEL_REF) ++ if (local_symbolic_operand (x, Pmode)) + fputs ("(GOTOFF)", asm_out_file); + else + fputs ("(GOT)", asm_out_file); --- gcc-3.4-3.4.2.orig/debian/patches/cpu-default-i486.dpatch +++ gcc-3.4-3.4.2/debian/patches/cpu-default-i486.dpatch @@ -0,0 +1,41 @@ +#! /bin/sh -e + +# DP: generate code for architecture i486, tuned for i686 by default. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config/i386/i386.c~ 2004-03-11 07:03:59.000000000 +0100 ++++ gcc/config/i386/i386.c 2004-03-11 07:05:22.000000000 +0100 +@@ -1158,9 +1158,9 @@ + if (!ix86_tune_string && ix86_arch_string) + ix86_tune_string = ix86_arch_string; + if (!ix86_tune_string) +- ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT]; ++ ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT_pentiumpro]; + if (!ix86_arch_string) +- ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386"; ++ ix86_arch_string = TARGET_64BIT ? "x86-64" : "i486"; + + if (ix86_cmodel_string != 0) + { --- gcc-3.4-3.4.2.orig/debian/patches/deb-protoize.dpatch +++ gcc-3.4-3.4.2/debian/patches/deb-protoize.dpatch @@ -0,0 +1,30 @@ +#! /bin/sh -e + +# DP: build protoize/unprotoize binaries + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/Makefile.in~ 2004-02-21 12:42:04.000000000 +0100 ++++ gcc/Makefile.in 2004-02-21 12:42:59.000000000 +0100 +@@ -121,7 +121,7 @@ + + # Selection of languages to be made. + CONFIG_LANGUAGES = @all_languages@ +-LANGUAGES = c gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES) ++LANGUAGES = c proto gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES) + + # Selection of languages to be made during stage1 build. + BOOT_LANGUAGES = c @all_boot_languages@ --- gcc-3.4-3.4.2.orig/debian/patches/protector.uue +++ gcc-3.4-3.4.2/debian/patches/protector.uue @@ -0,0 +1,694 @@ +begin 644 protector-3.4-2.tar.gz +M'XL(`,!AJ$```^Q?0%:W\6:7*?)(J=D+$O>!SLG'T<>G^$.'_TY\6W;#SML^MDN>0A"VYXN/2" +M6R95P@U\MDQ\^4<0LLO!C'79/-AL78^'=<98-]C>A^YJ';-&M\E>POZQBY!S +M-@F6\:T3W"(_@7&Y?( +M(9(<3MA]D+"YX[.0+]PH#MWK)(:^,7/\Q0L0:A,LW.4]-L!((%6\YBSFX29" +MOO@%I;[D/@\=CXV2:\^=L[X[YW[$F0,28$NTY@MV?4_D*'^]1/X3QEUX'C)8 +MI0A7Y&6+P?`-)T8)8?6V2-4$L>Z9YX`$=4F83BR5?\%Q:\Z2B"\3KP7[$K-WO>F;X6S*.H,/]7>=\;@SF'XX`S +M]5Q@"T*'CA_?X^2OK''W#=!WSGK]WO0#2%N_Z$T'UF3"+H9CUF&CSGC:Z\[Z +MG3$;S<:CX<0Z9&S"^0/+5E_2LL/J+'CLN%X$,_P`FQ2!2-Z"K9T;#ILUY^X- +M".2`OFSO']Z+NN,%_HHFAMIPPB(I!ZE*=SCZT!M<@GB])?.#N,5N0Q?4(`YV +M[EF+??]RTMK,K4[_=[EX,H:3-D+=J;HL6>+75I3 +M^VIX;MF3WO]8K"%':3;K]:_<)2C[DO5M<&#SCW:T<:*UO0:30,-$L7NPIF!; +M#ELE3KC0C?$6P(7&C+9^[2S2!^!Y-"C0B.SIP!YU"-C9:H;^R<90& +M$L*H7W$?W`BMG'7G;'#W;M><[)W,R]^"M,'?0/Z"-T1J)P0Y9+_4/F@I= +M,)B`=('"GX!@N&<13Q8!F.$*?`[NSQPZ(5M36RR(K\9@D:^ZX'* +M]4`A5SRV:70;7;)-TC9P%^4L.E(.V!?\PTNU3'HW,0'8;D?I74%QY!0<4@[L +M,P_","%?BO-PXZR`L(3@M2-WY4L-HH%MX&V+*=LP9=;@?K)A&V>^AHVTT29; +M=3(^1I_,+%M,Z9U0@3\[)O^1GU4&_\T_RQ@[\=_+H^\`[B'^>_G#=T>`!=N$ +M_UZU_\)_?\3G+_SW%_[["_]5XS^PCU1==?2/8-5Q`AL.BW!/0`1`$P(>;2X1 +M2B;-B"+<&I>$8KY$"P28:'X9+"'7B6(;=J1X[8CO!X3R`&8P)\;OA`D<+PJ0 +M$`:[<1<\$CR5U9)F23FB(I"3T_S*]>=>LN#L&$,0FVP9! +MFB/.BK+-<8X,(S!&WVPKP`$OUQ+G&@B^Y3JM[**1!#_G8IE5]S7%`9EQ<4+.6@(M/129H0%M*F:Y)TX6R<51KY#">C/0S.`-IC<-24 +MSB1A"#.SU="V&">R;Q(/O3HX%9E=G>S5#4)&&._58^W`(-)O/6J(&TQ;%C:E +MB[M[N)'M^I[KXQ`92G@@NZM63$,HL;8QN6DQF[Z&(B\SB`AJB8K@T]=0#@I`Q@`D7V,*@^91RQZ#;)%K;FJ$("O0OE4$0`(, +M(U+UD]T=A'R"7I8^BATD3L@42(I4J."*M(QLON:P(+AZ-D9>5?Z0%!0)``CQ +M."6):.'04J*]J1=\[A7F4DX>+.VMEY2SCCU;V6;5M>JYQ("XL#85SDHE +M0B1,6R84),VR5%'%)!:&*_=.%U9P[%96Y7?UA'Q9JO*:6`Z8)YNZ6"*-$T>D5&)L +M@"_(11OV35X=15()$*3Q?3);#+J=7O# +MV<0^FUU0T5VCMY)G[-]UU5A1=6;3H7W6F5BCZ;CQOLFPUM_`*C[6L1FVG)ZR +M47\V8?_%WEOO1]#48NTF.V;OFUDFPXN+B35]B`>H`&!':%2\`"8"LS8P2VA* +MD.%?V:/.9&*=@[[85];5N +M;MY*=1R-*075^5(`RY4"6E1.%E@U/<%U:OF(MEZ+AT'%,Z!$`\$N;E&)#/U +M?=V4\5.FG-(;@[WFNH@=1_=5KSQ':A!B5_-OUG^!(3!JL6M@]C$"6"65N3?M +MH>V4)`YSKXDKLC-!`#[IWU]_S;Y$C`$`3E!P[%\&17<@8[8;"#*&;OBCNZ5% +M,I6Q1,G\0$P7EQ>KE$(S,&TGZ32Q6%!2U.)"F--M$J<=`0;/BF0`;-+J((:^08D' +M#8K1,2I(>KJIV#\#@6KIMM1^4^+1^;(+V9F'<97*8[XK"JXN1,2YR-JHVG`3 +M>/!-5/N'/RE]HSE"%YOZFC,OYJM"_VOJ7%ALV^5X^&YBGP_?#=YUQN>I6&;' +M8Q8\D.1BEFVV0H8K]UD5Y;BSHMU<-E_-4FB6)TV_*H4R(:<\J&!STM +MR1M9XZS_$YU6YJ\.M-C!$5D5?D8S<2T`C,XH0:C;`8H*HK+]=MCO3'M]RQZ9 +MM!"TV=%)>HF`HE_YBI;N1K:8H#"07I,+/!UP/J(&A`&$+"I=R$L($.%;+,(" +M%88BH?88N9;NG;AT0$QA'U257-;#=?ZC:H[7#N)#/)X@Q/%?4$7-R1V +M!#XZBI2,J,:#_@^.6"C:FSM8"^.F-O/F1`8K3>4NK**@2!$*-5IZWJBL8]C=Q29(92W1+Z:!AZ,SC_BI>@RS"%4/*F<3ITY!3 +MI8:V'E+8&`]?.=#-\=!!K%2$KBC/'CP'C$P997D=5DC./OAQE@>`YGF(*)^B$7\`&OE+4,@E6*FPU+U0H(.">*VS:5.`Y*!]HQB.%.RSUF +MDW!2(2AVC`1'%`BKLAO1I:2@**"T<4-N-Q*2/E=7+1_RN6EY$Q&IYRB$2G!> +MSBM,7364)V#X_W*$*P1EN@\K(2 +M!.;@]L-CJ7-)!..'0995(5?6Q:HX5-/(Z +M^)A2\##:.F2Y*^6@LVQ8,;"DIPBZ=T*:G`04Z.=`IN^CT)Y;.O*:R54RS5*R3$GH]W>EX9B'!KB37 +M-(YTA4HZE$"=G?1EAZ*9+3#OVDI^VG.2+53XK$<75Y0VEJ?NYC%5ZO`\WYP_7-WJYFP<;7P +MG?'E#"/NI'KIH0N&\L:)]`Z:@;AP_:;3`Q]%;-A"$AYXX0?(3@LN+(GP!;(I[3BG`Y7(T+*HZK4@\XD](?Q6KQO7TLU8D;,/?1-:7T^/`,SS_!EPF9O/']4* +M&S.\/%W`4MY]23=53%.^75-4IEYZN["<+YJ:IZ=G_6'WIUR-"E6#&".0P^?V +MV\YX(KN%0'L.[@.?=!2O["`;"59#B6N^GUGB`_D@(2?5:(3N8X;3750^4RIBK +MI3M!Q("EL)&C0?>E,KQI[P)`13J(04,4XVG?!M2(I9@"0>Z@A*Q=5FO2;;9Q^A';MPP3D#_!1Q$*T#$KCM`Y\&PR!8ZOL$RF$AO1L/> +M`';>1N+9U1Y])5C+=@.'S<"OYIJ?.E21H\Y]L2]M8$T4$,R+<51?!>P=XZ4M +M>0$53!:^./I44VR!K%MARER\9@HM=(5OPQU?7!D-KG]&KFXD>BM[/*"(2KA7 +ME>3B=1@DJ[4QBAJ8Z7=6(B^(#P7%-'M:(4\G;ATJ:*S!FHO74D7':[YVY1U9 +M<1K%HH`*>[=<7'$+1-[NW%,*(:0QLJMLO2\7-VOHIFJ/#/LUR.Q(NY6]4+4S +M$>]-F84`[<6$2Q6>60<@##UI+9UBUF[O+_SP9'9&?TRD3V]J9YL;0;,6KE_Y +M<1G:I2?7J1HA41G=B%$^NGW*2U?%D*;O$A&I&<7XYD2)(7RV("A%X=&M&X-( +MC9QW;II!C"Z3XDWY#^01C].4N(LWDM1YF9B*:U97E+*G6YAN$;("H'9%:TAC +M4MD$EQ\]'3V^ZKRWZ2YG&3E9?;L\PNS1FX8;#$<0S$9CW/E]L;V$G0\L0L@] +M.A8!F\3=WK$&*!1B@EX':\`I$I.3Q%0-&-CXE1"@7*$]^XI[@/936"1^*1,# +MF6260-IX1A%DXZ&))78H@`IW^RM![??0@`*XW3$]*E?"'%XI#S3H51Y9GY?%=Q%%XV";,8VHW-BDR`4_6-#:$WD`1)YK-N@- +M!X;GHL:_S3I]N_3)V.H.`854>3KN@+L$#TWOY40["]8"^O,-3@,WZ:)G]<\G +MW@$5O<5&C9+N% +M[<+%W1P:JI?Q\#`$ZKY0'0"OS8S1%0D53-`<_"H#/^AW!@H[E0BZK;8SU1[PC*["";?+C_A.'%YAMFEQ'?!^MPB@$=]&]`;@\IZN.-N@`DE4 +MN.6CXKA(1^XHU3JM2K5`V9UK-,V&OE)@J'9_-CE^+,=Z+9?LZEY'(KCI[8.Q +ML_Y^#VM`P*J._J/D&M_L0K4V3CI`"Z5&C:?O[8OA^*HSE8ITHJIB+I6NF9L:P*-KX6]X.N.?<9OK-* +M0=J#)5^8A9X2QO*>G6)<[4/*U[WV9%^B0Q%-OL1-$#=9TB;JM+QVMW&H3X-__R0BB^__-K-FUGDAG]@KQ]@_IQAU38IN^Z%D +M(H^_[PY^Q*7_%-R/+6%UM;V-\&34U'SR?$$4G>0=Z&6LSG"L[Q$<9 +M.Z,77QYX9Y9Z";,SK:W.8)0T`4HMC!Z@ +M31(=H-.21_\]NQH1GWJMG(!NYB"!D4T5;%G>!:[1#V&0^LMPL8]&$]7>&FW< +M2ZC09RVF^,/0[5KU>\A"O\4O`[CDSU64J]5J65:DV+5*O58\E&H3VJP<5JFW +M[$4:;@YN!.?TLL1#BKSCR@,=.>VIR<;KRM47'M1A]J??=ZE?U8GKR2..5C,&@[M?8C0:7>%%]!OS +M0GL&CNUA.^:/&RC<]:0`4`ZN/@E6R8HGCZ0)JWOE^$-OWCWDS`[^4!#H^"W^ +MR`Y?X)V%14`E)9IG+.X(RS=M-VFIY5\4KYE(#:.80:M#G]E?13NC;3"[A1R>#H4W@,P +MW!EHH8A]I":R[,[DRAZ.Q&V_?[;WYFUM7$G?$7[/SQ:WW!%\&`\'4J_,AL'@448R9V$VCMX')=%,.G:CN:6,?$,JWYB +M!LC:XY`,[!;(9V6DM$#FSV`6\I+3H)X#X4+>S=V>!.!U(6>2IM5F"N?.=&'F +M-,LF+C35S%_0/!<<&L5#R2U@]RW9&FZV(F1FP=J:34*RH_2P(>W59&T^D0U6 +MEM%?Y*^>D+,'VET$OTZ#83=0/MV,C&8YD`)/J*',R_JI.7I%\9A]P%8\SKO" +MY#L8A!./('O8+2D#?TW6"+LRY5>/#%`OU3@J$Q-YTF>[B)ES8-I*VYD43OM- +M/02%?EUZER`)!%[?OPCZVPX-$AIR#FVDMY7`A`]BY.>8%V20`L1G +M]:220MN+Y\Z@=%=XL_M#1V:2N]AZDMX[]I;A--QJN0[H.\Y[\G)9':B\E+/1 +M\NZZ^2RM@]R!)M'Q[AF*3*H,-D\^.S]QT[[-2ZL\H6U-`?9NY$^LE4\^@]II +M^HGTIAUUR151_52)-<>7S*+LJ^UAU0X0;MMP"/V)?)4Q]Y9+A))K:$?P5!6= +M&C()RL(?G!(+_.#ICMJQ3&D0NA+!7,CRE99%>G.78:J!5]1`!V6FWWMD+32RI_Z-:Z1^_CP=C#0U"9`(_%ITBY$2'^13]AG:V2,']H>\%J2]`>\^ +M:,K%-.SWE$D:>JCT@V'Z4**<1;2'*[,1>&X*G`SKAD%65-(UD7$7F3ZB=M.V +M@D1N>UNVC4K;$8QX:TQ*Z"I6%HG,MJ&4_?!B[(]OR8L*W41GD>Z,N!0KI;+R +M#H!I-.@!]?*3S$7#'*YJ*4O_LH)LX(O$3*&F`MD5:=NL).O4C)$YN.KC!8Q= +MB+0H_CR1S'\WQE6/KD3NM5Q>/[COU17+^@(R;9 +MWM'QOKK8CDM;XJK;;:PUR9.%K8T9FJN7M#V7E3V$#YF;^&U^8HG#8#N=%965 +M\TZ5J?A"7FB4$DV49CGM)D&UL#I5VST;/?S97M4 +M;[;[^;.11YM1U6O'J927LW+/2E)(I$?DQ+`CYZ^8%(DUVS+M]N,TXRTY%9R";)_:7P322)55EWLH[*BNZK&NZL +M1#LZE3(60FN@@F4`*U-^MTP=*0./>QN%2=LBAD99@YR%L=-GLS![G: +M\#?+HA$P/9\$P&#"%V+_EB_B#XIGH(]MNR);1>"BLFBM`?##ZB1;&@8A;6PH +MH3^1T>@1>"='C/L06!R&C9N`Q_5,XUS=$]?`$!?Z^(HV%6W&G7D46I:R)(4N +M%.0ZB_&B@IA]LU2<]NFTPV@0`I^H$JD +M2?0O`]L(4OZ3BQJ>J>NRH]8EJRZ+OV(=+-`7S#3",SU\U**"K;'$^RB)L0Q; +MFE$Z.;21#E@".;`#L$2DBBVI>>5J4T-A]12KW)4@_,K*KQ_B+$CX9.!^XT#! +M:4)ZK;>2M98JSR6N%-O0DCT,%8NH12`57$ROKLB@\#+2A2!GG&A5F>:A9`Z7 +M3\H`M:!/F#FS*]G`+-.$])1(EE`[!:77A>S@=GJIL&A]Q=JJ+`9=;3O)&;AH +MA@M-+&9::%Y=J._$!"\YN9AEWOR:DO=,!%+IF49WV7Q-2E*@"L;SL7^KI]4" +M=DW$"K%;D>QP>O[D:C'-R5]NF&#>BOLD%RXYTP<:J7E,LX+!VH8,48_4C._C +M+M`B$(W,$?2;*B&!%RF2JE@O7)L&PDEEDSFU8FW#9I0:K2PEE<:AA^8UKF.[ +MR'P2AW'P0G2US=\5>DCO3O^PCM^;YF$;[D+G?C+,W563&/DNR)4Z2;C +MMQ(<*99LKW;%I>E:LC&,J6U,N]0"4(R!-9^I5);>0?S-I*O4**!!XAA%<&/@ +MMT[/3L[W6!TBVU:R&K?[^C4QWH.38754@Y)U,2`JB`_DC2FHZ;SR>@FV7LLS5D\ +MT9M.6(U2DYC7-EOAR#QX6J;/(9EZ]K;-N@5&+*4OAM6N(PS(K-SUG-+N&\H^)`Z.%/J`[TUG)4!TQ( +M[K5^YHK2R$;*=>N*TB)L?;TDVX0,&![I9WN(N +MC\IGK-6B),N9XV6=D<_68&K/$:74MYOO:H%PM%*)3ODF2HXQ#\_K +MC&JWZ=)"C><(7XNI7:CU6,U]&P58W8T-L$S0A@D +M)`#@-Y#]9E/B/]+BRY5XN&=2K*$N?8:5QAW*QQJ?M4C<"W<^L5/J9*X,/:+C +M1!USCE@W-"$KW).SZFQ$(^QG)3*3O]@]^_U=B'YOJ-0'=!#*O14O*56UT1// +M8Z#UD,]R7C1^)ZR5I*N@FY][KS_(R,J5)N:^>5G[C?G06?PQ4@ +MX^\$,I(*(2(P,M:CA;ZG+4]2TA/)'#;W]-V.CI>C[F<3MV7RYZJS1VQI1#V,)(L&]PTS6UA*KRQ,+R)> +M$Y8K8V[N-7:?$CH=8RZ1P]GE6`Z6]1B[DI;;3"YY<4.,!1A45XTWBS4UT:Z% +MU%$NPIG.9DP-RSG'_///:L]@Y;O4MI:O^QBL)@KV7JQM2;5L4U?5=2V'!:SM\TAJLD1,Z +MOR*#FIC<'[#=QJ9>Z54H9'6LL:G-<,VASZX>Q6B)9I/HPEP"_8?#O$G,BN6N +MESRO%+F36J6_NHY@\D9OQFD[M\"3SFL/W5)/%RXRN53G+R85_MQ:.)FKAOPV +MLA<.L0W_P,V@D3D)]CS\$`S)O)(MXNA5;%N9B.OPZEH!HULQ)Q#3<8)(V3,S +MPY`@$*^;CS5_;.`1<51R3.7L!2TMS2R^'WW,:1H2,MUVK?^_=??;`EO*GG%7 +M[?H,2"1OGQG;:P'.![&?L:Q\,!(%5U(6ORBPB3PV*0M<^@$!2QX/3#H;2(3Q +M#4_1QN'XW"X8;_F\'SI[R4)U7@JI/,A+%$TG5]&\NKJ7OF3!TK0RC:N8!CH!1M(`J``5 +M1!TJK+&?!_3/=,3'``%L\U/D-]#(`)\_*2"FZJ@?;#TI%,DTA)S;H?:MTWUQ +MK06Z8RYO!N+KC\G!0WEE7 +MRC:\F+4#+*@9.";>D*\H:LU1K<1)(A5$65M9$2Z)TJ3="=Y\*3!RC]''(H:+IRDGR;VK[ +M*;4_"JGJE%/'1LI30%_1\16+S!M'4K3&F%(JI!I=T[']!1=:$3455AKY.@*O +MP@,7S^&)-&T:W1(K[*-ESO0BGH23Z03W!]+SX`JMHI0!'(\APN.@5>+KD]TS +M$#-QT-7E`=+]2DT/S/)R7+Y\`>+5+Y8[FWDX1PR3G!AGO+L@IDIPUF;.TMQ. +M)9XKJEEJ=,YZXP@2S(@5YNJ^>)`*N4.4D,:%QFL+=B_&+!G:`6*,0.8C'/^ +MI#!2MT/3,4%+PY&`6M0MPRL)4<2.(XM4A/7_+7_3CR3W5&N79*AV#[?-!G-, +MYD$KS1LMC$J7!&UK*)A7VMK2!4O?63%0FCY=@E^3E(]BR$\B:S-@(KVZ9J@N +MK`J4:?0L&3U!$\-2>E?*)9/:FG*99\5I^-/%5<%E)G*6/\&4@^2@M8I"&!X= +M\S/3;5AT_;V]H;B0=!*;K6_S4D2:[FS*<)Z&>+G==CD2T]B_"BQB-4]%8Z^F +M110S#G&YFHW[(]\^V&P/V +MQ=)/EHF/-8[4L6NB-@P^9N.MYEIQY=FH/#W +M:9MC$4IGO6^CL4N]G61*_9YM_P?%4698?N8LCX9EZ;`M;?"@R6C-B&%@J/U8 +MTO'N"0Q[YT`J#J`,EFJTW[:30#+![N1G`(^I3!JF3._1Y'PPS\!L8B_H!Q/E +MV22'51&%3Y]I]V6"',_?:/EZR9OE=MQLE>,77>/#ZAH7BI&7'QU/*H'HHL!2 +M`M$Q[&SM4E+W8X:=?/5RE&(N`YTB%HH3M,WV[J622%];\[)%M9T1OO_ZUX2> +MX;N,^VZ3<957-YGH6)FR+LEY:U2-C>:J!M:HS*I#"Z2NVF(Q.[:$3L(JPA;& +M)>R!446GN53^,4]CF%PLRV@,'V35+*Y1E"F?"J-.=-=;CJ+PC[?XE"24R+N3 +M5:NU"`N%11=@Z7=6G:F'SEW))SDA_"M?XL6W#R#U8C$)R;?`$YP;=L^YULC; +M(2LDYP"IAD.4##V3Q'4%=;_[$S$(_&',]NBD6[9N)N7Q7XLGACM`!3'>D?3N +MMLUJ_T;$.5M__'FW!ZWXA$9O**Z89DOC59;&,SKWR=JTF8IJJ7&F.LV$07GS +M6NG,#6S9D'S%_7X_8`\F&1"1OM+BRJ4#='T@+9X(OIYE*2U=P),LD(\V2-56&*0W/4LJ[$'*S%<ZZW(7R@M?)=[],UK,H$SOSF&EH:@XB.E_,?$"%GIZSHO$JUIL[ +MM>@5K"DL$"0?W0BW#-H\9NV&:)AAX#BS^6DCQUEZ0JEPM.[47=UAEH[0-GA\ +M:'WA^6E*)?B?K#U,:(0TJ:(-?V==T(WE6CA+$W1?P[),X$F8[A1%`/X,E_%% +M"+N7(0`F_D5L6YC0$T$)\,L.;BB/OLM#FI:WW#X>86T-S/I[J]=?REREB.!) +MNN#*@XK_*M7(8`=L1K."4=>(0M3A3Z#X3V-Z[V$T%"8:&NHOOT8PJCC +M#E2IB,E'$.A>>,GVON2YB;A]+GAJ3$$`E4Z%@44\*H:GS;DR?8*KB`T\,;`K +MV\%:^."\%2G<#,@5HZ@?=@-+-+(9(]+IZA^T]'7CC;DM/;U_B'Y!EQL=;CUD)B`TR(6)$6"/HI.`8Z$D4'3(M0<-$M';R,DG +MJ[B87A)^"Z3SB2<50LIQ0D,4L8T7RZ54).%Y$(H'-45LC+HK.W"?NW6')9F=+H/XD +MLBU3BG'0OFLAC@W//5IBVR>0-'&/!B&;`B0W_.#QA"(8UEV'VBG.Z/Z7*"P3 +M',I>`[2YMVT_4E:J1M,)5L_M\+MT/98QR@MF30]RLA1EAHI[?Y<@:241Y)TE +M[ZW@T151.;-))5$!7@1VBF]M?J"LI%`9A43_T**0:&`\!9F,#S*YU*]IVYFRP2M-AMK-)B?_^I +MY+.BHT/,@<%3DCLI+5/=\S_@NK8=$L1T&$YB#Y8:K?(R2V9XZ4#)E-#/F'EX +M,G+`PM%TC"I/A59>3B6P#TYM/C3C*)0\!09B(,!7X"K,HZ=R#,R35.=#W#+] +M<(BGB9W1#2%!34,R"OL*A5=1)%;VUS1Y2F.^GJ=.>3"BZ,<8UG""0,HQ=T-O.*,P>?BR)9SZ9$XO+*BTG]4Y& +MXB<%[90DMR*-GC>KF;FDJN& +M"'Y9R:'^+3'!0PF[] +M18!J`XE+3%/3FPX&MYJV1[`91W3E((M)&%48OM2RJ(RUR&P?PHEI?+E/$ZE1 +MMK)VH42F+HN\O)5:4I.;L1KL?77'I:#\O!]J.6`9>?O-$:?YZGGYB:-+9S-Y +M2TZ;.S9SIPX_]Y@^*:[;&IJ\24@>=/;4IP]*M"]QQ"XALB;;3?-$"+Y]7.)8 +MR%I':D +MJ]M)Y''5+[N2!P[@T.Z16&\+]]B:T&+>3*_>3"+\YD`AQ&$4,:WPP,H<,3,.7K5J=,+Q*ZA*4 +M'"+'RI8/T`D;",BP?ZLOEU>X`O0&C\5TA,[@*R1KL#5>5O.Q#"P/54*R%ZR^ +MV"<)1>IR+FY3!Z4.2(S3[4Q/$5HS#M`-@N9")4Q?MN6J!C2J<=(V_P(#0/KC +M6WD1/%O6+*8AT1\3YSU3@[$HRKM02D? +MF[W4V!N5CT_/:XJEV\6K0D+V(91JOE//JC\_C6J&FKC/`++_ +M>/CZ]O(T:.YY:FEI08[&2Y=2D-'$-'1U\-RC/!*=H,_*@#-CW6::(O`ER\[! +M+I#I'_9/SLYWT3+@]?[I6>=DM<87+P/_!I?S,)+768ISSZKE7?@^X6)X0Z8J +MF2GQCC+K_ET'KLZ^5'<`@&6R+!Q'DY1WI8IMJ;QS#:H#S:MFV+/<5JK20)"[ +M1AQ6:JSU1O^,(ZWJF#?.5KJ\49XQ?C=W&+6;W+&2M.L862BF5N;<=J!:4Z$D +M,,BM_PM>M:B`#EBH(W&Y0?^RV9.%`@]0DR#G%&L/?,PR$/N]PZ&UR6'S^+HY7//P`M?_N'//OF +M(9NGCKZ94ON?'-)\.?3R@K70%\(BSP,Z1[*KW0BM/<4-3YX0GQ/1/)NM4UL[ +MXS3)R?-P9X1$"G=(69JJW!?2W"(K%&W4(28SR(AB8[-XVME@W.C8YH;@A+07 +M+.LI5UG+&H*,&OD=@W&?,8E`(1^9>K^/A,$8:B'N49;^Q"KRV>6(!0*I)]5D +MR*A>S/54@MQ8Y^*\*%]Y)C:9(-T6,9U%9_"Z9AA.A.X!VPR:_A2I@R5QTY5" +ML92>/+1XH`LCJ".Z9#MFQJK[@Z+P8.A2@N&Q5H`!_B;TFV-;_\R-(.)@P2?F +MF"AE8_5DGV@952$`^"(5I,#"%Z\"AT7`_COQ#D`:SL3!R72A29[BB1;II-ZK +M\\.]L_VC0^_\=/>U*DV:P,QI)2EA$FXJ\>2VSY?+J'6_R/`@0]\4(AQQE"(* +M\;6R\I,^84S7$5@'DR;+HF*23;#&R%HR6I@O4BS<'1!2;[UXU(=-E,(&XB%" +MAO+ICO3-,LNI\_?S_1_HOD6=?-PJZM.$'?^&B>.O*.\$&>23X`Y"A14)0W,9#GM, +M)*))8*]=JJM,L:I/3_8($$[ER8!CXGZRJ-=Q`T-9&X%3/7'#]NB%3C@,LEYE +MCH4?W81D;4ZJ5#4VMJ4>3/01L`9..<&#TJ49#Q +MB+@(NKY:OVXAH0(KEKI,=`P;]^(MG97]1Z[]<&@KKY'PEZ6:&PAVV@I93W?2 +M(L>9"O0_<#P%>+KU(I5A^?;4(.$!%TUC4JT#DXRT)"+[6UR"XX$3-600#+J0 +MS2[2G#B\V\FGK!=\1T\0D714[Z:G?ENS,!)D0 +M"U]LUJ2K?G!RZ>)AJB6Z^;)ST)%XS?PFP1&9:3!;1&YXM362.XCY+)G(UF?, +M25C+#OIF%82O;1;1RBJA97,E;"?IS*AO!#^FI($91>`0*E;E'?3N\"BKZ^^% +MB89MA]MQP-H<4EI]+N=HO,6>:?,9YP")V>L8_K`/W,V)3 +MSL.3G#>8"\%,)@C)YZ$CJTO3D?-X4APYA37 +M(`R[,>*]09R@TB\_O:7"N.&K\JRFIM6#Z8*R06?T,E0\Z4)% +MW8G6%!BK8Y$*..,#$*/$#D@BE3[(`J9="HOW[-IZ[?>!,>C=LC.9+V_WA'(P +M_1G!4.BBD0`JJ>@G!4N7_R!+.=5Q+54D1BAS&([O&\$'C]?/%;HG\W+100.: +M99XQ.W?M7KGK\TQ#_K1H*=FPG&EQ/H-13T2]R50%6A%N9E[A.6";LT;ZH0`W +M9[M[M^@)X$:Y!SWR3GB5,^955.U(RY4&$ +MESQ?S-G1T+J`(VGB/SZ0;7M"=53-UU/9E[@SC)9NI,42JV+U)<[3M(#,MR:9 +MQH!Z5`HY%CL9S5Z"+\TVT$G%DG"M4P>QK!8B +M97*T,$G)=_)9$C$F34[N04R2/C^_&RE9Q%M#Y.C6@!']O!X;"Q"2#!(Q4P\T +MFS#<9)&#FX+=]GG0_24+`-L@ +M5TH$,&->B`[%%`@QXV(6&OUD-E13IK6>N[G_<.9S,Q$D'!XN:0&E.U8R8I$3 +M/QYG1#Z6EG@9,Z/]$B6Q>H"Y2%V9,UCZPUZ#+W[=K7.CY^!!-1V/$*MX#BJ. +MPU';5"QC62Q:5.WABJK/+^I/KQ=9C'8[VHN%CIN'4&$LT;ZT/F-&*S-.0XFS +M\M67SY_G<]7M?CL)XDD\#2?!M_!KK7?U;1R/*A_]\7"M^R!U5&O5ZGJS^545 +M/NUU]U_XU*JUQE?5=KO5;C3;ZZTVI&_5U]M?B>J#U#[G,T7@*R&^"B;1]:QT +MDW'_,9KSV!\@J+^)WE6E%\$1/QBA2_HG)*3J>31B*6.E]5:93S +M2:BV7$17P(FLH)>%0LH<7FFQ?@N1D10>I0EV(YMIVEFG1LG@,V[-\O<'?#!, +MMT3PFT4;IITZJ64#X=7D6J)#I]K8*"::U[K/N'`E*($8.,,-<7&+ +M(0[ZT?!*5O][+\4OG]_ADZ;_@S#N5N@1G0/!3="=3H+:/44(A*;VKF914B)=_%NGJ"=3U"$)?-Q4#2?5LY'2#W=K6Y9[@@K*S4MDG/J.%]QY/^EBBNHIU)I5LK&9WQLQ$ZR7%. +M/MDH8DB14;]DH2TNM#ZST-569K&M_&(K-2ZWD5.NU=Y*=INAA-S2FYM<>G-V +MJYN;F25#[G3)0A8=KLH1:*SB +M:V(5$U#Q[?G%9Y>>5_A?^:5N_\;V[/)7\SM0357!&P=WK+@(K]1^X!"`P!-< +M@8C-\,D2Y7C@WV!XE"GI@A#W$UI06T?H-6+KKBQ& +MUU9Z4V[71.O:'H +M&0:#O$2@;BG=L/(/56)#5HD-Q7>B5L]&>^"O"HEW1.*\"7HHYS(7]1P__RN*<>>KTP% +M/&ELXCC4\0>"%36V%5V%C'^EUU#`%[+Z[_]9E/ZOP8%^USKFT/]&O=YD^M^J +MKZ\WX'L='K:^T/_'^'P-E`4!#\;AU350E+V2P,$7K]`]_#2ZG'Q$=-I7=`W` +MH8[VA]VU)T^^9D.=T3BZ`B%+D"$SY(AECFUQ&TT%7M1@3$N,-G,QQ6"LA&/V +M+1!I#CP'Q<`C*%M&[P`V=!`K$/G7A^?B-075[HOCZ44_[(J#L!L,XP"QT4;X +MA(PF+K`8S)#7YFT1A'2YIV)BC[QQC+G +M&J3*Z+KI(9E<<32]D8K/9Z+O3>/@"#`I`:C/H8U/PCRN##R2UB&G\MWG9.]MY`CMT7^P?[9S]" +M!\2K_;/#SNFI>'5T(G;%,0+J[YT?[)Z(X_.3XZ-31.TY#=\-H +M4A8?Q^%$!Q1PYA-R)U=A6;0VQ5F`M[3BF$+P5<0IDC'1:%3+XD443S#IVUU1 +MK==JM4JM46V7Q?GI[AJ:XW[->@_2$TA-J=\/:7Q5NV*E$N]QFU,JBAL'5V=')V?M+QCHX1=^A4O(.U.Q$_L5H\7:ZH +M'%7%IYGO:W/>U^>^KUQ&@W!2(25)1<6[F9VI\8"9*C#JXZC?K_2C:!3?LPQ? +MEU.YY&CW%7T!,+_HJSE)L(CWP&9=BK],QK#.^K`Y^XRNPG<:,3VVWR+C]+4X +MB/R>B*>C$7)N:,@(RP%M$;U^>&&6"AZMD!K2(Q/'@CIV!AX]09P:'^3T>-R% +M11-C.>_0P%%4AA$NSC[F^`N\[87C;_\23R_P7^O8?K;6??]>MO)KL7\I/@;? +MX.+$,!-8$>%7*9BJRU"%3IAP.`J,?AP-`[FW!V6&^PTG:^I._.F[\91N>CS, +MZXW$7^3OF!KU7@V2AKPU-_G"#(!J+.6!D?N]S\3_I(^A97`@?Z8Z9O)_M29\ +M:JC_;]6KZ]56"_7_]5J]_H7_>XS/WT1T\7,E;&RL5X!L3F^>\`/IE`N_U`(! +MBH%+Q'HREK]1A##/NJDGU_+)##.#S!3Y@L@2R6M+%5ZGU$"=+^O=;^&?5^WV +MM_YT$@V:DZ!27VLUUKI`C0,GS?X":7*R=TH$?4M\V_T0CZ-H@OW6_UO5E3\\&0?`P`8?\#08PS_$)=?68!,VUNIK +MM>83F.A+4>F*"IR6(U$96^^$W?!GSYXE.U.HB=W1&*6*IJBM;S7;6ZVFJ.#. +M+]@U5"J5=,XV%'[+6:O-K=KF5G.3LV)%]D<'*#/^&,I<>3P83^B<:5O@^B`/]"[FX4 +M19@"S0N)4P":<74=1;_$\'`2#H(/_AB_1<"+?L`OR`C0$^!AY3^5WG0P@N_, +MLJQ%NBS(Z\<#>/.!K]DB+6[`MT'H>?M+ +MD:S%+GZ&+4QG>TF]QOBAP/=3FLX_STYV/7Q<@E_7P'![6"OF*Z'!P_6$\&%E +M_YDQ4PW&"5'K6>>N]H8U8VV@TR_!GD[4$2' +MM6MX?O:6WX/$N_OV%+_+2;Y^@HC>-,1;\LNR9;XY.OH>B\0&.E.SE5N0DP[K +M.S[IG)W]Z!V?[!^>85&K]DQB=\W1N63K,!H&?2%,=/CV$Q2.AJ&(5PDIM;2I04WW6"$3]@'RQ1(G3CFK@U[(8O*6!@!3>Z>G5%;:==? +M"YN5H)6?7N];\AG]<(8Q>^C4B-$.XZ$3W"X]J&IH$B,BV^2.B-.)G^QC'>D9 +MK+O'.-)E5;G'>:/6@K.VE7&8RS="-58=X_)WH=:"@UB>X?7&5KV^U:SK,UP5 +MJTYPG2EU>K>J.:12P4$RP[ +MBA<83+8,E%Z5@MF,RFP8B8\^*9A^&7(`,(:)CUAY +M&DKG"ID=>]\SP5(GP6`DBE;T`Q@B=*'E_TKR1HMR4AP$3$_Q';T)L%1#4>Q1 +MFH+45TR[*'E[=,]/R33:7(^CFN!TRJ%NU!65_C<::LAJY5;Q-[E\.3H47,XX +MHTIS=^XAJ4G0(@*5)%9!?M)J2D?SY&:;$.]E1`.G$JSL.'4P5--8(:WR[%,( +M$*EA_;[3.39Q0:!'K3LLF];G6C8VZ8L&%\A"/`[Q4Y7EDK]FM;K67%O/('_R +MC3`-U@10/2G4:^)5<"'%&""!S2WD720)5$5K$JBS91#!>@X1[/K#B2=S,DSU +MR+AAEIB1:E9K9?BS;C%2_*A6M;8H?BBXUF5X$Q"\>:Q0HGK`?);>.\GV#G9/ +M3[V#_>\[!S]ZI\?[!P<,\4PYT,79HQ0:;9"**%F@2W)?U+;I:`>R<(B^D&HT +M!1[\K%646*.6C;)9QGA5@ICAJ"TG*-=5N:V1:%@!+J7W]JJ0D;X[9]X/1P>[ +M9_L''6PTP[2O)MHE7>#D`[K]_Y0>?SGT2O0@0!.:@)LR>U`R%C_-1*.]42W# +MGW7K$.*Y&@9C+QI5$WC0&O!@.YVVE@3Z=%-L(Z6B1S"T*!Z+&&G31PS>$S/% +MTB[)RI<'A@8OKV2\$8[XK"<=-;KDGLHD#^]O!H,I>J)^"))1)"@/#C1Y\^T> +M4N@UWU@C,M%K2)QMOWQN<9.EJ]F?=%O>B/AT?MIMEBT,-;"BT+_(\@!T"@H>A.2.O<=N.=!Z-,:XQZ +MC*>%ZK#T=/;TMDUL7B+#,W?AJBC(B+CY&RH59H58,C?^$!:$.Y-B*:F(]&S& +M+C!4#%@=B%=1 +MQ+DH"PYD!2D(RRGG?7:393;50MMINWS/95EOPQJLMS?UD?A)';Q27-CSA]$0 +M@RR"I""*@W`XC<6N1.]\(?9*J(90S_7K%R5X0^'ND`Q(FADKHCES_5H0WY+H +M=%Z?[!YX;Q$R`)+@,!$7DS72;_(Q7-W)"0JI"Q%V%* +M3P-4,(\FCR0^R=IRY:=Z$V2<6H;XQ"^$U6!+?)*/"K4-(S]5JUO5S:VJN0:2 +M15OBD\ZVN/STC^D0Y82*/A9(8FK5R[56VY*7\,%Z36VX/:H*OOS#AZDF'8'E +MI`EL`!>*NW)5_"-A&@*/9/Y5*S^Z889Q/.7]@YLL'OCQ-?XT:YG##D<$L^'' +M5`):1$]O*AA;2#=,G`:H#9^@W41%O17?X40^+W0&X<0)WFR%)<)=KQ*F1NJ4 +M`F;PM4F,%FMH=D4=[OD3'_DBVFZ8M-UHE]O-NAF_=K-6;K.:I+$5KN)`)VUP[('N##D*8E*=DIT3 +M+8,6R4U!%0G!1ZE[F!!?F:GX;R`K0>]H_#8DVNCLU?BQM!SQ+`U'O;T!^RA+ +MP2O?"&ZHWIZQU&S8RMUJ3=^R%DR1>FO&.5J-9LZNO(SZ/8=M<#4:S7JU`4Q# +M53,-1C6!!\HP^,BX6=H.OE"0D"!/K:1P4++B$/E=X/ZC;NBS:=-U>#DQS'M< +M%KT(C9KZ&*<3&'TJ$)=!;]I%K%Z9GL4W5&BJ[U+I!YNVC^K+\1KG)+5AE]2. +M4;<['3,%^(A&E'WT3?#)?ZJ"T'=#M%3%<)IH:"M/?^I[;5UMIB7Z/E^\5<7, +M.4[=P_&V9`N5-F[/[9PS-BW5,6*[$OW<%+IOEHAG==7G"V_/VA#M!@AW[:8MW`$!AD6,V*FY#HD!4^X<8.>D32%Q?N)MDV0A^K-O]^]J,'JW'_ +MI7>L=)LW4FXM"(I^Z^$Z_75R*ZSW96K$6]6^DAF[)._^DM8B+)_AA*Y`*H07 +M7;:`[BD"!5YZ(;0]E$P0$7C-2#.(7#I>/IH;"/;*U,!P%^MQR\/:H91O-\F956Q?Q;64P8&`3O*[$C6U0 +M1:73V5.1=@JS55N\A-!&Q!]/MMA*!NJIF;U_EWJTE$;7`OEG`KXGR+\/X7@R +M]?L>[7@/&.*8XZ3-:^^]!K2VT2K7H*MZ2/'C(-E])&DFF["L0VL;+E&>UUH]$5#^_:?A4?N< +MG%J)=2VU!:)HZ8,"#]LAI6!YK#7A"-NT#[7UB?7+=7Y6X1K3_H/-Z_VS_[?[_ZR@MIT;%2!0D/55DKRN]8`2, +M`!R(5`S54E8QGTV3.`2SN2!0(X@7WH:XTQ4PE0-"':P.>+%FG[(S>3LZP_"H +M_1J81+R$(SZ1,"V/B_\L.9H:S?*A?@+-R5:Z5,:EJS0J:OJ +MMN9VF[]C+ZRV$8^@%*AJGF52\NV]A15_LRUN:3/E\:[X?L?F6W61OQGE;*IF +M.SUE*#B3<8(XH6W8NAJE591Z!J8Q@@<"`JNV"!=@-Y +MT=(+*.]%@&PQ^OU=JZ!,RZZ,'XU9&<]@5=9K+60I +MLG@5]4K(QEJLRCB34=G0C(HNU>)4QME\RGH.GY+IF9GA#<>T=Z/<:EB4%WYJ +M_`D^FO7*\ZSR<`;I9Z1^0X^7;6>6B9Z*WS:(`,<=/'`!Z&) +M+B6-*!$8J'=>P83ISC&K@1!0#'L@`?24?J`Q#[Y=2XM;_M"C +M,-87M]XHQ`4KBM.AA#*Q^`[F.JKKU3+\6;=4$((LD3J'+X]QV5<5OS.)RKB9 +MU?.:>BZ!MWVFZB@+^GV?BX%7H^[HEJ.'6WGKB;PJ(^OP\2X2\=FH'&(9X@D6 +MHZ[MGA`5A;_)7A)S&+%PB2-5%EG]!KZ@'PSY#@)Z7H/NMVN6%N(/VWTVVH+/ +M/ZZ#8>9=O)*)?"7$HJ5V0.-41FLKXE/Y',=G7)J%I\[KRSKFR0)%*BIE-&QB +M'`S+0$6%5!O:`[#LC:Q:KO@6#JCEG=-S0') +M'O3$GTZ`<@JR6JQ`--0KE#/#;H@XSSI!!5+<LO@&G2-TH!`HX]*B&\GL8\LW(2=B"RG.> +M<19M^(F.=Y'89&]V?TC.DIR>RO-D1[Z3NM1@0,]0X8CR(=1=ES\YGQHSTKNB +M;E:+BQ4WUDN)8EF4$JMGX2;1=EBT46;_+=4LIV6J>[0ZK0JM69M$M3)M..*< +M:6?5-S;+M89EH/9[SEV.((NNUPN?*O(*(.,0U-9FI`G-UT#\ZU^YS:S4Y(7] +MTJOL<=;9G7HF2UBX;QF+]3&6:Y)&D4FM2Z1X$23>$(VJ-]NM9X\%)XJ2JO7P%*$G',FR;E538*>IQO31?G2!9RWNJOYQS1O/I;P#_56RV]^@NPM7)I/')F?_S36601EBY>&<,@<&$T&SP8 +M[@/\Y?:.>VS1X!D4J8M.`-)+J+5>AX%M&R^AWVM@/]_122OMCWIV_NZK(+DO +M67_I!*VBJTO;I8^ONUOM:K4,?VP_B@QELLR=99"<;=FG,SB!VE4>)V1Z9H;G +M.^+5_DE&J#]MJCB_C.]RH@7*LT)[+I"+UHYR@B1;VP`-"J.1K?ZEPJ'DKK$] +MQ&616W]91*,ZJWA@:]9@D.N;E@/&O_L@6R:E"WA4P([-K0.O&F;A)[`L>OW:[6FZWFY:!:+M91K\X<['+@&+0 +M2;RKP,;1Y3#>*`T0&,T**J=N*]\<'1Z=``/Z^A!._^/.X4LX_;V3H_/#E_N' +MKXNXBY3#/OWPWNR>YJ46,CE0`NJ`:H0W\"?7)1YL:Q0'@3\D#;+0!$-:Y20- +M1@?!Y#KJI:=,#U46Q=F>46%N';1,7./4&=4Z"X6JI!EGFSJL^:EXO;?GO3K8 +M17@#+,8F+*K\1[E],[7E.^UN-)`.5+.\=N4K835:TQC]*`N[H&T<=U7QFLY8 +M&=.DIOT0UW'KC?*ZI6''GYN9UW'!%5I^)^_?^OY0`L?<\6).F8Z>G>R^/3XZ +MV#_L>+L'L'F0Q;;V8-9K\>K\<`\1++T7N+UV3W[,$,DHHNGKLQ^+13B>&3#' +M0P`.$8S"?G0U#23A;;7*M?6J;9D/A->``<%*W27_>9!J"13D?/\EV4A<1WVF +M)^8I;1""261[2ET5$R"2DJVPTHK24&P5,Y/X.WJ;6J.)``$GP=LYI1IHR6)TD9YO6G-V7JS +M55YOV?99'Z\C.*7ZX66`<%H4>ST:3A`IBT"8Q=Y!9_?P_-@[/D*@(X0;PN$G +MM`I(VWBB)'MIQ^W`>T1XTA$@``)KL"^WD#"KY-8YH2`E/>B4Y"DL)QWI1`)E +M_0(]7+M:@_$0IZ@^P$:4UMAD2C6DI=J@*O<%#R2-*=U)Z^E8TP(U86=(?!`B +M$`188`$[]Q(X'[C\-,,U\SMS'&1)?@+>"LWL4`"L +MX8\X0-@QCQV,/#QKBM@W2T'!%OVD881!K=3P[IPY(1I77`\74>]6($O05Y./1@MN43"7;C(=`-JCTO^R@7 +M@+`'";'<,JV5DDQ=5",OXTWPS\IS(H//A?RFA%(T$'52H'F__(HA[.4KFF[. +M35\-+(>$ZD%=E4X'9?`7*,$JE_1'3R2\#RVQ#>1*#*;(GZ?W6``[DEJK&$J# +M%.ZY2[;#]QVK>RVQ-IR3;?N<;-W`VJ@FY +MDANECW*A?),D"$?%^>D!U[BMY2"[`&=P5T7N`%GKZ6]B=36#E=M2)'76>.4- +M%W[R06FL]$4,V<.J\<:8Z,@!Y(*7Z7"F6FSWIG:.8'%VJE4UG#4U--/U"7MJO1K +MLE^_)OHUFM^O8Z=??S?].N9^_=WMUZ^F7R/5+USH,*'ES747S^D/-:E0B?3H +MR]HGG-I^]N^Z"-0X%.X^"@^P9)(48S2=X%VLA_F9UFJ3`"TJ/H-O1$!JS>9F +MN=9LM6R?&^W')KU0I:<2>Z[0[PS9`BT/4*OJ\=U>XA99OT&%=ID:8IC!XW-U +MN0#M+J/`(R^?\,5;\\(4(LUVFNM-:+RY=URP\7H8_J:]<1ZB/[JPK4)&<7C4 +ML0C'-^4+EGV_44JNC9`OYD-@I#UUI8'H<,JV[1FT%>_H:&TT-AO5,OPQ5W,% +M@Z@D8[@`KZX<5BQ@)'7`*>\D6(UT+7]LF_GAQP+(@+0P.]NN[_('8,!ZV%B) +MYE-DEK,L_NI`9V!=9PU,<(7]^TH6]5H4I[?)4+C["1!_J(TY)R#6Z'-E8HB]'!!!6"5QY;Q*,%/APU'_RP3_@H.'72 +MS($LD)0JCC0I+D`8GG9`.*$>C_)[RH5YB"X!Z+R^[0`!/16*25*!7QS;A)&/ +MQ4$2,I$8;TL,,]4_A\7_X_8/QB/L1JOM8STKU!OBOV'ZU!5,8WVK6K6P?[AXM8?LC!D;*2\`!-FBT=F' +M)RV!UV,_&$T:GY<)UEZHHPV(N74)@P^:U7I20XVW*!%XP_HH[MXM:ZF;2`4&?Z$E-3F'F03=E!O3&:5ATHM%3\#FF.]Q,- +M7M4:N]-@HF`5)RC9*H4GV\H[F%_VA%/P@F&C"*J&8U#X'R(RV6V=K-=+<.?EG6[M-D& +M9G%SHY$&6XF#7^EPYD,PEA%8U;&&U06_3@/T=2R2J^77X27J-'=/7I]F0!H: +M(C%S2HQ%#93.CM@==I`M(&JDQ$D[8RA>C=Z!:?6\)&%2S#G.X@2F+L-R(KT= +M=,SS)QX10KM_RK4+CGC]])--D?KA!?Q3B2>]M0_!^#&(DEMC/EUJ9)&DAD@T +M6!$D]W&AB=!:'.NR5L6H-,V6(4D-38T2N98@2'C)WEBKLI)0U'#UV?[O]&## +M@G3QSH#@*^L?R_&*6- +MKW1[1>]@_\6>=WQR],/^R\ZI=WIZ[/'V_]HV4I&^NV,1WPXNHGY,*3SO:NJ/ +M>_([2S:4VI.IL2ZU(*40]G_#X74P#B=R+!IJ3-++J_XXQYVN+-^$XUQ6'T@5=3M;X%9US-@(-CD>YRJB]WM*%TZ8TF8QCWEV=')S") +MIV>>]Z[^7EZDKZ^WR_#'7ESTJ+UA[`JT]<D?'Q#SA +M.;.G*@"BUGD%I\]+#^AVY^1P]^#@1VFDH\LZ\-"P():77*OB_QCB>)"S1)3Q +M0<9*M,T6OH,-%T9KU\\3#_%"*?GTLDN>R^[#Z3#$/4M/3:N\XZ/3_7]ZIT?G +M)WL=MVA@+'U5"B]CE5&HW4,6R:<_GAX>I%S$PFVB6D7XS +M'5KM<[+>IXH%DD61B53-&8\`K<0 +M^)55##S^3=\Z7O:V-3>C&EI]+S%>;$1W3G:)00ZB$88HX-Y/T=@X&JRPUD3S +M13TLH5(KR9K@N$>]F3<1\LY@'/@]3%8&KN?:'S\K_5567J84T:5JC(%ZZO;Q +M)ASRE(1ZA%79-T1V-GVI8#?_DV(#]_'VDINN#/C0E,%'["AYM5Q.`HA\#"?= +M:^EC;,BR$`J/9`4#*:,?,I?DCV]7C$E"4?93M8^BS*N[C]3+VJR7=7SYS4_# +M;W+>-RC(?*N%KS_QHM"K(8,^\`P0O7OWOBPP"M#^B_,SX*(/B8\F+;@_\*\" +MO72L_8FKYO7A.5*6D]V3'SUYM$G[."KY&=2+L7V'_B#8MC>(8&4.IQH@OL55 +M\`X;O[*5--^$=8^_PZ'1(ZZ8J_.+Z67\O]3I=?)ZX3=4++QZ1Z_?;\\F+-*# +M*+JB:$9<@G+J`F)"#C?3(9S.L8>)\/%VA&0U88:(+%%%7Q$K$,!25. +M]U_OOC@YLQ'C(&4OL,HKJT0EJTK$AL"7P`SOO_9>'!SM?5\6,OGA^<%!R6PK +MF^Q1HV)$%H#!]?9.]JV:84R[HUM1A$DIBY7OZL]72MLX9SN-[856%N0?=D&6 +MYP+,RBK+55"1OLXUV3;V"8-<^`4SE1)K$(D(9WU.'E.R]VHVDC7*=9I7G\U,"D<`+YZ>O>R5X0T?-#D92L[<9"9Y-[\`)O#5;W0Y,!232`\LS0S-"C$/Q029$G":VF67 +MI8"<56\I9P?/)5).^`><$DCN3_L3+<:@4E""AJHH5%E42#8]O/*9JL>^ZK3\ +M9Q`,F$C%/O56GO/)C*52)J6,_;78]YA>%C(H9>PTAA*3TX-ME\"/5;]VL!O> +MRU<'5GVR[47902"1V%B+0*K5]@N:KA6O@LDH[!5+29+K3`((?,$-2''%6KU= +M4D>YD0(R6'G[G&%!(>NT=TW/,>+Y(TF!5-,,DW-4ZF$R\WJHUT'S3MC/G1W7+@L:%`WPV@$V#D;U(&P4,EU+3Z1<:5$T_T3>4(HQI[!H1!MX@)GTM>STR?A15>>4U@,7QDRV +MU""-+F""+F&;K.XH!LSK1C`W1=1.>C=E>LHWLT!9\=K"3L9WN72)9FV*P2^L +M,7BDH-!6=?F8:.TL-+2VL)NJ=H;U#&'&C8ZDN=5J;%4-S#@4JG:&G6>)[0&9 +MZLB>Q#O?>+`Z>V%#>,/@JA?6A=>/K\?T`*@/M:V%[I#Z6MN;P!+`%8DB-5!H +M8.T]_R+^$&->_$*%P&3!DP9_@=(H9SR]X(?XA:J`NOD)?E&MX*+P"Q5%6A/* +M?WD9TROXE]_T_Y?^Q/*'3"Y_3_CW*!H1J+`W\2_PEE<_B.VWG-0'=NHV-E_A +MZ3>LG/M:O`QCNG,X?0,4'*CXX?>XL&.05>"8Y$D@G5!`F/D]-(:&]^_$RG_Q +M$X^3_M<*RDG#:$6\W\;S=\@^IS3$ZK+\/VR(1=9Y]_G'W2(IZ_F-T,U5E$,]*#3,]7NUNM5L:0I0,.4JTJ$S9="-O*@ATE=7 +M.NGF8=BJ8[6]45[?L$WQX4&[VG"/5.7?S@<#_T(K3S[L"&G&^W4:3`.55`?B +M7.J8I"9#A]&7WPH&9Z6@T'IYSLM9)VXQ%=@M+1%2(%ZN$9'^)R6K(4K8?\K]&-%&8P^)9E085YYVSD3Q +MAZ/]E[R2J%H2X.0%G(O?;(PW,8X<+KPJ_JF5;*!YY\[.DJ_5,-#R80P&D%G4 +M0OS--JDXB/R>Z$T1G@*]*H;1L/(AZOL3%);E@,4$*<]2B4M9'H^NS*(J+>"J +M,]ET?B%D0RV*0J1AEM>Y+-*B)TM2$^.OS>8!'L6R#R88F9+N:NHM!!JS;FKH +M@28@J?S*,&`[^V5?FI8\A/)R_P0+9WTZ'WA`7P>1C`%6COE!&8N*8 +MK_B;G/D27I=4T<"_O0B\G`'+<"'@R%#R1/6B$0N[2J%/@`JDR:7!;F]NE#'J +MJ![LC6JMO%&KNO9%6:,-&UV/+7\TKKNZ`L"(H4?'9]X_$L.TI7=IUB":@E?= +M@E>5>9`NV)_>>.AM9-(6KIUE]+H-41*R!?(5D/META"#7R]!4//II%E<77511^R'EX706=L +M"FA&;36S^HSIR+?&F#$G3\D/2ZYVN-E"_^.`@6@L@F]U]24:-5%Y?L3C@7+ +MCI:I89/UDE$5866Q+2H;9K$9ZL8&$-&-MFN$2@$N0/RN/.?UK[VU/?0SQ^LZ +MH3]9?LG2.X74JC/+T;%-)#49(]J)QSH<>:&+AES6@Z(+BQ63F1?%H?,0K5F: +M-"NKKW2BOG\1])U4=)1LU&$4-M+A*_ZPHP"KW3R[A/7YN8;G#FN*7)XL8#ZR +M$?!B_T/@^R!L.Q;7JS +MQO%IQD#F&_;2_$.3@C&W7W6M0Q<-1-X?NHNY:V7YOM]E-:PWRYOM:@JD +M-'-(;LG\5*+(:\2*,H7OTB.&=)2,&SED!3J;8Y@VH(X?`AG:I>>,HES/]UPD +M&M;`4W4H$V#5)78NV5R'Y9\$X/^3=7CVDEED).ZP4FI5Q(RQ0C=(U3Q9N^(* +M]&0A3Z73N6D'OHT]:PAT2S*2*8E8M=Z(U&JH7'@1C'FYQ)G$C?3\6.X:492= +M=.@\]BQ1<.[*\R^B\219#7G$30>JTR#GR$!6U58;1['MJK'^!*.XV)GVH,,[ +M>YTO/.[)Q<[>/N092`HV7NND*H2'\RY]Z&6/`24P.`@+IFT01=NV:(H/+%P6J43V/`W, +MYI6V.8X;OX"ULRT^E>05O;0;/CD[(/P_;^]-9^_[S>+A[MM.&9[^LRSV:O!_ +M'?YOP/]-^+\%_Z_#_VWX?P/^WRQ1S#>LD\+>XE![7D%^\%7Q-X(48L,$J>4I +M0N''>GM7LVYCS#/ZR8G?K(3-7*>-Q?)W,IYOKY(YG;.\XU% +M,L.8VB.#D$Q]=UF@:DD(.5$>@9I[9!SG>?B-4/J\L@[?E[LH5IU%L6I!@?L_.1PSL[(;PCOC(T-V`B6 +M;K>%.-)5;=R2O=37YR]UF`I:K+EEM!?;+G/+V5A\VY5D40^V@W7+E,..U4J$ +M<3OQT`>-($(I*:R?65Z2"OTO\_?'O-# +MQH]$7Y>R>+%[$OG320;572K0?MMN; +MWO$^T7Z?8WN/UV%M/^D\YK0GB@-NSMGD&MTR%QS7#")6ME@ZN3SD%R +MX'[BC;&Y7EZO-I,;XS-.S>;C3PU>GI;_A!.4MZO,:XS`AF&_ZK9[EPP.EJ)V +MT"++&WV!'KH93/^H:^P:UCG9/7QY:L\3/M\_/#['7LM+8P.D7,.#'0HAJ]LA +M.K4R,CKZZ\L(HCI(7A(ST=R::%<%V3'7S=X>P=5TOVK%%3>]Z1?ZV%J-5EIX +MI]&H6U%H'I?HN8#P@\#R7ET!,PZM+HL@)"4+6X#S`:??BG`2!_U+TMIC/-_+ +M,.CWE`Y?IUJC`(L(`$U4&^]!;?Z9D./#R]L*#-WCW/BX-%>M,@`M1J&!^UNF$Y3-8=[/=$W@QFNY7#;*N<'L6EX=B2;..#5XYD +MQ,(@_)BX7F_5R_"G;0'7RD>6GA_%\J$7C=`NNXY2.N(M)7X2FT*&VV4QE+], +MN':IRY)*$/,<9/Z?^0XR@54[4GA3*K8[YE#&Z%"U98PNX&DO%\0.'YV%@C300;-[ +MY*0RPG8M-1O-!D:O4E>4&;($+8-WW`ITVEB+1FZ?[4ST1OF:C&A45)O!X&5^+_$XDZAJC.@F-;%0F_>8L@8ID*]LXA,DSAJ7:B +M/9T;:RJ5I*RGE$NSBJ-TE8J!732PM'MHV,FP%M/!!5!YV%0T8A*:]F.@O#0# +M"?Y/NZ/9;,`4K2?@*1]KBF;'(Z+AEK')YDYF8?F9Q!8L.)N%!YS*@C6/3S$Z +MF!J-G"A0>"L6VQ'4V#KJMA\P@C"K-I4)$`5>$C%%]>U%08SNN`BPZ'90NX!* +MC!8FZI25D,*9N%"CW:L5PARD.7&)O1I'U=_THME6`:B6FR)5<$5:H\##N\V$ +M-9G6\)N-=/\-=4]BV=K$G6C9+-6;>)JU&JW4YI2$>U6?TN*Y.=&9Q",0<2H5 +M[%MS\$,Y^L5W.PX+8,"84R?"Z@+6OFGC6QA/0MK.6\7N&H[II,.[91PYV#S9 +M48Q$D8D0+NB;$N&E%\0KR9G3F4>HM^_&E=I[]N"#WGT(,&0A*;Z+J_#?#Z^. +M1;<&9:V.4>-FO4Z(_[%$Y$MN(ES[S4O8&L]SS!+6B +M&!)')D+Q'5,B^+JZ6C(^BSFN4'KWAKSI,(_B;6#9.JG37DZV +M4U.!UYCFSQ8^M"Q>B@JX`S5;E2"TG/;YCF'*2M+/]3?E[VIW*8M2A2Z%4KDT +MF5J5H*^K$O0U53Z?HV@XS7I4FT34\LB$UKC:I**61RXX>6$.T5`-RB0<9BR< +ML10[)D(@#4'%C.3VDD.8SOG)S+3^:E.CRZC?CSX20()$'QCY$U3H6JCCH@@$ +M`F$07IR_0JS3]VISR[",L0QCH$.8VEF1R$"[1$5F+@GUQ4Y5!QJCDT)MXQ*2 +M&K5W"_KH);JKN7^%,3)CS)/]Y1I`,)'=-'1)#P22SJS>A^^W1+C%.B3XO67* +M"H?B:1[1L'KHCZ^F:`ZVY<2#A;%4!`KS1NX# +M0U)L])3W@#;9N!2C""961Z2%O):F0QI5/HJ.0]65J]W86,\--J5>"=U@I=E0 +M#PKUJN59L+'5K&XUC8.C+EHI-72V#'5&7D2[I8Q:-]&FPQ+@Z?>Z=7.(\VO! +M]LDH2FM7:V)W_Y^BN7:CH[+I6P)]LH%TLO<]^GR?=1`Q*M_.U?6<53["A-8` +MA*<78LUH:G@3=*?2?D0'@2/C_W05`ROU/.2`D]D6D8262HPG +M!YUVWKD$H?3D7E'KF#K,C%2G0`9SX\HI7`+%H< +M8!A\K(Q]G0*AEE%1W"<\[AI1W$_;6EW])N!(4;Z8D*B:",1$,8H&:]>"$3KZ +MP.521"T,D%892*V=O$A`G+A:VY*,_CA]E@E7:*E4-%71&;+6V:R,%2A:9TZN +MO\\URLDE.<8H*]&ES8:!?3D=,`LTGO0YSJ@)ZM6#=W2H3OI6M%&E4@J& +M'B9@2)[BRU?[((CT&;&^E#:)0\0G1$=0^]2*>])L;M3+\,=2U3?1`*#9JMD1 +MRY0F"*/F$7XKAA+L=#H2<04;>N@?QF5!"@8,P]!'E[3)-8*F"5S3-DJT'DR= +MVQL"V35&_7HGC%1\48V@JR%_*6H:AGA@LUL65+&'@_!_\3XL(:[&Y$/7]8&T +MQW*Z?();'B.V%KN$<$D,I^1/IT#Y-+80Z* +M_*KI?P[U/SLY[U#H.[V]]MF!`.W4;/<6<8$G%I#HE.,I^]0\"J-(->6;E;7R +MH.3E&R&;JEE$^EFP/4]K6ZVZ8U?6RL&V<<[K-AH$C)3:*L*IQ%-^2$Z(XG%\%5.#Q=BYC8CR=`_?`7(96-PBX"@.R=G)V>G;]Z +MY9UY>QRZ^12HZE^*J>KZ#_1>O]_;J,CO> +M$,C\5,31!SA80HPE7HDE%G;0OZQ\D.%I;Y`Q9"=R"5PB,:.I)BJ!=AP]%#)P +MN-P'5Y"C2_BFTBB[K.6P/_KHB,I+"W#PD<W&M:&;#63.]+.FMZ4. +MY_"\$L05+:1VI%Q-()[X$_\BWWP1L)M`X,>(=IGP)[.O%M@=Z%WU/5TJ8$0K +MG51H%!)&(&9E"KE(O-Q7F#PZ@;[:YTM@TG@BNVT-_1I\#"^_Q`1\]>_]46S3 +ML'^[!GOUL]11K56KZ\WF5[@'V^ONO_!I-1OK7T&2%J9KU-J0OMYLU;\2U<_2 +MFL1GBAZ.0GP53*+K6>DFX_YC-.>Q/]9I@BBJ2/^$W7!UI%C/"C6Q.[(<>MI;+0/Y8VI0)XJ3LV:=)>M;C1G0/_MHLG-P(#D& +MLYVOX7W$C+SLO +MSE];/,D5D+TTIW)4!Q9(/=X_W#LX?]D!#N@O10S#H?BAOQ0S.9V2E=6NC;*? +MO3GI[+[T%$?U>E^*]P>!U>A!,/.9G_ +M4BS3;D]I]T6TQ%"(4^2B&"\,Q!G-=Z$4!/DK87P;3^`XDG<2K""28Z]9S/_4 +ML0<6=AA5,I2CCSPIR0V4PW'3QE'>/0MN'"4U?(MZ)%L^2$R0.QGV-+T]/SC; +M1WA&+3=<505;T5XQ5=WWWYLO.&9*5XW(6NE+Z=4B"A2N]C?:V;^;ARV0O@U4^9;E?_ +M<1.SS&[ZW67D)70DMO2]-DK-1X>O]E][;W"X0<(]Z[QE[46K42_#']L, +M&2_5KJ/HEWCMFFXB*@19#C^ZEU=]_S::3N#[.,#(.O0(4:^OY72)ZRB>J,Q` +M\78/7[\Y.OJ>`@]AY=VKL3^ZIG=[1S]T3G9?=_`Q71!51E&$GKL@"L';/6PI +MGKUFR="OX^.,)?03VT-67DIZ@ZYS.S^M_$4"4GK#:`A23#0,NWZ_]-,*-1;3 +MVT-K#=;1^1D&X#TZ1ET?2@X(;DLC2E^RQY.Z%P'+PT&#\""@9PIB"M<.J43T +MD!L=[9]YR!/7W'_\2?B]N?,OGR^?+Y\OGR^?+Y\OGR^?+Y\OGR^?+Y\OGR^? +0+Y\OG_M__G_9]%80`#`"```` +` +end --- gcc-3.4-3.4.2.orig/debian/patches/netbsd-archs-gcc.dpatch +++ gcc-3.4-3.4.2/debian/patches/netbsd-archs-gcc.dpatch @@ -0,0 +1,40 @@ +#! /bin/sh -e + +# DP: Arch-specific changes to gcc.config + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc/config.gcc src/gcc/config.gcc +--- gcc/config.gcc 2003-03-02 07:39:03.000000000 +0000 ++++ gcc/config.gcc 2003-04-24 06:02:55.000000000 +0000 +@@ -1127,6 +1127,9 @@ + x86_64-*-freebsd*) + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h ${fbsd_tm_file} i386/x86-64.h i386/freebsd.h i386/freebsd64.h" + ;; ++i[34567]86-*-netbsdelf*-gnu*) ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd-gnu.h netbsd-elf-gnu.h i386/netbsd-elf.h" ++ ;; + i[34567]86-*-netbsdelf*) + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/netbsd-elf.h" + ;; --- gcc-3.4-3.4.2.orig/debian/patches/hurd-changes.dpatch +++ gcc-3.4-3.4.2/debian/patches/hurd-changes.dpatch @@ -0,0 +1,42 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Traditional GNU systems don't have a /usr directory. However, Debian +# DP: systems do, and we support both having a /usr -> . symlink, and having a +# DP: /usr directory like the other ports. So this patch should NOT go +# DP: upstream. + +--- gcc/config/t-gnu.old 2003-04-27 15:01:15.000000000 -0400 ++++ gcc/config/t-gnu 2003-04-27 15:01:48.000000000 -0400 +@@ -1,2 +1,3 @@ + # In GNU, "/usr" is a four-letter word. +-NATIVE_SYSTEM_HEADER_DIR = /include ++# Overridden for Debian GNU/Hurd (hurd-i386) ++NATIVE_SYSTEM_HEADER_DIR = /usr/include + + + + + --- gcc-3.4-3.4.2.orig/debian/patches/reporting.dpatch +++ gcc-3.4-3.4.2/debian/patches/reporting.dpatch @@ -0,0 +1,170 @@ +#! /bin/sh -e + +# DP: Add Debian URL for bug reporting isntructions. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir=$3/ +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + if grep -q debian_bug_report_url ${dir}gcc/version.c; then + : + else + echo 'const char debian_bug_report_url[] = "";' >> ${dir}gcc/version.c + fi + ;; + -unpatch) + grep -v debian_bug_report_url ${dir}gcc/version.c > ${dir}gcc/version.c.new + ${dir}move-if-change ${dir}gcc/version.c.new ${dir}gcc/version.c + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/gccbug.in~ Tue Nov 14 07:21:47 2000 ++++ gcc/gccbug.in Tue Nov 14 07:24:59 2000 +@@ -24,13 +24,13 @@ + VERSION=3.113 + + # The submitter-id for your site. +-SUBMITTER=net ++SUBMITTER=net # net-debian + + # The default mail address for PR submissions. +-GNATS_ADDR=gcc-gnats@gcc.gnu.org ++GNATS_ADDR="gcc-gnats@gcc.gnu.org,debian-gcc@lists.debian.org" + + # The default release for this host. +-DEFAULT_RELEASE="@gcc_version_full@" ++DEFAULT_RELEASE="@gcc_version_full@ (Debian testing/unstable)" + + # The default organization. + DEFAULT_ORGANIZATION= + +--- gcc/java/gjavah.c~ 2003-03-28 23:18:48.000000000 +0100 ++++ gcc/java/gjavah.c 2004-05-14 07:26:44.000000000 +0200 +@@ -2320,6 +2320,8 @@ + printf ("\n"); + printf ("For bug reporting instructions, please see:\n"); + printf ("%s.\n", bug_report_url); ++ printf ("For Debian GNU/Linux specific bug reporting instructions, please see:\n"); ++ printf ("%s.\n", debian_bug_report_url); + exit (0); + } + +--- gcc/java/jcf-dump.c~ 2003-03-28 23:18:48.000000000 +0100 ++++ gcc/java/jcf-dump.c 2004-05-14 07:27:03.000000000 +0200 +@@ -893,6 +893,8 @@ + printf ("\n"); + printf ("For bug reporting instructions, please see:\n"); + printf ("%s.\n", bug_report_url); ++ printf ("For Debian GNU/Linux specific bug reporting instructions, please see:\n"); ++ printf ("%s.\n", debian_bug_report_url); + exit (0); + } + +--- gcc/java/jv-scan.c~ 2003-02-03 15:06:32.000000000 +0100 ++++ gcc/java/jv-scan.c 2004-05-14 07:27:26.000000000 +0200 +@@ -116,6 +116,8 @@ + printf ("\n"); + printf ("For bug reporting instructions, please see:\n"); + printf ("%s.\n", bug_report_url); ++ printf ("For Debian GNU/Linux specific bug reporting instructions, please see:\n"); ++ printf ("%s.\n", debian_bug_report_url); + exit (0); + } + +--- gcc/gcov.c~ 2002-10-08 21:45:17.000000000 +0200 ++++ gcc/gcov.c 2004-05-14 07:28:07.000000000 +0200 +@@ -350,6 +350,8 @@ + fnotice (file, " -p, --preserve-paths Preserve all pathname components\n"); + fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n", + bug_report_url); ++ fnotice (file, "\nFor Debian GNU/Linux specific bug reporting instructions, please see:\n%s.\n", ++ debian_bug_report_url); + exit (status); + } + +--- gcc/version.h~ 2002-10-08 19:27:39.000000000 +0200 ++++ gcc/version.h 2004-05-14 07:14:38.000000000 +0200 +@@ -2,4 +2,5 @@ + #define GCC_VERSION_H + extern const char version_string[]; + extern const char bug_report_url[]; ++extern const char debian_bug_report_url[]; + #endif /* ! GCC_VERSION_H */ + +--- gcc/diagnostic.c~ 2004-05-14 07:39:39.000000000 +0200 ++++ gcc/diagnostic.c 2004-05-14 07:42:06.000000000 +0200 +@@ -66,7 +66,9 @@ + #define bug_report_request \ + "Please submit a full bug report,\n\ + with preprocessed source if appropriate.\n\ +-See %s for instructions.\n" ++See %s for instructions.\n\ ++For Debian GNU/Linux specific bug reporting instructions,\n\ ++see %s.\n" + + + /* Return a malloc'd string containing MSG formatted a la printf. The +@@ -271,7 +273,7 @@ + if (context->abort_on_error) + real_abort (); + +- fnotice (stderr, bug_report_request, bug_report_url); ++ fnotice (stderr, bug_report_request, bug_report_url, debian_bug_report_url); + exit (FATAL_EXIT_CODE); + + case DK_FATAL: +@@ -570,7 +572,7 @@ + + fnotice (stderr, + "Internal compiler error: Error reporting routines re-entered.\n"); +- fnotice (stderr, bug_report_request, bug_report_url); ++ fnotice (stderr, bug_report_request, bug_report_url, debian_bug_report_url); + exit (FATAL_EXIT_CODE); + } + +--- gcc/gcc.c~ 2004-05-16 08:14:42.000000000 +0200 ++++ gcc/gcc.c 2004-05-16 08:19:13.000000000 +0200 +@@ -2829,9 +2829,11 @@ + fatal ("\ + Internal error: %s (program %s)\n\ + Please submit a full bug report.\n\ +-See %s for instructions.", ++See %s for instructions.\n\ ++For Debian GNU/Linux specific bug reporting instructions, see\n\ ++%s.\n", + strsignal (WTERMSIG (status)), commands[j].prog, +- bug_report_url); ++ bug_report_url, debian_bug_report_url); + signal_count++; + ret_code = -1; + } +@@ -6250,6 +6252,8 @@ + { + printf (_("\nFor bug reporting instructions, please see:\n")); + printf ("%s.\n", bug_report_url); ++ printf ("For Debian GNU/Linux specific bug reporting instructions, please see:\n"); ++ printf ("%s.\n", debian_bug_report_url); + + return (0); + } +@@ -6453,6 +6457,8 @@ + { + printf (("\nFor bug reporting instructions, please see:\n")); + printf ("%s\n", bug_report_url); ++ printf ("For Debian GNU/Linux specific bug reporting instructions, please see:\n"); ++ printf ("%s\n", debian_bug_report_url); + } + + return (signal_count != 0 ? 2 --- gcc-3.4-3.4.2.orig/debian/patches/libffi-soversion.dpatch +++ gcc-3.4-3.4.2/debian/patches/libffi-soversion.dpatch @@ -0,0 +1,61 @@ +#! /bin/sh -e + +# DP: Install libffi with soversion 3. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN libffi.old/Makefile.am libffi/Makefile.am +--- libffi.old/Makefile.am 2003-10-22 01:02:59.000000000 +0200 ++++ libffi/Makefile.am 2004-02-21 10:06:49.000000000 +0100 +@@ -175,7 +175,7 @@ + + AM_CFLAGS = -Wall -g -fexceptions + +-libffi_la_LDFLAGS = -release $(VERSION) ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` + + INCLUDES = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + +diff -urN libffi.old/Makefile.in libffi/Makefile.in +--- libffi.old/Makefile.in 2003-11-24 00:52:28.000000000 +0100 ++++ libffi/Makefile.in 2004-02-21 10:06:49.000000000 +0100 +@@ -226,7 +226,7 @@ + + AM_CFLAGS = -Wall -g -fexceptions + +-libffi_la_LDFLAGS = -release $(VERSION) ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` + + INCLUDES = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +diff -urN libffi.old/libtool-version libffi/libtool-version +--- libffi.old/libtool-version 1970-01-01 01:00:00.000000000 +0100 ++++ libffi/libtool-version 2004-02-21 10:06:49.000000000 +0100 +@@ -0,0 +1,6 @@ ++# This file is used to maintain libtool version info for libffi. See ++# the libtool manual to understand the meaning of the fields. This is ++# a separate file so that version updates don't involve re-running ++# automake. ++# CURRENT:REVISION:AGE ++3:0:0 --- gcc-3.4-3.4.2.orig/debian/patches/ignore-comp-fail.dpatch +++ gcc-3.4-3.4.2/debian/patches/ignore-comp-fail.dpatch @@ -0,0 +1,40 @@ +#! /bin/sh -e + +# DP: Ignore the bootstrap comparision failure + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/Makefile.in~ 2004-02-06 08:03:12.000000000 +0100 ++++ gcc/Makefile.in 2004-02-14 10:27:19.000000000 +0100 +@@ -3567,7 +3567,9 @@ + if [ -f .bad_compare ]; then \ + echo "Bootstrap comparison failure!"; \ + cat .bad_compare; \ +- exit 1; \ ++ echo ""; \ ++ echo "Ignore the comparision failure!"; \ ++ true; \ + else \ + case "$@" in \ + *-lean ) rm -rf stage$$stage ;; \ --- gcc-3.4-3.4.2.orig/debian/patches/ada-no-gnatpsta.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-no-gnatpsta.dpatch @@ -0,0 +1,57 @@ +#! /bin/sh -e + +# DP: Don't build the gnatpsta tool + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2003-10-22 Arnaud Charlet + + * Makefile.in: Disable build of gnatpsta. PR ada/10110. + +--- gcc/ada/Makefile.in~ 2003-07-04 21:53:53.000000000 +0200 ++++ gcc/ada/Makefile.in 2003-10-29 11:02:58.000000000 +0100 +@@ -1609,7 +1609,7 @@ + TOOLSCASE=native \ + ../../gnatchop$(exeext) ../../gnat$(exeext) ../../gnatkr$(exeext) \ + ../../gnatls$(exeext) ../../gnatprep$(exeext) \ +- ../../gnatpsta$(exeext) ../../gnatxref$(exeext) \ ++ ../../gnatxref$(exeext) \ + ../../gnatfind$(exeext) ../../gnatname$(exeext) + + # These tools are only built for the native version. +@@ -1653,10 +1653,10 @@ + $(TOOLS_LIBS) + + ../../gnatpsta$(exeext): deftarg.o +- $(GNATMAKE) -c $(ADA_INCLUDES) gnatpsta --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatpsta +- $(GNATLINK) -v gnatpsta -o $@ --GCC="$(CC) $(ADA_INCLUDES)"\ +- ../targtyps.o deftarg.o $(TOOLS_LIBS) ++# $(GNATMAKE) -c $(ADA_INCLUDES) gnatpsta --GCC="$(CC) $(ALL_ADAFLAGS)" ++# $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatpsta ++# $(GNATLINK) -v gnatpsta -o $@ --GCC="$(CC) $(ADA_INCLUDES)"\ ++# ../targtyps.o deftarg.o $(TOOLS_LIBS) + + ../../gnatxref$(exeext): + $(GNATMAKE) -c $(ADA_INCLUDES) gnatxref --GCC="$(CC) $(ALL_ADAFLAGS)" --- gcc-3.4-3.4.2.orig/debian/patches/gpc-3.x.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-3.x.dpatch @@ -0,0 +1,42 @@ +#! /bin/sh -e + +# DP: The gpc patch from the gpc tarball. + +if [ "x$gpc_gcc_patch" = "x" ] +then + gpc_gcc_patch=gcc-3.2.1.diff +fi + +pdir=gcc +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="$3/gcc" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +gpc_gcc_patch=$pdir/p/diffs/gcc-3.3.diff +gpc_gcc_patch=debian/patches/gcc-3.4.diff8 + +case "$1" in + -patch) + # keep the backup files ... to regenerate p/diffs/${gpc_gcc_patch} + # dan@debian.org: no, don't. Apply it by hand if you need to regen. + # get the patch from the gpc source + echo Using patch file ${gpc_gcc_patch} + patch -d $pdir -f -p2 < ${gpc_gcc_patch} + #pf=`echo $0 | sed 's/\.dpatch/.diff/'` + #patch -d $pdir -f -p1 < $pf + ;; + -unpatch) + # get the patch from the gpc source + echo Using patch file ${gpc_gcc_patch} + patch -d $pdir -f -R -p2 < ${gpc_gcc_patch} + #pf=`echo $0 | sed 's/\.dpatch/.diff/'` + #patch -d $pdir -f -R -p1 < $pf + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 --- gcc-3.4-3.4.2.orig/debian/patches/s390-biarch.dpatch +++ gcc-3.4-3.4.2/debian/patches/s390-biarch.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: enable biarch for 31 bit compiler + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/config.gcc.bak 2003-02-25 09:24:14.000000000 +0000 ++++ src/gcc/config.gcc 2003-02-25 09:23:42.000000000 +0000 +@@ -2199,7 +2199,7 @@ + ;; + s390-*-linux*) + tm_file="s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h" +- tmake_file="t-slibgcc-elf-ver t-linux s390/t-crtstuff" ++ tmake_file="t-slibgcc-elf-ver t-linux s390/t-crtstuff s390/t-linux64" + ;; + s390x-*-linux*) + tm_file="s390/s390x.h s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h" --- gcc-3.4-3.4.2.orig/debian/patches/libstdc++-baseline.dpatch +++ gcc-3.4-3.4.2/debian/patches/libstdc++-baseline.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e + +# DP: overwrite baseline detection for i386: use the i486 headers + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libstdc++-v3/configure.target~ 2003-06-19 19:55:35.000000000 +0200 ++++ libstdc++-v3/configure.target 2003-06-20 09:15:08.000000000 +0200 +@@ -91,6 +91,14 @@ + ;; + esac + ++# Debian adjustments ++echo "LIBSTDCXX TARGET CPU: $target_cpu" ++case "${target_cpu}" in ++ i386) ++ # we use the i486 ABI ... ++ try_cpu=i486 ++ ;; ++esac + + # Now look for the file(s) usually tied to a CPU model, and make + # default choices for those if they haven't been explicitly set --- gcc-3.4-3.4.2.orig/debian/patches/s390-config-ml.dpatch +++ gcc-3.4-3.4.2/debian/patches/s390-config-ml.dpatch @@ -0,0 +1,101 @@ +#! /bin/sh -e + +# DP: disable all libraries except libstdc++ for biarch + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/config-ml.in.bak 2002-11-12 15:32:40.000000000 +0100 ++++ src/config-ml.in 2002-11-12 15:38:55.000000000 +0100 +@@ -516,6 +516,48 @@ + ;; + esac + ;; ++s390-*-*) ++ ac_configure_args="${ac_configure_args} --host=s390x-linux" ++ ++ case " $multidirs " in ++ *" 64 "*) ++ # We will not be able to create libraries with -m64 if ++ # we cannot even link a trivial program. It usually ++ # indicates the 64bit libraries are missing. ++ if echo 'main() {}' > conftest.c && ++ ${CC-gcc} -m64 conftest.c -o conftest; then ++ echo Enable only libstdc++. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *64* ) case ${ml_realsrcdir} in ++ *"libstdc++-v3" ) multidirs="${multidirs} ${x}" ;; ++ *"libf2c" ) multidirs="${multidirs} ${x}" ;; ++ *"libobjc" ) multidirs="${multidirs} ${x}" ;; ++ *"libiberty" ) multidirs="${multidirs} ${x}" ;; ++ *"zlib" ) multidirs="${multidirs} ${x}" ;; ++ *) : ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done ++ else ++ echo Could not link program with -m64, disabling it. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *64* ) : ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done ++ fi ++ rm -f conftest.c conftest ++ ;; ++ esac ++ ;; + esac + + # Remove extraneous blanks from multidirs. +@@ -898,9 +900,20 @@ + fi + fi + ++ ml_configure_args= ++ for arg in ${ac_configure_args} ++ do ++ case $arg in ++ *CC=*) ml_configure_args=${ml_config_env} ;; ++ *CXX=*) ml_configure_args=${ml_config_env} ;; ++ *GCJ=*) ml_configure_args=${ml_config_env} ;; ++ *) ;; ++ esac ++ done ++ + if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \ + --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ +- ${ac_configure_args} ${ml_srcdiroption} ; then ++ ${ac_configure_args} ${ml_configure_args} ${ml_srcdiroption} ; then + true + else + exit 1 + --- gcc-3.4-3.4.2.orig/debian/patches/template.dpatch +++ gcc-3.4-3.4.2/debian/patches/template.dpatch @@ -0,0 +1,33 @@ +#! /bin/sh -e + +# All lines beginning with `# DPATCH:' are a description of the patch. +# DP: + +# remove the next line +exit 0 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + --- gcc-3.4-3.4.2.orig/debian/patches/netbsd-all-gcc.dpatch +++ gcc-3.4-3.4.2/debian/patches/netbsd-all-gcc.dpatch @@ -0,0 +1,397 @@ +#! /bin/sh -e + +# DP: General NetBSD support patches + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc/config/netbsd-elf-gnu.h src/gcc/config/netbsd-elf-gnu.h +--- gcc/config/netbsd-elf-gnu.h 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/config/netbsd-elf-gnu.h 2003-04-24 05:42:44.000000000 +0000 +@@ -0,0 +1,98 @@ ++/* Common configuration file for NetBSD ELF w/ GNU userland targets. ++ Copyright (C) 2002 Free Software Foundation, Inc. ++ Contributed by Wasabi Systems, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* TARGET_OS_CPP_BUILTINS() common to all NetBSD ELF targets. */ ++#define NETBSD_OS_CPP_BUILTINS_ELF() \ ++ do \ ++ { \ ++ NETBSD_OS_CPP_BUILTINS_COMMON(); \ ++ builtin_define ("__ELF__"); \ ++ } \ ++ while (0) ++ ++/* This defines which switch letters take arguments. On NetBSD, most ++ of the normal cases (defined by gcc.c) apply, and we also have -h* ++ and -z* options (for the linker) (coming from SVR4). */ ++ ++#undef SWITCH_TAKES_ARG ++#define SWITCH_TAKES_ARG(CHAR) \ ++ (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ ++ || (CHAR) == 'h' \ ++ || (CHAR) == 'z' \ ++ || (CHAR) == 'R') ++ ++ ++/* Provide a STARTFILE_SPEC appropriate for NetBSD ELF. Here we ++ provide support for the special GCC option -static. On ELF ++ targets, we also add the crtbegin.o file, which provides part ++ of the support for getting C++ file-scope static objects ++ constructed before entering "main". */ ++ ++#define NETBSD_STARTFILE_SPEC \ ++ "%{!shared: \ ++ %{pg:gcrt0%O%s} \ ++ %{!pg: \ ++ %{p:gcrt0%O%s} \ ++ %{!p:crt0%O%s}}} \ ++ %:if-exists(crti%O%s) \ ++ %{static:%:if-exists-else(crtbeginT%O%s crtbegin%O%s)} \ ++ %{!static: \ ++ %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}}" ++ ++#undef STARTFILE_SPEC ++#define STARTFILE_SPEC NETBSD_STARTFILE_SPEC ++ ++ ++/* Provide an ENDFILE_SPEC appropriate for NetBSD ELF. Here we ++ add crtend.o, which provides part of the support for getting ++ C++ file-scope static objects deconstructed after exiting "main". */ ++ ++#define NETBSD_ENDFILE_SPEC \ ++ "%{!shared:crtend%O%s} %{shared:crtendS%O%s} \ ++ %:if-exists(crtn%O%s)" ++ ++#undef ENDFILE_SPEC ++#define ENDFILE_SPEC NETBSD_ENDFILE_SPEC ++ ++/* Provide a LINK_SPEC appropriate for NetBSD ELF. Here we provide ++ support for the special GCC options -assert, -R, -rpath, -shared, ++ -nostdlib, -static, -rdynamic, and -dynamic-linker. ++ ++ Target-specific code can use this in conjunction with any other ++ target-specific LINK_SPEC options. ++ ++ Target-specific code must provide the %(netbsd_entry_point) spec. */ ++ ++/* This differs from native NetBSD only in that the linker is expected to ++ live in /lib, rather than /usr/libexec (or /libexec). */ ++ ++#define NETBSD_LINK_SPEC_ELF \ ++ "%{assert*} %{R*} %{rpath*} \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ -dc -dp \ ++ %{!nostdlib: \ ++ %{!r*: \ ++ %{!e*:-e %(netbsd_entry_point)}}} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld.elf_so}} \ ++ %{static:-static}}" +diff -urN gcc/config/netbsd-gnu.h src/gcc/config/netbsd-gnu.h +--- gcc/config/netbsd-gnu.h 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/config/netbsd-gnu.h 2003-04-24 05:41:04.000000000 +0000 +@@ -0,0 +1,206 @@ ++/* Base configuration file for all NetBSD w/ GNU userland targets. ++ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 ++ Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* TARGET_OS_CPP_BUILTINS() common to all NetBSD targets. */ ++#define NETBSD_OS_CPP_BUILTINS_COMMON() \ ++ do \ ++ { \ ++ builtin_define ("__NetBSD__"); \ ++ builtin_assert ("system=unix"); \ ++ builtin_assert ("system=NetBSD"); \ ++ } \ ++ while (0) ++ ++/* TARGET_OS_CPP_BUILTINS() common to all LP64 NetBSD targets. */ ++#define NETBSD_OS_CPP_BUILTINS_LP64() \ ++ do \ ++ { \ ++ builtin_define ("_LP64"); \ ++ } \ ++ while (0) ++ ++/* CPP_SPEC parts common to all NetBSD targets. */ ++#define NETBSD_CPP_SPEC \ ++ "%{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++/* NETBSD_NATIVE is defined only when gcc is integrated into a NetBSD ++ system with a NetBSD userland - NetBSD with a GNU userland never defines ++ it, and all references to it have been removed for this system type. */ ++ ++/* FIXME: This should link to libc, but there are problems with that under ++ 3.2 - find out of they still apply under 3.3! */ ++ ++/* Provide a LIB_SPEC appropriate for NetBSD. Here we: ++ ++ 1. Select the appropriate set of libs, depending on whether we're ++ profiling. ++ ++ 2. Include the pthread library if -pthread is specified (only ++ if threads are enabled). ++ ++ 3. Include the posix library if -posix is specified. ++ ++ FIXME: Could eliminate the duplication here if we were allowed to ++ use string concatenation. */ ++ ++#ifdef NETBSD_ENABLE_PTHREADS ++#define NETBSD_LIB_SPEC \ ++ "%{pthread: \ ++ %{!p: \ ++ %{!pg:-lpthread}} \ ++ %{p:-lpthread_p} \ ++ %{pg:-lpthread_p}} \ ++ %{posix: \ ++ %{!p: \ ++ %{!pg:-lposix}} \ ++ %{p:-lposix_p} \ ++ %{pg:-lposix_p}} \ ++ %{!shared: \ ++ %{!symbolic: \ ++ %{!p: \ ++ %{!pg:-lc}} \ ++ %{p:-lc_p} \ ++ %{pg:-lc_p}}}" ++#else ++#define NETBSD_LIB_SPEC \ ++ "%{posix: \ ++ %{!p: \ ++ %{!pg:-lposix}} \ ++ %{p:-lposix_p} \ ++ %{pg:-lposix_p}} \ ++ %{!shared: \ ++ %{!symbolic: \ ++ %{!p: \ ++ %{!pg:-lc}} \ ++ %{p:-lc_p} \ ++ %{pg:-lc_p}}}" ++#endif ++ ++#undef LIB_SPEC ++#define LIB_SPEC NETBSD_LIB_SPEC ++ ++/* Provide a LIBGCC_SPEC appropriate for NetBSD. We also want to exclude ++ libgcc with -symbolic. */ ++ ++#ifdef NETBSD_NATIVE ++#define NETBSD_LIBGCC_SPEC \ ++ "%{!symbolic: \ ++ %{!shared: \ ++ %{!p: \ ++ %{!pg: -lgcc}}} \ ++ %{shared: -lgcc_pic} \ ++ %{p: -lgcc_p} \ ++ %{pg: -lgcc_p}}" ++#else ++#define NETBSD_LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}" ++#endif ++ ++#undef LIBGCC_SPEC ++#define LIBGCC_SPEC NETBSD_LIBGCC_SPEC ++ ++/* When building shared libraries, the initialization and finalization ++ functions for the library are .init and .fini respectively. */ ++ ++#define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC) \ ++ do { \ ++ fprintf ((STREAM), "void __init() __asm__ (\".init\");"); \ ++ fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC)); \ ++ } while (0) ++ ++#define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC) \ ++ do { \ ++ fprintf ((STREAM), "void __fini() __asm__ (\".fini\");"); \ ++ fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC)); \ ++ } while (0) ++ ++#undef TARGET_HAS_F_SETLKW ++#define TARGET_HAS_F_SETLKW ++ ++/* Implicit library calls should use memcpy, not bcopy, etc. */ ++ ++#undef TARGET_MEM_FUNCTIONS ++#define TARGET_MEM_FUNCTIONS 1 ++ ++/* Handle #pragma weak and #pragma pack. */ ++ ++#define HANDLE_SYSV_PRAGMA 1 ++ ++ ++/* Define some types that are the same on all NetBSD platforms, ++ making them agree with . */ ++ ++#undef WCHAR_TYPE ++#define WCHAR_TYPE "int" ++ ++#undef WCHAR_TYPE_SIZE ++#define WCHAR_TYPE_SIZE 32 ++ ++#undef WINT_TYPE ++#define WINT_TYPE "int" ++ ++ ++/* Attempt to turn on execute permission for the stack. This may be ++ used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is, ++ if the target machine can change execute permissions on a page). ++ ++ There is no way to query the execute permission of the stack, so ++ we always issue the mprotect() call. ++ ++ Note that we go out of our way to use namespace-non-invasive calls ++ here. Unfortunately, there is no libc-internal name for mprotect(). ++ ++ Also note that no errors should be emitted by this code; it is considered ++ dangerous for library calls to send messages to stdout/stderr. */ ++ ++#define NETBSD_ENABLE_EXECUTE_STACK \ ++extern void __enable_execute_stack (void *); \ ++void \ ++__enable_execute_stack (addr) \ ++ void *addr; \ ++{ \ ++ extern int mprotect (void *, size_t, int); \ ++ extern int __sysctl (int *, unsigned int, void *, size_t *, \ ++ void *, size_t); \ ++ \ ++ static int size; \ ++ static long mask; \ ++ \ ++ char *page, *end; \ ++ \ ++ if (size == 0) \ ++ { \ ++ int mib[2]; \ ++ size_t len; \ ++ \ ++ mib[0] = 6; /* CTL_HW */ \ ++ mib[1] = 7; /* HW_PAGESIZE */ \ ++ len = sizeof (size); \ ++ (void) __sysctl (mib, 2, &size, &len, NULL, 0); \ ++ mask = ~((long) size - 1); \ ++ } \ ++ \ ++ page = (char *) (((long) addr) & mask); \ ++ end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \ ++ \ ++ /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \ ++ (void) mprotect (page, end - page, 7); \ ++} +diff -urN gcc/config/t-netbsd-gnu src/gcc/config/t-netbsd-gnu +--- gcc/config/t-netbsd-gnu 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/config/t-netbsd-gnu 2003-02-21 10:31:17.000000000 +0000 +@@ -0,0 +1,5 @@ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Always build crtstuff with PIC. ++CRTSTUFF_T_CFLAGS = -fPIC +diff -urN gcc/config.gcc src/gcc/config.gcc +--- gcc/config.gcc 2003-03-02 07:39:03.000000000 +0000 ++++ gcc/config.gcc 2003-04-24 06:02:55.000000000 +0000 +@@ -329,6 +329,45 @@ + ;; + esac + ;; ++*-*-netbsd*-gnu*) ++ tmake_file="t-slibgcc-elf-ver t-libc-ok t-netbsd" ++ xm_defines=POSIX ++ gas=yes ++ gnu_ld=yes ++ ++ # This section MUST go above the matches for Hurd and native NetBSD, ++ # or they will catch the value, due to using excessively permissive ++ # match values. Also, $machine doesn't contain any version data, on ++ # a NetBSD w/ GNU userland machine, so we use uname -r instead. ++ ++ osr=`uname -r` ++ ++ # NetBSD 2.0 and later get POSIX threads enabled by default. ++ # Allow them to be explicitly enabled on any other version. ++ case x${enable_threads} in ++ x) ++ case $osr in ++ [2-9]*) ++ thread_file='posix' ++ tm_defines="${tm_defines} NETBSD_ENABLE_PTHREADS" ++ ;; ++ esac ++ ;; ++ xyes | xposix) ++ thread_file='posix' ++ tm_defines="${tm_defines} NETBSD_ENABLE_PTHREADS" ++ ;; ++ esac ++ ++ # NetBSD 1.7 and later are set up to use GCC's crtstuff for ++ # ELF configurations. We will clear extra_parts in the ++ # a.out configurations. ++ case $osr in ++ 1.[7-9]* | [2-9]*) ++ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o" ++ ;; ++ esac ++ ;; + *-*-gnu*) + # On the Hurd, the setup is just about the same on + # each different CPU. The specific machines that we --- gcc-3.4-3.4.2.orig/debian/patches/netbsd-dynlinker.dpatch +++ gcc-3.4-3.4.2/debian/patches/netbsd-dynlinker.dpatch @@ -0,0 +1,47 @@ +#! /bin/sh -e + +# JB: Dynamic linker patches for netbsd. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -ur src.orig/gcc/config/i386/netbsd-elf.h src/gcc/config/i386/netbsd-elf.h +--- src.orig/gcc/config/i386/netbsd-elf.h 2002-03-01 23:38:15.000000000 +0000 ++++ src/gcc/config/i386/netbsd-elf.h 2003-01-21 19:44:46.000000000 +0000 +@@ -35,7 +35,7 @@ + %{!e*:-e __start}}} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld.elf_so}} \ + %{static:-static}}" + + /* Names to predefine in the preprocessor for this target machine. */ +diff -ur src.orig/gcc/config/netbsd-elf.h src/gcc/config/netbsd-elf.h +--- src.orig/gcc/config/netbsd-elf.h 2002-01-22 04:23:02.000000000 +0000 ++++ src/gcc/config/netbsd-elf.h 2003-01-21 19:44:27.000000000 +0000 +@@ -72,5 +72,5 @@ + %{!e*:-e __start}}} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld.elf_so}} \ + %{static:-static}}" --- gcc-3.4-3.4.2.orig/debian/patches/libjava-no-rpath.dpatch +++ gcc-3.4-3.4.2/debian/patches/libjava-no-rpath.dpatch @@ -0,0 +1,104 @@ +#! /bin/sh -e + +# DP: work around libtool adding ld run path to gcj tools + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/Makefile.am~ 2004-01-26 07:36:06.000000000 +0100 ++++ libjava/Makefile.am 2004-02-21 22:39:34.000000000 +0100 +@@ -719,7 +719,7 @@ + ## need this because we are explicitly using libtool to link using the + ## `.la' file. + jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + jv_convert_LINK = $(GCJLINK) + ## We don't explicitly link in the libraries we need; libgcj.la brings + ## in all dependencies. We need the -L so that gcj can find libgcj +@@ -738,7 +738,8 @@ + ## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We + ## need this because we are explicitly using libtool to link using the + ## `.la' file. +-gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++gij_LDFLAGS = $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) ++ + gij_LINK = $(GCJLINK) + ## See jv_convert_LDADD. + gij_LDADD = -L$(here)/.libs libgcj.la +@@ -750,7 +751,7 @@ + ## This is a dummy definition. + EXTRA_rmic_SOURCES = $(rmi_java_source_files) + rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + rmic_LINK = $(GCJLINK) + ## See jv_convert_LDADD. + rmic_LDADD = -L$(here)/.libs libgcj.la +@@ -762,7 +763,7 @@ + ## This is a dummy definition. + EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) + rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + rmiregistry_LINK = $(GCJLINK) + ## See jv_convert_LDADD. + rmiregistry_LDADD = -L$(here)/.libs libgcj.la +--- libjava/Makefile.in~ 2004-01-26 07:36:06.000000000 +0100 ++++ libjava/Makefile.in 2004-02-21 22:48:12.000000000 +0100 +@@ -499,7 +499,7 @@ + jv_convert_SOURCES = + EXTRA_jv_convert_SOURCES = $(convert_source_files) + jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + + jv_convert_LINK = $(GCJLINK) + jv_convert_LDADD = -L$(here)/.libs libgcj.la +@@ -508,7 +508,7 @@ + + + gij_SOURCES = gij.cc +-gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++gij_LDFLAGS = $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + gij_LINK = $(GCJLINK) + gij_LDADD = -L$(here)/.libs libgcj.la + gij_DEPENDENCIES = libgcj.la libgcj.spec +@@ -516,7 +516,7 @@ + rmic_SOURCES = + EXTRA_rmic_SOURCES = $(rmi_java_source_files) + rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + + rmic_LINK = $(GCJLINK) + rmic_LDADD = -L$(here)/.libs libgcj.la +@@ -525,7 +525,7 @@ + rmiregistry_SOURCES = + EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) + rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ +- -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ++ $(shell test $(toolexeclibdir) = /usr/lib || echo -rpath $(toolexeclibdir)) -shared-libgcc $(THREADLDFLAGS) + + rmiregistry_LINK = $(GCJLINK) + rmiregistry_LDADD = -L$(here)/.libs libgcj.la --- gcc-3.4-3.4.2.orig/debian/patches/hppa-toplevel.dpatch +++ gcc-3.4-3.4.2/debian/patches/hppa-toplevel.dpatch @@ -0,0 +1,53 @@ +#! /bin/sh -e + +# DP: For hppa-linux enable libgcj and dependent libs in the toplevel directory + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- configure.in~ 2004-02-22 16:12:01.000000000 +0100 ++++ configure.in 2004-02-22 16:22:19.000000000 +0100 +@@ -482,8 +482,9 @@ + # headers, crt*.o, etc., all of which are needed by these. + noconfigdirs="$noconfigdirs target-zlib" + ;; ++ parisc*-*-linux* | hppa*-*-linux*) ++ ;; + hppa*-*-*elf* | \ +- parisc*-*-linux* | hppa*-*-linux* | \ + hppa*-*-lites* | \ + hppa*-*-openbsd* | \ + hppa*64*-*-*) +--- configure~ 2004-02-21 20:43:26.000000000 +0100 ++++ configure 2004-02-22 16:24:31.000000000 +0100 +@@ -1243,8 +1243,9 @@ + # headers, crt*.o, etc., all of which are needed by these. + noconfigdirs="$noconfigdirs target-zlib" + ;; ++ parisc*-*-linux* | hppa*-*-linux*) ++ ;; + hppa*-*-*elf* | \ +- parisc*-*-linux* | hppa*-*-linux* | \ + hppa*-*-lites* | \ + hppa*-*-openbsd* | \ + hppa*64*-*-*) --- gcc-3.4-3.4.2.orig/debian/patches/gpc-updates.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-updates.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e + +# DP: Updates from gpc-20030820. + +pdir=gcc +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="$3/gcc" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +gpc_gcc_patch=debian/patches/gpc-update27i.diff + +case "$1" in + -patch) + # keep the backup files ... to regenerate p/diffs/${gpc_gcc_patch} + # dan@debian.org: no, don't. Apply it by hand if you need to regen. + # get the patch from the gpc source + echo Using patch file ${gpc_gcc_patch} + patch -d $pdir -f -p1 < ${gpc_gcc_patch} + #pf=`echo $0 | sed 's/\.dpatch/.diff/'` + #patch -d $pdir -f -p1 < $pf + ;; + -unpatch) + # get the patch from the gpc source + echo Using patch file ${gpc_gcc_patch} + patch -d $pdir -f -R -p1 < ${gpc_gcc_patch} + #pf=`echo $0 | sed 's/\.dpatch/.diff/'` + #patch -d $pdir -f -R -p1 < $pf + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 --- gcc-3.4-3.4.2.orig/debian/patches/gpc-parse.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-parse.dpatch @@ -0,0 +1,11173 @@ +#! /bin/sh -e + +# DP: generated gcc/p/parse.[ch] files (using bison-1.875c). + +dir=p +pdir="-d gcc" +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3/gcc" + dir="$3/gcc" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gpc-20040516.orig/p/parse.c Sun May 16 18:03:15 2004 ++++ gpc-20040516/p/parse.c Thu Jul 8 22:04:58 2004 +@@ -46,234 +46,236 @@ + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { +- prec_if = 258, +- prec_lower_than_error = 259, +- prec_import = 260, +- p_operator = 261, +- p_destructor = 262, +- p_constructor = 263, +- p_implementation = 264, +- p_uses = 265, +- p_else = 266, +- p_and = 267, +- p_array = 268, +- p_begin = 269, +- p_case = 270, +- p_div = 271, +- p_do = 272, +- p_downto = 273, +- p_end = 274, +- p_file = 275, +- p_for = 276, +- p_function = 277, +- p_goto = 278, +- p_if = 279, +- p_in = 280, +- p_label = 281, +- p_mod = 282, +- p_nil = 283, +- p_not = 284, +- p_of = 285, +- p_or = 286, +- p_packed = 287, +- p_procedure = 288, +- p_to = 289, +- p_program = 290, +- p_record = 291, +- p_repeat = 292, +- p_set = 293, +- p_then = 294, +- p_type = 295, +- p_until = 296, +- p_var = 297, +- p_while = 298, +- p_with = 299, +- p_absolute = 300, +- p_abstract = 301, +- p_and_then = 302, +- p_as = 303, +- p_asm = 304, +- p_attribute = 305, +- p_bindable = 306, +- p_const = 307, +- p_external = 308, +- p_far = 309, +- p_finalization = 310, +- p_forward = 311, +- p_import = 312, +- p_inherited = 313, +- p_initialization = 314, +- p_is = 315, +- p_near = 316, +- p_object = 317, +- p_only = 318, +- p_otherwise = 319, +- p_or_else = 320, +- p_pow = 321, +- p_restricted = 322, +- p_shl = 323, +- p_shr = 324, +- p_unit = 325, +- p_value = 326, +- p_virtual = 327, +- p_xor = 328, +- p_asmname = 329, +- p_c = 330, +- p_c_language = 331, +- p_Addr = 332, +- p_Assigned = 333, +- p_Dispose = 334, +- p_FormatString = 335, +- p_New = 336, +- p_Return = 337, +- LEX_ID = 338, +- LEX_BUILTIN_PROCEDURE = 339, +- LEX_BUILTIN_PROCEDURE_WRITE = 340, +- LEX_BUILTIN_FUNCTION = 341, +- LEX_BUILTIN_FUNCTION_VT = 342, +- LEX_BUILTIN_VARIABLE = 343, +- LEX_INTCONST = 344, +- LEX_INTCONST_BASE = 345, +- LEX_STRCONST = 346, +- LEX_REALCONST = 347, +- LEX_CARET_WHITE = 348, +- LEX_STRUCTOR = 349, +- LEX_CARET_LETTER = 350, +- LEX_CONST_EQUAL = 351, +- LEX_BPPLUS = 352, +- LEX_BPMINUS = 353, +- LEX_RANGE = 354, +- LEX_ELLIPSIS = 355, +- LEX_RENAME = 356, +- LEX_SYMDIFF = 357, +- LEX_ASSIGN = 358, +- LEX_NE = 359, +- LEX_GE = 360, +- LEX_LE = 361, +- LEX_POWER = 362, +- LEX_CEIL_PLUS = 363, +- LEX_CEIL_MINUS = 364, +- LEX_FLOOR_PLUS = 365, +- LEX_FLOOR_MINUS = 366, +- LEX_CEIL_MULT = 367, +- LEX_CEIL_DIV = 368, +- LEX_FLOOR_MULT = 369, +- LEX_FLOOR_DIV = 370 ++ prec_id = 258, ++ prec_if = 259, ++ prec_lower_than_error = 260, ++ prec_import = 261, ++ p_operator = 262, ++ p_destructor = 263, ++ p_constructor = 264, ++ p_implementation = 265, ++ p_initialization = 266, ++ p_uses = 267, ++ p_else = 268, ++ p_and = 269, ++ p_array = 270, ++ p_begin = 271, ++ p_case = 272, ++ p_div = 273, ++ p_do = 274, ++ p_downto = 275, ++ p_end = 276, ++ p_file = 277, ++ p_for = 278, ++ p_function = 279, ++ p_goto = 280, ++ p_if = 281, ++ p_in = 282, ++ p_label = 283, ++ p_mod = 284, ++ p_nil = 285, ++ p_not = 286, ++ p_of = 287, ++ p_or = 288, ++ p_packed = 289, ++ p_procedure = 290, ++ p_to = 291, ++ p_program = 292, ++ p_record = 293, ++ p_repeat = 294, ++ p_set = 295, ++ p_then = 296, ++ p_type = 297, ++ p_until = 298, ++ p_var = 299, ++ p_while = 300, ++ p_with = 301, ++ p_absolute = 302, ++ p_abstract = 303, ++ p_and_then = 304, ++ p_as = 305, ++ p_asm = 306, ++ p_attribute = 307, ++ p_bindable = 308, ++ p_const = 309, ++ p_external = 310, ++ p_far = 311, ++ p_finalization = 312, ++ p_forward = 313, ++ p_import = 314, ++ p_inherited = 315, ++ p_is = 316, ++ p_near = 317, ++ p_object = 318, ++ p_only = 319, ++ p_otherwise = 320, ++ p_or_else = 321, ++ p_pow = 322, ++ p_restricted = 323, ++ p_shl = 324, ++ p_shr = 325, ++ p_unit = 326, ++ p_value = 327, ++ p_virtual = 328, ++ p_xor = 329, ++ p_asmname = 330, ++ p_c = 331, ++ p_c_language = 332, ++ p_Addr = 333, ++ p_Assigned = 334, ++ p_Dispose = 335, ++ p_FormatString = 336, ++ p_New = 337, ++ p_Return = 338, ++ LEX_ID = 339, ++ LEX_BUILTIN_PROCEDURE = 340, ++ LEX_BUILTIN_PROCEDURE_WRITE = 341, ++ LEX_BUILTIN_FUNCTION = 342, ++ LEX_BUILTIN_FUNCTION_VT = 343, ++ LEX_BUILTIN_VARIABLE = 344, ++ LEX_INTCONST = 345, ++ LEX_INTCONST_BASE = 346, ++ LEX_STRCONST = 347, ++ LEX_REALCONST = 348, ++ LEX_CARET_WHITE = 349, ++ LEX_STRUCTOR = 350, ++ LEX_CARET_LETTER = 351, ++ LEX_CONST_EQUAL = 352, ++ LEX_BPPLUS = 353, ++ LEX_BPMINUS = 354, ++ LEX_RANGE = 355, ++ LEX_ELLIPSIS = 356, ++ LEX_RENAME = 357, ++ LEX_SYMDIFF = 358, ++ LEX_ASSIGN = 359, ++ LEX_NE = 360, ++ LEX_GE = 361, ++ LEX_LE = 362, ++ LEX_POWER = 363, ++ LEX_CEIL_PLUS = 364, ++ LEX_CEIL_MINUS = 365, ++ LEX_FLOOR_PLUS = 366, ++ LEX_FLOOR_MINUS = 367, ++ LEX_CEIL_MULT = 368, ++ LEX_CEIL_DIV = 369, ++ LEX_FLOOR_MULT = 370, ++ LEX_FLOOR_DIV = 371 + }; + #endif +-#define prec_if 258 +-#define prec_lower_than_error 259 +-#define prec_import 260 +-#define p_operator 261 +-#define p_destructor 262 +-#define p_constructor 263 +-#define p_implementation 264 +-#define p_uses 265 +-#define p_else 266 +-#define p_and 267 +-#define p_array 268 +-#define p_begin 269 +-#define p_case 270 +-#define p_div 271 +-#define p_do 272 +-#define p_downto 273 +-#define p_end 274 +-#define p_file 275 +-#define p_for 276 +-#define p_function 277 +-#define p_goto 278 +-#define p_if 279 +-#define p_in 280 +-#define p_label 281 +-#define p_mod 282 +-#define p_nil 283 +-#define p_not 284 +-#define p_of 285 +-#define p_or 286 +-#define p_packed 287 +-#define p_procedure 288 +-#define p_to 289 +-#define p_program 290 +-#define p_record 291 +-#define p_repeat 292 +-#define p_set 293 +-#define p_then 294 +-#define p_type 295 +-#define p_until 296 +-#define p_var 297 +-#define p_while 298 +-#define p_with 299 +-#define p_absolute 300 +-#define p_abstract 301 +-#define p_and_then 302 +-#define p_as 303 +-#define p_asm 304 +-#define p_attribute 305 +-#define p_bindable 306 +-#define p_const 307 +-#define p_external 308 +-#define p_far 309 +-#define p_finalization 310 +-#define p_forward 311 +-#define p_import 312 +-#define p_inherited 313 +-#define p_initialization 314 +-#define p_is 315 +-#define p_near 316 +-#define p_object 317 +-#define p_only 318 +-#define p_otherwise 319 +-#define p_or_else 320 +-#define p_pow 321 +-#define p_restricted 322 +-#define p_shl 323 +-#define p_shr 324 +-#define p_unit 325 +-#define p_value 326 +-#define p_virtual 327 +-#define p_xor 328 +-#define p_asmname 329 +-#define p_c 330 +-#define p_c_language 331 +-#define p_Addr 332 +-#define p_Assigned 333 +-#define p_Dispose 334 +-#define p_FormatString 335 +-#define p_New 336 +-#define p_Return 337 +-#define LEX_ID 338 +-#define LEX_BUILTIN_PROCEDURE 339 +-#define LEX_BUILTIN_PROCEDURE_WRITE 340 +-#define LEX_BUILTIN_FUNCTION 341 +-#define LEX_BUILTIN_FUNCTION_VT 342 +-#define LEX_BUILTIN_VARIABLE 343 +-#define LEX_INTCONST 344 +-#define LEX_INTCONST_BASE 345 +-#define LEX_STRCONST 346 +-#define LEX_REALCONST 347 +-#define LEX_CARET_WHITE 348 +-#define LEX_STRUCTOR 349 +-#define LEX_CARET_LETTER 350 +-#define LEX_CONST_EQUAL 351 +-#define LEX_BPPLUS 352 +-#define LEX_BPMINUS 353 +-#define LEX_RANGE 354 +-#define LEX_ELLIPSIS 355 +-#define LEX_RENAME 356 +-#define LEX_SYMDIFF 357 +-#define LEX_ASSIGN 358 +-#define LEX_NE 359 +-#define LEX_GE 360 +-#define LEX_LE 361 +-#define LEX_POWER 362 +-#define LEX_CEIL_PLUS 363 +-#define LEX_CEIL_MINUS 364 +-#define LEX_FLOOR_PLUS 365 +-#define LEX_FLOOR_MINUS 366 +-#define LEX_CEIL_MULT 367 +-#define LEX_CEIL_DIV 368 +-#define LEX_FLOOR_MULT 369 +-#define LEX_FLOOR_DIV 370 ++#define prec_id 258 ++#define prec_if 259 ++#define prec_lower_than_error 260 ++#define prec_import 261 ++#define p_operator 262 ++#define p_destructor 263 ++#define p_constructor 264 ++#define p_implementation 265 ++#define p_initialization 266 ++#define p_uses 267 ++#define p_else 268 ++#define p_and 269 ++#define p_array 270 ++#define p_begin 271 ++#define p_case 272 ++#define p_div 273 ++#define p_do 274 ++#define p_downto 275 ++#define p_end 276 ++#define p_file 277 ++#define p_for 278 ++#define p_function 279 ++#define p_goto 280 ++#define p_if 281 ++#define p_in 282 ++#define p_label 283 ++#define p_mod 284 ++#define p_nil 285 ++#define p_not 286 ++#define p_of 287 ++#define p_or 288 ++#define p_packed 289 ++#define p_procedure 290 ++#define p_to 291 ++#define p_program 292 ++#define p_record 293 ++#define p_repeat 294 ++#define p_set 295 ++#define p_then 296 ++#define p_type 297 ++#define p_until 298 ++#define p_var 299 ++#define p_while 300 ++#define p_with 301 ++#define p_absolute 302 ++#define p_abstract 303 ++#define p_and_then 304 ++#define p_as 305 ++#define p_asm 306 ++#define p_attribute 307 ++#define p_bindable 308 ++#define p_const 309 ++#define p_external 310 ++#define p_far 311 ++#define p_finalization 312 ++#define p_forward 313 ++#define p_import 314 ++#define p_inherited 315 ++#define p_is 316 ++#define p_near 317 ++#define p_object 318 ++#define p_only 319 ++#define p_otherwise 320 ++#define p_or_else 321 ++#define p_pow 322 ++#define p_restricted 323 ++#define p_shl 324 ++#define p_shr 325 ++#define p_unit 326 ++#define p_value 327 ++#define p_virtual 328 ++#define p_xor 329 ++#define p_asmname 330 ++#define p_c 331 ++#define p_c_language 332 ++#define p_Addr 333 ++#define p_Assigned 334 ++#define p_Dispose 335 ++#define p_FormatString 336 ++#define p_New 337 ++#define p_Return 338 ++#define LEX_ID 339 ++#define LEX_BUILTIN_PROCEDURE 340 ++#define LEX_BUILTIN_PROCEDURE_WRITE 341 ++#define LEX_BUILTIN_FUNCTION 342 ++#define LEX_BUILTIN_FUNCTION_VT 343 ++#define LEX_BUILTIN_VARIABLE 344 ++#define LEX_INTCONST 345 ++#define LEX_INTCONST_BASE 346 ++#define LEX_STRCONST 347 ++#define LEX_REALCONST 348 ++#define LEX_CARET_WHITE 349 ++#define LEX_STRUCTOR 350 ++#define LEX_CARET_LETTER 351 ++#define LEX_CONST_EQUAL 352 ++#define LEX_BPPLUS 353 ++#define LEX_BPMINUS 354 ++#define LEX_RANGE 355 ++#define LEX_ELLIPSIS 356 ++#define LEX_RENAME 357 ++#define LEX_SYMDIFF 358 ++#define LEX_ASSIGN 359 ++#define LEX_NE 360 ++#define LEX_GE 361 ++#define LEX_LE 362 ++#define LEX_POWER 363 ++#define LEX_CEIL_PLUS 364 ++#define LEX_CEIL_MINUS 365 ++#define LEX_FLOOR_PLUS 366 ++#define LEX_FLOOR_MINUS 367 ++#define LEX_CEIL_MULT 368 ++#define LEX_CEIL_DIV 369 ++#define LEX_FLOOR_MULT 370 ++#define LEX_FLOOR_DIV 371 + + + +@@ -294,6 +296,8 @@ + static int parentheses_count = 0; + static tree iso_no_parentheses PARAMS ((tree)); + ++static int in_uses = 0; ++ + enum { od_none, od_uses, od_label, od_const, od_type, od_var, od_routine }; + static int check_decl_order PARAMS ((int, int)); + +@@ -303,7 +307,17 @@ + union yyGLRStackItem; + static void locations PARAMS ((YYLTYPE *, const union yyGLRStackItem*, int)); + #define YYLLOC_DEFAULT(DEST, SRC, N) locations (&DEST, SRC, N) ++#ifndef GCC_3_4 + #define LOCATION_NOTE(LOC) if (current_function_decl) emit_line_note ((LOC).first_file, (LOC).first_line) ++#else ++#define LOCATION_NOTE(LOC) if (current_function_decl) \ ++ { \ ++ location_t loc_aux; \ ++ loc_aux.file = (LOC).first_file; \ ++ loc_aux.line = (LOC).first_line; \ ++ emit_line_note (loc_aux); \ ++ } ++#endif + #define COPYLOC(D, S) (* (YYLTYPE *) memcpy (&(D), &(S), sizeof (YYLTYPE))) + + #define YYASSERT assert +@@ -325,14 +339,14 @@ + #endif + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 103 "parse.y" ++#line 115 "parse.y" + typedef union YYSTYPE { + enum tree_code code; + long itype; + tree ttype; + } YYSTYPE; + /* Line 187 of glr.c. */ +-#line 336 "parse.c" ++#line 350 "parse.c" + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif +@@ -363,7 +377,7 @@ + + + /* Line 219 of glr.c. */ +-#line 367 "parse.c" ++#line 381 "parse.c" + + #ifndef YYFREE + # define YYFREE free +@@ -406,16 +420,16 @@ + /* YYFINAL -- State number of the termination state. */ + #define YYFINAL 68 + /* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 8214 ++#define YYLAST 8489 + + /* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 133 ++#define YYNTOKENS 134 + /* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 300 ++#define YYNNTS 306 + /* YYNRULES -- Number of rules. */ +-#define YYNRULES 787 ++#define YYNRULES 796 + /* YYNRULES -- Number of states. */ +-#define YYNSTATES 1289 ++#define YYNSTATES 1304 + /* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */ + #define YYMAXRHS 12 + /* YYMAXLEFT -- Maximum number of symbols to the left of a handle +@@ -424,7 +438,7 @@ + + /* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */ + #define YYUNDEFTOK 2 +-#define YYMAXUTOK 370 ++#define YYMAXUTOK 371 + + #define YYTRANSLATE(YYX) \ + ((YYX <= 0) ? YYEOF : \ +@@ -437,12 +451,12 @@ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 117, 119, 128, 126, 118, 127, 125, 129, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 120, 116, +- 130, 131, 132, 2, 123, 2, 2, 2, 2, 2, ++ 119, 121, 129, 127, 120, 128, 4, 130, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 122, 118, ++ 131, 132, 133, 2, 125, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 121, 2, 122, 124, 2, 2, 2, 2, 2, ++ 2, 123, 2, 124, 126, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +@@ -458,19 +472,19 @@ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, +- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, +- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, +- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, +- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, +- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, +- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, +- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, +- 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, +- 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, +- 115 ++ 2, 2, 2, 2, 2, 2, 1, 2, 3, 5, ++ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ++ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ++ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ++ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, ++ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, ++ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, ++ 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, ++ 116, 117 + }; + + #if YYDEBUG +@@ -482,400 +496,405 @@ + 25, 30, 31, 34, 36, 38, 39, 42, 43, 46, + 50, 52, 55, 58, 59, 64, 67, 68, 69, 82, + 84, 86, 87, 91, 92, 93, 103, 104, 111, 112, +- 113, 122, 123, 131, 132, 140, 141, 145, 147, 151, +- 153, 156, 157, 160, 162, 164, 166, 167, 170, 172, +- 173, 176, 178, 179, 180, 187, 188, 191, 193, 195, +- 196, 203, 204, 211, 212, 215, 218, 221, 222, 228, +- 230, 232, 236, 238, 240, 244, 248, 252, 255, 257, +- 261, 263, 267, 269, 273, 277, 281, 282, 284, 288, +- 290, 295, 297, 299, 303, 305, 309, 313, 316, 320, +- 324, 326, 329, 330, 331, 336, 338, 342, 346, 350, +- 352, 356, 360, 365, 366, 368, 370, 374, 379, 381, +- 384, 386, 390, 392, 396, 400, 403, 405, 409, 411, +- 415, 419, 422, 424, 426, 428, 430, 432, 434, 437, +- 439, 444, 453, 455, 459, 461, 465, 469, 472, 478, +- 479, 486, 490, 491, 501, 505, 509, 511, 515, 519, +- 523, 526, 530, 532, 535, 537, 540, 542, 545, 547, +- 550, 553, 555, 557, 559, 561, 563, 566, 568, 570, +- 572, 576, 580, 582, 586, 588, 592, 596, 598, 600, +- 604, 608, 610, 614, 618, 622, 625, 629, 634, 637, +- 640, 643, 647, 649, 651, 653, 656, 660, 662, 664, +- 666, 668, 670, 677, 679, 683, 687, 690, 692, 694, +- 696, 698, 703, 705, 707, 711, 715, 719, 723, 724, +- 727, 731, 733, 735, 739, 743, 747, 750, 754, 761, +- 765, 769, 771, 773, 775, 776, 782, 784, 788, 792, +- 794, 797, 803, 805, 809, 813, 817, 820, 822, 826, +- 830, 834, 838, 840, 842, 844, 848, 852, 854, 857, +- 859, 861, 864, 868, 872, 876, 882, 886, 890, 892, +- 895, 897, 899, 901, 904, 905, 914, 916, 918, 922, +- 924, 927, 928, 934, 936, 940, 943, 945, 950, 952, +- 956, 958, 960, 962, 966, 971, 978, 980, 982, 984, +- 986, 989, 992, 994, 995, 999, 1002, 1003, 1006, 1008, +- 1010, 1014, 1016, 1018, 1022, 1024, 1026, 1028, 1030, 1034, +- 1038, 1042, 1044, 1046, 1048, 1050, 1054, 1058, 1060, 1064, +- 1068, 1072, 1074, 1076, 1079, 1082, 1086, 1090, 1091, 1092, +- 1101, 1103, 1105, 1109, 1115, 1121, 1127, 1135, 1141, 1147, +- 1149, 1151, 1155, 1158, 1162, 1163, 1170, 1177, 1184, 1188, +- 1191, 1194, 1196, 1200, 1204, 1206, 1208, 1210, 1212, 1214, +- 1217, 1219, 1220, 1222, 1225, 1227, 1229, 1232, 1234, 1236, +- 1239, 1243, 1247, 1253, 1257, 1259, 1263, 1267, 1271, 1275, +- 1280, 1285, 1289, 1291, 1295, 1301, 1303, 1305, 1306, 1309, +- 1311, 1313, 1315, 1317, 1324, 1332, 1334, 1336, 1338, 1342, +- 1346, 1350, 1356, 1360, 1362, 1364, 1370, 1372, 1376, 1377, +- 1379, 1381, 1383, 1386, 1389, 1391, 1393, 1395, 1397, 1399, +- 1401, 1403, 1405, 1407, 1409, 1411, 1414, 1417, 1420, 1425, +- 1427, 1431, 1433, 1437, 1441, 1443, 1447, 1448, 1454, 1456, +- 1457, 1462, 1463, 1464, 1474, 1475, 1480, 1482, 1484, 1486, +- 1490, 1492, 1496, 1500, 1501, 1508, 1509, 1510, 1519, 1520, +- 1521, 1530, 1531, 1543, 1544, 1554, 1556, 1558, 1560, 1561, +- 1565, 1567, 1570, 1572, 1575, 1577, 1579, 1582, 1584, 1589, +- 1592, 1597, 1603, 1605, 1608, 1612, 1614, 1615, 1620, 1622, +- 1626, 1628, 1632, 1634, 1638, 1642, 1646, 1648, 1652, 1658, +- 1664, 1672, 1682, 1694, 1695, 1697, 1699, 1701, 1703, 1707, +- 1712, 1714, 1718, 1720, 1722, 1724, 1728, 1730, 1732, 1735, +- 1739, 1743, 1744, 1749, 1750, 1755, 1757, 1761, 1765, 1766, +- 1771, 1772, 1777, 1779, 1783, 1787, 1791, 1795, 1799, 1802, +- 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, +- 1825, 1827, 1829, 1831, 1833, 1836, 1838, 1840, 1842, 1844, +- 1846, 1848, 1850, 1852, 1854, 1856, 1858, 1860, 1862, 1864, +- 1866, 1868, 1870, 1872, 1874, 1877, 1879, 1882, 1884, 1886, +- 1888, 1891, 1895, 1899, 1902, 1907, 1911, 1912, 1918, 1923, +- 1928, 1929, 1935, 1940, 1945, 1948, 1953, 1959, 1963, 1965, +- 1967, 1969, 1973, 1975, 1979, 1983, 1985, 1989, 1992, 1996, +- 1998, 2002, 2006, 2010, 2012, 2016, 2018, 2020, 2022, 2024, +- 2026, 2028, 2030, 2032, 2034, 2036, 2038, 2040, 2042, 2044, +- 2046, 2048, 2050, 2052, 2054, 2056, 2058, 2060, 2063, 2065, +- 2067, 2069, 2071, 2073, 2075, 2077, 2079, 2081, 2083, 2085, +- 2088, 2090, 2092, 2094, 2096, 2098, 2100, 2102, 2104, 2106, +- 2108, 2110, 2112, 2114, 2116, 2118, 2120, 2122, 2124, 2126, +- 2128, 2130, 2132, 2134, 2136, 2138, 2140, 2142, 2144, 2146, +- 2148, 2150, 2152, 2154, 2156, 2158, 2160, 2162, 2164, 2166, +- 2168, 2170, 2172, 2174, 2176, 2178, 2180, 2182, 2184, 2186, +- 2188, 2190, 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206, +- 2208, 2210, 2212, 2214, 2216, 2218, 2220, 2222, 2224, 2226, +- 2228, 2230, 2232, 2234, 2236, 2238, 2240, 2242, 2244, 2246, +- 2248, 2250, 2252, 2254, 2256, 2258, 2260, 2262, 2264, 2266, +- 2268, 2269, 2270, 2271, 2272, 2274, 2275, 2277, 2279, 2281, +- 2283, 2285, 2287, 2289, 2291, 2293, 2295, 2296 ++ 113, 122, 123, 131, 132, 140, 141, 146, 148, 152, ++ 154, 157, 158, 161, 163, 165, 167, 168, 171, 173, ++ 174, 177, 179, 180, 181, 188, 189, 192, 194, 196, ++ 197, 204, 205, 212, 213, 216, 219, 222, 223, 229, ++ 231, 233, 237, 239, 241, 245, 249, 253, 256, 258, ++ 262, 264, 268, 270, 274, 278, 282, 283, 285, 289, ++ 291, 296, 298, 300, 304, 306, 310, 314, 317, 321, ++ 325, 327, 331, 333, 336, 337, 338, 339, 344, 347, ++ 349, 353, 357, 358, 363, 365, 369, 373, 378, 379, ++ 381, 383, 387, 392, 394, 397, 399, 403, 405, 409, ++ 413, 416, 418, 422, 424, 428, 432, 435, 437, 439, ++ 441, 443, 445, 447, 450, 452, 457, 466, 468, 472, ++ 474, 478, 482, 485, 491, 492, 499, 503, 504, 514, ++ 518, 522, 524, 528, 532, 536, 539, 543, 545, 548, ++ 550, 553, 555, 558, 560, 563, 566, 568, 570, 572, ++ 574, 576, 579, 581, 583, 585, 587, 591, 595, 599, ++ 601, 605, 607, 611, 615, 617, 619, 623, 627, 629, ++ 633, 637, 641, 644, 648, 653, 656, 659, 662, 666, ++ 668, 670, 672, 675, 679, 681, 683, 685, 687, 689, ++ 696, 698, 702, 706, 709, 711, 713, 715, 717, 722, ++ 724, 726, 730, 734, 738, 742, 743, 746, 750, 752, ++ 754, 758, 762, 766, 769, 773, 780, 784, 788, 790, ++ 792, 794, 795, 801, 803, 807, 811, 813, 816, 822, ++ 824, 828, 832, 836, 839, 841, 845, 849, 853, 857, ++ 859, 861, 863, 867, 871, 873, 876, 878, 880, 883, ++ 887, 891, 895, 901, 905, 909, 911, 914, 916, 918, ++ 920, 923, 924, 933, 935, 937, 941, 943, 946, 947, ++ 953, 955, 959, 962, 964, 969, 971, 975, 977, 979, ++ 981, 985, 990, 997, 999, 1001, 1003, 1005, 1008, 1011, ++ 1013, 1014, 1018, 1021, 1022, 1025, 1027, 1029, 1033, 1035, ++ 1037, 1041, 1043, 1045, 1047, 1049, 1053, 1057, 1061, 1063, ++ 1065, 1067, 1069, 1073, 1077, 1079, 1083, 1087, 1091, 1093, ++ 1095, 1098, 1101, 1105, 1109, 1110, 1111, 1121, 1123, 1125, ++ 1129, 1135, 1141, 1147, 1155, 1161, 1167, 1169, 1171, 1175, ++ 1178, 1182, 1183, 1190, 1197, 1204, 1208, 1211, 1214, 1216, ++ 1220, 1224, 1226, 1228, 1230, 1232, 1234, 1237, 1239, 1240, ++ 1242, 1245, 1247, 1249, 1252, 1254, 1256, 1259, 1263, 1267, ++ 1273, 1277, 1279, 1283, 1287, 1291, 1295, 1300, 1305, 1309, ++ 1311, 1315, 1321, 1323, 1325, 1326, 1329, 1331, 1333, 1335, ++ 1337, 1344, 1352, 1354, 1356, 1358, 1362, 1366, 1370, 1376, ++ 1380, 1382, 1384, 1390, 1392, 1396, 1397, 1399, 1401, 1403, ++ 1406, 1409, 1411, 1413, 1415, 1417, 1419, 1421, 1423, 1425, ++ 1427, 1429, 1431, 1434, 1437, 1440, 1445, 1447, 1451, 1453, ++ 1457, 1461, 1463, 1467, 1468, 1474, 1476, 1477, 1482, 1483, ++ 1484, 1494, 1495, 1500, 1502, 1504, 1506, 1510, 1512, 1516, ++ 1520, 1521, 1528, 1529, 1530, 1539, 1540, 1541, 1550, 1551, ++ 1563, 1564, 1574, 1576, 1578, 1580, 1581, 1585, 1587, 1590, ++ 1592, 1595, 1597, 1599, 1602, 1604, 1609, 1612, 1617, 1623, ++ 1625, 1628, 1632, 1634, 1635, 1640, 1642, 1646, 1648, 1652, ++ 1654, 1658, 1662, 1666, 1668, 1672, 1678, 1684, 1692, 1702, ++ 1714, 1715, 1717, 1719, 1721, 1723, 1727, 1732, 1734, 1738, ++ 1740, 1742, 1744, 1748, 1750, 1752, 1755, 1759, 1763, 1764, ++ 1769, 1770, 1775, 1777, 1781, 1785, 1786, 1791, 1792, 1797, ++ 1799, 1803, 1807, 1811, 1815, 1819, 1822, 1825, 1827, 1829, ++ 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, ++ 1851, 1853, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870, ++ 1872, 1874, 1876, 1878, 1880, 1882, 1884, 1886, 1888, 1890, ++ 1892, 1894, 1897, 1899, 1902, 1904, 1906, 1908, 1912, 1914, ++ 1917, 1921, 1925, 1928, 1933, 1937, 1938, 1944, 1949, 1954, ++ 1955, 1961, 1966, 1971, 1974, 1979, 1985, 1989, 1991, 1993, ++ 1995, 1999, 2001, 2005, 2009, 2011, 2015, 2018, 2022, 2024, ++ 2028, 2032, 2036, 2038, 2042, 2044, 2046, 2048, 2050, 2052, ++ 2054, 2056, 2058, 2060, 2062, 2064, 2066, 2068, 2070, 2072, ++ 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2089, 2091, 2093, ++ 2095, 2097, 2099, 2101, 2103, 2105, 2107, 2109, 2111, 2114, ++ 2116, 2118, 2120, 2122, 2124, 2126, 2128, 2130, 2132, 2134, ++ 2136, 2138, 2140, 2142, 2144, 2146, 2148, 2150, 2152, 2154, ++ 2156, 2158, 2160, 2162, 2164, 2166, 2168, 2170, 2172, 2174, ++ 2176, 2178, 2180, 2182, 2184, 2186, 2188, 2190, 2192, 2194, ++ 2196, 2198, 2200, 2202, 2204, 2206, 2208, 2210, 2212, 2214, ++ 2216, 2218, 2220, 2222, 2224, 2226, 2228, 2230, 2232, 2234, ++ 2236, 2238, 2240, 2242, 2244, 2246, 2248, 2250, 2252, 2254, ++ 2256, 2258, 2260, 2262, 2264, 2266, 2268, 2270, 2272, 2274, ++ 2276, 2278, 2280, 2282, 2284, 2286, 2288, 2290, 2292, 2294, ++ 2295, 2296, 2297, 2298, 2300, 2301, 2303, 2305, 2307, 2309, ++ 2311, 2313, 2315, 2317, 2319, 2321, 2322 + }; + + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + static const short yyrhs[] = + { +- 134, 0, -1, -1, 135, -1, -1, -1, 138, 164, +- 136, 194, 139, 137, 319, 430, -1, 147, -1, -1, +- 35, 412, 182, 116, -1, 35, 1, 182, 116, -1, +- -1, 139, 140, -1, 197, -1, 142, -1, -1, 141, +- 142, -1, -1, 143, 144, -1, 26, 205, 116, -1, +- 289, -1, 423, 145, -1, 52, 209, -1, -1, 40, +- 146, 211, 116, -1, 42, 261, -1, -1, -1, 70, +- 412, 116, 164, 83, 148, 194, 165, 149, 161, 19, +- 430, -1, 154, -1, 159, -1, -1, 154, 150, 159, +- -1, -1, -1, 162, 412, 163, 151, 157, 116, 152, +- 170, 430, -1, -1, 162, 412, 163, 153, 170, 430, +- -1, -1, -1, 162, 412, 83, 155, 163, 156, 157, +- 430, -1, -1, 83, 158, 186, 116, 194, 165, 19, +- -1, -1, 162, 412, 9, 116, 160, 170, 430, -1, +- -1, 9, 139, 180, -1, 83, -1, 182, 116, 164, +- -1, 431, -1, 269, 116, -1, -1, 165, 166, -1, +- 197, -1, 144, -1, 288, -1, -1, 167, 168, -1, +- 197, -1, -1, 169, 144, -1, 289, -1, -1, -1, +- 171, 194, 167, 172, 173, 19, -1, -1, 174, 176, +- -1, 174, -1, 176, -1, -1, 34, 14, 17, 175, +- 322, 116, -1, -1, 34, 19, 17, 177, 322, 116, +- -1, -1, 179, 320, -1, 14, 178, -1, 59, 178, +- -1, -1, 59, 178, 55, 181, 320, -1, 173, -1, +- 431, -1, 117, 183, 429, -1, 184, -1, 412, -1, +- 184, 118, 412, -1, 184, 1, 412, -1, 184, 118, +- 1, -1, 184, 1, -1, 416, -1, 185, 118, 416, +- -1, 187, -1, 186, 116, 187, -1, 1, -1, 186, +- 1, 187, -1, 186, 116, 1, -1, 416, 188, 189, +- -1, -1, 428, -1, 117, 191, 119, -1, 190, -1, +- 190, 117, 191, 119, -1, 83, -1, 192, -1, 191, +- 118, 192, -1, 1, -1, 191, 1, 192, -1, 191, +- 118, 1, -1, 412, 193, -1, 412, 99, 412, -1, +- 425, 412, 193, -1, 431, -1, 101, 412, -1, -1, +- -1, 195, 57, 196, 116, -1, 199, -1, 196, 116, +- 199, -1, 196, 1, 199, -1, 10, 198, 116, -1, +- 199, -1, 198, 118, 199, -1, 198, 1, 199, -1, +- 412, 200, 201, 202, -1, -1, 83, -1, 431, -1, +- 117, 203, 119, -1, 63, 117, 203, 119, -1, 431, +- -1, 25, 373, -1, 204, -1, 203, 118, 204, -1, +- 1, -1, 203, 1, 204, -1, 203, 118, 1, -1, +- 412, 193, -1, 206, -1, 205, 118, 206, -1, 1, +- -1, 205, 1, 206, -1, 205, 118, 1, -1, 205, +- 1, -1, 208, -1, 412, -1, 208, -1, 419, -1, +- 89, -1, 210, -1, 209, 210, -1, 1, -1, 416, +- 428, 370, 116, -1, 416, 424, 120, 218, 96, 276, +- 267, 116, -1, 212, -1, 211, 116, 212, -1, 1, +- -1, 211, 1, 212, -1, 211, 116, 1, -1, 211, +- 1, -1, 416, 424, 428, 218, 273, -1, -1, 414, +- 215, 428, 213, 218, 273, -1, 414, 215, 1, -1, +- -1, 416, 424, 428, 214, 256, 62, 257, 258, 19, +- -1, 117, 216, 119, -1, 117, 1, 119, -1, 217, +- -1, 216, 116, 217, -1, 216, 1, 217, -1, 216, +- 116, 1, -1, 216, 1, -1, 183, 120, 225, -1, +- 220, -1, 218, 269, -1, 220, -1, 423, 221, -1, +- 222, -1, 51, 222, -1, 224, -1, 67, 224, -1, +- 225, 226, -1, 255, -1, 228, -1, 232, -1, 234, +- -1, 235, -1, 223, 235, -1, 32, -1, 225, -1, +- 419, -1, 117, 227, 119, -1, 121, 373, 122, -1, +- 373, -1, 227, 118, 373, -1, 1, -1, 227, 1, +- 373, -1, 227, 118, 1, -1, 229, -1, 231, -1, +- 117, 230, 119, -1, 117, 1, 119, -1, 412, -1, +- 230, 118, 412, -1, 230, 1, 412, -1, 230, 118, +- 1, -1, 230, 1, -1, 373, 99, 373, -1, 223, +- 373, 99, 373, -1, 123, 233, -1, 124, 233, -1, +- 93, 233, -1, 427, 52, 233, -1, 412, -1, 234, +- -1, 240, -1, 33, 306, -1, 22, 306, 305, -1, +- 236, -1, 239, -1, 242, -1, 243, -1, 432, -1, +- 13, 121, 237, 122, 30, 219, -1, 238, -1, 237, +- 118, 238, -1, 237, 1, 238, -1, 237, 1, -1, +- 1, -1, 228, -1, 225, -1, 240, -1, 20, 241, +- 30, 219, -1, 20, -1, 431, -1, 121, 238, 122, +- -1, 38, 30, 219, -1, 36, 244, 19, -1, 36, +- 1, 19, -1, -1, 245, 426, -1, 245, 116, 247, +- -1, 247, -1, 246, -1, 245, 116, 246, -1, 245, +- 1, 246, -1, 245, 116, 1, -1, 245, 1, -1, +- 183, 120, 219, -1, 15, 248, 30, 251, 426, 250, +- -1, 412, 120, 225, -1, 412, 120, 249, -1, 419, +- -1, 249, -1, 228, -1, -1, 338, 117, 244, 119, +- 426, -1, 252, -1, 251, 116, 252, -1, 251, 1, +- 252, -1, 1, -1, 251, 1, -1, 253, 120, 117, +- 244, 119, -1, 254, -1, 253, 118, 254, -1, 253, +- 118, 1, -1, 253, 1, 254, -1, 253, 1, -1, +- 370, -1, 370, 99, 370, -1, 370, 1, 370, -1, +- 370, 99, 1, -1, 40, 30, 373, -1, 431, -1, +- 46, -1, 431, -1, 117, 225, 119, -1, 117, 1, +- 119, -1, 259, -1, 259, 260, -1, 1, -1, 431, +- -1, 259, 83, -1, 259, 260, 116, -1, 183, 120, +- 219, -1, 33, 412, 306, -1, 22, 412, 306, 302, +- 305, -1, 8, 412, 306, -1, 7, 412, 306, -1, +- 72, -1, 72, 373, -1, 46, -1, 269, -1, 262, +- -1, 261, 262, -1, -1, 185, 424, 120, 218, 263, +- 274, 264, 116, -1, 1, -1, 431, -1, 264, 116, +- 265, -1, 268, -1, 53, 385, -1, -1, 53, 385, +- 83, 266, 373, -1, 431, -1, 267, 116, 268, -1, +- 74, 373, -1, 269, -1, 50, 117, 270, 119, -1, +- 271, -1, 270, 118, 271, -1, 431, -1, 52, -1, +- 412, -1, 412, 428, 373, -1, 412, 117, 373, 119, +- -1, 412, 117, 419, 118, 373, 119, -1, 71, -1, +- 103, -1, 96, -1, 431, -1, 272, 276, -1, 272, +- 1, -1, 273, -1, -1, 45, 275, 373, -1, 45, +- 1, -1, -1, 277, 278, -1, 279, -1, 284, -1, +- 117, 280, 119, -1, 373, -1, 431, -1, 117, 280, +- 119, -1, 281, -1, 284, -1, 286, -1, 1, -1, +- 283, 282, 283, -1, 281, 282, 283, -1, 281, 1, +- 283, -1, 116, -1, 118, -1, 278, -1, 286, -1, +- 121, 285, 122, -1, 121, 1, 122, -1, 286, -1, +- 285, 116, 286, -1, 285, 1, 286, -1, 287, 120, +- 278, -1, 412, -1, 383, -1, 402, 383, -1, 401, +- 383, -1, 293, 116, 295, -1, 292, 116, 296, -1, +- -1, -1, 292, 116, 299, 290, 141, 291, 319, 116, +- -1, 293, -1, 294, -1, 33, 412, 306, -1, 22, +- 412, 306, 302, 305, -1, 6, 301, 306, 304, 305, +- -1, 33, 412, 125, 412, 306, -1, 22, 412, 125, +- 412, 306, 302, 305, -1, 8, 412, 125, 412, 306, +- -1, 7, 412, 125, 412, 306, -1, 299, -1, 296, +- -1, 299, 297, 299, -1, 56, 116, -1, 53, 385, +- 116, -1, -1, 53, 385, 83, 298, 373, 116, -1, +- 53, 385, 116, 74, 373, 116, -1, 74, 373, 116, +- 53, 385, 116, -1, 74, 373, 116, -1, 75, 116, +- -1, 76, 116, -1, 431, -1, 299, 269, 116, -1, +- 299, 300, 116, -1, 54, -1, 61, -1, 412, -1, +- 411, -1, 431, -1, 303, 412, -1, 428, -1, -1, +- 412, -1, 428, 412, -1, 431, -1, 321, -1, 120, +- 224, -1, 432, -1, 431, -1, 117, 119, -1, 117, +- 307, 119, -1, 117, 100, 119, -1, 117, 307, 116, +- 100, 119, -1, 117, 1, 119, -1, 308, -1, 307, +- 116, 308, -1, 307, 1, 308, -1, 307, 116, 1, +- -1, 183, 120, 312, -1, 425, 183, 120, 312, -1, +- 310, 42, 183, 311, -1, 52, 183, 311, -1, 309, +- -1, 33, 412, 306, -1, 22, 412, 306, 302, 305, +- -1, 431, -1, 425, -1, -1, 120, 312, -1, 318, +- -1, 255, -1, 313, -1, 317, -1, 13, 121, 315, +- 122, 30, 314, -1, 223, 13, 121, 316, 122, 30, +- 225, -1, 225, -1, 313, -1, 316, -1, 315, 116, +- 316, -1, 315, 1, 316, -1, 315, 116, 1, -1, +- 412, 99, 412, 120, 225, -1, 13, 30, 318, -1, +- 225, -1, 240, -1, 14, 421, 320, 422, 19, -1, +- 322, -1, 320, 116, 322, -1, -1, 321, -1, 323, +- -1, 325, -1, 325, 324, -1, 326, 322, -1, 324, +- -1, 319, -1, 352, -1, 357, -1, 364, -1, 327, +- -1, 332, -1, 334, -1, 342, -1, 345, -1, 348, +- -1, 23, 207, -1, 207, 120, -1, 42, 262, -1, +- 44, 328, 17, 322, -1, 329, -1, 328, 118, 329, +- -1, 1, -1, 328, 1, 329, -1, 328, 118, 1, +- -1, 372, -1, 372, 120, 412, -1, -1, 24, 371, +- 39, 331, 322, -1, 330, -1, -1, 330, 11, 333, +- 322, -1, -1, -1, 15, 373, 30, 335, 339, 426, +- 336, 337, 19, -1, -1, 338, 421, 320, 422, -1, +- 11, -1, 64, -1, 340, -1, 339, 116, 340, -1, +- 1, -1, 339, 1, 340, -1, 339, 116, 1, -1, +- -1, 253, 120, 341, 421, 322, 422, -1, -1, -1, +- 37, 343, 421, 320, 41, 344, 371, 422, -1, -1, +- -1, 43, 346, 421, 371, 347, 17, 322, 422, -1, +- -1, 21, 389, 356, 373, 351, 373, 349, 17, 421, +- 322, 422, -1, -1, 21, 389, 25, 373, 350, 17, +- 421, 322, 422, -1, 34, -1, 18, -1, 1, -1, +- -1, 354, 353, 355, -1, 390, -1, 123, 390, -1, +- 431, -1, 356, 373, -1, 103, -1, 428, -1, 410, +- 359, -1, 85, -1, 85, 117, 362, 429, -1, 358, +- 429, -1, 358, 118, 361, 429, -1, 358, 118, 94, +- 359, 429, -1, 82, -1, 82, 373, -1, 79, 117, +- 373, -1, 431, -1, -1, 360, 117, 361, 429, -1, +- 373, -1, 361, 118, 373, -1, 1, -1, 361, 118, +- 1, -1, 363, -1, 362, 118, 363, -1, 362, 1, +- 363, -1, 362, 118, 1, -1, 373, -1, 373, 120, +- 373, -1, 373, 120, 373, 120, 373, -1, 49, 365, +- 117, 388, 119, -1, 49, 365, 117, 388, 120, 366, +- 119, -1, 49, 365, 117, 388, 120, 366, 120, 366, +- 119, -1, 49, 365, 117, 388, 120, 366, 120, 366, +- 120, 369, 119, -1, -1, 83, -1, 431, -1, 367, +- -1, 368, -1, 367, 118, 368, -1, 384, 117, 373, +- 119, -1, 384, -1, 369, 118, 384, -1, 373, -1, +- 373, -1, 373, -1, 374, 403, 374, -1, 374, -1, +- 377, -1, 401, 377, -1, 374, 404, 377, -1, 374, +- 405, 377, -1, -1, 374, 31, 375, 377, -1, -1, +- 374, 406, 376, 377, -1, 380, -1, 377, 407, 380, +- -1, 377, 408, 380, -1, -1, 377, 12, 378, 380, +- -1, -1, 377, 409, 379, 380, -1, 381, -1, 380, +- 419, 381, -1, 381, 66, 381, -1, 381, 107, 381, +- -1, 380, 60, 225, -1, 380, 48, 225, -1, 402, +- 381, -1, 123, 381, -1, 384, -1, 382, -1, 28, +- -1, 398, -1, 390, -1, 383, -1, 92, -1, 89, +- -1, 90, -1, 388, -1, 431, -1, 384, -1, 91, +- -1, 93, -1, 124, 387, -1, 95, -1, 118, -1, +- 125, -1, 120, -1, 116, -1, 117, -1, 119, -1, +- 121, -1, 122, -1, 126, -1, 127, -1, 128, -1, +- 129, -1, 130, -1, 131, -1, 132, -1, 123, -1, +- 124, -1, 386, -1, 388, 386, -1, 390, -1, 86, +- 359, -1, 88, -1, 391, -1, 418, -1, 58, 412, +- -1, 389, 125, 412, -1, 117, 373, 119, -1, 389, +- 427, -1, 389, 121, 396, 122, -1, 391, 117, 119, +- -1, -1, 391, 117, 392, 361, 429, -1, 240, 117, +- 373, 119, -1, 80, 117, 362, 119, -1, -1, 78, +- 393, 117, 373, 119, -1, 77, 117, 390, 119, -1, +- 87, 117, 395, 119, -1, 394, 119, -1, 394, 118, +- 361, 119, -1, 394, 118, 94, 359, 119, -1, 81, +- 117, 395, -1, 390, -1, 240, -1, 397, -1, 396, +- 118, 397, -1, 1, -1, 396, 1, 397, -1, 396, +- 118, 1, -1, 373, -1, 373, 99, 373, -1, 121, +- 122, -1, 121, 399, 122, -1, 400, -1, 399, 118, +- 400, -1, 399, 1, 400, -1, 399, 118, 1, -1, +- 373, -1, 373, 99, 373, -1, 126, -1, 127, -1, +- 97, -1, 98, -1, 29, -1, 104, -1, 106, -1, +- 105, -1, 131, -1, 130, -1, 132, -1, 25, -1, +- 126, -1, 97, -1, 127, -1, 98, -1, 73, -1, +- 102, -1, 108, -1, 109, -1, 110, -1, 111, -1, +- 31, 11, -1, 65, -1, 128, -1, 129, -1, 16, +- -1, 27, -1, 68, -1, 69, -1, 112, -1, 113, +- -1, 114, -1, 115, -1, 12, 39, -1, 47, -1, +- 84, -1, 12, -1, 31, -1, 29, -1, 73, -1, +- 68, -1, 69, -1, 126, -1, 97, -1, 127, -1, +- 98, -1, 128, -1, 129, -1, 16, -1, 27, -1, +- 107, -1, 25, -1, 130, -1, 428, -1, 132, -1, +- 104, -1, 105, -1, 106, -1, 12, -1, 31, -1, +- 102, -1, 408, -1, 405, -1, 413, -1, 415, -1, +- 8, -1, 7, -1, 53, -1, 9, -1, 57, -1, +- 59, -1, 6, -1, 10, -1, 415, -1, 416, -1, +- 74, -1, 50, -1, 417, -1, 83, -1, 420, -1, +- 54, -1, 56, -1, 61, -1, 86, -1, 88, -1, +- 84, -1, 85, -1, 87, -1, 82, -1, 77, -1, +- 78, -1, 81, -1, 79, -1, 80, -1, 45, -1, +- 46, -1, 47, -1, 48, -1, 49, -1, 51, -1, +- 75, -1, 76, -1, 55, -1, 58, -1, 60, -1, +- 62, -1, 63, -1, 65, -1, 64, -1, 66, -1, +- 67, -1, 68, -1, 69, -1, 70, -1, 71, -1, +- 72, -1, 73, -1, 419, -1, 83, -1, 420, -1, +- 54, -1, 56, -1, 61, -1, 95, -1, -1, -1, +- -1, -1, 83, -1, -1, 116, -1, 124, -1, 93, +- -1, 123, -1, 131, -1, 96, -1, 119, -1, 1, +- -1, 125, -1, 1, -1, -1, 1, -1 ++ 135, 0, -1, -1, 136, -1, -1, -1, 139, 165, ++ 137, 199, 140, 138, 325, 437, -1, 148, -1, -1, ++ 38, 419, 183, 118, -1, 38, 1, 183, 118, -1, ++ -1, 140, 141, -1, 201, -1, 143, -1, -1, 142, ++ 143, -1, -1, 144, 145, -1, 29, 210, 118, -1, ++ 295, -1, 430, 146, -1, 55, 214, -1, -1, 43, ++ 147, 216, 118, -1, 45, 267, -1, -1, -1, 72, ++ 419, 118, 165, 85, 149, 199, 166, 150, 162, 22, ++ 437, -1, 155, -1, 160, -1, -1, 155, 151, 160, ++ -1, -1, -1, 163, 419, 164, 152, 158, 118, 153, ++ 171, 437, -1, -1, 163, 419, 164, 154, 171, 437, ++ -1, -1, -1, 163, 419, 85, 156, 164, 157, 158, ++ 437, -1, -1, 85, 159, 187, 118, 199, 166, 22, ++ -1, -1, 163, 419, 11, 118, 161, 171, 437, -1, ++ -1, 11, 197, 140, 181, -1, 85, -1, 183, 118, ++ 165, -1, 438, -1, 275, 118, -1, -1, 166, 167, ++ -1, 201, -1, 145, -1, 294, -1, -1, 168, 169, ++ -1, 201, -1, -1, 170, 145, -1, 295, -1, -1, ++ -1, 172, 199, 168, 173, 174, 22, -1, -1, 175, ++ 177, -1, 175, -1, 177, -1, -1, 37, 17, 20, ++ 176, 328, 118, -1, -1, 37, 22, 20, 178, 328, ++ 118, -1, -1, 180, 326, -1, 17, 179, -1, 12, ++ 179, -1, -1, 12, 179, 58, 182, 326, -1, 174, ++ -1, 438, -1, 119, 184, 436, -1, 185, -1, 419, ++ -1, 185, 120, 419, -1, 185, 1, 419, -1, 185, ++ 120, 1, -1, 185, 1, -1, 423, -1, 186, 120, ++ 423, -1, 188, -1, 187, 118, 188, -1, 1, -1, ++ 187, 1, 188, -1, 187, 118, 1, -1, 423, 189, ++ 190, -1, -1, 435, -1, 119, 192, 121, -1, 191, ++ -1, 191, 119, 192, 121, -1, 85, -1, 193, -1, ++ 192, 120, 193, -1, 1, -1, 192, 1, 193, -1, ++ 192, 120, 1, -1, 194, 195, -1, 194, 101, 194, ++ -1, 432, 194, 195, -1, 419, -1, 419, 4, 419, ++ -1, 438, -1, 103, 419, -1, -1, -1, -1, 60, ++ 198, 200, 118, -1, 196, 197, -1, 204, -1, 200, ++ 118, 204, -1, 200, 1, 204, -1, -1, 13, 202, ++ 203, 118, -1, 204, -1, 203, 120, 204, -1, 203, ++ 1, 204, -1, 419, 205, 206, 207, -1, -1, 85, ++ -1, 438, -1, 119, 208, 121, -1, 65, 119, 208, ++ 121, -1, 438, -1, 28, 379, -1, 209, -1, 208, ++ 120, 209, -1, 1, -1, 208, 1, 209, -1, 208, ++ 120, 1, -1, 419, 195, -1, 211, -1, 210, 120, ++ 211, -1, 1, -1, 210, 1, 211, -1, 210, 120, ++ 1, -1, 210, 1, -1, 213, -1, 419, -1, 213, ++ -1, 426, -1, 91, -1, 215, -1, 214, 215, -1, ++ 1, -1, 423, 435, 376, 118, -1, 423, 431, 122, ++ 223, 98, 282, 273, 118, -1, 217, -1, 216, 118, ++ 217, -1, 1, -1, 216, 1, 217, -1, 216, 118, ++ 1, -1, 216, 1, -1, 423, 431, 435, 223, 279, ++ -1, -1, 421, 220, 435, 218, 223, 279, -1, 421, ++ 220, 1, -1, -1, 423, 431, 435, 219, 262, 64, ++ 263, 264, 22, -1, 119, 221, 121, -1, 119, 1, ++ 121, -1, 222, -1, 221, 118, 222, -1, 221, 1, ++ 222, -1, 221, 118, 1, -1, 221, 1, -1, 184, ++ 122, 230, -1, 225, -1, 223, 275, -1, 225, -1, ++ 430, 226, -1, 227, -1, 54, 227, -1, 229, -1, ++ 69, 229, -1, 230, 232, -1, 261, -1, 234, -1, ++ 238, -1, 240, -1, 241, -1, 228, 241, -1, 35, ++ -1, 230, -1, 231, -1, 426, -1, 426, 4, 426, ++ -1, 119, 233, 121, -1, 123, 379, 124, -1, 379, ++ -1, 233, 120, 379, -1, 1, -1, 233, 1, 379, ++ -1, 233, 120, 1, -1, 235, -1, 237, -1, 119, ++ 236, 121, -1, 119, 1, 121, -1, 419, -1, 236, ++ 120, 419, -1, 236, 1, 419, -1, 236, 120, 1, ++ -1, 236, 1, -1, 379, 101, 379, -1, 228, 379, ++ 101, 379, -1, 125, 239, -1, 126, 239, -1, 95, ++ 239, -1, 434, 55, 239, -1, 419, -1, 240, -1, ++ 246, -1, 36, 312, -1, 25, 312, 311, -1, 242, ++ -1, 245, -1, 248, -1, 249, -1, 439, -1, 16, ++ 123, 243, 124, 33, 224, -1, 244, -1, 243, 120, ++ 244, -1, 243, 1, 244, -1, 243, 1, -1, 1, ++ -1, 234, -1, 230, -1, 246, -1, 23, 247, 33, ++ 224, -1, 23, -1, 438, -1, 123, 244, 124, -1, ++ 41, 33, 224, -1, 39, 250, 22, -1, 39, 1, ++ 22, -1, -1, 251, 433, -1, 251, 118, 253, -1, ++ 253, -1, 252, -1, 251, 118, 252, -1, 251, 1, ++ 252, -1, 251, 118, 1, -1, 251, 1, -1, 184, ++ 122, 224, -1, 18, 254, 33, 257, 433, 256, -1, ++ 419, 122, 230, -1, 419, 122, 255, -1, 426, -1, ++ 255, -1, 234, -1, -1, 344, 119, 250, 121, 433, ++ -1, 258, -1, 257, 118, 258, -1, 257, 1, 258, ++ -1, 1, -1, 257, 1, -1, 259, 122, 119, 250, ++ 121, -1, 260, -1, 259, 120, 260, -1, 259, 120, ++ 1, -1, 259, 1, 260, -1, 259, 1, -1, 376, ++ -1, 376, 101, 376, -1, 376, 1, 376, -1, 376, ++ 101, 1, -1, 43, 33, 379, -1, 438, -1, 49, ++ -1, 438, -1, 119, 230, 121, -1, 119, 1, 121, ++ -1, 265, -1, 265, 266, -1, 1, -1, 438, -1, ++ 265, 85, -1, 265, 266, 118, -1, 184, 122, 224, ++ -1, 36, 419, 312, -1, 25, 419, 312, 308, 311, ++ -1, 10, 419, 312, -1, 9, 419, 312, -1, 74, ++ -1, 74, 379, -1, 49, -1, 275, -1, 268, -1, ++ 267, 268, -1, -1, 186, 431, 122, 223, 269, 280, ++ 270, 118, -1, 1, -1, 438, -1, 270, 118, 271, ++ -1, 274, -1, 56, 391, -1, -1, 56, 391, 85, ++ 272, 379, -1, 438, -1, 273, 118, 274, -1, 76, ++ 379, -1, 275, -1, 53, 119, 276, 121, -1, 277, ++ -1, 276, 120, 277, -1, 438, -1, 55, -1, 419, ++ -1, 419, 435, 379, -1, 419, 119, 379, 121, -1, ++ 419, 119, 426, 120, 379, 121, -1, 73, -1, 105, ++ -1, 98, -1, 438, -1, 278, 282, -1, 278, 1, ++ -1, 279, -1, -1, 48, 281, 379, -1, 48, 1, ++ -1, -1, 283, 284, -1, 285, -1, 290, -1, 119, ++ 286, 121, -1, 379, -1, 438, -1, 119, 286, 121, ++ -1, 287, -1, 290, -1, 292, -1, 1, -1, 289, ++ 288, 289, -1, 287, 288, 289, -1, 287, 1, 289, ++ -1, 118, -1, 120, -1, 284, -1, 292, -1, 123, ++ 291, 124, -1, 123, 1, 124, -1, 292, -1, 291, ++ 118, 292, -1, 291, 1, 292, -1, 293, 122, 284, ++ -1, 419, -1, 389, -1, 409, 389, -1, 408, 389, ++ -1, 299, 118, 301, -1, 298, 118, 302, -1, -1, ++ -1, 298, 118, 305, 296, 197, 142, 297, 325, 118, ++ -1, 299, -1, 300, -1, 36, 419, 312, -1, 25, ++ 419, 312, 308, 311, -1, 8, 307, 312, 310, 311, ++ -1, 36, 419, 4, 419, 312, -1, 25, 419, 4, ++ 419, 312, 308, 311, -1, 10, 419, 4, 419, 312, ++ -1, 9, 419, 4, 419, 312, -1, 305, -1, 302, ++ -1, 305, 303, 305, -1, 59, 118, -1, 56, 391, ++ 118, -1, -1, 56, 391, 85, 304, 379, 118, -1, ++ 56, 391, 118, 76, 379, 118, -1, 76, 379, 118, ++ 56, 391, 118, -1, 76, 379, 118, -1, 77, 118, ++ -1, 78, 118, -1, 438, -1, 305, 275, 118, -1, ++ 305, 306, 118, -1, 57, -1, 63, -1, 419, -1, ++ 418, -1, 438, -1, 309, 419, -1, 435, -1, -1, ++ 419, -1, 435, 419, -1, 438, -1, 327, -1, 122, ++ 229, -1, 439, -1, 438, -1, 119, 121, -1, 119, ++ 313, 121, -1, 119, 102, 121, -1, 119, 313, 118, ++ 102, 121, -1, 119, 1, 121, -1, 314, -1, 313, ++ 118, 314, -1, 313, 1, 314, -1, 313, 118, 1, ++ -1, 184, 122, 318, -1, 432, 184, 122, 318, -1, ++ 316, 45, 184, 317, -1, 55, 184, 317, -1, 315, ++ -1, 36, 419, 312, -1, 25, 419, 312, 308, 311, ++ -1, 438, -1, 432, -1, -1, 122, 318, -1, 324, ++ -1, 261, -1, 319, -1, 323, -1, 16, 123, 321, ++ 124, 33, 320, -1, 228, 16, 123, 322, 124, 33, ++ 230, -1, 230, -1, 319, -1, 322, -1, 321, 118, ++ 322, -1, 321, 1, 322, -1, 321, 118, 1, -1, ++ 419, 101, 419, 122, 230, -1, 16, 33, 324, -1, ++ 230, -1, 246, -1, 17, 428, 326, 429, 22, -1, ++ 328, -1, 326, 118, 328, -1, -1, 327, -1, 329, ++ -1, 331, -1, 331, 330, -1, 332, 328, -1, 330, ++ -1, 325, -1, 358, -1, 363, -1, 370, -1, 333, ++ -1, 338, -1, 340, -1, 348, -1, 351, -1, 354, ++ -1, 26, 212, -1, 212, 122, -1, 45, 268, -1, ++ 47, 334, 20, 328, -1, 335, -1, 334, 120, 335, ++ -1, 1, -1, 334, 1, 335, -1, 334, 120, 1, ++ -1, 378, -1, 378, 122, 419, -1, -1, 27, 377, ++ 42, 337, 328, -1, 336, -1, -1, 336, 14, 339, ++ 328, -1, -1, -1, 18, 379, 33, 341, 345, 433, ++ 342, 343, 22, -1, -1, 344, 428, 326, 429, -1, ++ 14, -1, 66, -1, 346, -1, 345, 118, 346, -1, ++ 1, -1, 345, 1, 346, -1, 345, 118, 1, -1, ++ -1, 259, 122, 347, 428, 328, 429, -1, -1, -1, ++ 40, 349, 428, 326, 44, 350, 377, 429, -1, -1, ++ -1, 46, 352, 428, 377, 353, 20, 328, 429, -1, ++ -1, 24, 395, 362, 379, 357, 379, 355, 20, 428, ++ 328, 429, -1, -1, 24, 395, 28, 379, 356, 20, ++ 428, 328, 429, -1, 37, -1, 21, -1, 1, -1, ++ -1, 360, 359, 361, -1, 396, -1, 125, 396, -1, ++ 438, -1, 362, 379, -1, 105, -1, 435, -1, 417, ++ 365, -1, 87, -1, 87, 119, 368, 436, -1, 364, ++ 436, -1, 364, 120, 367, 436, -1, 364, 120, 96, ++ 365, 436, -1, 84, -1, 84, 379, -1, 81, 119, ++ 379, -1, 438, -1, -1, 366, 119, 367, 436, -1, ++ 379, -1, 367, 120, 379, -1, 1, -1, 367, 120, ++ 1, -1, 369, -1, 368, 120, 369, -1, 368, 1, ++ 369, -1, 368, 120, 1, -1, 379, -1, 379, 122, ++ 379, -1, 379, 122, 379, 122, 379, -1, 52, 371, ++ 119, 394, 121, -1, 52, 371, 119, 394, 122, 372, ++ 121, -1, 52, 371, 119, 394, 122, 372, 122, 372, ++ 121, -1, 52, 371, 119, 394, 122, 372, 122, 372, ++ 122, 375, 121, -1, -1, 85, -1, 438, -1, 373, ++ -1, 374, -1, 373, 120, 374, -1, 390, 119, 379, ++ 121, -1, 390, -1, 375, 120, 390, -1, 379, -1, ++ 379, -1, 379, -1, 380, 410, 380, -1, 380, -1, ++ 383, -1, 408, 383, -1, 380, 411, 383, -1, 380, ++ 412, 383, -1, -1, 380, 34, 381, 383, -1, -1, ++ 380, 413, 382, 383, -1, 386, -1, 383, 414, 386, ++ -1, 383, 415, 386, -1, -1, 383, 15, 384, 386, ++ -1, -1, 383, 416, 385, 386, -1, 387, -1, 386, ++ 426, 387, -1, 387, 68, 387, -1, 387, 109, 387, ++ -1, 386, 62, 230, -1, 386, 51, 230, -1, 409, ++ 387, -1, 125, 387, -1, 390, -1, 388, -1, 31, ++ -1, 405, -1, 396, -1, 389, -1, 94, -1, 91, ++ -1, 92, -1, 394, -1, 438, -1, 390, -1, 93, ++ -1, 95, -1, 126, 393, -1, 97, -1, 120, -1, ++ 4, -1, 122, -1, 118, -1, 119, -1, 121, -1, ++ 123, -1, 124, -1, 127, -1, 128, -1, 129, -1, ++ 130, -1, 131, -1, 132, -1, 133, -1, 125, -1, ++ 126, -1, 392, -1, 394, 392, -1, 396, -1, 88, ++ 365, -1, 90, -1, 398, -1, 425, -1, 426, 4, ++ 419, -1, 397, -1, 61, 419, -1, 395, 4, 419, ++ -1, 119, 379, 121, -1, 395, 434, -1, 395, 123, ++ 403, 124, -1, 398, 119, 121, -1, -1, 398, 119, ++ 399, 367, 436, -1, 246, 119, 379, 121, -1, 82, ++ 119, 368, 121, -1, -1, 80, 400, 119, 379, 121, ++ -1, 79, 119, 396, 121, -1, 89, 119, 402, 121, ++ -1, 401, 121, -1, 401, 120, 367, 121, -1, 401, ++ 120, 96, 365, 121, -1, 83, 119, 402, -1, 396, ++ -1, 246, -1, 404, -1, 403, 120, 404, -1, 1, ++ -1, 403, 1, 404, -1, 403, 120, 1, -1, 379, ++ -1, 379, 101, 379, -1, 123, 124, -1, 123, 406, ++ 124, -1, 407, -1, 406, 120, 407, -1, 406, 1, ++ 407, -1, 406, 120, 1, -1, 379, -1, 379, 101, ++ 379, -1, 127, -1, 128, -1, 99, -1, 100, -1, ++ 32, -1, 106, -1, 108, -1, 107, -1, 132, -1, ++ 131, -1, 133, -1, 28, -1, 127, -1, 99, -1, ++ 128, -1, 100, -1, 75, -1, 104, -1, 110, -1, ++ 111, -1, 112, -1, 113, -1, 34, 14, -1, 67, ++ -1, 129, -1, 130, -1, 19, -1, 30, -1, 70, ++ -1, 71, -1, 114, -1, 115, -1, 116, -1, 117, ++ -1, 15, 42, -1, 50, -1, 86, -1, 15, -1, ++ 34, -1, 32, -1, 75, -1, 70, -1, 71, -1, ++ 127, -1, 99, -1, 128, -1, 100, -1, 129, -1, ++ 130, -1, 19, -1, 30, -1, 109, -1, 28, -1, ++ 131, -1, 435, -1, 133, -1, 106, -1, 107, -1, ++ 108, -1, 15, -1, 34, -1, 104, -1, 415, -1, ++ 412, -1, 420, -1, 422, -1, 10, -1, 9, -1, ++ 56, -1, 11, -1, 60, -1, 12, -1, 8, -1, ++ 13, -1, 422, -1, 423, -1, 76, -1, 53, -1, ++ 424, -1, 85, -1, 427, -1, 57, -1, 59, -1, ++ 63, -1, 88, -1, 90, -1, 86, -1, 87, -1, ++ 89, -1, 84, -1, 79, -1, 80, -1, 83, -1, ++ 81, -1, 82, -1, 48, -1, 49, -1, 50, -1, ++ 51, -1, 52, -1, 54, -1, 77, -1, 78, -1, ++ 58, -1, 61, -1, 62, -1, 64, -1, 65, -1, ++ 67, -1, 66, -1, 68, -1, 69, -1, 70, -1, ++ 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, ++ 426, -1, 85, -1, 427, -1, 57, -1, 59, -1, ++ 63, -1, 97, -1, -1, -1, -1, -1, 85, -1, ++ -1, 118, -1, 126, -1, 95, -1, 125, -1, 132, ++ -1, 98, -1, 121, -1, 1, -1, 4, -1, 1, ++ -1, -1, 1, -1 + }; + + /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + static const unsigned short yyrline[] = + { +- 0, 236, 236, 237, 249, 251, 248, 254, 260, 261, +- 263, 269, 270, 275, 276, 281, 282, 287, 287, 290, +- 292, 297, 307, 310, 309, 313, 319, 321, 318, 324, +- 325, 327, 326, 335, 337, 334, 343, 342, 349, 351, +- 348, 358, 357, 365, 364, 370, 371, 375, 380, 385, +- 386, 391, 392, 397, 398, 399, 405, 406, 411, 412, +- 412, 415, 420, 422, 420, 426, 428, 429, 430, 435, +- 434, 442, 441, 448, 448, 454, 455, 457, 456, 460, +- 464, 465, 470, 475, 477, 479, 485, 487, 491, 493, +- 498, 499, 501, 503, 505, 510, 516, 517, 521, 523, +- 524, 529, 534, 535, 537, 539, 541, 546, 548, 550, +- 555, 556, 562, 563, 563, 568, 569, 570, 575, 580, +- 581, 582, 587, 593, 594, 599, 600, 602, 607, 608, +- 613, 614, 616, 618, 620, 625, 632, 634, 636, 638, +- 640, 642, 646, 647, 654, 655, 659, 666, 667, 668, +- 672, 674, 685, 686, 688, 689, 691, 693, 697, 708, +- 707, 719, 722, 721, 732, 734, 739, 740, 742, 744, +- 746, 750, 755, 756, 761, 771, 781, 782, 791, 792, +- 802, 804, 805, 806, 807, 809, 810, 815, 820, 832, +- 846, 848, 856, 861, 866, 868, 874, 881, 882, 887, +- 889, 894, 896, 898, 900, 902, 906, 908, 918, 920, +- 922, 924, 935, 951, 957, 963, 965, 970, 971, 972, +- 973, 974, 978, 983, 984, 986, 988, 990, 996, 998, +- 1003, 1004, 1009, 1014, 1015, 1020, 1025, 1027, 1033, 1034, +- 1036, 1038, 1043, 1044, 1046, 1048, 1050, 1054, 1059, 1064, +- 1066, 1068, 1070, 1075, 1081, 1082, 1087, 1088, 1090, 1092, +- 1094, 1098, 1103, 1104, 1106, 1108, 1110, 1114, 1116, 1121, +- 1127, 1132, 1144, 1145, 1149, 1150, 1152, 1157, 1158, 1160, +- 1165, 1166, 1168, 1173, 1175, 1177, 1179, 1181, 1183, 1185, +- 1187, 1189, 1195, 1196, 1201, 1200, 1225, 1230, 1231, 1236, +- 1237, 1240, 1239, 1246, 1247, 1252, 1254, 1259, 1264, 1265, +- 1270, 1271, 1273, 1275, 1277, 1279, 1284, 1285, 1287, 1292, +- 1293, 1295, 1300, 1302, 1301, 1309, 1329, 1329, 1335, 1337, +- 1338, 1346, 1359, 1360, 1362, 1364, 1365, 1366, 1374, 1376, +- 1378, 1383, 1384, 1389, 1390, 1394, 1399, 1408, 1409, 1411, +- 1416, 1421, 1422, 1423, 1425, 1539, 1550, 1553, 1555, 1552, +- 1567, 1568, 1572, 1574, 1576, 1586, 1588, 1590, 1592, 1597, +- 1598, 1602, 1607, 1609, 1612, 1611, 1615, 1617, 1619, 1621, +- 1623, 1628, 1629, 1631, 1639, 1640, 1644, 1645, 1649, 1650, +- 1655, 1657, 1661, 1662, 1664, 1669, 1671, 1673, 1677, 1678, +- 1683, 1685, 1687, 1689, 1694, 1695, 1697, 1699, 1703, 1705, +- 1707, 1709, 1711, 1716, 1718, 1723, 1724, 1729, 1730, 1735, +- 1736, 1737, 1738, 1742, 1744, 1753, 1754, 1758, 1759, 1761, +- 1763, 1767, 1775, 1783, 1784, 1790, 1795, 1796, 1807, 1811, +- 1813, 1818, 1819, 1820, 1821, 1825, 1826, 1827, 1828, 1829, +- 1830, 1831, 1832, 1833, 1834, 1835, 1840, 1845, 1853, 1858, +- 1859, 1861, 1863, 1865, 1870, 1872, 1878, 1877, 1887, 1890, +- 1889, 1901, 1906, 1900, 1923, 1929, 1933, 1935, 1939, 1940, +- 1942, 1944, 1946, 1952, 1951, 1962, 1964, 1961, 1975, 1977, +- 1974, 1984, 1983, 1988, 1987, 1994, 1996, 1998, 2006, 2005, +- 2017, 2018, 2040, 2041, 2046, 2047, 2052, 2054, 2056, 2058, +- 2060, 2068, 2070, 2072, 2077, 2082, 2083, 2083, 2089, 2091, +- 2093, 2095, 2100, 2101, 2103, 2105, 2111, 2113, 2115, 2120, +- 2122, 2124, 2126, 2132, 2133, 2138, 2139, 2143, 2144, 2149, +- 2154, 2156, 2163, 2180, 2191, 2196, 2198, 2203, 2204, 2209, +- 2211, 2214, 2213, 2218, 2217, 2224, 2225, 2227, 2230, 2229, +- 2234, 2233, 2240, 2241, 2243, 2245, 2247, 2249, 2254, 2256, +- 2261, 2262, 2263, 2265, 2266, 2281, 2282, 2286, 2287, 2291, +- 2296, 2297, 2301, 2302, 2303, 2308, 2309, 2309, 2309, 2309, +- 2309, 2309, 2309, 2309, 2310, 2310, 2310, 2310, 2310, 2310, +- 2310, 2310, 2310, 2314, 2316, 2321, 2326, 2328, 2330, 2334, +- 2335, 2337, 2339, 2350, 2352, 2354, 2360, 2359, 2366, 2368, +- 2371, 2370, 2377, 2379, 2381, 2383, 2394, 2399, 2404, 2405, +- 2410, 2411, 2413, 2415, 2417, 2422, 2424, 2432, 2434, 2439, +- 2440, 2442, 2444, 2449, 2451, 2458, 2459, 2463, 2464, 2465, +- 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2479, 2480, 2481, +- 2482, 2483, 2484, 2488, 2489, 2490, 2491, 2495, 2497, 2501, +- 2502, 2503, 2504, 2505, 2506, 2510, 2511, 2512, 2513, 2517, +- 2519, 2525, 2528, 2529, 2530, 2531, 2532, 2533, 2539, 2540, +- 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, +- 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2563, +- 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2581, +- 2586, 2587, 2588, 2593, 2598, 2599, 2600, 2601, 2602, 2603, +- 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, +- 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, +- 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, +- 2634, 2635, 2636, 2640, 2645, 2646, 2647, 2648, 2649, 2653, +- 2661, 2666, 2671, 2681, 2685, 2691, 2692, 2697, 2698, 2699, +- 2703, 2704, 2708, 2709, 2714, 2715, 2721, 2725 ++ 0, 253, 253, 254, 266, 268, 265, 271, 277, 278, ++ 280, 286, 287, 292, 293, 298, 299, 304, 304, 307, ++ 309, 314, 324, 327, 326, 330, 336, 338, 335, 341, ++ 342, 344, 343, 352, 354, 351, 360, 359, 366, 368, ++ 365, 375, 374, 382, 381, 387, 388, 392, 397, 402, ++ 403, 408, 409, 414, 415, 416, 422, 423, 428, 429, ++ 429, 432, 437, 439, 437, 443, 445, 446, 447, 452, ++ 451, 459, 458, 465, 465, 471, 472, 474, 473, 477, ++ 481, 482, 487, 492, 494, 496, 502, 504, 508, 510, ++ 515, 516, 518, 520, 522, 527, 533, 534, 538, 540, ++ 541, 546, 551, 552, 554, 556, 558, 563, 565, 567, ++ 572, 573, 578, 579, 586, 589, 592, 592, 596, 600, ++ 601, 602, 607, 607, 612, 613, 614, 619, 626, 627, ++ 632, 633, 635, 640, 641, 646, 647, 649, 651, 653, ++ 658, 665, 667, 669, 671, 673, 675, 679, 680, 687, ++ 688, 692, 699, 700, 701, 705, 707, 718, 719, 721, ++ 722, 724, 726, 730, 741, 740, 752, 755, 754, 765, ++ 767, 772, 773, 775, 777, 779, 783, 788, 789, 794, ++ 804, 814, 815, 824, 825, 835, 837, 838, 839, 840, ++ 842, 843, 848, 853, 865, 879, 880, 885, 887, 895, ++ 900, 905, 907, 913, 920, 921, 926, 928, 933, 935, ++ 937, 939, 941, 945, 947, 957, 959, 961, 963, 974, ++ 990, 996, 1002, 1004, 1009, 1010, 1011, 1012, 1013, 1017, ++ 1022, 1023, 1025, 1027, 1029, 1035, 1037, 1042, 1043, 1048, ++ 1053, 1054, 1059, 1064, 1066, 1072, 1073, 1075, 1077, 1082, ++ 1083, 1085, 1087, 1089, 1093, 1098, 1103, 1105, 1107, 1109, ++ 1114, 1120, 1121, 1126, 1127, 1129, 1131, 1133, 1137, 1142, ++ 1143, 1145, 1147, 1149, 1153, 1155, 1160, 1166, 1171, 1183, ++ 1184, 1188, 1189, 1191, 1196, 1197, 1199, 1204, 1205, 1207, ++ 1212, 1214, 1216, 1218, 1220, 1222, 1224, 1226, 1228, 1234, ++ 1235, 1240, 1239, 1264, 1269, 1270, 1275, 1276, 1279, 1278, ++ 1285, 1286, 1291, 1293, 1298, 1303, 1304, 1309, 1310, 1312, ++ 1314, 1316, 1318, 1323, 1324, 1326, 1331, 1332, 1334, 1339, ++ 1341, 1340, 1348, 1368, 1368, 1374, 1376, 1377, 1385, 1398, ++ 1399, 1401, 1403, 1404, 1405, 1413, 1415, 1417, 1422, 1423, ++ 1428, 1429, 1433, 1438, 1447, 1448, 1450, 1455, 1460, 1461, ++ 1462, 1464, 1578, 1589, 1592, 1595, 1591, 1607, 1608, 1612, ++ 1614, 1616, 1626, 1628, 1630, 1632, 1637, 1638, 1642, 1647, ++ 1649, 1652, 1651, 1655, 1657, 1659, 1661, 1663, 1668, 1669, ++ 1671, 1679, 1680, 1684, 1685, 1689, 1690, 1695, 1697, 1701, ++ 1702, 1704, 1709, 1711, 1713, 1717, 1718, 1723, 1725, 1727, ++ 1729, 1734, 1735, 1737, 1739, 1743, 1745, 1747, 1749, 1751, ++ 1756, 1758, 1763, 1764, 1769, 1770, 1775, 1776, 1777, 1778, ++ 1782, 1784, 1793, 1794, 1798, 1799, 1801, 1803, 1807, 1815, ++ 1823, 1824, 1830, 1835, 1836, 1847, 1851, 1853, 1858, 1859, ++ 1860, 1861, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, ++ 1873, 1874, 1875, 1880, 1885, 1893, 1898, 1899, 1901, 1903, ++ 1905, 1910, 1912, 1918, 1917, 1927, 1930, 1929, 1941, 1946, ++ 1940, 1963, 1969, 1973, 1975, 1979, 1980, 1982, 1984, 1986, ++ 1992, 1991, 2002, 2004, 2001, 2015, 2017, 2014, 2024, 2023, ++ 2028, 2027, 2034, 2036, 2038, 2046, 2045, 2057, 2058, 2080, ++ 2081, 2086, 2087, 2092, 2094, 2096, 2098, 2100, 2108, 2110, ++ 2112, 2117, 2122, 2123, 2123, 2129, 2131, 2133, 2135, 2140, ++ 2141, 2143, 2145, 2151, 2153, 2155, 2160, 2162, 2164, 2166, ++ 2172, 2173, 2178, 2179, 2183, 2184, 2189, 2194, 2196, 2203, ++ 2220, 2231, 2236, 2238, 2243, 2244, 2249, 2251, 2254, 2253, ++ 2258, 2257, 2264, 2265, 2267, 2270, 2269, 2274, 2273, 2280, ++ 2281, 2283, 2285, 2287, 2289, 2294, 2296, 2301, 2302, 2303, ++ 2305, 2306, 2321, 2322, 2326, 2327, 2331, 2336, 2337, 2341, ++ 2342, 2343, 2348, 2349, 2349, 2349, 2349, 2349, 2349, 2349, ++ 2349, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, ++ 2354, 2356, 2361, 2366, 2368, 2370, 2374, 2375, 2380, 2381, ++ 2383, 2385, 2396, 2398, 2400, 2406, 2405, 2412, 2414, 2417, ++ 2416, 2423, 2425, 2427, 2429, 2440, 2445, 2450, 2451, 2456, ++ 2457, 2459, 2461, 2463, 2468, 2470, 2478, 2480, 2485, 2486, ++ 2488, 2490, 2495, 2497, 2504, 2505, 2509, 2510, 2511, 2515, ++ 2516, 2517, 2518, 2519, 2520, 2521, 2525, 2526, 2527, 2528, ++ 2529, 2530, 2534, 2535, 2536, 2537, 2541, 2543, 2547, 2548, ++ 2549, 2550, 2551, 2552, 2556, 2557, 2558, 2559, 2563, 2565, ++ 2571, 2574, 2575, 2576, 2577, 2578, 2579, 2585, 2586, 2587, ++ 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, ++ 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2609, 2614, ++ 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2627, 2632, ++ 2633, 2634, 2639, 2644, 2645, 2646, 2647, 2648, 2649, 2650, ++ 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, ++ 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, ++ 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, ++ 2681, 2682, 2686, 2691, 2692, 2693, 2694, 2695, 2699, 2707, ++ 2712, 2717, 2727, 2731, 2737, 2738, 2743, 2744, 2745, 2749, ++ 2750, 2754, 2755, 2760, 2761, 2767, 2771 + }; + #endif + +@@ -884,19 +903,19 @@ + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ + static const char *const yytname[] = + { +- "$end", "error", "$undefined", "prec_if", "prec_lower_than_error", +- "prec_import", "p_operator", "p_destructor", "p_constructor", +- "p_implementation", "p_uses", "p_else", "p_and", "p_array", "p_begin", +- "p_case", "p_div", "p_do", "p_downto", "p_end", "p_file", "p_for", +- "p_function", "p_goto", "p_if", "p_in", "p_label", "p_mod", "p_nil", +- "p_not", "p_of", "p_or", "p_packed", "p_procedure", "p_to", "p_program", +- "p_record", "p_repeat", "p_set", "p_then", "p_type", "p_until", "p_var", +- "p_while", "p_with", "p_absolute", "p_abstract", "p_and_then", "p_as", +- "p_asm", "p_attribute", "p_bindable", "p_const", "p_external", "p_far", +- "p_finalization", "p_forward", "p_import", "p_inherited", +- "p_initialization", "p_is", "p_near", "p_object", "p_only", +- "p_otherwise", "p_or_else", "p_pow", "p_restricted", "p_shl", "p_shr", +- "p_unit", "p_value", "p_virtual", "p_xor", "p_asmname", "p_c", ++ "$end", "error", "$undefined", "prec_id", "'.'", "prec_if", ++ "prec_lower_than_error", "prec_import", "p_operator", "p_destructor", ++ "p_constructor", "p_implementation", "p_initialization", "p_uses", ++ "p_else", "p_and", "p_array", "p_begin", "p_case", "p_div", "p_do", ++ "p_downto", "p_end", "p_file", "p_for", "p_function", "p_goto", "p_if", ++ "p_in", "p_label", "p_mod", "p_nil", "p_not", "p_of", "p_or", "p_packed", ++ "p_procedure", "p_to", "p_program", "p_record", "p_repeat", "p_set", ++ "p_then", "p_type", "p_until", "p_var", "p_while", "p_with", ++ "p_absolute", "p_abstract", "p_and_then", "p_as", "p_asm", "p_attribute", ++ "p_bindable", "p_const", "p_external", "p_far", "p_finalization", ++ "p_forward", "p_import", "p_inherited", "p_is", "p_near", "p_object", ++ "p_only", "p_otherwise", "p_or_else", "p_pow", "p_restricted", "p_shl", ++ "p_shr", "p_unit", "p_value", "p_virtual", "p_xor", "p_asmname", "p_c", + "p_c_language", "p_Addr", "p_Assigned", "p_Dispose", "p_FormatString", + "p_New", "p_Return", "LEX_ID", "LEX_BUILTIN_PROCEDURE", + "LEX_BUILTIN_PROCEDURE_WRITE", "LEX_BUILTIN_FUNCTION", +@@ -907,8 +926,8 @@ + "LEX_ASSIGN", "LEX_NE", "LEX_GE", "LEX_LE", "LEX_POWER", "LEX_CEIL_PLUS", + "LEX_CEIL_MINUS", "LEX_FLOOR_PLUS", "LEX_FLOOR_MINUS", "LEX_CEIL_MULT", + "LEX_CEIL_DIV", "LEX_FLOOR_MULT", "LEX_FLOOR_DIV", "';'", "'('", "','", +- "')'", "':'", "'['", "']'", "'@'", "'^'", "'.'", "'+'", "'-'", "'*'", +- "'/'", "'<'", "'='", "'>'", "$accept", "program_component", ++ "')'", "':'", "'['", "']'", "'@'", "'^'", "'+'", "'-'", "'*'", "'/'", ++ "'<'", "'='", "'>'", "$accept", "program_component", + "program_component_1", "@1", "@2", "optional_program_heading", + "declarations_and_uses", "declaration_or_uses", "any_declaration_part", + "any_decl", "@3", "simple_decl", "simple_decl_1", "@4", +@@ -923,43 +942,44 @@ + "optional_unit_init_and_final_part", "@21", "optional_par_id_list", + "id_list", "id_list1", "id_list_limited", "export_part_list", + "export_part", "equals_or_error", "export_list_or_all", "export_all", +- "export_list", "export_list_item", "optional_rename", +- "optional_import_part", "@22", "import_specification_list", "uses_part", ++ "export_list", "export_list_item", "new_quid", "optional_rename", ++ "extra_import_part", "optional_import_part1", "@22", ++ "optional_import_part", "import_specification_list", "uses_part", "@23", + "uses_list", "import_specification", "optional_access_qualifier", + "optional_import_qualifier", "optional_unit_filename", + "import_clause_list", "import_clause", "label_list", "new_label", + "label", "num_label", "constant_definition_list", "constant_definition", +- "type_definition_list", "type_definition", "@23", "@24", ++ "type_definition_list", "type_definition", "@24", "@25", + "formal_schema_discriminants", "discriminant_specification_list", + "discriminant_specification", "type_denoter_with_attributes", + "type_denoter_no_init", "type_denoter", "type_denoter_1", + "type_denoter_0", "packed", "typename_or_string255", "typename", +- "actual_schema_discriminants", "discriminant_expression_list", +- "new_ordinal_type", "enumerated_type", "enum_list", "subrange_type", +- "new_pointer_type", "pointer_domain_type", "new_procedural_type", +- "unpacked_structured_type", "array_type", "array_index_list", +- "ordinal_index_type", "file_type", "untyped_file", ++ "typename_1", "actual_schema_discriminants", ++ "discriminant_expression_list", "new_ordinal_type", "enumerated_type", ++ "enum_list", "subrange_type", "new_pointer_type", "pointer_domain_type", ++ "new_procedural_type", "unpacked_structured_type", "array_type", ++ "array_index_list", "ordinal_index_type", "file_type", "untyped_file", + "direct_access_index_type", "set_type", "record_type", + "record_field_list", "fixed_part", "record_section", "variant_part", + "variant_selector", "new_ordinal_type_non_iso", "rest_of_variant", + "variant_list", "variant", "case_constant_list", "one_case_constant", + "type_inquiry", "optional_abstract", "object_parent", + "object_field_list", "object_field_list_1", "object_section", +- "variable_declaration_list", "variable_declaration", "@25", +- "optional_variable_directive_list", "variable_directive", "@26", ++ "variable_declaration_list", "variable_declaration", "@26", ++ "optional_variable_directive_list", "variable_directive", "@27", + "optional_variable_directive_list_no_external", + "variable_directive_no_external", "attributes", "attribute_list", + "attrib", "var_init", "optional_value_specification", +- "absolute_or_value_specification", "@27", "initializer_expression", +- "@28", "initializer_expression_0", "static_initializer_expression", ++ "absolute_or_value_specification", "@28", "initializer_expression", ++ "@29", "initializer_expression_0", "static_initializer_expression", + "structured_bp_initializer", "bp_initializer_list", + "initializer_separator", "bp_initializer_expression", + "structured_iso_initializer", "iso_initializer_list", + "iso_initializer_expression", "initializer_field", +- "routine_interface_decl", "routine_declaration", "@29", "@30", ++ "routine_interface_decl", "routine_declaration", "@30", "@31", + "routine_or_method_heading", "routine_heading", "method_heading", + "optional_routine_interface_directive_list", "remote_directive_list", +- "remote_directive", "@31", "optional_routine_directive_list", ++ "remote_directive", "@32", "optional_routine_directive_list", + "bp_directive", "operator_identifier", "optional_result_def", + "optional_result_equals", "operator_result_def", "resulttype", + "optional_formal_parameter_list", "formal_parameter_list", +@@ -970,24 +990,24 @@ + "compound_statement", "statement_sequence", "empty_lte", + "optional_statement", "statement", "unlabelled_statement", "set_label", + "statement_var_decl", "with_statement", "with_list", "with_variable", +- "simple_if", "@32", "if_statement", "@33", "case_statement", "@34", +- "@35", "optional_case_default", "otherwise", "case_element_list", +- "case_element", "@36", "repeat_statement", "@37", "@38", +- "while_statement", "@39", "@40", "for_statement", "@41", "@42", +- "for_direction", "assignment_or_call_statement", "@43", ++ "simple_if", "@33", "if_statement", "@34", "case_statement", "@35", ++ "@36", "optional_case_default", "otherwise", "case_element_list", ++ "case_element", "@37", "repeat_statement", "@38", "@39", ++ "while_statement", "@40", "@41", "for_statement", "@42", "@43", ++ "for_direction", "assignment_or_call_statement", "@44", + "start_of_statement", "rest_of_statement", "assign", + "standard_procedure_statement", "start_of_dispose", +- "optional_actual_parameter_list", "@44", "actual_parameter_list", ++ "optional_actual_parameter_list", "@45", "actual_parameter_list", + "write_actual_parameter_list", "write_actual_parameter", "asm_statement", + "asm_qualifier", "asm_operands", "nonempty_asm_operands", "asm_operand", + "asm_clobbers", "static_expression", "boolean_expression", +- "expression_no_par", "expression", "simple_expression", "@45", "@46", +- "term", "@47", "@48", "factor", "primary", "unsigned_number", "intconst", ++ "expression_no_par", "expression", "simple_expression", "@46", "@47", ++ "term", "@48", "@49", "factor", "primary", "unsigned_number", "intconst", + "combined_string", "optional_combined_string", "string_constant", + "caret_chars", "string_constants", + "variable_or_routine_access_no_parentheses", +- "variable_or_routine_access", +- "variable_or_routine_access_no_builtin_function", "@49", "@50", ++ "variable_or_routine_access", "qualified_id_access", ++ "variable_or_routine_access_no_builtin_function", "@50", "@51", + "start_of_new", "variable_or_typename", "index_expression_list", + "index_expression_item", "set_constructor", + "set_constructor_element_list", "member_designator", "sign", +@@ -1006,85 +1026,86 @@ + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ + static const unsigned short yyr1[] = + { +- 0, 133, 134, 134, 136, 137, 135, 135, 138, 138, +- 138, 139, 139, 140, 140, 141, 141, 143, 142, 142, +- 142, 144, 145, 146, 145, 145, 148, 149, 147, 147, +- 147, 150, 147, 151, 152, 147, 153, 147, 155, 156, +- 154, 158, 157, 160, 159, 161, 161, 162, 163, 164, +- 164, 165, 165, 166, 166, 166, 167, 167, 168, 169, +- 168, 168, 171, 172, 170, 173, 173, 173, 173, 175, +- 174, 177, 176, 179, 178, 180, 180, 181, 180, 180, +- 182, 182, 183, 184, 184, 184, 184, 184, 185, 185, +- 186, 186, 186, 186, 186, 187, 188, 188, 189, 189, +- 189, 190, 191, 191, 191, 191, 191, 192, 192, 192, +- 193, 193, 194, 195, 194, 196, 196, 196, 197, 198, +- 198, 198, 199, 200, 200, 201, 201, 201, 202, 202, +- 203, 203, 203, 203, 203, 204, 205, 205, 205, 205, +- 205, 205, 206, 206, 207, 207, 208, 209, 209, 209, +- 210, 210, 211, 211, 211, 211, 211, 211, 212, 213, +- 212, 212, 214, 212, 215, 215, 216, 216, 216, 216, +- 216, 217, 218, 218, 219, 220, 221, 221, 222, 222, +- 222, 222, 222, 222, 222, 222, 222, 223, 224, 225, +- 226, 226, 227, 227, 227, 227, 227, 228, 228, 229, +- 229, 230, 230, 230, 230, 230, 231, 231, 232, 232, +- 232, 232, 233, 233, 233, 234, 234, 235, 235, 235, +- 235, 235, 236, 237, 237, 237, 237, 237, 238, 238, +- 239, 239, 240, 241, 241, 242, 243, 243, 244, 244, +- 244, 244, 245, 245, 245, 245, 245, 246, 247, 248, +- 248, 248, 248, 249, 250, 250, 251, 251, 251, 251, +- 251, 252, 253, 253, 253, 253, 253, 254, 254, 254, +- 254, 255, 256, 256, 257, 257, 257, 258, 258, 258, +- 259, 259, 259, 260, 260, 260, 260, 260, 260, 260, +- 260, 260, 261, 261, 263, 262, 262, 264, 264, 265, +- 265, 266, 265, 267, 267, 268, 268, 269, 270, 270, +- 271, 271, 271, 271, 271, 271, 272, 272, 272, 273, +- 273, 273, 274, 275, 274, 274, 277, 276, 278, 278, +- 278, 279, 280, 280, 280, 280, 280, 280, 281, 281, +- 281, 282, 282, 283, 283, 284, 284, 285, 285, 285, +- 286, 287, 287, 287, 287, 288, 289, 290, 291, 289, +- 292, 292, 293, 293, 293, 294, 294, 294, 294, 295, +- 295, 296, 297, 297, 298, 297, 297, 297, 297, 297, +- 297, 299, 299, 299, 300, 300, 301, 301, 302, 302, +- 303, 303, 304, 304, 304, 305, 305, 305, 306, 306, +- 306, 306, 306, 306, 307, 307, 307, 307, 308, 308, +- 308, 308, 308, 309, 309, 310, 310, 311, 311, 312, +- 312, 312, 312, 313, 313, 314, 314, 315, 315, 315, +- 315, 316, 317, 318, 318, 319, 320, 320, 321, 322, +- 322, 323, 323, 323, 323, 324, 324, 324, 324, 324, +- 324, 324, 324, 324, 324, 324, 325, 326, 327, 328, +- 328, 328, 328, 328, 329, 329, 331, 330, 332, 333, +- 332, 335, 336, 334, 337, 337, 338, 338, 339, 339, +- 339, 339, 339, 341, 340, 343, 344, 342, 346, 347, +- 345, 349, 348, 350, 348, 351, 351, 351, 353, 352, +- 354, 354, 355, 355, 356, 356, 357, 357, 357, 357, +- 357, 357, 357, 357, 358, 359, 360, 359, 361, 361, +- 361, 361, 362, 362, 362, 362, 363, 363, 363, 364, +- 364, 364, 364, 365, 365, 366, 366, 367, 367, 368, +- 369, 369, 370, 371, 372, 373, 373, 374, 374, 374, +- 374, 375, 374, 376, 374, 377, 377, 377, 378, 377, +- 379, 377, 380, 380, 380, 380, 380, 380, 381, 381, +- 381, 381, 381, 381, 381, 382, 382, 383, 383, 384, +- 385, 385, 386, 386, 386, 387, 387, 387, 387, 387, +- 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, +- 387, 387, 387, 388, 388, 389, 390, 390, 390, 391, +- 391, 391, 391, 391, 391, 391, 392, 391, 391, 391, +- 393, 391, 391, 391, 391, 391, 391, 394, 395, 395, +- 396, 396, 396, 396, 396, 397, 397, 398, 398, 399, +- 399, 399, 399, 400, 400, 401, 401, 402, 402, 402, +- 403, 403, 403, 403, 403, 403, 403, 404, 404, 404, +- 404, 404, 404, 405, 405, 405, 405, 406, 406, 407, +- 407, 407, 407, 407, 407, 408, 408, 408, 408, 409, +- 409, 410, 410, 410, 410, 410, 410, 410, 411, 411, +- 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, +- 411, 411, 411, 411, 411, 411, 411, 411, 411, 412, +- 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, +- 415, 415, 415, 416, 417, 417, 417, 417, 417, 417, +- 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, +- 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, +- 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, +- 417, 417, 417, 418, 419, 419, 419, 419, 419, 420, +- 421, 422, 423, 424, 425, 426, 426, 427, 427, 427, +- 428, 428, 429, 429, 430, 430, 431, 432 ++ 0, 134, 135, 135, 137, 138, 136, 136, 139, 139, ++ 139, 140, 140, 141, 141, 142, 142, 144, 143, 143, ++ 143, 145, 146, 147, 146, 146, 149, 150, 148, 148, ++ 148, 151, 148, 152, 153, 148, 154, 148, 156, 157, ++ 155, 159, 158, 161, 160, 162, 162, 163, 164, 165, ++ 165, 166, 166, 167, 167, 167, 168, 168, 169, 170, ++ 169, 169, 172, 173, 171, 174, 174, 174, 174, 176, ++ 175, 178, 177, 180, 179, 181, 181, 182, 181, 181, ++ 183, 183, 184, 185, 185, 185, 185, 185, 186, 186, ++ 187, 187, 187, 187, 187, 188, 189, 189, 190, 190, ++ 190, 191, 192, 192, 192, 192, 192, 193, 193, 193, ++ 194, 194, 195, 195, 196, 197, 198, 197, 199, 200, ++ 200, 200, 202, 201, 203, 203, 203, 204, 205, 205, ++ 206, 206, 206, 207, 207, 208, 208, 208, 208, 208, ++ 209, 210, 210, 210, 210, 210, 210, 211, 211, 212, ++ 212, 213, 214, 214, 214, 215, 215, 216, 216, 216, ++ 216, 216, 216, 217, 218, 217, 217, 219, 217, 220, ++ 220, 221, 221, 221, 221, 221, 222, 223, 223, 224, ++ 225, 226, 226, 227, 227, 227, 227, 227, 227, 227, ++ 227, 227, 228, 229, 230, 231, 231, 232, 232, 233, ++ 233, 233, 233, 233, 234, 234, 235, 235, 236, 236, ++ 236, 236, 236, 237, 237, 238, 238, 238, 238, 239, ++ 239, 239, 240, 240, 241, 241, 241, 241, 241, 242, ++ 243, 243, 243, 243, 243, 244, 244, 245, 245, 246, ++ 247, 247, 248, 249, 249, 250, 250, 250, 250, 251, ++ 251, 251, 251, 251, 252, 253, 254, 254, 254, 254, ++ 255, 256, 256, 257, 257, 257, 257, 257, 258, 259, ++ 259, 259, 259, 259, 260, 260, 260, 260, 261, 262, ++ 262, 263, 263, 263, 264, 264, 264, 265, 265, 265, ++ 266, 266, 266, 266, 266, 266, 266, 266, 266, 267, ++ 267, 269, 268, 268, 270, 270, 271, 271, 272, 271, ++ 273, 273, 274, 274, 275, 276, 276, 277, 277, 277, ++ 277, 277, 277, 278, 278, 278, 279, 279, 279, 280, ++ 281, 280, 280, 283, 282, 284, 284, 284, 285, 286, ++ 286, 286, 286, 286, 286, 287, 287, 287, 288, 288, ++ 289, 289, 290, 290, 291, 291, 291, 292, 293, 293, ++ 293, 293, 294, 295, 296, 297, 295, 298, 298, 299, ++ 299, 299, 300, 300, 300, 300, 301, 301, 302, 303, ++ 303, 304, 303, 303, 303, 303, 303, 303, 305, 305, ++ 305, 306, 306, 307, 307, 308, 308, 309, 309, 310, ++ 310, 310, 311, 311, 311, 312, 312, 312, 312, 312, ++ 312, 313, 313, 313, 313, 314, 314, 314, 314, 314, ++ 315, 315, 316, 316, 317, 317, 318, 318, 318, 318, ++ 319, 319, 320, 320, 321, 321, 321, 321, 322, 323, ++ 324, 324, 325, 326, 326, 327, 328, 328, 329, 329, ++ 329, 329, 330, 330, 330, 330, 330, 330, 330, 330, ++ 330, 330, 330, 331, 332, 333, 334, 334, 334, 334, ++ 334, 335, 335, 337, 336, 338, 339, 338, 341, 342, ++ 340, 343, 343, 344, 344, 345, 345, 345, 345, 345, ++ 347, 346, 349, 350, 348, 352, 353, 351, 355, 354, ++ 356, 354, 357, 357, 357, 359, 358, 360, 360, 361, ++ 361, 362, 362, 363, 363, 363, 363, 363, 363, 363, ++ 363, 364, 365, 366, 365, 367, 367, 367, 367, 368, ++ 368, 368, 368, 369, 369, 369, 370, 370, 370, 370, ++ 371, 371, 372, 372, 373, 373, 374, 375, 375, 376, ++ 377, 378, 379, 379, 380, 380, 380, 380, 381, 380, ++ 382, 380, 383, 383, 383, 384, 383, 385, 383, 386, ++ 386, 386, 386, 386, 386, 387, 387, 387, 387, 387, ++ 387, 387, 388, 388, 389, 389, 390, 391, 391, 392, ++ 392, 392, 393, 393, 393, 393, 393, 393, 393, 393, ++ 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, ++ 394, 394, 395, 396, 396, 396, 397, 397, 398, 398, ++ 398, 398, 398, 398, 398, 399, 398, 398, 398, 400, ++ 398, 398, 398, 398, 398, 398, 401, 402, 402, 403, ++ 403, 403, 403, 403, 404, 404, 405, 405, 406, 406, ++ 406, 406, 407, 407, 408, 408, 409, 409, 409, 410, ++ 410, 410, 410, 410, 410, 410, 411, 411, 411, 411, ++ 411, 411, 412, 412, 412, 412, 413, 413, 414, 414, ++ 414, 414, 414, 414, 415, 415, 415, 415, 416, 416, ++ 417, 417, 417, 417, 417, 417, 417, 418, 418, 418, ++ 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, ++ 418, 418, 418, 418, 418, 418, 418, 418, 419, 420, ++ 420, 420, 420, 420, 420, 420, 420, 420, 421, 422, ++ 422, 422, 423, 424, 424, 424, 424, 424, 424, 424, ++ 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, ++ 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, ++ 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, ++ 424, 424, 425, 426, 426, 426, 426, 426, 427, 428, ++ 429, 430, 431, 432, 433, 433, 434, 434, 434, 435, ++ 435, 436, 436, 437, 437, 438, 439 + }; + + /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +@@ -1094,71 +1115,71 @@ + 4, 0, 2, 1, 1, 0, 2, 0, 2, 3, + 1, 2, 2, 0, 4, 2, 0, 0, 12, 1, + 1, 0, 3, 0, 0, 9, 0, 6, 0, 0, +- 8, 0, 7, 0, 7, 0, 3, 1, 3, 1, ++ 8, 0, 7, 0, 7, 0, 4, 1, 3, 1, + 2, 0, 2, 1, 1, 1, 0, 2, 1, 0, + 2, 1, 0, 0, 6, 0, 2, 1, 1, 0, + 6, 0, 6, 0, 2, 2, 2, 0, 5, 1, + 1, 3, 1, 1, 3, 3, 3, 2, 1, 3, + 1, 3, 1, 3, 3, 3, 0, 1, 3, 1, + 4, 1, 1, 3, 1, 3, 3, 2, 3, 3, +- 1, 2, 0, 0, 4, 1, 3, 3, 3, 1, +- 3, 3, 4, 0, 1, 1, 3, 4, 1, 2, +- 1, 3, 1, 3, 3, 2, 1, 3, 1, 3, +- 3, 2, 1, 1, 1, 1, 1, 1, 2, 1, +- 4, 8, 1, 3, 1, 3, 3, 2, 5, 0, +- 6, 3, 0, 9, 3, 3, 1, 3, 3, 3, +- 2, 3, 1, 2, 1, 2, 1, 2, 1, 2, +- 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, +- 3, 3, 1, 3, 1, 3, 3, 1, 1, 3, +- 3, 1, 3, 3, 3, 2, 3, 4, 2, 2, +- 2, 3, 1, 1, 1, 2, 3, 1, 1, 1, +- 1, 1, 6, 1, 3, 3, 2, 1, 1, 1, +- 1, 4, 1, 1, 3, 3, 3, 3, 0, 2, +- 3, 1, 1, 3, 3, 3, 2, 3, 6, 3, +- 3, 1, 1, 1, 0, 5, 1, 3, 3, 1, +- 2, 5, 1, 3, 3, 3, 2, 1, 3, 3, +- 3, 3, 1, 1, 1, 3, 3, 1, 2, 1, +- 1, 2, 3, 3, 3, 5, 3, 3, 1, 2, +- 1, 1, 1, 2, 0, 8, 1, 1, 3, 1, +- 2, 0, 5, 1, 3, 2, 1, 4, 1, 3, +- 1, 1, 1, 3, 4, 6, 1, 1, 1, 1, +- 2, 2, 1, 0, 3, 2, 0, 2, 1, 1, +- 3, 1, 1, 3, 1, 1, 1, 1, 3, 3, +- 3, 1, 1, 1, 1, 3, 3, 1, 3, 3, +- 3, 1, 1, 2, 2, 3, 3, 0, 0, 8, +- 1, 1, 3, 5, 5, 5, 7, 5, 5, 1, +- 1, 3, 2, 3, 0, 6, 6, 6, 3, 2, +- 2, 1, 3, 3, 1, 1, 1, 1, 1, 2, +- 1, 0, 1, 2, 1, 1, 2, 1, 1, 2, +- 3, 3, 5, 3, 1, 3, 3, 3, 3, 4, +- 4, 3, 1, 3, 5, 1, 1, 0, 2, 1, +- 1, 1, 1, 6, 7, 1, 1, 1, 3, 3, +- 3, 5, 3, 1, 1, 5, 1, 3, 0, 1, +- 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 2, 2, 2, 4, 1, +- 3, 1, 3, 3, 1, 3, 0, 5, 1, 0, +- 4, 0, 0, 9, 0, 4, 1, 1, 1, 3, +- 1, 3, 3, 0, 6, 0, 0, 8, 0, 0, +- 8, 0, 11, 0, 9, 1, 1, 1, 0, 3, +- 1, 2, 1, 2, 1, 1, 2, 1, 4, 2, +- 4, 5, 1, 2, 3, 1, 0, 4, 1, 3, +- 1, 3, 1, 3, 3, 3, 1, 3, 5, 5, +- 7, 9, 11, 0, 1, 1, 1, 1, 3, 4, +- 1, 3, 1, 1, 1, 3, 1, 1, 2, 3, +- 3, 0, 4, 0, 4, 1, 3, 3, 0, 4, +- 0, 4, 1, 3, 3, 3, 3, 3, 2, 2, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, ++ 1, 3, 1, 2, 0, 0, 0, 4, 2, 1, ++ 3, 3, 0, 4, 1, 3, 3, 4, 0, 1, ++ 1, 3, 4, 1, 2, 1, 3, 1, 3, 3, ++ 2, 1, 3, 1, 3, 3, 2, 1, 1, 1, ++ 1, 1, 1, 2, 1, 4, 8, 1, 3, 1, ++ 3, 3, 2, 5, 0, 6, 3, 0, 9, 3, ++ 3, 1, 3, 3, 3, 2, 3, 1, 2, 1, ++ 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, ++ 1, 2, 1, 1, 1, 1, 3, 3, 3, 1, ++ 3, 1, 3, 3, 1, 1, 3, 3, 1, 3, ++ 3, 3, 2, 3, 4, 2, 2, 2, 3, 1, ++ 1, 1, 2, 3, 1, 1, 1, 1, 1, 6, ++ 1, 3, 3, 2, 1, 1, 1, 1, 4, 1, ++ 1, 3, 3, 3, 3, 0, 2, 3, 1, 1, ++ 3, 3, 3, 2, 3, 6, 3, 3, 1, 1, ++ 1, 0, 5, 1, 3, 3, 1, 2, 5, 1, ++ 3, 3, 3, 2, 1, 3, 3, 3, 3, 1, ++ 1, 1, 3, 3, 1, 2, 1, 1, 2, 3, ++ 3, 3, 5, 3, 3, 1, 2, 1, 1, 1, ++ 2, 0, 8, 1, 1, 3, 1, 2, 0, 5, ++ 1, 3, 2, 1, 4, 1, 3, 1, 1, 1, ++ 3, 4, 6, 1, 1, 1, 1, 2, 2, 1, ++ 0, 3, 2, 0, 2, 1, 1, 3, 1, 1, ++ 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, ++ 1, 1, 3, 3, 1, 3, 3, 3, 1, 1, ++ 2, 2, 3, 3, 0, 0, 9, 1, 1, 3, ++ 5, 5, 5, 7, 5, 5, 1, 1, 3, 2, ++ 3, 0, 6, 6, 6, 3, 2, 2, 1, 3, ++ 3, 1, 1, 1, 1, 1, 2, 1, 0, 1, ++ 2, 1, 1, 2, 1, 1, 2, 3, 3, 5, ++ 3, 1, 3, 3, 3, 3, 4, 4, 3, 1, ++ 3, 5, 1, 1, 0, 2, 1, 1, 1, 1, ++ 6, 7, 1, 1, 1, 3, 3, 3, 5, 3, ++ 1, 1, 5, 1, 3, 0, 1, 1, 1, 2, ++ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 2, 2, 2, 4, 1, 3, 1, 3, ++ 3, 1, 3, 0, 5, 1, 0, 4, 0, 0, ++ 9, 0, 4, 1, 1, 1, 3, 1, 3, 3, ++ 0, 6, 0, 0, 8, 0, 0, 8, 0, 11, ++ 0, 9, 1, 1, 1, 0, 3, 1, 2, 1, ++ 2, 1, 1, 2, 1, 4, 2, 4, 5, 1, ++ 2, 3, 1, 0, 4, 1, 3, 1, 3, 1, ++ 3, 3, 3, 1, 3, 5, 5, 7, 9, 11, ++ 0, 1, 1, 1, 1, 3, 4, 1, 3, 1, ++ 1, 1, 3, 1, 1, 2, 3, 3, 0, 4, ++ 0, 4, 1, 3, 3, 0, 4, 0, 4, 1, ++ 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, +- 2, 3, 3, 2, 4, 3, 0, 5, 4, 4, +- 0, 5, 4, 4, 2, 4, 5, 3, 1, 1, +- 1, 3, 1, 3, 3, 1, 3, 2, 3, 1, +- 3, 3, 3, 1, 3, 1, 1, 1, 1, 1, ++ 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, ++ 1, 2, 1, 2, 1, 1, 1, 3, 1, 2, ++ 3, 3, 2, 4, 3, 0, 5, 4, 4, 0, ++ 5, 4, 4, 2, 4, 5, 3, 1, 1, 1, ++ 3, 1, 3, 3, 1, 3, 2, 3, 1, 3, ++ 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +@@ -1167,8 +1188,9 @@ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 0, 1 ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ++ 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 0, 1 + }; + + /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ +@@ -1252,7 +1274,8 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0 + }; + + /* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */ +@@ -1336,7 +1359,8 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0 + }; + + /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE +@@ -1344,1179 +1368,1212 @@ + error. */ + static const unsigned short yydefact[] = + { +- 8, 0, 0, 47, 0, 3, 786, 7, 29, 30, +- 0, 786, 717, 712, 711, 714, 718, 740, 741, 742, +- 743, 744, 722, 745, 713, 726, 748, 727, 715, 749, +- 716, 750, 728, 751, 752, 754, 753, 755, 756, 757, +- 758, 759, 760, 761, 762, 721, 746, 747, 735, 736, +- 738, 739, 737, 734, 724, 731, 732, 729, 733, 730, +- 769, 786, 709, 710, 720, 723, 725, 0, 1, 0, +- 4, 0, 49, 0, 786, 0, 0, 80, 0, 786, +- 786, 112, 50, 32, 0, 0, 38, 36, 0, 0, +- 0, 83, 10, 9, 0, 311, 0, 308, 312, 310, +- 11, 0, 0, 43, 786, 0, 62, 786, 783, 782, +- 81, 87, 0, 26, 786, 307, 781, 0, 780, 0, +- 17, 0, 62, 39, 41, 0, 0, 112, 48, 85, +- 86, 84, 112, 309, 232, 572, 649, 766, 767, 0, +- 768, 0, 620, 0, 0, 764, 786, 0, 607, 577, +- 578, 582, 576, 583, 647, 648, 0, 0, 0, 0, +- 645, 646, 0, 0, 546, 547, 555, 562, 571, 575, +- 570, 603, 579, 0, 574, 608, 0, 573, 0, 0, +- 609, 763, 765, 313, 763, 0, 0, 0, 0, 0, +- 0, 0, 0, 12, 14, 772, 13, 20, 0, 360, +- 361, 0, 115, 123, 0, 0, 0, 34, 785, 784, +- 37, 56, 51, 610, 0, 0, 0, 0, 606, 0, +- 515, 0, 0, 637, 643, 0, 639, 569, 585, 589, +- 590, 586, 591, 588, 592, 593, 601, 602, 587, 594, +- 595, 596, 597, 598, 599, 600, 584, 0, 314, 656, +- 551, 668, 661, 658, 660, 662, 650, 652, 651, 663, +- 664, 665, 666, 657, 659, 654, 653, 655, 0, 0, +- 0, 553, 558, 671, 672, 680, 673, 674, 675, 676, +- 677, 678, 669, 670, 0, 0, 560, 0, 0, 0, +- 0, 0, 604, 778, 0, 779, 777, 0, 613, 616, +- 0, 624, 548, 568, 0, 704, 694, 697, 695, 705, +- 689, 691, 706, 701, 702, 703, 696, 688, 690, 692, +- 693, 698, 700, 786, 708, 707, 387, 386, 699, 0, +- 0, 0, 119, 786, 138, 146, 0, 136, 142, 143, +- 786, 770, 0, 18, 0, 786, 0, 114, 124, 786, +- 44, 0, 92, 0, 90, 96, 62, 59, 772, 605, +- 0, 0, 522, 526, 629, 605, 627, 0, 0, 612, +- 0, 0, 0, 638, 0, 667, 0, 545, 549, 550, +- 0, 679, 0, 556, 557, 0, 567, 189, 566, 563, +- 564, 565, 632, 635, 0, 630, 611, 615, 0, 520, +- 516, 0, 518, 0, 0, 786, 398, 0, 0, 0, +- 118, 0, 0, 391, 141, 19, 0, 0, 362, 438, +- 6, 23, 0, 0, 21, 356, 357, 381, 117, 116, +- 0, 0, 786, 125, 40, 0, 0, 0, 97, 0, +- 57, 772, 65, 58, 61, 0, 0, 54, 45, 52, +- 53, 55, 0, 622, 0, 0, 0, 619, 0, 0, +- 623, 644, 641, 642, 640, 618, 552, 554, 559, 561, +- 0, 0, 0, 614, 0, 0, 0, 625, 315, 0, +- 0, 0, 0, 774, 0, 399, 0, 0, 404, 412, +- 0, 416, 415, 0, 392, 0, 394, 786, 786, 121, +- 120, 786, 0, 0, 390, 388, 139, 140, 137, 786, +- 682, 0, 0, 0, 0, 684, 683, 485, 0, 488, +- 0, 533, 686, 687, 685, 0, 512, 681, 507, 0, +- 0, 144, 445, 771, 439, 436, 440, 444, 441, 438, +- 449, 468, 450, 451, 452, 453, 454, 446, 498, 447, +- 0, 448, 500, 786, 763, 0, 296, 773, 0, 292, +- 88, 149, 22, 147, 773, 786, 384, 0, 385, 0, +- 0, 0, 0, 15, 786, 0, 0, 132, 0, 130, +- 786, 0, 122, 128, 93, 94, 91, 51, 101, 0, +- 95, 99, 35, 60, 0, 0, 67, 68, 786, 786, +- 11, 0, 786, 621, 524, 525, 523, 527, 517, 636, +- 633, 634, 631, 617, 626, 521, 519, 403, 786, 786, +- 417, 401, 0, 786, 0, 400, 0, 0, 787, 0, +- 364, 395, 397, 393, 368, 367, 391, 363, 389, 365, +- 0, 0, 605, 455, 145, 0, 543, 770, 457, 770, +- 461, 0, 459, 464, 544, 534, 0, 0, 513, 0, +- 501, 456, 438, 0, 442, 443, 469, 786, 0, 509, +- 506, 154, 0, 152, 0, 719, 773, 0, 0, 293, +- 148, 0, 0, 581, 0, 580, 372, 0, 379, 380, +- 382, 17, 371, 383, 0, 0, 0, 126, 0, 135, +- 110, 129, 772, 104, 0, 102, 786, 0, 0, 0, +- 0, 64, 0, 66, 17, 0, 355, 370, 369, 0, +- 391, 413, 0, 411, 0, 187, 0, 0, 433, 434, +- 420, 408, 421, 422, 419, 406, 407, 0, 405, 417, +- 0, 396, 188, 0, 471, 0, 504, 0, 505, 466, +- 438, 0, 0, 438, 0, 0, 0, 514, 0, 437, +- 435, 438, 499, 0, 502, 786, 0, 157, 0, 0, +- 0, 0, 89, 772, 772, 0, 542, 374, 373, 378, +- 16, 0, 127, 133, 134, 131, 111, 42, 0, 0, +- 98, 0, 107, 786, 0, 69, 71, 73, 73, 79, +- 46, 28, 528, 0, 418, 0, 0, 0, 0, 402, +- 410, 409, 366, 0, 493, 0, 438, 0, 489, 462, +- 458, 463, 460, 465, 0, 783, 508, 470, 503, 0, +- 510, 155, 156, 153, 0, 0, 0, 166, 161, 159, +- 772, 294, 172, 0, 0, 150, 0, 0, 786, 0, +- 105, 106, 103, 108, 109, 100, 438, 438, 75, 438, +- 76, 414, 432, 0, 427, 0, 271, 0, 480, 0, +- 262, 0, 478, 0, 0, 497, 496, 495, 0, 467, +- 486, 0, 529, 786, 511, 165, 0, 170, 0, 164, +- 772, 786, 786, 786, 173, 0, 232, 786, 786, 0, +- 0, 0, 0, 583, 0, 779, 777, 175, 176, 0, +- 178, 188, 182, 197, 198, 183, 184, 185, 217, 218, +- 230, 219, 220, 181, 0, 763, 0, 221, 326, 0, +- 0, 0, 359, 0, 0, 74, 77, 0, 0, 0, +- 0, 0, 266, 0, 483, 0, 0, 472, 0, 0, +- 770, 491, 0, 438, 0, 536, 537, 0, 535, 171, +- 168, 169, 167, 786, 273, 0, 272, 316, 318, 317, +- 0, 158, 319, 0, 322, 786, 0, 0, 0, 233, +- 0, 215, 0, 0, 0, 0, 0, 242, 241, 772, +- 177, 179, 210, 213, 214, 212, 0, 766, 767, 749, +- 768, 735, 736, 739, 737, 764, 786, 733, 607, 0, +- 201, 765, 208, 214, 585, 209, 186, 0, 0, 0, +- 180, 0, 0, 786, 0, 375, 376, 377, 70, 72, +- 438, 429, 430, 428, 0, 0, 0, 265, 264, 263, +- 770, 481, 482, 479, 474, 269, 270, 268, 438, 0, +- 771, 771, 530, 786, 0, 0, 160, 786, 321, 320, +- 325, 0, 0, 297, 227, 0, 229, 228, 0, 223, +- 0, 772, 216, 237, 253, 0, 252, 0, 763, 772, +- 236, 246, 0, 239, 235, 174, 200, 205, 0, 199, +- 0, 194, 0, 192, 0, 206, 211, 0, 303, 0, +- 0, 327, 328, 329, 331, 78, 0, 425, 426, 423, +- 0, 0, 438, 476, 477, 0, 770, 771, 770, 487, +- 490, 0, 538, 0, 0, 0, 274, 324, 295, 226, +- 0, 0, 234, 231, 0, 0, 247, 244, 245, 243, +- 240, 203, 204, 202, 207, 0, 0, 190, 191, 151, +- 337, 0, 343, 0, 0, 0, 329, 344, 0, 331, +- 575, 0, 0, 351, 332, 0, 0, 347, 431, 424, +- 771, 473, 438, 494, 438, 531, 0, 539, 0, 0, +- 279, 0, 277, 280, 786, 0, 298, 299, 306, 225, +- 224, 772, 259, 0, 256, 0, 249, 250, 195, 196, +- 193, 304, 0, 330, 0, 341, 342, 0, 0, 0, +- 575, 575, 346, 0, 0, 345, 484, 771, 771, 0, +- 540, 276, 275, 163, 712, 711, 0, 0, 741, 722, +- 761, 281, 0, 278, 291, 300, 305, 222, 260, 776, +- 254, 0, 330, 340, 344, 339, 338, 350, 349, 352, +- 0, 0, 348, 475, 492, 0, 532, 786, 786, 786, +- 786, 289, 772, 282, 301, 258, 257, 248, 0, 238, +- 354, 353, 541, 287, 286, 391, 284, 283, 0, 238, +- 0, 0, 302, 0, 261, 285, 775, 776, 255 ++ 8, 0, 0, 47, 0, 3, 795, 7, 29, 30, ++ 0, 795, 726, 721, 720, 723, 725, 727, 749, 750, ++ 751, 752, 753, 731, 754, 722, 735, 757, 736, 724, ++ 758, 759, 737, 760, 761, 763, 762, 764, 765, 766, ++ 767, 768, 769, 770, 771, 730, 755, 756, 744, 745, ++ 747, 748, 746, 743, 733, 740, 741, 738, 742, 739, ++ 778, 795, 718, 719, 729, 732, 734, 0, 1, 0, ++ 4, 0, 49, 0, 795, 0, 0, 80, 0, 795, ++ 795, 114, 50, 32, 0, 0, 38, 36, 0, 0, ++ 0, 83, 10, 9, 0, 318, 0, 315, 319, 317, ++ 115, 11, 0, 43, 795, 0, 62, 795, 792, 791, ++ 81, 87, 0, 26, 795, 314, 790, 0, 789, 0, ++ 116, 118, 17, 62, 39, 41, 0, 0, 114, 48, ++ 85, 86, 84, 114, 316, 239, 579, 658, 775, 776, ++ 0, 777, 0, 629, 0, 0, 773, 795, 0, 614, ++ 584, 585, 589, 583, 590, 656, 657, 0, 0, 0, ++ 0, 654, 655, 0, 0, 553, 554, 562, 569, 578, ++ 582, 577, 610, 586, 0, 581, 618, 615, 0, 580, ++ 0, 0, 616, 772, 774, 320, 772, 0, 0, 0, ++ 0, 122, 0, 0, 0, 0, 12, 14, 781, 13, ++ 20, 0, 367, 368, 0, 0, 0, 34, 794, 793, ++ 37, 56, 51, 619, 0, 0, 0, 0, 613, 0, ++ 522, 0, 0, 646, 652, 0, 648, 576, 594, 592, ++ 596, 597, 593, 598, 595, 599, 600, 608, 609, 601, ++ 602, 603, 604, 605, 606, 607, 591, 0, 321, 665, ++ 558, 677, 670, 667, 669, 671, 659, 661, 660, 672, ++ 673, 674, 675, 666, 668, 663, 662, 664, 0, 0, ++ 0, 560, 565, 680, 681, 689, 682, 683, 684, 685, ++ 686, 687, 678, 679, 0, 0, 567, 0, 0, 0, ++ 0, 0, 611, 0, 787, 0, 788, 786, 622, 625, ++ 0, 633, 555, 575, 0, 0, 0, 119, 128, 713, ++ 703, 706, 704, 714, 698, 700, 715, 710, 711, 712, ++ 705, 697, 699, 701, 702, 707, 709, 795, 717, 716, ++ 394, 393, 708, 0, 0, 0, 795, 143, 151, 0, ++ 141, 147, 148, 795, 779, 0, 18, 0, 795, 44, ++ 0, 92, 0, 90, 96, 62, 59, 781, 612, 0, ++ 0, 529, 533, 638, 612, 636, 0, 0, 621, 0, ++ 0, 0, 647, 0, 676, 0, 552, 556, 557, 0, ++ 688, 0, 563, 564, 0, 574, 194, 195, 573, 570, ++ 571, 572, 620, 641, 644, 0, 639, 624, 0, 527, ++ 523, 0, 525, 617, 0, 0, 117, 129, 795, 0, ++ 795, 405, 0, 0, 0, 124, 0, 398, 146, 19, ++ 0, 0, 369, 445, 6, 23, 0, 0, 21, 363, ++ 364, 388, 40, 0, 0, 0, 97, 0, 57, 781, ++ 65, 58, 61, 0, 0, 54, 45, 52, 53, 55, ++ 0, 631, 0, 0, 0, 628, 0, 0, 632, 653, ++ 650, 651, 649, 627, 559, 561, 566, 568, 0, 0, ++ 0, 0, 623, 0, 0, 0, 634, 322, 121, 120, ++ 0, 0, 795, 130, 0, 0, 0, 0, 783, 0, ++ 406, 0, 0, 411, 419, 0, 423, 422, 0, 399, ++ 0, 401, 795, 795, 0, 123, 0, 795, 0, 0, ++ 397, 395, 144, 145, 142, 795, 691, 0, 0, 0, ++ 0, 693, 692, 492, 0, 495, 0, 540, 695, 696, ++ 694, 0, 519, 690, 514, 0, 0, 149, 452, 780, ++ 446, 443, 447, 451, 448, 445, 456, 475, 457, 458, ++ 459, 460, 461, 453, 505, 454, 0, 455, 507, 795, ++ 772, 0, 303, 782, 0, 299, 88, 154, 22, 152, ++ 782, 795, 391, 0, 392, 0, 0, 0, 0, 115, ++ 795, 0, 93, 94, 91, 51, 101, 0, 95, 99, ++ 35, 60, 0, 0, 67, 68, 795, 795, 115, 0, ++ 795, 630, 531, 532, 530, 534, 524, 196, 645, 642, ++ 643, 640, 626, 635, 528, 526, 0, 137, 0, 135, ++ 795, 0, 127, 133, 410, 795, 795, 424, 408, 0, ++ 795, 0, 407, 0, 0, 796, 0, 371, 402, 404, ++ 400, 375, 374, 126, 125, 398, 370, 396, 372, 0, ++ 0, 612, 462, 150, 0, 550, 779, 464, 779, 468, ++ 0, 466, 471, 551, 541, 0, 0, 520, 0, 508, ++ 463, 445, 0, 449, 450, 476, 795, 0, 516, 513, ++ 159, 0, 157, 0, 728, 782, 0, 0, 300, 153, ++ 0, 0, 588, 0, 587, 379, 0, 386, 387, 389, ++ 15, 378, 390, 781, 104, 0, 102, 795, 110, 0, ++ 0, 0, 0, 64, 0, 66, 11, 0, 362, 377, ++ 376, 0, 0, 0, 0, 131, 0, 140, 112, 134, ++ 398, 420, 0, 418, 0, 192, 0, 0, 440, 441, ++ 427, 415, 428, 429, 426, 413, 414, 0, 412, 424, ++ 0, 403, 193, 0, 478, 0, 511, 0, 512, 473, ++ 445, 0, 0, 445, 0, 0, 0, 521, 0, 444, ++ 442, 445, 506, 0, 509, 795, 0, 162, 0, 0, ++ 0, 0, 89, 781, 781, 0, 549, 381, 380, 385, ++ 17, 42, 0, 0, 98, 0, 107, 0, 795, 0, ++ 69, 71, 17, 28, 535, 132, 138, 139, 136, 113, ++ 0, 425, 0, 0, 0, 0, 409, 417, 416, 373, ++ 0, 500, 0, 445, 0, 496, 469, 465, 470, 467, ++ 472, 0, 792, 515, 477, 510, 0, 517, 160, 161, ++ 158, 0, 0, 0, 171, 166, 164, 781, 301, 177, ++ 0, 0, 155, 0, 0, 795, 16, 0, 105, 106, ++ 103, 108, 111, 109, 100, 445, 445, 73, 73, 79, ++ 46, 421, 439, 0, 434, 0, 278, 0, 487, 0, ++ 269, 0, 485, 0, 0, 504, 503, 502, 0, 474, ++ 493, 0, 536, 795, 518, 170, 0, 175, 0, 169, ++ 781, 795, 795, 795, 178, 0, 239, 795, 795, 0, ++ 0, 0, 0, 590, 0, 788, 786, 180, 181, 0, ++ 183, 193, 187, 204, 205, 188, 189, 190, 224, 225, ++ 237, 226, 227, 186, 0, 772, 0, 228, 333, 0, ++ 0, 0, 0, 0, 0, 76, 445, 75, 0, 0, ++ 0, 0, 0, 273, 0, 490, 0, 0, 479, 0, ++ 0, 779, 498, 0, 445, 0, 543, 544, 0, 542, ++ 176, 173, 174, 172, 795, 280, 0, 279, 323, 325, ++ 324, 0, 163, 326, 0, 329, 795, 0, 0, 0, ++ 240, 0, 222, 0, 0, 0, 0, 0, 249, 248, ++ 781, 182, 184, 217, 220, 221, 219, 0, 735, 736, ++ 758, 737, 744, 745, 748, 746, 733, 795, 742, 614, ++ 0, 208, 734, 215, 221, 592, 216, 191, 0, 0, ++ 0, 185, 0, 0, 0, 795, 0, 382, 383, 384, ++ 366, 70, 72, 77, 74, 436, 437, 435, 0, 0, ++ 0, 272, 271, 270, 779, 488, 489, 486, 481, 276, ++ 277, 275, 445, 0, 780, 780, 537, 795, 0, 0, ++ 165, 795, 328, 327, 332, 0, 0, 304, 234, 0, ++ 236, 235, 0, 230, 0, 781, 223, 244, 260, 0, ++ 259, 0, 772, 781, 243, 253, 0, 246, 242, 179, ++ 207, 212, 0, 206, 0, 201, 0, 199, 0, 213, ++ 218, 0, 310, 0, 0, 334, 335, 336, 338, 445, ++ 0, 432, 433, 430, 0, 0, 445, 483, 484, 0, ++ 779, 780, 779, 494, 497, 0, 545, 0, 0, 0, ++ 281, 331, 302, 233, 0, 0, 241, 238, 0, 0, ++ 254, 251, 252, 250, 247, 210, 211, 209, 214, 0, ++ 0, 197, 198, 156, 344, 0, 350, 0, 0, 0, ++ 336, 351, 0, 338, 582, 0, 0, 358, 339, 0, ++ 0, 354, 78, 438, 431, 780, 480, 445, 501, 445, ++ 538, 0, 546, 0, 0, 286, 0, 284, 287, 795, ++ 0, 305, 306, 313, 232, 231, 781, 266, 0, 263, ++ 0, 256, 257, 202, 203, 200, 311, 0, 337, 0, ++ 348, 349, 0, 0, 0, 582, 582, 353, 0, 0, ++ 352, 491, 780, 780, 0, 547, 283, 282, 168, 721, ++ 720, 0, 0, 750, 731, 770, 288, 0, 285, 298, ++ 307, 312, 229, 267, 785, 261, 0, 337, 347, 351, ++ 346, 345, 357, 356, 359, 0, 0, 355, 482, 499, ++ 0, 539, 795, 795, 795, 795, 296, 781, 289, 308, ++ 265, 264, 255, 0, 245, 361, 360, 548, 294, 293, ++ 398, 291, 290, 0, 245, 0, 0, 309, 0, 268, ++ 292, 784, 785, 262 + }; + + /* YYPDEFGOTO[NTERM-NUM]. */ + static const short yydefgoto[] = + { +- -1, 4, 5, 81, 192, 6, 120, 193, 691, 194, +- 195, 447, 424, 555, 7, 132, 448, 73, 105, 356, +- 106, 8, 104, 205, 125, 206, 9, 122, 601, 10, +- 87, 70, 358, 449, 357, 440, 441, 126, 127, 442, +- 595, 596, 856, 597, 857, 858, 859, 800, 1030, 88, +- 984, 90, 557, 353, 354, 437, 590, 591, 704, 705, +- 699, 100, 101, 201, 196, 331, 202, 349, 432, 582, +- 578, 579, 336, 337, 530, 531, 562, 563, 672, 673, +- 890, 891, 770, 836, 837, 841, 1084, 1085, 907, 908, +- 1065, 910, 728, 1020, 1092, 1067, 913, 1009, 914, 915, +- 992, 993, 917, 918, 1068, 1069, 919, 162, 978, 921, +- 922, 985, 986, 987, 988, 1075, 1076, 1267, 1193, 1194, +- 869, 870, 730, 965, 1125, 1181, 1182, 1233, 558, 559, +- 893, 1062, 1186, 1278, 1097, 1187, 894, 96, 97, 970, +- 971, 975, 1061, 1023, 1024, 1152, 1102, 1153, 1154, 1207, +- 1155, 1103, 1166, 1244, 1158, 451, 197, 573, 781, 198, +- 199, 200, 716, 425, 574, 846, 426, 575, 323, 502, +- 503, 493, 630, 413, 487, 488, 489, 490, 723, 731, +- 732, 1109, 863, 864, 733, 734, 532, 533, 534, 535, +- 536, 537, 538, 539, 540, 651, 652, 541, 816, 542, +- 761, 543, 813, 1044, 1115, 1116, 871, 872, 1040, 544, +- 647, 952, 545, 649, 881, 546, 1049, 874, 878, 547, +- 667, 548, 762, 747, 549, 550, 218, 219, 401, 361, +- 362, 551, 656, 954, 955, 956, 1219, 873, 645, 653, +- 776, 164, 376, 380, 165, 382, 385, 166, 167, 168, +- 169, 170, 684, 171, 246, 172, 173, 174, 175, 398, +- 215, 176, 366, 394, 395, 177, 225, 226, 178, 179, +- 268, 269, 270, 271, 284, 285, 286, 553, 326, 91, +- 62, 674, 63, 64, 65, 180, 184, 182, 419, 663, +- 843, 678, 707, 947, 298, 504, 110, 210, 406, 632 ++ -1, 4, 5, 81, 195, 6, 122, 196, 790, 197, ++ 198, 445, 428, 561, 7, 133, 446, 73, 105, 355, ++ 106, 8, 104, 205, 126, 206, 9, 123, 599, 10, ++ 87, 70, 357, 447, 356, 438, 439, 127, 128, 440, ++ 593, 594, 865, 595, 866, 945, 946, 870, 1119, 88, ++ 995, 90, 563, 352, 353, 435, 588, 589, 705, 706, ++ 707, 727, 100, 121, 187, 101, 306, 199, 335, 414, ++ 307, 408, 482, 622, 618, 619, 339, 340, 536, 537, ++ 568, 569, 681, 682, 900, 901, 780, 843, 844, 848, ++ 1098, 1099, 917, 918, 1079, 920, 738, 386, 1031, 1106, ++ 1081, 923, 1020, 924, 925, 1003, 1004, 927, 928, 1082, ++ 1083, 929, 163, 989, 931, 932, 996, 997, 998, 999, ++ 1089, 1090, 1282, 1208, 1209, 879, 880, 740, 976, 1139, ++ 1196, 1197, 1248, 564, 565, 903, 1076, 1201, 1293, 1111, ++ 1202, 904, 96, 97, 981, 982, 986, 1075, 1035, 1036, ++ 1166, 1116, 1167, 1168, 1222, 1169, 1117, 1180, 1259, 1172, ++ 449, 200, 579, 857, 201, 202, 203, 718, 429, 580, ++ 853, 430, 581, 327, 508, 509, 498, 637, 417, 492, ++ 493, 494, 495, 733, 741, 742, 1123, 873, 874, 743, ++ 744, 538, 539, 540, 541, 542, 543, 544, 545, 546, ++ 660, 661, 547, 823, 548, 771, 549, 820, 1058, 1129, ++ 1130, 881, 882, 1054, 550, 656, 963, 551, 658, 891, ++ 552, 1063, 884, 888, 553, 676, 554, 772, 757, 555, ++ 556, 218, 219, 401, 360, 361, 557, 665, 965, 966, ++ 967, 1234, 883, 654, 662, 786, 165, 375, 379, 166, ++ 381, 384, 167, 168, 169, 170, 171, 693, 172, 246, ++ 173, 174, 175, 176, 177, 398, 215, 178, 365, 395, ++ 396, 179, 225, 226, 180, 181, 268, 269, 270, 271, ++ 284, 285, 286, 559, 330, 91, 62, 683, 63, 64, ++ 65, 182, 186, 184, 423, 672, 850, 687, 709, 958, ++ 298, 510, 110, 210, 411, 639 + }; + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +-#define YYPACT_NINF -1176 ++#define YYPACT_NINF -1081 + static const short yypact[] = + { +- 583, 6089, 7857, -1176, 165, -1176, 283, -1176, 275, -1176, +- 7857, 268, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, 268, -1176, -1176, -1176, -1176, -1176, 274, -1176, 288, +- -1176, 284, -1176, 335, 222, 7857, 333, -1176, 340, 283, +- 7607, 414, -1176, -1176, 7857, 352, -1176, 406, 389, 99, +- 236, -1176, -1176, -1176, 451, -1176, 108, -1176, 6, -1176, +- -1176, 481, 543, -1176, 268, 493, -1176, 283, -1176, -1176, +- -1176, 7857, 6179, -1176, 7607, -1176, -1176, 5282, -1176, 5282, +- 1017, 7857, -1176, -1176, -1176, 448, 66, 414, -1176, -1176, +- -1176, -1176, 414, -1176, -1176, -1176, -1176, -1176, -1176, 7857, +- -1176, 497, -1176, 504, 507, -1176, 512, 526, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, 5282, 5134, 2028, 1413, +- -1176, -1176, 532, 491, 1257, 604, 580, 14, -1176, -1176, +- -1176, -1176, 394, 840, 891, 538, 260, -1176, 2028, 2028, +- -1176, 556, -1176, -1176, -1176, 2132, 7857, 7857, 7857, 7857, +- 5909, 7857, 672, -1176, -1176, -1176, -1176, -1176, 573, -1176, +- -1176, 63, -1176, 608, 66, 493, 7090, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, 1390, 579, 5282, 1390, -1176, 591, +- -1176, 1390, 606, -1176, 611, 58, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, 5282, -1176, -1176, +- 718, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, 5282, 2028, +- 2028, -1176, 692, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, 2028, 2028, -1176, 886, 886, 2028, +- 2028, 2028, -1176, -1176, 3087, -1176, -1176, 7857, -1176, 617, +- 2851, -1176, 604, -1176, 5282, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, 624, -1176, -1176, -1176, -1176, -1176, 619, +- 622, 56, -1176, 177, -1176, -1176, 114, -1176, -1176, -1176, +- 344, -1176, 66, -1176, 561, -1176, 7857, 7857, -1176, 27, +- -1176, 66, -1176, 146, -1176, -3, -1176, 1063, 1250, 638, +- 5282, 138, -1176, 641, 532, 411, -1176, 3161, 653, -1176, +- 5282, 5282, 3235, -1176, 655, -1176, 2028, 1090, 604, 604, +- 2028, -1176, 2028, 580, 580, 2028, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, 683, 76, -1176, -1176, -1176, 3161, -1176, +- 667, 520, -1176, 673, 4762, 4290, -1176, 7857, 7857, 7857, +- -1176, 7857, 7857, 162, 7690, -1176, 5999, 7857, -1176, 4935, +- -1176, -1176, 7141, 7192, -1176, -1176, 1249, -1176, -1176, -1176, +- 682, 6269, 791, -1176, -1176, 8119, 6987, 34, -1176, 66, +- -1176, -1176, 784, -1176, -1176, 7857, 7857, -1176, 818, -1176, +- -1176, -1176, 712, -1176, 719, 5282, 3309, -1176, 5282, 307, +- -1176, -1176, -1176, -1176, -1176, -1176, 604, 604, 580, 580, +- 5282, 5282, 3383, -1176, 307, 720, 3457, -1176, -1176, 722, +- 7857, 7857, 7857, 167, 723, -1176, 716, 347, -1176, -1176, +- 802, 7857, -1176, 100, -1176, 7857, -1176, 624, 624, -1176, +- -1176, 624, 100, 7857, -1176, -1176, -1176, -1176, -1176, 624, +- -1176, 5282, 1390, 795, 5282, -1176, -1176, -1176, 7141, -1176, +- 3531, 754, -1176, -1176, -1176, 728, 5282, -1176, 731, 1390, +- 732, -1176, -1176, 738, -1176, -1176, -1176, -1176, 5013, 4935, +- -1176, 846, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- 313, -1176, 891, 512, 747, 7039, -1176, 740, 5639, -1176, +- -1176, -1176, 8119, -1176, -3, 394, -1176, 756, -1176, 5282, +- 761, 764, 766, -1176, -1176, 769, 6269, -1176, 336, -1176, +- 768, 5282, -1176, -1176, -1176, -1176, -1176, -1176, -1176, 6359, +- -1176, 771, -1176, -1176, 148, 870, 857, -1176, 624, 624, +- -1176, 873, -1176, -1176, -1176, -1176, -1176, 775, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, 624, 624, +- 777, -1176, 1225, 7358, 5454, -1176, 7857, 779, -1176, 886, +- -1176, -1176, -1176, -1176, -1176, -1176, 162, -1176, -1176, -1176, +- 876, 750, -1176, -1176, -1176, 861, -1176, -1176, -1176, -1176, +- -1176, 135, -1176, 790, -1176, -1176, 794, 5282, -1176, 5282, +- 891, -1176, 4935, 896, -1176, -1176, -1176, 364, 2932, -1176, +- -1176, -1176, 278, -1176, 799, -1176, 800, 8119, 806, -1176, +- -1176, 808, 5282, -1176, 16, -1176, -1176, 804, -1176, -1176, +- -1176, 1151, 478, -1176, 358, 7857, 6449, -1176, 7857, -1176, +- -1176, -1176, 1208, -1176, 392, -1176, 422, 7857, 6359, 905, +- 912, -1176, 911, -1176, 1109, 66, -1176, -1176, 1249, 5282, +- 105, -1176, 1225, -1176, 35, -1176, 902, 921, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, 819, -1176, 777, +- 1225, -1176, -1176, 100, -1176, 5282, -1176, 5282, -1176, -1176, +- 4935, 5282, 5282, 4935, 3605, 7857, 394, -1176, 408, -1176, +- -1176, 4935, -1176, 5282, -1176, 512, 307, 8074, 5549, 6539, +- 62, -3, -1176, -1176, -1176, 828, -1176, -1176, 872, 895, +- -1176, 672, -1176, -1176, -1176, -1176, -1176, -1176, 7940, 6629, +- -1176, 7857, -1176, 768, 418, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, 124, -1176, 717, 7857, 5282, 831, -1176, +- -1176, -1176, -1176, 3679, -1176, 614, 4935, 45, -1176, -1176, +- -1176, -1176, -1176, -1176, 657, 5282, -1176, -1176, -1176, 99, +- -1176, -1176, -1176, -1176, 830, 833, 372, -1176, -1176, -1176, +- 436, 283, -1176, 2677, 53, -1176, 5282, 5282, 394, 838, +- -1176, -1176, -1176, -1176, -1176, -1176, 4935, 4935, -1176, 4935, +- 900, -1176, -1176, 87, -1176, 863, -1176, 7857, -1176, 115, +- -1176, 514, -1176, 153, 949, -1176, -1176, -1176, 5282, -1176, +- -1176, 951, -1176, 394, -1176, -1176, 886, 7857, 6719, -1176, +- -1176, 924, 499, 508, -1176, 852, 38, 624, 624, 5819, +- 945, 2777, 886, 7275, 2577, 4669, 2245, -1176, -1176, 1624, +- -1176, 353, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- 532, -1176, -1176, -1176, 878, 280, 933, -1176, -1176, 862, +- 877, 884, -1176, 888, 892, 738, -1176, 7857, 6809, 958, +- 7857, 880, 5282, 3753, -1176, 5282, 1891, -1176, 5282, 3827, +- -1176, -1176, 5282, 4935, 393, 874, -1176, 893, -1176, -1176, +- -1176, -1176, -1176, 499, -1176, 947, -1176, -1176, -1176, -1176, +- 3901, -1176, -1176, 3975, -1176, -1176, 3013, 5208, 981, -1176, +- 321, -1176, 998, 4381, 898, 1000, 334, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, 901, 541, 744, 8023, +- 805, 497, 909, 504, 507, 926, 428, 526, 988, 432, +- -1176, 1133, -1176, 532, 864, -1176, -1176, 929, 4049, 5282, +- -1176, 5282, 7441, -1176, 5356, -1176, -1176, -1176, -1176, -1176, +- 4935, -1176, -1176, -1176, 918, 910, 1002, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, 310, -1176, -1176, -1176, 4935, 1018, +- -1176, -1176, -1176, 394, 394, 5282, -1176, 917, -1176, -1176, +- -1176, 5282, 920, -1176, -1176, 5282, -1176, -1176, 77, -1176, +- 915, -1176, -1176, -1176, -1176, 1024, -1176, 927, 1027, -1176, +- -1176, 7857, 4857, -1176, -1176, -1176, -1176, 7857, 6899, -1176, +- 5282, -1176, 450, -1176, 940, -1176, -1176, 932, -1176, 2377, +- 2477, -1176, -1176, -1176, -1176, 738, 943, -1176, -1176, -1176, +- 886, 886, 4935, -1176, -1176, 1048, -1176, -1176, -1176, -1176, +- -1176, 545, -1176, 953, 708, 5729, -1176, -1176, 55, 5208, +- 5208, 1038, -1176, -1176, 4123, 5208, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, 5282, 4197, -1176, -1176, 245, +- -1176, 2377, -1176, 955, 346, 464, 957, 960, 963, 606, +- 968, 2028, 2028, -1176, -1176, 970, 97, -1176, -1176, -1176, +- -1176, -1176, 4935, -1176, 4935, -1176, 394, -1176, 974, 975, +- -1176, 1058, 7524, -1176, 394, 5282, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, 356, -1176, 152, -1176, -1176, -1176, -1176, +- -1176, -1176, 976, -1176, 4481, -1176, -1176, 4481, 4481, 5356, +- 980, 985, -1176, 4574, 4574, -1176, -1176, 738, -1176, 552, +- -1176, -1176, -1176, -1176, 7857, 7857, 7857, 7857, 41, 288, +- 5060, 172, 990, 995, -1176, 1029, -1176, -1176, 5282, 5282, +- 310, 984, 994, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- 589, 589, -1176, -1176, -1176, 394, -1176, 624, 624, 624, +- 624, -1176, -1176, -1176, -1176, -1176, -1176, -1176, 1001, 7774, +- -1176, -1176, -1176, -1176, -1176, 50, -1176, -1176, 5282, 7774, +- 1003, 264, -1176, 1008, -1176, -1176, 1004, -1176, -1176 ++ 81, 6324, 8099, -1081, 91, -1081, 49, -1081, 30, -1081, ++ 8099, 21, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, 21, -1081, -1081, -1081, -1081, -1081, 43, -1081, 144, ++ -1081, 187, -1081, 318, 52, 8099, 336, -1081, 369, 49, ++ 7843, -1081, -1081, -1081, 8099, 406, -1081, 329, 427, 75, ++ 260, -1081, -1081, -1081, 480, -1081, 546, -1081, 487, -1081, ++ 514, -1081, 571, -1081, 21, 510, -1081, 49, -1081, -1081, ++ -1081, 8099, 6414, -1081, 7843, -1081, -1081, 5482, -1081, 5482, ++ -1081, -1081, 1291, -1081, -1081, -1081, 495, 543, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ 8099, -1081, 501, -1081, 506, 509, -1081, 524, 552, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, 5482, 2009, 5592, ++ 340, -1081, -1081, 556, 541, 1144, 732, 1059, 17, -1081, ++ -1081, -1081, -1081, 228, 160, 388, -1081, 570, 567, -1081, ++ 5592, 5592, -1081, 355, -1081, -1081, 698, 8099, 4467, 8099, ++ 8099, -1081, 8099, 6142, 8099, 700, -1081, -1081, -1081, -1081, ++ -1081, 601, -1081, -1081, 543, 510, 7330, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, 977, 602, 5482, 977, -1081, 609, ++ -1081, 977, 610, -1081, 633, 89, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, 5482, -1081, -1081, ++ 728, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, 5482, 5592, ++ 5592, -1081, 704, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, 5592, 5592, -1081, 933, 933, 5592, ++ 5592, 5592, -1081, 8099, -1081, 3541, -1081, -1081, -1081, 623, ++ 1836, -1081, 732, -1081, 8099, 5482, 169, -1081, 676, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, 648, -1081, -1081, ++ -1081, -1081, -1081, 759, 765, 8099, 152, -1081, -1081, 108, ++ -1081, -1081, -1081, 379, -1081, 543, -1081, 652, -1081, -1081, ++ 543, -1081, 312, -1081, 214, -1081, 881, 668, 650, 5482, ++ 115, -1081, 661, 556, 619, -1081, 3596, 674, -1081, 5482, ++ 5482, 3651, -1081, 678, -1081, 5592, 858, 732, 732, 5592, ++ -1081, 5592, 1059, 1059, 5592, -1081, -1081, 784, -1081, -1081, ++ -1081, -1081, -1081, -1081, 703, 99, -1081, -1081, 3596, -1081, ++ 680, 628, -1081, -1081, 685, 8099, 8099, -1081, 241, 4861, ++ 4577, -1081, 8099, 8099, 275, -1081, 8099, 86, 7926, -1081, ++ 6233, 8099, -1081, 5208, -1081, -1081, 7374, 7428, -1081, -1081, ++ 1112, -1081, -1081, 8392, 7224, 488, -1081, 543, -1081, -1081, ++ 790, -1081, -1081, 8099, 8099, -1081, 819, -1081, -1081, -1081, ++ 734, -1081, 739, 5482, 3706, -1081, 5482, 315, -1081, -1081, ++ -1081, -1081, -1081, -1081, 732, 732, 1059, 1059, 933, 5482, ++ 5482, 3761, -1081, 315, 757, 3816, -1081, -1081, -1081, -1081, ++ 761, 6504, 853, -1081, 764, 8099, 8099, 8099, 178, 766, ++ -1081, 776, 323, -1081, -1081, 841, 8099, -1081, 103, -1081, ++ 8099, -1081, 648, 648, 8099, -1081, 8099, 648, 103, 8099, ++ -1081, -1081, -1081, -1081, -1081, 648, -1081, 5482, 977, 810, ++ 5482, -1081, -1081, -1081, 7374, -1081, 3871, 820, -1081, -1081, ++ -1081, 791, 5482, -1081, 792, 977, 787, -1081, -1081, 798, ++ -1081, -1081, -1081, -1081, 5285, 5208, -1081, 905, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, 319, -1081, 388, 524, ++ 145, 7276, -1081, 800, 5872, -1081, -1081, -1081, 8392, -1081, ++ 214, 228, -1081, 803, -1081, 5482, 804, 805, 806, 514, ++ -1081, 808, -1081, -1081, -1081, -1081, -1081, 6594, -1081, 811, ++ -1081, -1081, 521, 910, 898, -1081, 648, 648, 514, 915, ++ -1081, -1081, -1081, -1081, -1081, 816, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, 6504, -1081, 357, -1081, ++ 839, 5482, -1081, -1081, -1081, 648, 648, 821, -1081, 985, ++ 7594, 5687, -1081, 8099, 823, -1081, 933, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, 86, -1081, -1081, -1081, 913, ++ 274, -1081, -1081, -1081, 914, -1081, -1081, -1081, -1081, -1081, ++ 281, -1081, 837, -1081, -1081, 842, 5482, -1081, 5482, 388, ++ -1081, 5208, 938, -1081, -1081, -1081, 437, 3411, -1081, -1081, ++ -1081, 327, -1081, 844, -1081, 854, 8392, 850, -1081, -1081, ++ 861, 5482, -1081, 289, -1081, -1081, 866, -1081, -1081, -1081, ++ -1081, 589, -1081, 966, -1081, 361, -1081, 248, 983, 8099, ++ 6594, 969, 974, -1081, 981, -1081, -1081, 543, -1081, -1081, ++ 1112, 5482, 372, 8099, 6684, -1081, 8099, -1081, -1081, -1081, ++ 79, -1081, 985, -1081, 45, -1081, 971, 989, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, 878, -1081, 821, ++ 985, -1081, -1081, 103, -1081, 5482, -1081, 5482, -1081, -1081, ++ 5208, 5482, 5482, 5208, 3926, 8099, 228, -1081, 376, -1081, ++ -1081, 5208, -1081, 5482, -1081, 524, 315, 1282, 5782, 6774, ++ 71, 214, -1081, -1081, -1081, 888, -1081, -1081, 931, 954, ++ 1376, -1081, 8182, 6864, -1081, 8099, -1081, 8099, 839, 397, ++ -1081, -1081, 1137, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ 119, -1081, 774, 8099, 5482, 890, -1081, -1081, -1081, -1081, ++ 3981, -1081, 538, 5208, 23, -1081, -1081, -1081, -1081, -1081, ++ -1081, 462, 5482, -1081, -1081, -1081, 75, -1081, -1081, -1081, ++ -1081, 893, 889, 335, -1081, -1081, -1081, 385, 49, -1081, ++ 3249, 269, -1081, 5482, 5482, 228, -1081, 700, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, 5208, 5208, -1081, -1081, -1081, ++ -1081, -1081, -1081, 88, -1081, 916, -1081, 8099, -1081, 146, ++ -1081, 639, -1081, 61, 995, -1081, -1081, -1081, 5482, -1081, ++ -1081, 996, -1081, 228, -1081, -1081, 933, 8099, 6954, -1081, ++ -1081, 972, 539, 25, -1081, 899, 53, 648, 648, 6052, ++ 990, 1628, 933, 7511, 3143, 5120, 2788, -1081, -1081, 1477, ++ -1081, 540, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ 556, -1081, -1081, -1081, 924, 503, 976, -1081, -1081, 908, ++ 909, 911, 917, 923, 925, 987, 5208, -1081, 8099, 7044, ++ 1013, 8099, 927, 5482, 4036, -1081, 5482, 3356, -1081, 5482, ++ 4091, -1081, -1081, 5482, 5208, 631, 932, -1081, 928, -1081, ++ -1081, -1081, -1081, -1081, 539, -1081, 994, -1081, -1081, -1081, ++ -1081, 4146, -1081, -1081, 4201, -1081, -1081, 3486, 5427, 1020, ++ -1081, 638, -1081, 1032, 4668, 941, 1042, 401, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, 947, 2126, 2259, ++ 8265, 2392, 501, 950, 506, 509, 2525, 702, 552, 831, ++ 412, -1081, 2658, -1081, 556, 493, -1081, -1081, 970, 4256, ++ 5482, -1081, 5482, 8348, 7677, -1081, 5537, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, 798, -1081, -1081, -1081, 1045, 953, ++ 1039, -1081, -1081, -1081, -1081, -1081, -1081, -1081, 297, -1081, ++ -1081, -1081, 5208, 1056, -1081, -1081, -1081, 228, 228, 5482, ++ -1081, 960, -1081, -1081, -1081, 5482, 965, -1081, -1081, 5482, ++ -1081, -1081, 100, -1081, 961, -1081, -1081, -1081, -1081, 1051, ++ -1081, 964, 292, -1081, -1081, 8099, 5037, -1081, -1081, -1081, ++ -1081, 8099, 7134, -1081, 5482, -1081, 428, -1081, 963, -1081, ++ -1081, 973, -1081, 2921, 3022, -1081, -1081, -1081, -1081, 5208, ++ 975, -1081, -1081, -1081, 933, 933, 5208, -1081, -1081, 1066, ++ -1081, -1081, -1081, -1081, -1081, 644, -1081, 968, 635, 5962, ++ -1081, -1081, 534, 5427, 5427, 1060, -1081, -1081, 4311, 5427, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, 5482, ++ 4366, -1081, -1081, 82, -1081, 2921, -1081, 978, 250, 356, ++ 982, 986, 984, 610, 992, 5592, 5592, -1081, -1081, 991, ++ 121, -1081, 798, -1081, -1081, -1081, -1081, 5208, -1081, 5208, ++ -1081, 228, -1081, 998, 999, -1081, 1075, 7760, -1081, 228, ++ 5482, -1081, -1081, -1081, -1081, -1081, -1081, -1081, 536, -1081, ++ 171, -1081, -1081, -1081, -1081, -1081, -1081, 1003, -1081, 4766, ++ -1081, -1081, 4766, 4766, 5537, 1004, 1005, -1081, 4944, 4944, ++ -1081, -1081, 798, -1081, 665, -1081, -1081, -1081, -1081, 8099, ++ 8099, 8099, 8099, 47, 144, 5354, 209, 1007, 993, -1081, ++ 1040, -1081, -1081, 5482, 5482, 297, 1012, 1011, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, 717, 717, -1081, -1081, -1081, ++ 228, -1081, 648, 648, 648, 648, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, 1018, 8016, -1081, -1081, -1081, -1081, -1081, ++ 124, -1081, -1081, 5482, 8016, 1017, 126, -1081, 1022, -1081, ++ -1081, 1021, -1081, -1081 + }; + + /* YYPGOTO[NTERM-NUM]. */ + static const short yypgoto[] = + { +- -1176, -1176, -1176, -1176, -1176, -1176, 529, -1176, -1176, 439, +- -1176, -153, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, 928, -1176, 1059, -1176, -1176, 1065, +- 1037, 225, 557, -1176, -1176, -1176, -1176, -76, -1176, -1176, +- 431, -1176, -1176, 550, -1176, 350, -1176, -1176, -1176, 70, +- -68, -1176, -1176, -1176, 246, -1176, -1176, -1176, 441, -86, +- -633, -94, -1176, -1176, -330, -1176, -135, -1176, -1176, -1176, +- 575, 39, -1176, 171, 640, -147, -1176, 592, -1176, -45, +- -1176, -1176, -1176, -1176, -108, -463, -987, -273, -1176, 263, +- -598, -589, -217, -1176, -1176, -812, -1176, -1176, -1176, -1176, +- -830, -771, 257, -1176, -1176, -915, -1176, -163, -1176, -1176, +- -1176, -1175, -1176, -329, 85, -1176, 36, -1176, -1176, -443, +- -850, -145, -758, -1176, -1176, -1176, -1176, -1176, -1176, -229, +- -1176, -1176, -1176, -1176, -1176, 20, 12, -1176, 1056, -1176, +- -581, -1176, -1176, 204, -1176, -975, -1176, 24, -1176, 21, +- -614, -1033, -1176, -501, -1176, -1176, 822, -1176, -1176, -1176, +- -339, -1176, -1176, 578, -1176, -1176, -268, -1176, -1176, -623, +- -1176, -1176, -496, -301, -1176, 178, -1176, -1176, 443, -378, +- 151, -1176, -1176, -551, -1176, 381, -181, -733, -488, -507, +- -1176, 651, -1176, -1176, -1176, -1176, -119, -1176, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -50, -1176, -124, -1176, -1176, +- -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, -1176, +- -1176, -1176, -1176, 524, -1176, -1176, -384, -1176, -337, 536, +- -430, -1176, -1176, 143, -1176, 154, -1176, -648, -701, -1176, +- 946, 937, -1176, -1176, -174, -1176, -1176, 158, -156, -1176, +- -642, -557, -819, -162, -1176, 453, 685, -169, -1176, -1176, +- -1176, -1176, 989, -1176, 339, -1176, -1176, 454, -493, -400, +- -1176, -1176, 1026, -1176, -1176, 1030, -1176, -1176, -1176, 644, +- -1176, -1176, -508, -194, -1176, -1176, 753, -1, -612, -995, +- -180, -437, -360, -945, -756, -78, -438, -201, 103, -761 ++ -1081, -1081, -1081, -1081, -1081, -1081, 425, -1081, -1081, 358, ++ -1081, -151, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, 912, -1081, 1079, -1081, -1081, 1080, ++ 1053, -4, 573, -1081, -1081, -1081, -1081, -75, -1081, -1081, ++ 353, -1081, -1081, 566, -1081, 295, -1081, -1081, -1081, 60, ++ -69, -1081, -1081, -1081, 377, -1081, -1081, -1081, 460, 22, ++ -645, -641, -1081, -188, -1081, -97, -1081, -315, -1081, -1081, ++ -277, -1081, -1081, -1081, 560, 93, -1081, 264, 660, -143, ++ -1081, 612, -1081, 41, -1081, -1081, -1081, -1081, -72, -295, ++ -1028, -253, -1081, 270, -596, -602, -261, -1081, -1081, -1081, ++ -804, -1081, -1081, -1081, -1081, -494, -780, 263, -1081, -1081, ++ -929, -1081, -178, -1081, -1081, -1081, -588, -1081, -255, 87, ++ -1081, 35, -1081, -1081, -411, -1080, -103, -744, -1081, -1081, ++ -1081, -1081, -1081, -1081, -440, -1081, -1081, -1081, -1081, -1081, ++ 24, -2, -1081, 1071, -1081, -815, -1081, -1081, 210, -1081, ++ -981, -1081, 27, -1081, 28, -574, -799, -1081, -612, -1081, ++ -1081, 843, -1081, -1081, -1081, -342, -1081, -1081, 605, -1081, ++ -1081, -486, -1081, -1081, -635, -1081, -1081, -503, -308, -1081, ++ 224, -1081, -1081, 453, -216, 159, -1081, -1081, -371, -1081, ++ 398, -187, -730, -491, -533, -1081, 669, -1081, -1081, -1081, ++ -1081, -49, -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -41, -1081, -99, -1081, -1081, -1081, -1081, -1081, -1081, -1081, ++ -1081, -1081, -1081, -1081, -1081, -1081, -1081, -1081, 547, -1081, ++ -1081, -379, -1081, -338, 548, -416, -1081, -1081, 150, -1081, ++ 156, -1081, -651, -705, -1081, 920, 958, -1081, -1081, -177, ++ -1081, -1081, 296, -157, -1081, -881, -558, -844, -153, -1081, ++ 463, 712, -192, -1081, -1081, -1081, -1081, -1081, 1014, -1081, ++ 395, -1081, -1081, 504, -449, -384, -1081, -1081, 1046, -1081, ++ -1081, 1048, -1081, -1081, -1081, 788, -1081, -1081, -508, -174, ++ -1081, -1081, 667, -1, -604, -968, -182, -194, -358, -974, ++ -546, -80, -412, -190, 38, -768 + }; + + /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -787 ++#define YYTABLE_NINF -796 + static const short yytable[] = + { +- 66, 66, 227, 350, 302, 631, 637, 89, 683, 66, +- 292, 342, 355, 743, 631, 344, 475, 817, 71, 452, +- 119, 608, 405, 303, 727, 604, 606, 443, 450, 931, +- 459, 912, 665, 211, 775, 750, 613, 751, 212, 418, +- 741, 1083, 343, 338, 491, 359, 204, 675, 365, 1101, +- 818, -786, 365, 332, 364, 1119, 1120, 409, 364, 371, +- -290, 474, 1070, 838, 346, 805, 1156, 208, -786, -786, +- 386, 388, 916, 792, 66, 1012, 1015, 471, 1129, 66, +- 290, 76, 927, 66, 1133, 923, 880, 926, 937, 912, +- 430, 71, 1136, 116, 1280, 378, 379, 803, 1213, 777, +- 108, 628, 116, 69, 1283, 69, -786, 328, 1184, 72, +- 66, 66, 669, 66, 77, 414, 942, 588, 1156, 71, +- 66, 291, 1173, 117, 727, 628, 935, 681, 118, 1185, +- 916, 78, 778, 389, 390, 391, 752, 118, 66, 455, +- 927, 420, 727, 923, 431, 926, 116, 435, 927, 928, +- 434, 589, 753, 942, 948, 759, 806, -290, 116, 977, +- 854, 662, 709, -786, 77, 68, -786, 710, -724, 670, +- -786, 1074, 410, -724, 411, 1216, 372, 77, 344, 347, +- 373, 118, 72, 99, 66, 66, 66, 66, 66, 66, +- 66, 209, 1096, 118, 472, 1130, 634, 635, 473, 1131, +- 636, 116, 466, 938, 1237, 66, 467, 77, 639, 939, +- 72, 428, 429, 1214, 1189, 1190, -438, 99, 109, 1215, +- 629, -786, 1253, 1254, -786, -786, 114, 115, 560, 564, +- 415, 85, 416, 943, 1247, 944, 118, 111, 592, 771, +- -438, 355, 355, -438, 629, 909, 820, 812, 1240, 220, +- 552, 1050, 949, 754, 827, 631, 456, 457, 116, 675, +- 675, 344, 436, 491, 491, 628, -724, 338, -724, 338, +- 943, -267, 1241, -267, 499, 1277, 500, 438, -786, 767, +- 439, -189, -786, -438, 1195, -724, -724, -724, 593, 648, +- -724, 683, -724, 118, 404, 69, 66, 1105, 418, -189, +- 1045, 1047, 412, 909, 94, 86, 692, 861, 108, 879, +- -189, 844, 974, 991, 108, 631, 941, 720, 721, 1185, +- 826, 1113, 628, 1074, 560, -189, 957, 495, 830, 679, +- -189, 766, 128, 69, 718, 1081, 486, 695, 1048, 75, +- -438, 1288, 587, 642, 804, 66, 66, 1204, 623, 933, +- 934, -189, -82, -775, 112, -82, -82, 1238, -31, 695, +- 660, 676, 811, 452, 560, 1235, -438, -775, 564, 552, +- 552, -438, 450, 887, 1114, -775, -189, 892, 300, 301, +- -438, 829, 1056, -189, 629, 75, 1031, 1033, 1195, 1195, +- 79, 884, -438, 788, 768, 604, -189, -189, -189, -189, +- 82, -189, -189, 66, 66, 80, 66, 66, 66, 825, +- 66, 66, 742, 66, 620, 66, 66, -438, 3, 788, +- -775, 66, 66, 627, -438, 476, 109, 963, 1112, -729, +- 66, 668, 109, 1087, 66, 66, 727, -438, 572, 1217, +- -438, 629, 383, 384, 66, 66, 1051, -729, 427, 92, +- 1082, 1145, 433, -775, 696, 697, 93, 1160, 1160, 729, +- 116, 404, 1205, 624, 1206, -334, 625, 746, 103, 417, +- 1018, -113, 1239, -729, 1019, -775, 696, 782, -729, 66, +- 66, 66, -162, 772, 1072, 151, 682, 153, 888, -33, +- 66, 889, 631, 552, 66, 118, 957, 957, -162, -729, +- 842, 842, 66, 220, 1172, 107, 1174, 492, 496, 1160, +- 789, 790, 1052, 1053, 801, 945, 505, 66, 159, 1210, +- 1211, 791, 344, 698, -729, -775, 456, 109, 69, -628, +- -628, -729, 566, -775, 113, 583, 789, 855, 121, 568, +- 468, 1117, -726, 469, -729, -516, -729, -729, -729, 69, +- 1088, 1089, 85, 973, 66, 486, 486, 66, 739, 729, +- -726, 66, 1160, 748, 207, 1160, 1160, 842, 1146, 1147, +- 967, 1249, 1249, 676, 676, 66, 124, 729, -775, 967, +- 1205, 552, 1206, -2, 552, 506, -726, 508, 66, 748, +- 1243, -726, 552, 1245, 1246, 968, 980, 981, 1157, 1167, +- 849, 421, 969, 422, 968, 1170, 1161, 1161, 1270, 1271, +- 248, 969, -726, 423, 214, 875, 272, 842, 1, 1220, +- 273, 216, 66, 66, 217, 66, 911, 683, 287, -516, +- 946, 274, 876, 819, 137, 822, 138, -726, 476, 477, +- 288, 140, 729, 221, -726, 61, 67, 552, 877, 247, +- 1157, 275, 1281, 2, 74, 299, 220, -726, 1161, -726, +- -726, -726, 292, 145, 1175, 1176, 3, 1218, 685, 959, +- 1255, 1256, 276, 277, 304, 60, 66, 427, 149, 150, +- 920, 584, 586, 700, 911, 742, 341, 552, 552, 345, +- 552, 348, 839, 840, 66, 66, 360, 66, 1272, 1162, +- 1162, 835, 850, 852, 572, 427, 66, 66, 367, 1178, +- 370, 1161, 1248, 1252, 1161, 1161, 278, 279, 280, 281, +- 1250, 1250, 831, 833, 98, 369, 492, 492, 102, 375, +- 572, 381, 282, 283, 783, 785, 397, 134, 920, 505, +- 994, 404, 1013, 994, 407, -727, 920, 408, 151, 227, +- 153, 1162, 1137, 1139, 66, 129, 131, 453, 98, 1066, +- 1066, 458, 137, -727, 138, 203, 66, 66, 66, 140, +- 764, 137, 460, 138, 465, 745, 882, 883, 140, 960, +- 962, 159, 470, 213, 552, 1285, -786, 66, 66, -727, +- 66, 145, 478, 631, -727, 1265, 1266, 1037, 1039, 576, +- 145, 735, 738, 60, 1162, 66, -728, 1162, 1162, 700, +- 610, 612, 60, 1251, 1251, -727, 581, 1107, 594, 835, +- 835, 1041, 1043, 505, -728, 462, 464, 600, 602, 327, +- 329, 330, 203, 333, 339, 340, 622, 655, 603, 614, +- -727, 617, 621, 293, 626, 657, 116, -727, 659, 137, +- -728, 138, 661, 746, 662, -728, 140, 666, 677, 994, +- -727, 552, -727, -727, -727, -769, 66, -145, 220, 698, +- 181, 294, 686, 295, 296, 297, -728, 688, 145, 552, +- 689, 118, 690, -769, 335, 693, 66, 66, 708, 711, +- 60, 712, 715, 1168, 1169, 719, 700, 722, 66, 740, +- 749, -728, 66, 1011, 1011, 66, 744, 1179, -728, -769, +- 755, 756, 1066, 1066, -769, 760, 769, -720, 1196, 289, +- 779, -728, 795, -728, -728, -728, 773, -724, 774, 796, +- 710, 1106, 807, 293, 808, -769, 66, 66, 809, 66, +- 137, 396, 138, 552, 845, -724, 847, 140, 848, 885, +- 725, 685, 867, 886, 932, 936, 1273, 1274, 1275, 1276, +- -769, 294, 940, 295, 296, 297, 950, -769, 953, 145, +- 964, -724, 137, 976, 138, 989, -724, 1021, 1025, 140, +- -769, 60, 1011, -769, -605, 1022, 958, 302, 1034, -607, +- 203, 203, 1054, 1026, 966, 972, 972, -724, 66, 979, +- 1027, 145, 1036, 552, 1028, 552, 303, -730, 1029, 1057, +- 1055, 1071, -605, 60, -605, -605, -605, 1073, 1079, 1080, +- 1086, 66, -724, 185, 186, 187, -620, 188, 1090, -724, +- 1110, -5, 1111, -730, 1124, 1118, 1128, 1132, -730, 189, +- 387, 387, -724, 190, -724, -724, -724, 1135, 1149, 494, +- 191, 497, 498, 203, 1134, 203, 501, -251, 339, -730, +- 339, 509, 1148, 163, 806, 183, 972, 1171, 1191, 185, +- 186, 187, 1177, 188, 1203, 580, -335, 1223, 1063, -336, +- 66, 66, -63, 1209, -730, 189, 66, 66, -352, 598, +- 599, -730, 1212, 1221, 1222, 1242, 191, -63, 1011, 1011, +- -354, 1269, 222, 224, -607, -353, -607, -607, -730, 220, +- 1262, 1263, 1264, -333, 1232, 185, 186, 187, 1279, 188, +- 1287, 250, 1284, 797, 618, 619, 1098, 1286, -65, 714, +- 780, 189, 83, 351, -725, 190, 289, 289, 84, 633, +- 1188, 123, 191, 594, 702, 799, 713, 638, 860, 794, +- 1011, 694, -725, 643, 680, 251, 958, 185, 186, 187, +- 1126, 1188, 363, 252, 990, -358, 1016, 1140, 798, 1201, +- 133, 1197, 554, 189, 1059, 1202, 1208, 190, -725, 444, +- 717, 66, 810, -725, 191, 1108, 862, 253, 254, 664, +- 1268, 763, 255, 374, 1234, 758, 1121, 641, 259, 260, +- 261, 262, 1164, 1011, -725, 377, 1011, 1011, 1122, 824, +- 368, 324, 66, 66, 185, 325, 263, 264, 188, 0, +- 580, 289, 289, 66, 66, 66, 66, 787, 1183, -725, +- 445, 0, 0, 706, 0, 0, -725, 0, 724, 0, +- 393, 446, 0, 0, 0, 134, 402, 0, 0, -725, +- 403, -725, -725, -725, 1164, 0, 185, 725, 0, -27, +- 188, 0, 0, 0, 0, 726, 644, 0, 66, -27, +- 0, 0, 445, 0, 0, 0, 0, 0, 66, 137, +- 0, 138, 249, 446, 0, 0, 140, 685, 250, 0, +- 0, 0, 554, 0, 0, 0, 0, 0, 0, 69, +- 0, 0, 565, 566, 0, 567, 454, 0, 145, 0, +- 568, 0, 0, 402, 0, 0, 461, 224, 224, 0, +- 60, 0, 251, 569, 570, 571, 0, 0, 0, 0, +- 252, 0, 0, 0, 0, 0, 0, 0, 0, 580, +- 580, 0, 786, 0, 402, 0, 0, 0, 0, 0, +- 0, 793, 706, 0, 253, 254, 0, 0, 0, 255, +- 0, 256, 257, 258, 0, 259, 260, 261, 262, 0, +- 0, 0, 0, 0, 0, 387, 0, 0, 505, 0, +- 0, 0, 387, 263, 264, 0, 0, 265, 266, 267, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 823, +- 0, 363, 363, 0, 607, 0, 0, 0, 0, 0, +- 134, 0, 0, 0, 0, 554, 609, 393, 393, 0, +- 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 706, 706, 0, 853, 0, 0, 0, 0, +- 0, 0, 0, 0, 137, 0, 138, 0, 139, 0, +- 865, 140, 0, 0, 0, 0, 0, 640, 0, 0, +- 646, 0, 0, 0, 0, 0, 654, 141, 142, 0, +- 143, 144, 658, 145, 0, 387, 146, 147, 148, 0, +- 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, +- 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 554, 0, 0, 554, 156, 228, 0, +- 0, 865, 0, 0, 554, 687, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 701, 0, 229, +- 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +- 240, 241, 242, 243, 244, 245, 0, 995, 1010, 995, +- 995, 0, 0, 0, 0, 0, 0, 0, 387, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 865, 865, 0, 1035, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 925, 0, 0, 0, +- 0, 0, 0, 757, 0, 363, 0, 0, 0, 554, +- 554, 0, 554, 0, 402, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 628, 0, 1077, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 895, 0, 387, +- 0, 0, 0, 213, 896, 0, 0, 0, 0, 0, +- 0, 0, 135, 136, 925, 387, 0, 0, 0, 0, +- 899, 0, 900, 0, 0, 802, 995, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, +- 138, 0, 139, 0, 0, 140, 0, 0, 0, 0, +- 0, 814, 0, 815, 0, 0, 0, 646, 654, 0, +- 654, 141, 142, 0, 143, 144, 554, 145, 0, 828, +- 146, 147, 148, 149, 150, 151, 152, 153, 0, 60, +- 0, 154, 155, 0, 0, 0, 0, 0, 0, 925, +- 925, 1141, 1143, 0, 0, 0, 1078, 0, 0, 0, +- 0, 156, 0, 1163, 1163, 157, 0, 158, 159, 0, +- 160, 161, 0, 866, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 554, 0, 0, 0, 387, 0, 924, +- 0, 0, 929, 930, 0, 1163, 0, 0, 0, 0, +- 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 951, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 924, 1163, 0, +- 222, 1163, 1163, 0, 0, 1017, 0, 1163, 1163, 0, +- 0, 0, 0, 387, 387, 554, 0, 0, 1257, 1258, +- 1259, 1260, 0, 0, 0, 0, 0, 387, 0, 0, +- 0, 0, 925, 925, 0, 0, 0, 0, 925, 0, +- 0, 0, 1042, 0, 0, 0, 0, 0, 646, 0, +- 0, 0, -776, 0, 0, 0, 0, 0, 0, 0, +- -776, 134, 0, 0, 0, 0, 0, 0, 0, 135, +- 136, 0, 924, 924, 0, 554, 0, 554, 0, 924, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 137, 0, 138, 0, 139, +- 0, 0, 140, 0, 0, -776, 0, 0, 0, 0, +- 0, 0, 0, 0, 1093, 1094, 0, 1095, 141, 142, +- 1104, 143, 144, 0, 145, 0, 0, 146, 147, 148, +- 149, 150, 151, 152, 153, 0, 60, 0, 154, 155, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 1123, 0, 0, 0, 0, 0, 1127, 156, 0, +- 0, 1017, 157, 0, 158, 159, 0, 160, 161, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 1144, 0, 0, 0, +- 0, 0, 0, 0, 0, 1159, 224, 0, 134, 0, +- 0, 0, 0, 0, 0, 0, 135, 136, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 924, 924, 0, 0, 0, +- 0, 924, 137, 0, 138, 0, 139, 0, 0, 140, +- 0, 1198, 1200, 0, 0, 0, 0, 1159, 0, 0, +- 0, 0, 0, 0, 0, 141, 142, 0, 143, 144, +- 0, 145, 0, 0, 146, 147, 148, 149, 150, 151, +- 152, 153, 0, 60, 0, 154, 155, 0, 0, 0, +- 0, 1236, 0, 0, 0, 0, 0, 0, 12, 13, +- 14, 15, 16, 0, 305, 156, 0, 0, 306, 157, +- 1104, 158, 159, 1104, 1104, 1104, 0, 307, 0, 308, +- 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 1261, 17, 18, 19, +- 20, 21, 22, 23, 0, 24, 25, 26, 27, 28, +- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, +- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, +- 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, +- 59, 0, 0, 0, 1282, 0, 0, 60, 116, 310, +- 311, 0, 0, 0, 312, 0, 313, 314, 315, 316, +- 259, 260, 261, 262, 278, 279, 280, 281, 0, 0, +- 0, 12, 13, 14, 15, 16, 0, 0, 317, 318, +- 319, 320, 321, 118, 322, 134, 0, 897, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 898, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 17, 18, 19, 20, 21, 22, 23, 0, 24, 25, +- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, +- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, +- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, +- 1014, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 229, 230, 231, 232, 233, 234, 235, 236, 237, +- 238, 239, 240, 241, 242, 243, 244, 245, 1150, 0, +- 0, 0, 0, 12, 13, 14, 15, 16, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, +- 0, 0, 0, 0, 0, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 0, +- 24, 997, 26, 998, 28, 999, 30, 31, 1000, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 45, 46, 47, 1001, 1002, 50, 1003, 1004, 53, +- 1005, 55, 56, 1006, 1007, 1008, 149, 150, 151, 152, +- 153, 0, 60, 0, 154, 155, 0, 0, 1165, 0, +- 0, 0, 0, 12, 13, 14, 15, 16, 0, 0, +- 0, 0, 0, 0, 1151, 0, -786, 134, 1100, 0, +- 158, 159, 0, 160, 161, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 0, +- 24, 997, 26, 998, 28, 999, 30, 31, 1000, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 45, 46, 47, 1001, 1002, 50, 1003, 1004, 53, +- 1005, 55, 56, 1006, 1007, 1008, 149, 150, 151, 152, +- 153, 0, 60, 0, 154, 155, 0, 0, 996, 0, +- 0, 0, 0, 12, 13, 14, 15, 16, 0, 0, +- 0, 0, 0, 0, 156, 0, 0, 134, 157, 223, +- 158, 159, 0, 160, 161, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 0, +- 24, 997, 26, 998, 28, 999, 30, 31, 1000, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 45, 46, 47, 1001, 1002, 50, 1003, 1004, 53, +- 1005, 55, 56, 1006, 1007, 1008, 149, 150, 151, 152, +- 153, 0, 60, 0, 154, 155, 0, 0, 628, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 895, 0, 0, 0, 156, 0, 0, 896, 157, 897, +- 158, 159, 0, 160, 161, 135, 136, 0, 0, 725, +- 898, 0, 0, 899, 0, 900, 0, 726, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 901, 0, +- 0, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 903, 0, 60, 0, 154, 155, 0, 0, 628, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 895, 0, 0, 0, 904, 0, 0, 896, 157, 897, +- 905, 906, 0, 160, 161, 135, 136, 0, 0, 725, +- 898, 0, 0, 899, 0, 900, 0, 726, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, +- 0, 0, 399, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 903, 134, 60, 0, 154, 155, 0, 0, 0, 135, +- 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 904, 0, 0, 0, 157, 0, +- 905, 906, 0, 160, 161, 137, 0, 138, 0, 139, +- 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, +- 0, 143, 144, 399, 145, 0, 0, 146, 147, 148, +- 149, 150, 151, 152, 153, 400, 60, 0, 154, 155, +- 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, +- 135, 136, 0, 0, 0, 0, 0, 0, 156, 0, +- 0, 0, 157, 0, 158, 159, 0, 160, 161, 0, +- 0, 0, 0, 0, 0, 0, 137, 0, 138, 0, +- 139, 0, 0, 140, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, +- 142, 0, 143, 144, 1064, 145, 0, 0, 146, 147, +- 148, 149, 150, 151, 152, 153, 765, 60, 0, 154, +- 155, 0, 0, 134, 0, 0, 0, 0, 0, 0, +- 0, 135, 136, 0, 0, 725, 0, 0, 0, 156, +- 0, 0, 0, 157, 0, 158, 159, 0, 160, 161, +- 0, 0, 0, 0, 0, 0, 0, 137, 0, 138, +- 0, 139, 0, 0, 140, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, +- 141, 142, 0, 143, 144, 0, 145, 0, 0, 146, +- 147, 148, 149, 150, 151, 152, 153, 134, 60, 0, +- 154, 155, 0, 0, 0, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 904, 0, 0, 0, 157, 0, 158, 159, 0, 160, +- 161, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 399, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 153, 134, 60, 0, 154, 155, 0, 0, 0, 135, +- 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 156, 0, 0, 0, 157, 0, +- 158, 159, 0, 160, 161, 137, 0, 138, 0, 139, +- 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 463, 0, 141, 142, +- 0, 143, 144, 0, 145, 0, 0, 146, 147, 148, +- 149, 150, 151, 152, 153, 134, 60, 0, 154, 155, +- 0, 0, 0, 135, 136, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, +- 0, 0, 157, 0, 158, 159, 0, 160, 161, 137, +- 0, 138, 0, 139, 0, 0, 140, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 605, 0, 141, 142, 0, 143, 144, 0, 145, 0, +- 0, 146, 147, 148, 149, 150, 151, 152, 153, 134, +- 60, 0, 154, 155, 0, 0, 0, 135, 136, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 156, 0, 0, 0, 157, 0, 158, 159, +- 0, 160, 161, 137, 0, 138, 0, 139, 0, 0, +- 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 611, 0, 141, 142, 0, 143, +- 144, 0, 145, 0, 0, 146, 147, 148, 149, 150, +- 151, 152, 153, 134, 60, 0, 154, 155, 0, 0, +- 0, 135, 136, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, +- 157, 0, 158, 159, 0, 160, 161, 137, 0, 138, +- 0, 139, 0, 0, 140, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 615, 0, +- 141, 142, 0, 143, 144, 0, 145, 0, 0, 146, +- 147, 148, 149, 150, 151, 152, 153, 134, 60, 0, +- 154, 155, 0, 0, 0, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 156, 0, 0, 0, 157, 0, 158, 159, 0, 160, +- 161, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 650, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 153, 134, 60, 0, 154, 155, 0, 0, 0, 135, +- 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 156, 0, 0, 0, 157, 0, +- 158, 159, 0, 160, 161, 137, 0, 138, 0, 139, +- 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 821, 0, 141, 142, +- 0, 143, 144, 0, 145, 0, 0, 146, 147, 148, +- 149, 150, 151, 152, 153, 134, 60, 0, 154, 155, +- 0, 0, 0, 135, 136, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, +- 0, 0, 157, 0, 158, 159, 0, 160, 161, 137, +- 0, 138, 0, 139, 0, 0, 140, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 868, 0, 141, 142, 0, 143, 144, 0, 145, 0, +- 0, 146, 147, 148, 149, 150, 151, 152, 153, 134, +- 60, 0, 154, 155, 0, 0, 0, 135, 136, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 156, 0, 0, 0, 157, 0, 158, 159, +- 0, 160, 161, 137, 0, 138, 0, 139, 0, 0, +- 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 1038, 0, 141, 142, 0, 143, +- 144, 0, 145, 0, 0, 146, 147, 148, 149, 150, +- 151, 152, 153, 134, 60, 0, 154, 155, 0, 0, +- 0, 135, 136, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, +- 157, 0, 158, 159, 0, 160, 161, 137, 0, 138, +- 0, 139, 0, 0, 140, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 1046, 0, +- 141, 142, 0, 143, 144, 0, 145, 0, 0, 146, +- 147, 148, 149, 150, 151, 152, 153, 134, 60, 0, +- 154, 155, 0, 0, 0, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 156, 0, 0, 0, 157, 0, 158, 159, 0, 160, +- 161, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 1058, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 153, -326, 60, 0, 154, 155, 0, 0, 0, -326, +- -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 156, 0, 0, 0, 157, 0, +- 158, 159, 0, 160, 161, -326, 0, -326, 0, -326, +- 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 1060, 0, -326, -326, +- 0, -326, -326, 0, -326, 0, 0, -326, -326, -326, +- -326, -326, -326, -326, -326, -323, -326, 0, -326, -326, +- 0, 0, 0, -323, -323, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, -326, 0, +- 0, 0, -326, 0, -326, -326, 0, -326, -326, -323, +- 0, -323, 0, -323, 0, 0, -323, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 1091, 0, -323, -323, 0, -323, -323, 0, -323, 0, +- 0, -323, -323, -323, -323, -323, -323, -323, -323, 134, +- -323, 0, -323, -323, 0, 0, 0, 135, 136, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, -323, 0, 0, 0, -323, 0, -323, -323, +- 0, -323, -323, 137, 0, 138, 0, 139, 0, 0, +- 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 1192, 0, 141, 142, 0, 143, +- 144, 0, 145, 0, 0, 146, 147, 148, 149, 150, +- 151, 152, 153, 134, 60, 0, 154, 155, 0, 0, +- 0, 135, 136, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, +- 157, 0, 158, 159, 0, 160, 161, 137, 0, 138, +- 0, 139, 0, 0, 140, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 1199, 0, +- 141, 142, 0, 143, 144, 0, 145, 0, 0, 146, +- 147, 148, 149, 150, 151, 152, 153, 134, 60, 0, +- 154, 155, 0, 0, 0, 135, 136, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 156, 0, 0, 0, 157, 0, 158, 159, 0, 160, +- 161, 137, 0, 138, 0, 139, 0, 0, 140, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 141, 142, 0, 143, 144, 0, +- 145, 0, 0, 146, 147, 148, 149, 150, 151, 152, +- 153, 0, 60, 0, 154, 155, 12, 13, 14, 15, +- 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 156, 0, 0, 0, 157, 0, +- 158, 159, 0, 160, 161, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, +- 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, ++ 66, 66, 227, 302, 71, 646, 89, 638, 345, 66, ++ 753, 941, 674, 692, 349, 450, 347, 638, 119, 410, ++ 292, 474, 358, 1097, 303, 364, 385, 388, 457, 364, ++ 824, 211, 354, 737, 751, 422, 212, 602, 604, 363, ++ 785, 441, 448, 363, 72, 606, 922, 346, 204, 77, ++ 341, 496, 760, 684, 761, 1115, 825, 1147, 415, 1084, ++ 473, 612, 959, 85, 798, 1150, 796, 890, 1210, -297, ++ 926, 76, 845, 984, 66, 94, 108, 71, 812, 66, ++ -795, -2, 937, 66, 657, 290, -795, -795, 985, 948, ++ 370, 68, 377, 378, 701, 810, 1133, 1134, 978, 77, ++ 470, 1143, 69, 129, 635, 71, 933, 922, 332, 418, ++ 66, 66, 77, 66, 720, -31, 453, 72, 99, 1, ++ 635, 78, 1228, 979, 688, -795, 291, 635, 478, 479, ++ 980, 926, 389, 390, 391, 69, 737, 86, 769, 66, ++ 75, 671, 77, 937, 678, 72, -795, 953, -445, 304, ++ 861, 937, 99, 2, 737, 424, 416, 863, 1200, 1070, ++ 432, 79, 960, 1188, 293, -297, 3, 933, 813, 116, ++ 405, 75, 953, 1210, 1210, 347, 988, 116, 1252, -733, ++ 679, -274, -733, -274, 116, 220, 66, 66, 66, 66, ++ 1088, 66, 66, 66, 641, 642, 109, -795, 464, 645, ++ -795, -795, 465, 118, -795, 66, 949, 648, -795, 371, ++ -733, 118, 950, 372, 1204, 1205, 1044, 1231, 118, 471, ++ 1144, -445, 116, 472, 1145, 636, 419, 643, 420, 644, ++ 827, 558, 1174, 1174, 1255, 454, 455, -445, 834, 1229, ++ -445, 636, -795, 1262, -445, 1230, -795, 590, 636, 1292, ++ 819, 1219, 566, 570, 919, 294, 118, 347, 1064, 354, ++ 354, 111, 638, 80, 1268, 1269, 954, -150, 955, 684, ++ 684, 409, 496, 496, 436, 341, 504, 341, 293, -733, ++ 437, -733, 762, 295, 1174, 296, 297, 406, 591, 422, ++ 889, 954, 66, 1256, 1225, 1226, 304, 692, -733, -733, ++ -733, 763, 755, 66, 936, 82, 480, 871, 1059, 1061, ++ 1002, 1127, 116, 433, 1170, 919, 108, 730, 731, 638, ++ 108, 152, 69, 154, 630, -258, 651, 1303, 777, -733, ++ 500, -733, 943, 944, 66, 968, 897, 585, 1174, 776, ++ 491, 1174, 1174, 669, 228, 1088, 118, 1264, 1264, 795, ++ 566, 726, 558, 558, 160, 1250, 833, 1062, 723, 304, ++ 481, 450, 792, 1128, 837, 936, 1170, 938, 1220, 294, ++ 1221, -341, 116, 723, 787, 752, 690, 832, -82, 756, ++ 112, -82, -82, 421, 1285, 1286, 431, 685, 448, 1182, ++ 566, 700, -612, 505, 570, 506, 836, 295, 792, 296, ++ 297, 764, 1095, 3, 66, 66, 118, 788, 66, 66, ++ 716, 66, 66, 1101, -33, 66, 602, 66, 627, 66, ++ 66, 1023, 1026, -784, 894, 66, 66, 634, 578, 1159, ++ 434, 1065, 66, 66, -167, 475, 109, 229, 220, 677, ++ 109, 631, 66, 66, 632, 778, 483, 497, 501, -167, ++ 1126, 739, 737, 898, 92, 511, 899, 1232, 230, 231, ++ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, ++ 242, 243, 244, 245, 1220, 305, 1221, 724, 725, 558, ++ 66, 793, 794, -612, 66, 66, 66, 93, 1086, 851, ++ 691, 781, 724, 805, -778, 66, 454, 109, 409, 66, ++ 638, 1171, 1181, 66, -195, 66, 952, 1033, 66, 968, ++ 968, -612, 782, -612, -612, -778, 811, 793, 864, 1096, ++ 623, 347, -784, 66, 103, -195, 1187, 803, 1189, 1131, ++ 849, 849, 1102, 1103, 818, 116, -195, 1253, 711, 885, ++ 1110, -778, 756, 712, 208, 107, -778, 209, 1160, 1161, ++ -784, -195, 902, 1171, 739, 152, -195, 154, -784, 886, ++ 66, 491, 491, 66, 749, 113, -778, 66, 558, 118, ++ 758, 558, 739, 586, 120, 887, -195, 1045, 1047, 558, ++ 382, 383, 85, 892, 893, 116, 66, 69, 160, 921, ++ 1199, -778, 69, 1185, 849, 125, 758, 220, -778, 991, ++ 992, -195, -784, 685, 685, 974, 117, 587, -195, 694, ++ 1200, -778, 978, 207, -778, 66, 1263, 1267, 431, 118, ++ 214, -195, -195, -195, -195, 216, -195, -195, 217, 66, ++ 66, 558, 66, 1235, 739, 970, 1193, 979, 431, 635, ++ 956, 692, 69, -523, 980, 1258, 572, 849, 1260, 1261, ++ 921, 752, 574, -784, 1254, 1296, 1233, -784, 728, 1029, ++ -445, -784, 248, 1030, 1175, 1175, 114, 115, 497, 497, ++ 942, 221, 930, 558, 558, 247, 188, 466, 292, -27, ++ 467, 191, 512, 511, 514, 66, -445, 300, 301, 299, ++ -27, -445, 138, 443, 139, 425, 1295, 426, 141, 578, ++ 846, 847, 304, -738, 444, -784, 1298, 427, 66, 66, ++ 842, -445, 1287, 826, 774, 829, 1175, 344, 578, 348, ++ 146, 359, 66, 66, -738, 66, 1080, 1080, 366, 1176, ++ 1176, 368, 60, 930, 369, 1005, -445, 1024, 1005, -637, ++ -637, 930, 374, -445, 397, 728, 380, 272, 475, 476, ++ -738, 273, 1066, 1067, 558, -738, -445, 957, 227, -445, ++ 636, 407, 274, 412, 66, 1190, 1191, 409, 511, 413, ++ 1175, 451, 558, 1175, 1175, -738, 66, 66, 66, 1265, ++ 1265, 1176, 275, 456, 183, 1270, 1271, 1121, 468, 61, ++ 67, 66, 66, 1300, 66, 458, 66, 135, 74, 463, ++ -738, -795, 276, 277, 469, 638, 477, -738, 150, 151, ++ 582, 584, 66, 220, 858, 860, 806, 808, 838, 840, ++ -738, -523, -738, -738, -738, 971, 973, 592, 842, 842, ++ 598, 138, -614, 139, 289, 1176, 728, 141, 1176, 1176, ++ 1151, 1153, 1280, 1281, 1266, 1266, 278, 279, 280, 281, ++ 1051, 1053, 600, -739, 745, 748, 1005, 1055, 1057, 146, ++ 601, 282, 283, 1183, 1184, 609, 611, 138, 98, 139, ++ 558, 60, 102, 141, 460, 462, 66, 1194, 613, -739, ++ 616, 621, 1080, 1080, -739, 624, 633, 628, 1211, 188, ++ 189, 190, 250, 694, 191, 146, 66, 66, 629, 130, ++ 132, 338, 98, -63, -739, 664, 192, 60, 66, 670, ++ 666, 668, 66, 1022, 1022, 66, 671, 194, -63, 675, ++ 686, 695, 697, 698, 699, 251, 702, 558, 213, -739, ++ 710, 969, 713, 252, 558, 714, -739, 717, 721, 977, ++ 983, 983, 726, 732, 990, 750, 754, 66, 66, -614, ++ 66, -614, -614, -739, 387, 387, 759, 253, 254, 765, ++ 770, 766, 255, 779, 1288, 1289, 1290, 1291, 259, 260, ++ 261, 262, 783, -729, 188, 308, 331, 333, 334, 191, ++ 336, 342, 343, 784, 789, 263, 264, 797, 791, 800, ++ 138, 443, 139, 1022, 801, 558, 141, 558, 302, 816, ++ 135, 734, 444, 712, 814, 815, 852, 854, 135, 66, ++ 855, 896, 983, 877, 895, 961, 964, 951, 146, 303, ++ 735, 975, 987, 1000, 1077, 1032, 1037, 1038, 736, 1039, ++ 60, 1034, 1022, 66, 138, 1040, 139, 164, 140, 185, ++ 141, 1041, 138, 1042, 139, 1043, 1048, 1069, 141, 289, ++ 289, 1050, 1068, 1085, 1087, 220, 142, 143, 1071, 144, ++ 145, 1120, 146, 1093, 1094, 147, 148, 149, 1100, -629, ++ 146, 1104, 1125, 1112, 60, 1124, 1132, 222, 224, 1138, ++ 735, 392, 60, 1142, 1148, 1146, 1149, 1162, 1186, 1192, ++ 560, 1163, 403, 1206, 66, 66, 157, 1238, 813, 1218, ++ 66, 66, 138, -342, 139, 969, 1224, -343, 141, 1140, ++ 287, 1278, 1022, 1022, -359, 1227, 138, 350, 139, 1236, ++ 1237, 288, 141, 308, 1257, 1279, -361, -360, 1247, 1277, ++ 146, 1284, -340, 289, 289, 607, 362, 1294, 1299, 1302, ++ 1203, 802, 60, 1301, 146, 188, 189, 190, 856, 867, ++ 191, 1178, 83, 84, 868, 869, 60, 124, 703, -65, ++ 715, 1203, 192, 947, 1022, 69, 193, 373, 571, 572, ++ 799, 573, 249, 194, 592, 574, 722, 1198, 250, 652, ++ 689, 1001, 1027, 1154, 1212, 134, 653, 1216, 575, 576, ++ 577, 1073, 1217, 308, 308, 1249, 66, 1223, 499, 442, ++ 502, 503, 817, 1178, 507, 719, 342, 1122, 342, 515, ++ 872, 251, 560, 673, 1283, 394, 768, 1135, 1022, 252, ++ 402, 1022, 1022, 773, 1136, 404, 376, 66, 66, 831, ++ 650, 596, 597, 0, 328, 367, 329, 694, 66, 66, ++ 66, 66, 0, 253, 254, 0, 0, 0, 255, 0, ++ 256, 257, 258, 0, 259, 260, 261, 262, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 620, ++ 0, 263, 264, 625, 626, 265, 266, 267, 0, 452, ++ 0, 0, 0, 66, 0, 0, 402, 0, 640, 459, ++ 224, 224, 308, 66, 308, 0, 387, 647, 0, 188, ++ 189, 190, 0, 387, 191, 0, 0, 0, -5, 0, ++ 0, 0, 0, 0, 0, 0, 192, 0, 402, 0, ++ 193, 0, 0, 0, 0, 0, 0, 194, 511, 0, ++ 18, 19, 20, 21, 22, 23, 24, 0, 560, 26, ++ 27, 28, 0, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, ++ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 362, 362, 708, 605, 0, 0, 60, ++ 0, 0, 0, 0, 188, 189, 190, 0, 0, 608, ++ 394, 394, 0, -365, 0, 615, 0, 0, 0, 387, ++ 0, 192, 0, 0, 620, 193, 0, 0, 0, 0, ++ 0, 0, 194, 0, 0, 0, 0, 387, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 560, 0, 0, ++ 560, 0, 0, 0, 0, 0, 0, 649, 560, 0, ++ 655, 0, 0, 0, 0, 0, 663, 0, 0, 0, ++ 0, 0, 667, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 635, 387, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 560, 0, 0, 905, 0, 696, 0, 708, 708, 0, ++ 906, 0, 0, 0, 0, 0, 0, 0, 136, 137, ++ 0, 620, 620, 0, 809, 0, 909, 935, 910, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 560, 560, 138, 0, 139, 0, 140, 0, ++ 141, 729, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 830, 0, 0, 142, 143, 0, 144, ++ 145, 0, 146, 387, 0, 147, 148, 149, 150, 151, ++ 152, 153, 154, 0, 60, 0, 155, 156, 935, 387, ++ 708, 708, 0, 708, 0, 862, 767, 0, 362, 0, ++ 0, 0, 0, 0, 0, 0, 157, 402, 0, 0, ++ 158, 875, 159, 160, 161, 162, 0, 0, 0, 0, ++ 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 635, ++ 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 804, 0, 0, 905, 0, 0, 0, 0, 0, ++ 0, 906, 0, 907, 935, 935, 0, 0, 0, 136, ++ 137, 1092, 0, 735, 908, 875, 0, 909, 0, 910, ++ 0, 736, 0, 0, 0, 821, 0, 822, 0, 0, ++ 0, 655, 663, 0, 663, 138, 0, 139, 0, 140, ++ 0, 141, 0, 835, 0, 0, 0, 912, 0, 0, ++ 607, 1006, 1021, 1006, 1006, 0, 0, 142, 143, 0, ++ 144, 145, 0, 146, 0, 387, 147, 148, 149, 150, ++ 151, 152, 153, 913, 0, 60, 0, 155, 156, 560, ++ 0, 0, 0, 0, 876, 0, 875, 875, 0, 1049, ++ 0, 0, 0, 0, 0, 0, 0, 914, 0, 0, ++ 0, 158, 362, 915, 916, 161, 162, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 934, 0, 0, 939, 940, 0, 0, 0, 0, 0, ++ 0, 0, 1091, 0, 0, 0, 560, 0, 0, 0, ++ 0, 387, 387, 560, 0, 0, 0, 0, 213, 0, ++ 0, 0, 0, 0, 0, 387, 0, 0, 962, 0, ++ 935, 935, 0, 0, 0, 0, 935, 0, 0, 0, ++ 0, 403, 1006, 0, 0, 0, 0, 0, 0, 0, ++ 0, 934, 0, 0, 222, 0, 0, 399, 0, 1028, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 560, 0, 560, 0, 0, 135, ++ 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 655, 0, 0, 0, 0, 0, 1155, ++ 1157, 0, 0, 138, 0, 139, 0, 140, 0, 141, ++ 0, 1177, 1177, 0, 0, 0, 0, 934, 934, 0, ++ 0, 0, 0, 0, 934, 142, 143, 0, 144, 145, ++ 0, 146, 0, 0, 147, 148, 149, 150, 151, 152, ++ 153, 154, 400, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1107, ++ 1108, 0, 1109, 1177, 0, 157, 1118, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1137, ++ 0, 0, 0, 0, 0, 1141, 0, 0, 0, 1028, ++ 0, 0, 0, 0, 0, 0, 0, 1177, 0, 0, ++ 1177, 1177, 0, 0, 0, 0, 1177, 1177, 0, 0, ++ 0, 0, 0, 0, 1158, 0, 0, 1272, 1273, 1274, ++ 1275, 0, 135, 1173, 224, 0, 0, 0, 0, 0, ++ 136, 137, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 934, 934, 0, 138, 0, 139, 934, ++ 140, 0, 141, 0, 0, 0, 0, 0, 0, 1213, ++ 1215, 0, 0, 0, 0, 1173, 0, 0, 142, 143, ++ 0, 144, 145, 0, 146, 0, 0, 147, 148, 149, ++ 150, 151, 152, 153, 154, 0, 60, 0, 155, 156, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 1251, 0, 0, 0, 0, 0, 0, -735, 157, 0, ++ -735, 0, 158, 223, 159, 160, 161, 162, 0, 1118, ++ 0, -735, 1118, 1118, 1118, -735, 0, 0, -735, 0, ++ 0, 0, 0, 0, -735, 0, -735, 0, 0, -775, ++ -735, 0, 0, 0, 0, 1276, 0, 0, 0, 0, ++ 0, 0, 0, 0, -735, 0, -735, -735, 0, -735, ++ 0, 0, 0, -735, 0, -735, 0, 0, -735, -735, ++ 0, 0, 0, -735, -735, 0, -735, -735, 0, -735, ++ 0, -735, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, -735, 0, 1297, 0, 0, 0, 0, 0, 0, ++ 0, -735, 0, -735, -735, -735, -735, -735, 0, 0, ++ -735, -735, -735, -735, -735, -735, -735, -735, -735, -735, ++ -735, -735, -735, -735, -735, -735, -735, -735, 0, -735, ++ -775, -735, -735, -735, -735, -735, -735, -735, -735, -735, ++ -736, 0, 0, -736, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, -736, 0, 0, 0, -736, 0, ++ 0, -736, 0, 0, 0, 0, 0, -736, 0, -736, ++ 0, 0, -776, -736, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, -736, 0, -736, ++ -736, 0, -736, 0, 0, 0, -736, 0, -736, 0, ++ 0, -736, -736, 0, 0, 0, -736, -736, 0, -736, ++ -736, 0, -736, 0, -736, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, -736, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, -736, 0, -736, -736, -736, -736, ++ -736, 0, 0, -736, -736, -736, -736, -736, -736, -736, ++ -736, -736, -736, -736, -736, -736, -736, -736, -736, -736, ++ -736, 0, -736, -776, -736, -736, -736, -736, -736, -736, ++ -736, -736, -736, -737, 0, 0, -737, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, -737, 0, 0, ++ 0, -737, 0, 0, -737, 0, 0, 0, 0, 0, ++ -737, 0, -737, 0, 0, -777, -737, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -737, 0, -737, -737, 0, -737, 0, 0, 0, -737, ++ 0, -737, 0, 0, -737, -737, 0, 0, 0, -737, ++ -737, 0, -737, -737, 0, -737, 0, -737, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, -737, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, -737, 0, -737, ++ -737, -737, -737, -737, 0, 0, -737, -737, -737, -737, ++ -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, ++ -737, -737, -737, -737, 0, -737, -777, -737, -737, -737, ++ -737, -737, -737, -737, -737, -737, -733, 0, 0, -733, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -733, 0, 0, 0, -733, 0, 0, -733, 0, 0, ++ 0, 0, 0, -733, 0, -733, 0, 0, -773, -733, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, -733, 0, -733, -733, 0, -733, 0, ++ 0, 0, -733, 0, -733, 0, 0, -733, -733, 0, ++ 0, 0, -733, -733, 0, -733, -733, 0, -733, 0, ++ -733, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -733, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -733, 0, -733, -733, -733, -733, -733, 0, 0, -733, ++ -733, -733, -733, -733, -733, -733, -733, -733, -733, -733, ++ -733, -733, -733, -733, -733, -733, -733, 0, -733, -773, ++ -733, -733, -733, -733, -733, -733, -733, -733, -733, -734, ++ 0, 0, -734, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, -734, 0, 0, 0, -734, 0, 0, ++ -734, 0, 0, 0, 0, 0, -734, 0, -734, 0, ++ 0, -774, -734, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, -734, 0, -734, -734, ++ 0, -734, 0, 0, 0, -734, 0, -734, 0, 0, ++ -734, -734, 0, 0, 0, -734, -734, 0, -734, -734, ++ 0, -734, 0, -734, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, -734, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, -734, 0, -734, -734, -734, -734, -734, ++ 0, 0, -734, -734, -734, -734, -734, -734, -734, -734, ++ -734, -734, -734, -734, -734, -734, -734, -734, -734, -734, ++ 0, -734, -774, -734, -734, -734, -734, -734, -734, -734, ++ -734, -734, 228, 0, 0, 0, 12, 13, 14, 15, ++ 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 135, 0, 907, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 908, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, ++ 22, 23, 24, 0, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, +- 0, 0, 0, 0, 0, 60, 116, 12, 13, 14, +- 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 134, 0, 0, 0, 0, 0, 0, 0, 135, +- 136, 0, 0, 725, 0, 0, 0, 0, 0, 0, +- 0, 118, 0, 0, 0, 0, 17, 18, 19, 20, +- 21, 22, 23, 0, 24, 997, 26, 998, 28, 999, +- 30, 31, 1000, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, 1001, 1002, +- 50, 1003, 1004, 53, 1005, 55, 56, 1006, 1007, 1008, +- 149, 150, 151, 152, 153, 0, 60, 0, 154, 155, +- 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, +- 15, 16, 0, 0, 0, 0, 0, 0, 904, 0, +- 0, 134, 157, 0, 158, 159, 0, 160, 161, 135, +- 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, +- 21, 22, 23, 0, 24, 997, 26, 998, 28, 999, +- 30, 31, 1000, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, 1001, 1002, +- 50, 1003, 1004, 53, 1005, 55, 56, 1006, 1007, 1008, +- 149, 150, 151, 152, 153, 0, 60, 0, 154, 155, +- 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 1099, 0, +- 0, 0, 1100, 136, 158, 159, 0, 160, 161, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, +- 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, +- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, +- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, +- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, +- 57, 58, 59, 149, 150, 0, 0, 0, 0, 60, +- 0, 154, 155, 0, 0, 12, 13, 14, 15, 16, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, +- 0, 897, 0, 0, 0, 0, 0, 135, 136, 0, +- 160, 161, 898, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 997, 26, 998, 28, 999, 30, 31, +- 1000, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 1001, 1002, 50, 1003, +- 1004, 53, 1005, 55, 56, 1006, 1007, 1008, 149, 150, +- 151, 152, 153, 479, 60, 0, 154, 155, 12, 13, +- 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 480, 0, 156, 0, 0, 0, +- 157, 0, 158, 159, 0, 481, 0, 0, 0, 0, +- 0, 0, 0, 0, -786, 0, 0, 17, 18, 19, +- 20, 21, 22, 23, 482, 24, 25, 26, 27, 28, +- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, +- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, +- 49, 50, 51, 52, 53, 483, 55, 56, 57, 58, +- 59, 0, 0, 0, 0, 0, 0, 60, 1138, 0, +- 0, 0, 484, 12, 13, 14, 15, 16, 0, 0, +- 0, 0, 983, 0, 0, 0, -776, 0, 0, 0, +- 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 1025, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 0, +- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, +- 54, 55, 56, 57, 58, 59, 0, 510, 0, 341, +- 511, 0, 60, 0, 0, 134, 512, 0, 513, 514, +- 0, 0, 0, 0, 515, 0, 516, 0, 0, 0, +- 0, 0, 517, 0, 0, 0, -776, 518, 519, 520, +- 0, 0, 0, 0, 521, 0, 0, 0, 0, 137, +- 0, 138, 0, 139, 0, 0, 140, 0, 0, 0, +- 0, 0, 0, 522, 523, 0, 0, 0, 524, 0, +- 0, 0, 141, 142, 525, 143, 144, 526, 145, 527, +- 528, 146, 147, 148, 335, 510, 0, 341, 511, 0, +- 60, 0, 0, 134, 512, 0, 513, 514, 0, 0, +- 0, 0, 515, 0, 516, 0, 0, 0, 0, 0, +- 517, 0, 156, 0, 0, 0, 519, 520, 529, 0, +- 0, 0, 521, 0, 0, 0, 0, 137, 0, 138, +- 0, 139, 0, 0, 140, 0, 0, 0, 0, -288, +- 134, 522, 523, 0, 0, 0, 524, 0, 135, 136, +- 141, 142, 525, 143, 144, 526, 145, 527, 528, 146, +- 147, 148, 0, 0, 0, 0, 0, 0, 60, 0, +- 0, 0, 0, 0, 137, 0, 138, 0, 139, 0, +- 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, +- 156, 0, 0, 0, 0, 0, 529, 141, 142, 0, +- 143, 144, 0, 145, 0, 0, 146, 147, 148, 149, +- 150, 151, 152, 153, 134, 60, 0, 154, 155, 0, +- 0, 0, 135, 136, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, -288, 156, 0, 0, +- 0, 157, 0, 158, 159, 0, 160, 161, 137, 0, +- 138, 0, 139, 0, 0, 140, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 141, 142, 0, 143, 144, 0, 145, 0, 0, +- 146, 147, 148, 149, 150, 151, 152, 153, 134, 60, +- 0, 154, 155, 0, 0, 0, 135, 136, 0, 0, +- 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 156, 0, 0, 0, 157, 223, 158, 159, 0, +- 160, 161, 137, 0, 138, 0, 139, 0, 0, 140, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 141, 142, 0, 143, 144, +- 0, 145, 0, 0, 146, 147, 148, 149, 150, 151, +- 152, 153, 134, 60, 0, 154, 155, 0, 0, 0, +- 135, 136, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 904, 0, 0, 0, 157, +- 0, 158, 159, 0, 160, 161, 137, 0, 138, 0, +- 139, 0, 0, 140, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, +- 142, 0, 143, 144, 0, 145, 0, 0, 146, 147, +- 148, 149, 150, 151, 152, 153, 134, 60, 0, 154, +- 155, 0, 0, 0, 135, 136, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, +- 0, 0, 0, 157, 0, 158, 159, 0, 160, 161, +- 137, 0, 138, 0, 139, 0, 0, 140, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 141, 142, 0, 143, 144, 0, 145, +- 0, 0, 146, 147, 148, 149, 150, 151, 152, 153, +- 0, 60, 0, 154, 155, 736, 0, 0, 0, 0, +- 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, +- 0, 0, 0, 1099, 0, 0, 480, 1100, 0, 158, +- 159, 0, 160, 161, 0, 0, 0, 481, 0, 0, +- 0, 0, 0, 0, 0, 0, -786, 0, 0, 17, +- 18, 19, 20, 21, 22, 23, 482, 24, 25, 26, +- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 0, 0, 0, 0, 0, 0, 230, 231, 232, 233, ++ 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, ++ 244, 245, 1164, 0, 0, 0, 0, 0, 0, 12, ++ 13, 14, 15, 16, 17, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, ++ 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, ++ 19, 20, 21, 22, 23, 24, 0, 25, 1008, 27, ++ 1009, 29, 1010, 31, 1011, 33, 34, 35, 36, 37, ++ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, ++ 1012, 1013, 50, 1014, 1015, 53, 1016, 55, 56, 1017, ++ 1018, 1019, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 1179, 0, 0, 0, 0, 0, 0, ++ 12, 13, 14, 15, 16, 17, 0, 0, 0, 0, ++ 1165, 0, -795, 0, 1114, 135, 159, 160, 161, 162, ++ 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 18, 19, 20, 21, 22, 23, 24, 0, 25, 1008, ++ 27, 1009, 29, 1010, 31, 1011, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, +- 47, 48, 49, 50, 51, 52, 53, 483, 55, 56, +- 57, 58, 59, 0, 0, 0, 0, 0, 0, 60, +- 832, 0, 0, 0, 737, -24, -24, -24, -24, -24, +- 0, 0, 0, -24, 0, 0, 0, 0, -24, 0, +- 0, -24, 0, 0, 0, -24, 0, 0, 0, 0, +- 0, 0, -24, -24, 0, 0, 0, 0, 0, -24, +- 0, -24, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, -24, 0, 25, 26, 27, 0, 29, -24, 31, ++ 47, 1012, 1013, 50, 1014, 1015, 53, 1016, 55, 56, ++ 1017, 1018, 1019, 150, 151, 152, 153, 154, 0, 60, ++ 0, 155, 156, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 157, 0, 0, 1007, 158, 223, 159, 160, 161, ++ 162, 12, 13, 14, 15, 16, 17, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, ++ 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 18, 19, 20, 21, 22, 23, 24, 0, 25, ++ 1008, 27, 1009, 29, 1010, 31, 1011, 33, 34, 35, ++ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, ++ 46, 47, 1012, 1013, 50, 1014, 1015, 53, 1016, 55, ++ 56, 1017, 1018, 1019, 150, 151, 152, 153, 154, 0, ++ 60, 0, 155, 156, 0, 0, 0, 0, 0, 0, ++ 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 157, 0, 0, 905, 158, 0, 159, 160, ++ 161, 162, 906, 0, 907, 0, 0, 0, 0, 0, ++ 136, 137, 0, 0, 735, 908, 0, 0, 909, 0, ++ 910, 0, 736, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 911, 0, 0, 138, 0, 139, 0, ++ 140, 0, 141, 0, 0, 0, 0, 0, 912, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 142, 143, ++ 0, 144, 145, 0, 146, 0, 0, 147, 148, 149, ++ 150, 151, 152, 153, 913, 0, 60, 0, 155, 156, ++ 0, 0, 0, 0, 0, 0, 0, 1056, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 914, 0, ++ -785, 0, 158, 0, 915, 916, 161, 162, -785, 135, ++ 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 399, 138, 0, 139, 0, 140, 0, 141, ++ 0, 0, -785, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 1078, 0, 0, ++ 142, 143, 0, 144, 145, 0, 146, 0, 0, 147, ++ 148, 149, 150, 151, 152, 153, 154, 775, 60, 135, ++ 155, 156, 0, 0, 0, 0, 0, 136, 137, 0, ++ 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 393, 138, 0, 139, 0, 140, 0, 141, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 399, 138, 0, ++ 139, 0, 140, 0, 141, 914, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 461, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 603, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 610, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 614, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 659, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 828, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 878, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 1052, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 1060, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 1072, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, -333, ++ 142, 143, 0, 144, 145, 0, 146, -333, -333, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 1074, -333, 0, -333, 0, -333, 0, -333, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, -330, -333, -333, 0, -333, -333, ++ 0, -333, -330, -330, -333, -333, -333, -333, -333, -333, ++ -333, -333, 0, -333, 0, -333, -333, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 1105, -330, 0, ++ -330, 0, -330, 0, -330, -333, 0, 0, 0, -333, ++ 0, -333, -333, -333, -333, 0, 0, 0, 0, 135, ++ -330, -330, 0, -330, -330, 0, -330, 136, 137, -330, ++ -330, -330, -330, -330, -330, -330, -330, 0, -330, 0, ++ -330, -330, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 1207, 138, 0, 139, 0, 140, 0, 141, ++ -330, 0, 0, 0, -330, 0, -330, -330, -330, -330, ++ 0, 0, 0, 0, 135, 142, 143, 0, 144, 145, ++ 0, 146, 136, 137, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 1214, 138, 0, ++ 139, 0, 140, 0, 141, 157, 0, 0, 0, 158, ++ 0, 159, 160, 161, 162, 0, 0, 0, 0, 135, ++ 142, 143, 0, 144, 145, 0, 146, 136, 137, 147, ++ 148, 149, 150, 151, 152, 153, 154, 0, 60, 0, ++ 155, 156, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 138, 0, 139, 0, 140, 0, 141, ++ 157, 0, 0, 0, 158, 0, 159, 160, 161, 162, ++ 0, 0, 0, 0, 0, 142, 143, 0, 144, 145, ++ 0, 146, 0, 0, 147, 148, 149, 150, 151, 152, ++ 153, 154, 0, 60, 0, 155, 156, 0, 0, 0, ++ 0, 0, 0, 0, 0, 12, 13, 14, 15, 16, ++ 17, 0, 309, 0, 0, 157, 310, 0, 0, 158, ++ 0, 159, 160, 161, 162, 311, 0, 312, 0, 0, ++ 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, ++ 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 556, 0, 0, 0, 60, -25, -25, -25, -25, -25, +- 0, 0, 0, -25, 0, 0, 0, 0, -25, 0, +- 0, -25, 0, 0, 0, -25, 0, 0, 0, 0, +- 0, 0, -25, -25, 0, 0, 0, 0, 0, -25, +- 0, -25, 0, 0, 17, 18, 19, 20, 21, 0, +- 23, -25, 0, 25, 26, 27, 0, 29, -25, 31, ++ 0, 0, 0, 0, 60, 116, 314, 315, 0, 0, ++ 0, 316, 0, 317, 318, 319, 320, 259, 260, 261, ++ 262, 278, 279, 280, 281, 12, 13, 14, 15, 16, ++ 17, 0, 0, 0, 321, 322, 323, 324, 325, 118, ++ 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, ++ 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 0, 46, 47, 48, 49, 50, 51, ++ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 1180, 0, 0, 0, 60, -786, -786, -786, -786, -786, +- 0, 0, 0, 0, 0, 0, 0, 0, -786, 0, +- 0, -786, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, -786, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, -786, -786, -786, -786, -786, -786, +- -786, 0, -786, -786, -786, -786, -786, -786, -786, -786, +- -786, -786, -786, -786, -786, -786, -786, -786, -786, -786, +- -786, -786, -786, -786, -786, -786, -786, -786, -786, -786, +- -786, -786, -786, -786, -786, -786, -786, -786, 0, 0, +- 982, 0, 0, 0, -786, 12, 13, 14, 15, 16, +- 0, 0, 0, 0, 983, 0, 0, 0, -238, 0, ++ 0, 0, 0, 0, 60, 116, 12, 13, 14, 15, ++ 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 135, 0, 0, 0, 0, 0, 0, 0, 136, ++ 137, 0, 0, 735, 0, 0, 0, 0, 0, 118, ++ 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, ++ 22, 23, 24, 0, 25, 1008, 27, 1009, 29, 1010, ++ 31, 1011, 33, 34, 35, 36, 37, 38, 39, 40, ++ 41, 42, 43, 44, 45, 46, 47, 1012, 1013, 50, ++ 1014, 1015, 53, 1016, 55, 56, 1017, 1018, 1019, 150, ++ 151, 152, 153, 154, 0, 60, 0, 155, 156, 0, ++ 0, 0, 0, 0, 12, 13, 14, 15, 16, 17, ++ 0, 0, 0, 0, 0, 0, 0, 914, 0, 135, ++ 0, 158, 0, 159, 160, 161, 162, 136, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, ++ 0, 0, 0, 0, 18, 19, 20, 21, 22, 23, ++ 24, 0, 25, 1008, 27, 1009, 29, 1010, 31, 1011, ++ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, ++ 43, 44, 45, 46, 47, 1012, 1013, 50, 1014, 1015, ++ 53, 1016, 55, 56, 1017, 1018, 1019, 150, 151, 152, ++ 153, 154, 484, 60, 0, 155, 156, 0, 0, 12, ++ 13, 14, 15, 16, 17, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 1113, 485, 0, 0, 1114, ++ 0, 159, 160, 161, 162, 0, 0, 486, 0, 0, ++ 0, 0, 0, 0, 0, 0, -795, 0, 0, 18, ++ 19, 20, 21, 22, 23, 24, 487, 25, 26, 27, ++ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, ++ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, ++ 48, 49, 50, 51, 52, 53, 488, 55, 56, 57, ++ 58, 59, 12, 13, 14, 15, 16, 17, 60, 0, ++ 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, ++ 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 150, 151, 0, 1152, 0, ++ 0, 60, 0, 155, 156, 12, 13, 14, 15, 16, ++ 17, 0, 0, 0, 0, 994, 0, 0, 0, -785, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 161, 162, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, ++ 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 334, 0, 0, 0, 60, 12, 13, 14, 15, 16, ++ 52, 53, 54, 55, 56, 57, 58, 59, 12, 13, ++ 14, 15, 16, 17, 60, 0, 0, 0, 0, 0, ++ 0, 0, 0, 135, 0, 907, 0, 0, 0, 0, ++ 0, 136, 137, 0, 0, 0, 908, 0, -785, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, ++ 20, 21, 22, 23, 24, 0, 25, 1008, 27, 1009, ++ 29, 1010, 31, 1011, 33, 34, 35, 36, 37, 38, ++ 39, 40, 41, 42, 43, 44, 45, 46, 47, 1012, ++ 1013, 50, 1014, 1015, 53, 1016, 55, 56, 1017, 1018, ++ 1019, 150, 151, 152, 153, 154, 0, 60, 0, 155, ++ 156, 0, 0, 516, 0, 344, 517, 0, 0, 0, ++ 0, 135, 518, 0, 519, 520, 0, 0, 0, 157, ++ 521, 0, 522, 158, 0, 159, 160, 0, 523, 0, ++ 0, 0, 0, 524, 525, 526, 0, 0, 0, 0, ++ 527, 0, 0, 0, 0, 138, 0, 139, 0, 140, ++ 0, 141, 0, 0, 0, 0, 0, 0, 528, 529, ++ 0, 0, 0, 530, 0, 0, 0, 142, 143, 531, ++ 144, 145, 532, 146, 533, 534, 147, 148, 149, 338, ++ 516, 0, 344, 517, 0, 60, 0, 0, 135, 518, ++ 0, 519, 520, 0, 0, 0, 0, 521, 0, 522, ++ 0, 0, 0, 0, 0, 523, 0, 157, 0, 0, ++ 0, 525, 526, 535, 0, 0, 0, 527, 0, 0, ++ 0, 0, 138, 0, 139, 0, 140, 0, 141, 0, ++ 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, ++ 530, 0, 0, 0, 142, 143, 531, 144, 145, 532, ++ 146, 533, 534, 147, 148, 149, -295, 135, 0, 0, ++ 0, 0, 60, 0, 0, 136, 137, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, ++ 535, 138, 0, 139, 0, 140, 0, 141, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 142, 143, 0, 144, 145, 0, 146, ++ 0, 0, 147, 148, 149, 150, 151, 152, 153, 154, ++ 135, 60, 0, 155, 156, 0, 0, 0, 136, 137, ++ 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, -295, 157, 0, 0, 0, 158, 0, 159, ++ 160, 161, 162, 0, 138, 0, 139, 0, 140, 0, ++ 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 135, 142, 143, 0, 144, ++ 145, 0, 146, 136, 137, 147, 148, 149, 150, 151, ++ 152, 153, 154, 0, 60, 0, 155, 156, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, ++ 0, 139, 0, 140, 0, 141, 914, 0, 0, 0, ++ 158, 0, 159, 160, 161, 162, 0, 0, 0, 0, ++ 135, 142, 143, 0, 144, 145, 0, 146, 136, 137, ++ 147, 148, 149, 150, 151, 152, 153, 154, 0, 60, ++ 0, 155, 156, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 138, 0, 139, 0, 140, 0, ++ 141, 157, 0, 0, 0, 158, 0, 159, 160, 161, ++ 162, 0, 0, 0, 0, 135, 142, 143, 0, 144, ++ 145, 0, 146, 136, 137, 147, 148, 149, 150, 151, ++ 152, 153, 154, 0, 60, 0, 155, 156, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, ++ 0, 139, 0, 140, 0, 141, 1113, 0, 0, 0, ++ 1114, 0, 159, 160, 161, 162, 0, 0, 0, 0, ++ 0, 142, 143, 0, 144, 145, 0, 146, 0, 0, ++ 147, 148, 149, 150, 151, 152, 153, 154, 746, 60, ++ 0, 155, 156, 0, 0, 12, 13, 14, 15, 16, ++ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 157, 485, 0, 0, 158, 0, 159, 160, 0, ++ 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, ++ 0, 0, -795, 0, 0, 18, 19, 20, 21, 22, ++ 23, 24, 487, 25, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ++ 52, 53, 488, 55, 56, 57, 58, 59, 0, 0, ++ 0, 0, 0, 839, 60, 0, 0, 0, 0, 747, ++ -24, -24, -24, -24, -24, -24, 0, 0, 0, -24, ++ 0, 0, 0, 0, -24, 0, 0, -24, 0, 0, ++ 0, -24, 0, 0, 0, 0, 0, 0, -24, -24, ++ 0, 0, 0, 0, 0, -24, 0, -24, 0, 0, ++ 18, 19, 20, 21, 22, 23, 24, -24, 0, 26, ++ 27, 28, 0, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, ++ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 562, 0, 0, 0, 0, 0, 60, ++ -25, -25, -25, -25, -25, -25, 0, 0, 0, -25, ++ 0, 0, 0, 0, -25, 0, 0, -25, 0, 0, ++ 0, -25, 0, 0, 0, 0, 0, 0, -25, -25, ++ 0, 0, 0, 0, 0, -25, 0, -25, 0, 0, ++ 18, 19, 20, 21, 22, 0, 24, -25, 0, 26, ++ 27, 28, 0, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 0, 46, ++ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 1195, 0, 0, 0, 0, 0, 60, ++ -795, -795, -795, -795, -795, -795, 0, 0, 0, 0, ++ 0, 0, 0, 0, -795, 0, 0, -795, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, -795, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -795, -795, -795, -795, -795, -795, -795, 0, -795, -795, ++ -795, -795, -795, -795, -795, -795, -795, -795, -795, -795, ++ -795, -795, -795, -795, -795, -795, -795, -795, -795, -795, ++ -795, -795, -795, -795, -795, -795, -795, -795, -795, -795, ++ -795, -795, -795, 993, 0, 0, 0, 0, 0, -795, ++ 12, 13, 14, 15, 16, 17, 0, 0, 0, 0, ++ 994, 0, 0, 0, -245, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 18, 19, 20, 21, 22, 23, 24, 0, 25, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, ++ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 337, 0, 0, 0, 0, 0, 60, ++ 12, 13, 14, 15, 16, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 335, 0, +- 507, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 18, 19, 20, 21, 22, 23, 24, 0, 25, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, ++ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 338, 513, 0, 0, 0, 0, 60, ++ 0, 12, 13, 14, 15, 16, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 335, 0, +- 11, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 18, 19, 20, 21, 22, 23, 24, 0, 25, ++ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ++ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, ++ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, ++ 56, 57, 58, 59, 338, 11, 0, 0, 0, 0, ++ 60, 0, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 130, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 131, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 577, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 617, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 703, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 704, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 483, 55, 56, 57, 58, 59, 0, 0, +- 784, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 488, ++ 55, 56, 57, 58, 59, 807, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 834, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 841, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 851, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 859, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 483, 55, 56, 57, 58, 59, 0, 0, +- 961, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 488, ++ 55, 56, 57, 58, 59, 972, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 1032, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 1046, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 1142, 0, 0, 0, 60, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 1156, 0, 0, 0, 0, ++ 0, 60, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, +- 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 585, 0, +- 0, 0, 0, -112, 60, 0, 0, -112, 0, 0, +- 0, 0, 0, 0, 0, 0, -112, 0, 0, -112, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- -112, 0, 0, 0, 0, 0, 0, -112, 0, -112, +- 0, 0, 17, 18, 19, 20, 21, 0, 23, -112, +- 671, 25, 26, 27, -113, 29, 0, 31, 32, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 0, 46, 47, 48, 49, 50, 51, 52, 53, +- 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, +- 0, 0, 60, 0, 17, 18, 19, 20, 21, 22, +- 23, 352, 0, 25, 26, 27, 0, 29, 0, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 0, 0, 0, 0, 60, 17, 18, 19, 20, 21, +- 0, 23, 556, 0, 25, 26, 27, 0, 29, 0, +- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, +- 41, 42, 43, 44, 0, 46, 47, 48, 49, 50, +- 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, +- 0, 0, 0, 0, 0, 60, 17, 18, 19, 20, +- 21, 0, 23, 561, 0, 25, 26, 27, 0, 29, +- 0, 31, 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 0, 46, 47, 48, 49, +- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, +- 0, 0, 0, 0, 0, 0, 60, 17, 18, 19, +- 20, 21, 0, 23, 0, 0, 25, 26, 27, 0, +- 29, 0, 31, 32, 33, 34, 35, 36, 37, 38, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 0, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 583, 0, 0, 0, 0, ++ 0, 60, -114, 0, 0, 0, 0, -114, 0, 0, ++ 0, 0, 0, 0, 0, 0, -114, 0, 0, -114, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ -114, 0, 0, 0, 0, 0, 0, -114, 0, -114, ++ 0, 0, 18, 19, 20, 21, 22, 680, 24, -114, ++ 0, 26, 27, 28, -114, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 0, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, ++ 0, 60, 0, 0, 18, 19, 20, 21, 22, 23, ++ 24, 351, 0, 26, 27, 28, 0, 30, 31, 32, ++ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, ++ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, ++ 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, ++ 0, 0, 0, 60, 0, 562, 0, 0, 18, 19, ++ 20, 21, 22, 0, 24, 0, 0, 26, 27, 28, ++ 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 0, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, +- 59, 12, 13, 14, 15, 16, 0, 60, 0, 0, +- 0, 0, 0, 0, 0, 134, 0, 897, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 898, 0, ++ 59, 0, 18, 19, 20, 21, 22, 60, 24, 567, ++ 0, 26, 27, 28, 0, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 0, 46, 47, 48, 49, 50, 51, 52, 53, 54, ++ 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, ++ 0, 60, 0, 0, 0, 0, 18, 19, 20, 21, ++ 22, 0, 24, 0, 0, 26, 27, 28, 0, 30, ++ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, ++ 41, 42, 43, 44, 0, 46, 47, 48, 49, 50, ++ 51, 52, 53, 54, 55, 56, 57, 58, 59, 12, ++ 13, 14, 15, 16, 17, 60, 0, 0, 0, 0, ++ 0, 0, 0, 0, 135, 0, 907, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 908, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, ++ 19, 20, 21, 22, 23, 24, -787, 25, 26, 27, ++ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, ++ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, ++ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, ++ 58, 59, 12, 13, 14, 15, 16, 17, 60, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 485, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 18, 19, 20, 21, 22, 23, 24, 487, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 49, 50, 51, 52, 53, 488, ++ 55, 56, 57, 58, 59, 12, 13, 14, 15, 16, ++ 17, 60, 0, 0, 0, 0, 0, 0, 0, 0, ++ 135, 0, 907, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 908, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, ++ 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ++ 52, 53, 54, 55, 56, 57, 58, 59, 12, 1239, ++ 1240, 15, 16, 17, 60, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 1241, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 18, 1243, ++ 20, 21, 22, 1244, 24, 0, 25, 26, 27, 28, ++ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, ++ 39, 40, 41, 42, 1245, 44, 45, 46, 47, 48, ++ 49, 50, 51, 52, 53, 1246, 55, 56, 57, 58, ++ 59, 12, 13, 14, 15, 16, 17, 60, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 17, 18, 19, 20, 21, 22, 23, -778, 24, 25, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 18, 19, 20, 21, 22, 23, 24, 95, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 12, 13, 14, 15, 16, 0, ++ 56, 57, 58, 59, 12, 13, 14, 15, 16, 17, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 17, 18, 19, 20, 21, 22, 23, +- 482, 24, 25, 26, 27, 28, 29, 30, 31, 32, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 18, 19, 20, 21, 22, 23, ++ 24, 0, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, +- 53, 483, 55, 56, 57, 58, 59, 12, 13, 14, +- 15, 16, 0, 60, 0, 0, 0, 0, 0, 0, +- 0, 134, 0, 897, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 898, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, +- 21, 22, 23, 0, 24, 25, 26, 27, 28, 29, +- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, +- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, +- 12, 1224, 1225, 15, 16, 0, 60, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 1226, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 1227, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, +- 1228, 19, 20, 21, 1229, 23, 0, 24, 25, 26, +- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, +- 37, 38, 39, 40, 41, 42, 1230, 44, 45, 46, +- 47, 48, 49, 50, 51, 52, 53, 1231, 55, 56, +- 57, 58, 59, 12, 13, 14, 15, 16, 0, 60, ++ 53, 54, 55, 56, 57, 58, 59, 338, 0, 0, ++ 0, 0, 0, 60, 12, 13, 14, 15, 16, 17, ++ 0, 0, 0, 0, 994, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 18, 19, 20, 21, 22, 23, ++ 24, 0, 25, 26, 27, 28, 29, 30, 31, 32, ++ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, ++ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, ++ 53, 54, 55, 56, 57, 58, 59, 12, 13, 14, ++ 15, 16, 17, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 95, +- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, +- 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, +- 54, 55, 56, 57, 58, 59, 12, 13, 14, 15, +- 16, 0, 60, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, ++ 21, 22, 23, 24, 0, 25, 26, 27, 28, 29, ++ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, ++ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, ++ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, ++ 12, 13, 14, 15, 16, 17, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, +- 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, +- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, +- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, +- 51, 52, 53, 54, 55, 56, 57, 58, 59, 335, +- 12, 13, 14, 15, 16, 60, 0, 0, 0, 983, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, +- 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, ++ 18, 19, 20, 21, 22, 23, 24, 0, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, +- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, +- 57, 58, 59, 12, 13, 14, 15, 16, 0, 60, ++ 47, 48, 49, 50, 51, 52, 53, 488, 55, 56, ++ 57, 58, 59, 12, 13, 14, 15, 16, 17, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 17, 18, 19, 20, 21, 22, 23, 0, +- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ++ 0, 0, 0, 18, 19, 20, 21, 22, 23, 24, ++ 0, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 12, 13, 14, 15, +- 16, 0, 60, 0, 0, 0, 0, 0, 0, 0, ++ 16, 17, 60, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, +- 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, +- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, ++ 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, ++ 22, 23, 24, 0, 25, 1008, 27, 1009, 29, 30, ++ 31, 1011, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, +- 51, 52, 53, 483, 55, 56, 57, 58, 59, 12, +- 13, 14, 15, 16, 0, 60, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, +- 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, +- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, +- 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, +- 58, 59, 0, 0, 0, 0, 0, 0, 60, 17, +- 18, 19, 20, 21, 22, 23, 0, 0, 25, 26, +- 27, 0, 29, 0, 31, 32, 33, 34, 35, 36, +- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, ++ 51, 52, 53, 1016, 55, 56, 57, 58, 59, 0, ++ 18, 19, 20, 21, 22, 60, 24, 0, 0, 26, ++ 27, 28, 0, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 0, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, +- 57, 58, 59, 0, 17, 18, 19, 20, 21, 60, +- 23, 0, 0, 25, 26, 27, 0, 29, 0, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +- 42, 43, 44, 0, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, +- 0, 0, 0, 0, 60 ++ 57, 58, 59, 0, 0, 0, 0, 0, 0, 60 + }; + + /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of + list of conflicting reductions corresponding to action entry for + state STATE-NUM in yytable. 0 means no conflicts. The list in + yyconfl is terminated by a rule number of 0. */ +-static const unsigned char yyconflp[] = ++static const unsigned short yyconflp[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2557,22 +2614,6 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, +- 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 31, 0, 71, 0, 73, 75, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2583,8 +2624,6 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 33, 0, 35, +- 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2592,48 +2631,46 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 27, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 41, 0, 43, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 55, 0, 57, 59, 0, 0, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 495, 0, 497, 499, 0, 0, 0, 0, 0, 0, ++ 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 63, 0, 65, 67, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 79, 0, 81, 83, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 503, ++ 0, 505, 507, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2642,8 +2679,6 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, +- 0, 89, 91, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2752,9 +2787,74 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, ++ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 35, 0, 0, 0, 37, 0, 0, 39, 0, ++ 0, 0, 0, 0, 41, 0, 43, 0, 0, 0, ++ 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 47, 0, 49, 51, 0, 53, ++ 0, 0, 0, 55, 0, 57, 0, 0, 59, 61, ++ 0, 0, 0, 63, 65, 0, 67, 69, 0, 71, ++ 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 77, 0, 79, 81, 83, 85, 87, 0, 0, ++ 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, ++ 109, 111, 113, 115, 117, 119, 121, 123, 0, 125, ++ 0, 127, 129, 131, 133, 135, 137, 139, 141, 143, ++ 145, 0, 0, 147, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 149, 0, 0, 0, 151, 0, ++ 0, 153, 0, 0, 0, 0, 0, 155, 0, 157, ++ 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 161, 0, 163, ++ 165, 0, 167, 0, 0, 0, 169, 0, 171, 0, ++ 0, 173, 175, 0, 0, 0, 177, 179, 0, 181, ++ 183, 0, 185, 0, 187, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 191, 0, 193, 195, 197, 199, ++ 201, 0, 0, 203, 205, 207, 209, 211, 213, 215, ++ 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, ++ 237, 0, 239, 0, 241, 243, 245, 247, 249, 251, ++ 253, 255, 257, 265, 0, 0, 267, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, ++ 0, 271, 0, 0, 273, 0, 0, 0, 0, 0, ++ 275, 0, 277, 0, 0, 0, 279, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 281, 0, 283, 285, 0, 287, 0, 0, 0, 289, ++ 0, 291, 0, 0, 293, 295, 0, 0, 0, 297, ++ 299, 0, 301, 303, 0, 305, 0, 307, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 311, 0, 313, ++ 315, 317, 319, 321, 0, 0, 323, 325, 327, 329, ++ 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, ++ 351, 353, 355, 357, 0, 359, 0, 361, 363, 365, ++ 367, 369, 371, 373, 375, 377, 379, 0, 0, 381, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 383, 0, 0, 0, 385, 0, 0, 387, 0, 0, ++ 0, 0, 0, 389, 0, 391, 0, 0, 0, 393, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 395, 0, 397, 399, 0, 401, 0, ++ 0, 0, 403, 0, 405, 0, 0, 407, 409, 0, ++ 0, 0, 411, 413, 0, 415, 417, 0, 419, 0, ++ 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 425, 0, 427, 429, 431, 433, 435, 0, 0, 437, ++ 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, ++ 459, 461, 463, 465, 467, 469, 471, 0, 473, 0, ++ 475, 477, 479, 481, 483, 485, 487, 489, 491, 509, ++ 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 513, 0, 0, 0, 515, 0, 0, ++ 517, 0, 0, 0, 0, 0, 519, 0, 521, 0, ++ 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 525, 0, 527, 529, ++ 0, 531, 0, 0, 0, 533, 0, 535, 0, 0, ++ 537, 539, 0, 0, 0, 541, 543, 0, 545, 547, ++ 0, 549, 0, 551, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 555, 0, 557, 559, 561, 563, 565, ++ 0, 0, 567, 569, 571, 573, 575, 577, 579, 581, ++ 583, 585, 587, 589, 591, 593, 595, 597, 599, 601, ++ 0, 603, 0, 605, 607, 609, 611, 613, 615, 617, ++ 619, 621, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -3231,6 +3331,11 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 1, 3, 0, 0, 0, 0, 0, 5, 0, ++ 7, 0, 0, 9, 11, 0, 0, 0, 13, 15, ++ 0, 17, 19, 0, 0, 0, 21, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -3250,12 +3355,7 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 1, 3, 0, 0, 0, 0, 0, 5, +- 0, 7, 0, 0, 0, 9, 11, 0, 0, 0, +- 13, 15, 0, 17, 19, 0, 0, 0, 21, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -3306,7 +3406,9 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 259, 0, 0, 0, 0, 261, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +@@ -3321,1002 +3423,1066 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, +- 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + /* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by + 0, pointed into by YYCONFLP. */ + static const short yyconfl[] = + { +- 0, 583, 0, 583, 0, 583, 0, 583, 0, 583, +- 0, 583, 0, 583, 0, 583, 0, 583, 0, 583, +- 0, 583, 0, 583, 0, 583, 0, 763, 0, 763, +- 0, 766, 0, 766, 0, 766, 0, 766, 0, 767, +- 0, 767, 0, 767, 0, 767, 0, 749, 0, 749, +- 0, 749, 0, 768, 0, 768, 0, 768, 0, 768, +- 0, 764, 0, 764, 0, 764, 0, 764, 0, 786, +- 0, 786, 0, 786, 0, 786, 0, 730, 0, 730, +- 0, 730, 0, 730, 0, 765, 0, 765, 0, 765, +- 0, 765, 0 ++ 0, 590, 0, 590, 0, 590, 0, 590, 0, 590, ++ 0, 590, 0, 590, 0, 590, 0, 590, 0, 590, ++ 0, 590, 0, 590, 0, 590, 0, 772, 0, 772, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 775, 0, 775, 0, 775, ++ 0, 775, 0, 775, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 776, ++ 0, 776, 0, 776, 0, 776, 0, 776, 0, 758, ++ 0, 758, 0, 758, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 777, ++ 0, 777, 0, 777, 0, 777, 0, 777, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 773, 0, 773, 0, 773, 0, 773, ++ 0, 773, 0, 795, 0, 795, 0, 795, 0, 795, ++ 0, 739, 0, 739, 0, 739, 0, 739, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0, 774, 0, 774, 0, 774, 0, 774, ++ 0, 774, 0 + }; + + static const short yycheck[] = + { +- 1, 2, 158, 204, 178, 493, 502, 75, 565, 10, +- 172, 192, 206, 636, 502, 195, 400, 750, 6, 358, +- 98, 459, 323, 179, 622, 455, 456, 357, 358, 848, +- 367, 843, 539, 127, 682, 647, 474, 649, 132, 340, +- 629, 986, 195, 190, 404, 214, 122, 555, 217, 1024, +- 751, 1, 221, 188, 217, 1050, 1051, 1, 221, 1, +- 19, 398, 977, 1, 1, 30, 1099, 1, 30, 19, +- 287, 288, 843, 706, 75, 905, 906, 1, 1, 80, +- 66, 11, 843, 84, 1071, 843, 41, 843, 1, 901, +- 63, 79, 1079, 96, 1269, 269, 270, 720, 1, 83, +- 1, 1, 96, 50, 1279, 50, 1, 185, 53, 6, +- 111, 112, 550, 114, 11, 1, 1, 83, 1151, 107, +- 121, 107, 1117, 117, 722, 1, 859, 564, 131, 74, +- 901, 61, 116, 289, 290, 291, 1, 131, 139, 1, +- 901, 342, 740, 901, 117, 901, 96, 1, 909, 96, +- 351, 117, 17, 1, 1, 662, 121, 116, 96, 121, +- 793, 116, 14, 1, 61, 0, 116, 19, 1, 553, +- 120, 983, 116, 1, 118, 1170, 118, 74, 358, 116, +- 122, 131, 79, 80, 185, 186, 187, 188, 189, 190, +- 191, 125, 1022, 131, 118, 118, 497, 498, 122, 122, +- 501, 96, 376, 116, 1191, 206, 380, 104, 509, 122, +- 107, 346, 347, 116, 1129, 1130, 116, 114, 119, 122, +- 120, 116, 1217, 1218, 119, 120, 118, 119, 422, 423, +- 116, 9, 118, 118, 1209, 120, 131, 1, 439, 676, +- 116, 435, 436, 119, 120, 843, 753, 743, 1193, 146, +- 419, 952, 99, 118, 761, 743, 118, 119, 96, 767, +- 768, 441, 116, 623, 624, 1, 99, 414, 101, 416, +- 118, 118, 120, 120, 409, 1262, 411, 355, 116, 1, +- 356, 1, 120, 19, 1134, 118, 119, 120, 441, 518, +- 118, 848, 120, 131, 117, 50, 297, 1030, 599, 19, +- 948, 949, 125, 901, 79, 83, 574, 803, 1, 816, +- 30, 774, 893, 902, 1, 803, 867, 618, 619, 74, +- 758, 11, 1, 1135, 518, 45, 883, 405, 766, 558, +- 50, 668, 107, 50, 602, 1, 404, 1, 950, 117, +- 19, 1286, 436, 512, 722, 346, 347, 1, 1, 856, +- 857, 71, 116, 19, 118, 119, 120, 1, 83, 1, +- 529, 555, 740, 702, 558, 1184, 45, 11, 562, 538, +- 539, 50, 702, 1, 64, 19, 96, 840, 118, 119, +- 116, 765, 963, 103, 120, 117, 937, 938, 1238, 1239, +- 116, 829, 71, 1, 116, 825, 116, 117, 118, 119, +- 116, 121, 122, 404, 405, 117, 407, 408, 409, 1, +- 411, 412, 629, 414, 482, 416, 417, 96, 83, 1, +- 64, 422, 423, 491, 103, 118, 119, 890, 1040, 1, +- 431, 118, 119, 1, 435, 436, 1034, 116, 426, 1172, +- 119, 120, 284, 285, 445, 446, 953, 19, 345, 116, +- 116, 1, 349, 119, 118, 119, 116, 1099, 1100, 622, +- 96, 117, 116, 116, 118, 119, 119, 103, 116, 125, +- 117, 57, 116, 45, 121, 119, 118, 119, 50, 480, +- 481, 482, 46, 677, 980, 91, 564, 93, 116, 83, +- 491, 119, 980, 662, 495, 131, 1053, 1054, 62, 71, +- 773, 774, 503, 400, 1116, 116, 1118, 404, 405, 1151, +- 118, 119, 119, 120, 715, 1, 413, 518, 124, 1161, +- 1162, 99, 702, 101, 96, 11, 118, 119, 50, 118, +- 119, 103, 54, 19, 83, 432, 118, 119, 57, 61, +- 382, 1048, 1, 385, 116, 117, 118, 119, 120, 50, +- 118, 119, 9, 45, 555, 623, 624, 558, 626, 722, +- 19, 562, 1204, 641, 116, 1207, 1208, 840, 118, 119, +- 71, 1213, 1214, 767, 768, 576, 83, 740, 64, 71, +- 116, 750, 118, 0, 753, 414, 45, 416, 589, 667, +- 1204, 50, 761, 1207, 1208, 96, 897, 898, 1099, 1100, +- 781, 40, 103, 42, 96, 1112, 1099, 1100, 1250, 1251, +- 119, 103, 71, 52, 117, 1, 12, 890, 35, 1176, +- 16, 117, 623, 624, 117, 626, 843, 1184, 48, 117, +- 116, 27, 18, 752, 54, 754, 56, 96, 118, 119, +- 60, 61, 805, 117, 103, 1, 2, 816, 34, 117, +- 1151, 47, 1275, 70, 10, 117, 553, 116, 1151, 118, +- 119, 120, 824, 83, 119, 120, 83, 1174, 565, 886, +- 118, 119, 68, 69, 118, 95, 677, 574, 89, 90, +- 843, 435, 436, 580, 901, 902, 14, 856, 857, 116, +- 859, 83, 770, 771, 695, 696, 117, 698, 1255, 1099, +- 1100, 769, 788, 789, 692, 602, 707, 708, 117, 1, +- 99, 1204, 1213, 1214, 1207, 1208, 112, 113, 114, 115, +- 1213, 1214, 767, 768, 80, 119, 623, 624, 84, 11, +- 718, 39, 128, 129, 695, 696, 119, 20, 901, 636, +- 903, 117, 905, 906, 125, 1, 909, 125, 91, 905, +- 93, 1151, 1081, 1082, 755, 111, 112, 119, 114, 976, +- 977, 120, 54, 19, 56, 121, 767, 768, 769, 61, +- 667, 54, 119, 56, 119, 25, 119, 120, 61, 887, +- 888, 124, 99, 139, 953, 1281, 119, 788, 789, 45, +- 791, 83, 119, 1281, 50, 1238, 1239, 942, 943, 117, +- 83, 623, 624, 95, 1204, 806, 1, 1207, 1208, 706, +- 471, 472, 95, 1213, 1214, 71, 25, 1034, 34, 887, +- 888, 945, 946, 720, 19, 371, 372, 9, 116, 185, +- 186, 187, 188, 189, 190, 191, 120, 83, 119, 119, +- 96, 119, 119, 93, 42, 117, 96, 103, 117, 54, +- 45, 56, 120, 103, 116, 50, 61, 11, 118, 1022, +- 116, 1030, 118, 119, 120, 1, 867, 120, 765, 101, +- 117, 121, 116, 123, 124, 125, 71, 116, 83, 1048, +- 116, 131, 116, 19, 89, 116, 887, 888, 117, 19, +- 95, 34, 19, 1110, 1111, 120, 793, 120, 899, 120, +- 39, 96, 903, 904, 905, 906, 30, 1124, 103, 45, +- 120, 117, 1129, 1130, 50, 19, 117, 117, 1135, 166, +- 116, 116, 17, 118, 119, 120, 120, 1, 120, 17, +- 19, 13, 30, 93, 13, 71, 937, 938, 119, 940, +- 54, 297, 56, 1112, 116, 19, 74, 61, 53, 119, +- 32, 848, 121, 120, 116, 55, 1257, 1258, 1259, 1260, +- 96, 121, 99, 123, 124, 125, 17, 103, 17, 83, +- 46, 45, 54, 121, 56, 30, 50, 99, 116, 61, +- 116, 95, 983, 119, 93, 52, 883, 1161, 30, 1, +- 346, 347, 118, 116, 891, 892, 893, 71, 999, 896, +- 116, 83, 122, 1172, 116, 1174, 1162, 19, 116, 62, +- 117, 30, 121, 95, 123, 124, 125, 19, 120, 19, +- 119, 1022, 96, 6, 7, 8, 117, 10, 99, 103, +- 120, 14, 30, 45, 117, 17, 116, 122, 50, 22, +- 287, 288, 116, 26, 118, 119, 120, 120, 116, 405, +- 33, 407, 408, 409, 30, 411, 412, 30, 414, 71, +- 416, 417, 122, 117, 121, 119, 963, 19, 30, 6, +- 7, 8, 119, 10, 119, 431, 119, 19, 975, 119, +- 1081, 1082, 19, 120, 96, 22, 1087, 1088, 120, 445, +- 446, 103, 122, 119, 119, 119, 33, 34, 1099, 1100, +- 120, 117, 156, 157, 116, 120, 118, 119, 120, 1006, +- 120, 116, 83, 119, 1182, 6, 7, 8, 117, 10, +- 116, 31, 119, 14, 480, 481, 1023, 119, 19, 600, +- 691, 22, 73, 205, 1, 26, 383, 384, 73, 495, +- 1128, 104, 33, 34, 587, 714, 596, 503, 798, 708, +- 1151, 576, 19, 513, 562, 65, 1053, 6, 7, 8, +- 1057, 1149, 216, 73, 901, 14, 909, 1082, 59, 1149, +- 114, 1135, 419, 22, 970, 1151, 1155, 26, 45, 357, +- 602, 1182, 739, 50, 33, 1034, 805, 97, 98, 538, +- 1240, 667, 102, 247, 1182, 659, 1053, 512, 108, 109, +- 110, 111, 1099, 1204, 71, 268, 1207, 1208, 1054, 756, +- 221, 185, 1213, 1214, 6, 185, 126, 127, 10, -1, +- 576, 468, 469, 1224, 1225, 1226, 1227, 19, 1125, 96, +- 22, -1, -1, 589, -1, -1, 103, -1, 13, -1, +- 294, 33, -1, -1, -1, 20, 300, -1, -1, 116, +- 304, 118, 119, 120, 1151, -1, 6, 32, -1, 9, +- 10, -1, -1, -1, -1, 40, 513, -1, 1269, 19, +- -1, -1, 22, -1, -1, -1, -1, -1, 1279, 54, +- -1, 56, 25, 33, -1, -1, 61, 1184, 31, -1, +- -1, -1, 539, -1, -1, -1, -1, -1, -1, 50, +- -1, -1, 53, 54, -1, 56, 360, -1, 83, -1, +- 61, -1, -1, 367, -1, -1, 370, 371, 372, -1, +- 95, -1, 65, 74, 75, 76, -1, -1, -1, -1, +- 73, -1, -1, -1, -1, -1, -1, -1, -1, 695, +- 696, -1, 698, -1, 398, -1, -1, -1, -1, -1, +- -1, 707, 708, -1, 97, 98, -1, -1, -1, 102, +- -1, 104, 105, 106, -1, 108, 109, 110, 111, -1, +- -1, -1, -1, -1, -1, 622, -1, -1, 1275, -1, +- -1, -1, 629, 126, 127, -1, -1, 130, 131, 132, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 755, +- -1, 455, 456, -1, 458, -1, -1, -1, -1, -1, +- 20, -1, -1, -1, -1, 662, 470, 471, 472, -1, +- -1, -1, 476, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 788, 789, -1, 791, -1, -1, -1, -1, +- -1, -1, -1, -1, 54, -1, 56, -1, 58, -1, +- 806, 61, -1, -1, -1, -1, -1, 511, -1, -1, +- 514, -1, -1, -1, -1, -1, 520, 77, 78, -1, +- 80, 81, 526, 83, -1, 722, 86, 87, 88, -1, +- -1, -1, -1, -1, -1, 95, -1, -1, -1, -1, +- -1, -1, -1, 740, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, 750, -1, -1, 753, 117, 95, -1, +- -1, 867, -1, -1, 761, 569, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 581, -1, 116, +- 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, +- 127, 128, 129, 130, 131, 132, -1, 903, 904, 905, +- 906, -1, -1, -1, -1, -1, -1, -1, 805, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 816, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 937, 938, -1, 940, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 843, -1, -1, -1, +- -1, -1, -1, 657, -1, 659, -1, -1, -1, 856, +- 857, -1, 859, -1, 668, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 1, -1, 983, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 13, -1, 886, +- -1, -1, -1, 999, 20, -1, -1, -1, -1, -1, +- -1, -1, 28, 29, 901, 902, -1, -1, -1, -1, +- 36, -1, 38, -1, -1, 719, 1022, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, +- 56, -1, 58, -1, -1, 61, -1, -1, -1, -1, +- -1, 745, -1, 747, -1, -1, -1, 751, 752, -1, +- 754, 77, 78, -1, 80, 81, 953, 83, -1, 763, +- 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, +- -1, 97, 98, -1, -1, -1, -1, -1, -1, 976, +- 977, 1087, 1088, -1, -1, -1, 983, -1, -1, -1, +- -1, 117, -1, 1099, 1100, 121, -1, 123, 124, -1, +- 126, 127, -1, 807, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 825, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, 1030, -1, -1, -1, 1034, -1, 843, +- -1, -1, 846, 847, -1, 1151, -1, -1, -1, -1, +- -1, 1048, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 878, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 901, 1204, -1, +- 904, 1207, 1208, -1, -1, 909, -1, 1213, 1214, -1, +- -1, -1, -1, 1110, 1111, 1112, -1, -1, 1224, 1225, +- 1226, 1227, -1, -1, -1, -1, -1, 1124, -1, -1, +- -1, -1, 1129, 1130, -1, -1, -1, -1, 1135, -1, +- -1, -1, 1, -1, -1, -1, -1, -1, 952, -1, +- -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, +- 19, 20, -1, -1, -1, -1, -1, -1, -1, 28, +- 29, -1, 976, 977, -1, 1172, -1, 1174, -1, 983, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 54, -1, 56, -1, 58, +- -1, -1, 61, -1, -1, 64, -1, -1, -1, -1, +- -1, -1, -1, -1, 1018, 1019, -1, 1021, 77, 78, +- 1024, 80, 81, -1, 83, -1, -1, 86, 87, 88, +- 89, 90, 91, 92, 93, -1, 95, -1, 97, 98, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 1055, -1, -1, -1, -1, -1, 1061, 117, -1, +- -1, 1065, 121, -1, 123, 124, -1, 126, 127, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 1090, -1, -1, -1, +- -1, -1, -1, -1, -1, 1099, 1100, -1, 20, -1, +- -1, -1, -1, -1, -1, -1, 28, 29, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 1129, 1130, -1, -1, -1, +- -1, 1135, 54, -1, 56, -1, 58, -1, -1, 61, +- -1, 1145, 1146, -1, -1, -1, -1, 1151, -1, -1, +- -1, -1, -1, -1, -1, 77, 78, -1, 80, 81, +- -1, 83, -1, -1, 86, 87, 88, 89, 90, 91, +- 92, 93, -1, 95, -1, 97, 98, -1, -1, -1, +- -1, 1185, -1, -1, -1, -1, -1, -1, 6, 7, +- 8, 9, 10, -1, 12, 117, -1, -1, 16, 121, +- 1204, 123, 124, 1207, 1208, 1209, -1, 25, -1, 27, +- -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 1230, 45, 46, 47, +- 48, 49, 50, 51, -1, 53, 54, 55, 56, 57, +- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, ++ 1, 2, 159, 180, 6, 508, 75, 498, 195, 10, ++ 645, 855, 545, 571, 204, 357, 198, 508, 98, 327, ++ 173, 400, 214, 997, 181, 217, 287, 288, 366, 221, ++ 760, 128, 206, 629, 636, 343, 133, 453, 454, 217, ++ 691, 356, 357, 221, 6, 457, 850, 198, 123, 11, ++ 193, 409, 656, 561, 658, 1036, 761, 1085, 335, 988, ++ 398, 473, 1, 11, 709, 1093, 707, 44, 1148, 22, ++ 850, 11, 1, 48, 75, 79, 1, 79, 33, 80, ++ 1, 0, 850, 84, 524, 68, 33, 1, 903, 1, ++ 1, 0, 269, 270, 580, 730, 1064, 1065, 73, 61, ++ 1, 1, 53, 107, 1, 107, 850, 911, 188, 1, ++ 111, 112, 74, 114, 600, 85, 1, 79, 80, 38, ++ 1, 61, 1, 98, 564, 1, 109, 1, 405, 406, ++ 105, 911, 289, 290, 291, 53, 732, 85, 671, 140, ++ 119, 118, 104, 911, 556, 107, 22, 1, 22, 4, ++ 795, 919, 114, 72, 750, 345, 4, 798, 76, 974, ++ 350, 118, 101, 1131, 4, 118, 85, 911, 123, 98, ++ 1, 119, 1, 1253, 1254, 357, 123, 98, 1206, 1, ++ 559, 120, 4, 122, 98, 147, 187, 188, 189, 190, ++ 994, 192, 193, 194, 502, 503, 121, 118, 375, 507, ++ 121, 122, 379, 132, 118, 206, 118, 515, 122, 120, ++ 1, 132, 124, 124, 1143, 1144, 946, 1185, 132, 120, ++ 120, 118, 98, 124, 124, 122, 118, 504, 120, 506, ++ 763, 423, 1113, 1114, 1208, 120, 121, 118, 771, 118, ++ 121, 122, 118, 1224, 118, 124, 122, 437, 122, 1277, ++ 753, 1, 426, 427, 850, 95, 132, 439, 963, 433, ++ 434, 1, 753, 119, 1232, 1233, 120, 122, 122, 777, ++ 778, 119, 630, 631, 354, 418, 1, 420, 4, 101, ++ 355, 103, 1, 123, 1165, 125, 126, 118, 439, 597, ++ 823, 120, 293, 122, 1175, 1176, 4, 855, 120, 121, ++ 122, 20, 28, 304, 850, 118, 65, 810, 959, 960, ++ 912, 14, 98, 1, 1113, 911, 1, 625, 626, 810, ++ 1, 93, 53, 95, 1, 33, 518, 1301, 1, 120, ++ 410, 122, 865, 866, 335, 893, 1, 434, 1219, 677, ++ 409, 1222, 1223, 535, 4, 1149, 132, 1228, 1229, 101, ++ 524, 103, 544, 545, 126, 1199, 768, 961, 1, 4, ++ 119, 703, 1, 66, 776, 911, 1165, 98, 118, 95, ++ 120, 121, 98, 1, 85, 636, 570, 1, 118, 105, ++ 120, 121, 122, 4, 1265, 1266, 348, 561, 703, 1119, ++ 564, 579, 4, 118, 568, 120, 775, 123, 1, 125, ++ 126, 120, 1, 85, 405, 406, 132, 118, 409, 410, ++ 598, 412, 413, 1, 85, 416, 832, 418, 487, 420, ++ 421, 915, 916, 22, 836, 426, 427, 496, 430, 1, ++ 118, 964, 433, 434, 49, 120, 121, 97, 400, 120, ++ 121, 118, 443, 444, 121, 118, 408, 409, 410, 64, ++ 1054, 629, 1048, 118, 118, 417, 121, 1187, 118, 119, ++ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, ++ 130, 131, 132, 133, 118, 120, 120, 120, 121, 671, ++ 481, 120, 121, 95, 485, 486, 487, 118, 991, 784, ++ 570, 685, 120, 121, 1, 496, 120, 121, 119, 500, ++ 991, 1113, 1114, 504, 1, 506, 877, 4, 509, 1067, ++ 1068, 123, 686, 125, 126, 22, 732, 120, 121, 118, ++ 482, 703, 121, 524, 118, 22, 1130, 717, 1132, 1062, ++ 783, 784, 120, 121, 750, 98, 33, 1, 17, 1, ++ 1034, 48, 105, 22, 1, 118, 53, 4, 120, 121, ++ 14, 48, 847, 1165, 732, 93, 53, 95, 22, 21, ++ 561, 630, 631, 564, 633, 85, 73, 568, 760, 132, ++ 650, 763, 750, 85, 60, 37, 73, 948, 949, 771, ++ 284, 285, 11, 121, 122, 98, 587, 53, 126, 850, ++ 56, 98, 53, 1126, 847, 85, 676, 559, 105, 907, ++ 908, 98, 66, 777, 778, 900, 119, 119, 105, 571, ++ 76, 118, 73, 118, 121, 616, 1228, 1229, 580, 132, ++ 119, 118, 119, 120, 121, 119, 123, 124, 119, 630, ++ 631, 823, 633, 1191, 812, 896, 1, 98, 600, 1, ++ 1, 1199, 53, 119, 105, 1219, 57, 900, 1222, 1223, ++ 911, 912, 63, 14, 118, 1290, 1189, 121, 620, 119, ++ 22, 22, 121, 123, 1113, 1114, 120, 121, 630, 631, ++ 857, 119, 850, 865, 866, 119, 8, 381, 831, 11, ++ 384, 13, 418, 645, 420, 686, 48, 120, 121, 119, ++ 22, 53, 57, 25, 59, 43, 1284, 45, 63, 701, ++ 780, 781, 4, 1, 36, 66, 1294, 55, 709, 710, ++ 779, 73, 1270, 762, 676, 764, 1165, 17, 720, 118, ++ 85, 119, 723, 724, 22, 726, 987, 988, 119, 1113, ++ 1114, 121, 97, 911, 101, 913, 98, 915, 916, 120, ++ 121, 919, 14, 105, 121, 707, 42, 15, 120, 121, ++ 48, 19, 121, 122, 946, 53, 118, 118, 915, 121, ++ 122, 85, 30, 4, 765, 121, 122, 119, 730, 4, ++ 1219, 121, 964, 1222, 1223, 73, 777, 778, 779, 1228, ++ 1229, 1165, 50, 122, 117, 120, 121, 1048, 4, 1, ++ 2, 792, 793, 1296, 795, 121, 797, 23, 10, 121, ++ 98, 121, 70, 71, 101, 1296, 121, 105, 91, 92, ++ 433, 434, 813, 775, 792, 793, 723, 724, 777, 778, ++ 118, 119, 120, 121, 122, 897, 898, 37, 897, 898, ++ 11, 57, 1, 59, 167, 1219, 798, 63, 1222, 1223, ++ 1095, 1096, 1253, 1254, 1228, 1229, 114, 115, 116, 117, ++ 953, 954, 118, 22, 630, 631, 1034, 956, 957, 85, ++ 121, 129, 130, 1124, 1125, 470, 471, 57, 80, 59, ++ 1062, 97, 84, 63, 370, 371, 877, 1138, 121, 48, ++ 119, 28, 1143, 1144, 53, 121, 45, 121, 1149, 8, ++ 9, 10, 34, 855, 13, 85, 897, 898, 122, 111, ++ 112, 91, 114, 22, 73, 85, 25, 97, 909, 122, ++ 119, 119, 913, 914, 915, 916, 118, 36, 37, 14, ++ 120, 118, 118, 118, 118, 67, 118, 1119, 140, 98, ++ 119, 893, 22, 75, 1126, 37, 105, 22, 122, 901, ++ 902, 903, 103, 122, 906, 122, 33, 948, 949, 118, ++ 951, 120, 121, 122, 287, 288, 42, 99, 100, 122, ++ 22, 119, 104, 119, 1272, 1273, 1274, 1275, 110, 111, ++ 112, 113, 122, 119, 8, 187, 188, 189, 190, 13, ++ 192, 193, 194, 122, 118, 127, 128, 4, 22, 20, ++ 57, 25, 59, 994, 20, 1187, 63, 1189, 1175, 121, ++ 23, 16, 36, 22, 33, 16, 118, 76, 23, 1010, ++ 56, 122, 974, 123, 121, 20, 20, 101, 85, 1176, ++ 35, 49, 123, 33, 986, 101, 118, 118, 43, 118, ++ 97, 55, 1033, 1034, 57, 118, 59, 117, 61, 119, ++ 63, 118, 57, 118, 59, 58, 33, 119, 63, 382, ++ 383, 124, 120, 33, 22, 1017, 79, 80, 64, 82, ++ 83, 16, 85, 122, 22, 88, 89, 90, 121, 119, ++ 85, 101, 33, 1035, 97, 122, 20, 157, 158, 119, ++ 35, 293, 97, 118, 33, 124, 122, 124, 22, 121, ++ 423, 118, 304, 33, 1095, 1096, 119, 22, 123, 121, ++ 1101, 1102, 57, 121, 59, 1067, 122, 121, 63, 1071, ++ 51, 118, 1113, 1114, 122, 124, 57, 205, 59, 121, ++ 121, 62, 63, 335, 121, 85, 122, 122, 1197, 122, ++ 85, 119, 121, 466, 467, 468, 216, 119, 121, 118, ++ 1142, 716, 97, 121, 85, 8, 9, 10, 790, 12, ++ 13, 1113, 73, 73, 17, 802, 97, 104, 585, 22, ++ 594, 1163, 25, 868, 1165, 53, 29, 247, 56, 57, ++ 710, 59, 28, 36, 37, 63, 616, 1139, 34, 519, ++ 568, 911, 919, 1096, 1149, 114, 519, 1163, 76, 77, ++ 78, 981, 1165, 405, 406, 1197, 1197, 1169, 410, 356, ++ 412, 413, 749, 1165, 416, 600, 418, 1048, 420, 421, ++ 812, 67, 545, 544, 1255, 295, 668, 1067, 1219, 75, ++ 300, 1222, 1223, 676, 1068, 305, 268, 1228, 1229, 766, ++ 518, 443, 444, -1, 188, 221, 188, 1199, 1239, 1240, ++ 1241, 1242, -1, 99, 100, -1, -1, -1, 104, -1, ++ 106, 107, 108, -1, 110, 111, 112, 113, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 481, ++ -1, 127, 128, 485, 486, 131, 132, 133, -1, 359, ++ -1, -1, -1, 1284, -1, -1, 366, -1, 500, 369, ++ 370, 371, 504, 1294, 506, -1, 629, 509, -1, 8, ++ 9, 10, -1, 636, 13, -1, -1, -1, 17, -1, ++ -1, -1, -1, -1, -1, -1, 25, -1, 398, -1, ++ 29, -1, -1, -1, -1, -1, -1, 36, 1290, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 671, 57, ++ 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, +- 88, -1, -1, -1, 1278, -1, -1, 95, 96, 97, +- 98, -1, -1, -1, 102, -1, 104, 105, 106, 107, +- 108, 109, 110, 111, 112, 113, 114, 115, -1, -1, +- -1, 6, 7, 8, 9, 10, -1, -1, 126, 127, +- 128, 129, 130, 131, 132, 20, -1, 22, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, ++ 88, 89, 90, 453, 454, 587, 456, -1, -1, 97, ++ -1, -1, -1, -1, 8, 9, 10, -1, -1, 469, ++ 470, 471, -1, 17, -1, 475, -1, -1, -1, 732, ++ -1, 25, -1, -1, 616, 29, -1, -1, -1, -1, ++ -1, -1, 36, -1, -1, -1, -1, 750, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 760, -1, -1, ++ 763, -1, -1, -1, -1, -1, -1, 517, 771, -1, ++ 520, -1, -1, -1, -1, -1, 526, -1, -1, -1, ++ -1, -1, 532, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 1, 812, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 823, -1, -1, 16, -1, 575, -1, 709, 710, -1, ++ 23, -1, -1, -1, -1, -1, -1, -1, 31, 32, ++ -1, 723, 724, -1, 726, -1, 39, 850, 41, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 865, 866, 57, -1, 59, -1, 61, -1, ++ 63, 621, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 765, -1, -1, 79, 80, -1, 82, ++ 83, -1, 85, 896, -1, 88, 89, 90, 91, 92, ++ 93, 94, 95, -1, 97, -1, 99, 100, 911, 912, ++ 792, 793, -1, 795, -1, 797, 666, -1, 668, -1, ++ -1, -1, -1, -1, -1, -1, 119, 677, -1, -1, ++ 123, 813, 125, 126, 127, 128, -1, -1, -1, -1, ++ -1, -1, -1, 946, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, ++ -1, 964, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 721, -1, -1, 16, -1, -1, -1, -1, -1, ++ -1, 23, -1, 25, 987, 988, -1, -1, -1, 31, ++ 32, 994, -1, 35, 36, 877, -1, 39, -1, 41, ++ -1, 43, -1, -1, -1, 755, -1, 757, -1, -1, ++ -1, 761, 762, -1, 764, 57, -1, 59, -1, 61, ++ -1, 63, -1, 773, -1, -1, -1, 69, -1, -1, ++ 1033, 913, 914, 915, 916, -1, -1, 79, 80, -1, ++ 82, 83, -1, 85, -1, 1048, 88, 89, 90, 91, ++ 92, 93, 94, 95, -1, 97, -1, 99, 100, 1062, ++ -1, -1, -1, -1, 814, -1, 948, 949, -1, 951, ++ -1, -1, -1, -1, -1, -1, -1, 119, -1, -1, ++ -1, 123, 832, 125, 126, 127, 128, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 850, -1, -1, 853, 854, -1, -1, -1, -1, -1, ++ -1, -1, 994, -1, -1, -1, 1119, -1, -1, -1, ++ -1, 1124, 1125, 1126, -1, -1, -1, -1, 1010, -1, ++ -1, -1, -1, -1, -1, 1138, -1, -1, 888, -1, ++ 1143, 1144, -1, -1, -1, -1, 1149, -1, -1, -1, ++ -1, 1033, 1034, -1, -1, -1, -1, -1, -1, -1, ++ -1, 911, -1, -1, 914, -1, -1, 1, -1, 919, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 1187, -1, 1189, -1, -1, 23, ++ -1, -1, -1, -1, -1, -1, -1, 31, 32, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 963, -1, -1, -1, -1, -1, 1101, ++ 1102, -1, -1, 57, -1, 59, -1, 61, -1, 63, ++ -1, 1113, 1114, -1, -1, -1, -1, 987, 988, -1, ++ -1, -1, -1, -1, 994, 79, 80, -1, 82, 83, ++ -1, 85, -1, -1, 88, 89, 90, 91, 92, 93, ++ 94, 95, 96, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 1029, ++ 1030, -1, 1032, 1165, -1, 119, 1036, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 1069, ++ -1, -1, -1, -1, -1, 1075, -1, -1, -1, 1079, ++ -1, -1, -1, -1, -1, -1, -1, 1219, -1, -1, ++ 1222, 1223, -1, -1, -1, -1, 1228, 1229, -1, -1, ++ -1, -1, -1, -1, 1104, -1, -1, 1239, 1240, 1241, ++ 1242, -1, 23, 1113, 1114, -1, -1, -1, -1, -1, ++ 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 1143, 1144, -1, 57, -1, 59, 1149, ++ 61, -1, 63, -1, -1, -1, -1, -1, -1, 1159, ++ 1160, -1, -1, -1, -1, 1165, -1, -1, 79, 80, ++ -1, 82, 83, -1, 85, -1, -1, 88, 89, 90, ++ 91, 92, 93, 94, 95, -1, 97, -1, 99, 100, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 1200, -1, -1, -1, -1, -1, -1, 1, 119, -1, ++ 4, -1, 123, 124, 125, 126, 127, 128, -1, 1219, ++ -1, 15, 1222, 1223, 1224, 19, -1, -1, 22, -1, ++ -1, -1, -1, -1, 28, -1, 30, -1, -1, 33, ++ 34, -1, -1, -1, -1, 1245, -1, -1, -1, -1, ++ -1, -1, -1, -1, 48, -1, 50, 51, -1, 53, ++ -1, -1, -1, 57, -1, 59, -1, -1, 62, 63, ++ -1, -1, -1, 67, 68, -1, 70, 71, -1, 73, ++ -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 85, -1, 1293, -1, -1, -1, -1, -1, -1, ++ -1, 95, -1, 97, 98, 99, 100, 101, -1, -1, ++ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, ++ 114, 115, 116, 117, 118, 119, 120, 121, -1, 123, ++ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, ++ 1, -1, -1, 4, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 15, -1, -1, -1, 19, -1, ++ -1, 22, -1, -1, -1, -1, -1, 28, -1, 30, ++ -1, -1, 33, 34, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 48, -1, 50, ++ 51, -1, 53, -1, -1, -1, 57, -1, 59, -1, ++ -1, 62, 63, -1, -1, -1, 67, 68, -1, 70, ++ 71, -1, 73, -1, 75, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 95, -1, 97, 98, 99, 100, ++ 101, -1, -1, 104, 105, 106, 107, 108, 109, 110, ++ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, ++ 121, -1, 123, 124, 125, 126, 127, 128, 129, 130, ++ 131, 132, 133, 1, -1, -1, 4, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, ++ -1, 19, -1, -1, 22, -1, -1, -1, -1, -1, ++ 28, -1, 30, -1, -1, 33, 34, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 48, -1, 50, 51, -1, 53, -1, -1, -1, 57, ++ -1, 59, -1, -1, 62, 63, -1, -1, -1, 67, ++ 68, -1, 70, 71, -1, 73, -1, 75, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 95, -1, 97, ++ 98, 99, 100, 101, -1, -1, 104, 105, 106, 107, ++ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, ++ 118, 119, 120, 121, -1, 123, 124, 125, 126, 127, ++ 128, 129, 130, 131, 132, 133, 1, -1, -1, 4, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 15, -1, -1, -1, 19, -1, -1, 22, -1, -1, ++ -1, -1, -1, 28, -1, 30, -1, -1, 33, 34, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 48, -1, 50, 51, -1, 53, -1, ++ -1, -1, 57, -1, 59, -1, -1, 62, 63, -1, ++ -1, -1, 67, 68, -1, 70, 71, -1, 73, -1, ++ 75, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 95, -1, 97, 98, 99, 100, 101, -1, -1, 104, ++ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, ++ 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, ++ 125, 126, 127, 128, 129, 130, 131, 132, 133, 1, ++ -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 15, -1, -1, -1, 19, -1, -1, ++ 22, -1, -1, -1, -1, -1, 28, -1, 30, -1, ++ -1, 33, 34, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 48, -1, 50, 51, ++ -1, 53, -1, -1, -1, 57, -1, 59, -1, -1, ++ 62, 63, -1, -1, -1, 67, 68, -1, 70, 71, ++ -1, 73, -1, 75, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 95, -1, 97, 98, 99, 100, 101, ++ -1, -1, 104, 105, 106, 107, 108, 109, 110, 111, ++ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, ++ -1, 123, 124, 125, 126, 127, 128, 129, 130, 131, ++ 132, 133, 4, -1, -1, -1, 8, 9, 10, 11, ++ 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 23, -1, 25, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51, ++ 52, 53, 54, -1, 56, 57, 58, 59, 60, 61, ++ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, ++ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ++ 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, ++ -1, -1, -1, -1, -1, 97, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 45, 46, 47, 48, 49, 50, 51, -1, 53, 54, +- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, +- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, +- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, 88, -1, -1, -1, -1, -1, -1, +- 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 118, 119, 120, 121, ++ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, ++ 132, 133, 1, -1, -1, -1, -1, -1, -1, 8, ++ 9, 10, 11, 12, 13, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, ++ -1, -1, 31, 32, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, ++ 49, 50, 51, 52, 53, 54, -1, 56, 57, 58, ++ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, ++ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, ++ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, 1, -1, -1, -1, -1, -1, -1, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, -1, ++ 119, -1, 121, -1, 123, 23, 125, 126, 127, 128, ++ -1, -1, -1, 31, 32, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, +- 125, 126, 127, 128, 129, 130, 131, 132, 1, -1, +- -1, -1, -1, 6, 7, 8, 9, 10, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, +- -1, -1, -1, -1, -1, 28, 29, -1, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 56, 57, ++ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 91, 92, 93, 94, 95, -1, 97, ++ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, -1, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, +- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, +- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, +- 93, -1, 95, -1, 97, 98, -1, -1, 1, -1, +- -1, -1, -1, 6, 7, 8, 9, 10, -1, -1, +- -1, -1, -1, -1, 117, -1, 119, 20, 121, -1, +- 123, 124, -1, 126, 127, 28, 29, -1, -1, -1, ++ -1, 119, -1, -1, 1, 123, 124, 125, 126, 127, ++ 128, 8, 9, 10, 11, 12, 13, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, ++ -1, -1, -1, -1, 31, 32, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, -1, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ++ -1, 48, 49, 50, 51, 52, 53, 54, -1, 56, ++ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ++ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ++ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, ++ 87, 88, 89, 90, 91, 92, 93, 94, 95, -1, ++ 97, -1, 99, 100, -1, -1, -1, -1, -1, -1, ++ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 119, -1, -1, 16, 123, -1, 125, 126, ++ 127, 128, 23, -1, 25, -1, -1, -1, -1, -1, ++ 31, 32, -1, -1, 35, 36, -1, -1, 39, -1, ++ 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 54, -1, -1, 57, -1, 59, -1, ++ 61, -1, 63, -1, -1, -1, -1, -1, 69, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 79, 80, ++ -1, 82, 83, -1, 85, -1, -1, 88, 89, 90, ++ 91, 92, 93, 94, 95, -1, 97, -1, 99, 100, ++ -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 119, -1, ++ 14, -1, 123, -1, 125, 126, 127, 128, 22, 23, ++ -1, -1, -1, -1, -1, -1, -1, 31, 32, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, 1, -1, -1, ++ 79, 80, -1, 82, 83, -1, 85, -1, -1, 88, ++ 89, 90, 91, 92, 93, 94, 95, 96, 97, 23, ++ 99, 100, -1, -1, -1, -1, -1, 31, 32, -1, ++ -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, 23, 79, 80, -1, 82, 83, ++ -1, 85, 31, 32, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 1, 57, -1, ++ 59, -1, 61, -1, 63, 119, -1, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, -1, -1, 23, ++ 79, 80, -1, 82, 83, -1, 85, 31, 32, 88, ++ 89, 90, 91, 92, 93, 94, 95, -1, 97, -1, ++ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 57, -1, 59, -1, 61, -1, 63, ++ 119, -1, -1, -1, 123, -1, 125, 126, 127, 128, ++ -1, -1, -1, -1, -1, 79, 80, -1, 82, 83, ++ -1, 85, -1, -1, 88, 89, 90, 91, 92, 93, ++ 94, 95, -1, 97, -1, 99, 100, -1, -1, -1, ++ -1, -1, -1, -1, -1, 8, 9, 10, 11, 12, ++ 13, -1, 15, -1, -1, 119, 19, -1, -1, 123, ++ -1, 125, 126, 127, 128, 28, -1, 30, -1, -1, ++ -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, ++ 53, 54, -1, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, +- 93, -1, 95, -1, 97, 98, -1, -1, 1, -1, +- -1, -1, -1, 6, 7, 8, 9, 10, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, 20, 121, 122, +- 123, 124, -1, 126, 127, 28, 29, -1, -1, -1, ++ 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, ++ -1, -1, -1, -1, 97, 98, 99, 100, -1, -1, ++ -1, 104, -1, 106, 107, 108, 109, 110, 111, 112, ++ 113, 114, 115, 116, 117, 8, 9, 10, 11, 12, ++ 13, -1, -1, -1, 127, 128, 129, 130, 131, 132, ++ 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, -1, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ++ -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, ++ 53, 54, -1, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, +- 93, -1, 95, -1, 97, 98, -1, -1, 1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 13, -1, -1, -1, 117, -1, -1, 20, 121, 22, +- 123, 124, -1, 126, 127, 28, 29, -1, -1, 32, +- 33, -1, -1, 36, -1, 38, -1, 40, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 51, -1, +- -1, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, -1, 95, -1, 97, 98, -1, -1, 1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 13, -1, -1, -1, 117, -1, -1, 20, 121, 22, +- 123, 124, -1, 126, 127, 28, 29, -1, -1, 32, +- 33, -1, -1, 36, -1, 38, -1, 40, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, +- -1, -1, 1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, 20, 95, -1, 97, 98, -1, -1, -1, 28, +- 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, -1, 121, -1, +- 123, 124, -1, 126, 127, 54, -1, 56, -1, 58, +- -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 77, 78, +- -1, 80, 81, 1, 83, -1, -1, 86, 87, 88, +- 89, 90, 91, 92, 93, 94, 95, -1, 97, 98, +- -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, +- 28, 29, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, -1, 121, -1, 123, 124, -1, 126, 127, -1, +- -1, -1, -1, -1, -1, -1, 54, -1, 56, -1, +- 58, -1, -1, 61, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, +- 78, -1, 80, 81, 1, 83, -1, -1, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, -1, 97, +- 98, -1, -1, 20, -1, -1, -1, -1, -1, -1, +- -1, 28, 29, -1, -1, 32, -1, -1, -1, 117, +- -1, -1, -1, 121, -1, 123, 124, -1, 126, 127, +- -1, -1, -1, -1, -1, -1, -1, 54, -1, 56, +- -1, 58, -1, -1, 61, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, +- 77, 78, -1, 80, 81, -1, 83, -1, -1, 86, +- 87, 88, 89, 90, 91, 92, 93, 20, 95, -1, +- 97, 98, -1, -1, -1, 28, 29, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 117, -1, -1, -1, 121, -1, 123, 124, -1, 126, +- 127, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, 20, 95, -1, 97, 98, -1, -1, -1, 28, +- 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, -1, 121, -1, +- 123, 124, -1, 126, 127, 54, -1, 56, -1, 58, +- -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 1, -1, 77, 78, +- -1, 80, 81, -1, 83, -1, -1, 86, 87, 88, +- 89, 90, 91, 92, 93, 20, 95, -1, 97, 98, +- -1, -1, -1, 28, 29, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, -1, 121, -1, 123, 124, -1, 126, 127, 54, +- -1, 56, -1, 58, -1, -1, 61, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 1, -1, 77, 78, -1, 80, 81, -1, 83, -1, +- -1, 86, 87, 88, 89, 90, 91, 92, 93, 20, +- 95, -1, 97, 98, -1, -1, -1, 28, 29, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 117, -1, -1, -1, 121, -1, 123, 124, +- -1, 126, 127, 54, -1, 56, -1, 58, -1, -1, +- 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 1, -1, 77, 78, -1, 80, +- 81, -1, 83, -1, -1, 86, 87, 88, 89, 90, +- 91, 92, 93, 20, 95, -1, 97, 98, -1, -1, +- -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 117, -1, -1, -1, +- 121, -1, 123, 124, -1, 126, 127, 54, -1, 56, +- -1, 58, -1, -1, 61, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, +- 77, 78, -1, 80, 81, -1, 83, -1, -1, 86, +- 87, 88, 89, 90, 91, 92, 93, 20, 95, -1, +- 97, 98, -1, -1, -1, 28, 29, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 117, -1, -1, -1, 121, -1, 123, 124, -1, 126, +- 127, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, 20, 95, -1, 97, 98, -1, -1, -1, 28, +- 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, -1, 121, -1, +- 123, 124, -1, 126, 127, 54, -1, 56, -1, 58, +- -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 1, -1, 77, 78, +- -1, 80, 81, -1, 83, -1, -1, 86, 87, 88, +- 89, 90, 91, 92, 93, 20, 95, -1, 97, 98, +- -1, -1, -1, 28, 29, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, -1, 121, -1, 123, 124, -1, 126, 127, 54, +- -1, 56, -1, 58, -1, -1, 61, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 1, -1, 77, 78, -1, 80, 81, -1, 83, -1, +- -1, 86, 87, 88, 89, 90, 91, 92, 93, 20, +- 95, -1, 97, 98, -1, -1, -1, 28, 29, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 117, -1, -1, -1, 121, -1, 123, 124, +- -1, 126, 127, 54, -1, 56, -1, 58, -1, -1, +- 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 1, -1, 77, 78, -1, 80, +- 81, -1, 83, -1, -1, 86, 87, 88, 89, 90, +- 91, 92, 93, 20, 95, -1, 97, 98, -1, -1, +- -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 117, -1, -1, -1, +- 121, -1, 123, 124, -1, 126, 127, 54, -1, 56, +- -1, 58, -1, -1, 61, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, +- 77, 78, -1, 80, 81, -1, 83, -1, -1, 86, +- 87, 88, 89, 90, 91, 92, 93, 20, 95, -1, +- 97, 98, -1, -1, -1, 28, 29, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 117, -1, -1, -1, 121, -1, 123, 124, -1, 126, +- 127, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, 20, 95, -1, 97, 98, -1, -1, -1, 28, +- 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, -1, 121, -1, +- 123, 124, -1, 126, 127, 54, -1, 56, -1, 58, +- -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 1, -1, 77, 78, +- -1, 80, 81, -1, 83, -1, -1, 86, 87, 88, +- 89, 90, 91, 92, 93, 20, 95, -1, 97, 98, +- -1, -1, -1, 28, 29, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, -1, 121, -1, 123, 124, -1, 126, 127, 54, +- -1, 56, -1, 58, -1, -1, 61, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 1, -1, 77, 78, -1, 80, 81, -1, 83, -1, +- -1, 86, 87, 88, 89, 90, 91, 92, 93, 20, +- 95, -1, 97, 98, -1, -1, -1, 28, 29, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 117, -1, -1, -1, 121, -1, 123, 124, +- -1, 126, 127, 54, -1, 56, -1, 58, -1, -1, +- 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 1, -1, 77, 78, -1, 80, +- 81, -1, 83, -1, -1, 86, 87, 88, 89, 90, +- 91, 92, 93, 20, 95, -1, 97, 98, -1, -1, +- -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 117, -1, -1, -1, +- 121, -1, 123, 124, -1, 126, 127, 54, -1, 56, +- -1, 58, -1, -1, 61, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, +- 77, 78, -1, 80, 81, -1, 83, -1, -1, 86, +- 87, 88, 89, 90, 91, 92, 93, 20, 95, -1, +- 97, 98, -1, -1, -1, 28, 29, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 117, -1, -1, -1, 121, -1, 123, 124, -1, 126, +- 127, 54, -1, 56, -1, 58, -1, -1, 61, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 77, 78, -1, 80, 81, -1, +- 83, -1, -1, 86, 87, 88, 89, 90, 91, 92, +- 93, -1, 95, -1, 97, 98, 6, 7, 8, 9, +- 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 117, -1, -1, -1, 121, -1, +- 123, 124, -1, 126, 127, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 45, 46, 47, 48, 49, +- 50, 51, -1, 53, 54, 55, 56, 57, 58, 59, +- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, +- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, 88, -1, +- -1, -1, -1, -1, -1, 95, 96, 6, 7, 8, +- 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 20, -1, -1, -1, -1, -1, -1, -1, 28, +- 29, -1, -1, 32, -1, -1, -1, -1, -1, -1, +- -1, 131, -1, -1, -1, -1, 45, 46, 47, 48, +- 49, 50, 51, -1, 53, 54, 55, 56, 57, 58, +- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, +- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, +- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +- 89, 90, 91, 92, 93, -1, 95, -1, 97, 98, +- -1, -1, -1, -1, -1, -1, -1, 6, 7, 8, +- 9, 10, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, 20, 121, -1, 123, 124, -1, 126, 127, 28, +- 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 45, 46, 47, 48, +- 49, 50, 51, -1, 53, 54, 55, 56, 57, 58, ++ 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, ++ -1, -1, -1, -1, 97, 98, 8, 9, 10, 11, ++ 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, ++ 32, -1, -1, 35, -1, -1, -1, -1, -1, 132, ++ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51, ++ 52, 53, 54, -1, 56, 57, 58, 59, 60, 61, ++ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, ++ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ++ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, ++ 92, 93, 94, 95, -1, 97, -1, 99, 100, -1, ++ -1, -1, -1, -1, 8, 9, 10, 11, 12, 13, ++ -1, -1, -1, -1, -1, -1, -1, 119, -1, 23, ++ -1, 123, -1, 125, 126, 127, 128, 31, 32, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, ++ 54, -1, 56, 57, 58, 59, 60, 61, 62, 63, ++ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ++ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ++ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, ++ 94, 95, 1, 97, -1, 99, 100, -1, -1, 8, ++ 9, 10, 11, 12, 13, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 119, 25, -1, -1, 123, ++ -1, 125, 126, 127, 128, -1, -1, 36, -1, -1, ++ -1, -1, -1, -1, -1, -1, 45, -1, -1, 48, ++ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +- 89, 90, 91, 92, 93, -1, 95, -1, 97, 98, +- 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, +- -1, -1, 121, 29, 123, 124, -1, 126, 127, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, +- 46, 47, 48, 49, 50, 51, -1, 53, 54, 55, ++ 89, 90, 8, 9, 10, 11, 12, 13, 97, -1, ++ -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, ++ -1, -1, 121, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, +- 86, 87, 88, 89, 90, -1, -1, -1, -1, 95, +- -1, 97, 98, -1, -1, 6, 7, 8, 9, 10, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, +- -1, 22, -1, -1, -1, -1, -1, 28, 29, -1, +- 126, 127, 33, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, +- 91, 92, 93, 1, 95, -1, 97, 98, 6, 7, +- 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 22, -1, 117, -1, -1, -1, +- 121, -1, 123, 124, -1, 33, -1, -1, -1, -1, +- -1, -1, -1, -1, 42, -1, -1, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, ++ 86, 87, 88, 89, 90, 91, 92, -1, 1, -1, ++ -1, 97, -1, 99, 100, 8, 9, 10, 11, 12, ++ 13, -1, -1, -1, -1, 18, -1, -1, -1, 22, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 127, 128, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, ++ 53, 54, -1, 56, 57, 58, 59, 60, 61, 62, ++ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ++ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, ++ 83, 84, 85, 86, 87, 88, 89, 90, 8, 9, ++ 10, 11, 12, 13, 97, -1, -1, -1, -1, -1, ++ -1, -1, -1, 23, -1, 25, -1, -1, -1, -1, ++ -1, 31, 32, -1, -1, -1, 36, -1, 121, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49, ++ 50, 51, 52, 53, 54, -1, 56, 57, 58, 59, ++ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, ++ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, ++ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, ++ 90, 91, 92, 93, 94, 95, -1, 97, -1, 99, ++ 100, -1, -1, 15, -1, 17, 18, -1, -1, -1, ++ -1, 23, 24, -1, 26, 27, -1, -1, -1, 119, ++ 32, -1, 34, 123, -1, 125, 126, -1, 40, -1, ++ -1, -1, -1, 45, 46, 47, -1, -1, -1, -1, ++ 52, -1, -1, -1, -1, 57, -1, 59, -1, 61, ++ -1, 63, -1, -1, -1, -1, -1, -1, 70, 71, ++ -1, -1, -1, 75, -1, -1, -1, 79, 80, 81, ++ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, ++ 15, -1, 17, 18, -1, 97, -1, -1, 23, 24, ++ -1, 26, 27, -1, -1, -1, -1, 32, -1, 34, ++ -1, -1, -1, -1, -1, 40, -1, 119, -1, -1, ++ -1, 46, 47, 125, -1, -1, -1, 52, -1, -1, ++ -1, -1, 57, -1, 59, -1, 61, -1, 63, -1, ++ -1, -1, -1, -1, -1, 70, 71, -1, -1, -1, ++ 75, -1, -1, -1, 79, 80, 81, 82, 83, 84, ++ 85, 86, 87, 88, 89, 90, 22, 23, -1, -1, ++ -1, -1, 97, -1, -1, 31, 32, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 119, -1, -1, -1, -1, -1, ++ 125, 57, -1, 59, -1, 61, -1, 63, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 79, 80, -1, 82, 83, -1, 85, ++ -1, -1, 88, 89, 90, 91, 92, 93, 94, 95, ++ 23, 97, -1, 99, 100, -1, -1, -1, 31, 32, ++ -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 118, 119, -1, -1, -1, 123, -1, 125, ++ 126, 127, 128, -1, 57, -1, 59, -1, 61, -1, ++ 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 23, 79, 80, -1, 82, ++ 83, -1, 85, 31, 32, 88, 89, 90, 91, 92, ++ 93, 94, 95, -1, 97, -1, 99, 100, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, ++ -1, 59, -1, 61, -1, 63, 119, -1, -1, -1, ++ 123, -1, 125, 126, 127, 128, -1, -1, -1, -1, ++ 23, 79, 80, -1, 82, 83, -1, 85, 31, 32, ++ 88, 89, 90, 91, 92, 93, 94, 95, -1, 97, ++ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 57, -1, 59, -1, 61, -1, ++ 63, 119, -1, -1, -1, 123, -1, 125, 126, 127, ++ 128, -1, -1, -1, -1, 23, 79, 80, -1, 82, ++ 83, -1, 85, 31, 32, 88, 89, 90, 91, 92, ++ 93, 94, 95, -1, 97, -1, 99, 100, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, ++ -1, 59, -1, 61, -1, 63, 119, -1, -1, -1, ++ 123, -1, 125, 126, 127, 128, -1, -1, -1, -1, ++ -1, 79, 80, -1, 82, 83, -1, 85, -1, -1, ++ 88, 89, 90, 91, 92, 93, 94, 95, 1, 97, ++ -1, 99, 100, -1, -1, 8, 9, 10, 11, 12, ++ 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 119, 25, -1, -1, 123, -1, 125, 126, -1, ++ -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, ++ -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, ++ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ++ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ++ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, ++ 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, ++ -1, -1, -1, 1, 97, -1, -1, -1, -1, 102, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, 17, ++ -1, -1, -1, -1, 22, -1, -1, 25, -1, -1, ++ -1, 29, -1, -1, -1, -1, -1, -1, 36, 37, ++ -1, -1, -1, -1, -1, 43, -1, 45, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, 55, -1, 57, ++ 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 1, -1, -1, -1, -1, -1, 97, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, 17, ++ -1, -1, -1, -1, 22, -1, -1, 25, -1, -1, ++ -1, 29, -1, -1, -1, -1, -1, -1, 36, 37, ++ -1, -1, -1, -1, -1, 43, -1, 45, -1, -1, ++ 48, 49, 50, 51, 52, -1, 54, 55, -1, 57, ++ 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, -1, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 1, -1, -1, -1, -1, -1, 97, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, -1, ++ -1, -1, -1, -1, 22, -1, -1, 25, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, +- 88, -1, -1, -1, -1, -1, -1, 95, 1, -1, +- -1, -1, 100, 6, 7, 8, 9, 10, -1, -1, +- -1, -1, 15, -1, -1, -1, 19, -1, -1, -1, +- -1, 119, -1, -1, -1, -1, -1, -1, -1, -1, ++ 88, 89, 90, 1, -1, -1, -1, -1, -1, 97, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, -1, ++ 18, -1, -1, -1, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, -1, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, +- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, +- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, -1, 12, -1, 14, +- 15, -1, 95, -1, -1, 20, 21, -1, 23, 24, +- -1, -1, -1, -1, 29, -1, 31, -1, -1, -1, +- -1, -1, 37, -1, -1, -1, 119, 42, 43, 44, +- -1, -1, -1, -1, 49, -1, -1, -1, -1, 54, +- -1, 56, -1, 58, -1, -1, 61, -1, -1, -1, +- -1, -1, -1, 68, 69, -1, -1, -1, 73, -1, +- -1, -1, 77, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, 88, 89, 12, -1, 14, 15, -1, +- 95, -1, -1, 20, 21, -1, 23, 24, -1, -1, +- -1, -1, 29, -1, 31, -1, -1, -1, -1, -1, +- 37, -1, 117, -1, -1, -1, 43, 44, 123, -1, +- -1, -1, 49, -1, -1, -1, -1, 54, -1, 56, +- -1, 58, -1, -1, 61, -1, -1, -1, -1, 19, +- 20, 68, 69, -1, -1, -1, 73, -1, 28, 29, +- 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, +- 87, 88, -1, -1, -1, -1, -1, -1, 95, -1, +- -1, -1, -1, -1, 54, -1, 56, -1, 58, -1, +- -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, +- 117, -1, -1, -1, -1, -1, 123, 77, 78, -1, +- 80, 81, -1, 83, -1, -1, 86, 87, 88, 89, +- 90, 91, 92, 93, 20, 95, -1, 97, 98, -1, +- -1, -1, 28, 29, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, +- -1, 121, -1, 123, 124, -1, 126, 127, 54, -1, +- 56, -1, 58, -1, -1, 61, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 77, 78, -1, 80, 81, -1, 83, -1, -1, +- 86, 87, 88, 89, 90, 91, 92, 93, 20, 95, +- -1, 97, 98, -1, -1, -1, 28, 29, -1, -1, +- 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 117, -1, -1, -1, 121, 122, 123, 124, -1, +- 126, 127, 54, -1, 56, -1, 58, -1, -1, 61, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 77, 78, -1, 80, 81, +- -1, 83, -1, -1, 86, 87, 88, 89, 90, 91, +- 92, 93, 20, 95, -1, 97, 98, -1, -1, -1, +- 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 117, -1, -1, -1, 121, +- -1, 123, 124, -1, 126, 127, 54, -1, 56, -1, +- 58, -1, -1, 61, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, +- 78, -1, 80, 81, -1, 83, -1, -1, 86, 87, +- 88, 89, 90, 91, 92, 93, 20, 95, -1, 97, +- 98, -1, -1, -1, 28, 29, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, +- -1, -1, -1, 121, -1, 123, 124, -1, 126, 127, +- 54, -1, 56, -1, 58, -1, -1, 61, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, 77, 78, -1, 80, 81, -1, 83, +- -1, -1, 86, 87, 88, 89, 90, 91, 92, 93, +- -1, 95, -1, 97, 98, 1, -1, -1, -1, -1, +- 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, +- -1, -1, -1, 117, -1, -1, 22, 121, -1, 123, +- 124, -1, 126, 127, -1, -1, -1, 33, -1, -1, +- -1, -1, -1, -1, -1, -1, 42, -1, -1, 45, +- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, +- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, +- 86, 87, 88, -1, -1, -1, -1, -1, -1, 95, +- 1, -1, -1, -1, 100, 6, 7, 8, 9, 10, +- -1, -1, -1, 14, -1, -1, -1, -1, 19, -1, +- -1, 22, -1, -1, -1, 26, -1, -1, -1, -1, +- -1, -1, 33, 34, -1, -1, -1, -1, -1, 40, +- -1, 42, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, 52, -1, 54, 55, 56, -1, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, +- -1, -1, -1, 14, -1, -1, -1, -1, 19, -1, +- -1, 22, -1, -1, -1, 26, -1, -1, -1, -1, +- -1, -1, 33, 34, -1, -1, -1, -1, -1, 40, +- -1, 42, -1, -1, 45, 46, 47, 48, 49, -1, +- 51, 52, -1, 54, 55, 56, -1, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, +- -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, +- -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, +- -1, -1, -1, -1, 15, -1, -1, -1, 19, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 56, 57, ++ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 1, -1, -1, -1, -1, -1, 97, ++ 8, 9, 10, 11, 12, 13, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, 89, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 56, 57, ++ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 91, 1, -1, -1, -1, -1, 97, ++ -1, 8, 9, 10, 11, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, 89, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 48, 49, 50, 51, 52, 53, 54, -1, 56, ++ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ++ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ++ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, ++ 87, 88, 89, 90, 91, 1, -1, -1, -1, -1, ++ 97, -1, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- 1, -1, -1, -1, 95, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, 9, 10, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 45, 46, 47, 48, 49, 50, +- 51, -1, 53, 54, 55, 56, 57, 58, 59, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, 1, -1, +- -1, -1, -1, 6, 95, -1, -1, 10, -1, -1, +- -1, -1, -1, -1, -1, -1, 19, -1, -1, 22, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 33, -1, -1, -1, -1, -1, -1, 40, -1, 42, +- -1, -1, 45, 46, 47, 48, 49, -1, 51, 52, +- 1, 54, 55, 56, 57, 58, -1, 60, 61, 62, +- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, +- 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, -1, -1, -1, -1, +- -1, -1, 95, -1, 45, 46, 47, 48, 49, 50, +- 51, 1, -1, 54, 55, 56, -1, 58, -1, 60, +- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- -1, -1, -1, -1, 95, 45, 46, 47, 48, 49, +- -1, 51, 1, -1, 54, 55, 56, -1, 58, -1, +- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, +- 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, 88, -1, +- -1, -1, -1, -1, -1, 95, 45, 46, 47, 48, +- 49, -1, 51, 1, -1, 54, 55, 56, -1, 58, +- -1, 60, 61, 62, 63, 64, 65, 66, 67, 68, +- 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, +- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +- -1, -1, -1, -1, -1, -1, 95, 45, 46, 47, +- 48, 49, -1, 51, -1, -1, 54, 55, 56, -1, +- 58, -1, 60, 61, 62, 63, 64, 65, 66, 67, +- 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, +- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 6, 7, 8, 9, 10, -1, 95, -1, -1, +- -1, -1, -1, -1, -1, 20, -1, 22, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, +- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, +- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, +- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, 88, 6, 7, 8, 9, 10, -1, +- 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, 45, 46, 47, 48, 49, 50, 51, +- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, -1, ++ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, 1, -1, -1, -1, -1, ++ -1, 97, 8, -1, -1, -1, -1, 13, -1, -1, ++ -1, -1, -1, -1, -1, -1, 22, -1, -1, 25, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 36, -1, -1, -1, -1, -1, -1, 43, -1, 45, ++ -1, -1, 48, 49, 50, 51, 52, 1, 54, 55, ++ -1, 57, 58, 59, 60, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, ++ -1, 97, -1, -1, 48, 49, 50, 51, 52, 53, ++ 54, 1, -1, 57, 58, 59, -1, 61, 62, 63, ++ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ++ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ++ 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, ++ -1, -1, -1, 97, -1, 1, -1, -1, 48, 49, ++ 50, 51, 52, -1, 54, -1, -1, 57, 58, 59, ++ -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, ++ 70, 71, 72, 73, 74, 75, -1, 77, 78, 79, ++ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, ++ 90, -1, 48, 49, 50, 51, 52, 97, 54, 1, ++ -1, 57, 58, 59, -1, 61, 62, 63, 64, 65, ++ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, ++ -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, ++ -1, 97, -1, -1, -1, -1, 48, 49, 50, 51, ++ 52, -1, 54, -1, -1, 57, 58, 59, -1, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, +- 82, 83, 84, 85, 86, 87, 88, 6, 7, 8, +- 9, 10, -1, 95, -1, -1, -1, -1, -1, -1, +- -1, 20, -1, 22, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 45, 46, 47, 48, +- 49, 50, 51, -1, 53, 54, 55, 56, 57, 58, ++ 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, ++ 82, 83, 84, 85, 86, 87, 88, 89, 90, 8, ++ 9, 10, 11, 12, 13, 97, -1, -1, -1, -1, ++ -1, -1, -1, -1, 23, -1, 25, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, ++ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +- 6, 7, 8, 9, 10, -1, 95, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, +- 46, 47, 48, 49, 50, 51, -1, 53, 54, 55, ++ 89, 90, 8, 9, 10, 11, 12, 13, 97, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, +- 86, 87, 88, 6, 7, 8, 9, 10, -1, 95, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, 52, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ++ 86, 87, 88, 89, 90, 8, 9, 10, 11, 12, ++ 13, 97, -1, -1, -1, -1, -1, -1, -1, -1, ++ 23, -1, 25, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, ++ 53, 54, -1, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, 6, 7, 8, 9, +- 10, -1, 95, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 45, 46, 47, 48, 49, +- 50, 51, -1, 53, 54, 55, 56, 57, 58, 59, ++ 83, 84, 85, 86, 87, 88, 89, 90, 8, 9, ++ 10, 11, 12, 13, 97, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49, ++ 50, 51, 52, 53, 54, -1, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, +- 6, 7, 8, 9, 10, 95, -1, -1, -1, 15, ++ 90, 8, 9, 10, 11, 12, 13, 97, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, +- 46, 47, 48, 49, 50, 51, -1, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, +- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, +- 86, 87, 88, 6, 7, 8, 9, 10, -1, 95, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 48, 49, 50, 51, 52, 53, 54, 55, 56, ++ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ++ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ++ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, ++ 87, 88, 89, 90, 8, 9, 10, 11, 12, 13, ++ 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 45, 46, 47, 48, 49, 50, 51, -1, +- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, +- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, +- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, +- 83, 84, 85, 86, 87, 88, 6, 7, 8, 9, +- 10, -1, 95, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, ++ 54, -1, 56, 57, 58, 59, 60, 61, 62, 63, ++ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ++ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ++ 84, 85, 86, 87, 88, 89, 90, 91, -1, -1, ++ -1, -1, -1, 97, 8, 9, 10, 11, 12, 13, ++ -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 45, 46, 47, 48, 49, +- 50, 51, -1, 53, 54, 55, 56, 57, 58, 59, +- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, +- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, 88, 6, +- 7, 8, 9, 10, -1, 95, -1, -1, -1, -1, ++ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, ++ 54, -1, 56, 57, 58, 59, 60, 61, 62, 63, ++ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ++ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ++ 84, 85, 86, 87, 88, 89, 90, 8, 9, 10, ++ 11, 12, 13, 97, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, +- 47, 48, 49, 50, 51, -1, 53, 54, 55, 56, +- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, +- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, +- 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, +- 87, 88, -1, -1, -1, -1, -1, -1, 95, 45, +- 46, 47, 48, 49, 50, 51, -1, -1, 54, 55, +- 56, -1, 58, -1, 60, 61, 62, 63, 64, 65, +- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, +- 86, 87, 88, -1, 45, 46, 47, 48, 49, 95, +- 51, -1, -1, 54, 55, 56, -1, 58, -1, 60, ++ -1, -1, -1, -1, -1, -1, -1, 48, 49, 50, ++ 51, 52, 53, 54, -1, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, +- 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, +- 81, 82, 83, 84, 85, 86, 87, 88, -1, -1, +- -1, -1, -1, -1, 95 ++ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, ++ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, ++ 8, 9, 10, 11, 12, 13, 97, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 48, 49, 50, 51, 52, 53, 54, -1, 56, 57, ++ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, 8, 9, 10, 11, 12, 13, 97, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 48, 49, 50, 51, 52, 53, 54, ++ -1, 56, 57, 58, 59, 60, 61, 62, 63, 64, ++ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ++ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, ++ 85, 86, 87, 88, 89, 90, 8, 9, 10, 11, ++ 12, 13, 97, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51, ++ 52, 53, 54, -1, 56, 57, 58, 59, 60, 61, ++ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, ++ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ++ 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, ++ 48, 49, 50, 51, 52, 97, 54, -1, -1, 57, ++ 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, ++ 68, 69, 70, 71, 72, 73, 74, 75, -1, 77, ++ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ++ 88, 89, 90, -1, -1, -1, -1, -1, -1, 97 + }; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ + static const unsigned short yystos[] = + { +- 0, 35, 70, 83, 134, 135, 138, 147, 154, 159, +- 162, 1, 6, 7, 8, 9, 10, 45, 46, 47, +- 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, +- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, +- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, +- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +- 95, 412, 413, 415, 416, 417, 420, 412, 0, 50, +- 164, 269, 431, 150, 412, 117, 182, 431, 182, 116, +- 117, 136, 116, 159, 162, 9, 83, 163, 182, 183, +- 184, 412, 116, 116, 164, 52, 270, 271, 412, 431, +- 194, 195, 412, 116, 155, 151, 153, 116, 1, 119, +- 429, 1, 118, 83, 118, 119, 96, 117, 131, 428, +- 139, 57, 160, 163, 83, 157, 170, 171, 164, 412, +- 1, 412, 148, 271, 20, 28, 29, 54, 56, 58, +- 61, 77, 78, 80, 81, 83, 86, 87, 88, 89, +- 90, 91, 92, 93, 97, 98, 117, 121, 123, 124, +- 126, 127, 240, 373, 374, 377, 380, 381, 382, 383, +- 384, 386, 388, 389, 390, 391, 394, 398, 401, 402, +- 418, 419, 420, 373, 419, 6, 7, 8, 10, 22, +- 26, 33, 137, 140, 142, 143, 197, 289, 292, 293, +- 294, 196, 199, 412, 170, 156, 158, 116, 1, 125, +- 430, 194, 194, 412, 117, 393, 117, 117, 359, 360, +- 431, 117, 373, 122, 373, 399, 400, 381, 95, 116, +- 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, +- 127, 128, 129, 130, 131, 132, 387, 117, 119, 25, +- 31, 65, 73, 97, 98, 102, 104, 105, 106, 108, +- 109, 110, 111, 126, 127, 130, 131, 132, 403, 404, +- 405, 406, 12, 16, 27, 47, 68, 69, 112, 113, +- 114, 115, 128, 129, 407, 408, 409, 48, 60, 419, +- 66, 107, 386, 93, 121, 123, 124, 125, 427, 117, +- 118, 119, 377, 381, 118, 12, 16, 25, 27, 31, +- 97, 98, 102, 104, 105, 106, 107, 126, 127, 128, +- 129, 130, 132, 301, 405, 408, 411, 412, 428, 412, +- 412, 198, 199, 412, 1, 89, 205, 206, 208, 412, +- 412, 14, 319, 144, 423, 116, 1, 116, 83, 200, +- 430, 157, 1, 186, 187, 416, 152, 167, 165, 390, +- 117, 362, 363, 373, 240, 390, 395, 117, 395, 119, +- 99, 1, 118, 122, 373, 11, 375, 374, 377, 377, +- 376, 39, 378, 380, 380, 379, 225, 419, 225, 381, +- 381, 381, 1, 373, 396, 397, 412, 119, 392, 1, +- 94, 361, 373, 373, 117, 306, 431, 125, 125, 1, +- 116, 118, 125, 306, 1, 116, 118, 125, 306, 421, +- 430, 40, 42, 52, 145, 296, 299, 431, 199, 199, +- 63, 117, 201, 431, 430, 1, 116, 188, 428, 170, +- 168, 169, 172, 197, 289, 22, 33, 144, 149, 166, +- 197, 288, 293, 119, 373, 1, 118, 119, 120, 361, +- 119, 373, 400, 1, 400, 119, 377, 377, 380, 380, +- 99, 1, 118, 122, 361, 359, 118, 119, 119, 1, +- 22, 33, 52, 83, 100, 119, 183, 307, 308, 309, +- 310, 425, 431, 304, 412, 428, 431, 412, 412, 199, +- 199, 412, 302, 303, 428, 431, 206, 1, 206, 412, +- 12, 15, 21, 23, 24, 29, 31, 37, 42, 43, +- 44, 49, 68, 69, 73, 79, 82, 84, 85, 123, +- 207, 208, 319, 320, 321, 322, 323, 324, 325, 326, +- 327, 330, 332, 334, 342, 345, 348, 352, 354, 357, +- 358, 364, 390, 410, 419, 146, 1, 185, 261, 262, +- 416, 1, 209, 210, 416, 53, 54, 56, 61, 74, +- 75, 76, 269, 290, 297, 300, 117, 1, 203, 204, +- 412, 25, 202, 431, 187, 1, 187, 194, 83, 117, +- 189, 190, 430, 144, 34, 173, 174, 176, 412, 412, +- 9, 161, 116, 119, 363, 1, 363, 373, 429, 373, +- 397, 1, 397, 429, 119, 1, 373, 119, 412, 412, +- 183, 119, 120, 1, 116, 119, 42, 183, 1, 120, +- 305, 321, 432, 412, 306, 306, 306, 305, 412, 306, +- 373, 389, 390, 207, 419, 371, 373, 343, 262, 346, +- 1, 328, 329, 372, 373, 83, 365, 117, 373, 117, +- 390, 120, 116, 422, 324, 322, 11, 353, 118, 429, +- 359, 1, 211, 212, 414, 415, 416, 118, 424, 262, +- 210, 424, 428, 384, 385, 431, 116, 373, 116, 116, +- 116, 141, 299, 116, 203, 1, 118, 119, 101, 193, +- 431, 373, 165, 1, 191, 192, 412, 425, 117, 14, +- 19, 19, 34, 176, 139, 19, 295, 296, 299, 120, +- 306, 306, 120, 311, 13, 32, 40, 223, 225, 240, +- 255, 312, 313, 317, 318, 308, 1, 100, 308, 183, +- 120, 224, 225, 302, 30, 25, 103, 356, 428, 39, +- 421, 421, 1, 17, 118, 120, 117, 373, 362, 322, +- 19, 333, 355, 356, 431, 94, 361, 1, 116, 117, +- 215, 424, 416, 120, 120, 370, 373, 83, 116, 116, +- 142, 291, 119, 204, 1, 204, 412, 19, 1, 118, +- 119, 99, 193, 412, 191, 17, 17, 14, 59, 173, +- 180, 430, 373, 302, 312, 30, 121, 30, 13, 119, +- 311, 312, 305, 335, 373, 373, 331, 320, 371, 329, +- 322, 1, 329, 412, 388, 1, 429, 322, 373, 359, +- 429, 212, 1, 212, 1, 183, 216, 217, 1, 428, +- 428, 218, 220, 423, 218, 116, 298, 74, 53, 319, +- 192, 1, 192, 412, 193, 119, 175, 177, 178, 179, +- 178, 305, 318, 315, 316, 412, 373, 121, 1, 253, +- 254, 339, 340, 370, 350, 1, 18, 34, 351, 322, +- 41, 347, 119, 120, 429, 119, 120, 1, 116, 119, +- 213, 214, 218, 263, 269, 13, 20, 22, 33, 36, +- 38, 51, 67, 93, 117, 123, 124, 221, 222, 223, +- 224, 225, 228, 229, 231, 232, 234, 235, 236, 239, +- 240, 242, 243, 255, 373, 419, 427, 432, 96, 373, +- 373, 385, 116, 322, 322, 320, 55, 1, 116, 122, +- 99, 316, 1, 118, 120, 1, 116, 426, 1, 99, +- 17, 373, 344, 17, 366, 367, 368, 384, 431, 225, +- 217, 1, 217, 218, 46, 256, 431, 71, 96, 103, +- 272, 273, 431, 45, 273, 274, 121, 121, 241, 431, +- 306, 306, 1, 15, 183, 244, 245, 246, 247, 30, +- 222, 224, 233, 234, 240, 412, 1, 54, 56, 58, +- 61, 77, 78, 80, 81, 83, 86, 87, 88, 230, +- 412, 420, 233, 240, 95, 233, 235, 373, 117, 121, +- 226, 99, 52, 276, 277, 116, 116, 116, 116, 116, +- 181, 316, 1, 316, 30, 412, 122, 254, 1, 254, +- 341, 340, 1, 340, 336, 370, 1, 370, 421, 349, +- 371, 322, 119, 120, 118, 117, 273, 62, 1, 276, +- 1, 275, 264, 431, 1, 223, 225, 228, 237, 238, +- 238, 30, 305, 19, 228, 248, 249, 412, 419, 120, +- 19, 1, 116, 426, 219, 220, 119, 1, 118, 119, +- 99, 1, 227, 373, 373, 373, 233, 267, 431, 117, +- 121, 278, 279, 284, 373, 320, 13, 225, 313, 314, +- 120, 30, 421, 11, 64, 337, 338, 322, 17, 422, +- 422, 366, 368, 373, 117, 257, 431, 373, 116, 1, +- 118, 122, 122, 219, 30, 120, 219, 246, 1, 246, +- 247, 412, 1, 412, 373, 1, 118, 119, 122, 116, +- 1, 117, 278, 280, 281, 283, 284, 286, 287, 373, +- 383, 401, 402, 412, 431, 1, 285, 286, 225, 225, +- 322, 19, 421, 422, 421, 119, 120, 119, 1, 225, +- 1, 258, 259, 431, 53, 74, 265, 268, 269, 238, +- 238, 30, 1, 251, 252, 253, 225, 249, 373, 1, +- 373, 268, 280, 119, 1, 116, 118, 282, 282, 120, +- 383, 383, 122, 1, 116, 122, 422, 320, 322, 369, +- 384, 119, 119, 19, 7, 8, 22, 33, 46, 50, +- 72, 83, 183, 260, 269, 385, 373, 219, 1, 116, +- 426, 120, 119, 283, 286, 283, 283, 278, 286, 383, +- 401, 402, 286, 422, 422, 118, 119, 412, 412, 412, +- 412, 373, 120, 116, 83, 252, 252, 250, 338, 117, +- 383, 383, 384, 306, 306, 306, 306, 219, 266, 117, +- 244, 302, 373, 244, 119, 305, 119, 116, 426 ++ 0, 38, 72, 85, 135, 136, 139, 148, 155, 160, ++ 163, 1, 8, 9, 10, 11, 12, 13, 48, 49, ++ 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, ++ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, ++ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, ++ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, ++ 97, 419, 420, 422, 423, 424, 427, 419, 0, 53, ++ 165, 275, 438, 151, 419, 119, 183, 438, 183, 118, ++ 119, 137, 118, 160, 163, 11, 85, 164, 183, 184, ++ 185, 419, 118, 118, 165, 55, 276, 277, 419, 438, ++ 196, 199, 419, 118, 156, 152, 154, 118, 1, 121, ++ 436, 1, 120, 85, 120, 121, 98, 119, 132, 435, ++ 60, 197, 140, 161, 164, 85, 158, 171, 172, 165, ++ 419, 1, 419, 149, 277, 23, 31, 32, 57, 59, ++ 61, 63, 79, 80, 82, 83, 85, 88, 89, 90, ++ 91, 92, 93, 94, 95, 99, 100, 119, 123, 125, ++ 126, 127, 128, 246, 379, 380, 383, 386, 387, 388, ++ 389, 390, 392, 394, 395, 396, 397, 398, 401, 405, ++ 408, 409, 425, 426, 427, 379, 426, 198, 8, 9, ++ 10, 13, 25, 29, 36, 138, 141, 143, 144, 201, ++ 295, 298, 299, 300, 171, 157, 159, 118, 1, 4, ++ 437, 199, 199, 419, 119, 400, 119, 119, 365, 366, ++ 438, 119, 379, 124, 379, 406, 407, 387, 4, 97, ++ 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, ++ 128, 129, 130, 131, 132, 133, 393, 119, 121, 28, ++ 34, 67, 75, 99, 100, 104, 106, 107, 108, 110, ++ 111, 112, 113, 127, 128, 131, 132, 133, 410, 411, ++ 412, 413, 15, 19, 30, 50, 70, 71, 114, 115, ++ 116, 117, 129, 130, 414, 415, 416, 51, 62, 426, ++ 68, 109, 392, 4, 95, 123, 125, 126, 434, 119, ++ 120, 121, 383, 387, 4, 120, 200, 204, 419, 15, ++ 19, 28, 30, 34, 99, 100, 104, 106, 107, 108, ++ 109, 127, 128, 129, 130, 131, 133, 307, 412, 415, ++ 418, 419, 435, 419, 419, 202, 419, 1, 91, 210, ++ 211, 213, 419, 419, 17, 325, 145, 430, 118, 437, ++ 158, 1, 187, 188, 423, 153, 168, 166, 396, 119, ++ 368, 369, 379, 246, 396, 402, 119, 402, 121, 101, ++ 1, 120, 124, 379, 14, 381, 380, 383, 383, 382, ++ 42, 384, 386, 386, 385, 230, 231, 426, 230, 387, ++ 387, 387, 419, 1, 379, 403, 404, 121, 399, 1, ++ 96, 367, 379, 419, 379, 1, 118, 85, 205, 119, ++ 312, 438, 4, 4, 203, 204, 4, 312, 1, 118, ++ 120, 4, 312, 428, 437, 43, 45, 55, 146, 302, ++ 305, 438, 437, 1, 118, 189, 435, 171, 169, 170, ++ 173, 201, 295, 25, 36, 145, 150, 167, 201, 294, ++ 299, 121, 379, 1, 120, 121, 122, 367, 121, 379, ++ 407, 1, 407, 121, 383, 383, 386, 386, 4, 101, ++ 1, 120, 124, 367, 365, 120, 121, 121, 204, 204, ++ 65, 119, 206, 438, 1, 25, 36, 55, 85, 102, ++ 121, 184, 313, 314, 315, 316, 432, 438, 310, 419, ++ 435, 438, 419, 419, 1, 118, 120, 419, 308, 309, ++ 435, 438, 211, 1, 211, 419, 15, 18, 24, 26, ++ 27, 32, 34, 40, 45, 46, 47, 52, 70, 71, ++ 75, 81, 84, 86, 87, 125, 212, 213, 325, 326, ++ 327, 328, 329, 330, 331, 332, 333, 336, 338, 340, ++ 348, 351, 354, 358, 360, 363, 364, 370, 396, 417, ++ 426, 147, 1, 186, 267, 268, 423, 1, 214, 215, ++ 423, 56, 57, 59, 63, 76, 77, 78, 275, 296, ++ 303, 306, 188, 1, 188, 199, 85, 119, 190, 191, ++ 437, 145, 37, 174, 175, 177, 419, 419, 11, 162, ++ 118, 121, 369, 1, 369, 379, 436, 426, 379, 404, ++ 1, 404, 436, 121, 1, 379, 119, 1, 208, 209, ++ 419, 28, 207, 438, 121, 419, 419, 184, 121, 122, ++ 1, 118, 121, 45, 184, 1, 122, 311, 327, 439, ++ 419, 312, 312, 204, 204, 312, 311, 419, 312, 379, ++ 395, 396, 212, 426, 377, 379, 349, 268, 352, 1, ++ 334, 335, 378, 379, 85, 371, 119, 379, 119, 396, ++ 122, 118, 429, 330, 328, 14, 359, 120, 436, 365, ++ 1, 216, 217, 421, 422, 423, 120, 431, 268, 215, ++ 431, 435, 390, 391, 438, 118, 379, 118, 118, 118, ++ 197, 305, 118, 166, 1, 192, 193, 194, 419, 432, ++ 119, 17, 22, 22, 37, 177, 197, 22, 301, 302, ++ 305, 122, 208, 1, 120, 121, 103, 195, 438, 379, ++ 312, 312, 122, 317, 16, 35, 43, 228, 230, 246, ++ 261, 318, 319, 323, 324, 314, 1, 102, 314, 184, ++ 122, 229, 230, 308, 33, 28, 105, 362, 435, 42, ++ 428, 428, 1, 20, 120, 122, 119, 379, 368, 328, ++ 22, 339, 361, 362, 438, 96, 367, 1, 118, 119, ++ 220, 431, 423, 122, 122, 376, 379, 85, 118, 118, ++ 142, 22, 1, 120, 121, 101, 195, 4, 194, 192, ++ 20, 20, 140, 437, 379, 121, 209, 1, 209, 419, ++ 308, 318, 33, 123, 33, 16, 121, 317, 318, 311, ++ 341, 379, 379, 337, 326, 377, 335, 328, 1, 335, ++ 419, 394, 1, 436, 328, 379, 365, 436, 217, 1, ++ 217, 1, 184, 221, 222, 1, 435, 435, 223, 225, ++ 430, 223, 118, 304, 76, 56, 143, 297, 193, 1, ++ 193, 194, 419, 195, 121, 176, 178, 12, 17, 174, ++ 181, 311, 324, 321, 322, 419, 379, 123, 1, 259, ++ 260, 345, 346, 376, 356, 1, 21, 37, 357, 328, ++ 44, 353, 121, 122, 436, 121, 122, 1, 118, 121, ++ 218, 219, 223, 269, 275, 16, 23, 25, 36, 39, ++ 41, 54, 69, 95, 119, 125, 126, 226, 227, 228, ++ 229, 230, 234, 235, 237, 238, 240, 241, 242, 245, ++ 246, 248, 249, 261, 379, 426, 434, 439, 98, 379, ++ 379, 391, 325, 328, 328, 179, 180, 179, 1, 118, ++ 124, 101, 322, 1, 120, 122, 1, 118, 433, 1, ++ 101, 20, 379, 350, 20, 372, 373, 374, 390, 438, ++ 230, 222, 1, 222, 223, 49, 262, 438, 73, 98, ++ 105, 278, 279, 438, 48, 279, 280, 123, 123, 247, ++ 438, 312, 312, 1, 18, 184, 250, 251, 252, 253, ++ 33, 227, 229, 239, 240, 246, 419, 1, 57, 59, ++ 61, 63, 79, 80, 82, 83, 85, 88, 89, 90, ++ 236, 419, 427, 239, 246, 97, 239, 241, 379, 119, ++ 123, 232, 101, 4, 55, 282, 283, 118, 118, 118, ++ 118, 118, 118, 58, 326, 322, 1, 322, 33, 419, ++ 124, 260, 1, 260, 347, 346, 1, 346, 342, 376, ++ 1, 376, 428, 355, 377, 328, 121, 122, 120, 119, ++ 279, 64, 1, 282, 1, 281, 270, 438, 1, 228, ++ 230, 234, 243, 244, 244, 33, 311, 22, 234, 254, ++ 255, 419, 426, 122, 22, 1, 118, 433, 224, 225, ++ 121, 1, 120, 121, 101, 1, 233, 379, 379, 379, ++ 239, 273, 438, 119, 123, 284, 285, 290, 379, 182, ++ 16, 230, 319, 320, 122, 33, 428, 14, 66, 343, ++ 344, 328, 20, 429, 429, 372, 374, 379, 119, 263, ++ 438, 379, 118, 1, 120, 124, 124, 224, 33, 122, ++ 224, 252, 1, 252, 253, 419, 1, 419, 379, 1, ++ 120, 121, 124, 118, 1, 119, 284, 286, 287, 289, ++ 290, 292, 293, 379, 389, 408, 409, 419, 438, 1, ++ 291, 292, 326, 230, 230, 328, 22, 428, 429, 428, ++ 121, 122, 121, 1, 230, 1, 264, 265, 438, 56, ++ 76, 271, 274, 275, 244, 244, 33, 1, 257, 258, ++ 259, 230, 255, 379, 1, 379, 274, 286, 121, 1, ++ 118, 120, 288, 288, 122, 389, 389, 124, 1, 118, ++ 124, 429, 326, 328, 375, 390, 121, 121, 22, 9, ++ 10, 25, 36, 49, 53, 74, 85, 184, 266, 275, ++ 391, 379, 224, 1, 118, 433, 122, 121, 289, 292, ++ 289, 289, 284, 292, 389, 408, 409, 292, 429, 429, ++ 120, 121, 419, 419, 419, 419, 379, 122, 118, 85, ++ 258, 258, 256, 344, 119, 389, 389, 390, 312, 312, ++ 312, 312, 224, 272, 119, 250, 308, 379, 250, 121, ++ 311, 121, 118, 433 + }; + + +@@ -4645,12 +4811,12 @@ + switch (yyn) + { + case 2: +-#line 236 "parse.y" ++#line 253 "parse.y" + { error ("empty input file"); ;} + break; + + case 3: +-#line 238 "parse.y" ++#line 255 "parse.y" + { + if (co->ignore_garbage_after_dot) + { +@@ -4661,146 +4827,146 @@ + break; + + case 4: +-#line 249 "parse.y" +- { initialize_module (TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype), build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype ? TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) : NULL_TREE, TREE_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)), 0); ;} ++#line 266 "parse.y" ++ { initialize_module (TREE_PURPOSE (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype), build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype ? TREE_PURPOSE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) : NULL_TREE, TREE_VALUE (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)), 0); ;} + break; + + case 5: +-#line 251 "parse.y" ++#line 268 "parse.y" + { start_main_program (); ;} + break; + + case 6: +-#line 253 "parse.y" ++#line 270 "parse.y" + { finish_main_program (); ;} + break; + + case 7: +-#line 255 "parse.y" ++#line 272 "parse.y" + { finalize_module (0); ;} + break; + + case 8: +-#line 260 "parse.y" ++#line 277 "parse.y" + { (*yyvalp).ttype = build_tree_list (NULL_TREE, NULL_TREE); ;} + break; + + case 9: +-#line 262 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 279 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 10: +-#line 264 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 281 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 11: +-#line 269 "parse.y" ++#line 286 "parse.y" + { (*yyvalp).itype = 2 * od_none; ;} + break; + + case 12: +-#line 271 "parse.y" +- { (*yyvalp).itype = check_decl_order (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++#line 288 "parse.y" ++ { (*yyvalp).itype = check_decl_order (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} + break; + + case 15: +-#line 281 "parse.y" ++#line 298 "parse.y" + { (*yyvalp).itype = 2 * od_none; ;} + break; + + case 16: +-#line 283 "parse.y" +- { (*yyvalp).itype = check_decl_order (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++#line 300 "parse.y" ++ { (*yyvalp).itype = check_decl_order (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} + break; + + case 17: +-#line 287 "parse.y" ++#line 304 "parse.y" + { check_forward_decls (0); ;} + break; + + case 18: +-#line 289 "parse.y" +- { (*yyvalp).itype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype; ;} ++#line 306 "parse.y" ++ { (*yyvalp).itype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype; ;} + break; + + case 19: +-#line 291 "parse.y" ++#line 308 "parse.y" + { (*yyvalp).itype = od_label; ;} + break; + + case 20: +-#line 293 "parse.y" ++#line 310 "parse.y" + { (*yyvalp).itype = od_routine; ;} + break; + + case 21: +-#line 298 "parse.y" ++#line 315 "parse.y" + { + #ifndef EGCS97 + pop_obstacks (); + #endif +- (*yyvalp).itype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype; ++ (*yyvalp).itype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype; + ;} + break; + + case 22: +-#line 308 "parse.y" ++#line 325 "parse.y" + { (*yyvalp).itype = od_const; ;} + break; + + case 23: +-#line 310 "parse.y" ++#line 327 "parse.y" + { current_type_list = build_tree_list (NULL_TREE, NULL_TREE); ;} + break; + + case 24: +-#line 312 "parse.y" ++#line 329 "parse.y" + { declare_types (); (*yyvalp).itype = od_type; ;} + break; + + case 25: +-#line 314 "parse.y" ++#line 331 "parse.y" + { (*yyvalp).itype = od_var; ;} + break; + + case 26: +-#line 319 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_interface); initialize_module (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 1); ;} ++#line 336 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_interface); initialize_module (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + + case 27: +-#line 321 "parse.y" ++#line 338 "parse.y" + { start_unit_implementation (); ;} + break; + + case 28: +-#line 323 "parse.y" ++#line 340 "parse.y" + { check_forward_decls (1); ;} + break; + + case 31: +-#line 327 "parse.y" ++#line 344 "parse.y" + { (*yyvalp).ttype = current_module->name; finalize_module (1); ;} + break; + + case 32: +-#line 329 "parse.y" ++#line 346 "parse.y" + { +- if (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype && current_module->name != ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype) ++ if (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype && current_module->name != yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype) + error ("implementation of module `%s' after interface of module `%s'", +- IDENTIFIER_NAME (current_module->name), IDENTIFIER_NAME (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ IDENTIFIER_NAME (current_module->name), IDENTIFIER_NAME (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + ;} + break; + + case 33: +-#line 335 "parse.y" +- { initialize_module (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2); ;} ++#line 352 "parse.y" ++ { initialize_module (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2); ;} + break; + + case 34: +-#line 337 "parse.y" ++#line 354 "parse.y" + { + if (co->interface_only) + exit_compilation (); +@@ -4808,442 +4974,453 @@ + break; + + case 36: +-#line 343 "parse.y" +- { initialize_module (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 4); ;} ++#line 360 "parse.y" ++ { initialize_module (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 4); ;} + break; + + case 38: +-#line 349 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_interface); ;} ++#line 366 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_interface); ;} + break; + + case 39: +-#line 351 "parse.y" +- { initialize_module (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2); ;} ++#line 368 "parse.y" ++ { initialize_module (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2); ;} + break; + + case 40: +-#line 353 "parse.y" ++#line 370 "parse.y" + { clear_forward_decls (); /* don't complain in poplevel */ ;} + break; + + case 41: +-#line 358 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_export); start_module_interface (); ;} ++#line 375 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_export); start_module_interface (); ;} + break; + + case 42: +-#line 360 "parse.y" ++#line 377 "parse.y" + { create_gpi_files (); ;} + break; + + case 43: +-#line 365 "parse.y" +- { initialize_module (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE, 3); ;} ++#line 382 "parse.y" ++ { initialize_module (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE, 3); ;} + break; + + case 45: +-#line 370 "parse.y" ++#line 387 "parse.y" + { chk_dialect ("units without `implementation' part are", U_M_PASCAL); ;} + break; + + case 46: +-#line 371 "parse.y" ++#line 388 "parse.y" + { ;} + break; + + case 47: +-#line 376 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_module); ;} ++#line 393 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_module); ;} + break; + + case 48: +-#line 381 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype ? TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) : NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++#line 398 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype ? TREE_PURPOSE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) : NULL_TREE, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 51: +-#line 391 "parse.y" ++#line 408 "parse.y" + { (*yyvalp).itype = 2 * od_none; ;} + break; + + case 52: +-#line 393 "parse.y" +- { (*yyvalp).itype = check_decl_order (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++#line 410 "parse.y" ++ { (*yyvalp).itype = check_decl_order (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} + break; + + case 55: +-#line 400 "parse.y" ++#line 417 "parse.y" + { (*yyvalp).itype = od_routine; ;} + break; + + case 56: +-#line 405 "parse.y" ++#line 422 "parse.y" + { (*yyvalp).itype = 2 * od_none; ;} + break; + + case 57: +-#line 407 "parse.y" +- { (*yyvalp).itype = check_decl_order (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++#line 424 "parse.y" ++ { (*yyvalp).itype = check_decl_order (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} + break; + + case 59: +-#line 412 "parse.y" ++#line 429 "parse.y" + { check_forward_decls (0); ;} + break; + + case 60: +-#line 414 "parse.y" +- { (*yyvalp).itype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype; ;} ++#line 431 "parse.y" ++ { (*yyvalp).itype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype; ;} + break; + + case 61: +-#line 416 "parse.y" ++#line 433 "parse.y" + { (*yyvalp).itype = od_routine; ;} + break; + + case 62: +-#line 420 "parse.y" ++#line 437 "parse.y" + { current_module->implementation = 1; ;} + break; + + case 63: +-#line 422 "parse.y" ++#line 439 "parse.y" + { check_forward_decls (1); ;} + break; + + case 69: +-#line 435 "parse.y" ++#line 452 "parse.y" + { chk_dialect_name ("to begin do", E_O_PASCAL); start_constructor (0); ;} + break; + + case 70: +-#line 437 "parse.y" ++#line 454 "parse.y" + { finish_constructor (); ;} + break; + + case 71: +-#line 442 "parse.y" ++#line 459 "parse.y" + { chk_dialect_name ("to end do", E_O_PASCAL); start_destructor (); ;} + break; + + case 72: +-#line 444 "parse.y" ++#line 461 "parse.y" + { finish_destructor (); ;} + break; + + case 73: +-#line 448 "parse.y" ++#line 465 "parse.y" + { start_constructor (0); ;} + break; + + case 74: +-#line 450 "parse.y" ++#line 467 "parse.y" + { finish_constructor (); ;} + break; + + case 76: +-#line 455 "parse.y" ++#line 472 "parse.y" + { ;} + break; + + case 77: +-#line 457 "parse.y" ++#line 474 "parse.y" + { start_destructor (); ;} + break; + + case 78: +-#line 459 "parse.y" ++#line 476 "parse.y" + { finish_destructor (); ;} + break; + + case 81: +-#line 466 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++#line 483 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + + case 82: +-#line 471 "parse.y" +- { (*yyvalp).ttype = nreverse (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 488 "parse.y" ++ { (*yyvalp).ttype = nreverse (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 83: +-#line 476 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 493 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 84: +-#line 478 "parse.y" +- { (*yyvalp).ttype = tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++#line 495 "parse.y" ++ { (*yyvalp).ttype = tree_cons (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 85: +-#line 480 "parse.y" ++#line 497 "parse.y" + { +- (*yyvalp).ttype = tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); +- error ("comma missing after `%s'", IDENTIFIER_NAME (TREE_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype))); ++ (*yyvalp).ttype = tree_cons (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ++ error ("comma missing after `%s'", IDENTIFIER_NAME (TREE_VALUE (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype))); + yyerrok; + ;} + break; + + case 86: +-#line 486 "parse.y" ++#line 503 "parse.y" + { error ("extra comma following identifier list"); ;} + break; + + case 88: +-#line 492 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 509 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 89: +-#line 494 "parse.y" +- { (*yyvalp).ttype = tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++#line 511 "parse.y" ++ { (*yyvalp).ttype = tree_cons (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 91: +-#line 500 "parse.y" ++#line 517 "parse.y" + { yyerrok; ;} + break; + + case 92: +-#line 502 "parse.y" ++#line 519 "parse.y" + { error ("module specifications need an export part"); ;} + break; + + case 93: +-#line 504 "parse.y" ++#line 521 "parse.y" + { warning ("missing semicolon"); yyerrok; ;} + break; + + case 94: +-#line 506 "parse.y" ++#line 523 "parse.y" + { error ("extra semicolon"); ;} + break; + + case 95: +-#line 511 "parse.y" +- { export_interface (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 528 "parse.y" ++ { export_interface (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 96: +-#line 516 "parse.y" ++#line 533 "parse.y" + { error ("missing `='"); ;} + break; + + case 98: +-#line 522 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++#line 539 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + + case 100: +-#line 525 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 542 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 101: +-#line 530 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_all); (*yyvalp).ttype = build_tree_list (NULL_TREE, NULL_TREE); ;} ++#line 547 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_all); (*yyvalp).ttype = build_tree_list (NULL_TREE, NULL_TREE); ;} + break; + + case 103: +-#line 536 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 553 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 104: +-#line 538 "parse.y" ++#line 555 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + + case 105: +-#line 540 "parse.y" ++#line 557 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + + case 106: +-#line 542 "parse.y" ++#line 559 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + + case 107: +-#line 547 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 564 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 108: +-#line 549 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++#line 566 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, build_tree_list (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + + case 109: +-#line 551 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); TREE_READONLY ((*yyvalp).ttype) = 1; ;} ++#line 568 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); TREE_READONLY ((*yyvalp).ttype) = 1; ;} + break; + + case 111: +-#line 557 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} +- break; +- +- case 112: +-#line 562 "parse.y" +- { do_extra_import (); ;} ++#line 574 "parse.y" ++ { (*yyvalp).ttype = build_qualified_id (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype,yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype);;} + break; + + case 113: +-#line 563 "parse.y" +- { do_extra_import (); ;} ++#line 580 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 117: +-#line 571 "parse.y" +- { warning ("missing semicolon"); yyerrok; ;} ++ case 114: ++#line 586 "parse.y" ++ { do_extra_import (); ;} + break; + +- case 118: +-#line 576 "parse.y" +- { (*yyvalp).itype = od_uses; ;} ++ case 116: ++#line 592 "parse.y" ++ { in_uses = 0 ;} + break; + + case 121: +-#line 583 "parse.y" +- { warning ("missing comma"); yyerrok; ;} ++#line 603 "parse.y" ++ { warning ("missing semicolon"); yyerrok; ;} + break; + + case 122: +-#line 588 "parse.y" +- { import_interface (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 607 "parse.y" ++ { in_uses = 1 ;} + break; + + case 123: +-#line 593 "parse.y" +- { (*yyvalp).itype = 0; ;} +- break; +- +- case 124: +-#line 595 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_qualified); (*yyvalp).itype = 1; ;} ++#line 608 "parse.y" ++ { (*yyvalp).itype = od_uses; ;} + break; + + case 126: +-#line 601 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 615 "parse.y" ++ { warning ("missing comma"); yyerrok; ;} + break; + + case 127: +-#line 603 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 620 "parse.y" ++ { import_interface (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.itype == 1) ? IMPORT_QUALIFIED : ++ (in_uses ? IMPORT_USES : IMPORT_ISO), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 128: ++#line 626 "parse.y" ++ { (*yyvalp).itype = 0; ;} + break; + + case 129: +-#line 609 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("file name specification with `in' is", BORLAND_DELPHI); ;} ++#line 628 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_qualified); (*yyvalp).itype = 1; ;} + break; + + case 131: +-#line 615 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 634 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 132: +-#line 617 "parse.y" ++#line 636 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 134: ++#line 642 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("file name specification with `in' is", BORLAND_DELPHI); ;} ++ break; ++ ++ case 136: ++#line 648 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 137: ++#line 650 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 133: +-#line 619 "parse.y" +- { error ("missing comma"); (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 138: ++#line 652 "parse.y" ++ { error ("missing comma"); (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 134: +-#line 621 "parse.y" ++ case 139: ++#line 654 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 135: +-#line 626 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 140: ++#line 659 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 136: +-#line 633 "parse.y" +- { declare_label (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 141: ++#line 666 "parse.y" ++ { declare_label (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 137: +-#line 635 "parse.y" +- { declare_label (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 142: ++#line 668 "parse.y" ++ { declare_label (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 138: +-#line 637 "parse.y" ++ case 143: ++#line 670 "parse.y" + { error ("non-label in label_list"); ;} + break; + +- case 139: +-#line 639 "parse.y" +- { declare_label (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 144: ++#line 672 "parse.y" ++ { declare_label (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 140: +-#line 641 "parse.y" ++ case 145: ++#line 674 "parse.y" + { error ("extra comma"); ;} + break; + +- case 143: +-#line 648 "parse.y" ++ case 148: ++#line 681 "parse.y" + { chk_dialect ("non-numeric labels are", B_D_M_PASCAL); ;} + break; + +- case 146: +-#line 660 "parse.y" +- { (*yyvalp).ttype = numeric_label (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 151: ++#line 693 "parse.y" ++ { (*yyvalp).ttype = numeric_label (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 150: +-#line 673 "parse.y" +- { declare_constant (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 155: ++#line 706 "parse.y" ++ { declare_constant (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 151: +-#line 676 "parse.y" ++ case 156: ++#line 709 "parse.y" + { + lex_const_equal = -1; +- declare_variables (build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-7)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, VQ_BP_CONST, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ++ declare_variables (build_tree_list (NULL_TREE, yyvsp[YYFILL (-7)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, VQ_BP_CONST, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 153: +-#line 687 "parse.y" ++ case 158: ++#line 720 "parse.y" + { yyerrok; ;} + break; + +- case 155: +-#line 690 "parse.y" ++ case 160: ++#line 723 "parse.y" + { error ("missing semicolon"); yyerrok; ;} + break; + +- case 156: +-#line 692 "parse.y" ++ case 161: ++#line 725 "parse.y" + { error ("extra semicolon"); ;} + break; + +- case 158: +-#line 698 "parse.y" ++ case 163: ++#line 731 "parse.y" + { + lex_const_equal = -1; +- if (!EM (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)) ++ if (!EM (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)) + { +- if (PASCAL_TYPE_UNDISCRIMINATED_SCHEMA (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)) ++ if (PASCAL_TYPE_UNDISCRIMINATED_SCHEMA (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)) + chk_dialect ("undiscriminated schemata on the right side of a type definition are", GNU_PASCAL); +- build_type_decl (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ build_type_decl (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + } + ;} + break; + +- case 159: +-#line 708 "parse.y" ++ case 164: ++#line 741 "parse.y" + { + (*yyvalp).itype = immediate_size_expand; + immediate_size_expand = 0; +@@ -5251,100 +5428,100 @@ + ;} + break; + +- case 160: +-#line 714 "parse.y" ++ case 165: ++#line 747 "parse.y" + { +- build_type_decl (((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, build_schema_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); +- immediate_size_expand = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.itype; ++ build_type_decl (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, build_schema_type (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ immediate_size_expand = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.itype; + size_volatile--; + ;} + break; + +- case 161: +-#line 720 "parse.y" +- { build_schema_type (error_mark_node, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 166: ++#line 753 "parse.y" ++ { build_schema_type (error_mark_node, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 162: +-#line 722 "parse.y" +- { (*yyvalp).ttype = start_object_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 167: ++#line 755 "parse.y" ++ { (*yyvalp).ttype = start_object_type (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 163: +-#line 724 "parse.y" ++ case 168: ++#line 757 "parse.y" + { + lex_const_equal = -1; +- finish_object_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype != NULL_TREE); ++ finish_object_type (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype != NULL_TREE); + yyerrok; + ;} + break; + +- case 164: +-#line 733 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ case 169: ++#line 766 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 165: +-#line 735 "parse.y" ++ case 170: ++#line 768 "parse.y" + { error ("invalid schema discriminants"); (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 167: +-#line 741 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 172: ++#line 774 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 168: +-#line 743 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} ++ case 173: ++#line 776 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} + break; + +- case 169: +-#line 745 "parse.y" ++ case 174: ++#line 778 "parse.y" + { error ("extra semicolon"); ;} + break; + +- case 171: +-#line 751 "parse.y" +- { (*yyvalp).ttype = build_discriminants (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 176: ++#line 784 "parse.y" ++ { (*yyvalp).ttype = build_discriminants (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 173: +-#line 757 "parse.y" +- { type_attributes (&(*yyvalp).ttype, TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 178: ++#line 790 "parse.y" ++ { type_attributes (&(*yyvalp).ttype, TREE_PURPOSE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 174: +-#line 762 "parse.y" ++ case 179: ++#line 795 "parse.y" + { +- if (!EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) && TYPE_GET_INITIALIZER (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) ++ if (!EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) && TYPE_GET_INITIALIZER (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) + warning ("initial value of type ignored here"); + ;} + break; + +- case 175: +-#line 772 "parse.y" ++ case 180: ++#line 805 "parse.y" + { + #ifndef EGCS97 + pop_obstacks (); + #endif +- (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ++ (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; + ;} + break; + +- case 177: +-#line 783 "parse.y" ++ case 182: ++#line 816 "parse.y" + { +- if (!PASCAL_TYPE_FILE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) ++ if (!PASCAL_TYPE_FILE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) + warning ("GPC supports `bindable' only for files"); +- (*yyvalp).ttype = pascal_type_variant (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, TYPE_QUALIFIER_BINDABLE); ++ (*yyvalp).ttype = pascal_type_variant (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, TYPE_QUALIFIER_BINDABLE); + ;} + break; + +- case 179: +-#line 793 "parse.y" ++ case 184: ++#line 826 "parse.y" + { +- (*yyvalp).ttype = pascal_type_variant (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, TYPE_QUALIFIER_RESTRICTED | (TYPE_PACKED (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? TYPE_QUALIFIER_PACKED : 0)); ++ (*yyvalp).ttype = pascal_type_variant (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, TYPE_QUALIFIER_RESTRICTED | (TYPE_PACKED (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? TYPE_QUALIFIER_PACKED : 0)); + /* Special case for `restricted Void' (fjf369*.pas) */ + if (TREE_CODE ((*yyvalp).ttype) == VOID_TYPE) + { +@@ -5354,28 +5531,28 @@ + ;} + break; + +- case 180: +-#line 803 "parse.y" +- { (*yyvalp).ttype = build_discriminated_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 185: ++#line 836 "parse.y" ++ { (*yyvalp).ttype = build_discriminated_type (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 184: +-#line 808 "parse.y" ++ case 189: ++#line 841 "parse.y" + { chk_dialect ("procedural variables and types are", B_D_M_PASCAL); ;} + break; + +- case 186: +-#line 811 "parse.y" +- { defining_packed_type -= ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype; (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype ? pack_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) : ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} ++ case 191: ++#line 844 "parse.y" ++ { defining_packed_type -= yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype; (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype ? pack_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) : yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 187: +-#line 816 "parse.y" ++ case 192: ++#line 849 "parse.y" + { defining_packed_type += (*yyvalp).itype = !co->ignore_packed; /* can be nested */ ;} + break; + +- case 188: +-#line 821 "parse.y" ++ case 193: ++#line 854 "parse.y" + { + if (PASCAL_TYPE_UNDISCRIMINATED_STRING ((*yyvalp).ttype)) + { +@@ -5386,145 +5563,150 @@ + ;} + break; + +- case 189: +-#line 833 "parse.y" ++ case 194: ++#line 866 "parse.y" + { +- tree decl = lookup_name (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ tree decl = lookup_name (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + (*yyvalp).ttype = error_mark_node; + if (!decl) +- error ("unknown identifier `%s'", IDENTIFIER_NAME (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ++ error ("unknown identifier `%s'", IDENTIFIER_NAME (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); + else if (TREE_CODE (decl) != TYPE_DECL) +- error ("type name expected, `%s' given", IDENTIFIER_NAME (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ++ error ("type name expected, `%s' given", IDENTIFIER_NAME (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); + else + (*yyvalp).ttype = TREE_TYPE (decl); + ;} + break; + +- case 190: +-#line 847 "parse.y" +- { chk_dialect ("schema/string discriminants are", E_O_PASCAL); (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ case 196: ++#line 881 "parse.y" ++ { (*yyvalp).ttype = build_qualified_id (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype,yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype);;} + break; + +- case 191: +-#line 849 "parse.y" ++ case 197: ++#line 886 "parse.y" ++ { chk_dialect ("schema/string discriminants are", E_O_PASCAL); (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ break; ++ ++ case 198: ++#line 888 "parse.y" + { + chk_dialect ("string capacity in brackets is", U_B_D_M_PASCAL); +- (*yyvalp).ttype = build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 0))); ++ (*yyvalp).ttype = build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 0))); + ;} + break; + +- case 192: +-#line 857 "parse.y" ++ case 199: ++#line 896 "parse.y" + { + /* This expression might be a discriminant of another schema. */ +- (*yyvalp).ttype = build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0))); ++ (*yyvalp).ttype = build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0))); + ;} + break; + +- case 193: +-#line 862 "parse.y" ++ case 200: ++#line 901 "parse.y" + { +- (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)))); ++ (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)))); + yyerrok; + ;} + break; + +- case 194: +-#line 867 "parse.y" ++ case 201: ++#line 906 "parse.y" + { error ("missing expression"); (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 195: +-#line 869 "parse.y" ++ case 202: ++#line 908 "parse.y" + { + error ("missing comma"); +- (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)))); ++ (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, maybe_schema_discriminant (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)))); + yyerrok; + ;} + break; + +- case 196: +-#line 875 "parse.y" ++ case 203: ++#line 914 "parse.y" + { error ("extra comma"); ;} + break; + +- case 199: +-#line 888 "parse.y" +- { (*yyvalp).ttype = build_enum_type (nreverse (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 206: ++#line 927 "parse.y" ++ { (*yyvalp).ttype = build_enum_type (nreverse (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 200: +-#line 890 "parse.y" ++ case 207: ++#line 929 "parse.y" + { (*yyvalp).ttype = error_mark_node; ;} + break; + +- case 201: +-#line 895 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 208: ++#line 934 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 202: +-#line 897 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 209: ++#line 936 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 203: +-#line 899 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 210: ++#line 938 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 204: +-#line 901 "parse.y" ++ case 211: ++#line 940 "parse.y" + { error ("extra comma"); ;} + break; + +- case 206: +-#line 907 "parse.y" +- { (*yyvalp).ttype = build_pascal_subrange_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 213: ++#line 946 "parse.y" ++ { (*yyvalp).ttype = build_pascal_subrange_type (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 207: +-#line 909 "parse.y" ++ case 214: ++#line 948 "parse.y" + { +- defining_packed_type -= ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.itype; ++ defining_packed_type -= yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.itype; + chk_dialect ("packed subrange types are", B_D_PASCAL); +- (*yyvalp).ttype = build_pascal_subrange_type (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.itype); ++ (*yyvalp).ttype = build_pascal_subrange_type (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.itype); + ;} + break; + +- case 208: +-#line 919 "parse.y" +- { (*yyvalp).ttype = EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pointer_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 215: ++#line 958 "parse.y" ++ { (*yyvalp).ttype = EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pascal_pointer_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 209: +-#line 921 "parse.y" +- { (*yyvalp).ttype = EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pointer_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 216: ++#line 960 "parse.y" ++ { (*yyvalp).ttype = EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pascal_pointer_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 210: +-#line 923 "parse.y" +- { (*yyvalp).ttype = EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pointer_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 217: ++#line 962 "parse.y" ++ { (*yyvalp).ttype = EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pascal_pointer_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 211: +-#line 925 "parse.y" ++ case 218: ++#line 964 "parse.y" + { + chk_dialect ("pointers to `const' types are", GNU_PASCAL); +- (*yyvalp).ttype = EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pointer_type (p_build_type_variant (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, TYPE_VOLATILE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype))); ++ (*yyvalp).ttype = EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ? error_mark_node : build_pascal_pointer_type (p_build_type_variant (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, TYPE_VOLATILE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype))); + ;} + break; + +- case 212: +-#line 936 "parse.y" ++ case 219: ++#line 975 "parse.y" + { + tree decl, scan; +- for (scan = current_type_list; scan && TREE_VALUE (scan) != ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; scan = TREE_CHAIN (scan)) ; ++ for (scan = current_type_list; scan && TREE_VALUE (scan) != yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; scan = TREE_CHAIN (scan)) ; + if (scan) + (*yyvalp).ttype = TREE_TYPE (TREE_PURPOSE (scan)); + else if (current_type_list) +- (*yyvalp).ttype = TREE_TYPE (build_type_decl (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, make_node (LANG_TYPE), NULL_TREE)); +- else if ((decl = lookup_name (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) && TREE_CODE (decl) == TYPE_DECL) ++ (*yyvalp).ttype = TREE_TYPE (build_type_decl (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, make_node (LANG_TYPE), NULL_TREE)); ++ else if ((decl = lookup_name (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) && TREE_CODE (decl) == TYPE_DECL) + (*yyvalp).ttype = TREE_TYPE (decl); + else + { +@@ -5534,323 +5716,323 @@ + ;} + break; + +- case 213: +-#line 952 "parse.y" ++ case 220: ++#line 991 "parse.y" + { + chk_dialect ("pointers to routines are", GNU_PASCAL); +- assert (EM (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) || (TREE_CODE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE && TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype))); +- (*yyvalp).ttype = TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ assert (EM (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) || (TREE_CODE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE && TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype))); ++ (*yyvalp).ttype = TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 215: +-#line 964 "parse.y" +- { (*yyvalp).ttype = build_procedural_type (void_type_node, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 222: ++#line 1003 "parse.y" ++ { (*yyvalp).ttype = build_procedural_type (void_type_node, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 216: +-#line 966 "parse.y" +- { (*yyvalp).ttype = build_procedural_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 223: ++#line 1005 "parse.y" ++ { (*yyvalp).ttype = build_procedural_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 222: +-#line 979 "parse.y" +- { (*yyvalp).ttype = build_pascal_array_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} ++ case 229: ++#line 1018 "parse.y" ++ { (*yyvalp).ttype = build_pascal_array_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 224: +-#line 985 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 231: ++#line 1024 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 225: +-#line 987 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 232: ++#line 1026 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 226: +-#line 989 "parse.y" ++ case 233: ++#line 1028 "parse.y" + { (*yyvalp).ttype = build_tree_list (error_mark_node, error_mark_node); ;} + break; + +- case 227: +-#line 991 "parse.y" ++ case 234: ++#line 1030 "parse.y" + { (*yyvalp).ttype = build_tree_list (error_mark_node, error_mark_node); ;} + break; + +- case 228: +-#line 997 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, convert_type_to_range (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 235: ++#line 1036 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, convert_type_to_range (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 229: +-#line 999 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, convert_type_to_range (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 236: ++#line 1038 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, convert_type_to_range (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 231: +-#line 1005 "parse.y" +- { (*yyvalp).ttype = build_file_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 238: ++#line 1044 "parse.y" ++ { (*yyvalp).ttype = build_file_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 232: +-#line 1010 "parse.y" ++ case 239: ++#line 1049 "parse.y" + { chk_dialect ("untyped files are", U_B_D_M_PASCAL); (*yyvalp).ttype = untyped_file_type_node; ;} + break; + +- case 234: +-#line 1016 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ case 241: ++#line 1055 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 235: +-#line 1021 "parse.y" +- { (*yyvalp).ttype = pascal_build_set_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 242: ++#line 1060 "parse.y" ++ { (*yyvalp).ttype = pascal_build_set_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 236: +-#line 1026 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; yyerrok; ;} ++ case 243: ++#line 1065 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; yyerrok; ;} + break; + +- case 237: +-#line 1028 "parse.y" ++ case 244: ++#line 1067 "parse.y" + { (*yyvalp).ttype = finish_struct (start_struct (RECORD_TYPE), NULL_TREE, 1); ;} + break; + +- case 238: +-#line 1033 "parse.y" ++ case 245: ++#line 1072 "parse.y" + { (*yyvalp).ttype = finish_struct (start_struct (RECORD_TYPE), NULL_TREE, 1); ;} + break; + +- case 239: +-#line 1035 "parse.y" +- { (*yyvalp).ttype = finish_struct (start_struct (RECORD_TYPE), ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 1); ;} ++ case 246: ++#line 1074 "parse.y" ++ { (*yyvalp).ttype = finish_struct (start_struct (RECORD_TYPE), yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + +- case 240: +-#line 1037 "parse.y" +- { (*yyvalp).ttype = build_variant_record (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 247: ++#line 1076 "parse.y" ++ { (*yyvalp).ttype = build_variant_record (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 241: +-#line 1039 "parse.y" +- { (*yyvalp).ttype = build_variant_record (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 248: ++#line 1078 "parse.y" ++ { (*yyvalp).ttype = build_variant_record (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 243: +-#line 1045 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 250: ++#line 1084 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 244: +-#line 1047 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} ++ case 251: ++#line 1086 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} + break; + +- case 245: +-#line 1049 "parse.y" ++ case 252: ++#line 1088 "parse.y" + { error ("extra semicolon"); ;} + break; + +- case 247: +-#line 1055 "parse.y" +- { (*yyvalp).ttype = build_fields (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 254: ++#line 1094 "parse.y" ++ { (*yyvalp).ttype = build_fields (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 248: +-#line 1060 "parse.y" +- { (*yyvalp).ttype = build_record_variant_part (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 255: ++#line 1099 "parse.y" ++ { (*yyvalp).ttype = build_record_variant_part (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 249: +-#line 1065 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_field (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 256: ++#line 1104 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_field (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 250: +-#line 1067 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_field (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 257: ++#line 1106 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_field (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 251: +-#line 1069 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 258: ++#line 1108 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 252: +-#line 1071 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 259: ++#line 1110 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 253: +-#line 1076 "parse.y" ++ case 260: ++#line 1115 "parse.y" + { chk_dialect ("type denoters (no identifiers) as variant tag type are", U_B_D_PASCAL); ;} + break; + +- case 254: +-#line 1081 "parse.y" ++ case 261: ++#line 1120 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 255: +-#line 1083 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, build_field (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype)); ;} ++ case 262: ++#line 1122 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, build_field (NULL_TREE, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 257: +-#line 1089 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 264: ++#line 1128 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 258: +-#line 1091 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} ++ case 265: ++#line 1130 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} + break; + +- case 259: +-#line 1093 "parse.y" ++ case 266: ++#line 1132 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 261: +-#line 1099 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, build_field (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 268: ++#line 1138 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, build_field (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 263: +-#line 1105 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 270: ++#line 1144 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 264: +-#line 1107 "parse.y" ++ case 271: ++#line 1146 "parse.y" + { error ("extra comma"); ;} + break; + +- case 265: +-#line 1109 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 272: ++#line 1148 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 267: +-#line 1115 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)); ;} ++ case 274: ++#line 1154 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0)); ;} + break; + +- case 268: +-#line 1117 "parse.y" ++ case 275: ++#line 1156 "parse.y" + { + chk_dialect ("`case' ranges are", NOT_CLASSIC_PASCAL); +- (*yyvalp).ttype = build_tree_list (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0), string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); ++ (*yyvalp).ttype = build_tree_list (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0), string_may_be_char (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); + ;} + break; + +- case 269: +-#line 1122 "parse.y" ++ case 276: ++#line 1161 "parse.y" + { +- (*yyvalp).ttype = build_tree_list (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0), string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); ++ (*yyvalp).ttype = build_tree_list (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0), string_may_be_char (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); + error ("missing `..'"); + yyerrok; + ;} + break; + +- case 270: +-#line 1128 "parse.y" +- { error ("extra `..'"); (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); ;} ++ case 277: ++#line 1167 "parse.y" ++ { error ("extra `..'"); (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0)); ;} + break; + +- case 271: +-#line 1133 "parse.y" ++ case 278: ++#line 1172 "parse.y" + { + chk_dialect_name ("type of", E_O_PASCAL); +- (*yyvalp).ttype = TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ (*yyvalp).ttype = TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + if (!EM ((*yyvalp).ttype)) + (*yyvalp).ttype = TYPE_MAIN_VARIANT ((*yyvalp).ttype); + ;} + break; + +- case 275: +-#line 1151 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ case 282: ++#line 1190 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 276: +-#line 1153 "parse.y" ++ case 283: ++#line 1192 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 278: +-#line 1159 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 285: ++#line 1198 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 279: +-#line 1161 "parse.y" ++ case 286: ++#line 1200 "parse.y" + { (*yyvalp).ttype = error_mark_node; ;} + break; + +- case 281: +-#line 1167 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, build_tree_list (void_type_node, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 288: ++#line 1206 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, build_tree_list (void_type_node, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 282: +-#line 1169 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 289: ++#line 1208 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 283: +-#line 1174 "parse.y" +- { (*yyvalp).ttype = build_fields (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 290: ++#line 1213 "parse.y" ++ { (*yyvalp).ttype = build_fields (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 284: +-#line 1176 "parse.y" +- { (*yyvalp).ttype = build_method_description (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 0); ;} ++ case 291: ++#line 1215 "parse.y" ++ { (*yyvalp).ttype = build_method_description (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 0); ;} + break; + +- case 285: +-#line 1178 "parse.y" +- { (*yyvalp).ttype = build_method_description (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 292: ++#line 1217 "parse.y" ++ { (*yyvalp).ttype = build_method_description (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 286: +-#line 1180 "parse.y" +- { (*yyvalp).ttype = build_method_description (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, boolean_type_node, 1); ;} ++ case 293: ++#line 1219 "parse.y" ++ { (*yyvalp).ttype = build_method_description (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, boolean_type_node, 1); ;} + break; + +- case 287: +-#line 1182 "parse.y" +- { (*yyvalp).ttype = build_method_description (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1); ;} ++ case 294: ++#line 1221 "parse.y" ++ { (*yyvalp).ttype = build_method_description (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1); ;} + break; + +- case 288: +-#line 1184 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 295: ++#line 1223 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 289: +-#line 1186 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 296: ++#line 1225 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 290: +-#line 1188 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 297: ++#line 1227 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 292: +-#line 1195 "parse.y" ++ case 299: ++#line 1234 "parse.y" + { ;} + break; + +- case 294: +-#line 1201 "parse.y" ++ case 301: ++#line 1240 "parse.y" + { +- tree t, ids = (*yyvalp).ttype = nreverse (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype); +- if ((TREE_CODE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) == POINTER_TYPE || TREE_CODE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE) +- && TREE_CODE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) == FUNCTION_TYPE) ++ tree t, ids = (*yyvalp).ttype = nreverse (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ++ if ((TREE_CODE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) == POINTER_TYPE || TREE_CODE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE) ++ && TREE_CODE (TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) == FUNCTION_TYPE) + TREE_PRIVATE (ids) = !!allow_function_calls (0); /* kludge */ + /* With `begin var Result: Integer; Result := ...' where `Result' + is a built-in identifier, parser look-ahead would already get +@@ -5861,167 +6043,167 @@ + ;} + break; + +- case 295: +-#line 1214 "parse.y" ++ case 302: ++#line 1253 "parse.y" + { +- tree t, ids = ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype; ++ tree t, ids = yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype; + for (t = ids; t; t = TREE_CHAIN (t)) + PASCAL_PENDING_DECLARATION (TREE_VALUE (t)) = 0; + lex_const_equal = -1; +- (*yyvalp).ttype = declare_variables (ids, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); +- if ((TREE_CODE (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype) == POINTER_TYPE || TREE_CODE (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE) +- && TREE_CODE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype)) == FUNCTION_TYPE) ++ (*yyvalp).ttype = declare_variables (ids, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 0, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ++ if ((TREE_CODE (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype) == POINTER_TYPE || TREE_CODE (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype) == REFERENCE_TYPE) ++ && TREE_CODE (TREE_TYPE (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype)) == FUNCTION_TYPE) + allow_function_calls (TREE_PRIVATE (ids)); + yyerrok; + ;} + break; + +- case 296: +-#line 1226 "parse.y" ++ case 303: ++#line 1265 "parse.y" + { (*yyvalp).ttype = NULL_TREE; lex_const_equal = -1; ;} + break; + +- case 298: +-#line 1232 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 305: ++#line 1271 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 300: +-#line 1238 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 307: ++#line 1277 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 301: +-#line 1240 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_name); ;} ++ case 308: ++#line 1279 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_name); ;} + break; + +- case 302: +-#line 1242 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)); ;} ++ case 309: ++#line 1281 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, build_tree_list (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 304: +-#line 1248 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 311: ++#line 1287 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 305: +-#line 1253 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 312: ++#line 1292 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 306: +-#line 1255 "parse.y" +- { (*yyvalp).ttype = TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 313: ++#line 1294 "parse.y" ++ { (*yyvalp).ttype = TREE_PURPOSE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 307: +-#line 1260 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} ++ case 314: ++#line 1299 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 309: +-#line 1266 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 316: ++#line 1305 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 311: +-#line 1272 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 318: ++#line 1311 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 312: +-#line 1274 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 319: ++#line 1313 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 313: +-#line 1276 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 320: ++#line 1315 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 314: +-#line 1278 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 321: ++#line 1317 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 315: +-#line 1280 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 322: ++#line 1319 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, tree_cons (NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 316: +-#line 1284 "parse.y" ++ case 323: ++#line 1323 "parse.y" + { lex_const_equal = -1; ;} + break; + +- case 317: +-#line 1286 "parse.y" ++ case 324: ++#line 1325 "parse.y" + { chk_dialect ("initialization with `:=' is", VAX_PASCAL); ;} + break; + +- case 318: +-#line 1288 "parse.y" ++ case 325: ++#line 1327 "parse.y" + { chk_dialect ("initialization with `=' is", BORLAND_DELPHI); ;} + break; + +- case 320: +-#line 1294 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} ++ case 327: ++#line 1333 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 321: +-#line 1296 "parse.y" ++ case 328: ++#line 1335 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 323: +-#line 1302 "parse.y" ++ case 330: ++#line 1341 "parse.y" + { (*yyvalp).itype = allow_function_calls (0); lex_const_equal = -1; ;} + break; + +- case 324: +-#line 1304 "parse.y" ++ case 331: ++#line 1343 "parse.y" + { +- allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype); +- (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ allow_function_calls (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype); ++ (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + PASCAL_ABSOLUTE_CLAUSE ((*yyvalp).ttype) = 1; + ;} + break; + +- case 325: +-#line 1310 "parse.y" ++ case 332: ++#line 1349 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 326: +-#line 1329 "parse.y" ++ case 333: ++#line 1368 "parse.y" + { parentheses_count = 0; (*yyvalp).itype = allow_function_calls (0); ;} + break; + +- case 327: +-#line 1331 "parse.y" +- { allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype); (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} ++ case 334: ++#line 1370 "parse.y" ++ { allow_function_calls (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype); (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 328: +-#line 1336 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 335: ++#line 1375 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 330: +-#line 1339 "parse.y" ++ case 337: ++#line 1378 "parse.y" + { + chk_dialect ("initializers in `()' are", B_D_M_PASCAL); +- (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ++ (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 331: +-#line 1347 "parse.y" ++ case 338: ++#line 1386 "parse.y" + { +- (*yyvalp).ttype = maybe_schema_discriminant (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ (*yyvalp).ttype = maybe_schema_discriminant (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + /* Convert outer pairs of parentheses (which are meaningless in normal + expressions) into extra levels of tree lists for structured initializers. */ + if (last_parenthesized_expression == (*yyvalp).ttype) +@@ -6031,51 +6213,51 @@ + ;} + break; + +- case 333: +-#line 1361 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 340: ++#line 1400 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 334: +-#line 1363 "parse.y" +- { (*yyvalp).ttype = nreverse (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 341: ++#line 1402 "parse.y" ++ { (*yyvalp).ttype = nreverse (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 337: +-#line 1367 "parse.y" ++ case 344: ++#line 1406 "parse.y" + { error ("invalid structured initializer"); (*yyvalp).ttype = error_mark_node; ;} + break; + +- case 338: +-#line 1375 "parse.y" +- { TREE_CHAIN (((*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} ++ case 345: ++#line 1414 "parse.y" ++ { TREE_CHAIN (((*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 339: +-#line 1377 "parse.y" +- { TREE_CHAIN (((*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} ++ case 346: ++#line 1416 "parse.y" ++ { TREE_CHAIN (((*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 340: +-#line 1379 "parse.y" +- { TREE_CHAIN (((*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype; error ("missing separator"); ;} ++ case 347: ++#line 1418 "parse.y" ++ { TREE_CHAIN (((*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype; error ("missing separator"); ;} + break; + +- case 342: +-#line 1385 "parse.y" ++ case 349: ++#line 1424 "parse.y" + { chk_dialect ("initializers separated with `,' are", B_D_M_PASCAL); ;} + break; + +- case 345: +-#line 1395 "parse.y" ++ case 352: ++#line 1434 "parse.y" + { + chk_dialect ("initializers in `[]' are", E_O_PASCAL); +- (*yyvalp).ttype = build_tree_list (NULL_TREE, nreverse (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ (*yyvalp).ttype = build_tree_list (NULL_TREE, nreverse (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + ;} + break; + +- case 346: +-#line 1400 "parse.y" ++ case 353: ++#line 1439 "parse.y" + { + error ("invalid structured initializer"); + chk_dialect ("initializers in `[]' are", E_O_PASCAL); +@@ -6083,433 +6265,433 @@ + ;} + break; + +- case 348: +-#line 1410 "parse.y" +- { TREE_CHAIN (((*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} ++ case 355: ++#line 1449 "parse.y" ++ { TREE_CHAIN (((*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 349: +-#line 1412 "parse.y" +- { TREE_CHAIN (((*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype; error ("missing separator"); ;} ++ case 356: ++#line 1451 "parse.y" ++ { TREE_CHAIN (((*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)) = yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype; error ("missing separator"); ;} + break; + +- case 350: +-#line 1417 "parse.y" +- { (*yyvalp).ttype = build_tree_list (build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE), TREE_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 357: ++#line 1456 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (build_tree_list (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE), TREE_VALUE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 353: +-#line 1424 "parse.y" +- { (*yyvalp).ttype = build_pascal_unary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 360: ++#line 1463 "parse.y" ++ { (*yyvalp).ttype = build_pascal_unary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 354: +-#line 1426 "parse.y" +- { (*yyvalp).ttype = build_pascal_unary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 361: ++#line 1465 "parse.y" ++ { (*yyvalp).ttype = build_pascal_unary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 355: +-#line 1540 "parse.y" +- { declare_routine (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} ++ case 362: ++#line 1579 "parse.y" ++ { declare_routine (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + +- case 356: +-#line 1551 "parse.y" +- { declare_routine (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 363: ++#line 1590 "parse.y" ++ { declare_routine (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 357: +-#line 1553 "parse.y" +- { (*yyvalp).ttype = start_routine (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 364: ++#line 1592 "parse.y" ++ { (*yyvalp).ttype = start_routine (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 358: +-#line 1555 "parse.y" ++ case 365: ++#line 1595 "parse.y" + { + do_setjmp (); + un_initialize_block (getdecls (), 0, 0); + ;} + break; + +- case 359: +-#line 1560 "parse.y" ++ case 366: ++#line 1600 "parse.y" + { + finish_routine (); +- restore_identifiers (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype); ++ restore_identifiers (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 362: +-#line 1573 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 0); ;} ++ case 369: ++#line 1613 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 0); ;} + break; + +- case 363: +-#line 1575 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, 0); ;} ++ case 370: ++#line 1615 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, 0); ;} + break; + +- case 364: +-#line 1577 "parse.y" +- { (*yyvalp).ttype = build_operator_heading (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 371: ++#line 1617 "parse.y" ++ { (*yyvalp).ttype = build_operator_heading (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 365: +-#line 1587 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 0); ;} ++ case 372: ++#line 1627 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 0); ;} + break; + +- case 366: +-#line 1589 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, 0); ;} ++ case 373: ++#line 1629 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, 0); ;} + break; + +- case 367: +-#line 1591 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, boolean_type_node, 1, 1); ;} ++ case 374: ++#line 1631 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, boolean_type_node, 1, 1); ;} + break; + +- case 368: +-#line 1593 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 1); ;} ++ case 375: ++#line 1633 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 1, 1); ;} + break; + +- case 371: +-#line 1603 "parse.y" +- { (*yyvalp).ttype = chainon (chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 378: ++#line 1643 "parse.y" ++ { (*yyvalp).ttype = chainon (chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 372: +-#line 1608 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 379: ++#line 1648 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 373: +-#line 1610 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 380: ++#line 1650 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 374: +-#line 1612 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_name); ;} ++ case 381: ++#line 1652 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_name); ;} + break; + +- case 375: +-#line 1614 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype)); ;} ++ case 382: ++#line 1654 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 376: +-#line 1616 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype)); ;} ++ case 383: ++#line 1656 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 377: +-#line 1618 "parse.y" +- { (*yyvalp).ttype = tree_cons (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype)); ;} ++ case 384: ++#line 1658 "parse.y" ++ { (*yyvalp).ttype = tree_cons (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 378: +-#line 1620 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 385: ++#line 1660 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 379: +-#line 1622 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 386: ++#line 1662 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 380: +-#line 1624 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 387: ++#line 1664 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 382: +-#line 1630 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 389: ++#line 1670 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 383: +-#line 1632 "parse.y" ++ case 390: ++#line 1672 "parse.y" + { + if (co->warn_near_far) +- warning ("`%s' directive ignored in flat memory model", IDENTIFIER_NAME (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ warning ("`%s' directive ignored in flat memory model", IDENTIFIER_NAME (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + ;} + break; + +- case 389: +-#line 1651 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("function result variable specifications are", E_O_PASCAL); ;} ++ case 396: ++#line 1691 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("function result variable specifications are", E_O_PASCAL); ;} + break; + +- case 391: +-#line 1657 "parse.y" ++ case 398: ++#line 1697 "parse.y" + { chk_dialect ("function result variables without `=' are", GNU_PASCAL); ;} + break; + +- case 393: +-#line 1663 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("operator result variables with `=' are", GNU_PASCAL); ;} ++ case 400: ++#line 1703 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; chk_dialect ("operator result variables with `=' are", GNU_PASCAL); ;} + break; + +- case 394: +-#line 1665 "parse.y" ++ case 401: ++#line 1705 "parse.y" + { error ("missing operator result variable"); ;} + break; + +- case 395: +-#line 1670 "parse.y" ++ case 402: ++#line 1710 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 396: +-#line 1672 "parse.y" +- { (*yyvalp).ttype = check_result_type (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 403: ++#line 1712 "parse.y" ++ { (*yyvalp).ttype = check_result_type (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 399: +-#line 1679 "parse.y" ++ case 406: ++#line 1719 "parse.y" + { + chk_dialect ("empty parentheses are", BORLAND_DELPHI); + (*yyvalp).ttype = build_tree_list (NULL_TREE, void_type_node); + ;} + break; + +- case 400: +-#line 1684 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} ++ case 407: ++#line 1724 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 401: +-#line 1686 "parse.y" ++ case 408: ++#line 1726 "parse.y" + { (*yyvalp).ttype = build_tree_list (NULL_TREE, NULL_TREE); ;} + break; + +- case 402: +-#line 1688 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, NULL_TREE)); ;} ++ case 409: ++#line 1728 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, NULL_TREE)); ;} + break; + +- case 403: +-#line 1690 "parse.y" ++ case 410: ++#line 1730 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 405: +-#line 1696 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 412: ++#line 1736 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 406: +-#line 1698 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} ++ case 413: ++#line 1738 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing semicolon"); yyerrok; ;} + break; + +- case 408: +-#line 1704 "parse.y" +- { (*yyvalp).ttype = build_formal_param (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); ;} ++ case 415: ++#line 1744 "parse.y" ++ { (*yyvalp).ttype = build_formal_param (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); ;} + break; + +- case 409: +-#line 1706 "parse.y" +- { (*yyvalp).ttype = build_formal_param (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 1); ;} ++ case 416: ++#line 1746 "parse.y" ++ { (*yyvalp).ttype = build_formal_param (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 1); ;} + break; + +- case 410: +-#line 1708 "parse.y" +- { (*yyvalp).ttype = build_formal_param (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, !!((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} ++ case 417: ++#line 1748 "parse.y" ++ { (*yyvalp).ttype = build_formal_param (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1, !!yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 411: +-#line 1710 "parse.y" +- { (*yyvalp).ttype = build_formal_param (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2, 1); ;} ++ case 418: ++#line 1750 "parse.y" ++ { (*yyvalp).ttype = build_formal_param (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 2, 1); ;} + break; + +- case 412: +-#line 1712 "parse.y" +- { (*yyvalp).ttype = build_formal_param (TREE_PURPOSE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), TREE_VALUE (TREE_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)), 0, 0); ;} ++ case 419: ++#line 1752 "parse.y" ++ { (*yyvalp).ttype = build_formal_param (TREE_PURPOSE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), TREE_VALUE (TREE_VALUE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)), 0, 0); ;} + break; + +- case 413: +-#line 1717 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 0, 0); ;} ++ case 420: ++#line 1757 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE, void_type_node, 0, 0); ;} + break; + +- case 414: +-#line 1719 "parse.y" +- { (*yyvalp).ttype = build_routine_heading (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); ;} ++ case 421: ++#line 1759 "parse.y" ++ { (*yyvalp).ttype = build_routine_heading (NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); ;} + break; + +- case 417: +-#line 1729 "parse.y" ++ case 424: ++#line 1769 "parse.y" + { (*yyvalp).ttype = void_type_node; chk_dialect ("untyped parameters are", U_B_D_PASCAL); ;} + break; + +- case 418: +-#line 1731 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} ++ case 425: ++#line 1771 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 423: +-#line 1743 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 430: ++#line 1783 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 424: +-#line 1745 "parse.y" ++ case 431: ++#line 1785 "parse.y" + { +- defining_packed_type -= ((yyGLRStackItem const *)yyvsp)[YYFILL (-6)].yystate.yysemantics.yysval.itype; +- PASCAL_TREE_PACKED (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype) = ((yyGLRStackItem const *)yyvsp)[YYFILL (-6)].yystate.yysemantics.yysval.itype; +- (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ defining_packed_type -= yyvsp[YYFILL (-6)].yystate.yysemantics.yysval.itype; ++ PASCAL_TREE_PACKED (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype) = yyvsp[YYFILL (-6)].yystate.yysemantics.yysval.itype; ++ (*yyvalp).ttype = chainon (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 428: +-#line 1760 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 435: ++#line 1800 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 429: +-#line 1762 "parse.y" ++ case 436: ++#line 1802 "parse.y" + { error ("missing semicolon"); yyerrok; ;} + break; + +- case 431: +-#line 1768 "parse.y" ++ case 438: ++#line 1808 "parse.y" + { +- (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); +- TREE_TYPE ((*yyvalp).ttype) = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ++ (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ++ TREE_TYPE ((*yyvalp).ttype) = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; + ;} + break; + +- case 432: +-#line 1776 "parse.y" ++ case 439: ++#line 1816 "parse.y" + { + (*yyvalp).ttype = build_tree_list (NULL_TREE, NULL_TREE); +- TREE_TYPE ((*yyvalp).ttype) = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ++ TREE_TYPE ((*yyvalp).ttype) = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; + ;} + break; + +- case 435: +-#line 1791 "parse.y" ++ case 442: ++#line 1831 "parse.y" + { yyerrok; ;} + break; + +- case 436: +-#line 1795 "parse.y" ++ case 443: ++#line 1835 "parse.y" + { ;} + break; + +- case 437: +-#line 1797 "parse.y" ++ case 444: ++#line 1837 "parse.y" + { yyerrok; ;} + break; + +- case 439: +-#line 1812 "parse.y" ++ case 446: ++#line 1852 "parse.y" + { (*yyvalp).itype = 0; ;} + break; + +- case 440: +-#line 1814 "parse.y" ++ case 447: ++#line 1854 "parse.y" + { (*yyvalp).itype = 1; ;} + break; + +- case 455: +-#line 1836 "parse.y" +- { pascal_expand_goto (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 462: ++#line 1876 "parse.y" ++ { pascal_expand_goto (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 456: +-#line 1841 "parse.y" +- { set_label (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 463: ++#line 1881 "parse.y" ++ { set_label (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 457: +-#line 1846 "parse.y" ++ case 464: ++#line 1886 "parse.y" + { + chk_dialect ("variable declarations in the statement part are", GNU_PASCAL); +- un_initialize_block (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); ++ un_initialize_block (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0, 0); + ;} + break; + +- case 458: +-#line 1854 "parse.y" +- { restore_identifiers (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 465: ++#line 1894 "parse.y" ++ { restore_identifiers (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 460: +-#line 1860 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 467: ++#line 1900 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 461: +-#line 1862 "parse.y" ++ case 468: ++#line 1902 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 462: +-#line 1864 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 469: ++#line 1904 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 463: +-#line 1866 "parse.y" ++ case 470: ++#line 1906 "parse.y" + { error ("extra comma"); ;} + break; + +- case 464: +-#line 1871 "parse.y" +- { (*yyvalp).ttype = pascal_shadow_record_fields (undo_schema_dereference (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), NULL_TREE); ;} ++ case 471: ++#line 1911 "parse.y" ++ { (*yyvalp).ttype = pascal_shadow_record_fields (undo_schema_dereference (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), NULL_TREE); ;} + break; + +- case 465: +-#line 1873 "parse.y" +- { (*yyvalp).ttype = pascal_shadow_record_fields (undo_schema_dereference (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 472: ++#line 1913 "parse.y" ++ { (*yyvalp).ttype = pascal_shadow_record_fields (undo_schema_dereference (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 466: +-#line 1878 "parse.y" +- { expand_start_cond (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 473: ++#line 1918 "parse.y" ++ { expand_start_cond (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 467: +-#line 1880 "parse.y" ++ case 474: ++#line 1920 "parse.y" + { +- if (!((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype && extra_warnings) ++ if (!yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype && extra_warnings) + warning ("empty statement after `then'"); + ;} + break; + +- case 468: +-#line 1888 "parse.y" ++ case 475: ++#line 1928 "parse.y" + { expand_end_cond (); ;} + break; + +- case 469: +-#line 1890 "parse.y" ++ case 476: ++#line 1930 "parse.y" + { expand_start_else (); ;} + break; + +- case 470: +-#line 1892 "parse.y" ++ case 477: ++#line 1932 "parse.y" + { +- if (!((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype && extra_warnings) ++ if (!yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype && extra_warnings) + warning ("empty statement after `else'"); + expand_end_cond (); + ;} + break; + +- case 471: +-#line 1901 "parse.y" ++ case 478: ++#line 1941 "parse.y" + { + (*yyvalp).ttype = current_case_expression; +- current_case_expression = pascal_expand_start_case (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ++ current_case_expression = pascal_expand_start_case (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 472: +-#line 1906 "parse.y" ++ case 479: ++#line 1946 "parse.y" + { + tree duplicate; + if (!EM (current_case_expression)) +@@ -6517,19 +6699,19 @@ + ;} + break; + +- case 473: +-#line 1912 "parse.y" ++ case 480: ++#line 1952 "parse.y" + { + expand_exit_something (); + if (!EM (current_case_expression)) +- expand_end_case (((yyGLRStackItem const *)yyvsp)[YYFILL (-7)].yystate.yysemantics.yysval.ttype); +- current_case_expression = ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype; ++ expand_end_case (yyvsp[YYFILL (-7)].yystate.yysemantics.yysval.ttype); ++ current_case_expression = yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype; + yyerrok; + ;} + break; + +- case 474: +-#line 1923 "parse.y" ++ case 481: ++#line 1963 "parse.y" + { + /* Create an implicit `otherwise' (in the rule above) to avoid warnings + about unhandled cases. In ISO Pascal, this is a run-time error. */ +@@ -6538,143 +6720,143 @@ + ;} + break; + +- case 476: +-#line 1934 "parse.y" ++ case 483: ++#line 1974 "parse.y" + { chk_dialect ("`else' in `case' statements is", B_D_PASCAL); ;} + break; + +- case 477: +-#line 1935 "parse.y" ++ case 484: ++#line 1975 "parse.y" + { ;} + break; + +- case 479: +-#line 1941 "parse.y" ++ case 486: ++#line 1981 "parse.y" + { yyerrok; ;} + break; + +- case 480: +-#line 1943 "parse.y" ++ case 487: ++#line 1983 "parse.y" + { error ("case element expected"); ;} + break; + +- case 481: +-#line 1945 "parse.y" ++ case 488: ++#line 1985 "parse.y" + { error ("missing semicolon"); yyerrok; ;} + break; + +- case 482: +-#line 1947 "parse.y" ++ case 489: ++#line 1987 "parse.y" + { error ("extra semicolon"); ;} + break; + +- case 483: +-#line 1952 "parse.y" +- { pascal_pushcase (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 490: ++#line 1992 "parse.y" ++ { pascal_pushcase (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 484: +-#line 1954 "parse.y" ++ case 491: ++#line 1994 "parse.y" + { expand_exit_something (); ;} + break; + +- case 485: +-#line 1962 "parse.y" ++ case 492: ++#line 2002 "parse.y" + { emit_nop (); expand_start_loop_continue_elsewhere (1); ;} + break; + +- case 486: +-#line 1964 "parse.y" +- { LOCATION_NOTE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc); expand_loop_continue_here (); ;} ++ case 493: ++#line 2004 "parse.y" ++ { LOCATION_NOTE (yyvsp[YYFILL (0)].yystate.yyloc); expand_loop_continue_here (); ;} + break; + +- case 487: +-#line 1966 "parse.y" ++ case 494: ++#line 2006 "parse.y" + { +- LOCATION_NOTE (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yyloc); +- expand_exit_loop_if_false (0, build_pascal_unary_op (TRUTH_NOT_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ LOCATION_NOTE (yyvsp[YYFILL (-1)].yystate.yyloc); ++ expand_exit_loop_if_false (0, build_pascal_unary_op (TRUTH_NOT_EXPR, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + expand_end_loop (); + ;} + break; + +- case 488: +-#line 1975 "parse.y" ++ case 495: ++#line 2015 "parse.y" + { expand_start_loop (1); ;} + break; + +- case 489: +-#line 1977 "parse.y" +- { LOCATION_NOTE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc); expand_exit_loop_if_false (0, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 496: ++#line 2017 "parse.y" ++ { LOCATION_NOTE (yyvsp[YYFILL (0)].yystate.yyloc); expand_exit_loop_if_false (0, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 490: +-#line 1979 "parse.y" ++ case 497: ++#line 2019 "parse.y" + { expand_end_loop (); ;} + break; + +- case 491: +-#line 1984 "parse.y" +- { (*yyvalp).ttype = start_for_loop (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} ++ case 498: ++#line 2024 "parse.y" ++ { (*yyvalp).ttype = start_for_loop (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} + break; + +- case 492: +-#line 1986 "parse.y" +- { LOCATION_NOTE (((yyGLRStackItem const *)yyvsp)[YYFILL (-6)].yystate.yyloc); finish_for_loop (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-6)].yystate.yysemantics.yysval.code); ;} ++ case 499: ++#line 2026 "parse.y" ++ { LOCATION_NOTE (yyvsp[YYFILL (-6)].yystate.yyloc); finish_for_loop (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-6)].yystate.yysemantics.yysval.code); ;} + break; + +- case 493: +-#line 1988 "parse.y" +- { (*yyvalp).ttype = start_for_set_loop (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 500: ++#line 2028 "parse.y" ++ { (*yyvalp).ttype = start_for_set_loop (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 494: +-#line 1990 "parse.y" +- { LOCATION_NOTE (((yyGLRStackItem const *)yyvsp)[YYFILL (-6)].yystate.yyloc); finish_for_set_loop (((yyGLRStackItem const *)yyvsp)[YYFILL (-7)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype); ;} ++ case 501: ++#line 2030 "parse.y" ++ { LOCATION_NOTE (yyvsp[YYFILL (-6)].yystate.yyloc); finish_for_set_loop (yyvsp[YYFILL (-7)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 495: +-#line 1995 "parse.y" ++ case 502: ++#line 2035 "parse.y" + { (*yyvalp).code = LE_EXPR; ;} + break; + +- case 496: +-#line 1997 "parse.y" ++ case 503: ++#line 2037 "parse.y" + { (*yyvalp).code = GE_EXPR; ;} + break; + +- case 497: +-#line 1999 "parse.y" ++ case 504: ++#line 2039 "parse.y" + { error ("missing `to' or `downto'"); (*yyvalp).code = LE_EXPR; ;} + break; + +- case 498: +-#line 2006 "parse.y" +- { (*yyvalp).itype = allow_function_calls (!PASCAL_PROCEDURAL_TYPE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype))); ;} ++ case 505: ++#line 2046 "parse.y" ++ { (*yyvalp).itype = allow_function_calls (!PASCAL_PROCEDURAL_TYPE (TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype))); ;} + break; + +- case 499: +-#line 2008 "parse.y" ++ case 506: ++#line 2048 "parse.y" + { +- if (!((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype) +- allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype); +- expand_assignment_or_call_statement (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); +- allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype); ++ if (!yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype) ++ allow_function_calls (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype); ++ expand_assignment_or_call_statement (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ allow_function_calls (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype); + ;} + break; + +- case 501: +-#line 2019 "parse.y" ++ case 508: ++#line 2059 "parse.y" + { + chk_dialect ("the address operator is", B_D_M_PASCAL); + /* Special case where `@foo' can be an lvalue: If `foo' is a procedure + reference, `@foo' is a type cast to a procedure pointer. */ +- if (PASCAL_PROCEDURAL_TYPE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype))) ++ if (PASCAL_PROCEDURAL_TYPE (TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype))) + { + tree ftype; + if (!(co->pascal_dialect & B_D_PASCAL)) + warning ("using address expression as lvalue"); +- ftype = TREE_TYPE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); +- (*yyvalp).ttype = convert (build_pointer_type (ftype), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ++ ftype = TREE_TYPE (TREE_TYPE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ++ (*yyvalp).ttype = convert (build_pointer_type (ftype), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); + } + else + { +@@ -6684,187 +6866,187 @@ + ;} + break; + +- case 503: +-#line 2042 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} ++ case 510: ++#line 2082 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; ;} + break; + +- case 505: +-#line 2048 "parse.y" ++ case 512: ++#line 2088 "parse.y" + { error ("using `=' instead of `:=' in assignment"); ;} + break; + +- case 506: +-#line 2053 "parse.y" +- { build_predef_call (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.itype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 513: ++#line 2093 "parse.y" ++ { build_predef_call (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.itype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 507: +-#line 2055 "parse.y" +- { build_predef_call (IDENTIFIER_BUILT_IN_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)->symbol, NULL_TREE); ;} ++ case 514: ++#line 2095 "parse.y" ++ { build_predef_call (IDENTIFIER_BUILT_IN_VALUE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)->symbol, NULL_TREE); ;} + break; + +- case 508: +-#line 2057 "parse.y" +- { build_predef_call (IDENTIFIER_BUILT_IN_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)->symbol, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 515: ++#line 2097 "parse.y" ++ { build_predef_call (IDENTIFIER_BUILT_IN_VALUE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)->symbol, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 509: +-#line 2059 "parse.y" +- { build_predef_call (p_Dispose, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 516: ++#line 2099 "parse.y" ++ { build_predef_call (p_Dispose, build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 510: +-#line 2061 "parse.y" ++ case 517: ++#line 2101 "parse.y" + { + current_structor_object_type = NULL_TREE; +- if (TREE_CODE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)) == POINTER_TYPE && PASCAL_TYPE_OBJECT (TREE_TYPE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)))) ++ if (TREE_CODE (TREE_TYPE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)) == POINTER_TYPE && PASCAL_TYPE_OBJECT (TREE_TYPE (TREE_TYPE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)))) + error ("invalid arguments to object `Dispose'"); + else +- build_predef_call (p_Dispose, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ build_predef_call (p_Dispose, tree_cons (NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + ;} + break; + +- case 511: +-#line 2069 "parse.y" +- { build_predef_call (p_Dispose, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, call_method (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)))); ;} ++ case 518: ++#line 2109 "parse.y" ++ { build_predef_call (p_Dispose, tree_cons (NULL_TREE, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, call_method (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)))); ;} + break; + +- case 512: +-#line 2071 "parse.y" ++ case 519: ++#line 2111 "parse.y" + { build_predef_call (p_Return, NULL_TREE); ;} + break; + +- case 513: +-#line 2073 "parse.y" +- { build_predef_call (p_Return, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 520: ++#line 2113 "parse.y" ++ { build_predef_call (p_Return, build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 514: +-#line 2078 "parse.y" +- { (*yyvalp).ttype = set_structor_object (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} ++ case 521: ++#line 2118 "parse.y" ++ { (*yyvalp).ttype = set_structor_object (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 516: +-#line 2083 "parse.y" ++ case 523: ++#line 2123 "parse.y" + { (*yyvalp).itype = allow_function_calls (0); ;} + break; + +- case 517: +-#line 2085 "parse.y" +- { (*yyvalp).ttype = ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype; allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.itype); yyerrok; ;} ++ case 524: ++#line 2125 "parse.y" ++ { (*yyvalp).ttype = yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype; allow_function_calls (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.itype); yyerrok; ;} + break; + +- case 518: +-#line 2090 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 525: ++#line 2130 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 519: +-#line 2092 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); yyerrok; ;} ++ case 526: ++#line 2132 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); yyerrok; ;} + break; + +- case 520: +-#line 2094 "parse.y" ++ case 527: ++#line 2134 "parse.y" + { (*yyvalp).ttype = build_tree_list (NULL_TREE, error_mark_node); ;} + break; + +- case 521: +-#line 2096 "parse.y" ++ case 528: ++#line 2136 "parse.y" + { (*yyvalp).ttype = build_tree_list (NULL_TREE, error_mark_node); error ("extra comma"); ;} + break; + +- case 523: +-#line 2102 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 530: ++#line 2142 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 524: +-#line 2104 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 531: ++#line 2144 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 525: +-#line 2106 "parse.y" ++ case 532: ++#line 2146 "parse.y" + { error ("extra comma"); ;} + break; + +- case 526: +-#line 2112 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 533: ++#line 2152 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 527: +-#line 2114 "parse.y" +- { (*yyvalp).ttype = build_tree_list (build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 534: ++#line 2154 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 528: +-#line 2116 "parse.y" +- { (*yyvalp).ttype = build_tree_list (build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype); ;} ++ case 535: ++#line 2156 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (build_tree_list (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 529: +-#line 2121 "parse.y" +- { pascal_expand_asm_operands (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, NULL_TREE, NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.itype); ;} ++ case 536: ++#line 2161 "parse.y" ++ { pascal_expand_asm_operands (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, NULL_TREE, NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.itype); ;} + break; + +- case 530: +-#line 2123 "parse.y" +- { pascal_expand_asm_operands (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.itype); ;} ++ case 537: ++#line 2163 "parse.y" ++ { pascal_expand_asm_operands (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, NULL_TREE, yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.itype); ;} + break; + +- case 531: +-#line 2125 "parse.y" +- { pascal_expand_asm_operands (((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-7)].yystate.yysemantics.yysval.itype); ;} ++ case 538: ++#line 2165 "parse.y" ++ { pascal_expand_asm_operands (yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NULL_TREE, yyvsp[YYFILL (-7)].yystate.yysemantics.yysval.itype); ;} + break; + +- case 532: +-#line 2127 "parse.y" +- { pascal_expand_asm_operands (((yyGLRStackItem const *)yyvsp)[YYFILL (-7)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-5)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-9)].yystate.yysemantics.yysval.itype); ;} ++ case 539: ++#line 2167 "parse.y" ++ { pascal_expand_asm_operands (yyvsp[YYFILL (-7)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-5)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-9)].yystate.yysemantics.yysval.itype); ;} + break; + +- case 533: +-#line 2132 "parse.y" ++ case 540: ++#line 2172 "parse.y" + { (*yyvalp).itype = 0; ;} + break; + +- case 534: +-#line 2134 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_volatile); (*yyvalp).itype = 1; ;} ++ case 541: ++#line 2174 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_volatile); (*yyvalp).itype = 1; ;} + break; + +- case 538: +-#line 2145 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 545: ++#line 2185 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 539: +-#line 2150 "parse.y" +- { (*yyvalp).ttype = build_tree_list (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 546: ++#line 2190 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 540: +-#line 2155 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 547: ++#line 2195 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 541: +-#line 2157 "parse.y" +- { (*yyvalp).ttype = tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} ++ case 548: ++#line 2197 "parse.y" ++ { (*yyvalp).ttype = tree_cons (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 542: +-#line 2164 "parse.y" ++ case 549: ++#line 2204 "parse.y" + { + if (PEDANTIC (NOT_CLASSIC_PASCAL)) + { +- tree t = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype; ++ tree t = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype; + STRIP_TYPE_NOPS (t); + if (TREE_CODE (t) == CONVERT_EXPR || TREE_CODE (t) == NEGATE_EXPR) + t = TREE_OPERAND (t, 0); +- if (last_parenthesized_expression == ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype ++ if (last_parenthesized_expression == yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype + || last_parenthesized_expression == t + || !(TREE_CODE_CLASS (TREE_CODE (t)) == 'c' && PASCAL_TREE_FRESH_CST (t))) + error ("ISO 7185 Pascal allows only simple constants"); +@@ -6872,8 +7054,8 @@ + ;} + break; + +- case 543: +-#line 2181 "parse.y" ++ case 550: ++#line 2221 "parse.y" + { + if (!EM (TREE_TYPE ((*yyvalp).ttype)) && TREE_CODE (TREE_TYPE ((*yyvalp).ttype)) != BOOLEAN_TYPE) + { +@@ -6883,131 +7065,131 @@ + ;} + break; + +- case 544: +-#line 2192 "parse.y" +- { (*yyvalp).ttype = iso_no_parentheses (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} +- break; +- +- case 545: +-#line 2197 "parse.y" +- { (*yyvalp).ttype = fold (parser_build_binary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} +- break; +- +- case 546: +-#line 2199 "parse.y" +- { (*yyvalp).ttype = fold (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} +- break; +- +- case 548: +-#line 2205 "parse.y" +- { (*yyvalp).ttype = set_exp_original_code (build_pascal_unary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} +- break; +- +- case 549: +-#line 2210 "parse.y" +- { (*yyvalp).ttype = parser_build_binary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} +- break; +- +- case 550: +-#line 2212 "parse.y" +- { (*yyvalp).ttype = build_operator_call (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} +- break; +- + case 551: +-#line 2214 "parse.y" +- { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_OR_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2232 "parse.y" ++ { (*yyvalp).ttype = iso_no_parentheses (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 552: +-#line 2216 "parse.y" +- { if (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_OR_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2237 "parse.y" ++ { (*yyvalp).ttype = fold (parser_build_binary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + + case 553: +-#line 2218 "parse.y" +- { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_ORIF_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2239 "parse.y" ++ { (*yyvalp).ttype = fold (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 554: +-#line 2220 "parse.y" +- { if (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_ORIF_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 555: ++#line 2245 "parse.y" ++ { (*yyvalp).ttype = set_exp_original_code (build_pascal_unary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} + break; + + case 556: +-#line 2226 "parse.y" +- { (*yyvalp).ttype = parser_build_binary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 2250 "parse.y" ++ { (*yyvalp).ttype = parser_build_binary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 557: +-#line 2228 "parse.y" +- { (*yyvalp).ttype = build_operator_call (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} ++#line 2252 "parse.y" ++ { (*yyvalp).ttype = build_operator_call (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + + case 558: +-#line 2230 "parse.y" +- { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_AND_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2254 "parse.y" ++ { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_OR_EXPR, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 559: +-#line 2232 "parse.y" +- { if (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_AND_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2256 "parse.y" ++ { if (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), yyvsp[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_OR_EXPR, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 560: +-#line 2234 "parse.y" +- { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_ANDIF_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2258 "parse.y" ++ { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_ORIF_EXPR, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 561: +-#line 2236 "parse.y" +- { if (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_ANDIF_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++#line 2260 "parse.y" ++ { if (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), yyvsp[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_ORIF_EXPR, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 563: +-#line 2242 "parse.y" +- { (*yyvalp).ttype = build_operator_call (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} ++#line 2266 "parse.y" ++ { (*yyvalp).ttype = parser_build_binary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 564: +-#line 2244 "parse.y" +- { (*yyvalp).ttype = parser_build_binary_op (POW_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 2268 "parse.y" ++ { (*yyvalp).ttype = build_operator_call (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + + case 565: +-#line 2246 "parse.y" +- { (*yyvalp).ttype = parser_build_binary_op (POWER_EXPR, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++#line 2270 "parse.y" ++ { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_AND_EXPR, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 566: +-#line 2248 "parse.y" +- { (*yyvalp).ttype = build_is_as (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, p_is); ;} ++#line 2272 "parse.y" ++ { if (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), yyvsp[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_AND_EXPR, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 567: +-#line 2250 "parse.y" +- { (*yyvalp).ttype = build_is_as (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, p_as); ;} ++#line 2274 "parse.y" ++ { (*yyvalp).ttype = start_boolean_binary_op (TRUTH_ANDIF_EXPR, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + + case 568: +-#line 2255 "parse.y" +- { (*yyvalp).ttype = set_exp_original_code (build_pascal_unary_op (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} ++#line 2276 "parse.y" ++ { if (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype) LOCATION_NOTE (COPYLOC ((*yylocp), yyvsp[YYFILL (0)].yystate.yyloc)); (*yyvalp).ttype = finish_boolean_binary_op (TRUTH_ANDIF_EXPR, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 570: ++#line 2282 "parse.y" ++ { (*yyvalp).ttype = build_operator_call (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 0); ;} + break; + +- case 569: +-#line 2257 "parse.y" ++ case 571: ++#line 2284 "parse.y" ++ { (*yyvalp).ttype = parser_build_binary_op (POW_EXPR, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 572: ++#line 2286 "parse.y" ++ { (*yyvalp).ttype = parser_build_binary_op (POWER_EXPR, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ break; ++ ++ case 573: ++#line 2288 "parse.y" ++ { (*yyvalp).ttype = build_is_as (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, p_is); ;} ++ break; ++ ++ case 574: ++#line 2290 "parse.y" ++ { (*yyvalp).ttype = build_is_as (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, p_as); ;} ++ break; ++ ++ case 575: ++#line 2295 "parse.y" ++ { (*yyvalp).ttype = set_exp_original_code (build_pascal_unary_op (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.code); ;} ++ break; ++ ++ case 576: ++#line 2297 "parse.y" + { + chk_dialect ("the address operator is", B_D_M_PASCAL); +- (*yyvalp).ttype = build_pascal_address_expression (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, !co->typed_address); ++ (*yyvalp).ttype = build_pascal_address_expression (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, !co->typed_address); + ;} + break; + +- case 572: +-#line 2264 "parse.y" ++ case 579: ++#line 2304 "parse.y" + { (*yyvalp).ttype = null_pointer_node; ;} + break; + +- case 574: +-#line 2267 "parse.y" ++ case 581: ++#line 2307 "parse.y" + { + if (TREE_CODE ((*yyvalp).ttype) == TYPE_DECL) + { +@@ -7021,55 +7203,60 @@ + ;} + break; + +- case 579: +-#line 2292 "parse.y" +- { (*yyvalp).ttype = combine_strings (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} ++ case 586: ++#line 2332 "parse.y" ++ { (*yyvalp).ttype = combine_strings (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1); ;} + break; + +- case 584: +-#line 2304 "parse.y" +- { (*yyvalp).ttype = build_caret_string_constant (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++ case 591: ++#line 2344 "parse.y" ++ { (*yyvalp).ttype = build_caret_string_constant (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype); ;} ++ break; ++ ++ case 610: ++#line 2355 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 603: +-#line 2315 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 611: ++#line 2357 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 604: +-#line 2317 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)); ;} ++ case 612: ++#line 2362 "parse.y" ++ { (*yyvalp).ttype = iso_no_parentheses (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 605: +-#line 2322 "parse.y" +- { (*yyvalp).ttype = iso_no_parentheses (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 613: ++#line 2367 "parse.y" ++ { (*yyvalp).ttype = build_predef_call (IDENTIFIER_BUILT_IN_VALUE (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)->symbol, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 606: +-#line 2327 "parse.y" +- { (*yyvalp).ttype = build_predef_call (IDENTIFIER_BUILT_IN_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)->symbol, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 614: ++#line 2369 "parse.y" ++ { (*yyvalp).ttype = get_builtin_variable (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 607: +-#line 2329 "parse.y" +- { (*yyvalp).ttype = get_builtin_variable (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 617: ++#line 2376 "parse.y" ++ { (*yyvalp).ttype = build_qualified_or_component_acces (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 610: +-#line 2336 "parse.y" +- { (*yyvalp).ttype = build_inherited_method (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 619: ++#line 2382 "parse.y" ++ { (*yyvalp).ttype = build_inherited_method (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 611: +-#line 2338 "parse.y" +- { (*yyvalp).ttype = build_component_ref (undo_schema_dereference (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype), ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 620: ++#line 2384 "parse.y" ++ { (*yyvalp).ttype = build_component_ref (undo_schema_dereference (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype), yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 612: +-#line 2340 "parse.y" ++ case 621: ++#line 2386 "parse.y" + { +- (*yyvalp).ttype = set_exp_original_code (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NOP_EXPR); ++ (*yyvalp).ttype = set_exp_original_code (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, NOP_EXPR); + if (last_parenthesized_expression == (*yyvalp).ttype) + parentheses_count++; + else +@@ -7080,519 +7267,519 @@ + ;} + break; + +- case 613: +-#line 2351 "parse.y" +- { (*yyvalp).ttype = build_pascal_pointer_reference (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 622: ++#line 2397 "parse.y" ++ { (*yyvalp).ttype = build_pascal_pointer_reference (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 614: +-#line 2353 "parse.y" +- { (*yyvalp).ttype = build_pascal_array_ref (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 623: ++#line 2399 "parse.y" ++ { (*yyvalp).ttype = build_pascal_array_ref (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 615: +-#line 2355 "parse.y" ++ case 624: ++#line 2401 "parse.y" + { + chk_dialect ("empty parentheses are", BORLAND_DELPHI); +- (*yyvalp).ttype = build_call_or_cast (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE); ++ (*yyvalp).ttype = build_call_or_cast (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, NULL_TREE); + ;} + break; + +- case 616: +-#line 2360 "parse.y" ++ case 625: ++#line 2406 "parse.y" + { (*yyvalp).itype = allow_function_calls (0); ;} + break; + +- case 617: +-#line 2362 "parse.y" ++ case 626: ++#line 2408 "parse.y" + { +- allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.itype); +- (*yyvalp).ttype = build_call_or_cast (((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ++ allow_function_calls (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.itype); ++ (*yyvalp).ttype = build_call_or_cast (yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); + ;} + break; + +- case 618: +-#line 2367 "parse.y" +- { chk_dialect ("type casts are", B_D_M_PASCAL); (*yyvalp).ttype = build_type_cast (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 627: ++#line 2413 "parse.y" ++ { chk_dialect ("type casts are", B_D_M_PASCAL); (*yyvalp).ttype = build_type_cast (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 619: +-#line 2369 "parse.y" +- { (*yyvalp).ttype = build_predef_call (p_FormatString, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 628: ++#line 2415 "parse.y" ++ { (*yyvalp).ttype = build_predef_call (p_FormatString, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 620: +-#line 2371 "parse.y" ++ case 629: ++#line 2417 "parse.y" + { (*yyvalp).itype = allow_function_calls (0); ;} + break; + +- case 621: +-#line 2373 "parse.y" ++ case 630: ++#line 2419 "parse.y" + { +- (*yyvalp).ttype = build_predef_call (p_Assigned, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); +- allow_function_calls (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.itype); ++ (*yyvalp).ttype = build_predef_call (p_Assigned, build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ allow_function_calls (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.itype); + ;} + break; + +- case 622: +-#line 2378 "parse.y" +- { (*yyvalp).ttype = build_pascal_address_expression (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype, co->pascal_dialect & B_D_PASCAL); ;} ++ case 631: ++#line 2424 "parse.y" ++ { (*yyvalp).ttype = build_pascal_address_expression (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype, co->pascal_dialect & B_D_PASCAL); ;} + break; + +- case 623: +-#line 2380 "parse.y" +- { (*yyvalp).ttype = build_predef_call (IDENTIFIER_BUILT_IN_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)->symbol, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 632: ++#line 2426 "parse.y" ++ { (*yyvalp).ttype = build_predef_call (IDENTIFIER_BUILT_IN_VALUE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)->symbol, build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 624: +-#line 2382 "parse.y" +- { (*yyvalp).ttype = build_predef_call (p_New, build_tree_list (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} ++ case 633: ++#line 2428 "parse.y" ++ { (*yyvalp).ttype = build_predef_call (p_New, build_tree_list (NULL_TREE, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ;} + break; + +- case 625: +-#line 2384 "parse.y" ++ case 634: ++#line 2430 "parse.y" + { + current_structor_object_type = NULL_TREE; +- if (TREE_CODE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)) == POINTER_TYPE && PASCAL_TYPE_OBJECT (TREE_TYPE (TREE_TYPE (((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype)))) ++ if (TREE_CODE (TREE_TYPE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)) == POINTER_TYPE && PASCAL_TYPE_OBJECT (TREE_TYPE (TREE_TYPE (yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype)))) + { + error ("invalid arguments to object `New'"); + (*yyvalp).ttype = error_mark_node; + } + else +- (*yyvalp).ttype = build_predef_call (p_New, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-3)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); ++ (*yyvalp).ttype = build_predef_call (p_New, tree_cons (NULL_TREE, yyvsp[YYFILL (-3)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype)); + ;} + break; + +- case 626: +-#line 2395 "parse.y" +- { (*yyvalp).ttype = build_predef_call (p_New, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-4)].yystate.yysemantics.yysval.ttype, tree_cons (NULL_TREE, ((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype))); ;} ++ case 635: ++#line 2441 "parse.y" ++ { (*yyvalp).ttype = build_predef_call (p_New, tree_cons (NULL_TREE, yyvsp[YYFILL (-4)].yystate.yysemantics.yysval.ttype, tree_cons (NULL_TREE, yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype))); ;} + break; + +- case 627: +-#line 2400 "parse.y" +- { (*yyvalp).ttype = set_structor_object (iso_no_parentheses (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype), 1); ;} ++ case 636: ++#line 2446 "parse.y" ++ { (*yyvalp).ttype = set_structor_object (iso_no_parentheses (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype), 1); ;} + break; + +- case 629: +-#line 2406 "parse.y" +- { (*yyvalp).ttype = TYPE_NAME (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 638: ++#line 2452 "parse.y" ++ { (*yyvalp).ttype = TYPE_NAME (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 631: +-#line 2412 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 640: ++#line 2458 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 632: +-#line 2414 "parse.y" ++ case 641: ++#line 2460 "parse.y" + { error ("missing index expression"); (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 633: +-#line 2416 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 642: ++#line 2462 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 634: +-#line 2418 "parse.y" ++ case 643: ++#line 2464 "parse.y" + { error ("extra comma"); ;} + break; + +- case 635: +-#line 2423 "parse.y" +- { (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1)); ;} ++ case 644: ++#line 2469 "parse.y" ++ { (*yyvalp).ttype = build_tree_list (NULL_TREE, string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1)); ;} + break; + +- case 636: +-#line 2425 "parse.y" ++ case 645: ++#line 2471 "parse.y" + { + chk_dialect ("substring access is", E_O_PASCAL); +- (*yyvalp).ttype = build_tree_list (string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1), string_may_be_char (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 1)); ++ (*yyvalp).ttype = build_tree_list (string_may_be_char (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, 1), string_may_be_char (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, 1)); + ;} + break; + +- case 637: +-#line 2433 "parse.y" ++ case 646: ++#line 2479 "parse.y" + { (*yyvalp).ttype = build_set_constructor (NULL_TREE); ;} + break; + +- case 638: +-#line 2435 "parse.y" +- { (*yyvalp).ttype = build_set_constructor (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} ++ case 647: ++#line 2481 "parse.y" ++ { (*yyvalp).ttype = build_set_constructor (yyvsp[YYFILL (-1)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 640: +-#line 2441 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} ++ case 649: ++#line 2487 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); yyerrok; ;} + break; + +- case 641: +-#line 2443 "parse.y" +- { (*yyvalp).ttype = chainon (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} ++ case 650: ++#line 2489 "parse.y" ++ { (*yyvalp).ttype = chainon (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); error ("missing comma"); yyerrok; ;} + break; + +- case 642: +-#line 2445 "parse.y" ++ case 651: ++#line 2491 "parse.y" + { error ("extra comma"); ;} + break; + +- case 643: +-#line 2450 "parse.y" +- { (*yyvalp).ttype = construct_set_member (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} ++ case 652: ++#line 2496 "parse.y" ++ { (*yyvalp).ttype = construct_set_member (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, NULL_TREE); ;} + break; + +- case 644: +-#line 2452 "parse.y" +- { (*yyvalp).ttype = construct_set_member (((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 653: ++#line 2498 "parse.y" ++ { (*yyvalp).ttype = construct_set_member (yyvsp[YYFILL (-2)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 645: +-#line 2458 "parse.y" ++ case 654: ++#line 2504 "parse.y" + { (*yyvalp).code = CONVERT_EXPR; ;} + break; + +- case 646: +-#line 2459 "parse.y" ++ case 655: ++#line 2505 "parse.y" + { (*yyvalp).code = NEGATE_EXPR; ;} + break; + +- case 647: +-#line 2463 "parse.y" ++ case 656: ++#line 2509 "parse.y" + { (*yyvalp).code = CONVERT_EXPR; ;} + break; + +- case 648: +-#line 2464 "parse.y" ++ case 657: ++#line 2510 "parse.y" + { (*yyvalp).code = NEGATE_EXPR; ;} + break; + +- case 649: +-#line 2465 "parse.y" ++ case 658: ++#line 2511 "parse.y" + { (*yyvalp).code = TRUTH_NOT_EXPR; ;} + break; + +- case 650: +-#line 2469 "parse.y" ++ case 659: ++#line 2515 "parse.y" + { (*yyvalp).code = NE_EXPR; ;} + break; + +- case 651: +-#line 2470 "parse.y" ++ case 660: ++#line 2516 "parse.y" + { (*yyvalp).code = LE_EXPR; ;} + break; + +- case 652: +-#line 2471 "parse.y" ++ case 661: ++#line 2517 "parse.y" + { (*yyvalp).code = GE_EXPR; ;} + break; + +- case 653: +-#line 2472 "parse.y" ++ case 662: ++#line 2518 "parse.y" + { (*yyvalp).code = EQ_EXPR; ;} + break; + +- case 654: +-#line 2473 "parse.y" ++ case 663: ++#line 2519 "parse.y" + { (*yyvalp).code = LT_EXPR; ;} + break; + +- case 655: +-#line 2474 "parse.y" ++ case 664: ++#line 2520 "parse.y" + { (*yyvalp).code = GT_EXPR; ;} + break; + +- case 656: +-#line 2475 "parse.y" ++ case 665: ++#line 2521 "parse.y" + { (*yyvalp).code = IN_EXPR; ;} + break; + +- case 657: +-#line 2479 "parse.y" ++ case 666: ++#line 2525 "parse.y" + { (*yyvalp).code = PLUS_EXPR; ;} + break; + +- case 658: +-#line 2480 "parse.y" ++ case 667: ++#line 2526 "parse.y" + { (*yyvalp).code = PLUS_EXPR; ;} + break; + +- case 659: +-#line 2481 "parse.y" ++ case 668: ++#line 2527 "parse.y" + { (*yyvalp).code = MINUS_EXPR; ;} + break; + +- case 660: +-#line 2482 "parse.y" ++ case 669: ++#line 2528 "parse.y" + { (*yyvalp).code = MINUS_EXPR; ;} + break; + +- case 661: +-#line 2483 "parse.y" ++ case 670: ++#line 2529 "parse.y" + { (*yyvalp).code = TRUTH_XOR_EXPR; ;} + break; + +- case 662: +-#line 2484 "parse.y" ++ case 671: ++#line 2530 "parse.y" + { (*yyvalp).code = SYMDIFF_EXPR; ;} + break; + +- case 663: +-#line 2488 "parse.y" ++ case 672: ++#line 2534 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("CeilPlus", "+>"); ;} + break; + +- case 664: +-#line 2489 "parse.y" ++ case 673: ++#line 2535 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("CeilMinus", "->"); ;} + break; + +- case 665: +-#line 2490 "parse.y" ++ case 674: ++#line 2536 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("FloorPlus", "+<"); ;} + break; + +- case 666: +-#line 2491 "parse.y" ++ case 675: ++#line 2537 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("FloorMinus", "-<"); ;} + break; + +- case 667: +-#line 2496 "parse.y" ++ case 676: ++#line 2542 "parse.y" + { chk_dialect ("`or else' (without underscore) is", GNU_PASCAL); ;} + break; + +- case 668: +-#line 2497 "parse.y" ++ case 677: ++#line 2543 "parse.y" + { ;} + break; + +- case 669: +-#line 2501 "parse.y" ++ case 678: ++#line 2547 "parse.y" + { (*yyvalp).code = MULT_EXPR; ;} + break; + +- case 670: +-#line 2502 "parse.y" ++ case 679: ++#line 2548 "parse.y" + { (*yyvalp).code = RDIV_EXPR; ;} + break; + +- case 671: +-#line 2503 "parse.y" ++ case 680: ++#line 2549 "parse.y" + { (*yyvalp).code = TRUNC_DIV_EXPR; ;} + break; + +- case 672: +-#line 2504 "parse.y" ++ case 681: ++#line 2550 "parse.y" + { (*yyvalp).code = (co->pascal_dialect & B_D_M_PASCAL) ? TRUNC_MOD_EXPR : FLOOR_MOD_EXPR; ;} + break; + +- case 673: +-#line 2505 "parse.y" ++ case 682: ++#line 2551 "parse.y" + { (*yyvalp).code = LSHIFT_EXPR; ;} + break; + +- case 674: +-#line 2506 "parse.y" ++ case 683: ++#line 2552 "parse.y" + { (*yyvalp).code = RSHIFT_EXPR; ;} + break; + +- case 675: +-#line 2510 "parse.y" ++ case 684: ++#line 2556 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("CeilMult", "*>"); ;} + break; + +- case 676: +-#line 2511 "parse.y" ++ case 685: ++#line 2557 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("CeilRDiv", "/>"); ;} + break; + +- case 677: +-#line 2512 "parse.y" ++ case 686: ++#line 2558 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("FloorMult", "*<"); ;} + break; + +- case 678: +-#line 2513 "parse.y" ++ case 687: ++#line 2559 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("FloorRDiv", "/<"); ;} + break; + +- case 679: +-#line 2518 "parse.y" ++ case 688: ++#line 2564 "parse.y" + { chk_dialect ("`and then' (without underscore) is", GNU_PASCAL); ;} + break; + +- case 680: +-#line 2519 "parse.y" ++ case 689: ++#line 2565 "parse.y" + { ;} + break; + +- case 681: +-#line 2526 "parse.y" +- { (*yyvalp).itype = IDENTIFIER_BUILT_IN_VALUE (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype)->symbol; ;} ++ case 690: ++#line 2572 "parse.y" ++ { (*yyvalp).itype = IDENTIFIER_BUILT_IN_VALUE (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype)->symbol; ;} + break; + +- case 682: +-#line 2528 "parse.y" ++ case 691: ++#line 2574 "parse.y" + { (*yyvalp).itype = p_and; ;} + break; + +- case 683: +-#line 2529 "parse.y" ++ case 692: ++#line 2575 "parse.y" + { (*yyvalp).itype = p_or; ;} + break; + +- case 684: +-#line 2530 "parse.y" ++ case 693: ++#line 2576 "parse.y" + { (*yyvalp).itype = p_not; ;} + break; + +- case 685: +-#line 2531 "parse.y" ++ case 694: ++#line 2577 "parse.y" + { (*yyvalp).itype = p_xor; ;} + break; + +- case 686: +-#line 2532 "parse.y" ++ case 695: ++#line 2578 "parse.y" + { (*yyvalp).itype = p_shl; ;} + break; + +- case 687: +-#line 2533 "parse.y" ++ case 696: ++#line 2579 "parse.y" + { (*yyvalp).itype = p_shr; ;} + break; + +- case 688: +-#line 2539 "parse.y" ++ case 697: ++#line 2585 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("BPlus", "+"); ;} + break; + +- case 689: +-#line 2540 "parse.y" ++ case 698: ++#line 2586 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("BPlus", "+"); ;} + break; + +- case 690: +-#line 2541 "parse.y" ++ case 699: ++#line 2587 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("BMinus", "-"); ;} + break; + +- case 691: +-#line 2542 "parse.y" ++ case 700: ++#line 2588 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("BMinus", "-"); ;} + break; + +- case 692: +-#line 2543 "parse.y" ++ case 701: ++#line 2589 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("BMult", "*"); ;} + break; + +- case 693: +-#line 2544 "parse.y" ++ case 702: ++#line 2590 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("RDiv", "/"); ;} + break; + +- case 694: +-#line 2545 "parse.y" ++ case 703: ++#line 2591 "parse.y" + { (*yyvalp).ttype = get_identifier ("Div"); ;} + break; + +- case 695: +-#line 2546 "parse.y" ++ case 704: ++#line 2592 "parse.y" + { (*yyvalp).ttype = get_identifier ("Mod"); ;} + break; + +- case 696: +-#line 2547 "parse.y" ++ case 705: ++#line 2593 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("RPower", "**"); ;} + break; + +- case 697: +-#line 2548 "parse.y" ++ case 706: ++#line 2594 "parse.y" + { (*yyvalp).ttype = get_identifier ("In"); ;} + break; + +- case 698: +-#line 2549 "parse.y" ++ case 707: ++#line 2595 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("LT", "<"); ;} + break; + +- case 699: +-#line 2550 "parse.y" ++ case 708: ++#line 2596 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("EQ", "="); ;} + break; + +- case 700: +-#line 2551 "parse.y" ++ case 709: ++#line 2597 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("GT", ">"); ;} + break; + +- case 701: +-#line 2552 "parse.y" ++ case 710: ++#line 2598 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("NE", "<>"); ;} + break; + +- case 702: +-#line 2553 "parse.y" ++ case 711: ++#line 2599 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("GE", ">="); ;} + break; + +- case 703: +-#line 2554 "parse.y" ++ case 712: ++#line 2600 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("LE", "<="); ;} + break; + +- case 704: +-#line 2555 "parse.y" ++ case 713: ++#line 2601 "parse.y" + { (*yyvalp).ttype = get_identifier ("And"); ;} + break; + +- case 705: +-#line 2556 "parse.y" ++ case 714: ++#line 2602 "parse.y" + { (*yyvalp).ttype = get_identifier ("Or"); ;} + break; + +- case 706: +-#line 2557 "parse.y" ++ case 715: ++#line 2603 "parse.y" + { (*yyvalp).ttype = get_identifier_with_spelling ("SymDiff", "<>"); ;} + break; + +- case 709: +-#line 2564 "parse.y" ++ case 718: ++#line 2610 "parse.y" + { warn_about_keyword_redeclaration ((*yyvalp).ttype, 1); ;} + break; + +- case 719: +-#line 2582 "parse.y" ++ case 728: ++#line 2628 "parse.y" + { warn_about_keyword_redeclaration ((*yyvalp).ttype, 1); ;} + break; + +- case 723: +-#line 2594 "parse.y" ++ case 732: ++#line 2640 "parse.y" + { warn_about_keyword_redeclaration ((*yyvalp).ttype, 1); ;} + break; + +- case 763: +-#line 2641 "parse.y" +- { (*yyvalp).ttype = check_identifier (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} ++ case 772: ++#line 2687 "parse.y" ++ { (*yyvalp).ttype = check_identifier (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype); ;} + break; + +- case 769: +-#line 2654 "parse.y" +- { char c = ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.itype; (*yyvalp).ttype = make_identifier (&c, 1); ;} ++ case 778: ++#line 2700 "parse.y" ++ { char c = yyvsp[YYFILL (0)].yystate.yysemantics.yysval.itype; (*yyvalp).ttype = make_identifier (&c, 1); ;} + break; + +- case 770: +-#line 2661 "parse.y" ++ case 779: ++#line 2707 "parse.y" + { pushlevel_expand (); ;} + break; + +- case 771: +-#line 2666 "parse.y" ++ case 780: ++#line 2712 "parse.y" + { poplevel_expand (0, 1); ;} + break; + +- case 772: +-#line 2671 "parse.y" ++ case 781: ++#line 2717 "parse.y" + { + #ifndef EGCS97 + push_obstacks_nochange (); +@@ -7601,43 +7788,43 @@ + ;} + break; + +- case 773: +-#line 2681 "parse.y" ++ case 782: ++#line 2727 "parse.y" + { lex_const_equal = 0; ;} + break; + +- case 774: +-#line 2686 "parse.y" +- { ASSERT_ID (((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.ttype, ((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yyloc, p_protected); ;} ++ case 783: ++#line 2732 "parse.y" ++ { ASSERT_ID (yyvsp[YYFILL (0)].yystate.yysemantics.yysval.ttype, yyvsp[YYFILL (0)].yystate.yyloc, p_protected); ;} + break; + +- case 775: +-#line 2691 "parse.y" ++ case 784: ++#line 2737 "parse.y" + { yyerrok; ;} + break; + +- case 776: +-#line 2693 "parse.y" ++ case 785: ++#line 2739 "parse.y" + { yyerrok; ;} + break; + +- case 783: +-#line 2710 "parse.y" ++ case 792: ++#line 2756 "parse.y" + { error ("missing `)'"); ;} + break; + +- case 785: +-#line 2716 "parse.y" ++ case 794: ++#line 2762 "parse.y" + { warning ("missing `.' at the end of program/unit/module"); ;} + break; + +- case 786: +-#line 2721 "parse.y" ++ case 795: ++#line 2767 "parse.y" + { (*yyvalp).ttype = NULL_TREE; ;} + break; + +- case 787: +-#line 2726 "parse.y" ++ case 796: ++#line 2772 "parse.y" + { (*yyvalp).ttype = error_mark_node; ;} + break; + +@@ -7653,7 +7840,7 @@ + # undef yyclearin + # undef YYRECOVERING + /* Line 738 of glr.c. */ +-#line 7657 "parse.c" ++#line 7844 "parse.c" + } + + +@@ -8921,7 +9108,7 @@ + } + + +-#line 2729 "parse.y" ++#line 2775 "parse.y" + + + /* Lexical analyzer moved to gpc-lex.c */ +@@ -9005,7 +9192,16 @@ + parser in the right places causes some conflicts (especially assignments + with nontrivial expressions on their left side are problematic). */ + if (current_function_decl) ++#ifndef GCC_3_4 + emit_line_note (dest->first_file, dest->first_line); ++#else ++ { ++ location_t loc_aux; ++ loc_aux.file = dest->first_file; ++ loc_aux.line = dest->first_line; ++ emit_line_note (loc_aux); ++ } ++#endif + } + dest->option_id = 0; + for (i = 1; i <= n; i++) +--- gpc-20040516.orig/p/parse.h Sun May 16 18:03:16 2004 ++++ gpc-20040516/p/parse.h Thu Jul 8 22:04:58 2004 +@@ -24,247 +24,249 @@ + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { +- prec_if = 258, +- prec_lower_than_error = 259, +- prec_import = 260, +- p_operator = 261, +- p_destructor = 262, +- p_constructor = 263, +- p_implementation = 264, +- p_uses = 265, +- p_else = 266, +- p_and = 267, +- p_array = 268, +- p_begin = 269, +- p_case = 270, +- p_div = 271, +- p_do = 272, +- p_downto = 273, +- p_end = 274, +- p_file = 275, +- p_for = 276, +- p_function = 277, +- p_goto = 278, +- p_if = 279, +- p_in = 280, +- p_label = 281, +- p_mod = 282, +- p_nil = 283, +- p_not = 284, +- p_of = 285, +- p_or = 286, +- p_packed = 287, +- p_procedure = 288, +- p_to = 289, +- p_program = 290, +- p_record = 291, +- p_repeat = 292, +- p_set = 293, +- p_then = 294, +- p_type = 295, +- p_until = 296, +- p_var = 297, +- p_while = 298, +- p_with = 299, +- p_absolute = 300, +- p_abstract = 301, +- p_and_then = 302, +- p_as = 303, +- p_asm = 304, +- p_attribute = 305, +- p_bindable = 306, +- p_const = 307, +- p_external = 308, +- p_far = 309, +- p_finalization = 310, +- p_forward = 311, +- p_import = 312, +- p_inherited = 313, +- p_initialization = 314, +- p_is = 315, +- p_near = 316, +- p_object = 317, +- p_only = 318, +- p_otherwise = 319, +- p_or_else = 320, +- p_pow = 321, +- p_restricted = 322, +- p_shl = 323, +- p_shr = 324, +- p_unit = 325, +- p_value = 326, +- p_virtual = 327, +- p_xor = 328, +- p_asmname = 329, +- p_c = 330, +- p_c_language = 331, +- p_Addr = 332, +- p_Assigned = 333, +- p_Dispose = 334, +- p_FormatString = 335, +- p_New = 336, +- p_Return = 337, +- LEX_ID = 338, +- LEX_BUILTIN_PROCEDURE = 339, +- LEX_BUILTIN_PROCEDURE_WRITE = 340, +- LEX_BUILTIN_FUNCTION = 341, +- LEX_BUILTIN_FUNCTION_VT = 342, +- LEX_BUILTIN_VARIABLE = 343, +- LEX_INTCONST = 344, +- LEX_INTCONST_BASE = 345, +- LEX_STRCONST = 346, +- LEX_REALCONST = 347, +- LEX_CARET_WHITE = 348, +- LEX_STRUCTOR = 349, +- LEX_CARET_LETTER = 350, +- LEX_CONST_EQUAL = 351, +- LEX_BPPLUS = 352, +- LEX_BPMINUS = 353, +- LEX_RANGE = 354, +- LEX_ELLIPSIS = 355, +- LEX_RENAME = 356, +- LEX_SYMDIFF = 357, +- LEX_ASSIGN = 358, +- LEX_NE = 359, +- LEX_GE = 360, +- LEX_LE = 361, +- LEX_POWER = 362, +- LEX_CEIL_PLUS = 363, +- LEX_CEIL_MINUS = 364, +- LEX_FLOOR_PLUS = 365, +- LEX_FLOOR_MINUS = 366, +- LEX_CEIL_MULT = 367, +- LEX_CEIL_DIV = 368, +- LEX_FLOOR_MULT = 369, +- LEX_FLOOR_DIV = 370 ++ prec_id = 258, ++ prec_if = 259, ++ prec_lower_than_error = 260, ++ prec_import = 261, ++ p_operator = 262, ++ p_destructor = 263, ++ p_constructor = 264, ++ p_implementation = 265, ++ p_initialization = 266, ++ p_uses = 267, ++ p_else = 268, ++ p_and = 269, ++ p_array = 270, ++ p_begin = 271, ++ p_case = 272, ++ p_div = 273, ++ p_do = 274, ++ p_downto = 275, ++ p_end = 276, ++ p_file = 277, ++ p_for = 278, ++ p_function = 279, ++ p_goto = 280, ++ p_if = 281, ++ p_in = 282, ++ p_label = 283, ++ p_mod = 284, ++ p_nil = 285, ++ p_not = 286, ++ p_of = 287, ++ p_or = 288, ++ p_packed = 289, ++ p_procedure = 290, ++ p_to = 291, ++ p_program = 292, ++ p_record = 293, ++ p_repeat = 294, ++ p_set = 295, ++ p_then = 296, ++ p_type = 297, ++ p_until = 298, ++ p_var = 299, ++ p_while = 300, ++ p_with = 301, ++ p_absolute = 302, ++ p_abstract = 303, ++ p_and_then = 304, ++ p_as = 305, ++ p_asm = 306, ++ p_attribute = 307, ++ p_bindable = 308, ++ p_const = 309, ++ p_external = 310, ++ p_far = 311, ++ p_finalization = 312, ++ p_forward = 313, ++ p_import = 314, ++ p_inherited = 315, ++ p_is = 316, ++ p_near = 317, ++ p_object = 318, ++ p_only = 319, ++ p_otherwise = 320, ++ p_or_else = 321, ++ p_pow = 322, ++ p_restricted = 323, ++ p_shl = 324, ++ p_shr = 325, ++ p_unit = 326, ++ p_value = 327, ++ p_virtual = 328, ++ p_xor = 329, ++ p_asmname = 330, ++ p_c = 331, ++ p_c_language = 332, ++ p_Addr = 333, ++ p_Assigned = 334, ++ p_Dispose = 335, ++ p_FormatString = 336, ++ p_New = 337, ++ p_Return = 338, ++ LEX_ID = 339, ++ LEX_BUILTIN_PROCEDURE = 340, ++ LEX_BUILTIN_PROCEDURE_WRITE = 341, ++ LEX_BUILTIN_FUNCTION = 342, ++ LEX_BUILTIN_FUNCTION_VT = 343, ++ LEX_BUILTIN_VARIABLE = 344, ++ LEX_INTCONST = 345, ++ LEX_INTCONST_BASE = 346, ++ LEX_STRCONST = 347, ++ LEX_REALCONST = 348, ++ LEX_CARET_WHITE = 349, ++ LEX_STRUCTOR = 350, ++ LEX_CARET_LETTER = 351, ++ LEX_CONST_EQUAL = 352, ++ LEX_BPPLUS = 353, ++ LEX_BPMINUS = 354, ++ LEX_RANGE = 355, ++ LEX_ELLIPSIS = 356, ++ LEX_RENAME = 357, ++ LEX_SYMDIFF = 358, ++ LEX_ASSIGN = 359, ++ LEX_NE = 360, ++ LEX_GE = 361, ++ LEX_LE = 362, ++ LEX_POWER = 363, ++ LEX_CEIL_PLUS = 364, ++ LEX_CEIL_MINUS = 365, ++ LEX_FLOOR_PLUS = 366, ++ LEX_FLOOR_MINUS = 367, ++ LEX_CEIL_MULT = 368, ++ LEX_CEIL_DIV = 369, ++ LEX_FLOOR_MULT = 370, ++ LEX_FLOOR_DIV = 371 + }; + #endif +-#define prec_if 258 +-#define prec_lower_than_error 259 +-#define prec_import 260 +-#define p_operator 261 +-#define p_destructor 262 +-#define p_constructor 263 +-#define p_implementation 264 +-#define p_uses 265 +-#define p_else 266 +-#define p_and 267 +-#define p_array 268 +-#define p_begin 269 +-#define p_case 270 +-#define p_div 271 +-#define p_do 272 +-#define p_downto 273 +-#define p_end 274 +-#define p_file 275 +-#define p_for 276 +-#define p_function 277 +-#define p_goto 278 +-#define p_if 279 +-#define p_in 280 +-#define p_label 281 +-#define p_mod 282 +-#define p_nil 283 +-#define p_not 284 +-#define p_of 285 +-#define p_or 286 +-#define p_packed 287 +-#define p_procedure 288 +-#define p_to 289 +-#define p_program 290 +-#define p_record 291 +-#define p_repeat 292 +-#define p_set 293 +-#define p_then 294 +-#define p_type 295 +-#define p_until 296 +-#define p_var 297 +-#define p_while 298 +-#define p_with 299 +-#define p_absolute 300 +-#define p_abstract 301 +-#define p_and_then 302 +-#define p_as 303 +-#define p_asm 304 +-#define p_attribute 305 +-#define p_bindable 306 +-#define p_const 307 +-#define p_external 308 +-#define p_far 309 +-#define p_finalization 310 +-#define p_forward 311 +-#define p_import 312 +-#define p_inherited 313 +-#define p_initialization 314 +-#define p_is 315 +-#define p_near 316 +-#define p_object 317 +-#define p_only 318 +-#define p_otherwise 319 +-#define p_or_else 320 +-#define p_pow 321 +-#define p_restricted 322 +-#define p_shl 323 +-#define p_shr 324 +-#define p_unit 325 +-#define p_value 326 +-#define p_virtual 327 +-#define p_xor 328 +-#define p_asmname 329 +-#define p_c 330 +-#define p_c_language 331 +-#define p_Addr 332 +-#define p_Assigned 333 +-#define p_Dispose 334 +-#define p_FormatString 335 +-#define p_New 336 +-#define p_Return 337 +-#define LEX_ID 338 +-#define LEX_BUILTIN_PROCEDURE 339 +-#define LEX_BUILTIN_PROCEDURE_WRITE 340 +-#define LEX_BUILTIN_FUNCTION 341 +-#define LEX_BUILTIN_FUNCTION_VT 342 +-#define LEX_BUILTIN_VARIABLE 343 +-#define LEX_INTCONST 344 +-#define LEX_INTCONST_BASE 345 +-#define LEX_STRCONST 346 +-#define LEX_REALCONST 347 +-#define LEX_CARET_WHITE 348 +-#define LEX_STRUCTOR 349 +-#define LEX_CARET_LETTER 350 +-#define LEX_CONST_EQUAL 351 +-#define LEX_BPPLUS 352 +-#define LEX_BPMINUS 353 +-#define LEX_RANGE 354 +-#define LEX_ELLIPSIS 355 +-#define LEX_RENAME 356 +-#define LEX_SYMDIFF 357 +-#define LEX_ASSIGN 358 +-#define LEX_NE 359 +-#define LEX_GE 360 +-#define LEX_LE 361 +-#define LEX_POWER 362 +-#define LEX_CEIL_PLUS 363 +-#define LEX_CEIL_MINUS 364 +-#define LEX_FLOOR_PLUS 365 +-#define LEX_FLOOR_MINUS 366 +-#define LEX_CEIL_MULT 367 +-#define LEX_CEIL_DIV 368 +-#define LEX_FLOOR_MULT 369 +-#define LEX_FLOOR_DIV 370 ++#define prec_id 258 ++#define prec_if 259 ++#define prec_lower_than_error 260 ++#define prec_import 261 ++#define p_operator 262 ++#define p_destructor 263 ++#define p_constructor 264 ++#define p_implementation 265 ++#define p_initialization 266 ++#define p_uses 267 ++#define p_else 268 ++#define p_and 269 ++#define p_array 270 ++#define p_begin 271 ++#define p_case 272 ++#define p_div 273 ++#define p_do 274 ++#define p_downto 275 ++#define p_end 276 ++#define p_file 277 ++#define p_for 278 ++#define p_function 279 ++#define p_goto 280 ++#define p_if 281 ++#define p_in 282 ++#define p_label 283 ++#define p_mod 284 ++#define p_nil 285 ++#define p_not 286 ++#define p_of 287 ++#define p_or 288 ++#define p_packed 289 ++#define p_procedure 290 ++#define p_to 291 ++#define p_program 292 ++#define p_record 293 ++#define p_repeat 294 ++#define p_set 295 ++#define p_then 296 ++#define p_type 297 ++#define p_until 298 ++#define p_var 299 ++#define p_while 300 ++#define p_with 301 ++#define p_absolute 302 ++#define p_abstract 303 ++#define p_and_then 304 ++#define p_as 305 ++#define p_asm 306 ++#define p_attribute 307 ++#define p_bindable 308 ++#define p_const 309 ++#define p_external 310 ++#define p_far 311 ++#define p_finalization 312 ++#define p_forward 313 ++#define p_import 314 ++#define p_inherited 315 ++#define p_is 316 ++#define p_near 317 ++#define p_object 318 ++#define p_only 319 ++#define p_otherwise 320 ++#define p_or_else 321 ++#define p_pow 322 ++#define p_restricted 323 ++#define p_shl 324 ++#define p_shr 325 ++#define p_unit 326 ++#define p_value 327 ++#define p_virtual 328 ++#define p_xor 329 ++#define p_asmname 330 ++#define p_c 331 ++#define p_c_language 332 ++#define p_Addr 333 ++#define p_Assigned 334 ++#define p_Dispose 335 ++#define p_FormatString 336 ++#define p_New 337 ++#define p_Return 338 ++#define LEX_ID 339 ++#define LEX_BUILTIN_PROCEDURE 340 ++#define LEX_BUILTIN_PROCEDURE_WRITE 341 ++#define LEX_BUILTIN_FUNCTION 342 ++#define LEX_BUILTIN_FUNCTION_VT 343 ++#define LEX_BUILTIN_VARIABLE 344 ++#define LEX_INTCONST 345 ++#define LEX_INTCONST_BASE 346 ++#define LEX_STRCONST 347 ++#define LEX_REALCONST 348 ++#define LEX_CARET_WHITE 349 ++#define LEX_STRUCTOR 350 ++#define LEX_CARET_LETTER 351 ++#define LEX_CONST_EQUAL 352 ++#define LEX_BPPLUS 353 ++#define LEX_BPMINUS 354 ++#define LEX_RANGE 355 ++#define LEX_ELLIPSIS 356 ++#define LEX_RENAME 357 ++#define LEX_SYMDIFF 358 ++#define LEX_ASSIGN 359 ++#define LEX_NE 360 ++#define LEX_GE 361 ++#define LEX_LE 362 ++#define LEX_POWER 363 ++#define LEX_CEIL_PLUS 364 ++#define LEX_CEIL_MINUS 365 ++#define LEX_FLOOR_PLUS 366 ++#define LEX_FLOOR_MINUS 367 ++#define LEX_CEIL_MULT 368 ++#define LEX_CEIL_DIV 369 ++#define LEX_FLOOR_MULT 370 ++#define LEX_FLOOR_DIV 371 + + + + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 103 "parse.y" ++#line 115 "parse.y" + typedef union YYSTYPE { + enum tree_code code; + long itype; + tree ttype; + } YYSTYPE; + /* Line 2039 of glr.c. */ +-#line 268 "parse.h" ++#line 270 "parse.h" + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif --- gcc-3.4-3.4.2.orig/debian/patches/rename-info-files.dpatch +++ gcc-3.4-3.4.2/debian/patches/rename-info-files.dpatch @@ -0,0 +1,570 @@ +#! /bin/sh -e + +# DP: Allow transformations on info file names. Reference the +# DP: transformed info file names in the texinfo files. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +gcc/ChangeLog: + +2004-02-17 Matthias Klose + + * Makefile.in: Allow transformations on info file names. + Define MAKEINFODEFS, macros to pass transformated info file + names to makeinfo. + * doc/cpp.texi: Use macros defined in MAKEINFODEFS for references. + * doc/cppinternals.texi: Likewise. + * doc/extend.texi: Likewise. + * doc/gcc.texi: Likewise. + * doc/gccint.texi: Likewise. + * doc/invoke.texi: Likewise. + * doc/libgcc.texi: Likewise. + * doc/makefile.texi: Likewise. + * doc/passes.texi: Likewise. + * doc/sourcebuild.texi: Likewise. + * doc/standards.texi: Likewise. + * doc/trouble.texi: Likewise. + +gcc/f/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + * g77.texi: Use macros defined in MAKEINFODEFS for references. + +gcc/java/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + * gcj.texi: Use macros defined in MAKEINFODEFS for references. + +gcc/treelang/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + Define TREELANG_MAKEINFODEFS macros to pass transformated info file + names to makeinfo. + * treelang.texi: Use macros defined in MAKEINFO_DEFS for references. + + +diff -ur gcc.old/Makefile.in gcc/Makefile.in +--- gcc.old/Makefile.in 2004-02-06 08:03:12.000000000 +0100 ++++ gcc/Makefile.in 2004-02-21 13:28:52.000000000 +0100 +@@ -2615,8 +2615,24 @@ + + doc: $(BUILD_INFO) $(GENERATED_MANPAGES) gccbug + +-INFOFILES = doc/cpp.info doc/gcc.info doc/gccint.info \ +- doc/gccinstall.info doc/cppinternals.info ++INFO_CPP_NAME = $(shell echo cpp|sed '$(program_transform_name)') ++INFO_GCC_NAME = $(shell echo gcc|sed '$(program_transform_name)') ++INFO_GCCINT_NAME = $(shell echo gccint|sed '$(program_transform_name)') ++INFO_GCCINSTALL_NAME = $(shell echo gccinstall|sed '$(program_transform_name)') ++INFO_CPPINT_NAME = $(shell echo cppinternals|sed '$(program_transform_name)') ++ ++INFO_G77_NAME = $(shell echo g77|sed '$(program_transform_name)') ++INFO_GCJ_NAME = $(shell echo gcj|sed '$(program_transform_name)') ++ ++INFOFILES = doc/$(INFO_CPP_NAME).info doc/$(INFO_GCC_NAME).info \ ++ doc/$(INFO_GCCINT_NAME).info \ ++ doc/$(INFO_GCCINSTALL_NAME).info doc/$(INFO_CPPINT_NAME).info ++ ++MAKEINFODEFS = -D 'fncpp $(INFO_CPP_NAME)' -D 'fngcc $(INFO_GCC_NAME)' \ ++ -D 'fngccint $(INFO_GCCINT_NAME)' \ ++ -D 'fngccinstall $(INFO_GCCINSTALL_NAME)' \ ++ -D 'fncppint $(INFO_CPPINT_NAME)' \ ++ -D 'fng77 $(INFO_G77_NAME)' -D 'fngcj $(INFO_GCJ_NAME)' + + info: $(INFOFILES) lang.info @GENINSRC@ srcinfo lang.srcinfo + +@@ -2645,21 +2661,40 @@ + # patterns. To use them, put each of the specific target with with their + # specific dependencies but no build commands. + +-doc/cpp.info: $(TEXI_CPP_FILES) +-doc/gcc.info: $(TEXI_GCC_FILES) +-doc/gccint.info: $(TEXI_GCCINT_FILES) +-doc/cppinternals.info: $(TEXI_CPPINT_FILES) +- ++# Generic entry to handle info files, which are not renamed (currently Ada) + doc/%.info: %.texi + if [ x$(BUILD_INFO) = xinfo ]; then \ + $(MAKEINFO) $(MAKEINFOFLAGS) -I $(docdir) \ + -I $(docdir)/include -o $@ $<; \ + fi + +-# Duplicate entry to handle renaming of gccinstall.info +-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) ++doc/$(INFO_CPP_NAME).info: $(TEXI_CPP_FILES) + if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(docdir) \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(docdir) \ ++ -I $(docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_GCC_NAME).info: $(TEXI_GCC_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(docdir) \ ++ -I $(docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_GCCINT_NAME).info: $(TEXI_GCCINT_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(docdir) \ ++ -I $(docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_CPPINT_NAME).info: $(TEXI_CPPINT_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(docdir) \ ++ -I $(docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_GCCINSTALL_NAME).info: $(TEXI_GCCINSTALL_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(docdir) \ + -I $(docdir)/include -o $@ $<; \ + fi + +@@ -2935,11 +2970,11 @@ + # $(INSTALL_DATA) might be a relative pathname, so we can't cd into srcdir + # to do the install. + install-info:: doc installdirs \ +- $(DESTDIR)$(infodir)/cpp.info \ +- $(DESTDIR)$(infodir)/gcc.info \ +- $(DESTDIR)$(infodir)/cppinternals.info \ +- $(DESTDIR)$(infodir)/gccinstall.info \ +- $(DESTDIR)$(infodir)/gccint.info ++ $(DESTDIR)$(infodir)/$(INFO_CPP_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCC_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_CPPINT_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCCINSTALL_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCCINT_NAME).info + + $(DESTDIR)$(infodir)/%.info: doc/%.info installdirs + rm -f $@ +@@ -3107,8 +3142,11 @@ + -rm -rf $(DESTDIR)$(man1dir)/cpp$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/protoize$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/unprotoize$(man1ext) +- -rm -f $(DESTDIR)$(infodir)/cpp.info* $(DESTDIR)$(infodir)/gcc.info* +- -rm -f $(DESTDIR)$(infodir)/cppinternals.info* $(DESTDIR)$(infodir)/gccint.info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_CPP_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCC_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_CPPINT_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCCINT_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCCINSTALL_NAME).info* + # + # These targets are for the dejagnu testsuites. The file site.exp + # contains global variables that all the testsuites will use. +diff -ur gcc.old/doc/cpp.texi gcc/doc/cpp.texi +--- gcc.old/doc/cpp.texi 2004-01-18 23:43:09.000000000 +0100 ++++ gcc/doc/cpp.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -54,7 +54,7 @@ + @ifinfo + @dircategory Programming + @direntry +-* Cpp: (cpp). The GNU C preprocessor. ++* @value{fncpp}: (@value{fncpp}). The GNU C preprocessor. + @end direntry + @end ifinfo + +diff -ur gcc.old/doc/cppinternals.texi gcc/doc/cppinternals.texi +--- gcc.old/doc/cppinternals.texi 2002-03-02 00:38:51.000000000 +0100 ++++ gcc/doc/cppinternals.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -5,7 +5,7 @@ + @ifinfo + @dircategory Programming + @direntry +-* Cpplib: (cppinternals). Cpplib internals. ++* @value{fncppint}: (@value{fncppint}). Cpplib internals. + @end direntry + @end ifinfo + +diff -ur gcc.old/doc/extend.texi gcc/doc/extend.texi +--- gcc.old/doc/extend.texi 2004-01-22 00:41:23.000000000 +0100 ++++ gcc/doc/extend.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -7671,7 +7671,7 @@ + test for the GNU compiler the same way as for C programs: check for a + predefined macro @code{__GNUC__}. You can also use @code{__GNUG__} to + test specifically for GNU C++ (@pxref{Common Predefined Macros,, +-Predefined Macros,cpp,The GNU C Preprocessor}). ++Predefined Macros,@value{fncpp},The GNU C Preprocessor}). + + @menu + * Min and Max:: C++ Minimum and maximum operators. +diff -ur gcc.old/doc/gcc.texi gcc/doc/gcc.texi +--- gcc.old/doc/gcc.texi 2004-01-02 12:27:45.000000000 +0100 ++++ gcc/doc/gcc.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -79,7 +79,7 @@ + @ifnottex + @dircategory Programming + @direntry +-* gcc: (gcc). The GNU Compiler Collection. ++* @value{fngcc}: (@value{fngcc}). The GNU Compiler Collection. + @end direntry + This file documents the use of the GNU compilers. + @sp 1 +@@ -131,7 +131,7 @@ + The internals of the GNU compilers, including how to port them to new + targets and some information about how to write front ends for new + languages, are documented in a separate manual. @xref{Top,, +-Introduction, gccint, GNU Compiler Collection (GCC) Internals}. ++Introduction, @value{fngccint}, GNU Compiler Collection (GCC) Internals}. + + @menu + * G++ and GCC:: You can compile C or C++ programs. +diff -ur gcc.old/doc/gccint.texi gcc/doc/gccint.texi +--- gcc.old/doc/gccint.texi 2004-01-02 12:27:45.000000000 +0100 ++++ gcc/doc/gccint.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -65,7 +65,7 @@ + @ifnottex + @dircategory Programming + @direntry +-* gccint: (gccint). Internals of the GNU Compiler Collection. ++* @value{fngccint}: (@value{fngccint}). Internals of the GNU Compiler Collection. + @end direntry + This file documents the internals of the GNU compilers. + @sp 1 +@@ -114,7 +114,7 @@ + how to port them to new targets and some information about how to + write front ends for new languages. It corresponds to GCC version + @value{version-GCC}. The use of the GNU compilers is documented in a +-separate manual. @xref{Top,, Introduction, gcc, Using the GNU ++separate manual. @xref{Top,, Introduction, @value{fngcc}, Using the GNU + Compiler Collection (GCC)}. + + This manual is mainly a reference manual rather than a tutorial. It +diff -ur gcc.old/doc/invoke.texi gcc/doc/invoke.texi +--- gcc.old/doc/invoke.texi 2004-02-18 09:17:23.000000000 +0100 ++++ gcc/doc/invoke.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -763,7 +763,7 @@ + Fortran source code which must be preprocessed with a RATFOR + preprocessor (not included with GCC)@. + +-@xref{Overall Options,,Options Controlling the Kind of Output, g77, ++@xref{Overall Options,,Options Controlling the Kind of Output, @value{fng77}, + Using and Porting GNU Fortran}, for more details of the handling of + Fortran input files. + +@@ -5045,7 +5045,7 @@ + @option{-nodefaultlibs} is @file{libgcc.a}, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or special + needs for some languages. +-(@xref{Interface,,Interfacing to GCC Output,gccint,GNU Compiler ++(@xref{Interface,,Interfacing to GCC Output,@value{fngccint},GNU Compiler + Collection (GCC) Internals}, + for more discussion of @file{libgcc.a}.) + In most cases, you need @file{libgcc.a} even when you want to avoid +@@ -5053,7 +5053,7 @@ + or @option{-nodefaultlibs} you should usually specify @option{-lgcc} as well. + This ensures that you have no unresolved references to internal GCC + library subroutines. (For example, @samp{__main}, used to ensure C++ +-constructors will be called; @pxref{Collect2,,@code{collect2}, gccint, ++constructors will be called; @pxref{Collect2,,@code{collect2}, @value{fngccint}, + GNU Compiler Collection (GCC) Internals}.) + + @item -pie +@@ -11211,7 +11211,7 @@ + @option{-B}, @option{-I} and @option{-L} (@pxref{Directory Options}). These + take precedence over places specified using environment variables, which + in turn take precedence over those specified by the configuration of GCC@. +-@xref{Driver,, Controlling the Compilation Driver @file{gcc}, gccint, ++@xref{Driver,, Controlling the Compilation Driver @file{gcc}, @value{fngccint}, + GNU Compiler Collection (GCC) Internals}. + + @table @env +@@ -11363,7 +11363,7 @@ + + A precompiled header file will be searched for when @code{#include} is + seen in the compilation. As it searches for the included file +-(@pxref{Search Path,,Search Path,cpp,The C Preprocessor}) the ++(@pxref{Search Path,,Search Path,@value{fncpp},The C Preprocessor}) the + compiler looks for a precompiled header in each directory just before it + looks for the include file in that directory. The name searched for is + the name specified in the @code{#include} with @samp{.gch} appended. If +diff -ur gcc.old/doc/libgcc.texi gcc/doc/libgcc.texi +--- gcc.old/doc/libgcc.texi 2004-01-18 23:43:10.000000000 +0100 ++++ gcc/doc/libgcc.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -24,7 +24,7 @@ + GCC will also generate calls to C library routines, such as + @code{memcpy} and @code{memset}, in some cases. The set of routines + that GCC may possibly use is documented in @ref{Other +-Builtins,,,gcc, Using the GNU Compiler Collection (GCC)}. ++Builtins,,,@value{fngcc}, Using the GNU Compiler Collection (GCC)}. + + These routines take arguments and return values of a specific machine + mode, not a specific C type. @xref{Machine Modes}, for an explanation +diff -ur gcc.old/doc/makefile.texi gcc/doc/makefile.texi +--- gcc.old/doc/makefile.texi 2004-02-08 09:09:36.000000000 +0100 ++++ gcc/doc/makefile.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -121,7 +121,7 @@ + @item profiledbootstrap + Builds a compiler with profiling feedback information. For more + information, see +-@ref{Building,,Building with profile feedback,gccinstall,Installing GCC}. ++@ref{Building,,Building with profile feedback,@value{fngccinstall},Installing GCC}. + This is actually a target in the top-level directory, which then + recurses into the @file{gcc} subdirectory multiple times. + +diff -ur gcc.old/doc/passes.texi gcc/doc/passes.texi +--- gcc.old/doc/passes.texi 2003-11-24 00:52:07.000000000 +0100 ++++ gcc/doc/passes.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -45,7 +45,7 @@ + definition's compilation is entirely freed, unless it is an inline + function, or was deferred for some reason (this can occur in + templates, for example). +-(@pxref{Inline,,An Inline Function is As Fast As a Macro,gcc,Using the ++(@pxref{Inline,,An Inline Function is As Fast As a Macro,@value{fngcc},Using the + GNU Compiler Collection (GCC)}). + + Here is a list of all the passes of the compiler and their source files. +@@ -74,7 +74,7 @@ + C preprocessing, for language front ends, that want or require it, is + performed by cpplib, which is covered in separate documentation. In + particular, the internals are covered in @xref{Top, ,Cpplib internals, +-cppinternals, Cpplib Internals}. ++@value{fncppinternals}, Cpplib Internals}. + + The source files to parse C are found in the toplevel directory, and + by convention are named @file{c-*}. Some of these are also used by +diff -ur gcc.old/doc/standards.texi gcc/doc/standards.texi +--- gcc.old/doc/standards.texi 2004-01-18 23:43:10.000000000 +0100 ++++ gcc/doc/standards.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -185,8 +185,8 @@ + GNAT Reference Manual}, for information on standard + conformance and compatibility of the Ada compiler. + +-@xref{Language,,The GNU Fortran Language, g77, Using and Porting GNU ++@xref{Language,,The GNU Fortran Language, @value{fng77}, Using and Porting GNU + Fortran}, for details of the Fortran language supported by GCC@. + +-@xref{Compatibility,,Compatibility with the Java Platform, gcj, GNU gcj}, ++@xref{Compatibility,,Compatibility with the Java Platform, @value{fngcj}, GNU gcj}, + for details of compatibility between @command{gcj} and the Java Platform. +diff -ur gcc.old/doc/trouble.texi gcc/doc/trouble.texi +--- gcc.old/doc/trouble.texi 2004-02-04 22:12:40.000000000 +0100 ++++ gcc/doc/trouble.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -88,7 +88,7 @@ + as @code{REAL_VALUE_TYPE}. But doing so is a substantial amount of + work for each target machine. + @xref{Cross-compilation,,Cross Compilation and Floating Point, +-gccint, GNU Compiler Collection (GCC) Internals}. ++@value{fngccint}, GNU Compiler Collection (GCC) Internals}. + + @item + At present, the program @file{mips-tfile} which adds debug +diff -ur gcc.old/f/Make-lang.in gcc/f/Make-lang.in +--- gcc.old/f/Make-lang.in 2004-02-20 11:53:17.000000000 +0100 ++++ gcc/f/Make-lang.in 2004-02-21 13:28:52.000000000 +0100 +@@ -153,7 +153,8 @@ + cd $(srcdir)/f; etags -o TAGS.sub *.c *.h; \ + etags --include TAGS.sub --include ../TAGS.sub + +-f77.info: doc/g77.info ++INFO_G77_NAME = $(shell echo g77|sed '$(program_transform_name)') ++f77.info: doc/$(INFO_G77_NAME).info + dvi:: doc/g77.dvi + f77.man: doc/g77.1 + +@@ -166,10 +167,10 @@ + $(docdir)/include/gpl.texi $(docdir)/include/funding.texi \ + $(docdir)/include/gcc-common.texi $(srcdir)/f/intdoc.texi + +-doc/g77.info: $(TEXI_G77_FILES) ++doc/$(INFO_G77_NAME).info: $(TEXI_G77_FILES) + if test "x$(BUILD_INFO)" = xinfo; then \ + rm -f $(@)*; \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I$(docdir)/include -I$(srcdir)/f \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I$(docdir)/include -I$(srcdir)/f \ + -o$@ $<; \ + else true; fi + +@@ -264,7 +265,7 @@ + echo ''; \ + else true; fi + +-install-info:: $(DESTDIR)$(infodir)/g77.info ++install-info:: $(DESTDIR)$(infodir)/$(INFO_G77_NAME).info + + f77.install-man: installdirs $(DESTDIR)$(man1dir)/$(G77_INSTALL_NAME)$(man1ext) + +@@ -280,7 +281,7 @@ + else : ; fi + rm -rf $(DESTDIR)$(bindir)/$(G77_INSTALL_NAME)$(exeext); \ + rm -rf $(DESTDIR)$(man1dir)/$(G77_INSTALL_NAME)$(man1ext); \ +- rm -rf $(DESTDIR)$(infodir)/g77.info* ++ rm -f $(DESTDIR)$(infodir)/$(INFO_G77_NAME).info* + # + # Clean hooks: + # A lot of the ancillary files are deleted by the main makefile. +diff -ur gcc.old/java/Make-lang.in gcc/java/Make-lang.in +--- gcc.old/java/Make-lang.in 2004-02-06 08:04:13.000000000 +0100 ++++ gcc/java/Make-lang.in 2004-02-21 13:28:52.000000000 +0100 +@@ -158,12 +158,23 @@ + --regex='/DEFTREECODE [(]\([A-Z_]+\)/\1/' java-tree.def; \ + etags --include TAGS.sub --include ../TAGS.sub + ++TEXI_GCJ_FILES = java/gcj.texi \ ++ $(docdir)/include/gpl.texi $(docdir)/include/funding.texi \ ++ $(docdir)/include/fdl.texi $(docdir)/include/gcc-common.texi ++INFO_GCJ_NAME = $(shell echo gcj|sed '$(program_transform_name)') + +-java.info: doc/gcj.info ++java.info: doc/$(INFO_GCJ_NAME).info + +-java.srcinfo: doc/gcj.info ++java.srcinfo: doc/$(INFO_GCJ_NAME).info + -cp -p $^ $(srcdir)/doc + ++doc/$(INFO_GCJ_NAME).info: $(TEXI_GCJ_FILES) ++ if test "x$(BUILD_INFO)" = xinfo; then \ ++ rm -f $(@)*; \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) \ ++ -I$(docdir)/include -I$(srcdir)/f -o$@ $<; \ ++ else true; fi ++ + dvi:: doc/gcj.dvi + JAVA_MANFILES = doc/gcj.1 doc/gcjh.1 doc/jv-scan.1 doc/jcf-dump.1 doc/gij.1 \ + doc/jv-convert.1 doc/rmic.1 doc/rmiregistry.1 +@@ -224,8 +235,9 @@ + -rm -rf $(DESTDIR)$(man1dir)/jcf-dump$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/gij$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/jv-convert$(man1ext) ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCJ_NAME).info* + +-install-info:: $(DESTDIR)$(infodir)/gcj.info ++install-info:: $(DESTDIR)$(infodir)/$(INFO_GCJ_NAME).info + + # + # Clean hooks: +diff -ur gcc.old/java/gcj.texi gcc/java/gcj.texi +--- gcc.old/java/gcj.texi 2003-08-29 23:25:30.000000000 +0200 ++++ gcc/java/gcj.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -52,7 +52,7 @@ + @format + @dircategory Programming + @direntry +-* Gcj: (gcj). Ahead-of-time compiler for the Java language ++* @value{fngcj}: (@value{fngcj}). Ahead-of-time compiler for the Java language + @end direntry + + @dircategory Individual utilities +@@ -151,7 +151,7 @@ + + As @command{gcj} is just another front end to @command{gcc}, it supports many + of the same options as gcc. @xref{Option Summary, , Option Summary, +-gcc, Using the GNU Compiler Collection (GCC)}. This manual only documents the ++@value{fngcc}, Using the GNU Compiler Collection (GCC)}. This manual only documents the + options specific to @command{gcj}. + + @c man end +diff -ur gcc.old/treelang/Make-lang.in gcc/treelang/Make-lang.in +--- gcc.old/treelang/Make-lang.in 2004-01-31 07:53:34.000000000 +0100 ++++ gcc/treelang/Make-lang.in 2004-02-21 13:28:52.000000000 +0100 +@@ -146,17 +146,21 @@ + cd $(srcdir)/treelang; etags -o TAGS.sub *.y *.l *.c *.h; \ + etags --include TAGS.sub --include ../TAGS.sub + +-treelang.info: doc/treelang.info ++INFO_TREELANG_NAME = $(shell echo treelang|sed '$(program_transform_name)') ++TREELANG_MAKEINFODEFS = -D 'fntreelang $(INFO_TREELANG_NAME)' + +-treelang.srcinfo: doc/treelang.info ++treelang.info: doc/$(INFO_TREELANG_NAME).info ++ ++treelang.srcinfo: doc/$(INFO_TREELANG_NAME).info + -cp -p $^ $(srcdir)/doc + + dvi:: doc/treelang.dvi + +-doc/treelang.info: treelang/treelang.texi $(docdir)/include/gcc-common.texi \ ++doc/$(INFO_TREELANG_NAME).info: treelang/treelang.texi $(docdir)/include/gcc-common.texi \ + $(docdir)/include/gpl.texi $(docdir)/include/fdl.texi \ + $(docdir)/include/funding.texi +- $(MAKEINFO) $(MAKEINFOFLAGS) -I$(docdir)/include -o $@ $< ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) \ ++ $(TREELANG_MAKEINFODEFS) -I$(docdir)/include -o $@ $< + + doc/treelang.dvi: treelang/treelang.texi $(docdir)/include/gcc-common.texi \ + $(docdir)/include/gpl.texi $(docdir)/include/fdl.texi \ +@@ -189,7 +193,7 @@ + $(STAMP) treelang.install.common.done + + # We might not be able to build the info files +-install-info:: $(DESTDIR)$(infodir)/treelang.info ++install-info:: $(DESTDIR)$(infodir)/$(INFO_TREELANG_NAME).info + + treelang.install-man: + +@@ -202,6 +206,7 @@ + echo -rm -rf $(DESTDIR)$(bindir)/$$name2$(exeext); \ + rm -rf $(DESTDIR)$(bindir)/$$name2$(exeext); \ + done ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_TREELANG_NAME).info* + -rm treelang.install.common.done + + # +diff -ur gcc.old/treelang/treelang.texi gcc/treelang/treelang.texi +--- gcc.old/treelang/treelang.texi 2003-12-06 00:15:02.000000000 +0100 ++++ gcc/treelang/treelang.texi 2004-02-21 13:28:52.000000000 +0100 +@@ -106,7 +106,7 @@ + @ifnottex + @dircategory Programming + @direntry +-* treelang: (treelang). The GNU Treelang compiler. ++* @value{fntreelang}: (@value{fntreelang}). The GNU Treelang compiler. + @end direntry + @ifset INTERNALS + @ifset USING +@@ -278,7 +278,7 @@ + @item + The packaging and compiler portions of GNU Treelang are based largely + on the GCC compiler. +-@xref{Contributors,,Contributors to GCC,GCC,Using and Maintaining GCC}, ++@xref{Contributors,,Contributors to GCC,@value{fngcc},Using and Maintaining GCC}, + for more information. + + @item +@@ -885,7 +885,7 @@ + command-line options that are designed to cater to Treelang users + but apply to other languages as well. + +-@xref{G++ and GCC,,Programming Languages Supported by GCC,GCC,Using ++@xref{G++ and GCC,,Programming Languages Supported by GCC,@value{fngcc},Using + the GNU Compiler Collection (GCC)}, + for information on the way different languages are handled + by the GCC compiler (@code{gcc}). +diff -ur gcc.old/f/g77.texi gcc/f/g77.texi +--- gcc.old/f/g77.texi 2003-05-16 17:08:37.000000000 +0200 ++++ gcc/f/g77.texi 2004-02-28 16:04:22.000000000 +0100 +@@ -88,7 +88,7 @@ + @ifinfo + @dircategory Programming + @direntry +-* g77: (g77). The GNU Fortran compiler. ++* * @value{fng77}: (@value{fng77}). The GNU Fortran compiler. + @end direntry + @ifset INTERNALS + @ifset USING --- gcc-3.4-3.4.2.orig/debian/patches/java-gui-branch.dpatch +++ gcc-3.4-3.4.2/debian/patches/java-gui-branch.dpatch @@ -0,0 +1,129200 @@ +#! /bin/sh -e + +# DP: Michael Koch +# DP: Backport AWT, Swing and GTK peer from java-gui-branch (20040906). + +dir=libjava +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3/libjava" + dir="$3/libjava" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +? gnu/regexp +? gnu/java/awt/doc-files +? gnu/java/nio/channels +Index: Makefile.am +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v +retrieving revision 1.354.2.3 +diff -u -r1.354.2.3 Makefile.am +--- Makefile.am 24 Jan 2004 20:47:28 -0000 1.354.2.3 ++++ Makefile.am 6 Sep 2004 16:35:34 -0000 +@@ -182,11 +182,13 @@ + ## Gtk JNI sources. + gtk_c_source_files = \ + $(gtk_cairo_c_source_files) \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c \ +@@ -195,11 +197,13 @@ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c \ +@@ -219,15 +223,16 @@ + + ## Java sources for Gtk peers. + gtk_awt_peer_sources = \ ++gnu/java/awt/peer/gtk/GThreadMutex.java \ ++gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java \ + gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java \ + gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java \ + gnu/java/awt/peer/gtk/GdkFontMetrics.java \ + gnu/java/awt/peer/gtk/GdkGlyphVector.java \ + gnu/java/awt/peer/gtk/GdkGraphics.java \ + gnu/java/awt/peer/gtk/GdkGraphics2D.java \ ++gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java \ + gnu/java/awt/peer/gtk/GdkPixbufDecoder.java \ +-gnu/java/awt/peer/gtk/GtkArg.java \ +-gnu/java/awt/peer/gtk/GtkArgList.java \ + gnu/java/awt/peer/gtk/GtkButtonPeer.java \ + gnu/java/awt/peer/gtk/GtkCanvasPeer.java \ + gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.java \ +@@ -1074,24 +1079,32 @@ + java/awt/geom/FlatteningPathIterator.java \ + java/awt/geom/GeneralPath.java \ + java/awt/geom/QuadCurve2D.java \ ++java/awt/image/AffineTransformOp.java \ ++java/awt/image/ByteLookupTable.java \ + java/awt/image/BufferedImage.java \ + java/awt/image/ColorModel.java \ + java/awt/image/ComponentColorModel.java \ + java/awt/image/ComponentSampleModel.java \ + java/awt/image/DataBuffer.java \ + java/awt/image/DataBufferByte.java \ ++java/awt/image/DataBufferDouble.java \ ++java/awt/image/DataBufferFloat.java \ + java/awt/image/DataBufferInt.java \ ++java/awt/image/DataBufferShort.java \ + java/awt/image/DataBufferUShort.java \ + java/awt/image/DirectColorModel.java \ + java/awt/image/ImageConsumer.java \ + java/awt/image/ImageObserver.java \ + java/awt/image/ImageProducer.java \ + java/awt/image/IndexColorModel.java \ ++java/awt/image/Kernel.java \ ++java/awt/image/LookupTable.java \ + java/awt/image/PackedColorModel.java \ + java/awt/image/Raster.java \ + java/awt/image/RasterOp.java \ + java/awt/image/SampleModel.java \ + java/awt/image/SinglePixelPackedSampleModel.java \ ++java/awt/image/ShortLookupTable.java \ + java/awt/image/WritableRaster.java \ + java/awt/image/AreaAveragingScaleFilter.java \ + java/awt/image/CropImageFilter.java \ +@@ -1099,6 +1112,7 @@ + java/awt/image/ImageFilter.java \ + java/awt/image/MemoryImageSource.java \ + java/awt/image/PixelGrabber.java \ ++java/awt/image/PixelInterleavedSampleModel.java \ + java/awt/image/RGBImageFilter.java \ + java/awt/image/ReplicateScaleFilter.java \ + java/awt/image/BufferStrategy.java \ +@@ -1293,26 +1307,59 @@ + javax/swing/GrayFilter.java \ + javax/swing/AbstractAction.java \ + javax/swing/AbstractButton.java \ ++javax/swing/plaf/basic/BasicArrowButton.java \ ++javax/swing/plaf/basic/BasicButtonListener.java \ + javax/swing/plaf/basic/BasicButtonUI.java \ ++javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java \ + javax/swing/plaf/basic/BasicCheckBoxUI.java \ +-javax/swing/plaf/basic/BasicDefaults.java \ ++javax/swing/plaf/basic/BasicColorChooserUI.java \ ++javax/swing/plaf/basic/BasicComboBoxEditor.java \ ++javax/swing/plaf/basic/BasicComboBoxRenderer.java \ ++javax/swing/plaf/basic/BasicComboBoxUI.java \ ++javax/swing/plaf/basic/BasicComboPopup.java \ ++javax/swing/plaf/basic/BasicDesktopIconUI.java \ ++javax/swing/plaf/basic/BasicDesktopPaneUI.java \ ++javax/swing/plaf/basic/BasicFormattedTextFieldUI.java \ + javax/swing/plaf/basic/BasicGraphicsUtils.java \ ++javax/swing/plaf/basic/BasicInternalFrameTitlePane.java \ ++javax/swing/plaf/basic/BasicInternalFrameUI.java \ ++javax/swing/plaf/basic/BasicMenuBarUI.java \ ++javax/swing/plaf/basic/BasicMenuItemUI.java \ ++javax/swing/plaf/basic/BasicMenuUI.java \ + javax/swing/plaf/basic/BasicLabelUI.java \ + javax/swing/plaf/basic/BasicListUI.java \ + javax/swing/plaf/basic/BasicOptionPaneUI.java \ + javax/swing/plaf/basic/BasicPanelUI.java \ ++javax/swing/plaf/basic/BasicPasswordFieldUI.java \ ++javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java \ ++javax/swing/plaf/basic/BasicPopupMenuUI.java \ ++javax/swing/plaf/basic/BasicProgressBarUI.java \ ++javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java \ + javax/swing/plaf/basic/BasicRadioButtonUI.java \ ++javax/swing/plaf/basic/BasicRootPaneUI.java \ ++javax/swing/plaf/basic/BasicScrollBarUI.java \ + javax/swing/plaf/basic/BasicScrollPaneUI.java \ ++javax/swing/plaf/basic/BasicSeparatorUI.java \ ++javax/swing/plaf/basic/BasicSliderUI.java \ ++javax/swing/plaf/basic/BasicSpinnerUI.java \ + javax/swing/plaf/basic/BasicSplitPaneDivider.java \ + javax/swing/plaf/basic/BasicSplitPaneUI.java \ + javax/swing/plaf/basic/BasicTabbedPaneUI.java \ ++javax/swing/plaf/basic/BasicTableHeaderUI.java \ ++javax/swing/plaf/basic/BasicTableUI.java \ ++javax/swing/plaf/basic/BasicTextAreaUI.java \ ++javax/swing/plaf/basic/BasicTextFieldUI.java \ + javax/swing/plaf/basic/BasicTextUI.java \ + javax/swing/plaf/basic/BasicToggleButtonUI.java \ ++javax/swing/plaf/basic/BasicToolBarSeparatorUI.java \ ++javax/swing/plaf/basic/BasicToolBarUI.java \ ++javax/swing/plaf/basic/BasicToolTipUI.java \ + javax/swing/plaf/basic/BasicTreeUI.java \ + javax/swing/plaf/basic/BasicViewportUI.java \ + javax/swing/plaf/basic/BasicLookAndFeel.java \ + javax/swing/plaf/basic/BasicBorders.java \ + javax/swing/plaf/basic/BasicIconFactory.java \ ++javax/swing/plaf/basic/ComboPopup.java \ + javax/swing/plaf/BorderUIResource.java \ + javax/swing/plaf/UIResource.java \ + javax/swing/plaf/ButtonUI.java \ +@@ -1357,10 +1404,15 @@ + javax/swing/plaf/ToolTipUI.java \ + javax/swing/AbstractListModel.java \ + javax/swing/AbstractSet.java \ ++javax/swing/AbstractSpinnerModel.java \ + javax/swing/colorchooser/AbstractColorChooserPanel.java \ + javax/swing/colorchooser/ColorChooserComponentFactory.java \ + javax/swing/colorchooser/ColorSelectionModel.java \ + javax/swing/colorchooser/DefaultColorSelectionModel.java \ ++javax/swing/colorchooser/DefaultHSBChooserPanel.java \ ++javax/swing/colorchooser/DefaultPreviewPanel.java \ ++javax/swing/colorchooser/DefaultRGBChooserPanel.java \ ++javax/swing/colorchooser/DefaultSwatchChooserPanel.java \ + javax/swing/filechooser/FileFilter.java \ + javax/swing/filechooser/FileSystemView.java \ + javax/swing/filechooser/FileView.java \ +@@ -1406,7 +1458,9 @@ + javax/swing/JRootPane.java \ + javax/swing/JScrollBar.java \ + javax/swing/JScrollPane.java \ ++javax/swing/JSpinner.java \ + javax/swing/JTabbedPane.java \ ++javax/swing/JTextArea.java \ + javax/swing/JTextField.java \ + javax/swing/JToggleButton.java \ + javax/swing/JToolTip.java \ +@@ -1419,10 +1473,12 @@ + javax/swing/ListSelectionModel.java \ + javax/swing/LookAndFeel.java \ + javax/swing/Scrollable.java \ ++javax/swing/SpinnerModel.java \ ++javax/swing/SpinnerNumberModel.java \ + javax/swing/SwingConstants.java \ + javax/swing/SwingUtilities.java \ + javax/swing/Timer.java \ +-javax/swing/ToggleButtonModel.java \ ++javax/swing/TransferHandler.java \ + javax/swing/UIDefaults.java \ + javax/swing/UIManager.java \ + javax/swing/UnsupportedLookAndFeelException.java \ +@@ -1474,22 +1530,33 @@ + javax/swing/text/AttributeSet.java \ + javax/swing/text/BadLocationException.java \ + javax/swing/text/Caret.java \ +-javax/swing/text/CharacterIterator.java \ + javax/swing/text/ComponentView.java \ + javax/swing/text/DefaultCaret.java \ + javax/swing/text/DefaultEditorKit.java \ ++javax/swing/text/DefaultHighlighter.java \ + javax/swing/text/Document.java \ + javax/swing/text/DocumentFilter.java \ + javax/swing/text/EditorKit.java \ + javax/swing/text/Element.java \ ++javax/swing/text/FieldView.java \ + javax/swing/text/GapContent.java \ ++javax/swing/text/Highlighter.java \ + javax/swing/text/JTextComponent.java \ + javax/swing/text/Keymap.java \ ++javax/swing/text/LayeredHighlighter.java \ + javax/swing/text/PlainDocument.java \ +-javax/swing/text/PlainEditorKit.java \ ++javax/swing/text/PlainView.java \ + javax/swing/text/Position.java \ + javax/swing/text/Segment.java \ ++javax/swing/text/SimpleAttributeSet.java \ + javax/swing/text/Style.java \ ++javax/swing/text/StyleConstants.java \ ++javax/swing/text/StyleContext.java \ ++javax/swing/text/TabExpander.java \ ++javax/swing/text/TabableView.java \ ++javax/swing/text/TabSet.java \ ++javax/swing/text/TabStop.java \ ++javax/swing/text/Utilities.java \ + javax/swing/text/View.java \ + javax/swing/text/ViewFactory.java \ + javax/swing/text/MutableAttributeSet.java \ +@@ -1577,6 +1644,8 @@ + javax/swing/ProgressMonitorInputStream.java \ + javax/swing/RepaintManager.java \ + javax/swing/ScrollPaneLayout.java \ ++javax/swing/Spring.java \ ++javax/swing/SpringLayout.java \ + javax/swing/ToolTipManager.java \ + javax/swing/ViewportLayout.java + +@@ -2351,6 +2420,8 @@ + gnu/java/nio/charset/UTF_8.java \ + gnu/java/security/Engine.java \ + gnu/java/security/OID.java \ ++gnu/java/security/action/GetPropertyAction.java \ ++gnu/java/security/action/SetAccessibleAction.java \ + gnu/java/security/der/BitString.java \ + gnu/java/security/der/DER.java \ + gnu/java/security/der/DEREncodingException.java \ +@@ -2800,7 +2871,6 @@ + gnu/gcj/runtime/natStackTrace.cc \ + gnu/gcj/runtime/natStringBuffer.cc \ + gnu/gcj/runtime/natVMClassLoader.cc \ +-gnu/java/awt/natEmbeddedWindow.cc \ + gnu/java/net/natPlainDatagramSocketImpl.cc \ + gnu/java/net/natPlainSocketImpl.cc \ + gnu/java/net/protocol/core/natCoreInputStream.cc \ +Index: Makefile.in +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/Makefile.in,v +retrieving revision 1.378.2.3 +diff -u -r1.378.2.3 Makefile.in +--- Makefile.in 24 Jan 2004 20:47:28 -0000 1.378.2.3 ++++ Makefile.in 6 Sep 2004 16:35:36 -0000 +@@ -274,11 +274,13 @@ + + gtk_c_source_files = \ + $(gtk_cairo_c_source_files) \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c \ +@@ -287,11 +289,13 @@ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c \ ++jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c \ + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c \ +@@ -311,15 +315,16 @@ + + + gtk_awt_peer_sources = \ ++gnu/java/awt/peer/gtk/GThreadMutex.java \ ++gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java \ + gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java \ + gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java \ + gnu/java/awt/peer/gtk/GdkFontMetrics.java \ + gnu/java/awt/peer/gtk/GdkGlyphVector.java \ + gnu/java/awt/peer/gtk/GdkGraphics.java \ + gnu/java/awt/peer/gtk/GdkGraphics2D.java \ ++gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java \ + gnu/java/awt/peer/gtk/GdkPixbufDecoder.java \ +-gnu/java/awt/peer/gtk/GtkArg.java \ +-gnu/java/awt/peer/gtk/GtkArgList.java \ + gnu/java/awt/peer/gtk/GtkButtonPeer.java \ + gnu/java/awt/peer/gtk/GtkCanvasPeer.java \ + gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.java \ +@@ -772,24 +777,32 @@ + java/awt/geom/FlatteningPathIterator.java \ + java/awt/geom/GeneralPath.java \ + java/awt/geom/QuadCurve2D.java \ ++java/awt/image/AffineTransformOp.java \ ++java/awt/image/ByteLookupTable.java \ + java/awt/image/BufferedImage.java \ + java/awt/image/ColorModel.java \ + java/awt/image/ComponentColorModel.java \ + java/awt/image/ComponentSampleModel.java \ + java/awt/image/DataBuffer.java \ + java/awt/image/DataBufferByte.java \ ++java/awt/image/DataBufferDouble.java \ ++java/awt/image/DataBufferFloat.java \ + java/awt/image/DataBufferInt.java \ ++java/awt/image/DataBufferShort.java \ + java/awt/image/DataBufferUShort.java \ + java/awt/image/DirectColorModel.java \ + java/awt/image/ImageConsumer.java \ + java/awt/image/ImageObserver.java \ + java/awt/image/ImageProducer.java \ + java/awt/image/IndexColorModel.java \ ++java/awt/image/Kernel.java \ ++java/awt/image/LookupTable.java \ + java/awt/image/PackedColorModel.java \ + java/awt/image/Raster.java \ + java/awt/image/RasterOp.java \ + java/awt/image/SampleModel.java \ + java/awt/image/SinglePixelPackedSampleModel.java \ ++java/awt/image/ShortLookupTable.java \ + java/awt/image/WritableRaster.java \ + java/awt/image/AreaAveragingScaleFilter.java \ + java/awt/image/CropImageFilter.java \ +@@ -797,6 +810,7 @@ + java/awt/image/ImageFilter.java \ + java/awt/image/MemoryImageSource.java \ + java/awt/image/PixelGrabber.java \ ++java/awt/image/PixelInterleavedSampleModel.java \ + java/awt/image/RGBImageFilter.java \ + java/awt/image/ReplicateScaleFilter.java \ + java/awt/image/BufferStrategy.java \ +@@ -991,26 +1005,59 @@ + javax/swing/GrayFilter.java \ + javax/swing/AbstractAction.java \ + javax/swing/AbstractButton.java \ ++javax/swing/plaf/basic/BasicArrowButton.java \ ++javax/swing/plaf/basic/BasicButtonListener.java \ + javax/swing/plaf/basic/BasicButtonUI.java \ ++javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java \ + javax/swing/plaf/basic/BasicCheckBoxUI.java \ +-javax/swing/plaf/basic/BasicDefaults.java \ ++javax/swing/plaf/basic/BasicColorChooserUI.java \ ++javax/swing/plaf/basic/BasicComboBoxEditor.java \ ++javax/swing/plaf/basic/BasicComboBoxRenderer.java \ ++javax/swing/plaf/basic/BasicComboBoxUI.java \ ++javax/swing/plaf/basic/BasicComboPopup.java \ ++javax/swing/plaf/basic/BasicDesktopIconUI.java \ ++javax/swing/plaf/basic/BasicDesktopPaneUI.java \ ++javax/swing/plaf/basic/BasicFormattedTextFieldUI.java \ + javax/swing/plaf/basic/BasicGraphicsUtils.java \ ++javax/swing/plaf/basic/BasicInternalFrameTitlePane.java \ ++javax/swing/plaf/basic/BasicInternalFrameUI.java \ ++javax/swing/plaf/basic/BasicMenuBarUI.java \ ++javax/swing/plaf/basic/BasicMenuItemUI.java \ ++javax/swing/plaf/basic/BasicMenuUI.java \ + javax/swing/plaf/basic/BasicLabelUI.java \ + javax/swing/plaf/basic/BasicListUI.java \ + javax/swing/plaf/basic/BasicOptionPaneUI.java \ + javax/swing/plaf/basic/BasicPanelUI.java \ ++javax/swing/plaf/basic/BasicPasswordFieldUI.java \ ++javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java \ ++javax/swing/plaf/basic/BasicPopupMenuUI.java \ ++javax/swing/plaf/basic/BasicProgressBarUI.java \ ++javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java \ + javax/swing/plaf/basic/BasicRadioButtonUI.java \ ++javax/swing/plaf/basic/BasicRootPaneUI.java \ ++javax/swing/plaf/basic/BasicScrollBarUI.java \ + javax/swing/plaf/basic/BasicScrollPaneUI.java \ ++javax/swing/plaf/basic/BasicSeparatorUI.java \ ++javax/swing/plaf/basic/BasicSliderUI.java \ ++javax/swing/plaf/basic/BasicSpinnerUI.java \ + javax/swing/plaf/basic/BasicSplitPaneDivider.java \ + javax/swing/plaf/basic/BasicSplitPaneUI.java \ + javax/swing/plaf/basic/BasicTabbedPaneUI.java \ ++javax/swing/plaf/basic/BasicTableHeaderUI.java \ ++javax/swing/plaf/basic/BasicTableUI.java \ ++javax/swing/plaf/basic/BasicTextAreaUI.java \ ++javax/swing/plaf/basic/BasicTextFieldUI.java \ + javax/swing/plaf/basic/BasicTextUI.java \ + javax/swing/plaf/basic/BasicToggleButtonUI.java \ ++javax/swing/plaf/basic/BasicToolBarSeparatorUI.java \ ++javax/swing/plaf/basic/BasicToolBarUI.java \ ++javax/swing/plaf/basic/BasicToolTipUI.java \ + javax/swing/plaf/basic/BasicTreeUI.java \ + javax/swing/plaf/basic/BasicViewportUI.java \ + javax/swing/plaf/basic/BasicLookAndFeel.java \ + javax/swing/plaf/basic/BasicBorders.java \ + javax/swing/plaf/basic/BasicIconFactory.java \ ++javax/swing/plaf/basic/ComboPopup.java \ + javax/swing/plaf/BorderUIResource.java \ + javax/swing/plaf/UIResource.java \ + javax/swing/plaf/ButtonUI.java \ +@@ -1055,10 +1102,15 @@ + javax/swing/plaf/ToolTipUI.java \ + javax/swing/AbstractListModel.java \ + javax/swing/AbstractSet.java \ ++javax/swing/AbstractSpinnerModel.java \ + javax/swing/colorchooser/AbstractColorChooserPanel.java \ + javax/swing/colorchooser/ColorChooserComponentFactory.java \ + javax/swing/colorchooser/ColorSelectionModel.java \ + javax/swing/colorchooser/DefaultColorSelectionModel.java \ ++javax/swing/colorchooser/DefaultHSBChooserPanel.java \ ++javax/swing/colorchooser/DefaultPreviewPanel.java \ ++javax/swing/colorchooser/DefaultRGBChooserPanel.java \ ++javax/swing/colorchooser/DefaultSwatchChooserPanel.java \ + javax/swing/filechooser/FileFilter.java \ + javax/swing/filechooser/FileSystemView.java \ + javax/swing/filechooser/FileView.java \ +@@ -1104,7 +1156,9 @@ + javax/swing/JRootPane.java \ + javax/swing/JScrollBar.java \ + javax/swing/JScrollPane.java \ ++javax/swing/JSpinner.java \ + javax/swing/JTabbedPane.java \ ++javax/swing/JTextArea.java \ + javax/swing/JTextField.java \ + javax/swing/JToggleButton.java \ + javax/swing/JToolTip.java \ +@@ -1117,10 +1171,12 @@ + javax/swing/ListSelectionModel.java \ + javax/swing/LookAndFeel.java \ + javax/swing/Scrollable.java \ ++javax/swing/SpinnerModel.java \ ++javax/swing/SpinnerNumberModel.java \ + javax/swing/SwingConstants.java \ + javax/swing/SwingUtilities.java \ + javax/swing/Timer.java \ +-javax/swing/ToggleButtonModel.java \ ++javax/swing/TransferHandler.java \ + javax/swing/UIDefaults.java \ + javax/swing/UIManager.java \ + javax/swing/UnsupportedLookAndFeelException.java \ +@@ -1172,22 +1228,33 @@ + javax/swing/text/AttributeSet.java \ + javax/swing/text/BadLocationException.java \ + javax/swing/text/Caret.java \ +-javax/swing/text/CharacterIterator.java \ + javax/swing/text/ComponentView.java \ + javax/swing/text/DefaultCaret.java \ + javax/swing/text/DefaultEditorKit.java \ ++javax/swing/text/DefaultHighlighter.java \ + javax/swing/text/Document.java \ + javax/swing/text/DocumentFilter.java \ + javax/swing/text/EditorKit.java \ + javax/swing/text/Element.java \ ++javax/swing/text/FieldView.java \ + javax/swing/text/GapContent.java \ ++javax/swing/text/Highlighter.java \ + javax/swing/text/JTextComponent.java \ + javax/swing/text/Keymap.java \ ++javax/swing/text/LayeredHighlighter.java \ + javax/swing/text/PlainDocument.java \ +-javax/swing/text/PlainEditorKit.java \ ++javax/swing/text/PlainView.java \ + javax/swing/text/Position.java \ + javax/swing/text/Segment.java \ ++javax/swing/text/SimpleAttributeSet.java \ + javax/swing/text/Style.java \ ++javax/swing/text/StyleConstants.java \ ++javax/swing/text/StyleContext.java \ ++javax/swing/text/TabExpander.java \ ++javax/swing/text/TabableView.java \ ++javax/swing/text/TabSet.java \ ++javax/swing/text/TabStop.java \ ++javax/swing/text/Utilities.java \ + javax/swing/text/View.java \ + javax/swing/text/ViewFactory.java \ + javax/swing/text/MutableAttributeSet.java \ +@@ -1275,6 +1342,8 @@ + javax/swing/ProgressMonitorInputStream.java \ + javax/swing/RepaintManager.java \ + javax/swing/ScrollPaneLayout.java \ ++javax/swing/Spring.java \ ++javax/swing/SpringLayout.java \ + javax/swing/ToolTipManager.java \ + javax/swing/ViewportLayout.java + +@@ -2042,6 +2111,8 @@ + gnu/java/nio/charset/UTF_8.java \ + gnu/java/security/Engine.java \ + gnu/java/security/OID.java \ ++gnu/java/security/action/GetPropertyAction.java \ ++gnu/java/security/action/SetAccessibleAction.java \ + gnu/java/security/der/BitString.java \ + gnu/java/security/der/DER.java \ + gnu/java/security/der/DEREncodingException.java \ +@@ -2490,7 +2561,6 @@ + gnu/gcj/runtime/natStackTrace.cc \ + gnu/gcj/runtime/natStringBuffer.cc \ + gnu/gcj/runtime/natVMClassLoader.cc \ +-gnu/java/awt/natEmbeddedWindow.cc \ + gnu/java/net/natPlainDatagramSocketImpl.cc \ + gnu/java/net/natPlainSocketImpl.cc \ + gnu/java/net/protocol/core/natCoreInputStream.cc \ +@@ -2670,7 +2740,6 @@ + gnu/gcj/runtime/natFirstThread.lo gnu/gcj/runtime/natNameFinder.lo \ + gnu/gcj/runtime/natSharedLibLoader.lo gnu/gcj/runtime/natStackTrace.lo \ + gnu/gcj/runtime/natStringBuffer.lo gnu/gcj/runtime/natVMClassLoader.lo \ +-gnu/java/awt/natEmbeddedWindow.lo \ + gnu/java/net/natPlainDatagramSocketImpl.lo \ + gnu/java/net/natPlainSocketImpl.lo \ + gnu/java/net/protocol/core/natCoreInputStream.lo \ +@@ -2732,15 +2801,16 @@ + org/w3c/dom/traversal/TreeWalker.lo + lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES = + @GTK_CAIRO_FALSE@lib_gnu_java_awt_peer_gtk_la_OBJECTS = \ ++@GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GThreadMutex.lo \ ++@GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkClasspathFontPeer.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkFontMetrics.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkGlyphVector.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkGraphics.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkGraphics2D.lo \ ++@GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GdkPixbufDecoder.lo \ +-@GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkArg.lo \ +-@GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkArgList.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkButtonPeer.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkCanvasPeer.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.lo \ +@@ -2775,11 +2845,13 @@ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkTextFieldPeer.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkToolkit.lo \ + @GTK_CAIRO_FALSE@gnu/java/awt/peer/gtk/GtkWindowPeer.lo \ ++@GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.lo \ ++@GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.lo \ +@@ -2788,11 +2860,13 @@ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.lo \ ++@GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.lo \ ++@GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.lo \ + @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.lo \ +@@ -2808,15 +2882,16 @@ + @GTK_CAIRO_FALSE@jni/classpath/jnilink.lo jni/classpath/native_state.lo \ + @GTK_CAIRO_FALSE@jni/classpath/primlib.lo + @GTK_CAIRO_TRUE@lib_gnu_java_awt_peer_gtk_la_OBJECTS = \ ++@GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GThreadMutex.lo \ ++@GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkClasspathFontPeer.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkFontMetrics.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkGlyphVector.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkGraphics.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkGraphics2D.lo \ ++@GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GdkPixbufDecoder.lo \ +-@GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GtkArg.lo \ +-@GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GtkArgList.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GtkButtonPeer.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GtkCanvasPeer.lo \ + @GTK_CAIRO_TRUE@gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.lo \ +@@ -2855,11 +2930,13 @@ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.lo \ ++@GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.lo \ ++@GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.lo \ +@@ -2868,11 +2945,13 @@ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.lo \ ++@GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.lo \ ++@GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.lo \ + @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.lo \ +@@ -2930,7 +3009,7 @@ + + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +-TAR = gtar ++TAR = tar + GZIP_ENV = --best + DIST_SUBDIRS = @DIRLTDL@ testsuite gcj include @DIRLTDL@ gcj include + DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ +@@ -3020,19 +3099,19 @@ + .deps/gnu/java/awt/EventModifier.P \ + .deps/gnu/java/awt/image/ImageDecoder.P \ + .deps/gnu/java/awt/image/XBMDecoder.P \ +-.deps/gnu/java/awt/natEmbeddedWindow.P \ + .deps/gnu/java/awt/peer/ClasspathFontPeer.P \ + .deps/gnu/java/awt/peer/EmbeddedWindowPeer.P \ + .deps/gnu/java/awt/peer/GLightweightPeer.P \ ++.deps/gnu/java/awt/peer/gtk/GThreadMutex.P \ ++.deps/gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.P \ + .deps/gnu/java/awt/peer/gtk/GdkClasspathFontPeer.P \ + .deps/gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.P \ + .deps/gnu/java/awt/peer/gtk/GdkFontMetrics.P \ + .deps/gnu/java/awt/peer/gtk/GdkGlyphVector.P \ + .deps/gnu/java/awt/peer/gtk/GdkGraphics.P \ + .deps/gnu/java/awt/peer/gtk/GdkGraphics2D.P \ ++.deps/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.P \ + .deps/gnu/java/awt/peer/gtk/GdkPixbufDecoder.P \ +-.deps/gnu/java/awt/peer/gtk/GtkArg.P \ +-.deps/gnu/java/awt/peer/gtk/GtkArgList.P \ + .deps/gnu/java/awt/peer/gtk/GtkButtonPeer.P \ + .deps/gnu/java/awt/peer/gtk/GtkCanvasPeer.P \ + .deps/gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.P \ +@@ -3300,6 +3379,8 @@ + .deps/gnu/java/rmi/server/UnicastServer.P \ + .deps/gnu/java/rmi/server/UnicastServerRef.P \ + .deps/gnu/java/security/Engine.P .deps/gnu/java/security/OID.P \ ++.deps/gnu/java/security/action/GetPropertyAction.P \ ++.deps/gnu/java/security/action/SetAccessibleAction.P \ + .deps/gnu/java/security/der/BitString.P \ + .deps/gnu/java/security/der/DER.P \ + .deps/gnu/java/security/der/DEREncodingException.P \ +@@ -3502,16 +3583,21 @@ + .deps/java/awt/im/spi/InputMethod.P \ + .deps/java/awt/im/spi/InputMethodContext.P \ + .deps/java/awt/im/spi/InputMethodDescriptor.P \ ++.deps/java/awt/image/AffineTransformOp.P \ + .deps/java/awt/image/AreaAveragingScaleFilter.P \ + .deps/java/awt/image/BufferStrategy.P \ + .deps/java/awt/image/BufferedImage.P \ + .deps/java/awt/image/BufferedImageOp.P \ ++.deps/java/awt/image/ByteLookupTable.P \ + .deps/java/awt/image/ColorModel.P \ + .deps/java/awt/image/ComponentColorModel.P \ + .deps/java/awt/image/ComponentSampleModel.P \ + .deps/java/awt/image/CropImageFilter.P \ + .deps/java/awt/image/DataBuffer.P .deps/java/awt/image/DataBufferByte.P \ ++.deps/java/awt/image/DataBufferDouble.P \ ++.deps/java/awt/image/DataBufferFloat.P \ + .deps/java/awt/image/DataBufferInt.P \ ++.deps/java/awt/image/DataBufferShort.P \ + .deps/java/awt/image/DataBufferUShort.P \ + .deps/java/awt/image/DirectColorModel.P \ + .deps/java/awt/image/FilteredImageSource.P \ +@@ -3519,15 +3605,18 @@ + .deps/java/awt/image/ImageObserver.P \ + .deps/java/awt/image/ImageProducer.P \ + .deps/java/awt/image/ImagingOpException.P \ +-.deps/java/awt/image/IndexColorModel.P \ ++.deps/java/awt/image/IndexColorModel.P .deps/java/awt/image/Kernel.P \ ++.deps/java/awt/image/LookupTable.P \ + .deps/java/awt/image/MemoryImageSource.P \ + .deps/java/awt/image/PackedColorModel.P \ + .deps/java/awt/image/PixelGrabber.P \ ++.deps/java/awt/image/PixelInterleavedSampleModel.P \ + .deps/java/awt/image/RGBImageFilter.P .deps/java/awt/image/Raster.P \ + .deps/java/awt/image/RasterFormatException.P \ + .deps/java/awt/image/RasterOp.P .deps/java/awt/image/RenderedImage.P \ + .deps/java/awt/image/ReplicateScaleFilter.P \ + .deps/java/awt/image/SampleModel.P \ ++.deps/java/awt/image/ShortLookupTable.P \ + .deps/java/awt/image/SinglePixelPackedSampleModel.P \ + .deps/java/awt/image/TileObserver.P \ + .deps/java/awt/image/VolatileImage.P \ +@@ -4303,13 +4392,14 @@ + .deps/javax/swing/AbstractAction.P .deps/javax/swing/AbstractButton.P \ + .deps/javax/swing/AbstractCellEditor.P \ + .deps/javax/swing/AbstractListModel.P .deps/javax/swing/AbstractSet.P \ +-.deps/javax/swing/Action.P .deps/javax/swing/ActionMap.P \ +-.deps/javax/swing/BorderFactory.P .deps/javax/swing/BoundedRangeModel.P \ +-.deps/javax/swing/Box.P .deps/javax/swing/BoxLayout.P \ +-.deps/javax/swing/ButtonGroup.P .deps/javax/swing/ButtonModel.P \ +-.deps/javax/swing/CellEditor.P .deps/javax/swing/CellRendererPane.P \ +-.deps/javax/swing/ComboBoxEditor.P .deps/javax/swing/ComboBoxModel.P \ +-.deps/javax/swing/ComponentInputMap.P .deps/javax/swing/DebugGraphics.P \ ++.deps/javax/swing/AbstractSpinnerModel.P .deps/javax/swing/Action.P \ ++.deps/javax/swing/ActionMap.P .deps/javax/swing/BorderFactory.P \ ++.deps/javax/swing/BoundedRangeModel.P .deps/javax/swing/Box.P \ ++.deps/javax/swing/BoxLayout.P .deps/javax/swing/ButtonGroup.P \ ++.deps/javax/swing/ButtonModel.P .deps/javax/swing/CellEditor.P \ ++.deps/javax/swing/CellRendererPane.P .deps/javax/swing/ComboBoxEditor.P \ ++.deps/javax/swing/ComboBoxModel.P .deps/javax/swing/ComponentInputMap.P \ ++.deps/javax/swing/DebugGraphics.P \ + .deps/javax/swing/DefaultBoundedRangeModel.P \ + .deps/javax/swing/DefaultButtonModel.P \ + .deps/javax/swing/DefaultCellEditor.P \ +@@ -4341,8 +4431,9 @@ + .deps/javax/swing/JRadioButtonMenuItem.P .deps/javax/swing/JRootPane.P \ + .deps/javax/swing/JScrollBar.P .deps/javax/swing/JScrollPane.P \ + .deps/javax/swing/JSeparator.P .deps/javax/swing/JSlider.P \ +-.deps/javax/swing/JSplitPane.P .deps/javax/swing/JTabbedPane.P \ +-.deps/javax/swing/JTable.P .deps/javax/swing/JTextField.P \ ++.deps/javax/swing/JSpinner.P .deps/javax/swing/JSplitPane.P \ ++.deps/javax/swing/JTabbedPane.P .deps/javax/swing/JTable.P \ ++.deps/javax/swing/JTextArea.P .deps/javax/swing/JTextField.P \ + .deps/javax/swing/JTextPane.P .deps/javax/swing/JToggleButton.P \ + .deps/javax/swing/JToolBar.P .deps/javax/swing/JToolTip.P \ + .deps/javax/swing/JTree.P .deps/javax/swing/JViewport.P \ +@@ -4361,9 +4452,11 @@ + .deps/javax/swing/ScrollPaneLayout.P .deps/javax/swing/Scrollable.P \ + .deps/javax/swing/SingleSelectionModel.P \ + .deps/javax/swing/SizeRequirements.P .deps/javax/swing/SizeSequence.P \ ++.deps/javax/swing/SpinnerModel.P .deps/javax/swing/SpinnerNumberModel.P \ ++.deps/javax/swing/Spring.P .deps/javax/swing/SpringLayout.P \ + .deps/javax/swing/SwingConstants.P .deps/javax/swing/SwingUtilities.P \ +-.deps/javax/swing/Timer.P .deps/javax/swing/ToggleButtonModel.P \ +-.deps/javax/swing/ToolTipManager.P .deps/javax/swing/UIDefaults.P \ ++.deps/javax/swing/Timer.P .deps/javax/swing/ToolTipManager.P \ ++.deps/javax/swing/TransferHandler.P .deps/javax/swing/UIDefaults.P \ + .deps/javax/swing/UIManager.P \ + .deps/javax/swing/UnsupportedLookAndFeelException.P \ + .deps/javax/swing/ViewportLayout.P .deps/javax/swing/WindowConstants.P \ +@@ -4381,6 +4474,10 @@ + .deps/javax/swing/colorchooser/ColorChooserComponentFactory.P \ + .deps/javax/swing/colorchooser/ColorSelectionModel.P \ + .deps/javax/swing/colorchooser/DefaultColorSelectionModel.P \ ++.deps/javax/swing/colorchooser/DefaultHSBChooserPanel.P \ ++.deps/javax/swing/colorchooser/DefaultPreviewPanel.P \ ++.deps/javax/swing/colorchooser/DefaultRGBChooserPanel.P \ ++.deps/javax/swing/colorchooser/DefaultSwatchChooserPanel.P \ + .deps/javax/swing/event/AncestorEvent.P \ + .deps/javax/swing/event/AncestorListener.P \ + .deps/javax/swing/event/CaretEvent.P \ +@@ -4459,26 +4556,59 @@ + .deps/javax/swing/plaf/TextUI.P .deps/javax/swing/plaf/ToolBarUI.P \ + .deps/javax/swing/plaf/ToolTipUI.P .deps/javax/swing/plaf/TreeUI.P \ + .deps/javax/swing/plaf/UIResource.P .deps/javax/swing/plaf/ViewportUI.P \ ++.deps/javax/swing/plaf/basic/BasicArrowButton.P \ + .deps/javax/swing/plaf/basic/BasicBorders.P \ ++.deps/javax/swing/plaf/basic/BasicButtonListener.P \ + .deps/javax/swing/plaf/basic/BasicButtonUI.P \ ++.deps/javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.P \ + .deps/javax/swing/plaf/basic/BasicCheckBoxUI.P \ +-.deps/javax/swing/plaf/basic/BasicDefaults.P \ ++.deps/javax/swing/plaf/basic/BasicColorChooserUI.P \ ++.deps/javax/swing/plaf/basic/BasicComboBoxEditor.P \ ++.deps/javax/swing/plaf/basic/BasicComboBoxRenderer.P \ ++.deps/javax/swing/plaf/basic/BasicComboBoxUI.P \ ++.deps/javax/swing/plaf/basic/BasicComboPopup.P \ ++.deps/javax/swing/plaf/basic/BasicDesktopIconUI.P \ ++.deps/javax/swing/plaf/basic/BasicDesktopPaneUI.P \ ++.deps/javax/swing/plaf/basic/BasicFormattedTextFieldUI.P \ + .deps/javax/swing/plaf/basic/BasicGraphicsUtils.P \ + .deps/javax/swing/plaf/basic/BasicIconFactory.P \ ++.deps/javax/swing/plaf/basic/BasicInternalFrameTitlePane.P \ ++.deps/javax/swing/plaf/basic/BasicInternalFrameUI.P \ + .deps/javax/swing/plaf/basic/BasicLabelUI.P \ + .deps/javax/swing/plaf/basic/BasicListUI.P \ + .deps/javax/swing/plaf/basic/BasicLookAndFeel.P \ ++.deps/javax/swing/plaf/basic/BasicMenuBarUI.P \ ++.deps/javax/swing/plaf/basic/BasicMenuItemUI.P \ ++.deps/javax/swing/plaf/basic/BasicMenuUI.P \ + .deps/javax/swing/plaf/basic/BasicOptionPaneUI.P \ + .deps/javax/swing/plaf/basic/BasicPanelUI.P \ ++.deps/javax/swing/plaf/basic/BasicPasswordFieldUI.P \ ++.deps/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.P \ ++.deps/javax/swing/plaf/basic/BasicPopupMenuUI.P \ ++.deps/javax/swing/plaf/basic/BasicProgressBarUI.P \ ++.deps/javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.P \ + .deps/javax/swing/plaf/basic/BasicRadioButtonUI.P \ ++.deps/javax/swing/plaf/basic/BasicRootPaneUI.P \ ++.deps/javax/swing/plaf/basic/BasicScrollBarUI.P \ + .deps/javax/swing/plaf/basic/BasicScrollPaneUI.P \ ++.deps/javax/swing/plaf/basic/BasicSeparatorUI.P \ ++.deps/javax/swing/plaf/basic/BasicSliderUI.P \ ++.deps/javax/swing/plaf/basic/BasicSpinnerUI.P \ + .deps/javax/swing/plaf/basic/BasicSplitPaneDivider.P \ + .deps/javax/swing/plaf/basic/BasicSplitPaneUI.P \ + .deps/javax/swing/plaf/basic/BasicTabbedPaneUI.P \ ++.deps/javax/swing/plaf/basic/BasicTableHeaderUI.P \ ++.deps/javax/swing/plaf/basic/BasicTableUI.P \ ++.deps/javax/swing/plaf/basic/BasicTextAreaUI.P \ ++.deps/javax/swing/plaf/basic/BasicTextFieldUI.P \ + .deps/javax/swing/plaf/basic/BasicTextUI.P \ + .deps/javax/swing/plaf/basic/BasicToggleButtonUI.P \ ++.deps/javax/swing/plaf/basic/BasicToolBarSeparatorUI.P \ ++.deps/javax/swing/plaf/basic/BasicToolBarUI.P \ ++.deps/javax/swing/plaf/basic/BasicToolTipUI.P \ + .deps/javax/swing/plaf/basic/BasicTreeUI.P \ + .deps/javax/swing/plaf/basic/BasicViewportUI.P \ ++.deps/javax/swing/plaf/basic/ComboPopup.P \ + .deps/javax/swing/plaf/metal/MetalLookAndFeel.P \ + .deps/javax/swing/table/AbstractTableModel.P \ + .deps/javax/swing/table/DefaultTableCellRenderer.P \ +@@ -4493,25 +4623,32 @@ + .deps/javax/swing/text/AbstractDocument.P \ + .deps/javax/swing/text/AttributeSet.P \ + .deps/javax/swing/text/BadLocationException.P \ +-.deps/javax/swing/text/Caret.P \ +-.deps/javax/swing/text/CharacterIterator.P \ +-.deps/javax/swing/text/ComponentView.P \ ++.deps/javax/swing/text/Caret.P .deps/javax/swing/text/ComponentView.P \ + .deps/javax/swing/text/DefaultCaret.P \ + .deps/javax/swing/text/DefaultEditorKit.P \ ++.deps/javax/swing/text/DefaultHighlighter.P \ + .deps/javax/swing/text/Document.P \ + .deps/javax/swing/text/DocumentFilter.P \ + .deps/javax/swing/text/EditorKit.P .deps/javax/swing/text/Element.P \ +-.deps/javax/swing/text/GapContent.P \ ++.deps/javax/swing/text/FieldView.P .deps/javax/swing/text/GapContent.P \ ++.deps/javax/swing/text/Highlighter.P \ + .deps/javax/swing/text/JTextComponent.P .deps/javax/swing/text/Keymap.P \ ++.deps/javax/swing/text/LayeredHighlighter.P \ + .deps/javax/swing/text/MutableAttributeSet.P \ + .deps/javax/swing/text/NavigationFilter.P \ + .deps/javax/swing/text/PlainDocument.P \ +-.deps/javax/swing/text/PlainEditorKit.P \ +-.deps/javax/swing/text/Position.P .deps/javax/swing/text/Segment.P \ +-.deps/javax/swing/text/Style.P .deps/javax/swing/text/StyledDocument.P \ ++.deps/javax/swing/text/PlainView.P .deps/javax/swing/text/Position.P \ ++.deps/javax/swing/text/Segment.P \ ++.deps/javax/swing/text/SimpleAttributeSet.P \ ++.deps/javax/swing/text/Style.P .deps/javax/swing/text/StyleConstants.P \ ++.deps/javax/swing/text/StyleContext.P \ ++.deps/javax/swing/text/StyledDocument.P \ + .deps/javax/swing/text/StyledEditorKit.P \ +-.deps/javax/swing/text/TextAction.P .deps/javax/swing/text/View.P \ +-.deps/javax/swing/text/ViewFactory.P .deps/javax/swing/text/html/HTML.P \ ++.deps/javax/swing/text/TabExpander.P .deps/javax/swing/text/TabSet.P \ ++.deps/javax/swing/text/TabStop.P .deps/javax/swing/text/TabableView.P \ ++.deps/javax/swing/text/TextAction.P .deps/javax/swing/text/Utilities.P \ ++.deps/javax/swing/text/View.P .deps/javax/swing/text/ViewFactory.P \ ++.deps/javax/swing/text/html/HTML.P \ + .deps/javax/swing/text/html/parser/ParserDelegator.P \ + .deps/javax/swing/tree/AbstractLayoutCache.P \ + .deps/javax/swing/tree/DefaultMutableTreeNode.P \ +@@ -4557,6 +4694,7 @@ + .deps/javax/transaction/xa/Xid.P .deps/jni.P .deps/jni/classpath/jcl.P \ + .deps/jni/classpath/jnilink.P .deps/jni/classpath/native_state.P \ + .deps/jni/classpath/primlib.P \ ++.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.P \ +@@ -4566,6 +4704,7 @@ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.P \ ++.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.P \ +@@ -4574,11 +4713,13 @@ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.P \ ++.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.P \ ++.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.P \ + .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.P \ +Index: gnu/awt/LightweightRedirector.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/awt/LightweightRedirector.java,v +retrieving revision 1.1 +diff -u -r1.1 LightweightRedirector.java +--- gnu/awt/LightweightRedirector.java 22 Oct 2000 17:46:08 -0000 1.1 ++++ gnu/awt/LightweightRedirector.java 6 Sep 2004 16:35:37 -0000 +@@ -141,7 +141,7 @@ + + MouseEvent redirected = new MouseEvent(source, event.getID(), + event.getWhen(), +- event.getModifiers(), ++ event.getModifiersEx(), + x, y, + event.getClickCount(), + event.isPopupTrigger()); +@@ -157,20 +157,20 @@ + */ + int getButtonNumber(InputEvent event) + { +- int modifiers = event.getModifiers(); ++ int modifiers = event.getModifiersEx(); + + modifiers &= +- InputEvent.BUTTON1_MASK | +- InputEvent.BUTTON2_MASK | +- InputEvent.BUTTON3_MASK; ++ InputEvent.BUTTON1_DOWN_MASK | ++ InputEvent.BUTTON2_DOWN_MASK | ++ InputEvent.BUTTON3_DOWN_MASK; + + switch (modifiers) + { +- case InputEvent.BUTTON1_MASK: ++ case InputEvent.BUTTON1_DOWN_MASK: + return 1; +- case InputEvent.BUTTON2_MASK: ++ case InputEvent.BUTTON2_DOWN_MASK: + return 2; +- case InputEvent.BUTTON3_MASK: ++ case InputEvent.BUTTON3_DOWN_MASK: + return 3; + case 0: + return 0; +Index: gnu/java/awt/BitwiseXORComposite.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/BitwiseXORComposite.java,v +retrieving revision 1.1 +diff -u -r1.1 BitwiseXORComposite.java +--- gnu/java/awt/BitwiseXORComposite.java 12 Jan 2004 19:11:00 -0000 1.1 ++++ gnu/java/awt/BitwiseXORComposite.java 6 Sep 2004 16:35:37 -0000 +@@ -232,7 +232,7 @@ + WritableRaster dstOut) + { + int aX, bX, dstX, aY, bY, dstY, width, height; +- int xorPixel, transferType; ++ int xorPixel; + int[] srcLine, dstLine; + + aX = src.getMinX(); +Index: gnu/java/awt/Buffers.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/Buffers.java,v +retrieving revision 1.2 +diff -u -r1.2 Buffers.java +--- gnu/java/awt/Buffers.java 22 Jan 2002 22:39:48 -0000 1.2 ++++ gnu/java/awt/Buffers.java 6 Sep 2004 16:35:37 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2002 Free Software Foundation ++/* Copyright (C) 2000, 2002, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -83,10 +83,16 @@ + { + case DataBuffer.TYPE_BYTE: + return new DataBufferByte(size, numBanks); ++ case DataBuffer.TYPE_SHORT: ++ return new DataBufferShort(size, numBanks); + case DataBuffer.TYPE_USHORT: + return new DataBufferUShort(size, numBanks); + case DataBuffer.TYPE_INT: + return new DataBufferInt(size, numBanks); ++ case DataBuffer.TYPE_FLOAT: ++ return new DataBufferFloat(size, numBanks); ++ case DataBuffer.TYPE_DOUBLE: ++ return new DataBufferDouble(size, numBanks); + default: + throw new UnsupportedOperationException(); + } +@@ -106,10 +112,16 @@ + { + case DataBuffer.TYPE_BYTE: + return new DataBufferByte((byte[]) data, size); ++ case DataBuffer.TYPE_SHORT: ++ return new DataBufferShort((short[]) data, size); + case DataBuffer.TYPE_USHORT: + return new DataBufferUShort((short[]) data, size); + case DataBuffer.TYPE_INT: + return new DataBufferInt((int[]) data, size); ++ case DataBuffer.TYPE_FLOAT: ++ return new DataBufferFloat((float[]) data, size); ++ case DataBuffer.TYPE_DOUBLE: ++ return new DataBufferDouble((double[]) data, size); + default: + throw new UnsupportedOperationException(); + } +@@ -126,10 +138,22 @@ + { + if (buffer instanceof DataBufferByte) + return ((DataBufferByte) buffer).getData(); ++ ++ if (buffer instanceof DataBufferShort) ++ return ((DataBufferShort) buffer).getData(); ++ + if (buffer instanceof DataBufferUShort) + return ((DataBufferUShort) buffer).getData(); ++ + if (buffer instanceof DataBufferInt) + return ((DataBufferInt) buffer).getData(); ++ ++ if (buffer instanceof DataBufferFloat) ++ return ((DataBufferFloat) buffer).getData(); ++ ++ if (buffer instanceof DataBufferDouble) ++ return ((DataBufferDouble) buffer).getData(); ++ + throw new ClassCastException("Unknown data buffer type"); + } + +@@ -149,6 +173,11 @@ + from = ((DataBufferByte) src).getData(); + if (dest == null) dest = new byte[length+destOffset]; + } ++ else if (src instanceof DataBufferShort) ++ { ++ from = ((DataBufferShort) src).getData(); ++ if (dest == null) dest = new short[length+destOffset]; ++ } + else if (src instanceof DataBufferUShort) + { + from = ((DataBufferUShort) src).getData(); +@@ -159,6 +188,16 @@ + from = ((DataBufferInt) src).getData(); + if (dest == null) dest = new int[length+destOffset]; + } ++ else if (src instanceof DataBufferFloat) ++ { ++ from = ((DataBufferFloat) src).getData(); ++ if (dest == null) dest = new float[length+destOffset]; ++ } ++ else if (src instanceof DataBufferDouble) ++ { ++ from = ((DataBufferDouble) src).getData(); ++ if (dest == null) dest = new double[length+destOffset]; ++ } + else + { + throw new ClassCastException("Unknown data buffer type"); +Index: gnu/java/awt/ClasspathToolkit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/ClasspathToolkit.java,v +retrieving revision 1.1 +diff -u -r1.1 ClasspathToolkit.java +--- gnu/java/awt/ClasspathToolkit.java 25 Oct 2003 18:41:45 -0000 1.1 ++++ gnu/java/awt/ClasspathToolkit.java 6 Sep 2004 16:35:37 -0000 +@@ -48,6 +48,7 @@ + import java.awt.HeadlessException; + import java.awt.Toolkit; + import java.awt.image.ColorModel; ++import java.awt.image.ImageProducer; + import java.io.File; + import java.io.InputStream; + import java.io.IOException; +@@ -331,4 +332,17 @@ + .initCause(muex); + } + } ++ ++ /** ++ * Creates an ImageProducer from the specified URL. The image is assumed ++ * to be in a recognised format. If the toolkit does not implement the ++ * image format or the image format is not recognised, null is returned. ++ * This default implementation is overriden by the Toolkit implementations. ++ * ++ * @param url URL to read image data from. ++ */ ++ public ImageProducer createImageProducer(URL url) ++ { ++ return null; ++ } + } +Index: gnu/java/awt/ComponentDataBlitOp.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/ComponentDataBlitOp.java,v +retrieving revision 1.2 +diff -u -r1.2 ComponentDataBlitOp.java +--- gnu/java/awt/ComponentDataBlitOp.java 22 Jan 2002 22:39:48 -0000 1.2 ++++ gnu/java/awt/ComponentDataBlitOp.java 6 Sep 2004 16:35:37 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2002 Free Software Foundation ++/* Copyright (C) 2000, 2002, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -36,9 +36,14 @@ + + package gnu.java.awt; + +-import java.awt.geom.*; +-import java.awt.image.*; + import java.awt.RenderingHints; ++import java.awt.geom.Point2D; ++import java.awt.geom.Rectangle2D; ++import java.awt.image.ComponentSampleModel; ++import java.awt.image.DataBuffer; ++import java.awt.image.Raster; ++import java.awt.image.RasterOp; ++import java.awt.image.WritableRaster; + + /** + * This raster copy operation assumes that both source and destination +@@ -52,7 +57,7 @@ + */ + public class ComponentDataBlitOp implements RasterOp + { +- public static ComponentDataBlitOp INSTANCE = new ComponentDataBlitOp(); ++ public static final ComponentDataBlitOp INSTANCE = new ComponentDataBlitOp(); + + public WritableRaster filter(Raster src, WritableRaster dest) + { +Index: gnu/java/awt/EmbeddedWindow.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/EmbeddedWindow.java,v +retrieving revision 1.3 +diff -u -r1.3 EmbeddedWindow.java +--- gnu/java/awt/EmbeddedWindow.java 5 Jan 2004 21:41:20 -0000 1.3 ++++ gnu/java/awt/EmbeddedWindow.java 6 Sep 2004 16:35:37 -0000 +@@ -1,5 +1,5 @@ + /* EmbeddedWindow.java -- +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,15 +38,21 @@ + + package gnu.java.awt; + ++import gnu.classpath.Configuration; + import gnu.java.awt.peer.EmbeddedWindowPeer; ++import gnu.java.security.action.SetAccessibleAction; ++ ++import java.awt.Component; + import java.awt.Frame; + import java.awt.Toolkit; ++import java.lang.reflect.Field; ++import java.security.AccessController; + + /** + * Represents an AWT window that can be embedded into another + * application. + * +- * @author Michael Koch ++ * @author Michael Koch (konqueror@gmx.de) + */ + public class EmbeddedWindow extends Frame + { +@@ -84,16 +90,29 @@ + + if (! (tk instanceof EmbeddedWindowSupport)) + throw new UnsupportedOperationException +- ("Embedded windows are not supported by the current peers: " + tk.getClass()); ++ ("Embedded windows are not supported by the current peers: " ++ + tk.getClass()); ++ ++ // Circumvent the package-privateness of the AWT internal ++ // java.awt.Component.peer member variable. ++ try ++ { ++ Field peerField = Component.class.getDeclaredField("peer"); ++ AccessController.doPrivileged(new SetAccessibleAction(peerField)); ++ peerField.set(this, ((EmbeddedWindowSupport) tk).createEmbeddedWindow (this)); ++ } ++ catch (IllegalAccessException e) ++ { ++ // This should never happen. ++ } ++ catch (NoSuchFieldException e) ++ { ++ // This should never happen. ++ } + +- setWindowPeer (((EmbeddedWindowSupport) tk).createEmbeddedWindow (this)); + super.addNotify(); + } + +- // This method is only made native to circumvent the package-privateness of +- // an AWT internal java.awt.Component.peer member variable. +- native void setWindowPeer (EmbeddedWindowPeer peer); +- + /** + * If the native peer for this embedded window has been created, + * then setHandle will embed the window. If not, setHandle tells +@@ -108,8 +127,8 @@ + throw new RuntimeException ("EmbeddedWindow is already embedded"); + + this.handle = handle; +- if (peer != null) +- ((EmbeddedWindowPeer) peer).embed (this.handle); ++ if (getPeer() != null) ++ ((EmbeddedWindowPeer) getPeer()).embed (this.handle); + } + + /** +Index: gnu/java/awt/natEmbeddedWindow.cc +=================================================================== +RCS file: gnu/java/awt/natEmbeddedWindow.cc +diff -N gnu/java/awt/natEmbeddedWindow.cc +--- gnu/java/awt/natEmbeddedWindow.cc 4 Sep 2003 16:58:13 -0000 1.3 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,18 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation +- +- This file is part of libgcj. +- +-This software is copyrighted work licensed under the terms of the +-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +-details. */ +- +-#include +-#include +-#include +- +-void +-gnu::java::awt::EmbeddedWindow::setWindowPeer (gnu::java::awt::peer::EmbeddedWindowPeer* w) +-{ +- if (!peer) +- peer = reinterpret_cast< ::java::awt::peer::ComponentPeer *> (w); +-} +Index: gnu/java/awt/image/ImageDecoder.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/image/ImageDecoder.java,v +retrieving revision 1.3 +diff -u -r1.3 ImageDecoder.java +--- gnu/java/awt/image/ImageDecoder.java 10 Jan 2004 21:32:22 -0000 1.3 ++++ gnu/java/awt/image/ImageDecoder.java 6 Sep 2004 16:35:37 -0000 +@@ -1,5 +1,5 @@ + /* ImageDecoder.java +- Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,11 +37,14 @@ + + package gnu.java.awt.image; + +-import java.awt.*; +-import java.awt.image.*; +-import java.util.*; +-import java.io.*; ++import java.awt.image.ImageConsumer; ++import java.awt.image.ImageProducer; ++import java.io.ByteArrayInputStream; ++import java.io.FileInputStream; ++import java.io.InputStream; ++import java.io.IOException; + import java.net.URL; ++import java.util.Vector; + + public abstract class ImageDecoder implements ImageProducer + { +@@ -53,8 +56,6 @@ + int length; + InputStream input; + +- public static ColorModel cm; +- + static + { + // FIXME: there was some broken code here that looked like +@@ -97,7 +98,9 @@ + + public void startProduction (ImageConsumer ic) + { ++ if (!isConsumer(ic)) + addConsumer (ic); ++ + Vector list = (Vector) consumers.clone (); + try + { +Index: gnu/java/awt/peer/ClasspathFontPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/ClasspathFontPeer.java,v +retrieving revision 1.1 +diff -u -r1.1 ClasspathFontPeer.java +--- gnu/java/awt/peer/ClasspathFontPeer.java 25 Oct 2003 18:41:45 -0000 1.1 ++++ gnu/java/awt/peer/ClasspathFontPeer.java 6 Sep 2004 16:35:37 -0000 +@@ -1,5 +1,5 @@ + /* ClasspathFontPeer.java -- Font peer used by GNU Classpath. +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -56,12 +56,12 @@ + *

State kept by the peer: a peer is generated for each Font + * object in the default implementation. If you wish to share peers between + * fonts, you will need to subclass both ClasspathFontPeer and +- * {@link ClasspathToolKit}. ++ * {@link ClasspathToolKit}.

+ * + *

Thread Safety: Methods of this interface may be called + * from arbitrary threads at any time. Implementations of the + * ClasspathFontPeer interface are required to perform +- * the necessary synchronization. ++ * the necessary synchronization.

+ * + * @see java.awt.Font#getPeer + * @see java.awt.Toolkit#getFontPeer +@@ -395,6 +395,23 @@ + } + + /** ++ * Implementation of {@link Font#deriveFont(int, float)} ++ * ++ * @param font the font this peer is being called from. This may be ++ * useful if you are sharing peers between Font objects. Otherwise it may ++ * be ignored. ++ */ ++ ++ public Font deriveFont (Font font, int style, float size) ++ { ++ Map attrs = new HashMap (); ++ getStandardAttributes (attrs); ++ copyStyleToAttrs (style, attrs); ++ copySizeToAttrs (size, attrs); ++ return tk().getFont (logicalName, attrs); ++ } ++ ++ /** + * Implementation of {@link Font#deriveFont(float)} + * + * @param font the font this peer is being called from. This may be +@@ -444,6 +461,22 @@ + } + + /** ++ * Implementation of {@link Font#deriveFont(AffineTransform)} ++ * ++ * @param font the font this peer is being called from. This may be ++ * useful if you are sharing peers between Font objects. Otherwise it may ++ * be ignored. ++ */ ++ ++ public Font deriveFont (Font font, AffineTransform t) ++ { ++ Map attrs = new HashMap (); ++ getStandardAttributes (attrs); ++ copyTransformToAttrs (t, attrs); ++ return tk().getFont (logicalName, attrs); ++ } ++ ++ /** + * Implementation of {@link Font#deriveFont(Map)} + * + * @param font the font this peer is being called from. This may be +@@ -501,6 +534,8 @@ + + public AffineTransform getTransform (Font font) + { ++ if (transform == null) ++ transform = new AffineTransform (); + return transform; + } + +Index: gnu/java/awt/peer/GLightweightPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/GLightweightPeer.java,v +retrieving revision 1.2 +diff -u -r1.2 GLightweightPeer.java +--- gnu/java/awt/peer/GLightweightPeer.java 10 Jan 2004 21:32:22 -0000 1.2 ++++ gnu/java/awt/peer/GLightweightPeer.java 6 Sep 2004 16:35:37 -0000 +@@ -1,5 +1,5 @@ + /* GLightweightPeer.java -- +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,7 +45,6 @@ + import java.awt.Cursor; + import java.awt.Dimension; + import java.awt.Font; +-import java.awt.Font; + import java.awt.FontMetrics; + import java.awt.Graphics; + import java.awt.GraphicsConfiguration; +Index: gnu/java/awt/peer/gtk/GThreadMutex.java +=================================================================== +RCS file: gnu/java/awt/peer/gtk/GThreadMutex.java +diff -N gnu/java/awt/peer/gtk/GThreadMutex.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gnu/java/awt/peer/gtk/GThreadMutex.java 6 Sep 2004 16:35:37 -0000 +@@ -0,0 +1,109 @@ ++/* GThreadMutex.java -- Implements a mutex object for glib's gthread ++ abstraction, for use with GNU Classpath's --portable-native-sync option. ++ This is used in gthread-jni.c ++ ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.awt.peer.gtk; ++ ++/** Implements a mutex object for glib's gthread ++ abstraction, for use with GNU Classpath's --portable-native-sync option. ++ This is used in gthread-jni.c. ++ ++ We use this object to implement the POSIX semantics for Mutexes. They are ++ needed are needed for the function vector that is passed to glib's ++ g_thread subpackage's initialization function. ++ ++ The GThreadMutex object itself serves as the Real Lock; if code has ++ entered the monitor for this GThreadMutex object (in Java language, if ++ it's synchronized on this object) then it holds the lock that this object ++ represents. ++ ++ @author Steven Augart ++ May, 2004 ++ ++ ++*/ ++ ++class GThreadMutex ++{ ++ /** Might "lock" be locked? Is anyone waiting ++ to get that lock? How long is the queue? ++ ++ If zero, nobody holds a lock on this GThreadMutex object, and nobody is ++ trying to get one. Before someone attempts to acquire a lock on this ++ object, they must increment potentialLockers. After they release their ++ lock on this object, they must decrement potentialLockers. ++ ++ Access to this field is guarded by synchronizing on the object ++ lockForPotentialLockers. ++ ++ After construction, we only access this field via JNI. ++ */ ++ volatile int potentialLockers; ++ ++ /** An object to synchronize to if you want to examine or modify the ++ potentialLockers field. Only hold this lock for brief ++ moments, just long enough to check or set the value of ++ lockForPotentialLockers. ++ ++ We use this representation so that g_thread_mutex_trylock() will work ++ with the POSIX semantics. This is the only case in which you ever hold a ++ lock on lockForPotentialLockers while trying to get another ++ lock -- if you are the mutex_trylock() implementation, and you have just ++ checked that potentialLockers has the value zero. In that ++ case, mutex_trylock() holds the lock on lockForPotentialLockers so that ++ another thread calling mutex_trylock() or mutex_lock() won't increment ++ potentialLockers after we've checked it and before we've gained the lock ++ on the POSIX mutex. Of course, in that case the operation of gaining ++ the POSIX lock itself will succeed immediately, and once it has ++ succeeded, trylock releases lockForPotentialLockers right away, ++ incremented to 1 (one). ++ ++ After construction, we only access this field via JNI. ++ */ ++ Object lockForPotentialLockers; ++ ++ GThreadMutex() ++ { ++ potentialLockers = 0; ++ lockForPotentialLockers = new Object(); ++ } ++} ++// Local Variables: ++// c-file-style: "gnu" ++// End: +Index: gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java +=================================================================== +RCS file: gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java +diff -N gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java 6 Sep 2004 16:35:38 -0000 +@@ -0,0 +1,302 @@ ++/* GThreadNativeMethodRunner.java -- Implements pthread_create(), under ++ glib's gthread abstraction, for use with GNU Classpath's ++ --portable-native-sync option. ++ This is used by gthread-jni.c ++ ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.awt.peer.gtk; ++import java.lang.ref.WeakReference; ++import java.util.Set; ++import java.util.Collections; ++import java.util.HashSet; ++ ++/** Implements pthread_create(), under glib's gthread abstraction, for use ++ with GNU Classpath's --portable-native-sync option. This is used in ++ gthread-jni.c ++ ++ Also implements a registry for threads, mapping Thread objects to small ++ integers. The registry uses weak references for threads that aren't ++ joinable, so that they will be garbage collected. ++ ++ There are a number of possible alternative implementations. ++ ++ ++ The rest of this comment consists of an answer to a question that was ++ raised on the commit-classpath mailing list: ++ ++ Mark Wielaard wrote: ++ ++ > Can't we assume that jobject and gpointer are both (void *) so we don't ++ > need the int <-> Thread (global jobject ref) mapping? ++ > Maybe there are platforms where jobject and gpointer aren't the same, ++ > but I guess that is pretty unlikely. ++ ++ ++ I agree with you on the pointer size issues. A gpointer is a void *, so ++ it's certainly guaranteed to be at least as large as any other ++ pointer. And a jobject is implicitly an opaque pointer (in Jikes RVM, we ++ use small integers, but we coerce them into the representation of a ++ pointer). ++ ++ The int <==> Thread mapping addresses a different issue. I realize that I ++ did not document this properly (two and a half lines in thread_create), ++ and the point is subtle (at least to me; took me a while to figure out). ++ ++ The int => Thread mapping always returns jobjects that are local ++ references, not global ones. This is because Thread objects need to be ++ able to go away and be garbage collected after the thread they refer to ++ has died. ++ ++ If we keep a global object reference to a thread, then when do we delete ++ that global object reference? We have an answer in the case of GThread ++ objects that were explicitly created with the joinable attribute. It is ++ safe for us to maintain a global reference to any joinable thread, since ++ the joinable thread must linger (even if only in a zombie state) ++ until it's explicitly joined via a g_thread_join() call. The global ref ++ could be cleaned up at that point too. ++ ++ However, in the case of GThreads that were created non-joinable by ++ g_thread_create(), and in the case of Java threads that were created ++ within pure Java code (not via g_thread_create()), we don't want them to ++ linger forever, and there is no way to tell when the last reference ++ to such threads needs to expire. In the case of this application -- AWT ++ with GTK peers -- it would probably be safe anyway, since there are not ++ very many threads we create, but I was going for correctness even in the ++ case of long-running programs that might set up and tear down AWT ++ interfaces many times. ++ ++ So, I duplicated the POSIX thread-ID semantics. The thread ID of a ++ non-joinable thread remains valid as long as that thread is still alive. ++ Once that thread dies, the old thread ID may be reused at any moment. And ++ that's why the array indexed by thread ID numbers is an array of weak ++ references. ++ ++ That's also why the int => Thread jobject mapping function always returns ++ local references, since global references would lock the Thread in memory ++ forever. ++ ++ I would dearly love there to be a cleaner solution. I dislike the ++ repeated dips from C code into Java that are necessary to look up thread ++ ID numbers. If anyone can think of one, I'm all ears. ++*/ ++ ++class GThreadNativeMethodRunner ++ extends Thread ++{ ++ /** The C function pointer that was passed to g_thread_create(). ++ Specifically, this the numeric address of an object of ++ C type "void *(*funcPtr)(void *funcArg)". ++ */ ++ private final long funcPtr; ++ ++ /** The argument for the function "funcPtr(funcArg)". */ ++ private final long funcArg; ++ ++ GThreadNativeMethodRunner(long funcPtr, long funcArg, boolean joinable) ++ { ++ this.funcPtr = funcPtr; ++ this.funcArg = funcArg; ++ ++ if (joinable) ++ registerSelfJoinable(); ++ } ++ ++ public void run() ++ { ++ nativeRun(funcPtr, funcArg); ++ } ++ ++ private native void nativeRun(long funcPtr, long funcArg); ++ ++ /** THREADS is an array of threads, indexed by thread ID codes. Not sure ++ whether this is the "best" approach but it does make it O(1) to look up a ++ thread by its ID. ++ ++ Zero is a valid thread ID code. Any negative number is invalid. ++ ++ Possible future fixes (TODO?) ++ ++ - The THREADS array will only grow. probably not a problem. ++ But we could keep count when nulling entries and shrink when we have ++ lots of nulls at the end. Probably not worth it. --mjw ++ ++ - Could make this a set of Object; see the comment on "joinable" below. ++ ++ The initial size of 17 is just a starting point. Any number will do, ++ including zero. ++ */ ++ private static WeakReference[] threads = new WeakReference[17]; ++ ++ /** Used by threadToThreadID, below. Returns the registration number of ++ the newly-registered thread. ++ */ ++ private static synchronized int registerThread(Thread t) ++ { ++ int i; ++ ++ for (i = 0; i < threads.length; ++i) ++ { ++ WeakReference ref = threads[i]; ++ if (ref == null) ++ break; // found an empty spot. ++ } ++ ++ if (i == threads.length) ++ { ++ /* expand the array */ ++ WeakReference[] bigger = new WeakReference[threads.length * 2]; ++ System.arraycopy(threads, 0, bigger, 0, threads.length); ++ threads = bigger; ++ } ++ ++ threads[i] = new WeakReference(t); ++ ++ return i; ++ } ++ ++ /** Look up the Thread ID # for a Thread. Assign a Thread ID # if none ++ exists. This is a general routine for handling all threads, including ++ the VM's main thread, if appropriate. ++ ++ ++ Runs in O(n/2) time. ++ ++ We can't just issue a threadID upon thread creation. If we were to do ++ that, not all threads would have a threadID, because not all threads ++ are launched by GThreadNativeMethodRunner. ++ */ ++ static synchronized int threadToThreadID(Thread t) ++ { ++ for (int i = 0; i < threads.length; ++i ) ++ { ++ if (threads[i] == null) ++ continue; ++ Thread referent = (Thread) threads[i].get(); ++ if (referent == null) ++ { ++ threads[i] = null; // Purge the dead WeakReference. ++ continue; ++ } ++ if (referent.equals(t)) ++ return i; ++ } // for() ++ ++ /* No match found. */ ++ return registerThread(t); ++ } ++ ++ /** @param threadID Must be a non-negative integer. ++ ++ Used to return null if the thread number was out of range or if ++ the thread was unregistered. Now we throw an exception. ++ ++ Possible Alternative Interface: We could go back to returning null in ++ some sort of check-free mode, so code that calls this function must ++ be prepared to get null. ++ */ ++ static Thread threadIDToThread(int threadID) ++ throws IllegalArgumentException ++ { ++ if (threadID < 0) ++ throw new IllegalArgumentException("Received a negative threadID, " ++ + threadID); ++ if (threadID >= threads.length) ++ throw new IllegalArgumentException("Received a threadID (" + threadID ++ + ") higher than was" ++ + " ever issued"); ++ ++ /* Note: if the user is using a stale reference, things will just ++ break. We might end up getting a different thread than the one ++ expected. ++ ++ TODO: Add an error-checking mode where the user's problems with threads ++ are announced. For instance, if the user asks for the thread ++ associated with a threadID that was never issued, we could print a ++ warning or even abort. ++ ++ TODO: Consider optionally disabling all of the error-checking we ++ already have; it probably slows down the implementation. We could ++ just return NULL. This is just the reverse of the above TODO item. ++ */ ++ ++ WeakReference threadRef = threads[threadID]; ++ ++ if (threadRef == null) ++ throw new IllegalArgumentException("Asked to look up a stale or unissued" ++ + "threadID (" + threadID + ")" ); ++ ++ ++ Thread referent = (Thread) threadRef.get(); ++ if (referent == null) ++ throw new IllegalArgumentException ("Asked to look up a stale threadID (" ++ + threadID + ")"); ++ return referent; ++ } ++ ++ /** Joinable threads need a hard reference, so that they won't go away when ++ they die. That is because their thread IDs need to stay valid until the ++ thread is joined via thread_join(threadID). Joinable threads have to be ++ explicitly joined before they are allowed to go away completely. ++ ++ Possible Alternative Implementation: Eliminate the Joinable set. When ++ calling getThreadIDFromThread() you know whether or not the thread ++ is joinable. So just store the Thread itself in the threads array? ++ Make that array an Object array and check with instanceof. This ++ looks cleaner and more robust to me and it saves a native -> Java ++ call. But instanceof might be expensive. --mjw ++ */ ++ private static final Set joinable = ++ Collections.synchronizedSet(new HashSet()); ++ ++ /** Only called from the constructor. */ ++ private void registerSelfJoinable() ++ { ++ joinable.add(this); ++ } ++ ++ /** This method is only called from JNI, and only after we have succeeded in ++ a thread_join() operation. */ ++ static void deRegisterJoinable(Thread thread) ++ { ++ joinable.remove(thread); ++ } ++} ++ ++// Local Variables: ++// c-file-style: "gnu" ++// End: +Index: gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java,v +retrieving revision 1.2 +diff -u -r1.2 GdkClasspathFontPeer.java +--- gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java 20 Nov 2003 22:44:01 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java 6 Sep 2004 16:35:38 -0000 +@@ -70,7 +70,9 @@ + { + System.loadLibrary("gtkpeer"); + } +- initStaticState (); ++ ++ if (GtkToolkit.useGraphics2D ()) ++ initStaticState (); + } + native static void initStaticState (); + private final int native_state = GtkGenericPeer.getUniqueInteger (); +Index: gnu/java/awt/peer/gtk/GdkFontMetrics.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java,v +retrieving revision 1.3 +diff -u -r1.3 GdkFontMetrics.java +--- gnu/java/awt/peer/gtk/GdkFontMetrics.java 1 Dec 2003 23:12:07 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GdkFontMetrics.java 6 Sep 2004 16:35:38 -0000 +@@ -50,19 +50,21 @@ + MAX_ADVANCE = 4; + + private int[] metrics; +- private native int[] initState (String fname, int size); ++ private native int[] initState (String fname, int style, int size); + + public GdkFontMetrics (Font font) + { + super (font); +- metrics = initState (font.getName (), font.getSize ()); ++ metrics = initState (font.getName (), font.getStyle (), font.getSize ()); + } + +- native public int stringWidth (String fname, int size, String str); ++ native public int stringWidth (String fname, int style, int size, ++ String str); + + public int stringWidth (String str) + { +- return stringWidth (font.getName (), font.getSize (), str); ++ return stringWidth (font.getName (), font.getStyle (), font.getSize (), ++ str); + } + + public int charWidth (char ch) +Index: gnu/java/awt/peer/gtk/GdkGlyphVector.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java,v +retrieving revision 1.1 +diff -u -r1.1 GdkGlyphVector.java +--- gnu/java/awt/peer/gtk/GdkGlyphVector.java 25 Oct 2003 18:41:45 -0000 1.1 ++++ gnu/java/awt/peer/gtk/GdkGlyphVector.java 6 Sep 2004 16:35:38 -0000 +@@ -60,7 +60,9 @@ + { + System.loadLibrary("gtkpeer"); + } +- initStaticState (); ++ ++ if (GtkToolkit.useGraphics2D ()) ++ initStaticState (); + } + native static void initStaticState (); + private final int native_state = GtkGenericPeer.getUniqueInteger (); +Index: gnu/java/awt/peer/gtk/GdkGraphics.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java,v +retrieving revision 1.4 +diff -u -r1.4 GdkGraphics.java +--- gnu/java/awt/peer/gtk/GdkGraphics.java 22 Aug 2003 20:33:49 -0000 1.4 ++++ gnu/java/awt/peer/gtk/GdkGraphics.java 6 Sep 2004 16:35:38 -0000 +@@ -46,6 +46,7 @@ + import java.awt.Image; + import java.awt.Rectangle; + import java.awt.Shape; ++import java.awt.SystemColor; + import java.awt.image.ImageObserver; + import java.text.AttributedCharacterIterator; + +@@ -63,7 +64,7 @@ + + static final int GDK_COPY = 0, GDK_XOR = 2; + +- native int[] initState (GtkComponentPeer component); ++ native void initState (GtkComponentPeer component); + native void initState (int width, int height); + native void copyState (GdkGraphics g); + +@@ -83,15 +84,15 @@ + initState (width, height); + color = Color.black; + clip = new Rectangle (0, 0, width, height); +- font = new Font ("Dialog", Font.PLAIN, 10); ++ font = new Font ("Dialog", Font.PLAIN, 12); + } + + GdkGraphics (GtkComponentPeer component) + { + this.component = component; +- int rgb[] = initState (component); +- color = new Color (rgb[0], rgb[1], rgb[2]); +- font = new Font ("Dialog", Font.PLAIN, 10); ++ initState (component); ++ color = component.awtComponent.getForeground (); ++ font = component.awtComponent.getFont (); + Dimension d = component.awtComponent.getSize (); + clip = new Rectangle (0, 0, d.width, d.height); + } +@@ -125,6 +126,11 @@ + native public void dispose (); + + native void copyPixmap (Graphics g, int x, int y, int width, int height); ++ native void copyAndScalePixmap (Graphics g, boolean flip_x, boolean flip_y, ++ int src_x, int src_y, ++ int src_width, int src_height, ++ int dest_x, int dest_y, ++ int dest_width, int dest_height); + public boolean drawImage (Image img, int x, int y, + Color bgcolor, ImageObserver observer) + { +@@ -149,7 +155,10 @@ + return true; + } + +- return drawImage (img, x, y, component.getBackground (), observer); ++ if (component != null) ++ return drawImage (img, x, y, component.getBackground (), observer); ++ else ++ return drawImage (img, x, y, SystemColor.window, observer); + } + + public boolean drawImage (Image img, int x, int y, int width, int height, +@@ -157,7 +166,10 @@ + { + if (img instanceof GtkOffScreenImage) + { +- throw new RuntimeException (); ++ copyAndScalePixmap (img.getGraphics (), false, false, ++ 0, 0, img.getWidth (null), img.getHeight (null), ++ x, y, width, height); ++ return true; + } + + GtkImage image = (GtkImage) img; +@@ -168,8 +180,12 @@ + public boolean drawImage (Image img, int x, int y, int width, int height, + ImageObserver observer) + { +- return drawImage (img, x, y, width, height, component.getBackground (), +- observer); ++ if (component != null) ++ return drawImage (img, x, y, width, height, component.getBackground (), ++ observer); ++ else ++ return drawImage (img, x, y, width, height, SystemColor.window, ++ observer); + } + + public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2, +@@ -178,7 +194,60 @@ + { + if (img instanceof GtkOffScreenImage) + { +- throw new RuntimeException (); ++ int dx_start, dy_start, d_width, d_height; ++ int sx_start, sy_start, s_width, s_height; ++ boolean x_flip = false; ++ boolean y_flip = false; ++ ++ if (dx1 < dx2) ++ { ++ dx_start = dx1; ++ d_width = dx2 - dx1; ++ } ++ else ++ { ++ dx_start = dx2; ++ d_width = dx1 - dx2; ++ x_flip ^= true; ++ } ++ if (dy1 < dy2) ++ { ++ dy_start = dy1; ++ d_height = dy2 - dy1; ++ } ++ else ++ { ++ dy_start = dy2; ++ d_height = dy1 - dy2; ++ y_flip ^= true; ++ } ++ if (sx1 < sx2) ++ { ++ sx_start = sx1; ++ s_width = sx2 - sx1; ++ } ++ else ++ { ++ sx_start = sx2; ++ s_width = sx1 - sx2; ++ x_flip ^= true; ++ } ++ if (sy1 < sy2) ++ { ++ sy_start = sy1; ++ s_height = sy2 - sy1; ++ } ++ else ++ { ++ sy_start = sy2; ++ s_height = sy1 - sy2; ++ y_flip ^= true; ++ } ++ ++ copyAndScalePixmap (img.getGraphics (), x_flip, y_flip, ++ sx_start, sy_start, s_width, s_height, ++ dx_start, dy_start, d_width, d_height); ++ return true; + } + + GtkImage image = (GtkImage) img; +@@ -191,8 +260,12 @@ + int sx1, int sy1, int sx2, int sy2, + ImageObserver observer) + { +- return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, +- component.getBackground (), observer); ++ if (component != null) ++ return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, ++ component.getBackground (), observer); ++ else ++ return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, ++ SystemColor.window, observer); + } + + native public void drawLine (int x1, int y1, int x2, int y2); +@@ -212,10 +285,10 @@ + native public void drawRect(int x, int y, int width, int height); + native public void fillRect (int x, int y, int width, int height); + +- native void drawString (String str, int x, int y, String fname, int size); ++ native void drawString (String str, int x, int y, String fname, int style, int size); + public void drawString (String str, int x, int y) + { +- drawString (str, x, y, font.getName(), font.getSize()); ++ drawString (str, x, y, font.getName(), font.getStyle(), font.getSize()); + } + + public void drawString (AttributedCharacterIterator ci, int x, int y) +@@ -226,13 +299,48 @@ + public void drawRoundRect(int x, int y, int width, int height, + int arcWidth, int arcHeight) + { +- // System.out.println ("drawRoundRect called [UNIMPLEMENTED]"); ++ if (arcWidth > width) ++ arcWidth = width; ++ if (arcHeight > height) ++ arcHeight = height; ++ ++ int xx = x + width - arcWidth; ++ int yy = y + height - arcHeight; ++ ++ drawArc (x, y, arcWidth, arcHeight, 90, 90); ++ drawArc (xx, y, arcWidth, arcHeight, 0, 90); ++ drawArc (xx, yy, arcWidth, arcHeight, 270, 90); ++ drawArc (x, yy, arcWidth, arcHeight, 180, 90); ++ ++ int y1 = y + arcHeight / 2; ++ int y2 = y + height - arcHeight / 2; ++ drawLine (x, y1, x, y2); ++ drawLine (x + width, y1, x + width, y2); ++ ++ int x1 = x + arcWidth / 2; ++ int x2 = x + width - arcWidth / 2; ++ drawLine (x1, y, x2, y); ++ drawLine (x1, y + height, x2, y + height); + } + + public void fillRoundRect (int x, int y, int width, int height, + int arcWidth, int arcHeight) + { +- // System.out.println ("fillRoundRect called [UNIMPLEMENTED]"); ++ if (arcWidth > width) ++ arcWidth = width; ++ if (arcHeight > height) ++ arcHeight = height; ++ ++ int xx = x + width - arcWidth; ++ int yy = y + height - arcHeight; ++ ++ fillArc (x, y, arcWidth, arcHeight, 90, 90); ++ fillArc (xx, y, arcWidth, arcHeight, 0, 90); ++ fillArc (xx, yy, arcWidth, arcHeight, 270, 90); ++ fillArc (x, yy, arcWidth, arcHeight, 180, 90); ++ ++ fillRect (x, y + arcHeight / 2, width, height - arcHeight + 1); ++ fillRect (x + arcWidth / 2, y, width - arcWidth + 1, height); + } + + public Shape getClip () +@@ -287,7 +395,10 @@ + + public void setColor (Color c) + { +- color = c; ++ if (c == null) ++ color = new Color (0, 0, 0); ++ else ++ color = c; + + if (xorColor == null) /* paint mode */ + setFGColor (color.getRed (), color.getGreen (), color.getBlue ()); +Index: gnu/java/awt/peer/gtk/GdkGraphics2D.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java,v +retrieving revision 1.6 +diff -u -r1.6 GdkGraphics2D.java +--- gnu/java/awt/peer/gtk/GdkGraphics2D.java 16 Jan 2004 14:22:23 -0000 1.6 ++++ gnu/java/awt/peer/gtk/GdkGraphics2D.java 6 Sep 2004 16:35:39 -0000 +@@ -1,5 +1,5 @@ + /* GdkGraphics2D.java +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -48,7 +48,6 @@ + import java.util.Map; + + import java.text.AttributedCharacterIterator; +-import java.util.Map; + import java.util.Stack; + import java.lang.Integer; + import gnu.java.awt.ClasspathToolkit; +@@ -84,13 +83,16 @@ + private GtkComponentPeer component; + private Font font; + private RenderingHints hints; ++ private BufferedImage bimage; + + private Stack stateStack; + +- native private int[] initState (GtkComponentPeer component); ++ native private void initState (GtkComponentPeer component); + native private void initState (int width, int height); + native private void copyState (GdkGraphics2D g); + native public void dispose (); ++ native private int[] getImagePixels(); ++ native private void cairoSurfaceSetFilter(int filter); + + public void finalize () + { +@@ -158,7 +160,7 @@ + setFont (new Font("SansSerif", Font.PLAIN, 12)); + setTransform (new AffineTransform ()); + setStroke (new BasicStroke ()); +- setRenderingHints (new HashMap ()); ++ setRenderingHints (getDefaultHints()); + + stateStack = new Stack(); + } +@@ -166,19 +168,41 @@ + GdkGraphics2D (GtkComponentPeer component) + { + this.component = component; +- int rgb[] = initState (component); ++ initState (component); + +- setColor (new Color (rgb[0], rgb[1], rgb[2])); +- setBackground (new Color (rgb[3], rgb[4], rgb[5])); ++ setColor (component.awtComponent.getForeground ()); ++ setBackground (component.awtComponent.getBackground ()); + setPaint (getColor()); + setFont (new Font("SansSerif", Font.PLAIN, 12)); + setTransform (new AffineTransform ()); + setStroke (new BasicStroke ()); +- setRenderingHints (new HashMap ()); ++ setRenderingHints (getDefaultHints()); + + stateStack = new Stack (); + } + ++ GdkGraphics2D (BufferedImage bimage) ++ { ++ ++ this.bimage = bimage; ++ initState (bimage.getWidth(), bimage.getHeight()); ++ ++ setColor(Color.black); ++ setBackground (Color.black); ++ setPaint (getColor()); ++ setFont (new Font("SansSerif", Font.PLAIN, 12)); ++ setTransform (new AffineTransform ()); ++ setStroke (new BasicStroke ()); ++ setRenderingHints (getDefaultHints()); ++ ++ stateStack = new Stack(); ++ ++ // draw current buffered image to the pixmap associated ++ // with it. ++ ++ drawImage (bimage, new AffineTransform (1,0,0,1,0,0), bg, null); ++ } ++ + + //////////////////////////////////// + ////// Native Drawing Methods ////// +@@ -364,6 +388,121 @@ + + } + ++ private void updateBufferedImage() ++ { ++ int[] pixels = getImagePixels(); ++ updateImagePixels(pixels); ++ } ++ ++ ++ private boolean isBufferedImageGraphics () ++ { ++ ++ if (bimage != null) ++ return true; ++ else ++ return false; ++ } ++ ++ private void updateImagePixels (int[] pixels) ++ { ++ ++ // This function can only be used if ++ // this graphics object is used to draw into ++ // buffered image ++ ++ if (! isBufferedImageGraphics ()) ++ return; ++ ++ WritableRaster raster = bimage.getRaster(); ++ DataBuffer db = raster.getDataBuffer (); ++ ++ // update pixels in the bufferedImage ++ ++ if (raster.getSampleModel ().getDataType () == DataBuffer.TYPE_INT ++ && db instanceof DataBufferInt ++ && db.getNumBanks () == 1) ++ { ++ ++ // single bank, ARGB-ints buffer in sRGB space ++ DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer (); ++ ++ for (int i=0; i < pixels.length; i++) ++ dbi.setElem(i, pixels[i]); ++ ++ } ++ else ++ { ++ bimage.getRaster().setPixels (0, 0, raster.getWidth (), ++ raster.getHeight (), pixels); ++ } ++ } ++ ++ ++ private boolean drawImage(Image img, ++ AffineTransform xform, ++ Color bgcolor, ++ ImageObserver obs) ++ { ++ if (img instanceof GtkOffScreenImage && ++ img.getGraphics () instanceof GdkGraphics2D && ++ (xform == null ++ || xform.getType () == AffineTransform.TYPE_IDENTITY ++ || xform.getType () == AffineTransform.TYPE_TRANSLATION) ++ ) ++ { ++ // we are being asked to flush a double buffer from Gdk ++ GdkGraphics2D g2 = (GdkGraphics2D) img.getGraphics (); ++ gdkDrawDrawable (g2, (int)xform.getTranslateX(), (int)xform.getTranslateY()); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ ++ return true; ++ } ++ else ++ { ++ ++ // In this case, xform is an AffineTransform that transforms bounding ++ // box of the specified image from image space to user space. However ++ // when we pass this transform to cairo, cairo will use this transform ++ // to map "user coordinates" to "pixel" coordinates, which is the ++ // other way around. Therefore to get the "user -> pixel" transform ++ // that cairo wants from "image -> user" transform that we currently ++ // have, we will need to invert the transformation matrix. ++ ++ AffineTransform invertedXform = new AffineTransform(); ++ ++ try ++ { ++ invertedXform = xform.createInverse(); ++ if (img instanceof BufferedImage) ++ { ++ // draw an image which has actually been loaded ++ // into memory fully ++ ++ BufferedImage b = (BufferedImage) img; ++ return drawRaster (b.getColorModel (), ++ b.getData (), ++ invertedXform, ++ bgcolor); ++ } ++ else ++ { ++ // begin progressive loading in a separate thread ++ new PainterThread (this, img, invertedXform, bgcolor); ++ return false; ++ } ++ } ++ catch (NoninvertibleTransformException e) ++ { ++ throw new ImagingOpException("Unable to invert transform " ++ + xform.toString()); ++ } ++ } ++ } ++ ++ + ////////////////////////////////////////////////// + ////// Implementation of Graphics2D Methods ////// + ////////////////////////////////////////////////// +@@ -401,6 +540,10 @@ + translate (-0.5,-0.5); + + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + } + + public void fill (Shape s) +@@ -416,6 +559,10 @@ + walkPath (s.getPathIterator (null)); + cairoFill (); + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + } + + public void clip (Shape s) +@@ -475,11 +622,21 @@ + { + TexturePaint tp = (TexturePaint) paint; + BufferedImage img = tp.getImage (); +- int pixels[] = img.getRGB(0, 0, img.getWidth (), +- img.getHeight (), null, +- 0, img.getWidth ()); +- setTexturePixels (pixels, img.getWidth (), +- img.getHeight (), img.getWidth ()); ++ ++ // map the image to the anchor rectangle ++ ++ int width = (int) tp.getAnchorRect ().getWidth (); ++ int height = (int) tp.getAnchorRect ().getHeight (); ++ ++ double scaleX = width / (double) img.getWidth (); ++ double scaleY = width / (double) img.getHeight (); ++ ++ AffineTransform at = new AffineTransform (scaleX, 0, 0, scaleY, 0, 0); ++ AffineTransformOp op = new AffineTransformOp (at, getRenderingHints()); ++ BufferedImage texture = op.filter(img, null); ++ int pixels[] = texture.getRGB (0, 0, width, height, null, 0, width); ++ setTexturePixels (pixels, width, height, width); ++ + } + else if (paint instanceof GradientPaint) + { +@@ -518,6 +675,26 @@ + else + transform.concatenate (tx); + setTransform (transform); ++ if (clip != null) ++ { ++ // FIXME: this should actuall try to transform the shape ++ // rather than degrade to bounds. ++ Rectangle2D r = clip.getBounds2D(); ++ double[] coords = new double[] { r.getX(), r.getY(), ++ r.getX() + r.getWidth(), ++ r.getY() + r.getHeight() }; ++ try ++ { ++ tx.createInverse().transform(coords, 0, coords, 0, 2); ++ r.setRect(coords[0], coords[1], ++ coords[2] - coords[0], ++ coords[3] - coords[1]); ++ clip = r; ++ } ++ catch (java.awt.geom.NoninvertibleTransformException e) ++ { ++ } ++ } + } + + public void rotate(double theta) +@@ -645,19 +822,29 @@ + + public void setClip (int x, int y, int width, int height) + { +- cairoNewPath (); +- cairoRectangle (x, y, width, height); +- cairoClosePath (); +- cairoClip (); +- clip = new Rectangle2D.Double ((double)x, (double)y, +- (double)width, (double)height); ++ setClip(new Rectangle2D.Double ((double)x, (double)y, ++ (double)width, (double)height)); + } +- ++ + public void setClip (Shape s) + { +- clip (s); ++ clip = s; ++ if (s != null) ++ { ++ cairoNewPath (); ++ if (s instanceof Rectangle2D) ++ { ++ Rectangle2D r = (Rectangle2D)s; ++ cairoRectangle (r.getX (), r.getY (), ++ r.getWidth (), r.getHeight ()); ++ } ++ else ++ walkPath (s.getPathIterator (null)); ++ cairoClosePath (); ++ cairoClip (); ++ } + } +- ++ + public void draw3DRect(int x, int y, int width, + int height, boolean raised) + { +@@ -708,6 +895,10 @@ + cairoStroke (); + + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + } + + public void fill3DRect(int x, int y, int width, +@@ -734,6 +925,10 @@ + cairoClosePath (); + cairoFill (); + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + } + + +@@ -759,6 +954,10 @@ + cairoClosePath (); + cairoFill (); + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + } + + public void setBackground(Color c) +@@ -828,7 +1027,8 @@ + } + + private boolean drawRaster (ColorModel cm, Raster r, +- AffineTransform imageToUser) ++ AffineTransform imageToUser, ++ Color bgcolor) + { + if (r == null) + return false; +@@ -849,7 +1049,7 @@ + { + i2u[0] = 1; i2u[1] = 0; + i2u[2] = 0; i2u[3] = 1; +- i2u[2] = 0; i2u[3] = 0; ++ i2u[4] = 0; i2u[5] = 0; + } + + int pixels[] = null; +@@ -875,17 +1075,33 @@ + pixels = pixels2; + } + ++ // change all transparent pixels in the image to the ++ // specified bgcolor ++ ++ if (bgcolor != null) ++ { ++ for (int i = 0; i < pixels.length; i++) ++ { ++ if (cm.getAlpha (pixels[i]) == 0) ++ pixels[i] = bgcolor.getRGB (); ++ } ++ } ++ + stateSave (); + translate (x, y); + drawPixels (pixels, r.getWidth (), r.getHeight (), r.getWidth (), i2u); + stateRestore (); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + return true; + } + + public void drawRenderedImage(RenderedImage image, + AffineTransform xform) + { +- drawRaster (image.getColorModel(), image.getData(), xform); ++ drawRaster (image.getColorModel(), image.getData(), xform, bg); + } + + public void drawRenderableImage(RenderableImage image, +@@ -898,33 +1114,7 @@ + AffineTransform xform, + ImageObserver obs) + { +- if (img instanceof GtkOffScreenImage && +- img.getGraphics () instanceof GdkGraphics2D && +- (xform == null +- || xform.getType () == AffineTransform.TYPE_IDENTITY +- || xform.getType () == AffineTransform.TYPE_TRANSLATION) +- ) +- { +- // we are being asked to flush a double buffer from Gdk +- GdkGraphics2D g2 = (GdkGraphics2D) img.getGraphics (); +- gdkDrawDrawable (g2, (int)xform.getTranslateX(), (int)xform.getTranslateY()); +- return true; +- } +- else +- { +- if (img instanceof BufferedImage) +- { +- // draw an image which has actually been loaded into memory fully +- BufferedImage b = (BufferedImage) img; +- return drawRaster (b.getColorModel (), b.getData (), xform); +- } +- else +- { +- // begin progressive loading in a separate thread +- new PainterThread (this, img, xform); +- return false; +- } +- } ++ return drawImage(img, xform, bg, obs); + } + + public void drawImage(BufferedImage image, +@@ -933,13 +1123,13 @@ + int y) + { + Image filtered = op.filter(image, null); +- drawImage(filtered, new AffineTransform(1f,0f,0f,1f,x,y), null); ++ drawImage(filtered, new AffineTransform(1f,0f,0f,1f,x,y), bg, null); + } + + public boolean drawImage (Image img, int x, int y, + ImageObserver observer) + { +- return drawImage(img, new AffineTransform(1f,0f,0f,1f,x,y), observer); ++ return drawImage(img, new AffineTransform(1f,0f,0f,1f,x,y), bg, observer); + } + + +@@ -962,11 +1152,14 @@ + Image image; + ColorModel defaultModel; + AffineTransform xform; ++ Color bgcolor; + +- public PainterThread (GdkGraphics2D g, Image im, AffineTransform xf) ++ public PainterThread (GdkGraphics2D g, Image im, ++ AffineTransform xf, Color bg) + { + image = im; + xform = xf; ++ bgcolor = bg; + this.gr = (GdkGraphics2D) g.create (); + new Thread (this).start (); + } +@@ -1016,6 +1209,18 @@ + else + pixels2 = pixels; + ++ // change all transparent pixels in the image to the ++ // specified bgcolor ++ ++ if (bgcolor != null) ++ { ++ for (int i = 0; i < pixels2.length; i++) ++ { ++ if (model.getAlpha (pixels2[i]) == 0) ++ pixels2[i] = bgcolor.getRGB (); ++ } ++ } ++ + double[] xf = new double[6]; + xform.getMatrix(xf); + gr.drawPixels (pixels2, w, h, scansize, xf); +@@ -1054,13 +1259,46 @@ + + public void setComposite(Composite comp) + { +- throw new java.lang.UnsupportedOperationException (); ++ if (comp instanceof AlphaComposite) ++ { ++ AlphaComposite a = (AlphaComposite) comp; ++ cairoSetOperator(a.getRule()); ++ Color c = getColor(); ++ setColor(new Color(c.getRed(), ++ c.getGreen(), ++ c.getBlue(), ++ (int) (a.getAlpha() * ((float) c.getAlpha())))); ++ } ++ else ++ throw new java.lang.UnsupportedOperationException (); + } + + public void setRenderingHint(RenderingHints.Key hintKey, + Object hintValue) + { + hints.put (hintKey, hintValue); ++ ++ if (hintKey.equals(RenderingHints.KEY_INTERPOLATION) ++ || hintKey.equals(RenderingHints.KEY_ALPHA_INTERPOLATION)) ++ { ++ ++ if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) ++ cairoSurfaceSetFilter(0); ++ ++ else if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) ++ cairoSurfaceSetFilter(1); ++ ++ else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) ++ cairoSurfaceSetFilter(2); ++ ++ else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) ++ cairoSurfaceSetFilter(3); ++ ++ else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) ++ cairoSurfaceSetFilter(4); ++ ++ } ++ + } + + public Object getRenderingHint(RenderingHints.Key hintKey) +@@ -1072,6 +1310,27 @@ + { + this.hints = new RenderingHints (getDefaultHints ()); + this.hints.add (new RenderingHints (hints)); ++ ++ if (hints.containsKey(RenderingHints.KEY_INTERPOLATION)) ++ { ++ if(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) ++ cairoSurfaceSetFilter(0); ++ ++ else if(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) ++ cairoSurfaceSetFilter(1); ++ } ++ ++ if (hints.containsKey(RenderingHints.KEY_ALPHA_INTERPOLATION)) ++ { ++ if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) ++ cairoSurfaceSetFilter(2); ++ ++ else if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) ++ cairoSurfaceSetFilter(3); ++ ++ else if(hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) ++ cairoSurfaceSetFilter(4); ++ } + } + + public void addRenderingHints(Map hints) +@@ -1104,6 +1363,10 @@ + int codes[] = g.getGlyphCodes (0, nglyphs, (int []) null); + float posns[] = g.getGlyphPositions (0, nglyphs, (float []) null); + cairoShowGlyphs (codes, posns); ++ ++ if (isBufferedImageGraphics ()) ++ updateBufferedImage(); ++ + stateRestore (); + } + +@@ -1124,33 +1387,86 @@ + public boolean drawImage (Image img, int x, int y, Color bgcolor, + ImageObserver observer) + { +- throw new java.lang.UnsupportedOperationException (); ++ return drawImage (img, x, y, img.getWidth (observer), ++ img.getHeight (observer), bgcolor, observer); + } + + public boolean drawImage (Image img, int x, int y, int width, int height, + Color bgcolor, ImageObserver observer) + { +- throw new java.lang.UnsupportedOperationException (); ++ ++ double scaleX = width / (double) img.getWidth (observer); ++ double scaleY = height / (double) img.getHeight (observer); ++ ++ return drawImage (img, ++ new AffineTransform(scaleX, 0f, 0f, scaleY, x, y), ++ bgcolor, ++ observer); ++ + } + + public boolean drawImage (Image img, int x, int y, int width, int height, + ImageObserver observer) + { +- throw new java.lang.UnsupportedOperationException (); ++ ++ return drawImage (img, x, y, width, height, bg, observer); ++ + } + + public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, + Color bgcolor, ImageObserver observer) + { +- throw new java.lang.UnsupportedOperationException (); ++ ++ Image subImage; ++ ++ int sourceWidth = sx2 - sx1; ++ int sourceHeight = sy2 - sy1; ++ ++ int destWidth = dx2 - dx1; ++ int destHeight = dy2 - dy1; ++ ++ double scaleX = destWidth / (double) sourceWidth; ++ double scaleY = destHeight / (double) sourceHeight; ++ ++ // Get the subimage of the source enclosed in the ++ // rectangle specified by sx1, sy1, sx2, sy2 ++ ++ if (img instanceof BufferedImage) ++ { ++ ++ BufferedImage b = (BufferedImage) img; ++ subImage = b.getSubimage(sx1,sy1,sx2,sy2); ++ } ++ else ++ { ++ ++ // FIXME: This code currently doesn't work. Null Pointer ++ // exception is thrown in this case. This happens ++ // because img.getSource() always returns null, since source gets ++ // never initialized when it is created with the help of ++ // createImage(int width, int height). ++ ++ CropImageFilter filter = new CropImageFilter(sx1,sx2,sx2,sy2); ++ FilteredImageSource src = new FilteredImageSource(img.getSource(), ++ filter); ++ ++ subImage = Toolkit.getDefaultToolkit().createImage(src); ++ } ++ ++ return drawImage(subImage, new AffineTransform(scaleX, 0, 0, ++ scaleY, dx1, dy1), ++ bgcolor, ++ observer); + } + + public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, + ImageObserver observer) + { +- throw new java.lang.UnsupportedOperationException (); ++ ++ return drawImage (img, dx1, dy1, dx2, dy2, ++ sx1, sy1, sx2, sy2, bg, observer); + } + + public void drawOval(int x, int y, int width, int height) +@@ -1161,14 +1477,28 @@ + public void drawRoundRect(int x, int y, int width, int height, + int arcWidth, int arcHeight) + { +- int x1 = x + arcWidth, x2 = x + width - arcWidth; +- int y1 = y + arcHeight, y2 = y + height - arcHeight; +- fillRect (x1, y, x2 - x1, height); +- fillRect (x, y1, width, y2 - y1); +- fillArc (x, y, arcWidth, arcHeight, 90, 90); +- fillArc (x1, y, arcWidth, arcHeight, 0, 90); +- fillArc (x2, y2, arcWidth, arcHeight, 270, 90); +- fillArc (x, y2, arcWidth, arcHeight, 180, 90); ++ if (arcWidth > width) ++ arcWidth = width; ++ if (arcHeight > height) ++ arcHeight = height; ++ ++ int xx = x + width - arcWidth; ++ int yy = y + height - arcHeight; ++ ++ drawArc (x, y, arcWidth, arcHeight, 90, 90); ++ drawArc (xx, y, arcWidth, arcHeight, 0, 90); ++ drawArc (xx, yy, arcWidth, arcHeight, 270, 90); ++ drawArc (x, yy, arcWidth, arcHeight, 180, 90); ++ ++ int y1 = y + arcHeight / 2; ++ int y2 = y + height - arcHeight / 2; ++ drawLine (x, y1, x, y2); ++ drawLine (x + width, y1, x + width, y2); ++ ++ int x1 = x + arcWidth / 2; ++ int x2 = x + width - arcWidth / 2; ++ drawLine (x1, y, x2, y); ++ drawLine (x1, y + height, x2, y + height); + } + + public void drawString (String str, int x, int y) +@@ -1210,14 +1540,21 @@ + public void fillRoundRect (int x, int y, int width, int height, + int arcWidth, int arcHeight) + { +- int x1 = x + arcWidth, x2 = x + width - arcWidth; +- int y1 = y + arcHeight, y2 = y + height - arcHeight; +- fillRect (x1, y, x2 - x1, height); +- fillRect (x, y1, width, y2 - y1); ++ if (arcWidth > width) ++ arcWidth = width; ++ if (arcHeight > height) ++ arcHeight = height; ++ ++ int xx = x + width - arcWidth; ++ int yy = y + height - arcHeight; ++ + fillArc (x, y, arcWidth, arcHeight, 90, 90); +- fillArc (x1, y, arcWidth, arcHeight, 0, 90); +- fillArc (x2, y2, arcWidth, arcHeight, 270, 90); +- fillArc (x, y2, arcWidth, arcHeight, 180, 90); ++ fillArc (xx, y, arcWidth, arcHeight, 0, 90); ++ fillArc (xx, yy, arcWidth, arcHeight, 270, 90); ++ fillArc (x, yy, arcWidth, arcHeight, 180, 90); ++ ++ fillRect (x, y + arcHeight / 2, width, height - arcHeight + 1); ++ fillRect (x + arcWidth / 2, y, width - arcWidth + 1, height); + } + + public Font getFont () +@@ -1251,7 +1588,9 @@ + + public String toString() + { +- throw new java.lang.UnsupportedOperationException (); ++ return getClass ().getName () + ++ "[font=" + font.toString () + ++ ",color=" + fg.toString () + "]"; + } + + } +Index: gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java +=================================================================== +RCS file: gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java +diff -N gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java 6 Sep 2004 16:35:39 -0000 +@@ -0,0 +1,87 @@ ++/* GdkGraphicsEnvironment.java -- information about the graphics environment ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.awt.peer.gtk; ++ ++import java.awt.*; ++import java.awt.GraphicsEnvironment; ++import java.awt.image.BufferedImage; ++import java.util.Locale; ++ ++ ++public class GdkGraphicsEnvironment extends GraphicsEnvironment ++{ ++ ++ public GdkGraphicsEnvironment () ++ { ++ super(); ++ } ++ ++ public GraphicsDevice[] getScreenDevices () ++ { ++ throw new java.lang.UnsupportedOperationException (); ++ } ++ ++ public GraphicsDevice getDefaultScreenDevice () ++ { ++ throw new java.lang.UnsupportedOperationException (); ++ } ++ ++ public Graphics2D createGraphics (BufferedImage image) ++ { ++ return new GdkGraphics2D (image); ++ } ++ ++ public Font[] getAllFonts () ++ { ++ throw new java.lang.UnsupportedOperationException (); ++ } ++ ++ public String[] getAvailableFontFamilyNames () ++ { ++ throw new java.lang.UnsupportedOperationException (); ++ } ++ ++ public String[] getAvailableFontFamilyNames (Locale l) ++ { ++ throw new java.lang.UnsupportedOperationException (); ++ } ++ ++ ++} // class GdkGraphicsEnvironment ++ +Index: gnu/java/awt/peer/gtk/GdkPixbufDecoder.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,v +retrieving revision 1.3 +diff -u -r1.3 GdkPixbufDecoder.java +--- gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 2 Dec 2003 19:56:30 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 6 Sep 2004 16:35:39 -0000 +@@ -77,19 +77,16 @@ + public GdkPixbufDecoder (String filename) + { + super (filename); +- initState (); + } + + public GdkPixbufDecoder (URL url) + { + super (url); +- initState (); + } + + public GdkPixbufDecoder (byte[] imagedata, int imageoffset, int imagelength) + { + super (imagedata, imageoffset, imagelength); +- initState (); + } + + // called back by native side +@@ -135,6 +132,7 @@ + + byte bytes[] = new byte[4096]; + int len = 0; ++ initState(); + while ((len = is.read (bytes)) != -1) + pumpBytes (bytes, len); + +@@ -220,4 +218,31 @@ + dec.startProduction (bb); + return bb.getBufferedImage (); + } ++ ++ public static BufferedImage createBufferedImage (URL u) ++ { ++ BufferedImageBuilder bb = new BufferedImageBuilder (); ++ GdkPixbufDecoder dec = new GdkPixbufDecoder (u); ++ dec.startProduction (bb); ++ return bb.getBufferedImage (); ++ } ++ ++ public static BufferedImage createBufferedImage (byte[] imagedata, int imageoffset, ++ int imagelength) ++ { ++ BufferedImageBuilder bb = new BufferedImageBuilder (); ++ GdkPixbufDecoder dec = new GdkPixbufDecoder (imagedata, imageoffset, imagelength); ++ dec.startProduction (bb); ++ return bb.getBufferedImage (); ++ } ++ ++ public static BufferedImage createBufferedImage (ImageProducer producer) ++ { ++ BufferedImageBuilder bb = new BufferedImageBuilder (); ++ producer.startProduction(bb); ++ return bb.getBufferedImage (); ++ } ++ ++ ++ + } +Index: gnu/java/awt/peer/gtk/GtkArg.java +=================================================================== +RCS file: gnu/java/awt/peer/gtk/GtkArg.java +diff -N gnu/java/awt/peer/gtk/GtkArg.java +--- gnu/java/awt/peer/gtk/GtkArg.java 31 Jan 2003 17:54:13 -0000 1.1 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,61 +0,0 @@ +-/* GtkArg.java +- Copyright (C) 1999 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +- +-package gnu.java.awt.peer.gtk; +- +-public class GtkArg +-{ +- String name; +- Object value; +- +- public GtkArg (String name, Object value) +- { +- this.name = name; +- this.value = value; +- } +- +- public String getName () +- { +- return name; +- } +- +- public Object getValue () +- { +- return value; +- } +-} +Index: gnu/java/awt/peer/gtk/GtkArgList.java +=================================================================== +RCS file: gnu/java/awt/peer/gtk/GtkArgList.java +diff -N gnu/java/awt/peer/gtk/GtkArgList.java +--- gnu/java/awt/peer/gtk/GtkArgList.java 31 Jan 2003 17:54:13 -0000 1.1 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,75 +0,0 @@ +-/* GtkArgList.java +- Copyright (C) 1999 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +- +-package gnu.java.awt.peer.gtk; +-import java.util.Vector; +- +-public class GtkArgList extends Vector +-{ +- void add (GtkArg arg) +- { +- addElement (arg); +- } +- +- void add (String name, boolean value) +- { +- addElement (new GtkArg (name, new Boolean (value))); +- } +- +- void add (String name, int value) +- { +- addElement (new GtkArg (name, new Integer (value))); +- } +- +- void add (String name, float value) +- { +- addElement (new GtkArg (name, new Float (value))); +- } +- +- void add (String name, Object value) +- { +- addElement (new GtkArg (name, value)); +- } +- +- synchronized void setArgs (GtkComponentPeer cp) +- { +- for (int i = 0; i < elementCount; i++) +- cp.set ((GtkArg)elementData[i]); +- } +-} +- +Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v +retrieving revision 1.7 +diff -u -r1.7 GtkButtonPeer.java +--- gnu/java/awt/peer/gtk/GtkButtonPeer.java 11 Dec 2003 13:50:50 -0000 1.7 ++++ gnu/java/awt/peer/gtk/GtkButtonPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -42,6 +42,7 @@ + import java.awt.Button; + import java.awt.Component; + import java.awt.Font; ++import java.awt.Point; + import java.awt.event.MouseEvent; + import java.awt.event.KeyEvent; + import java.awt.peer.ButtonPeer; +@@ -49,54 +50,57 @@ + public class GtkButtonPeer extends GtkComponentPeer + implements ButtonPeer + { +- native void create (); ++ native void create (String label); ++ + public native void connectJObject (); + public native void connectSignals (); + +- native void gtkSetFont(String name, int style, int size); ++ native void gtkSetFont (String name, int style, int size); ++ native void gtkSetLabel (String label); + native void gtkWidgetSetForeground (int red, int green, int blue); ++ native void gtkActivate (); + + public GtkButtonPeer (Button b) + { + super (b); + } + ++ void create () ++ { ++ create (((Button) awtComponent).getLabel ()); ++ } ++ + public void setLabel (String label) + { +- set ("label", label); ++ gtkSetLabel(label); + } + + public void handleEvent (AWTEvent e) + { +- if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ()) ++ if (e.getID () == MouseEvent.MOUSE_RELEASED && isEnabled ()) + { + MouseEvent me = (MouseEvent) e; ++ Point p = me.getPoint(); ++ p.translate(((Component) me.getSource()).getX(), ++ ((Component) me.getSource()).getY()); + if (!me.isConsumed () +- && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0) ++ && (me.getModifiersEx () & MouseEvent.BUTTON1_DOWN_MASK) != 0 ++ && awtComponent.getBounds().contains(p)) + postActionEvent (((Button)awtComponent).getActionCommand (), +- me.getModifiers ()); ++ me.getModifiersEx ()); + } + + if (e.getID () == KeyEvent.KEY_PRESSED) + { + KeyEvent ke = (KeyEvent) e; + if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_SPACE) +- postActionEvent (((Button)awtComponent).getActionCommand (), +- ke.getModifiers ()); ++ { ++ postActionEvent (((Button) awtComponent).getActionCommand (), ++ ke.getModifiersEx ()); ++ gtkActivate (); ++ } + } + + super.handleEvent (e); + } +- +- public void getArgs (Component component, GtkArgList args) +- { +- super.getArgs (component, args); +- +- args.add ("label", ((Button)component).getLabel ()); +- } +- +- public void setFont (Font f) +- { +- gtkSetFont(f.getName(), f.getStyle(), f.getSize()); +- } + } +Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v +retrieving revision 1.4 +diff -u -r1.4 GtkCheckboxPeer.java +--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 11 Dec 2003 13:50:50 -0000 1.4 ++++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -41,6 +41,7 @@ + import java.awt.Checkbox; + import java.awt.CheckboxGroup; + import java.awt.Component; ++import java.awt.Font; + import java.awt.peer.CheckboxPeer; + + public class GtkCheckboxPeer extends GtkComponentPeer +@@ -51,37 +52,39 @@ + // The current state of the GTK checkbox. + private boolean currentState; + +- public native void nativeCreate (GtkCheckboxGroupPeer group, +- boolean state); ++ public native void create (GtkCheckboxGroupPeer group); + public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group); + public native void connectSignals (); ++ native void gtkSetFont (String name, int style, int size); ++ native void gtkButtonSetLabel (String label); ++ native void gtkToggleButtonSetActive (boolean is_active); + + public GtkCheckboxPeer (Checkbox c) + { + super (c); + } + +- // We can't fully use the ordinary getArgs code here, due to +- // oddities of this particular widget. In particular we must be +- // able to switch between a checkbutton and a radiobutton +- // dynamically. ++ // FIXME: we must be able to switch between a checkbutton and a ++ // radiobutton dynamically. + public void create () + { +- CheckboxGroup g = ((Checkbox) awtComponent).getCheckboxGroup (); ++ Checkbox checkbox = (Checkbox) awtComponent; ++ CheckboxGroup g = checkbox.getCheckboxGroup (); + old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g); +- currentState = ((Checkbox)awtComponent).getState(); +- nativeCreate (old_group, currentState); ++ create (old_group); ++ gtkToggleButtonSetActive (checkbox.getState ()); ++ gtkButtonSetLabel (checkbox.getLabel ()); + } + + public void setState (boolean state) + { + if (currentState != state) +- set ("active", state); ++ gtkToggleButtonSetActive (state); + } + + public void setLabel (String label) + { +- set ("label", label); ++ gtkButtonSetLabel (label); + } + + public void setCheckboxGroup (CheckboxGroup group) +@@ -97,13 +100,6 @@ + } + } + +- public void getArgs (Component component, GtkArgList args) +- { +- super.getArgs (component, args); +- args.add ("active", ((Checkbox) component).getState ()); +- args.add ("label", ((Checkbox) component).getLabel ()); +- } +- + // Override the superclass postItemEvent so that the peer doesn't + // need information that we have. + public void postItemEvent (Object item, int stateChange) +Index: gnu/java/awt/peer/gtk/GtkChoicePeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java,v +retrieving revision 1.5 +diff -u -r1.5 GtkChoicePeer.java +--- gnu/java/awt/peer/gtk/GtkChoicePeer.java 5 Jan 2004 21:18:06 -0000 1.5 ++++ gnu/java/awt/peer/gtk/GtkChoicePeer.java 6 Sep 2004 16:35:39 -0000 +@@ -58,25 +58,22 @@ + items[i] = c.getItem (i); + + append (items); +- +- // Must set our state before notifying listeners +- ((Choice) awtComponent).select (c.getItem (0)); +- postItemEvent (c.getItem (0), ItemEvent.SELECTED); + } + } + + native void create (); + + native void append (String items[]); +- native int getHistory (); ++ native int nativeGetSelected (); + native void nativeAdd (String item, int index); + native void nativeRemove (int index); ++ native void nativeRemoveAll (); + + native public void select (int position); + + public void add (String item, int index) + { +- int before = getHistory(); ++ int before = nativeGetSelected(); + + nativeAdd (item, index); + +@@ -92,11 +89,11 @@ + + public void remove (int index) + { +- int before = getHistory(); ++ int before = nativeGetSelected(); + int after; + + nativeRemove (index); +- after = getHistory(); ++ after = nativeGetSelected(); + + /* Generate an ItemEvent if we are removing the currently selected item + and there are at least one item left. */ +@@ -110,7 +107,7 @@ + + public void removeAll () + { +- nativeRemove (-1); ++ nativeRemoveAll(); + } + + public void addItem (String item, int position) +Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v +retrieving revision 1.13 +diff -u -r1.13 GtkComponentPeer.java +--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 13 Jan 2004 20:54:46 -0000 1.13 ++++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -1,5 +1,5 @@ + /* GtkComponentPeer.java -- Implements ComponentPeer with GTK +- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,6 +42,7 @@ + import java.awt.BufferCapabilities; + import java.awt.Color; + import java.awt.Component; ++import java.awt.Container; + import java.awt.Cursor; + import java.awt.Dimension; + import java.awt.Font; +@@ -53,6 +54,7 @@ + import java.awt.Image; + import java.awt.Insets; + import java.awt.ItemSelectable; ++import java.awt.KeyboardFocusManager; + import java.awt.Point; + import java.awt.Rectangle; + import java.awt.Toolkit; +@@ -90,6 +92,15 @@ + native void gtkWidgetSetCursor (int type); + native void gtkWidgetSetBackground (int red, int green, int blue); + native void gtkWidgetSetForeground (int red, int green, int blue); ++ native void gtkWidgetSetSensitive (boolean sensitive); ++ native void gtkWidgetSetParent (ComponentPeer parent); ++ native void gtkWidgetRequestFocus (); ++ native void gtkWidgetDispatchKeyEvent (int id, long when, int mods, ++ int keyCode, int keyLocation); ++ native void gtkSetFont (String name, int style, int size); ++ native void gtkWidgetQueueDrawArea(int x, int y, int width, int height); ++ native void addExposeFilter(); ++ native void removeExposeFilter(); + + void create () + { +@@ -105,29 +116,59 @@ + this.awtComponent = awtComponent; + insets = new Insets (0, 0, 0, 0); + +- /* temporary try/catch block until all peers use this creation method */ +- try { +- create (); +- +- GtkArgList args = new GtkArgList (); +- getArgs (awtComponent, args); +- args.setArgs (this); +- +- connectJObject (); +- connectSignals (); +- +- if (awtComponent.getForeground () != null) +- setForeground (awtComponent.getForeground ()); +- if (awtComponent.getBackground () != null) +- setBackground (awtComponent.getBackground ()); +- if (awtComponent.getFont() != null) +- setFont(awtComponent.getFont()); +- +- setCursor (awtComponent.getCursor ()); +- Rectangle bounds = awtComponent.getBounds (); +- setBounds (bounds.x, bounds.y, bounds.width, bounds.height); ++ create (); ++ ++ setParent (); ++ ++ connectJObject (); ++ connectSignals (); ++ ++ if (awtComponent.getForeground () != null) ++ setForeground (awtComponent.getForeground ()); ++ if (awtComponent.getBackground () != null) ++ setBackground (awtComponent.getBackground ()); ++ if (awtComponent.getFont() != null) ++ setFont(awtComponent.getFont()); ++ ++ setCursor (awtComponent.getCursor ()); ++ ++ setComponentBounds (); ++ ++ Rectangle bounds = awtComponent.getBounds (); ++ setBounds (bounds.x, bounds.y, bounds.width, bounds.height); ++ setVisibleAndEnabled (); ++ } ++ ++ void setParent () ++ { ++ ComponentPeer p; ++ Component component = awtComponent; ++ do ++ { ++ component = component.getParent (); ++ p = component.getPeer (); ++ } ++ while (p instanceof java.awt.peer.LightweightPeer); ++ ++ if (p != null) ++ gtkWidgetSetParent (p); ++ } ++ ++ /* ++ * Set the bounds of this peer's AWT Component based on dimensions ++ * returned by the native windowing system. Most Components impose ++ * their dimensions on the peers so the default implementation does ++ * nothing. However some peers, like GtkFileDialogPeer, need to ++ * pass their size back to the AWT Component. ++ */ ++ void setComponentBounds () ++ { ++ } + +- } catch (RuntimeException ex) { ; } ++ void setVisibleAndEnabled () ++ { ++ setVisible (awtComponent.isVisible ()); ++ setEnabled (awtComponent.isEnabled ()); + } + + public int checkImage (Image image, int width, int height, +@@ -179,7 +220,10 @@ + + public Graphics getGraphics () + { +- return null; ++ if (GtkToolkit.useGraphics2D ()) ++ return new GdkGraphics2D (this); ++ else ++ return new GdkGraphics (this); + } + + public Point getLocationOnScreen () +@@ -206,6 +250,48 @@ + + public void handleEvent (AWTEvent event) + { ++ int id = event.getID(); ++ KeyEvent ke = null; ++ ++ switch (id) ++ { ++ case PaintEvent.PAINT: ++ case PaintEvent.UPDATE: ++ { ++ try ++ { ++ Graphics g = getGraphics (); ++ ++ // Some peers like GtkFileDialogPeer are repainted by Gtk itself ++ if (g == null) ++ break; ++ ++ g.setClip (((PaintEvent)event).getUpdateRect()); ++ ++ if (id == PaintEvent.PAINT) ++ awtComponent.paint (g); ++ else ++ awtComponent.update (g); ++ ++ g.dispose (); ++ } ++ catch (InternalError e) ++ { ++ System.err.println (e); ++ } ++ } ++ break; ++ case KeyEvent.KEY_PRESSED: ++ ke = (KeyEvent) event; ++ gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiersEx (), ++ ke.getKeyCode (), ke.getKeyLocation ()); ++ break; ++ case KeyEvent.KEY_RELEASED: ++ ke = (KeyEvent) event; ++ gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiersEx (), ++ ke.getKeyCode (), ke.getKeyLocation ()); ++ break; ++ } + } + + public boolean isFocusTraversable () +@@ -224,7 +310,21 @@ + + public void paint (Graphics g) + { +- awtComponent.paint (g); ++ Component parent = awtComponent.getParent(); ++ GtkComponentPeer parentPeer = null; ++ if ((parent instanceof Container) && !parent.isLightweight()) ++ parentPeer = (GtkComponentPeer) parent.getPeer(); ++ ++ addExposeFilter(); ++ if (parentPeer != null) ++ parentPeer.addExposeFilter(); ++ ++ Rectangle clip = g.getClipBounds(); ++ gtkWidgetQueueDrawArea(clip.x, clip.y, clip.width, clip.height); ++ ++ removeExposeFilter(); ++ if (parentPeer != null) ++ parentPeer.removeExposeFilter(); + } + + public Dimension preferredSize () +@@ -275,7 +375,11 @@ + new Rectangle (x, y, width, height))); + } + +- native public void requestFocus (); ++ public void requestFocus () ++ { ++ gtkWidgetRequestFocus(); ++ postFocusEvent(FocusEvent.FOCUS_GAINED, false); ++ } + + public void reshape (int x, int y, int width, int height) + { +@@ -292,8 +396,34 @@ + public void setBounds (int x, int y, int width, int height) + { + Component parent = awtComponent.getParent (); +- +- if (parent instanceof Window) ++ ++ // Heavyweight components that are children of one or more ++ // lightweight containers have to be handled specially. Because ++ // calls to GLightweightPeer.setBounds do nothing, GTK has no ++ // knowledge of the lightweight containers' positions. So we have ++ // to add the offsets manually when placing a heavyweight ++ // component within a lightweight container. The lightweight ++ // container may itself be in a lightweight container and so on, ++ // so we need to continue adding offsets until we reach a ++ // container whose position GTK knows -- that is, the first ++ // non-lightweight. ++ boolean lightweightChild = false; ++ Insets i; ++ while (parent.isLightweight ()) ++ { ++ lightweightChild = true; ++ ++ i = ((Container) parent).getInsets (); ++ ++ x += parent.getX () + i.left; ++ y += parent.getY () + i.top; ++ ++ parent = parent.getParent (); ++ } ++ ++ // We only need to convert from Java to GTK coordinates if we're ++ // placing a heavyweight component in a Window. ++ if (parent instanceof Window && !lightweightChild) + { + Insets insets = ((Window) parent).getInsets (); + // Convert from Java coordinates to GTK coordinates. +@@ -310,7 +440,7 @@ + + public void setEnabled (boolean b) + { +- set ("sensitive", b); ++ gtkWidgetSetSensitive (b); + } + + public void setFont (Font f) +@@ -318,6 +448,7 @@ + // FIXME: This should really affect the widget tree below me. + // Currently this is only handled if the call is made directly on + // a text widget, which implements setFont() itself. ++ gtkSetFont(f.getName(), f.getStyle(), f.getSize()); + } + + public void setForeground (Color c) +@@ -339,18 +470,14 @@ + + public void setVisible (boolean b) + { +- set ("visible", b); +- } +- +- public void hide () +- { +- setVisible (false); ++ if (b) ++ show (); ++ else ++ hide (); + } + +- public void show () +- { +- setVisible (true); +- } ++ public native void hide (); ++ public native void show (); + + protected void postMouseEvent(int id, long when, int mods, int x, int y, + int clickCount, boolean popupTrigger) +@@ -366,10 +493,28 @@ + } + + protected void postKeyEvent (int id, long when, int mods, +- int keyCode, char keyChar, int keyLocation) ++ int keyCode, char keyChar, int keyLocation) + { +- q.postEvent (new KeyEvent (awtComponent, id, when, mods, +- keyCode, keyChar, keyLocation)); ++ KeyEvent keyEvent = new KeyEvent (awtComponent, id, when, mods, ++ keyCode, keyChar, keyLocation); ++ ++ // Also post a KEY_TYPED event if keyEvent is a key press that ++ // doesn't represent an action or modifier key. ++ if (keyEvent.getID () == KeyEvent.KEY_PRESSED ++ && (!keyEvent.isActionKey () ++ && keyCode != KeyEvent.VK_SHIFT ++ && keyCode != KeyEvent.VK_CONTROL ++ && keyCode != KeyEvent.VK_ALT)) ++ { ++ synchronized (q) ++ { ++ q.postEvent (keyEvent); ++ q.postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods, ++ KeyEvent.VK_UNDEFINED, keyChar, keyLocation)); ++ } ++ } ++ else ++ q.postEvent (keyEvent); + } + + protected void postFocusEvent (int id, boolean temporary) +@@ -384,46 +529,6 @@ + item, stateChange)); + } + +- public void getArgs (Component component, GtkArgList args) +- { +- args.add ("visible", component.isVisible ()); +- args.add ("sensitive", component.isEnabled ()); +- +- ComponentPeer p; +- +- do +- { +- component = component.getParent (); +- p = component.getPeer (); +- } while (p instanceof java.awt.peer.LightweightPeer); +- +- if (p != null) +- args.add ("parent", p); +- } +- +- native void set (String name, String value); +- native void set (String name, boolean value); +- native void set (String name, int value); +- native void set (String name, float value); +- native void set (String name, Object value); +- +- void set (GtkArg arg) +- { +- String name = arg.getName (); +- Object value = arg.getValue (); +- +- if (value instanceof Boolean) +- set (name, ((Boolean)value).booleanValue ()); +- else if (value instanceof Integer) +- set (name, ((Integer)value).intValue ()); +- else if (value instanceof Float) +- set (name, ((Float)value).floatValue ()); +- else if (value instanceof String) +- set (name, ((String) value)); +- else +- set (name, value); +- } +- + public GraphicsConfiguration getGraphicsConfiguration () + { + // FIXME: just a stub for now. +Index: gnu/java/awt/peer/gtk/GtkContainerPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java,v +retrieving revision 1.7 +diff -u -r1.7 GtkContainerPeer.java +--- gnu/java/awt/peer/gtk/GtkContainerPeer.java 13 Jan 2004 17:55:20 -0000 1.7 ++++ gnu/java/awt/peer/gtk/GtkContainerPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -42,6 +42,7 @@ + import java.awt.Color; + import java.awt.Component; + import java.awt.Container; ++import java.awt.Font; + import java.awt.Graphics; + import java.awt.Insets; + import java.awt.event.PaintEvent; +@@ -89,50 +90,23 @@ + public void setBounds (int x, int y, int width, int height) + { + super.setBounds (x, y, width, height); +- awtComponent.validate (); + } + +- public Graphics getGraphics () ++ public void setFont(Font f) + { +- if (GtkToolkit.useGraphics2D ()) +- return new GdkGraphics2D (this); +- else +- return new GdkGraphics (this); ++ super.setFont(f); ++ Component[] components = ((Container) awtComponent).getComponents(); ++ for (int i = 0; i < components.length; i++) ++ { ++ GtkComponentPeer peer = (GtkComponentPeer) components[i].getPeer(); ++ if (peer != null && ! peer.awtComponent.isFontSet()) ++ peer.setFont(f); ++ } + } + +- public void handleEvent (AWTEvent event) ++ public Graphics getGraphics () + { +- int id = event.getID(); +- +- switch (id) +- { +- case PaintEvent.PAINT: +- case PaintEvent.UPDATE: +- { +- try +- { +- Graphics g = getGraphics (); +- +- // Some peers like GtkFileDialogPeer are repainted by Gtk itself +- if (g == null) +- break; +- +- g.setClip (((PaintEvent)event).getUpdateRect()); +- +- if (id == PaintEvent.PAINT) +- awtComponent.paint (g); +- else +- awtComponent.update (g); +- +- g.dispose (); +- } +- catch (InternalError e) +- { +- System.err.println (e); +- } +- } +- break; +- } ++ return super.getGraphics(); + } + + public void beginLayout () { } +Index: gnu/java/awt/peer/gtk/GtkDialogPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java,v +retrieving revision 1.9 +diff -u -r1.9 GtkDialogPeer.java +--- gnu/java/awt/peer/gtk/GtkDialogPeer.java 13 Jan 2004 20:54:46 -0000 1.9 ++++ gnu/java/awt/peer/gtk/GtkDialogPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -41,7 +41,10 @@ + import java.awt.AWTEvent; + import java.awt.Component; + import java.awt.Dialog; ++import java.awt.Graphics; + import java.awt.peer.DialogPeer; ++import java.awt.Rectangle; ++import java.awt.event.PaintEvent; + + public class GtkDialogPeer extends GtkWindowPeer + implements DialogPeer +@@ -50,22 +53,43 @@ + { + super (dialog); + } ++ ++ public Graphics getGraphics () ++ { ++ Graphics g; ++ if (GtkToolkit.useGraphics2D ()) ++ g = new GdkGraphics2D (this); ++ else ++ g = new GdkGraphics (this); ++ g.translate (-insets.left, -insets.top); ++ return g; ++ } ++ ++ protected void postMouseEvent(int id, long when, int mods, int x, int y, ++ int clickCount, boolean popupTrigger) ++ { ++ super.postMouseEvent (id, when, mods, ++ x + insets.left, y + insets.top, ++ clickCount, popupTrigger); ++ } ++ ++ protected void postExposeEvent (int x, int y, int width, int height) ++ { ++ q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, ++ new Rectangle (x + insets.left, ++ y + insets.top, ++ width, height))); ++ } + + void create () + { + // Create a decorated dialog window. + create (GDK_WINDOW_TYPE_HINT_DIALOG, true); +- } +- +- public void getArgs (Component component, GtkArgList args) +- { +- super.getArgs (component, args); + +- Dialog dialog = (Dialog) component; ++ Dialog dialog = (Dialog) awtComponent; + +- args.add ("title", dialog.getTitle ()); +- args.add ("modal", dialog.isModal ()); +- args.add ("allow_shrink", dialog.isResizable ()); +- args.add ("allow_grow", dialog.isResizable ()); ++ gtkWindowSetModal (dialog.isModal ()); ++ setTitle (dialog.getTitle ()); ++ setResizable (dialog.isResizable ()); + } + } +Index: gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,v +retrieving revision 1.4 +diff -u -r1.4 GtkFileDialogPeer.java +--- gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 8 Jan 2004 21:12:25 -0000 1.4 ++++ gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -1,5 +1,5 @@ + /* GtkFileDialogPeer.java -- Implements FileDialogPeer with GTK +- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,9 +42,11 @@ + import java.awt.Dialog; + import java.awt.FileDialog; + import java.awt.Graphics; ++import java.awt.Window; + import java.awt.event.WindowEvent; + import java.awt.peer.FileDialogPeer; + import java.io.FilenameFilter; ++import java.io.File; + + public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer + { +@@ -52,17 +54,47 @@ + + private String currentFile = null; + private String currentDirectory = null; ++ private FilenameFilter filter; + +- native void create (); ++ native void create (GtkContainerPeer parent); ++ native void connectJObject (); ++ native void connectSignals (); ++ native void nativeSetFile (String file); ++ native public String nativeGetDirectory(); ++ native public void nativeSetDirectory(String directory); ++ native void nativeSetFilenameFilter (FilenameFilter filter); ++ ++ public void create() { ++ create((GtkContainerPeer) awtComponent.getParent().getPeer()); ++ ++ FileDialog fd = (FileDialog) awtComponent; ++ ++ setDirectory(fd.getDirectory()); ++ setFile(fd.getFile()); ++ ++ FilenameFilter filter = fd.getFilenameFilter(); ++ if (filter != null) ++ setFilenameFilter(filter); ++ } + + public GtkFileDialogPeer (FileDialog fd) + { + super (fd); + } + +- native void connectJObject (); +- native void connectSignals (); +- native void nativeSetFile (String file); ++ void setComponentBounds () ++ { ++ if (awtComponent.getHeight () == 0 ++ && awtComponent.getWidth () == 0) ++ { ++ int[] dims = new int[2]; ++ gtkWidgetGetPreferredDimensions (dims); ++ ((GtkFileDialogPeer) this).setBoundsCallback ((Window) awtComponent, ++ awtComponent.getX (), ++ awtComponent.getY (), ++ dims[0], dims[1]); ++ } ++ } + + public void setFile (String fileName) + { +@@ -80,26 +112,16 @@ + return; + } + +- // Remove any directory path from the filename +- int sepIndex = fileName.lastIndexOf (FS); +- if (sepIndex < 0) +- { ++ // GtkFileChooser requires absolute filenames. If the given filename ++ // is not absolute, let's construct it based on current directory. + currentFile = fileName; ++ if (fileName.indexOf(FS) == 0) ++ { + nativeSetFile (fileName); + } + else + { +- if (fileName.length() > (sepIndex + 1)) +- { +- String fn = fileName.substring (sepIndex + 1); +- currentFile = fn; +- nativeSetFile (fn); +- } +- else +- { +- currentFile = ""; +- nativeSetFile (""); +- } ++ nativeSetFile (nativeGetDirectory() + FS + fileName); + } + } + +@@ -120,20 +142,25 @@ + } + + currentDirectory = directory; +- +- // Gtk expects the directory to end with a file separator +- if (directory.substring (directory.length () - 1).equals (FS)) +- nativeSetFile (directory); +- else +- nativeSetFile (directory + FS); ++ nativeSetDirectory (directory); + } + + public void setFilenameFilter (FilenameFilter filter) + { +- /* GTK has no filter callbacks yet. It works by setting a pattern +- * (see gtk_file_selection_complete), which we can't convert +- * to the callback paradigm. With GTK-2.4 there will be a +- * gtk_file_filter_add_custom function that we can use. */ ++ this.filter = filter; ++ nativeSetFilenameFilter(filter); ++ } ++ ++ /* This method interacts with the native callback function of the ++ same name. The native function will extract the filename from the ++ GtkFileFilterInfo object and send it to this method, which will ++ in turn call the filter's accept() method and give back the return ++ value. */ ++ boolean filenameFilterCallback (String fullname) { ++ String filename = fullname.substring(fullname.lastIndexOf(FS) + 1); ++ String dirname = fullname.substring(0, fullname.lastIndexOf(FS)); ++ File dir = new File(dirname); ++ return filter.accept(dir, filename); + } + + public Graphics getGraphics () +Index: gnu/java/awt/peer/gtk/GtkFontPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java,v +retrieving revision 1.3 +diff -u -r1.3 GtkFontPeer.java +--- gnu/java/awt/peer/gtk/GtkFontPeer.java 31 Dec 2003 08:58:30 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GtkFontPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -43,6 +43,7 @@ + import java.awt.font.*; + import java.util.Locale; + import java.util.ResourceBundle; ++import java.util.MissingResourceException; + import java.text.*; + import gnu.java.awt.peer.ClasspathFontPeer; + +@@ -62,15 +63,32 @@ + } + } + +- final private String Xname; // uses %d for font size. ++ final private String Xname; + + public GtkFontPeer (String name, int style) + { +- super(name, style, 12 /* kludge */); ++ // All fonts get a default size of 12 if size is not specified. ++ this(name, style, 12); ++ } ++ ++ public GtkFontPeer (String name, int style, int size) ++ { ++ super(name, style, size); + ++ String Xname = null; + if (bundle != null) +- Xname = bundle.getString (name.toLowerCase () + "." + style); +- else ++ { ++ try ++ { ++ Xname = bundle.getString (name.toLowerCase () + "." + style); ++ } ++ catch (MissingResourceException mre) ++ { ++ // ignored ++ } ++ } ++ ++ if (Xname == null) + { + String weight; + String slant; +@@ -90,8 +108,10 @@ + else + spacing = "c"; + +- Xname = "-*-*-" + weight + "-" + slant + "-normal-*-%d-*-*-*-" + spacing + "-*-*-*"; ++ Xname = "-*-*-" + weight + "-" + slant + "-normal-*-*-" + size + "-*-*-" + spacing + "-*-*-*"; + } ++ ++ this.Xname = Xname; + } + + public String getXLFD () +Index: gnu/java/awt/peer/gtk/GtkFramePeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java,v +retrieving revision 1.8 +diff -u -r1.8 GtkFramePeer.java +--- gnu/java/awt/peer/gtk/GtkFramePeer.java 13 Jan 2004 20:54:46 -0000 1.8 ++++ gnu/java/awt/peer/gtk/GtkFramePeer.java 6 Sep 2004 16:35:39 -0000 +@@ -1,5 +1,5 @@ + /* GtkFramePeer.java -- Implements FramePeer with GTK +- Copyright (C) 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,24 +45,87 @@ + import java.awt.Image; + import java.awt.MenuBar; + import java.awt.Rectangle; ++import java.awt.Window; + import java.awt.event.PaintEvent; ++import java.awt.image.ColorModel; + import java.awt.peer.FramePeer; + import java.awt.peer.MenuBarPeer; + + public class GtkFramePeer extends GtkWindowPeer + implements FramePeer + { +- int menuBarHeight = 0; +- native int getMenuBarHeight (); +- +- native public void setMenuBarPeer (MenuBarPeer bar); ++ private int menuBarHeight; ++ private MenuBarPeer menuBar; ++ native int getMenuBarHeight (MenuBarPeer bar); ++ ++ native void setMenuBarPeer (MenuBarPeer bar); ++ native void removeMenuBarPeer (); ++ native void moveLayout (int offset); ++ native void gtkLayoutSetVisible (boolean vis); + + public void setMenuBar (MenuBar bar) + { + if (bar == null) +- setMenuBarPeer (null); ++ { ++ if (menuBar != null) ++ { ++ gtkLayoutSetVisible(false); ++ removeMenuBarPeer(); ++ menuBar = null; ++ moveLayout(menuBarHeight); ++ insets.top -= menuBarHeight; ++ menuBarHeight = 0; ++ awtComponent.doLayout(); ++ gtkLayoutSetVisible(true); ++ } ++ } + else +- setMenuBarPeer ((MenuBarPeer) bar.getPeer ()); ++ { ++ gtkLayoutSetVisible(false); ++ int oldHeight = 0; ++ if (menuBar != null) ++ { ++ removeMenuBarPeer(); ++ oldHeight = menuBarHeight; ++ insets.top -= menuBarHeight; ++ } ++ menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer(); ++ setMenuBarPeer(menuBar); ++ menuBarHeight = getMenuBarHeight (menuBar); ++ if (oldHeight != menuBarHeight) ++ moveLayout(oldHeight - menuBarHeight); ++ insets.top += menuBarHeight; ++ awtComponent.doLayout(); ++ gtkLayoutSetVisible(true); ++ } ++ } ++ ++ public void setBounds (int x, int y, int width, int height) ++ { ++ nativeSetBounds (x, y, ++ width - insets.left - insets.right, ++ height - insets.top - insets.bottom ++ + menuBarHeight); ++ } ++ ++ public void setResizable (boolean resizable) ++ { ++ // Call setSize; otherwise when resizable is changed from true to ++ // false the frame will shrink to the dimensions it had before it ++ // was resizable. ++ setSize (awtComponent.getWidth() - insets.left - insets.right, ++ awtComponent.getHeight() - insets.top - insets.bottom ++ + menuBarHeight); ++ gtkWindowSetResizable (resizable); ++ } ++ ++ protected void postInsetsChangedEvent (int top, int left, ++ int bottom, int right) ++ { ++ insets.top = top + menuBarHeight; ++ insets.left = left; ++ insets.bottom = bottom; ++ insets.right = right; + } + + public GtkFramePeer (Frame frame) +@@ -74,22 +137,46 @@ + { + // Create a normal decorated window. + create (GDK_WINDOW_TYPE_HINT_NORMAL, true); +- } + +- public void getArgs (Component component, GtkArgList args) +- { +- super.getArgs (component, args); ++ Frame frame = (Frame) awtComponent; + +- Frame frame = (Frame) component; ++ setMenuBar (frame.getMenuBar ()); + +- args.add ("title", frame.getTitle ()); +- args.add ("allow_shrink", frame.isResizable ()); +- args.add ("allow_grow", frame.isResizable ()); ++ setTitle (frame.getTitle ()); ++ setResizable (frame.isResizable ()); ++ setIconImage(frame.getIconImage()); + } + ++ native void nativeSetIconImageFromDecoder (GdkPixbufDecoder decoder); ++ native void nativeSetIconImageFromData (int[] pixels, int width, int height); + public void setIconImage (Image image) + { +- /* TODO: Waiting on Toolkit Image routines */ ++ if (image != null) ++ { ++ GtkImage img = (GtkImage) image; ++ // FIXME: Image should be loaded, but if not, do image loading here. ++ if (img.isLoaded()) ++ { ++ if (img.getSource() instanceof GdkPixbufDecoder) ++ { ++ nativeSetIconImageFromDecoder((GdkPixbufDecoder) img.getSource()); ++ } ++ else ++ { ++ int[] pixels = img.getPixelCache(); ++ ColorModel model = img.getColorModel(); ++ int[] data = new int[pixels.length * 4]; ++ for (int i = 0; i < pixels.length; i++) ++ { ++ data[i * 4] = model.getRed(pixels[i]); ++ data[i * 4 + 1] = model.getGreen(pixels[i]); ++ data[i * 4 + 2] = model.getBlue(pixels[i]); ++ data[i * 4 + 3] = model.getAlpha(pixels[i]); ++ } ++ nativeSetIconImageFromData(data, img.getWidth(null), img.getHeight(null)); ++ } ++ } ++ } + } + + public Graphics getGraphics () +@@ -102,10 +189,32 @@ + g.translate (-insets.left, -insets.top); + return g; + } +- +- // FIXME: When MenuBars work, override postConfigureEvent and +- // setBounds to account for MenuBar dimensions. +- ++ ++ protected void postConfigureEvent (int x, int y, int width, int height) ++ { ++ int frame_x = x - insets.left; ++ // Since insets.top includes the MenuBar height, we need to add back ++ // the MenuBar height to the frame's y position. ++ // If no MenuBar exists in this frame, the MenuBar height will be 0. ++ int frame_y = y - insets.top + menuBarHeight; ++ int frame_width = width + insets.left + insets.right; ++ // Ditto as above. Since insets.top already includes the MenuBar's height, ++ // we need to subtract the MenuBar's height from the top inset. ++ int frame_height = height + insets.top + insets.bottom - menuBarHeight; ++ if (frame_x != awtComponent.getX() ++ || frame_y != awtComponent.getY() ++ || frame_width != awtComponent.getWidth() ++ || frame_height != awtComponent.getHeight()) ++ { ++ setBoundsCallback ((Window) awtComponent, ++ frame_x, ++ frame_y, ++ frame_width, ++ frame_height); ++ } ++ awtComponent.validate(); ++ } ++ + protected void postMouseEvent(int id, long when, int mods, int x, int y, + int clickCount, boolean popupTrigger) + { +Index: gnu/java/awt/peer/gtk/GtkImage.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkImage.java,v +retrieving revision 1.4 +diff -u -r1.4 GtkImage.java +--- gnu/java/awt/peer/gtk/GtkImage.java 1 Dec 2003 15:28:22 -0000 1.4 ++++ gnu/java/awt/peer/gtk/GtkImage.java 6 Sep 2004 16:35:39 -0000 +@@ -89,6 +89,18 @@ + this.observer = observer; + } + ++ public synchronized int[] ++ getPixelCache () ++ { ++ return pixelCache; ++ } ++ ++ public synchronized ColorModel ++ getColorModel () ++ { ++ return model; ++ } ++ + public synchronized int + getWidth (ImageObserver observer) + { +@@ -202,7 +214,7 @@ + public synchronized void + setColorModel (ColorModel model) + { +- if (this.model == null || this.model == model) ++ if (this.model == null || this.model.equals(model)) + this.model = model; + else + isCacheable = false; +@@ -235,13 +247,13 @@ + if (!isCacheable) + return; + +- if (cm != model || pixelCache == null) ++ if (!cm.equals(model) || pixelCache == null) + { + isCacheable = false; + return; + } + +- if (scansize == width) ++ if (scansize == width && height == 1) + { + System.arraycopy (pixels, offset, + pixelCache, y * this.width + x, +Index: gnu/java/awt/peer/gtk/GtkImagePainter.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkImagePainter.java,v +retrieving revision 1.2 +diff -u -r1.2 GtkImagePainter.java +--- gnu/java/awt/peer/gtk/GtkImagePainter.java 13 Jul 2003 15:09:20 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GtkImagePainter.java 6 Sep 2004 16:35:39 -0000 +@@ -104,7 +104,7 @@ + s_width = Math.abs (sx2 - sx1); + s_height = Math.abs (sy2 - sy1); + clip = new Rectangle (sx1, sy1, s_width, s_height); +- ++ + new Thread (this).start (); + } + +@@ -119,6 +119,11 @@ + static int[] + convertPixels (int[] pixels, ColorModel model) + { ++ if (pixels == null || model == null) ++ { ++ return null; ++ } ++ + if (model.equals (ColorModel.getRGBdefault ())) + return pixels; + +@@ -133,6 +138,11 @@ + static int[] + convertPixels (byte[] pixels, ColorModel model) + { ++ if (pixels == null || model == null) ++ { ++ return null; ++ } ++ + int ret[] = new int[pixels.length]; + + for (int i = 0; i < pixels.length; i++) +@@ -160,8 +170,6 @@ + + offset += r.y * scansize + r.x; + +- r.translate (-Math.abs (clip.x - startX), -Math.abs (clip.y - startY)); +- + width = r.width; + height = r.height; + x = r.x; +@@ -178,8 +186,8 @@ + setPixels (int x, int y, int width, int height, ColorModel model, + byte[] pixels, int offset, int scansize) + { +- setPixels (x, y, width, height, model, convertPixels (pixels, model), +- offset, scansize); ++ setPixels (x, y, width, height, ColorModel.getRGBdefault(), ++ convertPixels (pixels, model), offset, scansize); + } + + public void +@@ -238,5 +246,6 @@ + public void + imageComplete (int status) + { ++ image.imageComplete(status); + } + } +Index: gnu/java/awt/peer/gtk/GtkLabelPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java,v +retrieving revision 1.3 +diff -u -r1.3 GtkLabelPeer.java +--- gnu/java/awt/peer/gtk/GtkLabelPeer.java 11 Nov 2003 17:04:46 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GtkLabelPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -39,28 +39,30 @@ + package gnu.java.awt.peer.gtk; + + import java.awt.Component; ++import java.awt.Font; + import java.awt.Label; + import java.awt.peer.LabelPeer; + + public class GtkLabelPeer extends GtkComponentPeer + implements LabelPeer + { ++ native void create (String text, float alignment); ++ native void gtkSetFont (String name, int style, int size); ++ native void nativeSetAlignment (float alignment); ++ ++ native public void setText (String text); ++ + void create () + { + Label label = (Label) awtComponent; + create (label.getText (), getGtkAlignment (label.getAlignment ())); + } + +- native void create (String text, float alignment); +- + public GtkLabelPeer (Label l) + { + super (l); + } + +- native public void setText (String text); +- +- native void nativeSetAlignment (float alignment); + public void setAlignment (int alignment) + { + nativeSetAlignment (getGtkAlignment (alignment)); +Index: gnu/java/awt/peer/gtk/GtkListPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v +retrieving revision 1.6 +diff -u -r1.6 GtkListPeer.java +--- gnu/java/awt/peer/gtk/GtkListPeer.java 17 Dec 2003 18:02:56 -0000 1.6 ++++ gnu/java/awt/peer/gtk/GtkListPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -48,13 +48,22 @@ + public class GtkListPeer extends GtkComponentPeer + implements ListPeer + { +-// native void create (ComponentPeer parent, String [] items, boolean mode); ++ void create () ++ { ++ List list = (List) awtComponent; ++ ++ create (list.getRows ()); + +- native void create (); ++ setMultipleMode (list.isMultipleMode ()); ++ } ++ ++ native void create (int rows); + native void connectJObject (); + native void connectSignals (); ++ native void gtkSetFont (String name, int style, int size); ++ native void gtkWidgetRequestFocus (); + +- native void getSize (int rows, int dims[]); ++ native void getSize (int rows, int visibleRows, int dims[]); + + public GtkListPeer (List list) + { +@@ -85,18 +94,12 @@ + + public Dimension getMinimumSize (int rows) + { +- int dims[] = new int[2]; +- +- getSize (rows, dims); +- return (new Dimension (dims[0], dims[1])); ++ return minimumSize (rows); + } + + public Dimension getPreferredSize (int rows) + { +- int dims[] = new int[2]; +- +- getSize (rows, dims); +- return (new Dimension (dims[0], dims[1])); ++ return preferredSize (rows); + } + + public native int[] getSelectedIndexes (); +@@ -104,12 +107,20 @@ + + public Dimension minimumSize (int rows) + { +- return (getMinimumSize (rows)); ++ int dims[] = new int[2]; ++ ++ int visibleRows = ((List) awtComponent).getRows(); ++ getSize (rows, visibleRows, dims); ++ return new Dimension (dims[0], dims[1]); + } + + public Dimension preferredSize (int rows) + { +- return (getPreferredSize (rows)); ++ int dims[] = new int[2]; ++ ++ int visibleRows = ((List) awtComponent).getRows(); ++ getSize (rows, visibleRows, dims); ++ return new Dimension (dims[0], dims[1]); + } + + public void removeAll () +@@ -129,20 +140,20 @@ + { + if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ()) + { +- /* Only generate the ActionEvent on the second click of +- a multiple click */ ++ // Only generate the ActionEvent on the second click of a ++ // multiple click. + MouseEvent me = (MouseEvent) e; + if (!me.isConsumed () +- && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0 ++ && (me.getModifiersEx () & MouseEvent.BUTTON1_DOWN_MASK) != 0 + && me.getClickCount() == 2) + { +- String selectedItem = ((List)awtComponent).getSelectedItem (); ++ String selectedItem = ((List) awtComponent).getSelectedItem (); + +- /* Double-click only generates an Action event +- if something is selected */ ++ // Double-click only generates an Action event if ++ // something is selected. + if (selectedItem != null) +- postActionEvent (((List)awtComponent).getSelectedItem (), +- me.getModifiers ()); ++ postActionEvent (((List) awtComponent).getSelectedItem (), ++ me.getModifiersEx ()); + } + } + +@@ -151,11 +162,12 @@ + KeyEvent ke = (KeyEvent) e; + if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_ENTER) + { +- String selectedItem = ((List)awtComponent).getSelectedItem (); ++ String selectedItem = ((List) awtComponent).getSelectedItem (); + +- /* Enter only generates an Action event if something is selected */ ++ // Enter only generates an Action event if something is ++ // selected. + if (selectedItem != null) +- postActionEvent (selectedItem, ke.getModifiers ()); ++ postActionEvent (selectedItem, ke.getModifiersEx ()); + } + } + +Index: gnu/java/awt/peer/gtk/GtkMainThread.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMainThread.java,v +retrieving revision 1.1 +diff -u -r1.1 GtkMainThread.java +--- gnu/java/awt/peer/gtk/GtkMainThread.java 31 Jan 2003 17:54:13 -0000 1.1 ++++ gnu/java/awt/peer/gtk/GtkMainThread.java 6 Sep 2004 16:35:39 -0000 +@@ -43,7 +43,18 @@ + private static Thread mainThread = null; + private static Object mainThreadLock = new Object(); + +- static native void gtkInit(); ++ // Whether the gtk+ subsystem has been initialized. ++ private boolean gtkInitCalled = false; ++ ++ /** ++ * Call gtk_init. It is very important that this happen before any other ++ * gtk calls. ++ * ++ * @param portableNativeSync 1 if the Java property ++ * gnu.classpath.awt.gtk.portable.native.sync is set to "true". 0 if it is ++ * set to "false". -1 if unset. ++ */ ++ static native void gtkInit(int portableNativeSync); + native void gtkMain(); + + public GtkMainThread() +@@ -59,18 +70,38 @@ + synchronized (this) + { + mainThread.start(); +- try { +- wait(); +- } catch (InterruptedException e) { } ++ ++ while (!gtkInitCalled) ++ { ++ try ++ { ++ wait(); ++ } ++ catch (InterruptedException e) { } ++ } + } + } + + public void run() + { ++ /* Pass the value of the gnu.classpath.awt.gtk.portable.native.sync system ++ * property to C. */ ++ int portableNativeSync; ++ String portNatSyncProp = ++ System.getProperty("gnu.classpath.awt.gtk.portable.native.sync"); ++ ++ if (portNatSyncProp == null) ++ portableNativeSync = -1; // unset ++ else if (Boolean.valueOf(portNatSyncProp).booleanValue()) ++ portableNativeSync = 1; // true ++ else ++ portableNativeSync = 0; // false ++ + synchronized (this) + { +- gtkInit(); +- notify(); ++ gtkInit(portableNativeSync); ++ gtkInitCalled = true; ++ notifyAll(); + } + gtkMain(); + } +Index: gnu/java/awt/peer/gtk/GtkMenuBarPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java,v +retrieving revision 1.2 +diff -u -r1.2 GtkMenuBarPeer.java +--- gnu/java/awt/peer/gtk/GtkMenuBarPeer.java 13 Jul 2003 15:09:20 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GtkMenuBarPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -56,15 +56,12 @@ + create (); + } + ++ native void nativeSetHelpMenu(MenuPeer menuPeer); ++ + /* In Gnome, help menus are no longer right flushed. */ + public void addHelpMenu (Menu menu) + { +- addMenu (menu); +- } +- +- public void addMenu (Menu menu) +- { +- addMenu ((MenuPeer) menu.getPeer ()); ++ nativeSetHelpMenu((MenuPeer) menu.getPeer()); + } + + native public void delMenu (int index); +Index: gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java,v +retrieving revision 1.2 +diff -u -r1.2 GtkMenuComponentPeer.java +--- gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java 13 Jul 2003 15:09:20 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -47,8 +47,6 @@ + { + super (awtWidget); + } +- +- public void dispose () +- { +- } ++ ++ public native void dispose(); + } +Index: gnu/java/awt/peer/gtk/GtkMenuItemPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,v +retrieving revision 1.3 +diff -u -r1.3 GtkMenuItemPeer.java +--- gnu/java/awt/peer/gtk/GtkMenuItemPeer.java 8 Oct 2003 15:49:31 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GtkMenuItemPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -50,6 +50,7 @@ + implements MenuItemPeer + { + native void create (String label); ++ public native void connectSignals (); + + public GtkMenuItemPeer (MenuItem item) + { +@@ -57,6 +58,9 @@ + create (item.getLabel ()); + setEnabled (item.isEnabled ()); + setParent (item); ++ ++ if (item.getParent() instanceof Menu && ! (item instanceof Menu)) ++ connectSignals(); + } + + void setParent (MenuItem item) +@@ -85,10 +89,8 @@ + setEnabled (true); + } + +- public void setEnabled (boolean b) +- { +- // do nothing, for now. +- } ++ native public void setEnabled (boolean b); ++ + native public void setLabel (String label); + + protected void postMenuActionEvent () +Index: gnu/java/awt/peer/gtk/GtkMenuPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuPeer.java,v +retrieving revision 1.2 +diff -u -r1.2 GtkMenuPeer.java +--- gnu/java/awt/peer/gtk/GtkMenuPeer.java 13 Jul 2003 15:09:20 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GtkMenuPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -52,11 +52,15 @@ + native void create (String label); + native void addItem (MenuItemPeer item, int key, boolean shiftModifier); + native void setupAccelGroup (GtkGenericPeer container); ++ native void addTearOff (); + + public GtkMenuPeer (Menu menu) + { + super (menu); + ++ if (menu.isTearOff()) ++ addTearOff(); ++ + MenuContainer parent = menu.getParent (); + if (parent instanceof Menu) + setupAccelGroup ((GtkGenericPeer)((Menu)parent).getPeer ()); +@@ -95,10 +99,5 @@ + addItem (item, key, shiftModifier); + } + +- public void addSeparator () +- { +- addItem (new MenuItem ("-")); +- } +- + native public void delItem (int index); + } +Index: gnu/java/awt/peer/gtk/GtkOffScreenImage.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkOffScreenImage.java,v +retrieving revision 1.2 +diff -u -r1.2 GtkOffScreenImage.java +--- gnu/java/awt/peer/gtk/GtkOffScreenImage.java 13 Jul 2003 15:09:20 -0000 1.2 ++++ gnu/java/awt/peer/gtk/GtkOffScreenImage.java 6 Sep 2004 16:35:39 -0000 +@@ -76,7 +76,10 @@ + + public Graphics getGraphics () + { +- return g; ++ if (g instanceof GdkGraphics2D) ++ return new GdkGraphics2D ((GdkGraphics2D) this.g); ++ else ++ return new GdkGraphics ((GdkGraphics) this.g); + } + + public Object getProperty (String name, ImageObserver observer) +Index: gnu/java/awt/peer/gtk/GtkPanelPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java,v +retrieving revision 1.3 +diff -u -r1.3 GtkPanelPeer.java +--- gnu/java/awt/peer/gtk/GtkPanelPeer.java 11 Dec 2003 13:50:50 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GtkPanelPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -38,7 +38,9 @@ + + package gnu.java.awt.peer.gtk; + ++import java.awt.AWTEvent; + import java.awt.Panel; ++import java.awt.event.MouseEvent; + import java.awt.peer.PanelPeer; + + public class GtkPanelPeer extends GtkContainerPeer +@@ -46,10 +48,22 @@ + { + native void create (); + native void connectJObject (); +- native void connectSignals (); + + public GtkPanelPeer (Panel p) + { + super (p); + } ++ ++ public void handleEvent (AWTEvent event) ++ { ++ int id = event.getID(); ++ ++ switch (id) ++ { ++ case MouseEvent.MOUSE_PRESSED: ++ awtComponent.requestFocusInWindow (); ++ break; ++ } ++ super.handleEvent (event); ++ } + } +Index: gnu/java/awt/peer/gtk/GtkScrollPanePeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java,v +retrieving revision 1.3 +diff -u -r1.3 GtkScrollPanePeer.java +--- gnu/java/awt/peer/gtk/GtkScrollPanePeer.java 5 Jan 2004 21:35:32 -0000 1.3 ++++ gnu/java/awt/peer/gtk/GtkScrollPanePeer.java 6 Sep 2004 16:35:39 -0000 +@@ -39,6 +39,7 @@ + package gnu.java.awt.peer.gtk; + + import java.awt.Adjustable; ++import java.awt.Dimension; + import java.awt.ScrollPane; + import java.awt.peer.ComponentPeer; + import java.awt.peer.ScrollPanePeer; +@@ -87,10 +88,10 @@ + native public int getVScrollbarWidth (); + native public void setScrollPosition (int x, int y); + +-// public Dimension getPreferredSize () +-// { +-// return new Dimension (60, 60); +-// } ++ public Dimension getPreferredSize () ++ { ++ return awtComponent.getSize(); ++ } + + public void setUnitIncrement (Adjustable adj, int u) + { +Index: gnu/java/awt/peer/gtk/GtkTextAreaPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,v +retrieving revision 1.7 +diff -u -r1.7 GtkTextAreaPeer.java +--- gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 13 Jan 2004 20:58:33 -0000 1.7 ++++ gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -47,9 +47,13 @@ + public class GtkTextAreaPeer extends GtkTextComponentPeer + implements TextAreaPeer + { ++ private static transient int DEFAULT_ROWS = 10; ++ private static transient int DEFAULT_COLS = 80; ++ + native void create (int width, int height, int scrollbarVisibility); + + native void gtkSetFont (String name, int style, int size); ++ native void gtkWidgetRequestFocus (); + + void create () + { +@@ -60,7 +64,7 @@ + // GtkComponent.create. + if (f == null) + { +- f = new Font ("Fixed", Font.PLAIN, 12); ++ f = new Font ("Dialog", Font.PLAIN, 12); + awtComponent.setFont (f); + } + +@@ -71,13 +75,17 @@ + fm = new GdkFontMetrics (f); + + TextArea ta = ((TextArea) awtComponent); +- int rows = ta.getRows (); +- int cols = ta.getColumns (); ++ int sizeRows = ta.getRows (); ++ int sizeCols = ta.getColumns (); ++ ++ sizeRows = sizeRows == 0 ? DEFAULT_ROWS : sizeRows; ++ sizeCols = sizeCols == 0 ? DEFAULT_COLS : sizeCols; + +- int width = cols * fm.getMaxAdvance (); +- int height = rows * (fm.getMaxDescent () + fm.getMaxAscent ()); ++ int width = sizeCols * fm.getMaxAdvance (); ++ int height = sizeRows * (fm.getMaxDescent () + fm.getMaxAscent ()); + + create (width, height, ta.getScrollbarVisibility ()); ++ setEditable (ta.isEditable ()); + } + + public GtkTextAreaPeer (TextArea ta) +@@ -90,12 +98,14 @@ + + public Dimension getMinimumSize (int rows, int cols) + { +- return minimumSize (rows, cols); ++ return minimumSize (rows == 0 ? DEFAULT_ROWS : rows, ++ cols == 0 ? DEFAULT_COLS : cols); + } + + public Dimension getPreferredSize (int rows, int cols) + { +- return preferredSize (rows, cols); ++ return preferredSize (rows == 0 ? DEFAULT_ROWS : rows, ++ cols == 0 ? DEFAULT_COLS : cols); + } + + native int getHScrollbarHeight (); +@@ -105,8 +115,6 @@ + public Dimension minimumSize (int rows, int cols) + { + TextArea ta = ((TextArea) awtComponent); +- int hScrollbarHeight = 0; +- int vScrollbarWidth = 0; + int height = 0; + int width = 0; + +@@ -128,8 +136,11 @@ + else + fm = new GdkFontMetrics (f); + +- width += cols * fm.getMaxAdvance (); +- height += rows * (fm.getMaxDescent () + fm.getMaxAscent ()); ++ int sizeRows = rows == 0 ? DEFAULT_ROWS : rows; ++ int sizeCols = cols == 0 ? DEFAULT_COLS : cols; ++ ++ width += sizeCols * fm.getMaxAdvance (); ++ height += sizeRows * (fm.getMaxDescent () + fm.getMaxAscent ()); + + return new Dimension (width, height); + } +@@ -137,8 +148,6 @@ + public Dimension preferredSize (int rows, int cols) + { + TextArea ta = ((TextArea) awtComponent); +- int hScrollbarHeight = 0; +- int vScrollbarWidth = 0; + int height = 0; + int width = 0; + +@@ -160,8 +169,11 @@ + else + fm = new GdkFontMetrics (f); + +- width += cols * fm.getMaxAdvance (); +- height += rows * (fm.getMaxDescent () + fm.getMaxAscent ()); ++ int sizeRows = rows == 0 ? DEFAULT_ROWS : rows; ++ int sizeCols = cols == 0 ? DEFAULT_COLS : cols; ++ ++ width += sizeCols * fm.getMaxAdvance (); ++ height += sizeRows * (fm.getMaxDescent () + fm.getMaxAscent ()); + + return new Dimension (width, height); + } +@@ -175,9 +187,4 @@ + { + insert (str, pos); + } +- +- public void setFont (Font f) +- { +- gtkSetFont (f.getName (), f.getStyle (), f.getSize ()); +- } + } +Index: gnu/java/awt/peer/gtk/GtkTextComponentPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java,v +retrieving revision 1.7 +diff -u -r1.7 GtkTextComponentPeer.java +--- gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 11 Dec 2003 13:50:50 -0000 1.7 ++++ gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -54,6 +54,7 @@ + super (tc); + + setText (tc.getText ()); ++ setCaretPosition(0); + } + + public native void connectSignals (); +Index: gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,v +retrieving revision 1.8 +diff -u -r1.8 GtkTextFieldPeer.java +--- gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 8 Oct 2003 23:38:44 -0000 1.8 ++++ gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 6 Sep 2004 16:35:39 -0000 +@@ -41,6 +41,7 @@ + import java.awt.AWTEvent; + import java.awt.Dimension; + import java.awt.Font; ++import java.awt.FontMetrics; + import java.awt.TextField; + import java.awt.event.KeyEvent; + import java.awt.peer.TextFieldPeer; +@@ -48,14 +49,42 @@ + public class GtkTextFieldPeer extends GtkTextComponentPeer + implements TextFieldPeer + { ++ native void create (int width); ++ native void gtkWidgetSetBackground (int red, int green, int blue); ++ native void gtkWidgetSetForeground (int red, int green, int blue); ++ ++ void create () ++ { ++ Font f = awtComponent.getFont (); ++ ++ // By default, Sun sets a TextField's font when its peer is ++ // created. If f != null then the peer's font is set by ++ // GtkComponent.create. ++ if (f == null) ++ { ++ f = new Font ("Dialog", Font.PLAIN, 12); ++ awtComponent.setFont (f); ++ } + +-// native void create (ComponentPeer parent, String text); ++ FontMetrics fm; ++ if (GtkToolkit.useGraphics2D ()) ++ fm = new GdkClasspathFontPeerMetrics (f); ++ else ++ fm = new GdkFontMetrics (f); + +- native void create (); ++ TextField tf = ((TextField) awtComponent); ++ int cols = tf.getColumns (); + +- native void gtkEntryGetSize (int dims[]); ++ int text_width = cols * fm.getMaxAdvance (); + +- native void gtkSetFont(String name, int style, int size); ++ create (text_width); ++ ++ setEditable (tf.isEditable ()); ++ } ++ ++ native int gtkEntryGetBorderWidth (); ++ ++ native void gtkSetFont (String name, int style, int size); + + public GtkTextFieldPeer (TextField tf) + { +@@ -67,34 +96,61 @@ + + public Dimension getMinimumSize (int cols) + { +- int dims[] = new int[2]; +- +- gtkEntryGetSize (dims); +- +- return (new Dimension (dims[0], dims[1])); ++ return minimumSize (cols); + } + + public Dimension getPreferredSize (int cols) + { +- int dims[] = new int[2]; +- +- gtkEntryGetSize (dims); +- +- return (new Dimension (dims[0], dims[1])); ++ return preferredSize (cols); + } +- +- public native void setEchoChar (char c); + +- /* Deprecated */ ++ public native void setEchoChar (char c); + ++ // Deprecated + public Dimension minimumSize (int cols) + { +- return getMinimumSize (cols); ++ int dim[] = new int[2]; ++ ++ gtkWidgetGetPreferredDimensions (dim); ++ ++ Font f = awtComponent.getFont (); ++ if (f == null) ++ return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]); ++ ++ FontMetrics fm; ++ if (GtkToolkit.useGraphics2D ()) ++ fm = new GdkClasspathFontPeerMetrics (f); ++ else ++ fm = new GdkFontMetrics (f); ++ ++ int text_width = cols * fm.getMaxAdvance (); ++ ++ int width = text_width + 2 * gtkEntryGetBorderWidth (); ++ ++ return new Dimension (width, dim[1]); + } + + public Dimension preferredSize (int cols) + { +- return getPreferredSize (cols); ++ int dim[] = new int[2]; ++ ++ gtkWidgetGetPreferredDimensions (dim); ++ ++ Font f = awtComponent.getFont (); ++ if (f == null) ++ return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]); ++ ++ FontMetrics fm; ++ if (GtkToolkit.useGraphics2D ()) ++ fm = new GdkClasspathFontPeerMetrics (f); ++ else ++ fm = new GdkFontMetrics (f); ++ ++ int text_width = cols * fm.getMaxAdvance (); ++ ++ int width = text_width + 2 * gtkEntryGetBorderWidth (); ++ ++ return new Dimension (width, dim[1]); + } + + public void setEchoCharacter (char c) +@@ -102,20 +158,15 @@ + setEchoChar (c); + } + +- public void setFont (Font f) +- { +- gtkSetFont(f.getName(), f.getStyle(), f.getSize()); +- } +- + public void handleEvent (AWTEvent e) + { + if (e.getID () == KeyEvent.KEY_PRESSED) + { +- KeyEvent ke = (KeyEvent)e; ++ KeyEvent ke = (KeyEvent) e; + +- if (!ke.isConsumed() +- && ke.getKeyCode() == KeyEvent.VK_ENTER) +- postActionEvent (getText(), ke.getModifiers ()); ++ if (!ke.isConsumed () ++ && ke.getKeyCode () == KeyEvent.VK_ENTER) ++ postActionEvent (getText (), ke.getModifiersEx ()); + } + + super.handleEvent (e); +Index: gnu/java/awt/peer/gtk/GtkToolkit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java,v +retrieving revision 1.7 +diff -u -r1.7 GtkToolkit.java +--- gnu/java/awt/peer/gtk/GtkToolkit.java 10 Jan 2004 21:32:23 -0000 1.7 ++++ gnu/java/awt/peer/gtk/GtkToolkit.java 6 Sep 2004 16:35:40 -0000 +@@ -44,12 +44,17 @@ + import java.awt.dnd.peer.DragSourceContextPeer; + import java.awt.font.TextAttribute; + import java.awt.im.InputMethodHighlight; ++import java.awt.image.BufferedImage; + import java.awt.image.ColorModel; + import java.awt.image.ImageObserver; ++import java.awt.image.ImageConsumer; + import java.awt.image.ImageProducer; ++import java.awt.GraphicsEnvironment; + import java.awt.peer.*; + import java.net.URL; ++import java.util.HashSet; + import java.util.Hashtable; ++import java.util.Iterator; + import java.util.Map; + import java.util.MissingResourceException; + import java.util.Properties; +@@ -115,31 +120,174 @@ + public int checkImage (Image image, int width, int height, + ImageObserver observer) + { +- return ((GtkImage) image).checkImage (); ++ int status = ((GtkImage) image).checkImage (); ++ ++ if (observer != null) ++ observer.imageUpdate (image, status, ++ -1, -1, ++ image.getWidth (observer), ++ image.getHeight (observer)); ++ ++ return status; ++ } ++ ++ /** ++ * A helper class to return to clients in cases where a BufferedImage is ++ * desired but its construction fails. ++ */ ++ private class GtkErrorImage extends Image ++ { ++ public GtkErrorImage() ++ { ++ } ++ ++ public int getWidth(ImageObserver observer) ++ { ++ return -1; ++ } ++ ++ public int getHeight(ImageObserver observer) ++ { ++ return -1; ++ } ++ ++ public ImageProducer getSource() ++ { ++ ++ return new ImageProducer() ++ { ++ HashSet consumers = new HashSet(); ++ public void addConsumer(ImageConsumer ic) ++ { ++ consumers.add(ic); ++ } ++ ++ public boolean isConsumer(ImageConsumer ic) ++ { ++ return consumers.contains(ic); ++ } ++ ++ public void removeConsumer(ImageConsumer ic) ++ { ++ consumers.remove(ic); ++ } ++ ++ public void startProduction(ImageConsumer ic) ++ { ++ consumers.add(ic); ++ Iterator i = consumers.iterator(); ++ while(i.hasNext()) ++ { ++ ImageConsumer c = (ImageConsumer) i.next(); ++ c.imageComplete(ImageConsumer.IMAGEERROR); ++ } ++ } ++ public void requestTopDownLeftRightResend(ImageConsumer ic) ++ { ++ startProduction(ic); ++ } ++ }; ++ } ++ ++ public Graphics getGraphics() ++ { ++ return null; ++ } ++ ++ public Object getProperty(String name, ImageObserver observer) ++ { ++ return null; ++ } ++ public Image getScaledInstance(int width, int height, int flags) ++ { ++ return new GtkErrorImage(); ++ } ++ ++ public void flush() ++ { ++ } + } + ++ ++ /** ++ * Helper to return either a BufferedImage -- the argument -- or a ++ * GtkErrorImage if the argument is null. ++ */ ++ ++ private Image bufferedImageOrError(BufferedImage b) ++ { ++ if (b == null) ++ return new GtkErrorImage(); ++ else ++ return b; ++ } ++ ++ + public Image createImage (String filename) + { +- return new GtkImage (new GdkPixbufDecoder (filename), null); ++ if (useGraphics2D()) ++ return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (filename)); ++ else ++ { ++ GdkPixbufDecoder d = new GdkPixbufDecoder (filename); ++ GtkImage image = new GtkImage (d, null); ++ d.startProduction (image); ++ return image; ++ } + } + + public Image createImage (URL url) + { +- return new GtkImage (new GdkPixbufDecoder (url), null); ++ if (useGraphics2D()) ++ return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (url)); ++ else ++ { ++ GdkPixbufDecoder d = new GdkPixbufDecoder (url); ++ GtkImage image = new GtkImage (d, null); ++ d.startProduction (image); ++ return image; ++ } + } + + public Image createImage (ImageProducer producer) + { +- return new GtkImage (producer, null); ++ if (useGraphics2D()) ++ return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (producer)); ++ else ++ { ++ GtkImage image = new GtkImage (producer, null); ++ producer.startProduction (image); ++ return image; ++ } + } + + public Image createImage (byte[] imagedata, int imageoffset, + int imagelength) + { +- return new GtkImage (new GdkPixbufDecoder (imagedata, +- imageoffset, +- imagelength), +- null); ++ if (useGraphics2D()) ++ return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (imagedata, ++ imageoffset, ++ imagelength)); ++ else ++ { ++ GdkPixbufDecoder d = new GdkPixbufDecoder (imagedata, ++ imageoffset, ++ imagelength); ++ GtkImage image = new GtkImage (d, null); ++ d.startProduction (image); ++ return image; ++ } ++ } ++ ++ /** ++ * Creates an ImageProducer from the specified URL. The image is assumed ++ * to be in a recognised format. ++ * ++ * @param url URL to read image data from. ++ */ ++ public ImageProducer createImageProducer(URL url) ++ { ++ return new GdkPixbufDecoder(url); + } + + public ColorModel getColorModel () +@@ -166,12 +314,12 @@ + + public Image getImage (String filename) + { +- return new GtkImage (new GdkPixbufDecoder (filename), null); ++ return createImage (filename); + } + + public Image getImage (URL url) + { +- return new GtkImage (new GdkPixbufDecoder (url), null); ++ return createImage (url); + } + + public PrintJob getPrintJob (Frame frame, String jobtitle, Properties props) +@@ -352,14 +500,18 @@ + * @deprecated part of the older "logical font" system in earlier AWT + * implementations. Our newer Font class uses getClasspathFontPeer. + */ +- protected FontPeer getFontPeer (String name, int style) ++ protected FontPeer getFontPeer (String name, int style) { ++ // All fonts get a default size of 12 if size is not specified. ++ return getFontPeer(name, style, 12); ++ } ++ ++ /** ++ * Private method that allows size to be set at initialization time. ++ */ ++ private FontPeer getFontPeer (String name, int style, int size) + { +- try { +- GtkFontPeer fp = new GtkFontPeer (name, style); +- return fp; +- } catch (MissingResourceException ex) { +- return null; +- } ++ GtkFontPeer fp = new GtkFontPeer (name, style, size); ++ return fp; + } + + /** +@@ -374,7 +526,11 @@ + return new GdkClasspathFontPeer (name, attrs); + else + { ++ // Default values ++ int size = 12; + int style = Font.PLAIN; ++ if (name == null) ++ name = "Default"; + + if (attrs.containsKey (TextAttribute.WEIGHT)) + { +@@ -390,7 +546,13 @@ + style += Font.ITALIC; + } + +- return (ClasspathFontPeer) this.getFontPeer (name, style); ++ if (attrs.containsKey (TextAttribute.SIZE)) ++ { ++ Float fsize = (Float) attrs.get (TextAttribute.SIZE); ++ size = fsize.intValue(); ++ } ++ ++ return (ClasspathFontPeer) this.getFontPeer (name, style, size); + } + } + +@@ -399,9 +561,7 @@ + return q; + } + +- protected void loadSystemColors (int[] systemColors) +- { +- } ++ protected native void loadSystemColors (int[] systemColors); + + public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent e) + { +@@ -417,7 +577,9 @@ + + public GraphicsEnvironment getLocalGraphicsEnvironment() + { +- throw new java.lang.UnsupportedOperationException (); ++ GraphicsEnvironment ge; ++ ge = new GdkGraphicsEnvironment (); ++ return ge; + } + + public Font createFont(int format, java.io.InputStream stream) +Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v +retrieving revision 1.10 +diff -u -r1.10 GtkWindowPeer.java +--- gnu/java/awt/peer/gtk/GtkWindowPeer.java 13 Jan 2004 20:54:46 -0000 1.10 ++++ gnu/java/awt/peer/gtk/GtkWindowPeer.java 6 Sep 2004 16:35:40 -0000 +@@ -60,6 +60,10 @@ + private boolean hasBeenShown = false; + private int oldState = Frame.NORMAL; + ++ native void gtkWindowSetTitle (String title); ++ native void gtkWindowSetResizable (boolean resizable); ++ native void gtkWindowSetModal (boolean modal); ++ + native void create (int type, boolean decorated, + int width, int height, + GtkWindowPeer parent, +@@ -92,6 +96,16 @@ + create (GDK_WINDOW_TYPE_HINT_NORMAL, false); + } + ++ void setParent () ++ { ++ setVisible (awtComponent.isVisible ()); ++ setEnabled (awtComponent.isEnabled ()); ++ } ++ ++ void setVisibleAndEnabled () ++ { ++ } ++ + native void connectJObject (); + native void connectSignals (); + +@@ -100,12 +114,6 @@ + super (window); + } + +- public void getArgs (Component component, GtkArgList args) +- { +- args.add ("visible", component.isVisible ()); +- args.add ("sensitive", component.isEnabled ()); +- } +- + native public void toBack (); + native public void toFront (); + +@@ -120,7 +128,7 @@ + + public void setTitle (String title) + { +- set ("title", title); ++ gtkWindowSetTitle (title); + } + + native void setSize (int width, int height); +@@ -132,8 +140,7 @@ + // was resizable. + setSize (awtComponent.getWidth() - insets.left - insets.right, + awtComponent.getHeight() - insets.top - insets.bottom); +- set ("allow_shrink", resizable); +- set ("allow_grow", resizable); ++ gtkWindowSetResizable (resizable); + } + + native void setBoundsCallback (Window window, +Index: gnu/java/awt/peer/gtk/TestAWT.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/TestAWT.java,v +retrieving revision 1.3 +diff -u -r1.3 TestAWT.java +--- gnu/java/awt/peer/gtk/TestAWT.java 13 Jan 2004 20:00:00 -0000 1.3 ++++ gnu/java/awt/peer/gtk/TestAWT.java 6 Sep 2004 16:35:40 -0000 +@@ -272,6 +272,7 @@ + public void windowClosing (WindowEvent e) + { + System.out.println ("Window Closing"); ++ text.setVisible (false); + hide (); + } + }); +@@ -305,7 +306,8 @@ + cb.addActionListener(new ActionListener () { + public void actionPerformed (ActionEvent e) + { +- dispose(); ++ text.setVisible (false); ++ hide(); + } + }); + +Index: gnu/java/security/action/GetPropertyAction.java +=================================================================== +RCS file: gnu/java/security/action/GetPropertyAction.java +diff -N gnu/java/security/action/GetPropertyAction.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gnu/java/security/action/GetPropertyAction.java 6 Sep 2004 16:35:40 -0000 +@@ -0,0 +1,89 @@ ++/* GetPropertyAction.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.security.action; ++ ++import java.security.PrivilegedAction; ++ ++/** ++ * PrivilegedAction implementation that calls System.getProperty() with ++ * the property name passed to its constructor. ++ * ++ * Example of use: ++ * ++ * GetPropertyAction action = new GetPropertyAction("http.proxyPort"); ++ * String port = AccessController.doPrivileged(action); ++ * ++ */ ++public class GetPropertyAction implements PrivilegedAction ++{ ++ String name; ++ String value = null; ++ ++ public GetPropertyAction() ++ { ++ } ++ ++ public GetPropertyAction(String propName) ++ { ++ setParameters(propName); ++ } ++ ++ public GetPropertyAction(String propName, String defaultValue) ++ { ++ setParameters(propName, defaultValue); ++ } ++ ++ public Object run() ++ { ++ return System.getProperty(name, value); ++ } ++ ++ public GetPropertyAction setParameters(String propName) ++ { ++ this.name = propName; ++ this.value = null; ++ return this; ++ } ++ ++ public GetPropertyAction setParameters(String propName, String defaultValue) ++ { ++ this.name = propName; ++ this.value = defaultValue; ++ return this; ++ } ++} +Index: gnu/java/security/action/SetAccessibleAction.java +=================================================================== +RCS file: gnu/java/security/action/SetAccessibleAction.java +diff -N gnu/java/security/action/SetAccessibleAction.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gnu/java/security/action/SetAccessibleAction.java 6 Sep 2004 16:35:40 -0000 +@@ -0,0 +1,77 @@ ++/* SetAccessibleAction.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.security.action; ++ ++import java.lang.reflect.AccessibleObject; ++import java.security.PrivilegedAction; ++ ++/** ++ * PrivilegedAction implementation that calls setAccessible(true) on the ++ * AccessibleObject passed to its constructor. ++ * ++ * Example of use: ++ * ++ * Field dataField = cl.getDeclaredField("data"); ++ * AccessController.doPrivileged(new SetAccessibleAction(dataField)); ++ * ++ */ ++public class SetAccessibleAction implements PrivilegedAction ++{ ++ AccessibleObject member; ++ ++ public SetAccessibleAction() ++ { ++ } ++ ++ public SetAccessibleAction(AccessibleObject member) ++ { ++ this.member = member; ++ } ++ ++ public Object run() ++ { ++ member.setAccessible(true); ++ return null; ++ } ++ ++ public SetAccessibleAction setMember(AccessibleObject member) ++ { ++ this.member = member; ++ return this; ++ } ++} +Index: java/awt/AWTEvent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/AWTEvent.java,v +retrieving revision 1.9 +diff -u -r1.9 AWTEvent.java +--- java/awt/AWTEvent.java 9 Aug 2002 04:26:13 -0000 1.9 ++++ java/awt/AWTEvent.java 6 Sep 2004 16:35:41 -0000 +@@ -231,15 +231,23 @@ + } + + /** +- * Returns a string representation of this event. This is in the format +- * getClass().getName() + '[' + paramString() + "] on " +- * + source. ++ * Create a string that represents this event in the format ++ * classname[eventstring] on sourcecomponentname. + * +- * @return a string representation of this event ++ * @return a string representing this event + */ +- public String toString() ++ public String toString () + { +- return getClass().getName() + "[" + paramString() + "] on " + source; ++ String string = null; ++ ++ if (source instanceof Component) ++ string = getClass ().getName () + "[" + paramString () + "] on " ++ + ((Component) source).getName (); ++ else if (source instanceof MenuComponent) ++ string = getClass ().getName () + "[" + paramString () + "] on " ++ + ((MenuComponent) source).getName (); ++ ++ return string; + } + + /** +Index: java/awt/AWTKeyStroke.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/AWTKeyStroke.java,v +retrieving revision 1.1 +diff -u -r1.1 AWTKeyStroke.java +--- java/awt/AWTKeyStroke.java 9 Aug 2002 04:26:13 -0000 1.1 ++++ java/awt/AWTKeyStroke.java 6 Sep 2004 16:35:41 -0000 +@@ -409,13 +409,13 @@ + { + token = t.nextToken(); + if ("shift".equals(token)) +- modifiers |= KeyEvent.SHIFT_MASK | KeyEvent.SHIFT_DOWN_MASK; ++ modifiers |= KeyEvent.SHIFT_DOWN_MASK; + else if ("ctrl".equals(token) || "control".equals(token)) +- modifiers |= KeyEvent.CTRL_MASK | KeyEvent.CTRL_DOWN_MASK; ++ modifiers |= KeyEvent.CTRL_DOWN_MASK; + else if ("meta".equals(token)) +- modifiers |= KeyEvent.META_MASK | KeyEvent.META_DOWN_MASK; ++ modifiers |= KeyEvent.META_DOWN_MASK; + else if ("alt".equals(token)) +- modifiers |= KeyEvent.ALT_MASK | KeyEvent.ALT_DOWN_MASK; ++ modifiers |= KeyEvent.ALT_DOWN_MASK; + else if ("button1".equals(token)) + modifiers |= KeyEvent.BUTTON1_DOWN_MASK; + else if ("button2".equals(token)) +Index: java/awt/AWTPermission.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/AWTPermission.java,v +retrieving revision 1.4 +diff -u -r1.4 AWTPermission.java +--- java/awt/AWTPermission.java 9 Aug 2002 04:26:13 -0000 1.4 ++++ java/awt/AWTPermission.java 6 Sep 2004 16:35:41 -0000 +@@ -79,7 +79,7 @@ + * + * fullScreenExclusive + * enter full-screen exclusive mode +- * malicious code could masquerade as a trusted program ++ * malicious code could masquerade as a trusted program + * + * + * @author Tom Tromey +Index: java/awt/BorderLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/BorderLayout.java,v +retrieving revision 1.10 +diff -u -r1.10 BorderLayout.java +--- java/awt/BorderLayout.java 10 Nov 2002 23:11:21 -0000 1.10 ++++ java/awt/BorderLayout.java 6 Sep 2004 16:35:41 -0000 +@@ -349,7 +349,28 @@ + if (constraints != null && ! (constraints instanceof String)) + throw new IllegalArgumentException("Constraint must be a string"); + +- String str = (String)constraints; ++ addLayoutComponent((String) constraints, component); ++} ++ ++/*************************************************************************/ ++ ++/** ++ * Adds a component to the layout in the specified constraint position, ++ * which must be one of the string constants defined in this class. ++ * ++ * @param constraints The constraint string. ++ * @param component The component to add. ++ * ++ * @exception IllegalArgumentException If the constraint object is not ++ * one of the specified constants in this class. ++ * ++ * @deprecated This method is deprecated in favor of ++ * addLayoutComponent(Component, Object). ++ */ ++public void ++addLayoutComponent(String constraints, Component component) ++{ ++ String str = constraints; + + if (str == null || str.equals(CENTER)) + center = component; +@@ -376,27 +397,6 @@ + /*************************************************************************/ + + /** +- * Adds a component to the layout in the specified constraint position, +- * which must be one of the string constants defined in this class. +- * +- * @param constraints The constraint string. +- * @param component The component to add. +- * +- * @exception IllegalArgumentException If the constraint object is not +- * one of the specified constants in this class. +- * +- * @deprecated This method is deprecated in favor of +- * addLayoutComponent(Component, Object). +- */ +-public void +-addLayoutComponent(String constraints, Component component) +-{ +- addLayoutComponent(component, constraints); +-} +- +-/*************************************************************************/ +- +-/** + * Removes the specified component from the layout. + * + * @param component The component to remove from the layout. +@@ -592,12 +592,21 @@ + + int x1 = i.left; + int x2 = x1 + w.width + hgap; +- int x3 = t.width - i.right - e.width; ++ int x3; ++ if (t.width <= i.right + e.width) ++ x3 = x2 + w.width + hgap; ++ else ++ x3 = t.width - i.right - e.width; + int ww = t.width - i.right - i.left; + + int y1 = i.top; + int y2 = y1 + n.height + vgap; +- int y3 = t.height - i.bottom - s.height; ++ int midh = Math.max(e.height, Math.max(w.height, c.height)); ++ int y3; ++ if (t.height <= i.bottom + s.height) ++ y3 = y2 + midh + vgap; ++ else ++ y3 = t.height - i.bottom - s.height; + int hh = y3-y2-vgap; + + setBounds(center, x2, y2, x3-x2-hgap, hh); +@@ -637,7 +646,7 @@ + private Dimension + calcCompSize(Component comp, int what) + { +- if (comp == null) ++ if (comp == null || !comp.isVisible()) + return new Dimension(0, 0); + if (what == MIN) + return comp.getMinimumSize(); +Index: java/awt/Button.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Button.java,v +retrieving revision 1.11 +diff -u -r1.11 Button.java +--- java/awt/Button.java 5 Jun 2003 19:58:39 -0000 1.11 ++++ java/awt/Button.java 6 Sep 2004 16:35:41 -0000 +@@ -81,6 +81,11 @@ + // List of ActionListeners for this class. + private transient ActionListener action_listeners; + ++ /* ++ * The number used to generate the name returned by getName. ++ */ ++ private static transient long next_button_number = 0; ++ + /*************************************************************************/ + + /* +@@ -96,7 +101,7 @@ + public + Button() + { +- this(null); ++ this(""); + } + + /*************************************************************************/ +@@ -148,6 +153,7 @@ + setLabel(String label) + { + this.label = label; ++ actionCommand = label; + if (peer != null) + { + ButtonPeer bp = (ButtonPeer) peer; +@@ -304,9 +310,24 @@ + protected String + paramString() + { +- return ("label=" + getLabel() + ",actionCommand=" + getActionCommand() +- + "," + super.paramString()); ++ return getName () + "," + getX () + "," + getY () + "," ++ + getWidth () + "x" + getHeight () + ",label=" + getLabel (); + } + ++ /** ++ * Generate a unique name for this button. ++ * ++ * @return A unique name for this button. ++ */ ++ String generateName () ++ { ++ return "button" + getUniqueLong (); ++ } ++ ++ private static synchronized long getUniqueLong () ++ { ++ return next_button_number++; ++ } ++ + } // class Button + +Index: java/awt/CardLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/CardLayout.java,v +retrieving revision 1.8 +diff -u -r1.8 CardLayout.java +--- java/awt/CardLayout.java 15 Jan 2003 22:47:04 -0000 1.8 ++++ java/awt/CardLayout.java 6 Sep 2004 16:35:41 -0000 +@@ -90,7 +90,7 @@ + if (! (constraints instanceof String)) + throw new IllegalArgumentException ("Object " + constraints + + " is not a string"); +- tab.put (constraints, comp); ++ addLayoutComponent ((String) constraints, comp); + } + + /** Add a new component to the layout. The name can be used later +@@ -102,7 +102,12 @@ + */ + public void addLayoutComponent (String name, Component comp) + { +- addLayoutComponent (comp, name); ++ tab.put (name, comp); ++ // First component added is the default component. ++ if (tab.size() == 1) ++ comp.setVisible(true); ++ else ++ comp.setVisible(false); + } + + /** Cause the first component in the container to be displayed. +@@ -243,6 +248,8 @@ + if (tab.get (key) == comp) + { + tab.remove (key); ++ Container parent = comp.getParent(); ++ next(parent); + break; + } + } +@@ -311,6 +318,13 @@ + int num = parent.ncomponents; + // This is more efficient than calling getComponents(). + Component[] comps = parent.component; ++ ++ if (num == 1) ++ { ++ comps[0].setVisible(true); ++ return; ++ } ++ + int choice = -1; + + if (what == FIRST) +Index: java/awt/CheckboxGroup.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/CheckboxGroup.java,v +retrieving revision 1.4 +diff -u -r1.4 CheckboxGroup.java +--- java/awt/CheckboxGroup.java 22 Jan 2002 22:40:04 -0000 1.4 ++++ java/awt/CheckboxGroup.java 6 Sep 2004 16:35:41 -0000 +@@ -95,8 +95,8 @@ + public Checkbox + getSelectedCheckbox() + { +- return(selectedCheckbox); +-} ++ return getCurrent (); ++} + + /*************************************************************************/ + +@@ -126,17 +126,7 @@ + public void + setSelectedCheckbox(Checkbox selectedCheckbox) + { +- if (this.selectedCheckbox != null) +- { +- if (this.selectedCheckbox.getCheckboxGroup() != this) +- return; +- +- this.selectedCheckbox.setState(false); +- } +- +- this.selectedCheckbox = selectedCheckbox; +- if (selectedCheckbox != null) +- selectedCheckbox.setState(true); ++ setCurrent (selectedCheckbox); + } + + /*************************************************************************/ +@@ -153,7 +143,17 @@ + public void + setCurrent(Checkbox selectedCheckbox) + { +- setSelectedCheckbox(selectedCheckbox); ++ if (this.selectedCheckbox != null) ++ { ++ if (this.selectedCheckbox.getCheckboxGroup() != this) ++ return; ++ ++ this.selectedCheckbox.setState(false); ++ } ++ ++ this.selectedCheckbox = selectedCheckbox; ++ if (selectedCheckbox != null) ++ selectedCheckbox.setState(true); + } + + /*************************************************************************/ +Index: java/awt/Choice.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Choice.java,v +retrieving revision 1.13 +diff -u -r1.13 Choice.java +--- java/awt/Choice.java 5 Jan 2004 21:18:06 -0000 1.13 ++++ java/awt/Choice.java 6 Sep 2004 16:35:41 -0000 +@@ -111,7 +111,7 @@ + public int + getItemCount() + { +- return(pItems.size()); ++ return countItems (); + } + + /*************************************************************************/ +Index: java/awt/Color.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Color.java,v +retrieving revision 1.10 +diff -u -r1.10 Color.java +--- java/awt/Color.java 13 Aug 2003 03:19:24 -0000 1.10 ++++ java/awt/Color.java 6 Sep 2004 16:35:41 -0000 +@@ -319,7 +319,12 @@ + { + if ((red & 255) != red || (green & 255) != green || (blue & 255) != blue + || (alpha & 255) != alpha) +- throw new IllegalArgumentException("Bad RGB values"); ++ throw new IllegalArgumentException("Bad RGB values" ++ +" red=0x"+Integer.toHexString(red) ++ +" green=0x"+Integer.toHexString(green) ++ +" blue=0x"+Integer.toHexString(blue) ++ +" alpha=0x"+Integer.toHexString(alpha) ); ++ + value = (alpha << 24) | (red << 16) | (green << 8) | blue; + falpha = 1; + cs = null; +@@ -501,7 +506,7 @@ + + /** + * Returns the RGB value for this color, in the sRGB color space. The blue +- * value will be in bits 0-7, green in 8-15, red in 6-23, and alpha value in ++ * value will be in bits 0-7, green in 8-15, red in 16-23, and alpha value in + * 24-31. + * + * @return the RGB value for this color +@@ -767,9 +772,9 @@ + if (red == max) + array[0] = (green - blue) / delta; + else if (green == max) +- array[0] = 1 / 3 + (blue - red) / delta; ++ array[0] = 1f / 3 + (blue - red) / delta; + else +- array[0] = 2 / 3 + (red - green) / delta; ++ array[0] = 2f / 3 + (red - green) / delta; + if (array[0] < 0) + array[0]++; + } +@@ -950,7 +955,7 @@ + * object, regardless of the parameters. Subclasses, however, may have a + * mutable result. + * +- * @param cm the requested color model, ignored ++ * @param cm the requested color model + * @param deviceBounds the bounding box in device coordinates, ignored + * @param userBounds the bounding box in user coordinates, ignored + * @param xform the bounds transformation, ignored +@@ -962,8 +967,8 @@ + AffineTransform xform, + RenderingHints hints) + { +- if (context == null) +- context = new ColorPaintContext(value); ++ if (context == null || !context.getColorModel().equals(cm)) ++ context = new ColorPaintContext(cm,value); + return context; + } + +Index: java/awt/ColorPaintContext.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/ColorPaintContext.java,v +retrieving revision 1.1 +diff -u -r1.1 ColorPaintContext.java +--- java/awt/ColorPaintContext.java 9 Aug 2002 04:26:13 -0000 1.1 ++++ java/awt/ColorPaintContext.java 6 Sep 2004 16:35:41 -0000 +@@ -1,5 +1,5 @@ + /* ColorPaintContext.java -- context for painting solid colors +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -55,15 +55,31 @@ + * SystemColor. + */ + final int color; ++ final ColorModel colorModel; + ++ private ColorRaster cachedRaster; ++ ++ + /** + * Create the context for a given color. + * +- * @param c the solid color to use ++ * @param c The solid color to use. + */ +- ColorPaintContext(int c) ++ ColorPaintContext(int colorRGB) + { +- color = c; ++ this(ColorModel.getRGBdefault(), colorRGB); ++ } ++ ++ /** ++ * Create the context for a given color. ++ * ++ * @param cm The color model of this context. ++ * @param c The solid color to use. ++ */ ++ ColorPaintContext(ColorModel cm,int colorRGB) ++ { ++ color = colorRGB; ++ colorModel = cm; + } + + /** +@@ -75,14 +91,13 @@ + } + + /** +- * Return the color model of this context. This ignores the model passed +- * in the request, since colors are always in sRGB. ++ * Return the color model of this context. + * + * @return the context color model + */ + public ColorModel getColorModel() + { +- return ColorModel.getRGBdefault(); ++ return colorModel; + } + + /** +@@ -94,10 +109,87 @@ + * @param h the height, in device space + * @return a raster for the given area and color + */ +- public Raster getRaster(int x, int y, int w, int h) ++ public Raster getRaster(int x, int y, int width, int height) ++ { ++ if( cachedRaster == null ++ || cachedRaster.getWidth() < width ++ || cachedRaster.getHeight() < height) ++ { ++ cachedRaster = new ColorRaster(colorModel, 0, 0, width, height, color); ++ } ++ return cachedRaster.createChild(0 ,0 ,width ,height ,x ,y , null); ++ } ++ ++ /** ++ * A ColorRaster is a raster that is completely filled with one color. The ++ * data layout is taken from the color model given to the constructor. ++ */ ++ private class ColorRaster extends Raster + { +- // XXX Implement. Sun uses undocumented implementation class +- // sun.awt.image.IntegerInterleavedRaster. +- throw new Error("not implemented"); ++ ++ /** ++ * Create a raster that is compaltible with the given color model and ++ * filled with the given color. ++ * @param cm The color model for this raster. ++ * @param x The smallest horizontal corrdinate in the raster. ++ * @param y The smallest vertical coordinate in the raster. ++ * @param width The width of the raster. ++ * @param height The height of the raster. ++ * @param rgbPixel The RGB value of the color for this raster. ++ */ ++ ColorRaster(ColorModel cm,int x, int y, int width, int height, int rgbPixel) ++ { ++ super(cm.createCompatibleSampleModel(width,height),new Point(x,y)); ++ Object pixel = cm.getDataElements(rgbPixel,null); ++ getSampleModel().setDataElements(0, 0, ++ width, height, ++ multiplyData(pixel,null,width*height), ++ dataBuffer); ++ } ++ ++ ++ ++ private Object multiplyData(Object src, Object dest, int factor) ++ { ++ Object from; ++ int srcLength = 0; ++ if (src instanceof byte[]) ++ { ++ srcLength = ((byte[])src).length; ++ ++ if (dest == null) dest = new byte[factor * srcLength]; ++ } ++ else if (src instanceof short[]) ++ { ++ srcLength = ((short[])src).length; ++ if (dest == null) dest = new short[factor * srcLength]; ++ } ++ else if (src instanceof int[]) ++ { ++ srcLength = ((int[]) src).length; ++ if (dest == null) dest = new int[factor * srcLength]; ++ } ++ else ++ { ++ throw new ClassCastException("Unknown data buffer type"); ++ } ++ ++ System.arraycopy(src,0,dest,0,srcLength); ++ ++ int count = 1; ++ while(count*2 < factor) ++ { ++ System.arraycopy(dest, 0, dest, count * srcLength, count*srcLength); ++ count *= 2; ++ } ++ ++ if(factor > count) ++ System.arraycopy(dest,0, dest, count * srcLength, ++ (factor - count) * srcLength ); ++ ++ return dest; ++ } ++ + } ++ + } // class ColorPaintContext +Index: java/awt/Component.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Component.java,v +retrieving revision 1.31 +diff -u -r1.31 Component.java +--- java/awt/Component.java 12 Nov 2003 22:03:49 -0000 1.31 ++++ java/awt/Component.java 6 Sep 2004 16:35:43 -0000 +@@ -39,6 +39,7 @@ + package java.awt; + + import java.awt.dnd.DropTarget; ++import java.awt.event.ActionEvent; + import java.awt.event.ComponentEvent; + import java.awt.event.ComponentListener; + import java.awt.event.FocusEvent; +@@ -48,6 +49,7 @@ + import java.awt.event.HierarchyListener; + import java.awt.event.KeyEvent; + import java.awt.event.KeyListener; ++import java.awt.event.InputEvent; + import java.awt.event.InputMethodEvent; + import java.awt.event.InputMethodListener; + import java.awt.event.MouseEvent; +@@ -56,6 +58,7 @@ + import java.awt.event.MouseWheelListener; + import java.awt.event.MouseWheelEvent; + import java.awt.event.PaintEvent; ++import java.awt.event.WindowEvent; + import java.awt.im.InputContext; + import java.awt.im.InputMethodRequests; + import java.awt.image.BufferStrategy; +@@ -105,7 +108,7 @@ + * in inner classes, rather than using this object itself as the listener, if + * external objects do not need to save the state of this object. + * +- *

++ * 
+  * import java.awt.*;
+  * import java.awt.event.*;
+  * import java.io.Serializable;
+@@ -127,6 +130,7 @@
+  *     aButton.addActionListener(new MyActionListener());
+  *   }
+  * }
++ * 
+ * + *

Status: Incomplete. The event dispatch mechanism is implemented. All + * other methods defined in the J2SE 1.3 API javadoc exist, but are mostly +@@ -382,18 +386,18 @@ + boolean focusable = true; + + /** +- * Tracks whether this component uses default focus traversal, or has a +- * different policy. ++ * Tracks whether this component's {@link #isFocusTraversable} ++ * method has been overridden. + * +- * @see #isFocusTraversableOverridden() + * @since 1.4 + */ + int isFocusTraversableOverridden; + + /** +- * The focus traversal keys, if not inherited from the parent or default +- * keyboard manager. These sets will contain only AWTKeyStrokes that +- * represent press and release events to use as focus control. ++ * The focus traversal keys, if not inherited from the parent or ++ * default keyboard focus manager. These sets will contain only ++ * AWTKeyStrokes that represent press and release events to use as ++ * focus control. + * + * @see #getFocusTraversalKeys(int) + * @see #setFocusTraversalKeys(int, Set) +@@ -556,6 +560,12 @@ + transient BufferStrategy bufferStrategy; + + /** ++ * true if requestFocus was called on this component when its ++ * top-level ancestor was not focusable. ++ */ ++ private transient FocusEvent pendingFocusRequest = null; ++ ++ /** + * The system properties that affect image updating. + */ + private static transient boolean incrementalDraw; +@@ -565,6 +575,8 @@ + { + incrementalDraw = Boolean.getBoolean ("awt.image.incrementalDraw"); + redrawRate = Long.getLong ("awt.image.redrawrate"); ++ // Set the default KeyboardFocusManager. ++ KeyboardFocusManager.setCurrentKeyboardFocusManager (null); + } + + // Public and protected API. +@@ -779,9 +791,7 @@ + */ + public void setEnabled(boolean b) + { +- this.enabled = b; +- if (peer != null) +- peer.setEnabled(b); ++ enable (b); + } + + /** +@@ -791,7 +801,9 @@ + */ + public void enable() + { +- setEnabled(true); ++ this.enabled = true; ++ if (peer != null) ++ peer.setEnabled (true); + } + + /** +@@ -802,7 +814,10 @@ + */ + public void enable(boolean b) + { +- setEnabled(b); ++ if (b) ++ enable (); ++ else ++ disable (); + } + + /** +@@ -812,7 +827,9 @@ + */ + public void disable() + { +- setEnabled(false); ++ this.enabled = false; ++ if (peer != null) ++ peer.setEnabled (false); + } + + /** +@@ -856,10 +873,7 @@ + // Inspection by subclassing shows that Sun's implementation calls + // show(boolean) which then calls show() or hide(). It is the show() + // method that is overriden in subclasses like Window. +- if (b) +- show(); +- else +- hide(); ++ show (b); + } + + /** +@@ -869,9 +883,21 @@ + */ + public void show() + { +- if (peer != null) +- peer.setVisible(true); +- this.visible = true; ++ // We must set visible before showing the peer. Otherwise the ++ // peer could post paint events before visible is true, in which ++ // case lightweight components are not initially painted -- ++ // Container.paint first calls isShowing () before painting itself ++ // and its children. ++ if(!isVisible()) ++ { ++ this.visible = true; ++ if (peer != null) ++ peer.setVisible(true); ++ invalidate(); ++ ComponentEvent ce = ++ new ComponentEvent(this,ComponentEvent.COMPONENT_SHOWN); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } + } + + /** +@@ -882,7 +908,10 @@ + */ + public void show(boolean b) + { +- setVisible(b); ++ if (b) ++ show (); ++ else ++ hide (); + } + + /** +@@ -892,9 +921,16 @@ + */ + public void hide() + { +- if (peer != null) +- peer.setVisible(false); +- this.visible = false; ++ if (isVisible()) ++ { ++ if (peer != null) ++ peer.setVisible(false); ++ this.visible = false; ++ invalidate(); ++ ComponentEvent ce = ++ new ComponentEvent(this,ComponentEvent.COMPONENT_HIDDEN); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } + } + + /** +@@ -908,7 +944,7 @@ + { + if (foreground != null) + return foreground; +- return parent == null ? null : parent.getForeground(); ++ return parent == null ? SystemColor.windowText : parent.getForeground(); + } + + /** +@@ -949,7 +985,7 @@ + { + if (background != null) + return background; +- return parent == null ? null : parent.getBackground(); ++ return parent == null ? SystemColor.window : parent.getBackground(); + } + + /** +@@ -962,8 +998,11 @@ + */ + public void setBackground(Color c) + { ++ // If c is null, inherit from closest ancestor whose bg is set. ++ if (c == null && parent != null) ++ c = parent.getBackground(); + firePropertyChange("background", background, c); +- if (peer != null) ++ if (peer != null && c != null) + peer.setBackground(c); + background = c; + } +@@ -991,7 +1030,11 @@ + { + if (font != null) + return font; +- return parent == null ? null : parent.getFont(); ++ ++ if (parent != null) ++ return parent.getFont (); ++ else ++ return new Font ("Dialog", Font.PLAIN, 12); + } + + /** +@@ -1006,6 +1049,7 @@ + firePropertyChange("font", font, f); + if (peer != null) + peer.setFont(f); ++ invalidate(); + font = f; + } + +@@ -1078,7 +1122,7 @@ + */ + public Point getLocation() + { +- return new Point(x, y); ++ return location (); + } + + /** +@@ -1105,7 +1149,7 @@ + */ + public Point location() + { +- return getLocation(); ++ return new Point (x, y); + } + + /** +@@ -1120,13 +1164,7 @@ + */ + public void setLocation(int x, int y) + { +- if (this.x == x && this.y == y) +- return; +- invalidate(); +- this.x = x; +- this.y = y; +- if (peer != null) +- peer.setBounds(x, y, width, height); ++ move (x, y); + } + + /** +@@ -1140,7 +1178,7 @@ + */ + public void move(int x, int y) + { +- setLocation(x, y); ++ setBounds(x, y, this.width, this.height); + } + + /** +@@ -1168,7 +1206,7 @@ + */ + public Dimension getSize() + { +- return new Dimension(width, height); ++ return size (); + } + + /** +@@ -1179,7 +1217,7 @@ + */ + public Dimension size() + { +- return getSize(); ++ return new Dimension (width, height); + } + + /** +@@ -1192,13 +1230,7 @@ + */ + public void setSize(int width, int height) + { +- if (this.width == width && this.height == height) +- return; +- invalidate(); +- this.width = width; +- this.height = height; +- if (peer != null) +- peer.setBounds(x, y, width, height); ++ resize (width, height); + } + + /** +@@ -1210,7 +1242,7 @@ + */ + public void resize(int width, int height) + { +- setSize(width, height); ++ setBounds(this.x, this.y, width, height); + } + + /** +@@ -1224,7 +1256,7 @@ + */ + public void setSize(Dimension d) + { +- setSize(d.width, d.height); ++ resize (d); + } + + /** +@@ -1236,7 +1268,7 @@ + */ + public void resize(Dimension d) + { +- setSize(d.width, d.height); ++ resize (d.width, d.height); + } + + /** +@@ -1251,7 +1283,7 @@ + */ + public Rectangle getBounds() + { +- return new Rectangle(x, y, width, height); ++ return bounds (); + } + + /** +@@ -1264,7 +1296,7 @@ + */ + public Rectangle bounds() + { +- return getBounds(); ++ return new Rectangle (x, y, width, height); + } + + /** +@@ -1284,15 +1316,7 @@ + */ + public void setBounds(int x, int y, int w, int h) + { +- if (this.x == x && this.y == y && width == w && height == h) +- return; +- invalidate(); +- this.x = x; +- this.y = y; +- width = w; +- height = h; +- if (peer != null) +- peer.setBounds(x, y, w, h); ++ reshape (x, y, w, h); + } + + /** +@@ -1301,13 +1325,65 @@ + * + * @param x the X coordinate of the upper left corner of the rectangle + * @param y the Y coordinate of the upper left corner of the rectangle +- * @param w the width of the rectangle +- * @param h the height of the rectangle ++ * @param width the width of the rectangle ++ * @param height the height of the rectangle + * @deprecated use {@link #setBounds(int, int, int, int)} instead + */ + public void reshape(int x, int y, int width, int height) + { +- setBounds(x, y, width, height); ++ int oldx = this.x; ++ int oldy = this.y; ++ int oldwidth = this.width; ++ int oldheight = this.height; ++ ++ if (this.x == x && this.y == y ++ && this.width == width && this.height == height) ++ return; ++ invalidate (); ++ this.x = x; ++ this.y = y; ++ this.width = width; ++ this.height = height; ++ if (peer != null) ++ peer.setBounds (x, y, width, height); ++ ++ // Erase old bounds and repaint new bounds for lightweights. ++ if (isLightweight()) ++ { ++ boolean shouldRepaintParent = false; ++ boolean shouldRepaintSelf = false; ++ ++ if (parent != null) ++ { ++ Rectangle parentBounds = parent.getBounds(); ++ Rectangle oldBounds = new Rectangle(parent.getX() + oldx, ++ parent.getY() + oldy, ++ oldwidth, oldheight); ++ Rectangle newBounds = new Rectangle(parent.getX() + x, ++ parent.getY() + y, ++ width, height); ++ shouldRepaintParent = parentBounds.intersects(oldBounds); ++ shouldRepaintSelf = parentBounds.intersects(newBounds); ++ } ++ ++ if (shouldRepaintParent) ++ parent.repaint(oldx, oldy, oldwidth, oldheight); ++ if (shouldRepaintSelf) ++ repaint(); ++ } ++ ++ if (oldx != x || oldy != y) ++ { ++ ComponentEvent ce = new ComponentEvent(this, ++ ComponentEvent.COMPONENT_MOVED); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } ++ if (oldwidth != width || oldheight != height) ++ { ++ ComponentEvent ce = new ComponentEvent(this, ++ ComponentEvent.COMPONENT_RESIZED); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } + } + + /** +@@ -1324,7 +1400,7 @@ + */ + public void setBounds(Rectangle r) + { +- setBounds(r.x, r.y, r.width, r.height); ++ setBounds (r.x, r.y, r.width, r.height); + } + + /** +@@ -1555,7 +1631,7 @@ + */ + public void doLayout() + { +- // nothing to do unless we're a container ++ layout (); + } + + /** +@@ -1566,7 +1642,7 @@ + */ + public void layout() + { +- doLayout(); ++ // Nothing to do unless we're a container. + } + + /** +@@ -1697,6 +1773,9 @@ + */ + public void paint(Graphics g) + { ++ // Paint the heavyweight peer ++ if (!isLightweight() && peer != null) ++ peer.paint(g); + } + + /** +@@ -1714,6 +1793,15 @@ + */ + public void update(Graphics g) + { ++ if (!isLightweight()) ++ { ++ Rectangle clip = g.getClipBounds(); ++ if (clip == null) ++ g.clearRect(0, 0, width, height); ++ else ++ g.clearRect(clip.x, clip.y, clip.width, clip.height); ++ } ++ + paint(g); + } + +@@ -1727,8 +1815,6 @@ + { + if (! visible) + return; +- if (peer != null) +- peer.paint(g); + paint(g); + } + +@@ -2061,7 +2147,7 @@ + */ + public boolean contains(int x, int y) + { +- return x >= 0 && y >= 0 && x < width && y < height; ++ return inside (x, y); + } + + /** +@@ -2075,7 +2161,7 @@ + */ + public boolean inside(int x, int y) + { +- return contains(x, y); ++ return x >= 0 && y >= 0 && x < width && y < height; + } + + /** +@@ -2090,7 +2176,7 @@ + */ + public boolean contains(Point p) + { +- return contains(p.x, p.y); ++ return contains (p.x, p.y); + } + + /** +@@ -2105,7 +2191,7 @@ + */ + public Component getComponentAt(int x, int y) + { +- return contains(x, y) ? this : null; ++ return locate (x, y); + } + + /** +@@ -2120,7 +2206,7 @@ + */ + public Component locate(int x, int y) + { +- return getComponentAt(x, y); ++ return contains (x, y) ? this : null; + } + + /** +@@ -2136,18 +2222,21 @@ + */ + public Component getComponentAt(Point p) + { +- return getComponentAt(p.x, p.y); ++ return getComponentAt (p.x, p.y); + } + + /** +- * AWT 1.0 event dispatcher. ++ * AWT 1.0 event delivery. + * +- * @param e the event to dispatch ++ * Deliver an AWT 1.0 event to this Component. This method simply ++ * calls {@link #postEvent}. ++ * ++ * @param e the event to deliver + * @deprecated use {@link #dispatchEvent(AWTEvent)} instead + */ + public void deliverEvent(Event e) + { +- // XXX Add backward compatibility handling. ++ postEvent (e); + } + + /** +@@ -2169,16 +2258,24 @@ + } + + /** +- * AWT 1.0 event dispatcher. ++ * AWT 1.0 event handler. + * +- * @param e the event to dispatch +- * @return false: since the method was deprecated, the return has no meaning ++ * This method simply calls handleEvent and returns the result. ++ * ++ * @param e the event to handle ++ * @return true if the event was handled, false otherwise + * @deprecated use {@link #dispatchEvent(AWTEvent)} instead + */ + public boolean postEvent(Event e) + { +- // XXX Add backward compatibility handling. +- return false; ++ boolean handled = handleEvent (e); ++ ++ if (!handled) ++ // FIXME: need to translate event coordinates to parent's ++ // coordinate space. ++ handled = getParent ().postEvent (e); ++ ++ return handled; + } + + /** +@@ -2782,8 +2879,6 @@ + + if (e instanceof FocusEvent) + processFocusEvent((FocusEvent) e); +- else if (e instanceof PaintEvent) +- processPaintEvent((PaintEvent) e); + else if (e instanceof MouseWheelEvent) + processMouseWheelEvent((MouseWheelEvent) e); + else if (e instanceof MouseEvent) +@@ -2858,6 +2953,7 @@ + { + if (focusListener == null) + return; ++ + switch (e.id) + { + case FocusEvent.FOCUS_GAINED: +@@ -2933,6 +3029,7 @@ + mouseListener.mouseReleased(e); + break; + } ++ e.consume(); + } + + /** +@@ -2960,6 +3057,7 @@ + mouseMotionListener.mouseMoved(e); + break; + } ++ e.consume(); + } + + /** +@@ -2978,7 +3076,10 @@ + { + if (mouseWheelListener != null + && e.id == MouseEvent.MOUSE_WHEEL) ++ { + mouseWheelListener.mouseWheelMoved(e); ++ e.consume(); ++ } + } + + /** +@@ -3056,148 +3157,199 @@ + } + + /** +- * AWT 1.0 event processor. ++ * AWT 1.0 event handler. ++ * ++ * This method calls one of the event-specific handler methods. For ++ * example for key events, either {@link #keyDown (Event evt, int ++ * key)} or {@link keyUp (Event evt, int key)} is called. A derived ++ * component can override one of these event-specific methods if it ++ * only needs to handle certain event types. Otherwise it can ++ * override handleEvent itself and handle any event. + * + * @param evt the event to handle +- * @return false: since the method was deprecated, the return has no meaning ++ * @return true if the event was handled, false otherwise + * @deprecated use {@link #processEvent(AWTEvent)} instead + */ + public boolean handleEvent(Event evt) + { +- // XXX Add backward compatibility handling. ++ switch (evt.id) ++ { ++ // Handle key events. ++ case Event.KEY_ACTION: ++ case Event.KEY_PRESS: ++ return keyDown (evt, evt.key); ++ case Event.KEY_ACTION_RELEASE: ++ case Event.KEY_RELEASE: ++ return keyUp (evt, evt.key); ++ ++ // Handle mouse events. ++ case Event.MOUSE_DOWN: ++ return mouseDown (evt, evt.x, evt.y); ++ case Event.MOUSE_UP: ++ return mouseUp (evt, evt.x, evt.y); ++ case Event.MOUSE_MOVE: ++ return mouseMove (evt, evt.x, evt.y); ++ case Event.MOUSE_DRAG: ++ return mouseDrag (evt, evt.x, evt.y); ++ case Event.MOUSE_ENTER: ++ return mouseEnter (evt, evt.x, evt.y); ++ case Event.MOUSE_EXIT: ++ return mouseExit (evt, evt.x, evt.y); ++ ++ // Handle focus events. ++ case Event.GOT_FOCUS: ++ return gotFocus (evt, evt.arg); ++ case Event.LOST_FOCUS: ++ return lostFocus (evt, evt.arg); ++ ++ // Handle action event. ++ case Event.ACTION_EVENT: ++ return action (evt, evt.arg); ++ } ++ // Unknown event. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_DOWN event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_DOWN handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseEvent(MouseEvent)} instead + */ + public boolean mouseDown(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_DRAG event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_DRAG handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseMotionEvent(MouseEvent)} instead + */ + public boolean mouseDrag(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_UP event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_UP handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseEvent(MouseEvent)} instead + */ + public boolean mouseUp(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_MOVE event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_MOVE handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseMotionEvent(MouseEvent)} instead + */ + public boolean mouseMove(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_ENTER event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_ENTER handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseEvent(MouseEvent)} instead + */ + public boolean mouseEnter(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 mouse event. ++ * AWT 1.0 MOUSE_EXIT event handler. This method is meant to be ++ * overridden by components providing their own MOUSE_EXIT handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param x the x coordinate, ignored + * @param y the y coordinate, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processMouseEvent(MouseEvent)} instead + */ + public boolean mouseExit(Event evt, int x, int y) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 key press event. ++ * AWT 1.0 KEY_PRESS and KEY_ACTION event handler. This method is ++ * meant to be overridden by components providing their own key ++ * press handler. The default implementation simply returns false. + * + * @param evt the event to handle + * @param key the key pressed, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processKeyEvent(KeyEvent)} instead + */ + public boolean keyDown(Event evt, int key) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 key press event. ++ * AWT 1.0 KEY_RELEASE and KEY_ACTION_RELEASE event handler. This ++ * method is meant to be overridden by components providing their ++ * own key release handler. The default implementation simply ++ * returns false. + * + * @param evt the event to handle + * @param key the key pressed, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processKeyEvent(KeyEvent)} instead + */ + public boolean keyUp(Event evt, int key) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 action event processor. ++ * AWT 1.0 ACTION_EVENT event handler. This method is meant to be ++ * overridden by components providing their own action event ++ * handler. The default implementation simply returns false. + * + * @param evt the event to handle + * @param what the object acted on, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated in classes which support actions, use + * processActionEvent(ActionEvent) instead + */ + public boolean action(Event evt, Object what) + { +- // XXX Add backward compatibility handling. + return false; + } + +@@ -3241,30 +3393,32 @@ + } + + /** +- * AWT 1.0 focus event. ++ * AWT 1.0 GOT_FOCUS event handler. This method is meant to be ++ * overridden by components providing their own GOT_FOCUS handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param what the Object focused, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processFocusEvent(FocusEvent)} instead + */ + public boolean gotFocus(Event evt, Object what) + { +- // XXX Add backward compatibility handling. + return false; + } + + /** +- * AWT 1.0 focus event. ++ * AWT 1.0 LOST_FOCUS event handler. This method is meant to be ++ * overridden by components providing their own LOST_FOCUS handler. ++ * The default implementation simply returns false. + * + * @param evt the event to handle + * @param what the Object focused, ignored +- * @return false: since the method was deprecated, the return has no meaning ++ * @return false + * @deprecated use {@link #processFocusEvent(FocusEvent)} instead + */ + public boolean lostFocus(Event evt, Object what) + { +- // XXX Add backward compatibility handling. + return false; + } + +@@ -3279,7 +3433,7 @@ + */ + public boolean isFocusTraversable() + { +- return enabled && visible && (peer == null || peer.isFocusTraversable()); ++ return enabled && visible && (peer == null || isLightweight() || peer.isFocusTraversable()); + } + + /** +@@ -3294,7 +3448,11 @@ + } + + /** +- * Specify whether this component can receive focus. ++ * Specify whether this component can receive focus. This method also ++ * sets the {@link #isFocusTraversableOverridden} field to 1, which ++ * appears to be the undocumented way {@link ++ * DefaultFocusTraversalPolicy#accept()} determines whether to respect ++ * the {@link #isFocusable()} method of the component. + * + * @param focusable the new focusable status + * @since 1.4 +@@ -3303,16 +3461,22 @@ + { + firePropertyChange("focusable", this.focusable, focusable); + this.focusable = focusable; ++ this.isFocusTraversableOverridden = 1; + } + + /** +- * Sets the focus traversal keys for a given type of focus events. Normally, +- * the default values should match the operating system's native choices. To +- * disable a given traversal, use Collections.EMPTY_SET. The +- * event dispatcher will consume PRESSED, RELEASED, and TYPED events for the +- * specified key, although focus can only transfer on PRESSED or RELEASED. ++ * Sets the focus traversal keys for one of the three focus ++ * traversal directions supported by Components: {@link ++ * #KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS}, {@link ++ * #KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS}, or {@link ++ * #KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS}. Normally, the ++ * default values should match the operating system's native ++ * choices. To disable a given traversal, use ++ * Collections.EMPTY_SET. The event dispatcher will ++ * consume PRESSED, RELEASED, and TYPED events for the specified ++ * key, although focus can only transfer on PRESSED or RELEASED. + * +- *

The defauts are: ++ *

The defaults are: + * + * + * +@@ -3325,10 +3489,13 @@ + * + *
IdentifierMeaningDefault
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYSGo up a traversal cycleNone
+ * +- *

Specifying null allows inheritance from the parent, or from the current +- * KeyboardFocusManager default set. If not null, the set must contain only +- * AWTKeyStrokes that are not already focus keys and are not KEY_TYPED +- * events. ++ * If keystrokes is null, this component's focus traversal key set ++ * is inherited from one of its ancestors. If none of its ancestors ++ * has its own set of focus traversal keys, the focus traversal keys ++ * are set to the defaults retrieved from the current ++ * KeyboardFocusManager. If not null, the set must contain only ++ * AWTKeyStrokes that are not already focus keys and are not ++ * KEY_TYPED events. + * + * @param id one of FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, or + * UP_CYCLE_TRAVERSAL_KEYS +@@ -3343,7 +3510,24 @@ + public void setFocusTraversalKeys(int id, Set keystrokes) + { + if (keystrokes == null) +- throw new IllegalArgumentException(); ++ { ++ Container parent = getParent (); ++ ++ while (parent != null) ++ { ++ if (parent.areFocusTraversalKeysSet (id)) ++ { ++ keystrokes = parent.getFocusTraversalKeys (id); ++ break; ++ } ++ parent = parent.getParent (); ++ } ++ ++ if (keystrokes == null) ++ keystrokes = KeyboardFocusManager.getCurrentKeyboardFocusManager (). ++ getDefaultFocusTraversalKeys (id); ++ } ++ + Set sa; + Set sb; + String name; +@@ -3371,50 +3555,60 @@ + name = "upCycleFocusTraversalKeys"; + break; + default: +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); + } +- int i = keystrokes.size(); +- Iterator iter = keystrokes.iterator(); ++ ++ int i = keystrokes.size (); ++ Iterator iter = keystrokes.iterator (); ++ + while (--i >= 0) + { +- Object o = iter.next(); +- if (! (o instanceof AWTKeyStroke) +- || sa.contains(o) || sb.contains(o) ++ Object o = iter.next (); ++ if (!(o instanceof AWTKeyStroke) ++ || sa.contains (o) || sb.contains (o) + || ((AWTKeyStroke) o).keyCode == KeyEvent.VK_UNDEFINED) +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); + } ++ + if (focusTraversalKeys == null) + focusTraversalKeys = new Set[3]; +- keystrokes = Collections.unmodifiableSet(new HashSet(keystrokes)); +- firePropertyChange(name, focusTraversalKeys[id], keystrokes); ++ ++ keystrokes = Collections.unmodifiableSet (new HashSet (keystrokes)); ++ firePropertyChange (name, focusTraversalKeys[id], keystrokes); ++ + focusTraversalKeys[id] = keystrokes; + } + + /** +- * Returns the set of keys for a given focus traversal action, as defined +- * in setFocusTraversalKeys. If not set, this is inherited from +- * the parent component, which may have gotten it from the +- * KeyboardFocusManager. ++ * Returns the set of keys for a given focus traversal action, as ++ * defined in setFocusTraversalKeys. If not set, this ++ * is inherited from the parent component, which may have gotten it ++ * from the KeyboardFocusManager. + * +- * @param id one of FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, or +- * UP_CYCLE_TRAVERSAL_KEYS ++ * @param id one of FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, ++ * or UP_CYCLE_TRAVERSAL_KEYS + * @throws IllegalArgumentException if id is invalid +- * @see #setFocusTraversalKeys(int, Set) ++ * @see #setFocusTraversalKeys (int, Set) + * @see KeyboardFocusManager#FORWARD_TRAVERSAL_KEYS + * @see KeyboardFocusManager#BACKWARD_TRAVERSAL_KEYS + * @see KeyboardFocusManager#UP_CYCLE_TRAVERSAL_KEYS + * @since 1.4 + */ +- public Set getFocusTraversalKeys(int id) ++ public Set getFocusTraversalKeys (int id) + { +- if (id < KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS +- || id > KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS) ++ if (id != KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS) + throw new IllegalArgumentException(); ++ + Set s = null; ++ + if (focusTraversalKeys != null) + s = focusTraversalKeys[id]; ++ + if (s == null && parent != null) +- s = parent.getFocusTraversalKeys(id); ++ s = parent.getFocusTraversalKeys (id); ++ + return s == null ? (KeyboardFocusManager.getCurrentKeyboardFocusManager() + .getDefaultFocusTraversalKeys(id)) : s; + } +@@ -3423,269 +3617,460 @@ + * Tests whether the focus traversal keys for a given action are explicitly + * set or inherited. + * +- * @param id one of FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, or +- * UP_CYCLE_TRAVERSAL_KEYS ++ * @param id one of FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, ++ * or UP_CYCLE_TRAVERSAL_KEYS + * @return true if that set is explicitly specified + * @throws IllegalArgumentException if id is invalid +- * @see #getFocusTraversalKeys(int) ++ * @see #getFocusTraversalKeys (int) + * @see KeyboardFocusManager#FORWARD_TRAVERSAL_KEYS + * @see KeyboardFocusManager#BACKWARD_TRAVERSAL_KEYS + * @see KeyboardFocusManager#UP_CYCLE_TRAVERSAL_KEYS + * @since 1.4 + */ +- public boolean areFocusTraversalKeysSet(int id) ++ public boolean areFocusTraversalKeysSet (int id) + { +- if (id < KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS +- || id > KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS) +- throw new IllegalArgumentException(); ++ if (id != KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS) ++ throw new IllegalArgumentException (); ++ + return focusTraversalKeys != null && focusTraversalKeys[id] != null; + } + + /** +- * Sets whether focus traversal keys are enabled, which consumes traversal +- * keys and performs the focus event automatically. ++ * Enable or disable focus traversal keys on this Component. If ++ * they are, then the keyboard focus manager consumes and acts on ++ * key press and release events that trigger focus traversal, and ++ * discards the corresponding key typed events. If focus traversal ++ * keys are disabled, then all key events that would otherwise ++ * trigger focus traversal are sent to this Component. + * + * @param focusTraversalKeysEnabled the new value of the flag +- * @see #getFocusTraversalKeysEnabled() +- * @see #setFocusTraversalKeys(int, Set) +- * @see #getFocusTraversalKeys(int) ++ * @see #getFocusTraversalKeysEnabled () ++ * @see #setFocusTraversalKeys (int, Set) ++ * @see #getFocusTraversalKeys (int) + * @since 1.4 + */ +- public void setFocusTraversalKeysEnabled(boolean focusTraversalKeysEnabled) ++ public void setFocusTraversalKeysEnabled (boolean focusTraversalKeysEnabled) + { +- firePropertyChange("focusTraversalKeysEnabled", +- this.focusTraversalKeysEnabled, +- focusTraversalKeysEnabled); ++ firePropertyChange ("focusTraversalKeysEnabled", ++ this.focusTraversalKeysEnabled, ++ focusTraversalKeysEnabled); + this.focusTraversalKeysEnabled = focusTraversalKeysEnabled; + } + + /** +- * Tests whether focus traversal keys are enabled. If they are, then focus +- * traversal keys are consumed and focus events performed automatically, +- * without the component seeing the keystrokes. +- * +- * @return true if focus traversal is enabled +- * @see #setFocusTraversalKeysEnabled(boolean) +- * @see #setFocusTraversalKeys(int, Set) +- * @see #getFocusTraversalKeys(int) ++ * Check whether or not focus traversal keys are enabled on this ++ * Component. If they are, then the keyboard focus manager consumes ++ * and acts on key press and release events that trigger focus ++ * traversal, and discards the corresponding key typed events. If ++ * focus traversal keys are disabled, then all key events that would ++ * otherwise trigger focus traversal are sent to this Component. ++ * ++ * @return true if focus traversal keys are enabled ++ * @see #setFocusTraversalKeysEnabled (boolean) ++ * @see #setFocusTraversalKeys (int, Set) ++ * @see #getFocusTraversalKeys (int) + * @since 1.4 + */ +- public boolean getFocusTraversalKeysEnabled() ++ public boolean getFocusTraversalKeysEnabled () + { + return focusTraversalKeysEnabled; + } + + /** +- * Requests that this component be given focus. A FOCUS_GAINED +- * event will be fired if and only if this request is successful. To be +- * successful, the component must be displayable, visible, and focusable, +- * and the top-level Window must be able to receive focus. Thus, this +- * request may fail, or be delayed until the window receives focus. It is +- * recommended that requestFocusInWindow be used where +- * possible to be more platform-independent. ++ * Request that this Component be given the keyboard input focus and ++ * that its top-level ancestor become the focused Window. ++ * ++ * For the request to be granted, the Component must be focusable, ++ * displayable and showing and the top-level Window to which it ++ * belongs must be focusable. If the request is initially denied on ++ * the basis that the top-level Window is not focusable, the request ++ * will be remembered and granted when the Window does become ++ * focused. ++ * ++ * Never assume that this Component is the focus owner until it ++ * receives a FOCUS_GAINED event. ++ * ++ * The behaviour of this method is platform-dependent. ++ * {@link #requestFocusInWindow} should be used instead. + * +- * @see #requestFocusInWindow() ++ * @see #requestFocusInWindow () + * @see FocusEvent +- * @see #addFocusListener(FocusListener) +- * @see #isFocusable() +- * @see #isDisplayable() +- * @see KeyboardFocusManager#clearGlobalFocusOwner() +- */ +- public void requestFocus() +- { +- // If there's no peer then this component can't get the focus. We +- // treat it as a silent rejection of the request. +- if (peer != null) +- peer.requestFocus(); ++ * @see #addFocusListener (FocusListener) ++ * @see #isFocusable () ++ * @see #isDisplayable () ++ * @see KeyboardFocusManager#clearGlobalFocusOwner () ++ */ ++ public void requestFocus () ++ { ++ if (isDisplayable () ++ && isShowing () ++ && isFocusable ()) ++ { ++ synchronized (getTreeLock ()) ++ { ++ // Find this Component's top-level ancestor. ++ Container parent = getParent (); ++ ++ while (parent != null ++ && !(parent instanceof Window)) ++ parent = parent.getParent (); ++ ++ Window toplevel = (Window) parent; ++ if (toplevel.isFocusableWindow ()) ++ { ++ if (peer != null && !isLightweight()) ++ // This call will cause a FOCUS_GAINED event to be ++ // posted to the system event queue if the native ++ // windowing system grants the focus request. ++ peer.requestFocus (); ++ else ++ { ++ // Either our peer hasn't been created yet or we're a ++ // lightweight component. In either case we want to ++ // post a FOCUS_GAINED event. ++ EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ synchronized (eq) ++ { ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ Component currentFocusOwner = manager.getGlobalPermanentFocusOwner (); ++ if (currentFocusOwner != null) ++ { ++ eq.postEvent (new FocusEvent(currentFocusOwner, FocusEvent.FOCUS_LOST, ++ false, this)); ++ eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, false, ++ currentFocusOwner)); ++ } ++ else ++ eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, false)); ++ } ++ } ++ } ++ else ++ pendingFocusRequest = new FocusEvent(this, FocusEvent.FOCUS_GAINED); ++ } ++ } + } + + /** +- * Requests that this component be given focus. A FOCUS_GAINED +- * event will be fired if and only if this request is successful. To be +- * successful, the component must be displayable, visible, and focusable, +- * and the top-level Window must be able to receive focus. Thus, this +- * request may fail, or be delayed until the window receives focus. It is +- * recommended that requestFocusInWindow be used where +- * possible to be more platform-independent. +- * +- *

If the return value is false, the request is guaranteed to fail. If +- * it is true, it will likely succeed unless the action is vetoed or +- * something in the native windowing system intervenes. The temporary flag, +- * and thus this method in general, is not designed for public use; rather +- * it is a hook for lightweight components to notify their container in +- * an attempt to reduce the amount of repainting necessary. ++ * Request that this Component be given the keyboard input focus and ++ * that its top-level ancestor become the focused Window. ++ * ++ * For the request to be granted, the Component must be focusable, ++ * displayable and showing and the top-level Window to which it ++ * belongs must be focusable. If the request is initially denied on ++ * the basis that the top-level Window is not focusable, the request ++ * will be remembered and granted when the Window does become ++ * focused. ++ * ++ * Never assume that this Component is the focus owner until it ++ * receives a FOCUS_GAINED event. ++ * ++ * The behaviour of this method is platform-dependent. ++ * {@link #requestFocusInWindow} should be used instead. ++ * ++ * If the return value is false, the request is guaranteed to fail. ++ * If the return value is true, the request will succeed unless it ++ * is vetoed or something in the native windowing system intervenes, ++ * preventing this Component's top-level ancestor from becoming ++ * focused. This method is meant to be called by derived ++ * lightweight Components that want to avoid unnecessary repainting ++ * when they know a given focus transfer need only be temporary. + * + * @param temporary true if the focus request is temporary + * @return true if the request has a chance of success +- * @see #requestFocusInWindow() ++ * @see #requestFocusInWindow () + * @see FocusEvent +- * @see #addFocusListener(FocusListener) +- * @see #isFocusable() +- * @see #isDisplayable() +- * @see KeyboardFocusManager#clearGlobalFocusOwner() ++ * @see #addFocusListener (FocusListener) ++ * @see #isFocusable () ++ * @see #isDisplayable () ++ * @see KeyboardFocusManager#clearGlobalFocusOwner () + * @since 1.4 + */ +- protected boolean requestFocus(boolean temporary) ++ protected boolean requestFocus (boolean temporary) + { +- // XXX Implement correctly. +- requestFocus(); ++ if (isDisplayable () ++ && isShowing () ++ && isFocusable ()) ++ { ++ synchronized (getTreeLock ()) ++ { ++ // Find this Component's top-level ancestor. ++ Container parent = getParent (); ++ ++ while (parent != null ++ && !(parent instanceof Window)) ++ parent = parent.getParent (); ++ ++ Window toplevel = (Window) parent; ++ if (toplevel.isFocusableWindow ()) ++ { ++ if (peer != null && !isLightweight()) ++ // This call will cause a FOCUS_GAINED event to be ++ // posted to the system event queue if the native ++ // windowing system grants the focus request. ++ peer.requestFocus (); ++ else ++ { ++ // Either our peer hasn't been created yet or we're a ++ // lightweight component. In either case we want to ++ // post a FOCUS_GAINED event. ++ EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ synchronized (eq) ++ { ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ Component currentFocusOwner = manager.getGlobalPermanentFocusOwner (); ++ if (currentFocusOwner != null) ++ { ++ eq.postEvent (new FocusEvent(currentFocusOwner, ++ FocusEvent.FOCUS_LOST, ++ temporary, this)); ++ eq.postEvent (new FocusEvent(this, ++ FocusEvent.FOCUS_GAINED, ++ temporary, ++ currentFocusOwner)); ++ } ++ else ++ eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); ++ } ++ } ++ } ++ else ++ // FIXME: need to add a focus listener to our top-level ++ // ancestor, so that we can post this event when it becomes ++ // the focused window. ++ pendingFocusRequest = new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary); ++ } ++ } ++ // Always return true. + return true; + } + + /** +- * Requests that this component be given focus, if it resides in the +- * top-level window which already has focus. A FOCUS_GAINED +- * event will be fired if and only if this request is successful. To be +- * successful, the component must be displayable, visible, and focusable, +- * and the top-level Window must be focused. +- * +- *

If the return value is false, the request is guaranteed to fail. If +- * it is true, it will likely succeed unless the action is vetoed or +- * something in the native windowing system intervenes. The temporary flag, +- * and thus this method in general, is not designed for public use; rather +- * it is a hook for lightweight components to notify their container in +- * an attempt to reduce the amount of repainting necessary. ++ * Request that this component be given the keyboard input focus, if ++ * its top-level ancestor is the currently focused Window. A ++ * FOCUS_GAINED event will be fired if and only if this ++ * request is successful. To be successful, the component must be ++ * displayable, showing, and focusable, and its ancestor top-level ++ * Window must be focused. ++ * ++ * If the return value is false, the request is guaranteed to fail. ++ * If the return value is true, the request will succeed unless it ++ * is vetoed or something in the native windowing system intervenes, ++ * preventing this Component's top-level ancestor from becoming ++ * focused. + * + * @return true if the request has a chance of success +- * @see #requestFocus() ++ * @see #requestFocus () + * @see FocusEvent +- * @see #addFocusListener(FocusListener) +- * @see #isFocusable() +- * @see #isDisplayable() +- * @see KeyboardFocusManager#clearGlobalFocusOwner() ++ * @see #addFocusListener (FocusListener) ++ * @see #isFocusable () ++ * @see #isDisplayable () ++ * @see KeyboardFocusManager#clearGlobalFocusOwner () + * @since 1.4 + */ +- public boolean requestFocusInWindow() ++ public boolean requestFocusInWindow () + { +- // XXX Implement correctly. +- requestFocus(); +- return true; ++ return requestFocusInWindow (false); + } + + /** +- * Requests that this component be given focus, if it resides in the +- * top-level window which already has focus. A FOCUS_GAINED +- * event will be fired if and only if this request is successful. To be +- * successful, the component must be displayable, visible, and focusable, +- * and the top-level Window must be focused. +- * +- *

If the return value is false, the request is guaranteed to fail. If +- * it is true, it will likely succeed unless the action is vetoed or +- * something in the native windowing system intervenes. The temporary flag, +- * and thus this method in general, is not designed for public use; rather +- * it is a hook for lightweight components to notify their container in +- * an attempt to reduce the amount of repainting necessary. ++ * Request that this component be given the keyboard input focus, if ++ * its top-level ancestor is the currently focused Window. A ++ * FOCUS_GAINED event will be fired if and only if this ++ * request is successful. To be successful, the component must be ++ * displayable, showing, and focusable, and its ancestor top-level ++ * Window must be focused. ++ * ++ * If the return value is false, the request is guaranteed to fail. ++ * If the return value is true, the request will succeed unless it ++ * is vetoed or something in the native windowing system intervenes, ++ * preventing this Component's top-level ancestor from becoming ++ * focused. This method is meant to be called by derived ++ * lightweight Components that want to avoid unnecessary repainting ++ * when they know a given focus transfer need only be temporary. + * + * @param temporary true if the focus request is temporary + * @return true if the request has a chance of success +- * @see #requestFocus() ++ * @see #requestFocus () + * @see FocusEvent +- * @see #addFocusListener(FocusListener) +- * @see #isFocusable() +- * @see #isDisplayable() +- * @see KeyboardFocusManager#clearGlobalFocusOwner() ++ * @see #addFocusListener (FocusListener) ++ * @see #isFocusable () ++ * @see #isDisplayable () ++ * @see KeyboardFocusManager#clearGlobalFocusOwner () + * @since 1.4 + */ +- protected boolean requestFocusInWindow(boolean temporary) ++ protected boolean requestFocusInWindow (boolean temporary) + { +- // XXX Implement correctly. +- requestFocus(); +- return true; ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ Window focusedWindow = manager.getFocusedWindow (); ++ ++ if (isDisplayable () ++ && isShowing () ++ && isFocusable ()) ++ { ++ if (focusedWindow != null) ++ { ++ synchronized (getTreeLock ()) ++ { ++ Container parent = getParent (); ++ ++ while (parent != null ++ && !(parent instanceof Window)) ++ parent = parent.getParent (); ++ ++ Window toplevel = (Window) parent; ++ ++ // Check if top-level ancestor is currently focused window. ++ if (focusedWindow == toplevel) ++ { ++ if (peer != null ++ && !isLightweight() ++ && !(this instanceof Window)) ++ // This call will cause a FOCUS_GAINED event to be ++ // posted to the system event queue if the native ++ // windowing system grants the focus request. ++ peer.requestFocus (); ++ else ++ { ++ // Either our peer hasn't been created yet or we're a ++ // lightweight component. In either case we want to ++ // post a FOCUS_GAINED event. ++ EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ synchronized (eq) ++ { ++ Component currentFocusOwner = manager.getGlobalPermanentFocusOwner (); ++ if (currentFocusOwner != null) ++ { ++ eq.postEvent (new FocusEvent(currentFocusOwner, FocusEvent.FOCUS_LOST, ++ temporary, this)); ++ eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary, ++ currentFocusOwner)); ++ } ++ else ++ eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); ++ } ++ } ++ } ++ else ++ return false; ++ } ++ } ++ ++ return true; ++ } ++ return false; + } + + /** +- * Transfers focus to the next component in the focus traversal order, as +- * though this were the current focus owner. ++ * Transfers focus to the next component in the focus traversal ++ * order, as though this were the current focus owner. + * + * @see #requestFocus() + * @since 1.1 + */ +- public void transferFocus() ++ public void transferFocus () + { +- Component next; +- if (parent == null) +- next = findNextFocusComponent(null); +- else +- next = parent.findNextFocusComponent(this); +- if (next != null && next != this) +- next.requestFocus(); ++ nextFocus (); + } + + /** +- * Returns the root container that owns the focus cycle where this component +- * resides. A focus cycle root is in two cycles, one as the ancestor, and +- * one as the focusable element; this call always returns the ancestor. ++ * Returns the root container that owns the focus cycle where this ++ * component resides. A focus cycle root is in two cycles, one as ++ * the ancestor, and one as the focusable element; this call always ++ * returns the ancestor. + * + * @return the ancestor container that owns the focus cycle + * @since 1.4 + */ +- public Container getFocusCycleRootAncestor() ++ public Container getFocusCycleRootAncestor () + { +- // XXX Implement. +- throw new Error("not implemented"); ++ if (this instanceof Window ++ && ((Container) this).isFocusCycleRoot ()) ++ return (Container) this; ++ ++ Container parent = getParent (); ++ ++ while (parent != null ++ && !parent.isFocusCycleRoot ()) ++ parent = parent.getParent (); ++ ++ return parent; + } + + /** +- * Tests if the container is the ancestor of the focus cycle that this +- * component belongs to. ++ * Tests if the container is the ancestor of the focus cycle that ++ * this component belongs to. + * + * @param c the container to test + * @return true if c is the focus cycle root + * @since 1.4 + */ +- public boolean isFocusCycleRoot(Container c) ++ public boolean isFocusCycleRoot (Container c) + { +- return c == getFocusCycleRootAncestor(); ++ return c == getFocusCycleRootAncestor (); + } + + /** +- * AWT 1.0 focus event processor. ++ * AWT 1.0 focus event processor. Transfers focus to the next ++ * component in the focus traversal order, as though this were the ++ * current focus owner. + * +- * @deprecated use {@link #transferFocus()} instead ++ * @deprecated use {@link #transferFocus ()} instead + */ +- public void nextFocus() ++ public void nextFocus () + { +- transferFocus(); ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ manager.focusNextComponent (this); + } + + /** +- * Transfers focus to the previous component in the focus traversal order, as +- * though this were the current focus owner. ++ * Transfers focus to the previous component in the focus traversal ++ * order, as though this were the current focus owner. + * +- * @see #requestFocus() ++ * @see #requestFocus () + * @since 1.4 + */ +- public void transferFocusBackward() ++ public void transferFocusBackward () + { +- // XXX Implement. +- throw new Error("not implemented"); ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ manager.focusPreviousComponent (this); + } + + /** +- * Transfers focus to the focus cycle root of this component. However, if +- * this is a Window, the default focus owner in the window in the current +- * focus cycle is focused instead. ++ * Transfers focus to the focus cycle root of this component. ++ * However, if this is a Window, the default focus owner in the ++ * window in the current focus cycle is focused instead. + * +- * @see #requestFocus() +- * @see #isFocusCycleRoot() ++ * @see #requestFocus () ++ * @see #isFocusCycleRoot () + * @since 1.4 + */ +- public void transferFocusUpCycle() ++ public void transferFocusUpCycle () + { +- // XXX Implement. +- throw new Error("not implemented"); ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ manager.upFocusCycle (this); + } + + /** +- * Tests if this component is the focus owner. Use {@link #isFocusOwner()} +- * instead. ++ * Tests if this component is the focus owner. Use {@link ++ * #isFocusOwner ()} instead. + * + * @return true if this component owns focus + * @since 1.2 + */ +- public boolean hasFocus() ++ public boolean hasFocus () + { +- return isFocusOwner(); ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ Component focusOwner = manager.getFocusOwner (); ++ ++ return this == focusOwner; + } + + /** +@@ -3696,8 +4081,7 @@ + */ + public boolean isFocusOwner() + { +- // XXX Implement. +- throw new Error("not implemented"); ++ return hasFocus (); + } + + /** +@@ -3712,6 +4096,12 @@ + if (popups == null) + popups = new Vector(); + popups.add(popup); ++ ++ if (popup.parent != null) ++ popup.parent.remove(popup); ++ popup.parent = this; ++ if (peer != null) ++ popup.addNotify(); + } + + /** +@@ -3739,8 +4129,8 @@ + String name = getName(); + if (name != null) + param.append(name).append(","); +- param.append(width).append("x").append(height).append("+").append(x) +- .append("+").append(y); ++ param.append(x).append(",").append(y).append(",").append(width) ++ .append("x").append(height); + if (! isValid()) + param.append(",invalid"); + if (! isVisible()) +@@ -4108,15 +4498,238 @@ + } + + /** +- * Implementation of dispatchEvent. Allows trusted package classes to +- * dispatch additional events first. ++ * Translate an AWT 1.1 event ({@link AWTEvent}) into an AWT 1.0 ++ * event ({@link Event}). ++ * ++ * @param e an AWT 1.1 event to translate ++ * ++ * @return an AWT 1.0 event representing e ++ */ ++ private Event translateEvent (AWTEvent e) ++ { ++ Component target = (Component) e.getSource (); ++ Event translated = null; ++ ++ if (e instanceof InputEvent) ++ { ++ InputEvent ie = (InputEvent) e; ++ long when = ie.getWhen (); ++ ++ int oldID = 0; ++ int id = e.getID (); ++ ++ int oldMods = 0; ++ int mods = ie.getModifiersEx (); ++ ++ if ((mods & InputEvent.BUTTON2_DOWN_MASK) != 0) ++ oldMods |= Event.META_MASK; ++ else if ((mods & InputEvent.BUTTON3_DOWN_MASK) != 0) ++ oldMods |= Event.ALT_MASK; ++ ++ if ((mods & InputEvent.SHIFT_DOWN_MASK) != 0) ++ oldMods |= Event.SHIFT_MASK; ++ ++ if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) ++ oldMods |= Event.CTRL_MASK; ++ ++ if ((mods & InputEvent.META_DOWN_MASK) != 0) ++ oldMods |= Event.META_MASK; ++ ++ if ((mods & InputEvent.ALT_DOWN_MASK) != 0) ++ oldMods |= Event.ALT_MASK; ++ ++ if (e instanceof MouseEvent) ++ { ++ if (id == MouseEvent.MOUSE_PRESSED) ++ oldID = Event.MOUSE_DOWN; ++ else if (id == MouseEvent.MOUSE_RELEASED) ++ oldID = Event.MOUSE_UP; ++ else if (id == MouseEvent.MOUSE_MOVED) ++ oldID = Event.MOUSE_MOVE; ++ else if (id == MouseEvent.MOUSE_DRAGGED) ++ oldID = Event.MOUSE_DRAG; ++ else if (id == MouseEvent.MOUSE_ENTERED) ++ oldID = Event.MOUSE_ENTER; ++ else if (id == MouseEvent.MOUSE_EXITED) ++ oldID = Event.MOUSE_EXIT; ++ else ++ // No analogous AWT 1.0 mouse event. ++ return null; ++ ++ MouseEvent me = (MouseEvent) e; ++ ++ translated = new Event (target, when, oldID, ++ me.getX (), me.getY (), 0, oldMods); ++ } ++ else if (e instanceof KeyEvent) ++ { ++ if (id == KeyEvent.KEY_PRESSED) ++ oldID = Event.KEY_PRESS; ++ else if (e.getID () == KeyEvent.KEY_RELEASED) ++ oldID = Event.KEY_RELEASE; ++ else ++ // No analogous AWT 1.0 key event. ++ return null; ++ ++ int oldKey = 0; ++ int newKey = ((KeyEvent) e).getKeyCode (); ++ switch (newKey) ++ { ++ case KeyEvent.VK_BACK_SPACE: ++ oldKey = Event.BACK_SPACE; ++ break; ++ case KeyEvent.VK_CAPS_LOCK: ++ oldKey = Event.CAPS_LOCK; ++ break; ++ case KeyEvent.VK_DELETE: ++ oldKey = Event.DELETE; ++ break; ++ case KeyEvent.VK_DOWN: ++ case KeyEvent.VK_KP_DOWN: ++ oldKey = Event.DOWN; ++ break; ++ case KeyEvent.VK_END: ++ oldKey = Event.END; ++ break; ++ case KeyEvent.VK_ENTER: ++ oldKey = Event.ENTER; ++ break; ++ case KeyEvent.VK_ESCAPE: ++ oldKey = Event.ESCAPE; ++ break; ++ case KeyEvent.VK_F1: ++ oldKey = Event.F1; ++ break; ++ case KeyEvent.VK_F10: ++ oldKey = Event.F10; ++ break; ++ case KeyEvent.VK_F11: ++ oldKey = Event.F11; ++ break; ++ case KeyEvent.VK_F12: ++ oldKey = Event.F12; ++ break; ++ case KeyEvent.VK_F2: ++ oldKey = Event.F2; ++ break; ++ case KeyEvent.VK_F3: ++ oldKey = Event.F3; ++ break; ++ case KeyEvent.VK_F4: ++ oldKey = Event.F4; ++ break; ++ case KeyEvent.VK_F5: ++ oldKey = Event.F5; ++ break; ++ case KeyEvent.VK_F6: ++ oldKey = Event.F6; ++ break; ++ case KeyEvent.VK_F7: ++ oldKey = Event.F7; ++ break; ++ case KeyEvent.VK_F8: ++ oldKey = Event.F8; ++ break; ++ case KeyEvent.VK_F9: ++ oldKey = Event.F9; ++ break; ++ case KeyEvent.VK_HOME: ++ oldKey = Event.HOME; ++ break; ++ case KeyEvent.VK_INSERT: ++ oldKey = Event.INSERT; ++ break; ++ case KeyEvent.VK_LEFT: ++ case KeyEvent.VK_KP_LEFT: ++ oldKey = Event.LEFT; ++ break; ++ case KeyEvent.VK_NUM_LOCK: ++ oldKey = Event.NUM_LOCK; ++ break; ++ case KeyEvent.VK_PAUSE: ++ oldKey = Event.PAUSE; ++ break; ++ case KeyEvent.VK_PAGE_DOWN: ++ oldKey = Event.PGDN; ++ break; ++ case KeyEvent.VK_PAGE_UP: ++ oldKey = Event.PGUP; ++ break; ++ case KeyEvent.VK_PRINTSCREEN: ++ oldKey = Event.PRINT_SCREEN; ++ break; ++ case KeyEvent.VK_RIGHT: ++ case KeyEvent.VK_KP_RIGHT: ++ oldKey = Event.RIGHT; ++ break; ++ case KeyEvent.VK_SCROLL_LOCK: ++ oldKey = Event.SCROLL_LOCK; ++ break; ++ case KeyEvent.VK_TAB: ++ oldKey = Event.TAB; ++ break; ++ case KeyEvent.VK_UP: ++ case KeyEvent.VK_KP_UP: ++ oldKey = Event.UP; ++ break; ++ default: ++ oldKey = newKey; ++ } ++ ++ translated = new Event (target, when, oldID, ++ 0, 0, oldKey, oldMods); ++ } ++ } ++ else if (e instanceof ActionEvent) ++ translated = new Event (target, Event.ACTION_EVENT, ++ ((ActionEvent) e).getActionCommand ()); ++ ++ return translated; ++ } ++ ++ /** ++ * Implementation of dispatchEvent. Allows trusted package classes ++ * to dispatch additional events first. This implementation first ++ * translates e to an AWT 1.0 event and sends the ++ * result to {@link #postEvent}. If the AWT 1.0 event is not ++ * handled, and events of type e are enabled for this ++ * component, e is passed on to {@link #processEvent}. + * + * @param e the event to dispatch + */ +- void dispatchEventImpl(AWTEvent e) ++ ++ void dispatchEventImpl (AWTEvent e) + { ++ Event oldEvent = translateEvent (e); ++ ++ if (oldEvent != null) ++ postEvent (oldEvent); ++ + if (eventTypeEnabled (e.id)) +- processEvent(e); ++ { ++ // the trick we use to communicate between dispatch and redispatch ++ // is to have KeyboardFocusManager.redispatch synchronize on the ++ // object itself. we then do not redispatch to KeyboardFocusManager ++ // if we are already holding the lock. ++ if (! Thread.holdsLock(e)) ++ { ++ switch (e.id) ++ { ++ case WindowEvent.WINDOW_GAINED_FOCUS: ++ case WindowEvent.WINDOW_LOST_FOCUS: ++ case KeyEvent.KEY_PRESSED: ++ case KeyEvent.KEY_RELEASED: ++ case KeyEvent.KEY_TYPED: ++ case FocusEvent.FOCUS_GAINED: ++ case FocusEvent.FOCUS_LOST: ++ if (KeyboardFocusManager ++ .getCurrentKeyboardFocusManager() ++ .dispatchEvent(e)) ++ return; ++ } ++ } ++ processEvent (e); ++ } + } + + /** +@@ -4147,6 +4760,8 @@ + case MouseEvent.MOUSE_EXITED: + case MouseEvent.MOUSE_PRESSED: + case MouseEvent.MOUSE_RELEASED: ++ case MouseEvent.MOUSE_MOVED: ++ case MouseEvent.MOUSE_DRAGGED: + return (mouseListener != null + || mouseMotionListener != null + || (eventMask & AWTEvent.MOUSE_EVENT_MASK) != 0); +@@ -4220,45 +4835,12 @@ + } + + /** +- * Does the work for a paint event. +- * +- * @param event the event to process +- */ +- private void processPaintEvent(PaintEvent event) +- { +- // Can't do graphics without peer +- if (peer == null) +- return; +- +- Graphics gfx = getGraphics(); +- try +- { +- Shape clip = event.getUpdateRect(); +- gfx.setClip(clip); +- +- switch (event.id) +- { +- case PaintEvent.PAINT: +- paint(gfx); +- break; +- case PaintEvent.UPDATE: +- update(gfx); +- break; +- default: +- throw new IllegalArgumentException("unknown paint event"); +- } +- } +- finally +- { +- gfx.dispose(); +- } +- } +- +- /** + * This method is used to implement transferFocus(). CHILD is the child + * making the request. This is overridden by Container; when called for an + * ordinary component there is no child and so we always return null. + * ++ * FIXME: is this still needed, in light of focus traversal policies? ++ * + * @param child the component making the request + * @return the next component to focus on + */ +@@ -4819,23 +5401,23 @@ + * Tests whether this component can accept focus. + * + * @return true if this is focus traversable +- * @see #getAccessibleStateSet() ++ * @see #getAccessibleStateSet () + * @see AccessibleState#FOCUSABLE + * @see AccessibleState#FOCUSED + */ +- public boolean isFocusTraversable() ++ public boolean isFocusTraversable () + { +- return Component.this.isFocusTraversable(); ++ return Component.this.isFocusTraversable (); + } + + /** + * Requests focus for this component. + * +- * @see #isFocusTraversable() ++ * @see #isFocusTraversable () + */ +- public void requestFocus() ++ public void requestFocus () + { +- Component.this.requestFocus(); ++ Component.this.requestFocus (); + } + + /** +Index: java/awt/ComponentOrientation.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/ComponentOrientation.java,v +retrieving revision 1.6 +diff -u -r1.6 ComponentOrientation.java +--- java/awt/ComponentOrientation.java 9 Aug 2002 04:26:13 -0000 1.6 ++++ java/awt/ComponentOrientation.java 6 Sep 2004 16:35:43 -0000 +@@ -171,13 +171,15 @@ + } + + /** +- * Gets an orientation from a resource bundle. This tries the following:

    ++ * Gets an orientation from a resource bundle. This tries the following: ++ * ++ *
      + *
    • Use the key "Orientation" to find an instance of ComponentOrientation + * in the bundle.
    • + *
    • Get the locale of the resource bundle, and get the orientation of + * that locale.
    • +- *
    • Give up and get the orientation of the default locale.
    • +- *
        ++ *
      1. Give up and get the orientation of the default locale.
      2. ++ *
    + * + * @param bdl the bundle to use + * @return the orientation +Index: java/awt/Container.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Container.java,v +retrieving revision 1.29 +diff -u -r1.29 Container.java +--- java/awt/Container.java 8 Jan 2004 03:52:52 -0000 1.29 ++++ java/awt/Container.java 6 Sep 2004 16:35:43 -0000 +@@ -1,5 +1,5 @@ + /* Container.java -- parent container class in AWT +- Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation ++ Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -46,12 +46,19 @@ + import java.awt.peer.LightweightPeer; + import java.beans.PropertyChangeListener; + import java.beans.PropertyChangeSupport; ++import java.io.ObjectInputStream; ++import java.io.IOException; ++import java.io.ObjectOutputStream; + import java.io.PrintStream; + import java.io.PrintWriter; + import java.io.Serializable; ++import java.util.Collections; + import java.util.EventListener; ++import java.util.Iterator; ++import java.util.HashSet; + import java.util.Set; + import javax.accessibility.Accessible; ++import javax.swing.SwingUtilities; + + /** + * A generic window toolkit object that acts as a container for other objects. +@@ -92,6 +99,21 @@ + transient ContainerListener containerListener; + transient PropertyChangeSupport changeSupport; + ++ /** The focus traversal policy that determines how focus is ++ transferred between this Container and its children. */ ++ private FocusTraversalPolicy focusTraversalPolicy; ++ ++ /** ++ * The focus traversal keys, if not inherited from the parent or default ++ * keyboard manager. These sets will contain only AWTKeyStrokes that ++ * represent press and release events to use as focus control. ++ * ++ * @see #getFocusTraversalKeys(int) ++ * @see #setFocusTraversalKeys(int, Set) ++ * @since 1.4 ++ */ ++ transient Set[] focusTraversalKeys; ++ + /** + * Default constructor for subclasses. + */ +@@ -106,7 +128,7 @@ + */ + public int getComponentCount() + { +- return ncomponents; ++ return countComponents (); + } + + /** +@@ -118,7 +140,7 @@ + */ + public int countComponents() + { +- return getComponentCount(); ++ return ncomponents; + } + + /** +@@ -186,10 +208,7 @@ + */ + public Insets getInsets() + { +- if (peer == null) +- return new Insets(0, 0, 0, 0); +- +- return ((ContainerPeer) peer).getInsets(); ++ return insets (); + } + + /** +@@ -201,7 +220,10 @@ + */ + public Insets insets() + { +- return getInsets(); ++ if (peer == null) ++ return new Insets (0, 0, 0, 0); ++ ++ return ((ContainerPeer) peer).getInsets (); + } + + /** +@@ -396,6 +418,8 @@ + if (layoutMgr != null) + layoutMgr.removeLayoutComponent(r); + ++ r.parent = null; ++ + // Post event to notify of adding the container. + ContainerEvent ce = new ContainerEvent(this, + ContainerEvent.COMPONENT_REMOVED, +@@ -463,8 +487,7 @@ + */ + public void doLayout() + { +- if (layoutMgr != null) +- layoutMgr.layoutContainer(this); ++ layout (); + } + + /** +@@ -474,7 +497,8 @@ + */ + public void layout() + { +- doLayout(); ++ if (layoutMgr != null) ++ layoutMgr.layoutContainer (this); + } + + /** +@@ -501,6 +525,20 @@ + } + + /** ++ * Recursively invalidates the container tree. ++ */ ++ private void invalidateTree() ++ { ++ for (int i = 0; i < ncomponents; i++) ++ { ++ Component comp = component[i]; ++ comp.invalidate(); ++ if (comp instanceof Container) ++ ((Container) comp).invalidateTree(); ++ } ++ } ++ ++ /** + * Recursively validates the container tree, recomputing any invalid + * layouts. + */ +@@ -545,7 +583,10 @@ + public void setFont(Font f) + { + super.setFont(f); +- // FIXME, should invalidate all children with font == null ++ // FIXME: Although it might make more sense to invalidate only ++ // those children whose font == null, Sun invalidates all children. ++ // So we'll do the same. ++ invalidateTree(); + } + + /** +@@ -555,7 +596,7 @@ + */ + public Dimension getPreferredSize() + { +- return preferredSize(); ++ return preferredSize (); + } + + /** +@@ -567,10 +608,10 @@ + */ + public Dimension preferredSize() + { +- if (layoutMgr != null) +- return layoutMgr.preferredLayoutSize(this); +- else +- return super.preferredSize(); ++ if (layoutMgr != null) ++ return layoutMgr.preferredLayoutSize (this); ++ else ++ return super.preferredSize (); + } + + /** +@@ -580,7 +621,7 @@ + */ + public Dimension getMinimumSize() + { +- return minimumSize(); ++ return minimumSize (); + } + + /** +@@ -592,10 +633,10 @@ + */ + public Dimension minimumSize() + { +- if (layoutMgr != null) +- return layoutMgr.minimumLayoutSize(this); +- else +- return super.minimumSize(); ++ if (layoutMgr != null) ++ return layoutMgr.minimumLayoutSize (this); ++ else ++ return super.minimumSize (); + } + + /** +@@ -663,8 +704,9 @@ + { + if (!isShowing()) + return; +- super.paint(g); +- visitChildren(g, GfxPaintVisitor.INSTANCE, true); ++ // Visit heavyweights as well, in case they were ++ // erased when we cleared the background for this container. ++ visitChildren(g, GfxPaintVisitor.INSTANCE, false); + } + + /** +@@ -678,11 +720,6 @@ + */ + public void update(Graphics g) + { +- Rectangle clip = g.getClipBounds(); +- if (clip == null) +- g.clearRect(0, 0, width, height); +- else +- g.clearRect(clip.x, clip.y, clip.width, clip.height); + super.update(g); + } + +@@ -819,6 +856,16 @@ + */ + public void deliverEvent(Event e) + { ++ if (!handleEvent (e)) ++ { ++ synchronized (getTreeLock ()) ++ { ++ Component parent = getParent (); ++ ++ if (parent != null) ++ parent.deliverEvent (e); ++ } ++ } + } + + /** +@@ -837,23 +884,7 @@ + */ + public Component getComponentAt(int x, int y) + { +- synchronized (getTreeLock ()) +- { +- if (! contains(x, y)) +- return null; +- for (int i = 0; i < ncomponents; ++i) +- { +- // Ignore invisible children... +- if (!component[i].isVisible()) +- continue; +- +- int x2 = x - component[i].x; +- int y2 = y - component[i].y; +- if (component[i].contains(x2, y2)) +- return component[i]; +- } +- return this; +- } ++ return locate (x, y); + } + + /** +@@ -873,7 +904,23 @@ + */ + public Component locate(int x, int y) + { +- return getComponentAt(x, y); ++ synchronized (getTreeLock ()) ++ { ++ if (!contains (x, y)) ++ return null; ++ for (int i = 0; i < ncomponents; ++i) ++ { ++ // Ignore invisible children... ++ if (!component[i].isVisible ()) ++ continue; ++ ++ int x2 = x - component[i].x; ++ int y2 = y - component[i].y; ++ if (component[i].contains (x2, y2)) ++ return component[i]; ++ } ++ return this; ++ } + } + + /** +@@ -890,7 +937,7 @@ + */ + public Component getComponentAt(Point p) + { +- return getComponentAt(p.x, p.y); ++ return getComponentAt (p.x, p.y); + } + + public Component findComponentAt(int x, int y) +@@ -990,7 +1037,7 @@ + { + String param = super.paramString(); + if (layoutMgr != null) +- param = param + "," + layoutMgr.getClass().getName(); ++ param = param + ",layout=" + layoutMgr.getClass().getName(); + + return param; + } +@@ -1054,9 +1101,89 @@ + throw new IllegalArgumentException (); + + if (keystrokes == null) +- throw new IllegalArgumentException (); ++ { ++ Container parent = getParent (); ++ ++ while (parent != null) ++ { ++ if (parent.areFocusTraversalKeysSet (id)) ++ { ++ keystrokes = parent.getFocusTraversalKeys (id); ++ break; ++ } ++ parent = parent.getParent (); ++ } + +- throw new Error ("not implemented"); ++ if (keystrokes == null) ++ keystrokes = KeyboardFocusManager.getCurrentKeyboardFocusManager (). ++ getDefaultFocusTraversalKeys (id); ++ } ++ ++ Set sa; ++ Set sb; ++ Set sc; ++ String name; ++ switch (id) ++ { ++ case KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS: ++ sa = getFocusTraversalKeys ++ (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); ++ sb = getFocusTraversalKeys ++ (KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS); ++ sc = getFocusTraversalKeys ++ (KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS); ++ name = "forwardFocusTraversalKeys"; ++ break; ++ case KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS: ++ sa = getFocusTraversalKeys ++ (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); ++ sb = getFocusTraversalKeys ++ (KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS); ++ sc = getFocusTraversalKeys ++ (KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS); ++ name = "backwardFocusTraversalKeys"; ++ break; ++ case KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS: ++ sa = getFocusTraversalKeys ++ (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); ++ sb = getFocusTraversalKeys ++ (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); ++ sc = getFocusTraversalKeys ++ (KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS); ++ name = "upCycleFocusTraversalKeys"; ++ break; ++ case KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS: ++ sa = getFocusTraversalKeys ++ (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); ++ sb = getFocusTraversalKeys ++ (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); ++ sc = getFocusTraversalKeys ++ (KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS); ++ name = "downCycleFocusTraversalKeys"; ++ break; ++ default: ++ throw new IllegalArgumentException (); ++ } ++ ++ int i = keystrokes.size (); ++ Iterator iter = keystrokes.iterator (); ++ ++ while (--i >= 0) ++ { ++ Object o = iter.next (); ++ if (!(o instanceof AWTKeyStroke) ++ || sa.contains (o) || sb.contains (o) || sc.contains (o) ++ || ((AWTKeyStroke) o).keyCode == KeyEvent.VK_UNDEFINED) ++ throw new IllegalArgumentException (); ++ } ++ ++ if (focusTraversalKeys == null) ++ focusTraversalKeys = new Set[3]; ++ ++ keystrokes = Collections.unmodifiableSet (new HashSet (keystrokes)); ++ firePropertyChange (name, focusTraversalKeys[id], keystrokes); ++ ++ focusTraversalKeys[id] = keystrokes; + } + + /** +@@ -1071,7 +1198,7 @@ + * + * @since 1.4 + */ +- public Set getFocusTraversalKeys(int id) ++ public Set getFocusTraversalKeys (int id) + { + if (id != KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS && + id != KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS && +@@ -1079,9 +1206,18 @@ + id != KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS) + throw new IllegalArgumentException (); + +- return null; ++ Set s = null; ++ ++ if (focusTraversalKeys != null) ++ s = focusTraversalKeys[id]; ++ ++ if (s == null && parent != null) ++ s = parent.getFocusTraversalKeys (id); ++ ++ return s == null ? (KeyboardFocusManager.getCurrentKeyboardFocusManager() ++ .getDefaultFocusTraversalKeys(id)) : s; + } +- ++ + /** + * Returns whether the Set of focus traversal keys for the given focus + * traversal operation has been explicitly defined for this Container. +@@ -1096,7 +1232,7 @@ + * + * @since 1.4 + */ +- public boolean areFocusTraversalKeysSet(int id) ++ public boolean areFocusTraversalKeysSet (int id) + { + if (id != KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS && + id != KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS && +@@ -1104,43 +1240,148 @@ + id != KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS) + throw new IllegalArgumentException (); + +- return false; ++ return focusTraversalKeys != null && focusTraversalKeys[id] != null; + } +- +- public boolean isFocusCycleRoot(Container c) ++ ++ /** ++ * Check whether the given Container is the focus cycle root of this ++ * Container's focus traversal cycle. If this Container is a focus ++ * cycle root itself, then it will be in two different focus cycles ++ * -- it's own, and that of its ancestor focus cycle root's. In ++ * that case, if c is either of those containers, this ++ * method will return true. ++ * ++ * @param c the candidate Container ++ * ++ * @return true if c is the focus cycle root of the focus traversal ++ * cycle to which this Container belongs, false otherwise ++ * ++ * @since 1.4 ++ */ ++ public boolean isFocusCycleRoot (Container c) + { ++ if (this == c ++ && isFocusCycleRoot ()) ++ return true; ++ ++ Container ancestor = getFocusCycleRootAncestor (); ++ ++ if (c == ancestor) ++ return true; ++ + return false; + } +- +- public void transferFocusBackward() +- { +- } +- +- public void setFocusTraversalPolicy(FocusTraversalPolicy policy) ++ ++ /** ++ * If this Container is a focus cycle root, set the focus traversal ++ * policy that determines the focus traversal order for its ++ * children. If non-null, this policy will be inherited by all ++ * inferior focus cycle roots. If policy is null, this ++ * Container will inherit its policy from the closest ancestor focus ++ * cycle root that's had its policy set. ++ * ++ * @param policy the new focus traversal policy for this Container or null ++ * ++ * @since 1.4 ++ */ ++ public void setFocusTraversalPolicy (FocusTraversalPolicy policy) + { ++ focusTraversalPolicy = policy; + } +- +- public FocusTraversalPolicy getFocusTraversalPolicy() ++ ++ /** ++ * Return the focus traversal policy that determines the focus ++ * traversal order for this Container's children. This method ++ * returns null if this Container is not a focus cycle root. If the ++ * focus traversal policy has not been set explicitly, then this ++ * method will return an ancestor focus cycle root's policy instead. ++ * ++ * @return this Container's focus traversal policy or null ++ * ++ * @since 1.4 ++ */ ++ public FocusTraversalPolicy getFocusTraversalPolicy () + { +- return null; ++ if (!isFocusCycleRoot ()) ++ return null; ++ ++ if (focusTraversalPolicy == null) ++ { ++ Container ancestor = getFocusCycleRootAncestor (); ++ ++ if (ancestor != this) ++ return ancestor.getFocusTraversalPolicy (); ++ else ++ { ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ return manager.getDefaultFocusTraversalPolicy (); ++ } ++ } ++ else ++ return focusTraversalPolicy; + } +- +- public boolean isFocusTraversalPolicySet() ++ ++ /** ++ * Check whether this Container's focus traversal policy has been ++ * explicitly set. If it has not, then this Container will inherit ++ * its focus traversal policy from one of its ancestor focus cycle ++ * roots. ++ * ++ * @return true if focus traversal policy is set, false otherwise ++ */ ++ public boolean isFocusTraversalPolicySet () + { +- return false; ++ return focusTraversalPolicy == null; + } +- +- public void setFocusCycleRoot(boolean focusCycleRoot) ++ ++ /** ++ * Set whether or not this Container is the root of a focus ++ * traversal cycle. This Container's focus traversal policy ++ * determines the order of focus traversal. Some policies prevent ++ * the focus from being transferred between two traversal cycles ++ * until an up or down traversal operation is performed. In that ++ * case, normal traversal (not up or down) is limited to this ++ * Container and all of this Container's descendents that are not ++ * descendents of inferior focus cycle roots. In the default case ++ * however, ContainerOrderFocusTraversalPolicy is in effect, and it ++ * supports implicit down-cycle traversal operations. ++ * ++ * @return true if this is a focus cycle root, false otherwise ++ * ++ * @since 1.4 ++ */ ++ public void setFocusCycleRoot (boolean focusCycleRoot) + { ++ this.focusCycleRoot = focusCycleRoot; + } +- +- public boolean isFocusCycleRoot() ++ ++ /** ++ * Check whether this Container is a focus cycle root. ++ * ++ * @return true if this is a focus cycle root, false otherwise ++ * ++ * @since 1.4 ++ */ ++ public boolean isFocusCycleRoot () + { +- return false; ++ return focusCycleRoot; + } +- +- public void transferFocusDownCycle() ++ ++ /** ++ * Transfer focus down one focus traversal cycle. If this Container ++ * is a focus cycle root, then its default component becomes the ++ * focus owner, and this Container becomes the current focus cycle ++ * root. No traversal will occur if this Container is not a focus ++ * cycle root. ++ * ++ * @since 1.4 ++ */ ++ public void transferFocusDownCycle () + { ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ manager.downFocusCycle (this); + } + + /** +@@ -1204,8 +1445,12 @@ + for (int i = ncomponents - 1; i >= 0; --i) + { + Component comp = component[i]; ++ // If we're visiting heavyweights as well, ++ // don't recurse into Containers here. This avoids ++ // painting the same nested child multiple times. + boolean applicable = comp.isVisible() +- && (comp.isLightweight() || !lightweightOnly); ++ && (comp.isLightweight() ++ || !lightweightOnly && ! (comp instanceof Container)); + + if (applicable) + visitChild(gfx, visitor, comp); +@@ -1233,6 +1478,7 @@ + Rectangle oldClip = gfx.getClipBounds(); + if (oldClip == null) + oldClip = bounds; ++ + Rectangle clip = oldClip.intersection(bounds); + + if (clip.isEmpty()) return; +@@ -1259,10 +1505,11 @@ + void dispatchEventImpl(AWTEvent e) + { + // Give lightweight dispatcher a chance to handle it. +- if (dispatcher != null ++ if (eventTypeEnabled (e.id) ++ && dispatcher != null + && dispatcher.handleEvent (e)) + return; +- ++ + if ((e.id <= ContainerEvent.CONTAINER_LAST + && e.id >= ContainerEvent.CONTAINER_FIRST) + && (containerListener != null +@@ -1336,11 +1583,10 @@ + + // If we're not lightweight, and we just got a lightweight + // child, we need a lightweight dispatcher to feed it events. +- if (! this.isLightweight() +- && dispatcher == null) ++ if (! this.isLightweight()) + { +- dispatcher = new LightweightDispatcher (this); +- dispatcher.enableEvents (component[i].eventMask); ++ if (dispatcher == null) ++ dispatcher = new LightweightDispatcher (this); + } + + +@@ -1352,6 +1598,61 @@ + } + } + ++ /** ++ * Deserialize this Container: ++ *
      ++ *
    1. Read from the stream the default serializable fields.
    2. ++ *
    3. Read a list of serializable ContainerListeners as optional ++ * data. If the list is null, no listeners will be registered.
    4. ++ *
    5. Read this Container's FocusTraversalPolicy as optional data. ++ * If this is null, then this Container will use a ++ * DefaultFocusTraversalPolicy.
    6. ++ *
    ++ * ++ * @param s the stream to read from ++ * @throws ClassNotFoundException if deserialization fails ++ * @throws IOException if the stream fails ++ */ ++ private void readObject (ObjectInputStream s) ++ throws ClassNotFoundException, IOException ++ { ++ s.defaultReadObject (); ++ String key = (String) s.readObject (); ++ while (key != null) ++ { ++ Object object = s.readObject (); ++ if ("containerL".equals (key)) ++ addContainerListener((ContainerListener) object); ++ // FIXME: under what key is the focus traversal policy stored? ++ else if ("focusTraversalPolicy".equals (key)) ++ setFocusTraversalPolicy ((FocusTraversalPolicy) object); ++ ++ key = (String) s.readObject(); ++ } ++ } ++ ++ /** ++ * Serialize this Container: ++ *
      ++ *
    1. Write to the stream the default serializable fields.
    2. ++ *
    3. Write the list of serializable ContainerListeners as optional ++ * data.
    4. ++ *
    5. Write this Container's FocusTraversalPolicy as optional data.
    6. ++ *
    ++ * ++ * @param s the stream to write to ++ * @throws IOException if the stream fails ++ */ ++ private void writeObject (ObjectOutputStream s) throws IOException ++ { ++ s.defaultWriteObject (); ++ AWTEventMulticaster.save (s, "containerL", containerListener); ++ if (focusTraversalPolicy instanceof Serializable) ++ s.writeObject (focusTraversalPolicy); ++ else ++ s.writeObject (null); ++ } ++ + // Nested classes. + + /* The following classes are used in concert with the +@@ -1516,7 +1817,7 @@ + (ACCESSIBLE_CHILD_PROPERTY, e.getChild(), null); + } + } // class AccessibleContainerHandler +- } // class AccessibleAWTPanel ++ } // class AccessibleAWTContainer + } // class Container + + /** +@@ -1530,122 +1831,156 @@ + { + private static final long serialVersionUID = 5184291520170872969L; + private Container nativeContainer; +- private Component focus; + private Cursor nativeCursor; + private long eventMask; + + private transient Component mouseEventTarget; ++ private transient Component pressedComponent; ++ private transient Component lastComponentEntered; ++ private transient int pressCount; + + LightweightDispatcher(Container c) + { + nativeContainer = c; + } + +- void dispose() +- { +- } +- +- void enableEvents(long l) +- { +- eventMask |= l; +- } +- +- void mouseExit (MouseEvent me, int x, int y) +- { +- } +- +- void acquireComponentForMouseEvent (MouseEvent me) ++ void acquireComponentForMouseEvent(MouseEvent me) + { + int x = me.getX (); + int y = me.getY (); + +- Component candidate = mouseEventTarget; +- +- boolean candidate_is_container_with_children = +- ((candidate != null) +- && (candidate instanceof Container) +- && (((Container)candidate).getComponentCount () > 0)); +- +- boolean candidate_does_not_contain_point = +- ((candidate != null) +- && (! candidate.contains (x - candidate.getX (), +- y - candidate.getY ()))); +- +- if (candidate == null +- || candidate_is_container_with_children +- || candidate_does_not_contain_point) +- { +- // Try to reacquire. +- candidate = nativeContainer.findComponentAt (x, y); +- } +- +- if (mouseEventTarget != null +- && mouseEventTarget != candidate) +- { +- int nx = x - mouseEventTarget.getX (); +- int ny = y - mouseEventTarget.getY (); +- MouseEvent exited = new MouseEvent (mouseEventTarget, +- MouseEvent.MOUSE_EXITED, +- me.getWhen (), +- me.getModifiers (), +- nx, ny, +- me.getClickCount (), +- me.isPopupTrigger (), +- me.getButton ()); +- mouseEventTarget.dispatchEvent (exited); +- mouseEventTarget = null; +- } ++ // Find the candidate which should receive this event. ++ Component parent = nativeContainer; ++ Component candidate = null; ++ Point p = me.getPoint(); ++ while (candidate == null && parent != null) ++ { ++ candidate = ++ SwingUtilities.getDeepestComponentAt(parent, p.x, p.y); ++ if (candidate == null || (candidate.eventMask & me.getID()) == 0) ++ { ++ candidate = null; ++ p = SwingUtilities.convertPoint(parent, p.x, p.y, parent.parent); ++ parent = parent.parent; ++ } ++ } + ++ // If the only candidate we found was the native container itself, ++ // don't dispatch any event at all. We only care about the lightweight ++ // children here. ++ if (candidate == nativeContainer) ++ candidate = null; ++ ++ // If our candidate is new, inform the old target we're leaving. ++ if (lastComponentEntered != null ++ && lastComponentEntered.isShowing() ++ && lastComponentEntered != candidate) ++ { ++ // Old candidate could have been removed from ++ // the nativeContainer so we check first. ++ if (SwingUtilities.isDescendingFrom(lastComponentEntered, nativeContainer)) ++ { ++ Point tp = ++ SwingUtilities.convertPoint(nativeContainer, ++ x, y, lastComponentEntered); ++ MouseEvent exited = new MouseEvent (lastComponentEntered, ++ MouseEvent.MOUSE_EXITED, ++ me.getWhen (), ++ me.getModifiersEx (), ++ tp.x, tp.y, ++ me.getClickCount (), ++ me.isPopupTrigger (), ++ me.getButton ()); ++ lastComponentEntered.dispatchEvent (exited); ++ } ++ lastComponentEntered = null; ++ } ++ // If we have a candidate, maybe enter it. + if (candidate != null) +- { +- // Possibly set new state. ++ { ++ mouseEventTarget = candidate; + if (candidate.isLightweight() ++ && candidate.isShowing() + && candidate != nativeContainer +- && candidate != mouseEventTarget) +- { +- +- mouseEventTarget = candidate; +- +- int nx = x - mouseEventTarget.getX (); +- int ny = y - mouseEventTarget.getY (); +- +- // If acquired, enter it. +- MouseEvent entered = new MouseEvent (mouseEventTarget, ++ && candidate != lastComponentEntered) ++ { ++ lastComponentEntered = mouseEventTarget; ++ Point cp = SwingUtilities.convertPoint(nativeContainer, ++ x, y, lastComponentEntered); ++ MouseEvent entered = new MouseEvent (lastComponentEntered, + MouseEvent.MOUSE_ENTERED, + me.getWhen (), +- me.getModifiers (), +- nx, ny, ++ me.getModifiersEx (), ++ cp.x, cp.y, + me.getClickCount (), + me.isPopupTrigger (), + me.getButton ()); +- mouseEventTarget.dispatchEvent (entered); ++ lastComponentEntered.dispatchEvent (entered); + } +- } ++ } ++ ++ if (me.getID() == MouseEvent.MOUSE_RELEASED ++ || me.getID() == MouseEvent.MOUSE_PRESSED && pressCount > 0 ++ || me.getID() == MouseEvent.MOUSE_DRAGGED) ++ // If any of the following events occur while a button is held down, ++ // they should be dispatched to the same component to which the ++ // original MOUSE_PRESSED event was dispatched: ++ // - MOUSE_RELEASED ++ // - MOUSE_PRESSED: another button pressed while the first is held down ++ // - MOUSE_DRAGGED ++ if (SwingUtilities.isDescendingFrom(pressedComponent, nativeContainer)) ++ mouseEventTarget = pressedComponent; ++ else if (me.getID() == MouseEvent.MOUSE_CLICKED) ++ { ++ // Don't dispatch CLICKED events whose target is not the same as the ++ // target for the original PRESSED event. ++ if (candidate != pressedComponent) ++ mouseEventTarget = null; ++ else if (pressCount == 0) ++ pressedComponent = null; ++ } + } + +- boolean handleEvent (AWTEvent e) ++ boolean handleEvent(AWTEvent e) + { +- if ((eventMask & e.getID ()) == 0) +- return false; +- + if (e instanceof MouseEvent) +- { ++ { + MouseEvent me = (MouseEvent) e; +- acquireComponentForMouseEvent (me); + +- if (mouseEventTarget != null) ++ acquireComponentForMouseEvent(me); ++ ++ // Avoid dispatching ENTERED and EXITED events twice. ++ if (mouseEventTarget != null ++ && mouseEventTarget.isShowing() ++ && e.getID() != MouseEvent.MOUSE_ENTERED ++ && e.getID() != MouseEvent.MOUSE_EXITED) + { +- Component oldSource = (Component) me.getSource (); +- me.setSource (mouseEventTarget); +- mouseEventTarget.dispatchEvent (me); +- me.setSource (oldSource); ++ MouseEvent newEvt = ++ SwingUtilities.convertMouseEvent(nativeContainer, me, ++ mouseEventTarget); ++ mouseEventTarget.dispatchEvent(newEvt); ++ ++ switch (e.getID()) ++ { ++ case MouseEvent.MOUSE_PRESSED: ++ if (pressCount++ == 0) ++ pressedComponent = mouseEventTarget; ++ break; ++ ++ case MouseEvent.MOUSE_RELEASED: ++ // Clear our memory of the original PRESSED event, only if ++ // we're not expecting a CLICKED event after this. If ++ // there is a CLICKED event after this, it will do clean up. ++ if (--pressCount == 0 ++ && mouseEventTarget != pressedComponent) ++ pressedComponent = null; ++ break; ++ } ++ if (newEvt.isConsumed()) ++ e.consume(); + } +- } +- else if (e instanceof KeyEvent && focus != null) +- { +- focus.processKeyEvent ((KeyEvent) e); +- } +- ++ } ++ + return e.isConsumed(); + } + +Index: java/awt/ContainerOrderFocusTraversalPolicy.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/ContainerOrderFocusTraversalPolicy.java,v +retrieving revision 1.5 +diff -u -r1.5 ContainerOrderFocusTraversalPolicy.java +--- java/awt/ContainerOrderFocusTraversalPolicy.java 24 Mar 2003 13:50:32 -0000 1.5 ++++ java/awt/ContainerOrderFocusTraversalPolicy.java 6 Sep 2004 16:35:43 -0000 +@@ -41,7 +41,23 @@ + import java.io.Serializable; + + /** ++ * ContainerOrderFocusTraversalPolicy defines a focus traversal order ++ * based on the order in which Components were packed in a Container. ++ * This policy performs a pre-order traversal of the Component ++ * hierarchy starting from a given focus cycle root. Portions of the ++ * hierarchy that are not visible and displayable are skipped. ++ * ++ * By default, this policy transfers focus down-cycle implicitly. ++ * That is, if a forward traversal is requested on a focus cycle root ++ * and the focus cycle root has focusable children, the focus will ++ * automatically be transfered down to the lower focus cycle. ++ * ++ * The default implementation of accept accepts only Components that ++ * are visible, displayable, enabled and focusable. Derived classes ++ * can override these acceptance criteria by overriding accept. ++ * + * @author Michael Koch ++ * @author Thomas Fitzsimmons + * @since 1.4 + */ + public class ContainerOrderFocusTraversalPolicy extends FocusTraversalPolicy +@@ -52,12 +68,15 @@ + */ + static final long serialVersionUID = 486933713763926351L; + ++ /** ++ * True if implicit down cycling is enabled. ++ */ + private boolean implicitDownCycleTraversal = true; + + /** + * Creates the ContainerOrderFocusTraversalPolicy object. + */ +- public ContainerOrderFocusTraversalPolicy() ++ public ContainerOrderFocusTraversalPolicy () + { + // Nothing to do here + } +@@ -66,37 +85,196 @@ + * Returns the Component that should receive the focus after current. + * root must be a focus cycle root of current. + * ++ * @param root a focus cycle root of current ++ * @param current a (possibly indirect) child of root, or root itself ++ * ++ * @return the next Component in the focus traversal order for root, ++ * or null if no acceptable Component exists. ++ * + * @exception IllegalArgumentException If root is not a focus cycle + * root of current, or if either root or current is null. + */ +- public Component getComponentAfter(Container root, Component current) ++ public Component getComponentAfter (Container root, Component current) + { +- if (root == null +- || current == null) +- throw new IllegalArgumentException (); +- +- return null; ++ if (root == null) ++ throw new IllegalArgumentException ("focus cycle root is null"); ++ if (current == null) ++ throw new IllegalArgumentException ("current component is null"); ++ ++ if (!root.isFocusCycleRoot ()) ++ throw new IllegalArgumentException ("root is not a focus cycle root"); ++ ++ Container ancestor = current.getFocusCycleRootAncestor (); ++ Container prevAncestor = ancestor; ++ while (ancestor != root) ++ { ++ ancestor = current.getFocusCycleRootAncestor (); ++ if (ancestor == prevAncestor) ++ { ++ // We've reached the top focus cycle root ancestor. Check ++ // if it is root. ++ if (ancestor != root) ++ throw new IllegalArgumentException ("the given container is not" ++ + " a focus cycle root of the" ++ + " current component"); ++ else ++ break; ++ } ++ prevAncestor = ancestor; ++ } ++ ++ // FIXME: is this the right thing to do here? It moves the context ++ // for traversal up one focus traversal cycle. We'll need a test ++ // for this. ++ if ((Component) root == current) ++ root = current.getFocusCycleRootAncestor (); ++ ++ // Check if we've reached the top of the component hierarchy. If ++ // so then we want to loop around to the first component in the ++ // focus traversal cycle. ++ if (current instanceof Window) ++ return getFirstComponent ((Container) current); ++ ++ Container parent = current.getParent (); ++ ++ synchronized (parent.getTreeLock ()) ++ { ++ Component[] components = parent.getComponents (); ++ int componentIndex = 0; ++ int numComponents = parent.getComponentCount (); ++ ++ // Find component's index. ++ for (int i = 0; i < numComponents; i++) ++ { ++ if (components[i] == current) ++ componentIndex = i; ++ } ++ ++ // Search forward for the next acceptable component. ++ for (int i = componentIndex + 1; i < numComponents; i++) ++ { ++ if (accept (components[i])) ++ return components[i]; ++ ++ if (components[i] instanceof Container) ++ { ++ Component result = getFirstComponent ((Container) components[i]); ++ ++ if (result != null ++ && implicitDownCycleTraversal) ++ return result; ++ } ++ } ++ ++ // No focusable components after current in its Container. So go ++ // to the next Component after current's Container (parent). ++ Component result = getComponentAfter (root, parent); ++ ++ return result; ++ } + } + + /** +- * Returns the Component that should receive the focus before current. +- * root must be a focus cycle root of current. ++ * Returns the Component that should receive the focus before ++ * current. root must be a focus cycle ++ * root of current. ++ * ++ * @param root a focus cycle root of current ++ * @param current a (possibly indirect) child of root, or root itself ++ * ++ * @return the previous Component in the focus traversal order for ++ * root, or null if no acceptable Component exists. + * + * @exception IllegalArgumentException If root is not a focus cycle + * root of current, or if either root or current is null. + */ +- public Component getComponentBefore(Container root, Component current) ++ public Component getComponentBefore (Container root, Component current) + { +- if (root == null +- || current == null) +- throw new IllegalArgumentException (); ++ if (root == null) ++ throw new IllegalArgumentException ("focus cycle root is null"); ++ if (current == null) ++ throw new IllegalArgumentException ("current component is null"); ++ ++ if (!root.isFocusCycleRoot ()) ++ throw new IllegalArgumentException ("root is not a focus cycle root"); ++ ++ Container ancestor = current.getFocusCycleRootAncestor (); ++ Container prevAncestor = ancestor; ++ while (ancestor != root) ++ { ++ ancestor = current.getFocusCycleRootAncestor (); ++ if (ancestor == prevAncestor) ++ { ++ // We've reached the top focus cycle root ancestor. Check ++ // if it is root. ++ if (ancestor != root) ++ throw new IllegalArgumentException ("the given container is not" ++ + " a focus cycle root of the" ++ + " current component"); ++ else ++ break; ++ } ++ prevAncestor = ancestor; ++ } + +- return null; ++ // FIXME: is this the right thing to do here? It moves the context ++ // for traversal up one focus traversal cycle. We'll need a test ++ // for this. ++ if ((Component) root == current) ++ root = current.getFocusCycleRootAncestor (); ++ ++ // Check if we've reached the top of the component hierarchy. If ++ // so then we want to loop around to the last component in the ++ // focus traversal cycle. ++ if (current instanceof Window) ++ return getLastComponent ((Container) current); ++ ++ Container parent = current.getParent (); ++ ++ synchronized (parent.getTreeLock ()) ++ { ++ Component[] components = parent.getComponents (); ++ int componentIndex = 0; ++ int numComponents = parent.getComponentCount (); ++ ++ // Find component's index. ++ for (int i = 0; i < numComponents; i++) ++ { ++ if (components[i] == current) ++ componentIndex = i; ++ } ++ ++ // Search backward for the next acceptable component. ++ for (int i = componentIndex - 1; i >= 0; i--) ++ { ++ if (accept (components[i])) ++ return components[i]; ++ ++ if (components[i] instanceof Container) ++ { ++ Component result = getLastComponent ((Container) components[i]); ++ ++ if (result != null) ++ return result; ++ } ++ } ++ ++ // No focusable components before current in its Container. So go ++ // to the previous Component before current's Container (parent). ++ Component result = getComponentBefore (root, parent); ++ ++ return result; ++ } + } + + /** + * Returns the first Component of root that should receive the focus. + * ++ * @param root a focus cycle root ++ * ++ * @return the first Component in the focus traversal order for ++ * root, or null if no acceptable Component exists. ++ * + * @exception IllegalArgumentException If root is null. + */ + public Component getFirstComponent(Container root) +@@ -117,18 +295,16 @@ + { + Component component = componentArray [i]; + ++ if (accept (component)) ++ return component; ++ + if (component instanceof Container) + { +- Component result = getLastComponent ((Container) component); ++ Component result = getFirstComponent ((Container) component); + + if (result != null) + return result; + } +- else +- { +- if (accept (component)) +- return component; +- } + } + + return null; +@@ -137,9 +313,14 @@ + /** + * Returns the last Component of root that should receive the focus. + * ++ * @param root a focus cycle root ++ * ++ * @return the last Component in the focus traversal order for ++ * root, or null if no acceptable Component exists. ++ * + * @exception IllegalArgumentException If root is null. + */ +- public Component getLastComponent(Container root) ++ public Component getLastComponent (Container root) + { + if (root == null) + throw new IllegalArgumentException (); +@@ -153,10 +334,13 @@ + + Component[] componentArray = root.getComponents (); + +- for (int i = componentArray.length - 1; i >= 0; i++) ++ for (int i = componentArray.length - 1; i >= 0; i--) + { + Component component = componentArray [i]; + ++ if (accept (component)) ++ return component; ++ + if (component instanceof Container) + { + Component result = getLastComponent ((Container) component); +@@ -164,11 +348,6 @@ + if (result != null) + return result; + } +- else +- { +- if (accept (component)) +- return component; +- } + } + + return null; +@@ -177,28 +356,58 @@ + /** + * Returns the default Component of root that should receive the focus. + * ++ * @param root a focus cycle root ++ * ++ * @return the default Component in the focus traversal order for ++ * root, or null if no acceptable Component exists. ++ * + * @exception IllegalArgumentException If root is null. + */ +- public Component getDefaultComponent(Container root) ++ public Component getDefaultComponent (Container root) + { + return getFirstComponent (root); + } + +- public void setImplicitDownCycleTraversal(boolean value) ++ /** ++ * Set whether or not implicit down cycling is enabled. If it is, ++ * then initiating a forward focus traversal operation onto a focus ++ * cycle root, the focus will be implicitly transferred into the ++ * root container's focus cycle. ++ * ++ * @param value the setting for implicit down cycling ++ */ ++ public void setImplicitDownCycleTraversal (boolean value) + { + implicitDownCycleTraversal = value; + } + +- public boolean getImplicitDownCycleTraversal() ++ /** ++ * Check whether or not implicit down cycling is enabled. If it is, ++ * then initiating a forward focus traversal operation onto a focus ++ * cycle root, the focus will be implicitly transferred into the ++ * root container's focus cycle. ++ * ++ * @return true if the focus will be transferred down-cycle ++ * implicitly ++ */ ++ public boolean getImplicitDownCycleTraversal () + { + return implicitDownCycleTraversal; + } + +- protected boolean accept(Component current) ++ /** ++ * Check whether the given Component is an acceptable target for the ++ * keyboard input focus. ++ * ++ * @param current the Component to check ++ * ++ * @return true if current is acceptable, false otherwise ++ */ ++ protected boolean accept (Component current) + { + return (current.visible +- && current.isDisplayable() ++ && current.isDisplayable () + && current.enabled + && current.focusable); + } +-} // class ContainerOrderFocusTraversalPolicy ++} +Index: java/awt/DefaultFocusTraversalPolicy.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/DefaultFocusTraversalPolicy.java,v +retrieving revision 1.1 +diff -u -r1.1 DefaultFocusTraversalPolicy.java +--- java/awt/DefaultFocusTraversalPolicy.java 9 Aug 2002 04:26:14 -0000 1.1 ++++ java/awt/DefaultFocusTraversalPolicy.java 6 Sep 2004 16:35:43 -0000 +@@ -39,17 +39,71 @@ + package java.awt; + + /** +- * STUB CLASS ONLY ++ * DefaultFocusTraversalPolicy is the default focus traversal policy ++ * used by Containers. ++ * ++ * This policy sharpens ContainerOrderFocusTraversalPolicy's ++ * acceptance criteria, to reject those Components that have ++ * unfocusable peers. Despite this extra strictness, this policy will ++ * always accept a Component that has explicitly been set focusable by ++ * any means. ++ * ++ * This AWT implementation assumes that the peers of the following ++ * Components are not focusable: Canvas, Panel, Label, ScrollPane, ++ * Scrollbar, Window, and any lightweight Component. ++ * ++ * A Component's focusability is independent of the focusability of ++ * its peer. ++ * ++ * @author Thomas Fitzsimmons ++ * @since 1.4 + */ + public class DefaultFocusTraversalPolicy + extends ContainerOrderFocusTraversalPolicy + { +- public DefaultFocusTraversalPolicy() ++ /** ++ * Construct a default focus traversal policy. ++ */ ++ public DefaultFocusTraversalPolicy () + { + } + +- protected boolean accept(Component comp) ++ /** ++ * Check whether a given Component would be acceptable as a focus ++ * owner. The Component must be displayable, visible and enabled to ++ * be acceptable. If the Component's focus traversability has been ++ * overridden, by overriding Component.isFocusTraversable or ++ * Component.isFocusable, or by calling Component.setFocusable, then ++ * the Component will be accepted if it is focusable. If the ++ * Component uses the default focus traversable behaviour, then ++ * comp will always be rejected if it is a Canvas, ++ * Panel, Label, ScrollPane, Scrollbar, Window or lightweight ++ * Component. ++ * ++ * @param comp the Component to check ++ * ++ * @return true if the Component is an acceptable target for ++ * keyboard input focus, false otherwise ++ */ ++ protected boolean accept (Component comp) + { +- throw new Error("not implemented"); ++ if (comp.visible ++ && comp.isDisplayable () ++ && comp.enabled) ++ { ++ if (comp.isFocusTraversableOverridden != 0 ++ && (comp.isFocusTraversable () || comp.isFocusable())) ++ return true; ++ ++ if (!(comp instanceof Canvas ++ || comp instanceof Panel ++ || comp instanceof Label ++ || comp instanceof ScrollPane ++ || comp instanceof Scrollbar ++ || comp instanceof Window ++ || comp.isLightweight ())) ++ return true; ++ } ++ return false; + } +-} // class DefaultFocusTraversalPolicy ++} +Index: java/awt/DefaultKeyboardFocusManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/DefaultKeyboardFocusManager.java,v +retrieving revision 1.1 +diff -u -r1.1 DefaultKeyboardFocusManager.java +--- java/awt/DefaultKeyboardFocusManager.java 9 Aug 2002 04:26:14 -0000 1.1 ++++ java/awt/DefaultKeyboardFocusManager.java 6 Sep 2004 16:35:44 -0000 +@@ -38,59 +38,459 @@ + + package java.awt; + +-import java.awt.event.KeyEvent; ++import java.util.*; ++import java.awt.event.*; + +-/** +- * STUB CLASS ONLY +- */ ++// FIXME: finish documentation + public class DefaultKeyboardFocusManager extends KeyboardFocusManager + { +- public DefaultKeyboardFocusManager() ++ /** ++ * This class models a request to delay the dispatch of events that ++ * arrive after a certain time, until a certain component becomes ++ * the focus owner. ++ */ ++ private class EventDelayRequest implements Comparable ++ { ++ /** A {@link java.util.List} of {@link java.awt.event.KeyEvent}s ++ that are being delayed, pending this request's {@link ++ Component} receiving the keyboard focus. */ ++ private LinkedList enqueuedKeyEvents = new LinkedList (); ++ ++ /** An event timestamp. All events that arrive after this time ++ should be queued in the {@link #enqueuedKeyEvents} {@link ++ java.util.List}. */ ++ public long timestamp; ++ /** When this {@link Component} becomes focused, all events ++ between this EventDelayRequest and the next one in will be ++ dispatched from {@link #enqueuedKeyEvents}. */ ++ public Component focusedComp; ++ ++ /** ++ * Construct a new EventDelayRequest. ++ * ++ * @param timestamp events that arrive after this time will be ++ * delayed ++ * @param focusedComp the Component that needs to receive focus ++ * before events are dispatched ++ */ ++ public EventDelayRequest (long timestamp, Component focusedComp) ++ { ++ this.timestamp = timestamp; ++ this.focusedComp = focusedComp; ++ } ++ ++ public int compareTo (Object o) ++ { ++ if (!(o instanceof EventDelayRequest)) ++ throw new ClassCastException (); ++ ++ EventDelayRequest request = (EventDelayRequest) o; ++ ++ if (request.timestamp < timestamp) ++ return -1; ++ else if (request.timestamp == timestamp) ++ return 0; ++ else ++ return 1; ++ } ++ ++ public boolean equals (Object o) ++ { ++ if (!(o instanceof EventDelayRequest) || o == null) ++ return false; ++ ++ EventDelayRequest request = (EventDelayRequest) o; ++ ++ return (request.timestamp == timestamp ++ && request.focusedComp == focusedComp); ++ } ++ ++ public void enqueueEvent (KeyEvent e) ++ { ++ KeyEvent last = (KeyEvent) enqueuedKeyEvents.getLast (); ++ if (last != null && e.getWhen () < last.getWhen ()) ++ throw new RuntimeException ("KeyEvents enqueued out-of-order"); ++ ++ if (e.getWhen () <= timestamp) ++ throw new RuntimeException ("KeyEvents enqueued before starting timestamp"); ++ ++ enqueuedKeyEvents.add (e); ++ } ++ ++ public void dispatchEvents () ++ { ++ int size = enqueuedKeyEvents.size (); ++ for (int i = 0; i < size; i++) ++ { ++ KeyEvent e = (KeyEvent) enqueuedKeyEvents.remove (0); ++ dispatchKeyEvent (e); ++ } ++ } ++ ++ public void discardEvents () ++ { ++ enqueuedKeyEvents.clear (); ++ } ++ } ++ ++ /** The {@link java.util.SortedSet} of current {@link ++ #EventDelayRequest}s. */ ++ private SortedSet delayRequests = new TreeSet (); ++ ++ public DefaultKeyboardFocusManager () + { + } + +- public boolean dispatchEvent(AWTEvent e) ++ public boolean dispatchEvent (AWTEvent e) ++ { ++ if (e instanceof WindowEvent) ++ { ++ Window target = (Window) e.getSource (); ++ ++ if (e.id == WindowEvent.WINDOW_ACTIVATED) ++ setGlobalActiveWindow (target); ++ else if (e.id == WindowEvent.WINDOW_GAINED_FOCUS) ++ setGlobalFocusedWindow (target); ++ else if (e.id != WindowEvent.WINDOW_LOST_FOCUS ++ && e.id != WindowEvent.WINDOW_DEACTIVATED) ++ return false; ++ ++ redispatchEvent(target, e); ++ return true; ++ } ++ else if (e instanceof FocusEvent) ++ { ++ Component target = (Component) e.getSource (); ++ ++ if (e.id == FocusEvent.FOCUS_GAINED) ++ { ++ if (((FocusEvent) e).isTemporary ()) ++ setGlobalFocusOwner (target); ++ else ++ setGlobalPermanentFocusOwner (target); ++ } ++ else if (e.id == FocusEvent.FOCUS_LOST) ++ { ++ // We need to set the window's focus owner here; we can't ++ // set it when the window loses focus because by that time ++ // the previous focus owner has already lost focus ++ // (FOCUS_LOST events are delivered before ++ // WINDOW_LOST_FOCUS events). ++ ++ // Find the target Component's top-level ancestor. ++ Container parent = target.getParent (); ++ ++ while (parent != null ++ && !(parent instanceof Window)) ++ parent = parent.getParent (); ++ ++ Window toplevel = parent == null ? ++ (Window) target : (Window) parent; ++ ++ Component focusOwner = getFocusOwner (); ++ if (focusOwner != null) ++ toplevel.setFocusOwner (focusOwner); ++ ++ if (((FocusEvent) e).isTemporary ()) ++ setGlobalFocusOwner (null); ++ else ++ setGlobalPermanentFocusOwner (null); ++ } ++ ++ redispatchEvent(target, e); ++ ++ return true; ++ } ++ else if (e instanceof KeyEvent) ++ { ++ // Loop through all registered KeyEventDispatchers, giving ++ // each a chance to handle this event. ++ Iterator i = getKeyEventDispatchers().iterator(); ++ ++ while (i.hasNext ()) ++ { ++ KeyEventDispatcher dispatcher = (KeyEventDispatcher) i.next (); ++ if (dispatcher.dispatchKeyEvent ((KeyEvent) e)) ++ return true; ++ } ++ ++ // processKeyEvent checks if this event represents a focus ++ // traversal key stroke. ++ Component focusOwner = getGlobalPermanentFocusOwner (); ++ ++ if (focusOwner != null) ++ processKeyEvent (focusOwner, (KeyEvent) e); ++ ++ if (e.isConsumed ()) ++ return true; ++ ++ if (enqueueKeyEvent ((KeyEvent) e)) ++ // This event was enqueued for dispatch at a later time. ++ return true; ++ else ++ // This event wasn't handled by any of the registered ++ // KeyEventDispatchers, and wasn't enqueued for dispatch ++ // later, so send it to the default dispatcher. ++ return dispatchKeyEvent ((KeyEvent) e); ++ } ++ ++ return false; ++ } ++ ++ private boolean enqueueKeyEvent (KeyEvent e) + { +- throw new Error("not implemented"); ++ Iterator i = delayRequests.iterator (); ++ boolean oneEnqueued = false; ++ while (i.hasNext ()) ++ { ++ EventDelayRequest request = (EventDelayRequest) i.next (); ++ if (e.getWhen () > request.timestamp) ++ { ++ request.enqueueEvent (e); ++ oneEnqueued = true; ++ } ++ } ++ return oneEnqueued; + } +- public boolean dispatchKeyEvent(KeyEvent e) ++ ++ public boolean dispatchKeyEvent (KeyEvent e) + { +- throw new Error("not implemented"); ++ Component focusOwner = getGlobalPermanentFocusOwner (); ++ ++ if (focusOwner != null) ++ redispatchEvent(focusOwner, e); ++ ++ // Loop through all registered KeyEventPostProcessors, giving ++ // each a chance to process this event. ++ Iterator i = getKeyEventPostProcessors().iterator(); ++ ++ while (i.hasNext ()) ++ { ++ KeyEventPostProcessor processor = (KeyEventPostProcessor) i.next (); ++ if (processor.postProcessKeyEvent ((KeyEvent) e)) ++ return true; ++ } ++ ++ // The event hasn't been consumed yet. Check if it is an ++ // MenuShortcut. ++ if (postProcessKeyEvent (e)) ++ return true; ++ ++ // Always return true. ++ return true; + } +- public boolean postProcessKeyEvent(KeyEvent e) ++ ++ public boolean postProcessKeyEvent (KeyEvent e) + { +- throw new Error("not implemented"); ++ // Check if this event represents a menu shortcut. ++ ++ // MenuShortcuts are activated by Ctrl- KeyEvents, only on KEY_PRESSED. ++ int modifiers = e.getModifiersEx (); ++ if (e.getID() == KeyEvent.KEY_PRESSED ++ && (modifiers & KeyEvent.CTRL_DOWN_MASK) != 0) ++ { ++ Window focusedWindow = getGlobalFocusedWindow (); ++ if (focusedWindow instanceof Frame) ++ { ++ MenuBar menubar = ((Frame) focusedWindow).getMenuBar (); ++ ++ if (menubar != null) ++ { ++ // If there's a menubar, loop through all menu items, ++ // checking whether each one has a shortcut, and if ++ // so, whether this key event should activate it. ++ int numMenus = menubar.getMenuCount (); ++ ++ for (int i = 0; i < numMenus; i++) ++ { ++ Menu menu = menubar.getMenu (i); ++ int numItems = menu.getItemCount (); ++ ++ for (int j = 0; j < numItems; j++) ++ { ++ MenuItem item = menu.getItem (j); ++ MenuShortcut shortcut = item.getShortcut (); ++ ++ if (item.isEnabled() && shortcut != null) ++ { ++ // Dispatch a new ActionEvent if: ++ // ++ // a) this is a Shift- KeyEvent, and the ++ // shortcut requires the Shift modifier ++ // ++ // or, b) this is not a Shift- KeyEvent, and the ++ // shortcut does not require the Shift ++ // modifier. ++ if (shortcut.getKey () == e.getKeyCode () ++ && ((shortcut.usesShiftModifier () ++ && (modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0) ++ || (! shortcut.usesShiftModifier () ++ && (modifiers & KeyEvent.SHIFT_DOWN_MASK) == 0))) ++ { ++ item.dispatchEvent (new ActionEvent (item, ++ ActionEvent.ACTION_PERFORMED, ++ item.getActionCommand (), ++ modifiers)); ++ // The event was dispatched. ++ return true; ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++ return false; + } +- public void processKeyEvent(Component comp, KeyEvent e) ++ ++ public void processKeyEvent (Component comp, KeyEvent e) + { +- throw new Error("not implemented"); ++ AWTKeyStroke eventKeystroke = AWTKeyStroke.getAWTKeyStrokeForEvent (e); ++ // For every focus traversal keystroke, we need to also consume ++ // the other two key event types for the same key (e.g. if ++ // KEY_PRESSED TAB is a focus traversal keystroke, we also need to ++ // consume KEY_RELEASED and KEY_TYPED TAB key events). ++ AWTKeyStroke oppositeKeystroke = AWTKeyStroke.getAWTKeyStroke (e.getKeyCode (), ++ e.getModifiersEx (), ++ !(e.id == KeyEvent.KEY_RELEASED)); ++ ++ Set forwardKeystrokes = comp.getFocusTraversalKeys (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); ++ Set backwardKeystrokes = comp.getFocusTraversalKeys (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); ++ Set upKeystrokes = comp.getFocusTraversalKeys (KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS); ++ Set downKeystrokes = null; ++ if (comp instanceof Container) ++ downKeystrokes = comp.getFocusTraversalKeys (KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS); ++ ++ if (forwardKeystrokes.contains (eventKeystroke)) ++ { ++ focusNextComponent (comp); ++ e.consume (); ++ } ++ else if (backwardKeystrokes.contains (eventKeystroke)) ++ { ++ focusPreviousComponent (comp); ++ e.consume (); ++ } ++ else if (upKeystrokes.contains (eventKeystroke)) ++ { ++ upFocusCycle (comp); ++ e.consume (); ++ } ++ else if (comp instanceof Container ++ && downKeystrokes.contains (eventKeystroke)) ++ { ++ downFocusCycle ((Container) comp); ++ e.consume (); ++ } ++ else if (forwardKeystrokes.contains (oppositeKeystroke) ++ || backwardKeystrokes.contains (oppositeKeystroke) ++ || upKeystrokes.contains (oppositeKeystroke) ++ || (comp instanceof Container && ++ downKeystrokes.contains (oppositeKeystroke))) ++ e.consume (); + } +- protected void enqueueKeyEvents(long after, Component comp) ++ ++ protected void enqueueKeyEvents (long after, Component untilFocused) + { +- throw new Error("not implemented"); ++ delayRequests.add (new EventDelayRequest (after, untilFocused)); + } +- protected void dequeueKeyEvents(long after, Component comp) ++ ++ protected void dequeueKeyEvents (long after, Component untilFocused) + { +- throw new Error("not implemented"); ++ // FIXME: need synchronization on delayRequests and enqueuedKeyEvents. ++ ++ // Remove the KeyEvent with the oldest timestamp, which should be ++ // the first element in the SortedSet. ++ if (after < 0) ++ { ++ int size = delayRequests.size (); ++ if (size > 0) ++ delayRequests.remove (delayRequests.first ()); ++ } ++ else ++ { ++ EventDelayRequest template = new EventDelayRequest (after, untilFocused); ++ if (delayRequests.contains (template)) ++ { ++ EventDelayRequest actual = (EventDelayRequest) delayRequests.tailSet (template).first (); ++ delayRequests.remove (actual); ++ actual.dispatchEvents (); ++ } ++ } + } +- protected void discardKeyEvents(Component comp) ++ ++ protected void discardKeyEvents (Component comp) + { +- throw new Error("not implemented"); ++ // FIXME: need synchronization on delayRequests and enqueuedKeyEvents. ++ ++ Iterator i = delayRequests.iterator (); ++ ++ while (i.hasNext ()) ++ { ++ EventDelayRequest request = (EventDelayRequest) i.next (); ++ ++ if (request.focusedComp == comp ++ || (comp instanceof Container ++ && ((Container) comp).isAncestorOf (request.focusedComp))) ++ request.discardEvents (); ++ } + } +- public void focusPreviousComponent(Component comp) ++ ++ public void focusPreviousComponent (Component comp) + { +- throw new Error("not implemented"); ++ Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp; ++ Container focusCycleRoot = focusComp.getFocusCycleRootAncestor (); ++ FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy (); ++ ++ Component previous = policy.getComponentBefore (focusCycleRoot, focusComp); ++ if (previous != null) ++ previous.requestFocusInWindow (); + } +- public void focusNextComponent(Component comp) ++ ++ public void focusNextComponent (Component comp) + { +- throw new Error("not implemented"); ++ Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp; ++ Container focusCycleRoot = focusComp.getFocusCycleRootAncestor (); ++ FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy (); ++ ++ Component next = policy.getComponentAfter (focusCycleRoot, focusComp); ++ if (next != null) ++ next.requestFocusInWindow (); + } +- public void upFocusCycle(Component comp) ++ ++ public void upFocusCycle (Component comp) + { +- throw new Error("not implemented"); ++ Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp; ++ Container focusCycleRoot = focusComp.getFocusCycleRootAncestor (); ++ ++ if (focusCycleRoot instanceof Window) ++ { ++ FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy (); ++ Component defaultComponent = policy.getDefaultComponent (focusCycleRoot); ++ if (defaultComponent != null) ++ defaultComponent.requestFocusInWindow (); ++ } ++ else ++ { ++ Container parentFocusCycleRoot = focusCycleRoot.getFocusCycleRootAncestor (); ++ ++ focusCycleRoot.requestFocusInWindow (); ++ setGlobalCurrentFocusCycleRoot (parentFocusCycleRoot); ++ } + } +- public void downFocusCycle(Container cont) ++ ++ public void downFocusCycle (Container cont) + { +- throw new Error("not implemented"); ++ if (cont == null) ++ return; ++ ++ if (cont.isFocusCycleRoot (cont)) ++ { ++ FocusTraversalPolicy policy = cont.getFocusTraversalPolicy (); ++ Component defaultComponent = policy.getDefaultComponent (cont); ++ if (defaultComponent != null) ++ defaultComponent.requestFocusInWindow (); ++ setGlobalCurrentFocusCycleRoot (cont); ++ } + } + } // class DefaultKeyboardFocusManager +Index: java/awt/Dialog.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Dialog.java,v +retrieving revision 1.13 +diff -u -r1.13 Dialog.java +--- java/awt/Dialog.java 13 Jan 2004 02:56:18 -0000 1.13 ++++ java/awt/Dialog.java 6 Sep 2004 16:35:44 -0000 +@@ -123,8 +123,8 @@ + * parent and modality, that is resizable and which has no title. + * + * @param parent The parent frame of this dialog box. +- * @param modal if this dialog box is modal, false +- * otherwise. ++ * @param modal true if this dialog box is modal, ++ * false otherwise. + * + * @exception IllegalArgumentException If the owner's GraphicsConfiguration + * is not from a screen device, or if owner is null. This exception is always +@@ -164,8 +164,8 @@ + * + * @param parent The parent frame of this dialog box. + * @param title The title string for this dialog box. +- * @param modal if this dialog box is modal, false +- * otherwise. ++ * @param modal true if this dialog box is modal, ++ * false otherwise. + * + * @exception IllegalArgumentException If owner is null or + * GraphicsEnvironment.isHeadless() returns true. +@@ -183,8 +183,8 @@ + * + * @param parent The parent frame of this dialog box. + * @param title The title string for this dialog box. +- * @param modal if this dialog box is modal, false +- * otherwise. ++ * @param modal true if this dialog box is modal, ++ * false otherwise. + * @param gc The GraphicsConfiguration object to use. + * + * @exception IllegalArgumentException If owner is null, the +Index: java/awt/Event.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Event.java,v +retrieving revision 1.9 +diff -u -r1.9 Event.java +--- java/awt/Event.java 10 Nov 2002 00:16:42 -0000 1.9 ++++ java/awt/Event.java 6 Sep 2004 16:35:44 -0000 +@@ -163,7 +163,8 @@ + + protected String paramString () + { +- return "id=" + id + ",x=" + x + ",y=" + y + "target=" + target; ++ return "id=" + id + ",x=" + x + ",y=" + y ++ + ",target=" + target + ",arg=" + arg; + } + + public boolean shiftDown() +Index: java/awt/EventDispatchThread.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/EventDispatchThread.java,v +retrieving revision 1.5 +diff -u -r1.5 EventDispatchThread.java +--- java/awt/EventDispatchThread.java 16 Jan 2004 16:15:49 -0000 1.5 ++++ java/awt/EventDispatchThread.java 6 Sep 2004 16:35:44 -0000 +@@ -67,7 +67,17 @@ + // We are interrupted when we should finish executing + return; + } +- queue.dispatchEvent(evt); ++ ++ KeyboardFocusManager manager; ++ manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ // Try to dispatch this event to the current keyboard focus ++ // manager. It will dispatch all FocusEvents, all ++ // WindowEvents related to focus, and all KeyEvents, ++ // returning true. Otherwise, it returns false and we ++ // dispatch the event normally. ++ if (!manager.dispatchEvent (evt)) ++ queue.dispatchEvent(evt); + } + catch (InterruptedException ie) + { +Index: java/awt/EventQueue.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/EventQueue.java,v +retrieving revision 1.13 +diff -u -r1.13 EventQueue.java +--- java/awt/EventQueue.java 16 Jan 2004 16:15:49 -0000 1.13 ++++ java/awt/EventQueue.java 6 Sep 2004 16:35:44 -0000 +@@ -161,6 +161,9 @@ + */ + public synchronized void postEvent(AWTEvent evt) + { ++ if (evt == null) ++ throw new NullPointerException(); ++ + if (next != null) + { + next.postEvent(evt); +@@ -231,10 +234,11 @@ + public static void invokeAndWait(Runnable runnable) + throws InterruptedException, InvocationTargetException + { ++ if (isDispatchThread ()) ++ throw new Error("Can't call invokeAndWait from event dispatch thread"); ++ + EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); + Thread current = Thread.currentThread(); +- if (current == eq.dispatchThread) +- throw new Error("Can't call invokeAndWait from event dispatch thread"); + + InvocationEvent ie = + new InvocationEvent(eq, runnable, current, true); +@@ -293,8 +297,18 @@ + public static AWTEvent getCurrentEvent() + { + EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); +- if (Thread.currentThread() != eq.dispatchThread) +- return null; ++ Thread ct = Thread.currentThread(); ++ ++ /* Find out if this thread is the dispatch thread for any of the ++ EventQueues in the chain */ ++ while (ct != eq.dispatchThread) ++ { ++ // Try next EventQueue, if any ++ if (eq.next == null) ++ return null; // Not an event dispatch thread ++ eq = eq.next; ++ } ++ + return eq.currentEvent; + } + +@@ -348,30 +362,34 @@ + if (prev == null) + throw new EmptyStackException(); + +- // Don't synchronize both this and prev at the same time, or deadlock could +- // occur. ++ /* The order is important here, we must get the prev lock first, ++ or deadlock could occur as callers usually get here following ++ prev's next pointer, and thus obtain prev's lock before trying ++ to get this lock. */ + synchronized (prev) + { +- prev.next = null; +- } ++ prev.next = next; ++ if (next != null) ++ next.prev = prev; + +- synchronized (this) +- { +- int i = next_out; +- while (i != next_in) ++ synchronized (this) + { +- prev.postEvent(queue[i]); +- next_out = i; +- if (++i == queue.length) +- i = 0; ++ int i = next_out; ++ while (i != next_in) ++ { ++ prev.postEvent(queue[i]); ++ next_out = i; ++ if (++i == queue.length) ++ i = 0; ++ } ++ // Empty the queue so it can be reused ++ next_in = 0; ++ next_out = 0; ++ ++ // Tell our EventDispatchThread that it can end execution ++ dispatchThread.interrupt (); ++ dispatchThread = null; + } +- // Empty the queue so it can be reused +- next_in = 0; +- next_out = 0; +- +- // Tell our EventDispatchThread that it can end execution +- dispatchThread.interrupt (); +- dispatchThread = null; + } + } + +Index: java/awt/FileDialog.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/FileDialog.java,v +retrieving revision 1.7 +diff -u -r1.7 FileDialog.java +--- java/awt/FileDialog.java 5 Jan 2004 21:23:12 -0000 1.7 ++++ java/awt/FileDialog.java 6 Sep 2004 16:35:44 -0000 +@@ -41,6 +41,7 @@ + import java.awt.peer.FileDialogPeer; + import java.awt.peer.DialogPeer; + import java.io.FilenameFilter; ++import java.io.Serializable; + + /** + * This class implements a file selection dialog box widget. +@@ -48,7 +49,7 @@ + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ +-public class FileDialog extends Dialog implements java.io.Serializable ++public class FileDialog extends Dialog implements Serializable + { + + /* +Index: java/awt/Font.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Font.java,v +retrieving revision 1.16 +diff -u -r1.16 Font.java +--- java/awt/Font.java 31 Dec 2003 08:58:30 -0000 1.16 ++++ java/awt/Font.java 6 Sep 2004 16:35:44 -0000 +@@ -1,5 +1,5 @@ + /* Font.java -- Font object +- Copyright (C) 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -330,16 +330,20 @@ + } + + public Font (Map attrs) +-{ +- this.peer = getPeerFromToolkit (null, attrs); +-} ++ { ++ this(null, attrs); ++ } + + /* This extra constructor is here to permit ClasspathToolkit and to build + a font with a "logical name" as well as attrs. */ + public Font (String name, Map attrs) +-{ ++ { ++ // If attrs is null, setting it to an empty HashMap will give this ++ // Font default attributes. ++ if (attrs == null) ++ attrs = new HashMap(); + this.peer = getPeerFromToolkit (name, attrs); +-} ++ } + + /*************************************************************************/ + +@@ -646,6 +650,22 @@ + + /** + * Produces a new {@link Font} based on the current font, adjusted to a ++ * new size and style. ++ * ++ * @param style The style of the newly created font. ++ * @param size The size of the newly created font. ++ * ++ * @return A clone of the current font, with the specified size and style. ++ * ++ * @since 1.2 ++ */ ++ public Font deriveFont (int style, float size) ++{ ++ return peer.deriveFont (this, style, size); ++} ++ ++/** ++ * Produces a new {@link Font} based on the current font, adjusted to a + * new size. + * + * @param size The size of the newly created font. +@@ -698,6 +718,27 @@ + } + + /** ++ * Produces a new {@link Font} based on the current font, subjected ++ * to a new affine transformation. ++ * ++ * @param a The transformation to apply. ++ * ++ * @return A clone of the current font, with the specified transform. ++ * ++ * @throws IllegalArgumentException If transformation is ++ * null. ++ * ++ * @since 1.2 ++ */ ++ public Font deriveFont (AffineTransform a) ++{ ++ if (a == null) ++ throw new IllegalArgumentException ("Affine transformation is null"); ++ ++ return peer.deriveFont (this, a); ++} ++ ++/** + * Produces a new {@link Font} based on the current font, adjusted to a + * new set of attributes. + * +@@ -1224,13 +1265,28 @@ + public String + toString() + { +- return(getClass().getName() +- + "(logical=" + getName () +- + ",family=" + getFamily () +- + ",face=" + getFontName () +- + ",style=" + getStyle () +- + ",size=" + getSize () +- + ",transform=" + getTransform () + ")"); ++ String styleString = ""; ++ ++ switch (getStyle ()) ++ { ++ case 0: ++ styleString = "plain"; ++ break; ++ case 1: ++ styleString = "bold"; ++ break; ++ case 2: ++ styleString = "italic"; ++ break; ++ default: ++ styleString = "unknown"; ++ } ++ ++ return getClass ().getName () ++ + "[family=" + getFamily () ++ + ",name=" + getFontName () ++ + ",style=" + styleString ++ + ",size=" + getSize () + "]"; + } + + +Index: java/awt/FontMetrics.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/FontMetrics.java,v +retrieving revision 1.4 +diff -u -r1.4 FontMetrics.java +--- java/awt/FontMetrics.java 22 Jan 2002 22:58:08 -0000 1.4 ++++ java/awt/FontMetrics.java 6 Sep 2004 16:35:44 -0000 +@@ -47,12 +47,12 @@ + * least the following methods: + *

    + *

      +- *
    • getAscent +- *
    • getDescent +- *
    • getLeading() +- *
    • getMaxAdvance() +- *
    • charWidth(char) +- *
    • charsWidth(char[], int, int) ++ *
    • getAscent()
    • ++ *
    • getDescent()
    • ++ *
    • getLeading()
    • ++ *
    • getMaxAdvance()
    • ++ *
    • charWidth(char)
    • ++ *
    • charsWidth(char[], int, int)
    • + *
    + * + * @author Aaron M. Renn (arenn@urbanophile.com) +@@ -195,7 +195,7 @@ + public int + getMaxDescent() + { +- return(getDescent()); ++ return getMaxDecent (); + } + + /*************************************************************************/ +@@ -212,7 +212,7 @@ + public int + getMaxDecent() + { +- return(getMaxDescent()); ++ return getDescent (); + } + + /*************************************************************************/ +@@ -292,8 +292,7 @@ + { + int total_width = 0; + for (int i = offset; i < len; i++) +- total_width = charWidth(buf[i]); +- ++ total_width += charWidth(buf[i]); + return(total_width); + } + +@@ -328,7 +327,12 @@ + public int[] + getWidths() + { +- return(new int[256]); ++ int [] result = new int[256]; ++ for(char i = 0; i < 256; i++) ++ { ++ result[i]= charWidth(i); ++ } ++ return(result); + } + + /*************************************************************************/ +@@ -347,3 +351,4 @@ + + } // class FontMetrics + ++ +Index: java/awt/Frame.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Frame.java,v +retrieving revision 1.18 +diff -u -r1.18 Frame.java +--- java/awt/Frame.java 19 Sep 2003 19:27:58 -0000 1.18 ++++ java/awt/Frame.java 6 Sep 2004 16:35:44 -0000 +@@ -1,5 +1,5 @@ + /* Frame.java -- AWT toplevel window +- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -50,11 +50,6 @@ + */ + public class Frame extends Window implements MenuContainer + { +- +-/* +- * Static Variables +- */ +- + /** + * Constant for the default cursor. + * @deprecated Replaced by Cursor.DEFAULT_CURSOR instead. +@@ -148,12 +143,6 @@ + // Serialization version constant + private static final long serialVersionUID = 2673458971256075116L; + +-/*************************************************************************/ +- +-/* +- * Instance Variables +- */ +- + /** + * @serial The version of the class data being serialized + * // FIXME: what is this value? +@@ -208,11 +197,10 @@ + */ + private boolean undecorated = false; + +-/*************************************************************************/ +- + /* +- * Constructors ++ * The number used to generate the name returned by getName. + */ ++ private static transient long next_frame_number = 0; + + /** + * Initializes a new instance of Frame that is not visible +@@ -224,8 +212,6 @@ + this(""); + } + +-/*************************************************************************/ +- + /** + * Initializes a new instance of Frame that is not visible + * and has the specified title. +@@ -256,12 +242,6 @@ + visible = false; + } + +-/*************************************************************************/ +- +-/* +- * Instance Methods +- */ +- + /** + * Returns this frame's title string. + * +@@ -273,8 +253,6 @@ + return(title); + } + +-/*************************************************************************/ +- + /* + * Sets this frame's title to the specified value. + * +@@ -288,8 +266,6 @@ + ((FramePeer) peer).setTitle(title); + } + +-/*************************************************************************/ +- + /** + * Returns this frame's icon. + * +@@ -302,8 +278,6 @@ + return(icon); + } + +-/*************************************************************************/ +- + /** + * Sets this frame's icon to the specified value. + * +@@ -317,8 +291,6 @@ + ((FramePeer) peer).setIconImage(icon); + } + +-/*************************************************************************/ +- + /** + * Returns this frame's menu bar. + * +@@ -331,8 +303,6 @@ + return(menuBar); + } + +-/*************************************************************************/ +- + /** + * Sets this frame's menu bar. + * +@@ -341,13 +311,17 @@ + public synchronized void + setMenuBar(MenuBar menuBar) + { +- this.menuBar = menuBar; + if (peer != null) ++ { ++ if (this.menuBar != null) ++ this.menuBar.removeNotify(); ++ if (menuBar != null) ++ menuBar.addNotify(); + ((FramePeer) peer).setMenuBar(menuBar); ++ } ++ this.menuBar = menuBar; + } + +-/*************************************************************************/ +- + /** + * Tests whether or not this frame is resizable. This will be + * true by default. +@@ -361,8 +335,6 @@ + return(resizable); + } + +-/*************************************************************************/ +- + /** + * Sets the resizability of this frame to the specified value. + * +@@ -377,8 +349,6 @@ + ((FramePeer) peer).setResizable(resizable); + } + +-/*************************************************************************/ +- + /** + * Returns the cursor type of the cursor for this window. This will + * be one of the constants in this class. +@@ -393,8 +363,6 @@ + return(getCursor().getType()); + } + +-/*************************************************************************/ +- + /** + * Sets the cursor for this window to the specified type. The specified + * type should be one of the constants in this class. +@@ -409,8 +377,6 @@ + setCursor(new Cursor(type)); + } + +-/*************************************************************************/ +- + /** + * Removes the specified component from this frame's menu. + * +@@ -422,30 +388,60 @@ + menuBar.remove(menu); + } + +-/*************************************************************************/ +- + /** + * Notifies this frame that it should create its native peer. + */ + public void + addNotify() + { ++ if (menuBar != null) ++ menuBar.addNotify(); + if (peer == null) + peer = getToolkit ().createFrame (this); + super.addNotify(); + } + +-/*************************************************************************/ ++public void removeNotify() ++{ ++ if (menuBar != null) ++ menuBar.removeNotify(); ++ super.removeNotify(); ++} + + /** + * Returns a debugging string describing this window. + * + * @return A debugging string describing this window. + */ +-protected String +-paramString() ++ protected String paramString () + { +- return(getClass().getName()); ++ String title = getTitle (); ++ ++ String resizable = ""; ++ if (isResizable ()) ++ resizable = ",resizable"; ++ ++ String state = ""; ++ switch (getState ()) ++ { ++ case NORMAL: ++ state = ",normal"; ++ break; ++ case ICONIFIED: ++ state = ",iconified"; ++ break; ++ case MAXIMIZED_BOTH: ++ state = ",maximized-both"; ++ break; ++ case MAXIMIZED_HORIZ: ++ state = ",maximized-horiz"; ++ break; ++ case MAXIMIZED_VERT: ++ state = ",maximized-vert"; ++ break; ++ } ++ ++ return super.paramString () + ",title=" + title + resizable + state; + } + + public static Frame[] +@@ -538,5 +534,19 @@ + + this.undecorated = undecorated; + } +-} // class Frame + ++ /** ++ * Generate a unique name for this frame. ++ * ++ * @return A unique name for this frame. ++ */ ++ String generateName () ++ { ++ return "frame" + getUniqueLong (); ++ } ++ ++ private static synchronized long getUniqueLong () ++ { ++ return next_frame_number++; ++ } ++} +Index: java/awt/Graphics.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Graphics.java,v +retrieving revision 1.6 +diff -u -r1.6 Graphics.java +--- java/awt/Graphics.java 11 Jun 2003 10:37:47 -0000 1.6 ++++ java/awt/Graphics.java 6 Sep 2004 16:35:45 -0000 +@@ -1,5 +1,5 @@ + /* Graphics.java -- Abstract Java drawing class +- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -417,7 +417,7 @@ + drawLine(x1, y2, x1, y1); + setColor(br); + drawLine(x2, y1, x2, y2); +- drawLine(x2, y1, x1, y2); ++ drawLine(x2, y2, x1, y2); + setColor(color); + } + +@@ -732,14 +732,14 @@ + /*************************************************************************/ + + /** +- * Returns a string representation of this object. +- * +- * @param A string representation of this object. +- */ ++ * Returns a string representation of this object. ++ * ++ * @param A string representation of this object. ++ */ + public String + toString() + { +- return(super.toString()); ++ return getClass ().getName () + "[font=" + getFont () + ",color=" + getColor () + "]"; + } + + public boolean +Index: java/awt/GraphicsEnvironment.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/GraphicsEnvironment.java,v +retrieving revision 1.1 +diff -u -r1.1 GraphicsEnvironment.java +--- java/awt/GraphicsEnvironment.java 9 Aug 2002 04:26:14 -0000 1.1 ++++ java/awt/GraphicsEnvironment.java 6 Sep 2004 16:35:45 -0000 +@@ -40,6 +40,7 @@ + + import java.awt.image.BufferedImage; + import java.util.Locale; ++import gnu.java.awt.ClasspathToolkit; + + /** + * This descibes the collection of GraphicsDevice and Font objects available +@@ -70,7 +71,9 @@ + */ + public static GraphicsEnvironment getLocalGraphicsEnvironment() + { +- throw new Error("not implemented"); ++ ClasspathToolkit tk; ++ tk = ((ClasspathToolkit) Toolkit.getDefaultToolkit ()); ++ return tk.getLocalGraphicsEnvironment (); + } + + /** +Index: java/awt/GridBagLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/GridBagLayout.java,v +retrieving revision 1.6 +diff -u -r1.6 GridBagLayout.java +--- java/awt/GridBagLayout.java 14 Nov 2003 22:44:29 -0000 1.6 ++++ java/awt/GridBagLayout.java 6 Sep 2004 16:35:45 -0000 +@@ -39,7 +39,9 @@ + package java.awt; + + import java.io.Serializable; ++import java.util.ArrayList; + import java.util.Hashtable; ++import java.util.HashMap; + + /** + * @author Michael Koch +@@ -54,7 +56,14 @@ + protected static final int PREFERREDSIZE = 2; + protected static final int MAXGRIDSIZE = 512; + ++ // comptable remembers the original contraints given to us. ++ // internalcomptable is used to keep track of modified constraint values ++ // that we calculate, particularly when we are given RELATIVE and ++ // REMAINDER constraints. ++ // Constraints kept in comptable are never modified, and constraints ++ // kept in internalcomptable can be modified internally only. + protected Hashtable comptable; ++ private Hashtable internalcomptable; + protected GridBagLayoutInfo layoutInfo; + protected GridBagConstraints defaultConstraints; + +@@ -66,6 +75,7 @@ + public GridBagLayout () + { + this.comptable = new Hashtable(); ++ this.internalcomptable = new Hashtable(); + this.defaultConstraints= new GridBagConstraints(); + } + +@@ -149,7 +159,7 @@ + + public void layoutContainer (Container parent) + { +- arrangeGrid (parent); ++ arrangeGrid (parent); + } + + public float getLayoutAlignmentX (Container target) +@@ -213,6 +223,20 @@ + return result; + } + ++ private GridBagConstraints lookupInternalConstraints (Component component) ++ { ++ GridBagConstraints result = ++ (GridBagConstraints) internalcomptable.get (component); ++ ++ if (result == null) ++ { ++ result = (GridBagConstraints) lookupConstraints(component).clone(); ++ internalcomptable.put (component, result); ++ } ++ ++ return result; ++ } ++ + /** + * @since 1.1 + */ +@@ -302,7 +326,8 @@ + */ + protected void AdjustForGravity (GridBagConstraints gbc, Rectangle rect) + { +- adjustForGravity (gbc, rect); ++ // FIXME ++ throw new Error ("Not implemented"); + } + + /** +@@ -310,7 +335,116 @@ + */ + protected void ArrangeGrid (Container parent) + { +- arrangeGrid (parent); ++ Component[] components = parent.getComponents(); ++ ++ if (components.length == 0) ++ return; ++ ++ GridBagLayoutInfo info = getLayoutInfo (parent, PREFERREDSIZE); ++ if (info.cols == 0 && info.rows == 0) ++ return; ++ layoutInfo = info; ++ ++ // DEBUG ++ //dumpLayoutInfo (layoutInfo); ++ ++ for(int i = 0; i < components.length; i++) ++ { ++ Component component = components [i]; ++ ++ // If component is not visible we dont have to care about it. ++ if (!component.isVisible()) ++ continue; ++ ++ GridBagConstraints constraints = ++ lookupInternalConstraints(component); ++ ++ int cellx = sumIntArray(layoutInfo.colWidths, constraints.gridx); ++ int celly = sumIntArray(layoutInfo.rowHeights, constraints.gridy); ++ int cellw = sumIntArray(layoutInfo.colWidths, ++ constraints.gridx + constraints.gridwidth) - cellx; ++ int cellh = sumIntArray(layoutInfo.rowHeights, ++ constraints.gridy + constraints.gridheight) - celly; ++ ++ Insets insets = constraints.insets; ++ if (insets != null) ++ { ++ cellx += insets.left; ++ celly += insets.top; ++ cellw -= insets.left + insets.right; ++ cellh -= insets.top + insets.bottom; ++ } ++ ++ Dimension dim = component.getPreferredSize(); ++ ++ // Note: Documentation says that padding is added on both sides, but ++ // visual inspection shows that the Sun implementation only adds it ++ // once, so we do the same. ++ dim.width += constraints.ipadx; ++ dim.height += constraints.ipady; ++ ++ switch(constraints.fill) ++ { ++ case GridBagConstraints.HORIZONTAL: ++ dim.width = cellw; ++ break; ++ case GridBagConstraints.VERTICAL: ++ dim.height = cellh; ++ break; ++ case GridBagConstraints.BOTH: ++ dim.width = cellw; ++ dim.height = cellh; ++ break; ++ } ++ ++ int x; ++ int y; ++ ++ switch(constraints.anchor) ++ { ++ case GridBagConstraints.NORTH: ++ x = cellx + (cellw - dim.width) / 2; ++ y = celly; ++ break; ++ case GridBagConstraints.SOUTH: ++ x = cellx + (cellw - dim.width) / 2; ++ y = celly + cellh - dim.height; ++ break; ++ case GridBagConstraints.WEST: ++ x = cellx; ++ y = celly + (cellh - dim.height) / 2; ++ break; ++ case GridBagConstraints.EAST: ++ x = cellx + cellw - dim.width; ++ y = celly + (cellh - dim.height) / 2; ++ break; ++ case GridBagConstraints.NORTHEAST: ++ x = cellx + cellw - dim.width; ++ y = celly; ++ break; ++ case GridBagConstraints.NORTHWEST: ++ x = cellx; ++ y = celly; ++ break; ++ case GridBagConstraints.SOUTHEAST: ++ x = cellx + cellw - dim.width; ++ y = celly + cellh - dim.height; ++ break; ++ case GridBagConstraints.SOUTHWEST: ++ x = cellx; ++ y = celly + cellh - dim.height; ++ break; ++ default: ++ x = cellx + (cellw - dim.width) / 2; ++ y = celly + (cellh - dim.height) / 2; ++ break; ++ } ++ ++ component.setBounds(layoutInfo.pos_x + x, layoutInfo.pos_y + y, dim.width, dim.height); ++ } ++ ++ // DEBUG ++ //dumpLayoutInfo (layoutInfo); + } + + /** +@@ -318,7 +452,369 @@ + */ + protected GridBagLayoutInfo GetLayoutInfo (Container parent, int sizeflag) + { +- return getLayoutInfo (parent, sizeflag); ++ if (sizeflag != MINSIZE && sizeflag != PREFERREDSIZE) ++ throw new IllegalArgumentException(); ++ ++ Dimension parentDim = parent.getSize (); ++ Insets parentInsets = parent.getInsets (); ++ parentDim.width -= parentInsets.left + parentInsets.right; ++ parentDim.height -= parentInsets.top + parentInsets.bottom; ++ ++ int current_y = 0; ++ int max_x = 0; ++ int max_y = 0; ++ ++ // Guaranteed to contain the last component added to the given row ++ // or column, whose gridwidth/height is not REMAINDER. ++ HashMap lastInRow = new HashMap(); ++ HashMap lastInCol = new HashMap(); ++ ++ Component[] components = parent.getComponents(); ++ ++ // Components sorted by gridwidths/heights, ++ // smallest to largest, with REMAINDER and RELATIVE at the end. ++ // These are useful when determining sizes and weights. ++ ArrayList sortedByWidth = new ArrayList(components.length); ++ ArrayList sortedByHeight = new ArrayList(components.length); ++ ++ // STEP 1: first we figure out how many rows/columns ++ for (int i = 0; i < components.length; i++) ++ { ++ Component component = components [i]; ++ ++ // If component is not visible we dont have to care about it. ++ if (!component.isVisible()) ++ continue; ++ ++ // When looking up the constraint for the first time, check the ++ // original unmodified constraint. After the first time, always ++ // refer to the internal modified constraint. ++ GridBagConstraints originalConstraints = lookupConstraints (component); ++ GridBagConstraints constraints = (GridBagConstraints) originalConstraints.clone(); ++ internalcomptable.put(component, constraints); ++ ++ // Cases: ++ // ++ // 1. gridy == RELATIVE, gridx == RELATIVE ++ // ++ // use y as the row number; check for the next ++ // available slot at row y ++ // ++ // 2. only gridx == RELATIVE ++ // ++ // check for the next available slot at row gridy ++ // ++ // 3. only gridy == RELATIVE ++ // ++ // check for the next available slot at column gridx ++ // ++ // 4. neither gridx or gridy == RELATIVE ++ // ++ // nothing to check; just add it ++ ++ ++ // cases 1 and 2 ++ if(constraints.gridx == GridBagConstraints.RELATIVE) ++ { ++ if (constraints.gridy == GridBagConstraints.RELATIVE) ++ constraints.gridy = current_y; ++ ++ int x; ++ ++ // Check the component that occupies the right-most spot in this ++ // row. We want to add this component after it. ++ // If this row is empty, add to the 0 position. ++ if (!lastInRow.containsKey(new Integer(constraints.gridy))) ++ x = 0; ++ else ++ { ++ Component lastComponent = (Component) lastInRow.get(new Integer(constraints.gridy)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ x = lastConstraints.gridx + Math.max(1, lastConstraints.gridwidth); ++ } ++ ++ // Determine if this component will fit in the slot vertically. ++ // If not, bump it over to where it does fit. ++ for (int y = constraints.gridy + 1; y < constraints.gridy + Math.max(1, constraints.gridheight); y++) ++ { ++ if (lastInRow.containsKey(new Integer(y))) ++ { ++ Component lastComponent = (Component) lastInRow.get(new Integer(y)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ x = Math.max (x, ++ lastConstraints.gridx + Math.max(1, lastConstraints.gridwidth)); ++ } ++ } ++ ++ constraints.gridx = x; ++ } ++ // case 3 ++ else if(constraints.gridy == GridBagConstraints.RELATIVE) ++ { ++ int y; ++ // Check the component that occupies the bottom-most spot in ++ // this column. We want to add this component below it. ++ // If this column is empty, add to the 0 position. ++ if (!lastInCol.containsKey(new Integer(constraints.gridx))) ++ y = 0; ++ else ++ { ++ Component lastComponent = (Component)lastInCol.get(new Integer(constraints.gridx)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ y = lastConstraints.gridy + Math.max(1, lastConstraints.gridheight); ++ } ++ ++ // Determine if this component will fit in the slot horizontally. ++ // If not, bump it down to where it does fit. ++ for (int x = constraints.gridx + 1; x < constraints.gridx + Math.max(1, constraints.gridwidth); x++) ++ { ++ if (lastInCol.containsKey(new Integer(x))) ++ { ++ Component lastComponent = (Component) lastInCol.get(new Integer(x)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ y = Math.max (y, ++ lastConstraints.gridy + Math.max(1, lastConstraints.gridheight)); ++ } ++ } ++ ++ constraints.gridy = y; ++ } ++ // case 4: do nothing ++ ++ max_x = Math.max(max_x, ++ constraints.gridx + Math.max(1, constraints.gridwidth)); ++ max_y = Math.max(max_y, ++ constraints.gridy + Math.max(1, constraints.gridheight)); ++ ++ sortBySpan(component, constraints.gridwidth, sortedByWidth, true); ++ sortBySpan(component, constraints.gridheight, sortedByHeight, false); ++ ++ // Update our reference points for RELATIVE gridx and gridy. ++ if(constraints.gridwidth == GridBagConstraints.REMAINDER) ++ { ++ current_y = constraints.gridy + Math.max(1, constraints.gridheight); ++ } ++ else if (constraints.gridwidth != GridBagConstraints.REMAINDER) ++ { ++ for (int y = constraints.gridy; y < constraints.gridy + Math.max(1, constraints.gridheight); y++) ++ { ++ if(lastInRow.containsKey(new Integer(y))) ++ { ++ Component lastComponent = (Component) lastInRow.get(new Integer(y)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ if (constraints.gridx > lastConstraints.gridx) ++ { ++ lastInRow.put(new Integer(y), component); ++ } ++ } ++ else ++ { ++ lastInRow.put(new Integer(y), component); ++ } ++ } ++ ++ for (int x = constraints.gridx; x < constraints.gridx + Math.max(1, constraints.gridwidth); x++) ++ { ++ if(lastInCol.containsKey(new Integer(x))) ++ { ++ Component lastComponent = (Component) lastInCol.get(new Integer(x)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ if (constraints.gridy > lastConstraints.gridy) ++ { ++ lastInCol.put(new Integer(x), component); ++ } ++ } ++ else ++ { ++ lastInCol.put(new Integer(x), component); ++ } ++ } ++ } ++ } // end of STEP 1 ++ ++ GridBagLayoutInfo info = new GridBagLayoutInfo(max_x, max_y); ++ ++ // Check if column widths and row heights are overridden. ++ ++ for (int x = 0; x < max_x; x++) ++ { ++ if(columnWidths != null && columnWidths.length > x) ++ info.colWidths[x] = columnWidths[x]; ++ if(columnWeights != null && columnWeights.length > x) ++ info.colWeights[x] = columnWeights[x]; ++ } ++ ++ for (int y = 0; y < max_y; y++) ++ { ++ if(rowHeights != null && rowHeights.length > y) ++ info.rowHeights[y] = rowHeights[y]; ++ if(rowWeights != null && rowWeights.length > y) ++ info.rowWeights[y] = rowWeights[y]; ++ } ++ ++ // STEP 2: Fix up any cells with width/height as REMAINDER/RELATIVE. ++ for (int i = 0; i < components.length; i++) ++ { ++ Component component = components [i]; ++ ++ // If component is not visible we dont have to care about it. ++ if (!component.isVisible()) ++ continue; ++ ++ GridBagConstraints constraints = lookupInternalConstraints (component); ++ ++ if(constraints.gridwidth == GridBagConstraints.REMAINDER || constraints.gridwidth == GridBagConstraints.RELATIVE) ++ { ++ if(constraints.gridwidth == GridBagConstraints.REMAINDER) ++ { ++ for (int y = constraints.gridy; y < constraints.gridy + Math.max(1, constraints.gridheight); y++) ++ { ++ if (lastInRow.containsKey(new Integer(y))) ++ { ++ Component lastComponent = (Component) lastInRow.get(new Integer(y)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ ++ if (lastConstraints.gridwidth == GridBagConstraints.RELATIVE) ++ { ++ constraints.gridx = max_x - 1; ++ break; ++ } ++ else ++ { ++ constraints.gridx = Math.max (constraints.gridx, ++ lastConstraints.gridx + Math.max (1, lastConstraints.gridwidth)); ++ } ++ } ++ } ++ constraints.gridwidth = max_x - constraints.gridx; ++ } ++ else if (constraints.gridwidth == GridBagConstraints.RELATIVE) ++ { ++ constraints.gridwidth = max_x - constraints.gridx - 1; ++ } ++ ++ // Re-sort ++ sortedByWidth.remove(sortedByWidth.indexOf(component)); ++ sortBySpan(component, constraints.gridwidth, sortedByWidth, true); ++ } ++ ++ if(constraints.gridheight == GridBagConstraints.REMAINDER || constraints.gridheight == GridBagConstraints.RELATIVE) ++ { ++ if(constraints.gridheight == GridBagConstraints.REMAINDER) ++ { ++ for (int x = constraints.gridx; x < constraints.gridx + Math.max(1, constraints.gridwidth); x++) ++ { ++ if (lastInCol.containsKey(new Integer(x))) ++ { ++ Component lastComponent = (Component) lastInRow.get(new Integer(x)); ++ GridBagConstraints lastConstraints = lookupInternalConstraints(lastComponent); ++ ++ if (lastConstraints.gridheight == GridBagConstraints.RELATIVE) ++ { ++ constraints.gridy = max_y - 1; ++ break; ++ } ++ else ++ { ++ constraints.gridy = Math.max (constraints.gridy, ++ lastConstraints.gridy + Math.max (1, lastConstraints.gridheight)); ++ } ++ } ++ } ++ constraints.gridheight = max_y - constraints.gridy; ++ } ++ else if (constraints.gridheight == GridBagConstraints.RELATIVE) ++ { ++ constraints.gridheight = max_y - constraints.gridy - 1; ++ } ++ ++ // Re-sort ++ sortedByHeight.remove(sortedByHeight.indexOf(component)); ++ sortBySpan(component, constraints.gridheight, sortedByHeight, false); ++ } ++ } // end of STEP 2 ++ ++ // STEP 3: Determine sizes and weights for columns. ++ for (int i = 0; i < sortedByWidth.size(); i++) ++ { ++ Component component = (Component) sortedByWidth.get(i); ++ ++ // If component is not visible we dont have to care about it. ++ if (!component.isVisible()) ++ continue; ++ ++ GridBagConstraints constraints = lookupInternalConstraints (component); ++ ++ int width = (sizeflag == PREFERREDSIZE) ? ++ component.getPreferredSize().width : ++ component.getMinimumSize().width; ++ ++ if(constraints.insets != null) ++ width += constraints.insets.left + constraints.insets.right; ++ ++ width += constraints.ipadx; ++ ++ distributeSizeAndWeight(width, ++ constraints.weightx, ++ constraints.gridx, ++ constraints.gridwidth, ++ info.colWidths, ++ info.colWeights); ++ } // end of STEP 3 ++ ++ // STEP 4: Determine sizes and weights for rows. ++ for (int i = 0; i < sortedByHeight.size(); i++) ++ { ++ Component component = (Component) sortedByHeight.get(i); ++ ++ // If component is not visible we dont have to care about it. ++ if (!component.isVisible()) ++ continue; ++ ++ GridBagConstraints constraints = lookupInternalConstraints (component); ++ ++ int height = (sizeflag == PREFERREDSIZE) ? ++ component.getPreferredSize().height : ++ component.getMinimumSize().height; ++ ++ if(constraints.insets != null) ++ height += constraints.insets.top + constraints.insets.bottom; ++ ++ height += constraints.ipady; ++ ++ distributeSizeAndWeight(height, ++ constraints.weighty, ++ constraints.gridy, ++ constraints.gridheight, ++ info.rowHeights, ++ info.rowWeights); ++ } // end of STEP 4 ++ ++ // Adjust cell sizes iff parent size not zero. ++ if (parentDim.width > 0 && parentDim.height > 0) ++ { ++ calcCellSizes (info.colWidths, info.colWeights, parentDim.width); ++ calcCellSizes (info.rowHeights, info.rowWeights, parentDim.height); ++ } ++ ++ int totalWidth = sumIntArray(info.colWidths); ++ int totalHeight = sumIntArray(info.rowHeights); ++ ++ // Make sure pos_x and pos_y are never negative. ++ if (totalWidth >= parentDim.width) ++ info.pos_x = parentInsets.left; ++ else ++ info.pos_x = parentInsets.left + (parentDim.width - totalWidth) / 2; ++ ++ if (totalHeight >= parentDim.height) ++ info.pos_y = parentInsets.top; ++ else ++ info.pos_y = parentInsets.top + (parentDim.height - totalHeight) / 2; ++ ++ // DEBUG ++ //dumpLayoutInfo (info); ++ ++ return info; + } + + /** +@@ -326,7 +822,13 @@ + */ + protected Dimension GetMinSize (Container parent, GridBagLayoutInfo info) + { +- return getMinSize (parent, info); ++ if (parent == null || info == null) ++ return new Dimension (0, 0); ++ ++ Insets insets = parent.getInsets(); ++ int width = sumIntArray (info.colWidths) + insets.left + insets.right; ++ int height = sumIntArray (info.rowHeights) + insets.top + insets.bottom; ++ return new Dimension (width, height); + } + + /** +@@ -334,31 +836,171 @@ + */ + protected Dimension getMinSize (Container parent, GridBagLayoutInfo info) + { +- if (parent == null || info == null) +- return new Dimension (0, 0); ++ return GetMinSize (parent, info); ++ } ++ ++ /** ++ * Helper method used by GetLayoutInfo to keep components sorted, either ++ * by gridwidth or gridheight. ++ * ++ * @param component Component to add to the sorted list. ++ * @param span Either the component's gridwidth or gridheight. ++ * @param list ArrayList of components, sorted by ++ * their span. ++ * @param sortByWidth Flag indicating sorting index. If true, sort by ++ * width. Otherwise, sort by height. ++ * FIXME: Use a better sorting algorithm. ++ */ ++ private void sortBySpan (Component component, int span, ArrayList list, boolean sortByWidth) ++ { ++ if (span == GridBagConstraints.REMAINDER ++ || span == GridBagConstraints.RELATIVE) ++ { ++ // Put all RELATIVE and REMAINDER components at the end. ++ list.add(component); ++ } ++ else ++ { ++ int i = 0; ++ if (list.size() > 0) ++ { ++ GridBagConstraints gbc = lookupInternalConstraints((Component) list.get(i)); ++ int otherspan = sortByWidth ? ++ gbc.gridwidth : ++ gbc.gridheight; ++ while (otherspan != GridBagConstraints.REMAINDER ++ && otherspan != GridBagConstraints.RELATIVE ++ && span >= otherspan) ++ { ++ i++; ++ if (i < list.size()) ++ { ++ gbc = lookupInternalConstraints((Component) list.get(i)); ++ otherspan = sortByWidth ? ++ gbc.gridwidth : ++ gbc.gridheight; ++ } ++ else ++ break; ++ } ++ } ++ list.add(i, component); ++ } ++ } ++ ++ /** ++ * Helper method used by GetLayoutInfo to distribute a component's size ++ * and weight. ++ * ++ * @param size Preferred size of component, with inset and padding ++ * already added. ++ * @param weight Weight of component. ++ * @param start Starting position of component. Either ++ * constraints.gridx or gridy. ++ * @param span Span of component. either contraints.gridwidth or ++ * gridheight. ++ * @param sizes Sizes of rows or columns. ++ * @param weights Weights of rows or columns. ++ */ ++ private void distributeSizeAndWeight (int size, double weight, ++ int start, int span, ++ int[] sizes, double[] weights) ++ { ++ if (span == 1) ++ { ++ sizes[start] = Math.max(sizes[start], size); ++ weights[start] = Math.max(weights[start], weight); ++ } ++ else ++ { ++ int numOccupied = span; ++ int lastOccupied = -1; ++ ++ for(int i = start; i < start + span; i++) ++ { ++ if (sizes[i] == 0.0) ++ numOccupied--; ++ else ++ { ++ size -= sizes[i]; ++ lastOccupied = i; ++ } ++ } ++ ++ // A component needs to occupy at least one row. ++ if(numOccupied == 0) ++ sizes[start + span - 1] = size; ++ else if (size > 0) ++ sizes[lastOccupied] += size; + +- Insets insets = parent.getInsets(); +- int width = sumIntArray (info.colWidths) + insets.left + insets.right; +- int height = sumIntArray (info.rowHeights) + insets.top + insets.bottom; +- return new Dimension (width, height); ++ calcCellWeights(weight, weights, start, span); ++ } + } + ++ /** ++ * Helper method used by GetLayoutInfo to calculate weight distribution. ++ * @param weight Weight of component. ++ * @param weights Weights of rows/columns. ++ * @param start Starting position of component in grid (gridx/gridy). ++ * @param span Span of component (gridwidth/gridheight). ++ */ ++ private void calcCellWeights (double weight, double[] weights, int start, int span) ++ { ++ double totalWeight = 0.0; ++ for(int k = start; k < start + span; k++) ++ totalWeight += weights[k]; ++ ++ if(weight > totalWeight) ++ { ++ if (totalWeight == 0.0) ++ { ++ weights[start + span - 1] += weight; ++ } ++ else ++ { ++ double diff = weight - totalWeight ; ++ double remaining = diff; ++ ++ for(int k = start; k < start + span; k++) ++ { ++ double extraWeight = diff * weights[k] / totalWeight; ++ weights[k] += extraWeight; ++ remaining -= extraWeight; ++ } ++ ++ if (remaining > 0.0 && weights[start + span - 1] != 0.0) ++ { ++ weights[start + span - 1] += remaining; ++ } ++ } ++ } ++ } ++ ++ /** ++ * Helper method used by GetLayoutInfo to distribute extra space ++ * based on weight distribution. ++ * ++ * @param sizes Sizes of rows/columns. ++ * @param weights Weights of rows/columns. ++ * @param range Dimension of container. ++ */ + private void calcCellSizes (int[] sizes, double[] weights, int range) + { +- int diff = range - sumIntArray (sizes); ++ int totalSize = sumIntArray (sizes); ++ double totalWeight = sumDoubleArray (weights); + +- if (diff == 0) +- return; +- +- double weight = sumDoubleArray (weights); ++ int diff = range - totalSize; + +- for (int i = 0; i < sizes.length; i++) +- { +- sizes [i] += (int) (((double) diff) * weights [i] / weight ); ++ if (diff == 0) ++ return; + +- if (sizes [i] < 0) +- sizes [i] = 0; +- } ++ for (int i = 0; i < sizes.length; i++) ++ { ++ int newsize = (int) (sizes[i] + (((double) diff) * weights [i] / totalWeight )); ++ ++ if (newsize > 0) ++ sizes[i] = newsize; ++ } + } + + private void dumpLayoutInfo (GridBagLayoutInfo info) +@@ -404,116 +1046,7 @@ + */ + protected void arrangeGrid (Container parent) + { +- Component[] components = parent.getComponents(); +- +- if (components.length == 0) +- return; +- +- GridBagLayoutInfo info = getLayoutInfo (parent, PREFERREDSIZE); +- if (info.cols == 0 && info.rows == 0) +- return; +- layoutInfo = info; +- +- // DEBUG +- //dumpLayoutInfo (layoutInfo); +- +- for(int i = 0; i < components.length; i++) +- { +- Component component = components [i]; +- +- // If component is not visible we dont have to care about it. +- if (!component.isVisible()) +- continue; +- +- GridBagConstraints constraints = lookupConstraints (component); +- +- int cellx = sumIntArray(layoutInfo.colWidths, constraints.gridx); +- int celly = sumIntArray(layoutInfo.rowHeights, constraints.gridy); +- int cellw = sumIntArray(layoutInfo.colWidths, +- constraints.gridx + constraints.gridwidth) - cellx; +- int cellh = sumIntArray(layoutInfo.rowHeights, +- constraints.gridy + constraints.gridheight) - celly; +- +- Insets insets = constraints.insets; +- if (insets != null) +- { +- cellx += insets.left; +- celly += insets.top; +- cellw -= insets.left + insets.right; +- cellh -= insets.top + insets.bottom; +- } +- +- Dimension dim = component.preferredSize(); +- +- // Note: Documentation says that padding is added on both sides, but +- // visual inspection shows that the Sun implementation only adds it +- // once, so we do the same. +- dim.width += constraints.ipadx; +- dim.height += constraints.ipady; +- +- switch(constraints.fill) +- { +- case GridBagConstraints.HORIZONTAL: +- dim.width = cellw; +- break; +- case GridBagConstraints.VERTICAL: +- dim.height = cellh; +- break; +- case GridBagConstraints.BOTH: +- dim.width = cellw; +- dim.height = cellh; +- break; +- } +- +- int x; +- int y; +- +- switch(constraints.anchor) +- { +- case GridBagConstraints.NORTH: +- x = cellx + (cellw - dim.width) / 2; +- y = celly; +- break; +- case GridBagConstraints.SOUTH: +- x = cellx + (cellw - dim.width) / 2; +- y = celly + cellh - dim.height; +- break; +- case GridBagConstraints.WEST: +- x = cellx; +- y = celly + (cellh - dim.height) / 2; +- break; +- case GridBagConstraints.EAST: +- x = cellx + cellw - dim.width; +- y = celly + (cellh - dim.height) / 2; +- break; +- case GridBagConstraints.NORTHEAST: +- x = cellx + cellw - dim.width; +- y = celly; +- break; +- case GridBagConstraints.NORTHWEST: +- x = cellx; +- y = celly; +- break; +- case GridBagConstraints.SOUTHEAST: +- x = cellx + cellw - dim.width; +- y = celly + cellh - dim.height; +- break; +- case GridBagConstraints.SOUTHWEST: +- x = cellx; +- y = celly + cellh - dim.height; +- break; +- default: +- x = cellx + (cellw - dim.width) / 2; +- y = celly + (cellh - dim.height) / 2; +- break; +- } +- +- component.setBounds(layoutInfo.pos_x + x, layoutInfo.pos_y + y, dim.width, dim.height); +- } +- +- // DEBUG +- //dumpLayoutInfo (layoutInfo); +- ++ ArrangeGrid (parent); + } + + /** +@@ -521,160 +1054,7 @@ + */ + protected GridBagLayoutInfo getLayoutInfo (Container parent, int sizeflag) + { +- if (sizeflag != MINSIZE && sizeflag != PREFERREDSIZE) +- throw new IllegalArgumentException(); +- +- Dimension parentDim = parent.size(); +- Insets parentInsets = parent.insets(); +- parentDim.width -= parentInsets.left + parentInsets.right; +- parentDim.height -= parentInsets.top + parentInsets.bottom; +- +- int x = 0; +- int y = 0; +- int max_x = 0; +- int max_y = 0; +- +- // first we figure out how many rows/columns +- Component[] components = parent.getComponents(); +- for (int i = 0; i < components.length; i++) +- { +- Component component = components [i]; +- +- // If component is not visible we dont have to care about it. +- if (!component.isVisible()) +- continue; +- +- GridBagConstraints constraints = lookupConstraints (component); +- +- if(constraints.gridx == GridBagConstraints.RELATIVE) +- constraints.gridx = x; +- +- if(constraints.gridy == GridBagConstraints.RELATIVE) +- constraints.gridy = y; +- +- max_x = Math.max(max_x, +- constraints.gridx + Math.max(1, constraints.gridwidth)); +- max_y = Math.max(max_y, +- constraints.gridy + Math.max(1, constraints.gridheight)); +- +- if(constraints.gridwidth == GridBagConstraints.REMAINDER) +- { +- x = 0; +- y++; +- } +- else +- { +- x = constraints.gridx + Math.max(1, constraints.gridwidth); +- y = constraints.gridy; +- } +- } +- +- GridBagLayoutInfo info = new GridBagLayoutInfo(max_x, max_y); +- +- for (x = 0; x <= max_x; x++) +- { +- if(columnWidths != null && columnWidths.length > x) +- { +- info.colWidths[x] = columnWidths[x]; +- } +- if(columnWeights != null && columnWeights.length > x) +- { +- info.colWeights[x] = columnWeights[x]; +- } +- for (int i = 0; i < components.length; i++) +- { +- Component component = components [i]; +- +- // If component is not visible we dont have to care about it. +- if (!component.isVisible()) +- continue; +- +- GridBagConstraints constraints = lookupConstraints (component); +- +- // first we fix up any REMAINDER cells +- if(constraints.gridwidth == GridBagConstraints.REMAINDER) +- { +- constraints.gridwidth = max_x - constraints.gridx; +- } +- if(constraints.gridheight == GridBagConstraints.REMAINDER) +- { +- constraints.gridheight = max_y - constraints.gridy; +- } +- +- if(constraints.gridx + constraints.gridwidth - 1 == x) +- { +- int width = (sizeflag == PREFERREDSIZE) ? +- component.preferredSize().width : +- component.minimumSize().width; +- if(constraints.insets != null) +- { +- width += constraints.insets.left + constraints.insets.right; +- } +- width += constraints.ipadx; +- for(int w = 1; w < constraints.gridwidth; w++) +- { +- width -= info.colWidths[x - w]; +- } +- info.colWidths[x] = Math.max(info.colWidths[x], width); +- info.colWeights[x] = +- Math.max(info.colWeights[x], constraints.weightx); +- } +- } +- } +- +- for (y = 0; y <= max_y; y++) +- { +- if(rowHeights != null && rowHeights.length > y) +- { +- info.rowHeights[y] = rowHeights[y]; +- } +- if(rowWeights != null && rowWeights.length > y) +- { +- info.rowWeights[y] = rowWeights[y]; +- } +- for (int i = 0; i < components.length; i++) +- { +- Component component = components [i]; +- +- // If component is not visible we dont have to care about it. +- if (!component.isVisible()) +- continue; +- +- GridBagConstraints constraints = lookupConstraints (component); +- +- if(constraints.gridy + constraints.gridheight - 1 == y) +- { +- int height = (sizeflag == PREFERREDSIZE) ? +- component.preferredSize().height : +- component.minimumSize().height; +- if(constraints.insets != null) +- { +- height += constraints.insets.top + constraints.insets.bottom; +- } +- height += constraints.ipady; +- for(int h = 1; h < constraints.gridheight; h++) +- { +- height -= info.rowHeights[y - h]; +- } +- info.rowHeights[y] = Math.max(info.rowHeights[y], height); +- info.rowWeights[y] = +- Math.max(info.rowWeights[y], constraints.weighty); +- } +- } +- } +- +- calcCellSizes (info.colWidths, info.colWeights, parentDim.width); +- calcCellSizes (info.rowHeights, info.rowWeights, parentDim.height); +- +- int totalWidth = sumIntArray(info.colWidths); +- int totalHeight = sumIntArray(info.rowHeights); +- info.pos_x = parentInsets.left + (parentDim.width - totalWidth) / 2; +- info.pos_y = parentInsets.top + (parentDim.height - totalHeight) / 2; +- +- // DEBUG +- //dumpLayoutInfo (info); +- +- return info; ++ return GetLayoutInfo (parent, sizeflag); + } + + /** +@@ -682,7 +1062,6 @@ + */ + protected void adjustForGravity (GridBagConstraints gbc, Rectangle rect) + { +- // FIXME +- throw new Error ("Not implemented"); ++ AdjustForGravity (gbc, rect); + } + } +Index: java/awt/Image.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Image.java,v +retrieving revision 1.6 +diff -u -r1.6 Image.java +--- java/awt/Image.java 9 Aug 2002 04:26:14 -0000 1.6 ++++ java/awt/Image.java 6 Sep 2004 16:35:45 -0000 +@@ -39,6 +39,7 @@ + package java.awt; + + import java.awt.image.AreaAveragingScaleFilter; ++import java.awt.image.FilteredImageSource; + import java.awt.image.ImageObserver; + import java.awt.image.ImageProducer; + import java.awt.image.ReplicateScaleFilter; +@@ -179,7 +180,20 @@ + */ + public Image getScaledInstance(int width, int height, int flags) + { +- throw new Error("not implemented"); ++ switch (flags) ++ { ++ case SCALE_DEFAULT: ++ case SCALE_FAST: ++ case SCALE_REPLICATE: ++ ImageProducer producer = ++ new FilteredImageSource(this.getSource(), ++ new ReplicateScaleFilter(width, height)); ++ return Toolkit.getDefaultToolkit().createImage(producer); ++ case SCALE_SMOOTH: ++ case SCALE_AREA_AVERAGING: ++ default: ++ throw new Error("not implemented"); ++ } + } + + /** +Index: java/awt/KeyboardFocusManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/KeyboardFocusManager.java,v +retrieving revision 1.2 +diff -u -r1.2 KeyboardFocusManager.java +--- java/awt/KeyboardFocusManager.java 13 Feb 2003 07:02:12 -0000 1.2 ++++ java/awt/KeyboardFocusManager.java 6 Sep 2004 16:35:45 -0000 +@@ -39,34 +39,66 @@ + package java.awt; + + import java.awt.event.KeyEvent; ++import java.awt.event.FocusEvent; + import java.beans.PropertyChangeListener; + import java.beans.PropertyChangeSupport; + import java.beans.PropertyVetoException; + import java.beans.VetoableChangeListener; + import java.beans.VetoableChangeSupport; + import java.util.ArrayList; ++import java.util.Collection; + import java.util.Collections; ++import java.util.HashMap; + import java.util.HashSet; + import java.util.Iterator; + import java.util.List; ++import java.util.Map; + import java.util.Set; + ++// FIXME: finish documentation ++ + /** + * ++ * FIXME: discuss applet contexts and thread groups and codebases ++ * being insulated. ++ * ++ * FIXME: discuss where default focus traversal key sets apply ++ * (inherited by child Components etc.) ++ * + * @author Eric Blake ++ * @author Thomas Fitzsimmons + * @since 1.4 + * @status partially updated to 1.4, needs documentation. + */ + public abstract class KeyboardFocusManager + implements KeyEventDispatcher, KeyEventPostProcessor + { ++ /** Identifies {@link AWTKeyStroke}s that move the focus forward in ++ the focus cycle. */ + public static final int FORWARD_TRAVERSAL_KEYS = 0; ++ ++ /** Identifies {@link AWTKeyStroke}s that move the focus backward in ++ the focus cycle. */ + public static final int BACKWARD_TRAVERSAL_KEYS = 1; ++ ++ /** Identifies {@link AWTKeyStroke}s that move the focus up to the ++ parent focus cycle root. */ + public static final int UP_CYCLE_TRAVERSAL_KEYS = 2; ++ ++ /** Identifies {@link AWTKeyStroke}s that move the focus down to the ++ child focus cycle root. */ + public static final int DOWN_CYCLE_TRAVERSAL_KEYS = 3; + ++ /** The set of {@link AWTKeyStroke}s that cause focus to be moved to ++ the next focusable Component in the focus cycle. */ + private static final Set DEFAULT_FORWARD_KEYS; ++ ++ /** The set of {@link AWTKeyStroke}s that cause focus to be moved to ++ the previous focusable Component in the focus cycle. */ + private static final Set DEFAULT_BACKWARD_KEYS; ++ ++ /** Populate the DEFAULT_FORWARD_KEYS and DEFAULT_BACKWARD_KEYS ++ {@link java.util.Set}s. */ + static + { + Set s = new HashSet(); +@@ -83,232 +115,405 @@ + DEFAULT_BACKWARD_KEYS = Collections.unmodifiableSet(s); + } + +- private static KeyboardFocusManager current +- = new DefaultKeyboardFocusManager(); +- +- // XXX Not implemented correctly. I think a good implementation here may +- // be to have permanentFocusOwner be null, and fall back to focusOwner, +- // unless a temporary focus change is in effect. +- private static Component focusOwner; +- private static Component permanentFocusOwner; +- +- private static Window focusedWindow; +- private static Window activeWindow; +- private static Container focusCycleRoot; ++ /** The global object {@link java.util.Map}s. */ + ++ /** For security reasons, {@link java.applet.Applet}s in different ++ codebases must be insulated from one another. Since {@link ++ KeyboardFocusManager}s have the ability to return {@link ++ Component}s from a given {@link java.applet.Applet}, each ++ codebase must have an independent {@link KeyboardFocusManager}. ++ Since each codebase has its own {@link ThreadGroup} in which its ++ {@link Applet}s run, it makes sense to partition {@link ++ KeyboardFocusManager}s according to {@link ++ java.lang.ThreadGroup}. Thus, currentKeyboardFocusManagers is a ++ {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}. */ ++ private static Map currentKeyboardFocusManagers = new HashMap (); ++ ++ /** {@link java.applet.Applet}s in one codebase must not be allowed ++ to access {@link Component}s in {@link java.applet.Applet}s in ++ other codebases. To enforce this restriction, we key the ++ following {@link java.util.Map}s on {@link java.lang.ThreadGroup}s (which ++ are per-codebase). For example, if {@link ++ java.lang.ThreadGroup} A calls {@link #setGlobalFocusOwner}, ++ passing {@link Component} C, currentFocusOwners[A] is assigned ++ C, and all other currentFocusOwners values are nullified. Then ++ if {@link java.lang.ThreadGroup} A subsequently calls {@link ++ #getGlobalFocusOwner}, it will return currentFocusOwners[A], ++ that is, {@link Component} C. If another {@link ++ java.lang.ThreadGroup} K calls {@link #getGlobalFocusOwner}, it ++ will return currentFocusOwners[K], that is, null. ++ ++ Since this is a static field, we ensure that there is only one ++ focused {@link Component} per class loader. */ ++ private static Map currentFocusOwners = new HashMap (); ++ ++ /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s ++ that stores the {@link Component} that owns the permanent ++ keyboard focus. @see currentFocusOwners */ ++ private static Map currentPermanentFocusOwners = new HashMap (); ++ ++ /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s ++ that stores the focused {@link Window}. @see ++ currentFocusOwners */ ++ private static Map currentFocusedWindows = new HashMap (); ++ ++ /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s ++ that stores the active {@link Window}. @see ++ currentFocusOwners */ ++ private static Map currentActiveWindows = new HashMap (); ++ ++ /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s ++ that stores the focus cycle root {@link Container}. @see ++ currentFocusOwners */ ++ private static Map currentFocusCycleRoots = new HashMap (); ++ ++ /** The default {@link FocusTraveralPolicy} that focus-managing ++ {@link Container}s will use to define their initial focus ++ traversal policy. */ + private FocusTraversalPolicy defaultPolicy; +- private Set[] defaultFocusKeys = new Set[] { ++ ++ /** An array that stores the {@link #FORWARD_TRAVERSAL_KEYS}, {@link ++ #BACKWARD_TRAVERSAL_KEYS}, {@link #UP_CYCLE_TRAVERSAL_KEYS} and ++ {@link #DOWN_CYCLE_TRAVERSAL_KEYS} {@link AWTKeyStroke}s {@link ++ java.util.Set}s. */ ++ private Set[] defaultFocusKeys = new Set[] ++ { + DEFAULT_FORWARD_KEYS, DEFAULT_BACKWARD_KEYS, + Collections.EMPTY_SET, Collections.EMPTY_SET + }; + +- private final PropertyChangeSupport propertyChangeSupport +- = new PropertyChangeSupport(this); +- private final VetoableChangeSupport vetoableChangeSupport +- = new VetoableChangeSupport(this); ++ private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport (this); ++ private final VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport (this); ++ ++ /** A list of {@link KeyEventDispatcher}s that process {@link ++ KeyEvent}s before they are processed the default keyboard focus ++ manager. */ + private final ArrayList keyEventDispatchers = new ArrayList(); +- private final ArrayList keyEventPostProcessors = new ArrayList(); + +- +- public KeyboardFocusManager() +- { +- } ++ /** A list of {@link KeyEventPostProcessor}s that process unconsumed ++ {@link KeyEvent}s. */ ++ private final ArrayList keyEventPostProcessors = new ArrayList(); + +- public static KeyboardFocusManager getCurrentKeyboardFocusManager() ++ /** ++ * Construct a KeyboardFocusManager. ++ */ ++ public KeyboardFocusManager () + { +- // XXX Need a way to divide this into contexts. +- return current; + } + +- public static void setCurrentKeyboardFocusManager(KeyboardFocusManager m) ++ /** ++ * Retrieve the keyboard focus manager associated with the {@link ++ * java.lang.ThreadGroup} to which the calling thread belongs. ++ * ++ * @return the keyboard focus manager associated with the current ++ * thread group ++ */ ++ public static KeyboardFocusManager getCurrentKeyboardFocusManager () ++ { ++ ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); ++ return (KeyboardFocusManager) currentKeyboardFocusManagers.get (currentGroup); ++ } ++ ++ /** ++ * Set the keyboard focus manager associated with the {@link ++ * java.lang.ThreadGroup} to which the calling thread belongs. ++ * ++ * @param m the keyboard focus manager for the current thread group ++ */ ++ public static void setCurrentKeyboardFocusManager (KeyboardFocusManager m) + { +- SecurityManager sm = System.getSecurityManager(); ++ SecurityManager sm = System.getSecurityManager (); + if (sm != null) +- sm.checkPermission(new AWTPermission("replaceKeyboardFocusManager")); +- // XXX Need a way to divide this into contexts. +- current = m == null ? new DefaultKeyboardFocusManager() : m; +- } ++ sm.checkPermission (new AWTPermission ("replaceKeyboardFocusManager")); + +- public Component getFocusOwner() +- { +- // XXX Need an easy way to test if this thread is in the context of the +- // global focus owner, to avoid creating the exception in the first place. +- try +- { +- return getGlobalFocusOwner(); +- } +- catch (SecurityException e) +- { +- return null; +- } +- } +- +- protected Component getGlobalFocusOwner() +- { +- // XXX Need a way to test if this thread is in the context of the focus +- // owner, and throw a SecurityException if that is the case. +- // XXX Implement. +- return focusOwner; +- } ++ ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); ++ KeyboardFocusManager manager; + +- protected void setGlobalFocusOwner(Component owner) ++ if (m == null) ++ manager = new DefaultKeyboardFocusManager (); ++ else ++ manager = m; ++ ++ currentKeyboardFocusManagers.put (currentGroup, manager); ++ } ++ ++ /** ++ * Retrieve the {@link Component} that has the keyboard focus, or ++ * null if the focus owner was not set by a thread in the current ++ * {@link java.lang.ThreadGroup}. ++ * ++ * @return the keyboard focus owner or null ++ */ ++ public Component getFocusOwner () ++ { ++ Component owner = (Component) getObject (currentFocusOwners); ++ if (owner == null) ++ owner = (Component) getObject (currentPermanentFocusOwners); ++ return owner; ++ } ++ ++ /** ++ * Retrieve the {@link Component} that has the keyboard focus, ++ * regardless of whether or not it was set by a thread in the ++ * current {@link java.lang.ThreadGroup}. If there is no temporary ++ * focus owner in effect then this method will return the same value ++ * as {@link #getGlobalPermanentFocusOwner}. ++ * ++ * @return the keyboard focus owner ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ */ ++ protected Component getGlobalFocusOwner () ++ { ++ // Check if there is a temporary focus owner. ++ Component focusOwner = (Component) getGlobalObject (currentFocusOwners); ++ ++ return (focusOwner == null) ? getGlobalPermanentFocusOwner () : focusOwner; ++ } ++ ++ /** ++ * Set the {@link Component} that will be returned by {@link ++ * #getFocusOwner} (when it is called from the current {@link ++ * java.lang.ThreadGroup}) and {@link #getGlobalFocusOwner}. This ++ * method does not actually transfer the keyboard focus. ++ * ++ * @param owner the Component to return from getFocusOwner and ++ * getGlobalFocusOwner ++ * ++ * @see Component.requestFocus () ++ * @see Component.requestFocusInWindow () ++ */ ++ protected void setGlobalFocusOwner (Component owner) + { +- // XXX Should this send focus events to the components involved? + if (owner == null || owner.focusable) +- { +- firePropertyChange("focusOwner", focusOwner, owner); +- try +- { +- fireVetoableChange("focusOwner", focusOwner, owner); +- focusOwner = owner; +- } +- catch (PropertyVetoException e) +- { +- } +- } ++ setGlobalObject (currentFocusOwners, owner, "focusOwner"); + } + +- public void clearGlobalFocusOwner() ++ /** ++ * Clear the global focus owner and deliver a FOCUS_LOST event to ++ * the previously-focused {@link Component}. Until another {@link ++ * Component} becomes the keyboard focus owner, key events will be ++ * discarded by top-level windows. ++ */ ++ public void clearGlobalFocusOwner () + { +- // XXX Is this enough? +- setGlobalFocusOwner(null); +- } +- +- public Component getPermanentFocusOwner() +- { +- // XXX Need an easy way to test if this thread is in the context of the +- // global focus owner, to avoid creating the exception in the first place. +- try ++ synchronized (currentFocusOwners) + { +- return getGlobalPermanentFocusOwner(); +- } +- catch (SecurityException e) +- { +- return null; +- } +- } ++ Component focusOwner = getGlobalFocusOwner (); ++ Component permanentFocusOwner = getGlobalPermanentFocusOwner (); + +- protected Component getGlobalPermanentFocusOwner() +- { +- // XXX Need a way to test if this thread is in the context of the focus +- // owner, and throw a SecurityException if that is the case. +- // XXX Implement. +- return permanentFocusOwner == null ? focusOwner : permanentFocusOwner; +- } ++ setGlobalFocusOwner (null); ++ setGlobalPermanentFocusOwner (null); + +- protected void setGlobalPermanentFocusOwner(Component focusOwner) +- { +- // XXX Should this send focus events to the components involved? +- if (focusOwner == null || focusOwner.focusable) +- { +- firePropertyChange("permanentFocusOwner", permanentFocusOwner, +- focusOwner); +- try ++ // Inform the old focus owner that it has lost permanent ++ // focus. ++ if (focusOwner != null) + { +- fireVetoableChange("permanentFocusOwner", permanentFocusOwner, +- focusOwner); +- permanentFocusOwner = focusOwner; ++ // We can't cache the event queue, because of ++ // bootstrapping issues. We need to set the default ++ // KeyboardFocusManager in EventQueue before the event ++ // queue is started. ++ EventQueue q = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ if (focusOwner != permanentFocusOwner) ++ q.postEvent (new FocusEvent (focusOwner, FocusEvent.FOCUS_LOST, true)); ++ else ++ q.postEvent (new FocusEvent (focusOwner, FocusEvent.FOCUS_LOST, false)); + } +- catch (PropertyVetoException e) ++ ++ if (focusOwner != permanentFocusOwner) + { ++ EventQueue q = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ q.postEvent (new FocusEvent (permanentFocusOwner, FocusEvent.FOCUS_LOST, false)); + } + } + } + +- public Window getFocusedWindow() ++ /** ++ * Retrieve the {@link Component} that has the permanent keyboard ++ * focus, or null if the focus owner was not set by a thread in the ++ * current {@link java.lang.ThreadGroup}. ++ * ++ * @return the keyboard focus owner or null ++ */ ++ public Component getPermanentFocusOwner () ++ { ++ return (Component) getObject (currentPermanentFocusOwners); ++ } ++ ++ /** ++ * Retrieve the {@link Component} that has the permanent keyboard ++ * focus, regardless of whether or not it was set by a thread in the ++ * current {@link java.lang.ThreadGroup}. ++ * ++ * @return the keyboard focus owner ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ */ ++ protected Component getGlobalPermanentFocusOwner () ++ { ++ return (Component) getGlobalObject (currentPermanentFocusOwners); ++ } ++ ++ /** ++ * Set the {@link Component} that will be returned by {@link ++ * #getPermanentFocusOwner} (when it is called from the current ++ * {@link java.lang.ThreadGroup}) and {@link ++ * #getGlobalPermanentFocusOwner}. This method does not actually ++ * transfer the keyboard focus. ++ * ++ * @param focusOwner the Component to return from ++ * getPermanentFocusOwner and getGlobalPermanentFocusOwner ++ * ++ * @see Component.requestFocus () ++ * @see Component.requestFocusInWindow () ++ */ ++ protected void setGlobalPermanentFocusOwner (Component focusOwner) + { +- // XXX Need an easy way to test if this thread is in the context of the +- // global focus owner, to avoid creating the exception in the first place. +- try +- { +- return getGlobalFocusedWindow(); +- } +- catch (SecurityException e) +- { +- return null; +- } +- } +- +- protected Window getGlobalFocusedWindow() +- { +- // XXX Need a way to test if this thread is in the context of the focus +- // owner, and throw a SecurityException if that is the case. +- // XXX Implement. +- return focusedWindow; ++ if (focusOwner == null || focusOwner.focusable) ++ setGlobalObject (currentPermanentFocusOwners, focusOwner, ++ "permanentFocusOwner"); + } + +- protected void setGlobalFocusedWindow(Window window) ++ /** ++ * Retrieve the {@link Window} that is or contains the keyboard ++ * focus owner, or null if the focused window was not set by a ++ * thread in the current {@link java.lang.ThreadGroup}. ++ * ++ * @return the focused window or null ++ */ ++ public Window getFocusedWindow () ++ { ++ return (Window) getObject (currentFocusedWindows); ++ } ++ ++ /** ++ * Retrieve the {@link Window} that is or contains the focus owner, ++ * regardless of whether or not the {@link Window} was set focused ++ * by a thread in the current {@link java.lang.ThreadGroup}. ++ * ++ * @return the focused window ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ */ ++ protected Window getGlobalFocusedWindow () ++ { ++ return (Window) getGlobalObject (currentFocusedWindows); ++ } ++ ++ /** ++ * Set the {@link Window} that will be returned by {@link ++ * #getFocusedWindow} (when it is called from the current {@link ++ * java.lang.ThreadGroup}) and {@link #getGlobalFocusedWindow}. ++ * This method does not actually cause window to become ++ * the focused {@link Window}. ++ * ++ * @param window the Window to return from getFocusedWindow and ++ * getGlobalFocusedWindow ++ */ ++ protected void setGlobalFocusedWindow (Window window) + { +- // XXX Should this send focus events to the windows involved? + if (window == null || window.focusable) +- { +- firePropertyChange("focusedWindow", focusedWindow, window); +- try +- { +- fireVetoableChange("focusedWindow", focusedWindow, window); +- focusedWindow = window; +- } +- catch (PropertyVetoException e) +- { +- } +- } ++ setGlobalObject (currentFocusedWindows, window, "focusedWindow"); + } + ++ /** ++ * Retrieve the active {@link Window}, or null if the active window ++ * was not set by a thread in the current {@link ++ * java.lang.ThreadGroup}. ++ * ++ * @return the active window or null ++ */ + public Window getActiveWindow() + { +- // XXX Need an easy way to test if this thread is in the context of the +- // global focus owner, to avoid creating the exception in the first place. +- try +- { +- return getGlobalActiveWindow(); +- } +- catch (SecurityException e) +- { +- return null; +- } ++ return (Window) getObject (currentActiveWindows); + } + ++ /** ++ * Retrieve the active {@link Window}, regardless of whether or not ++ * the {@link Window} was made active by a thread in the current ++ * {@link java.lang.ThreadGroup}. ++ * ++ * @return the active window ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ */ + protected Window getGlobalActiveWindow() + { +- // XXX Need a way to test if this thread is in the context of the focus +- // owner, and throw a SecurityException if that is the case. +- // XXX Implement. +- return activeWindow; ++ return (Window) getGlobalObject (currentActiveWindows); + } + ++ /** ++ * Set the {@link Window} that will be returned by {@link ++ * #getActiveWindow} (when it is called from the current {@link ++ * java.lang.ThreadGroup}) and {@link #getGlobalActiveWindow}. This ++ * method does not actually cause window to be made ++ * active. ++ * ++ * @param window the Window to return from getActiveWindow and ++ * getGlobalActiveWindow ++ */ + protected void setGlobalActiveWindow(Window window) + { +- // XXX Should this send focus events to the windows involved? +- firePropertyChange("activeWindow", activeWindow, window); +- try +- { +- fireVetoableChange("activeWindow", activeWindow, window); +- activeWindow = window; +- } +- catch (PropertyVetoException e) +- { +- } ++ setGlobalObject (currentActiveWindows, window, "activeWindow"); + } + +- public FocusTraversalPolicy getDefaultFocusTraversalPolicy() ++ /** ++ * Retrieve the default {@link FocusTraversalPolicy}. ++ * Focus-managing {@link Container}s use the returned object to ++ * define their initial focus traversal policy. ++ * ++ * @return a non-null default FocusTraversalPolicy object ++ */ ++ public FocusTraversalPolicy getDefaultFocusTraversalPolicy () + { + if (defaultPolicy == null) +- defaultPolicy = new DefaultFocusTraversalPolicy(); ++ defaultPolicy = new DefaultFocusTraversalPolicy (); + return defaultPolicy; + } + +- public void setDefaultFocusTraversalPolicy(FocusTraversalPolicy policy) ++ /** ++ * Set the {@link FocusTraversalPolicy} returned by {@link ++ * #getDefaultFocusTraversalPolicy}. Focus-managing {@link ++ * Container}s created after this call will use policy as their ++ * initial focus traversal policy. Existing {@link Container}s' ++ * focus traversal policies will not be affected by calls to this ++ * method. ++ * ++ * @param policy the FocusTraversalPolicy that will be returned by ++ * subsequent calls to getDefaultFocusTraversalPolicy ++ * @throws IllegalArgumentException if policy is null ++ */ ++ public void setDefaultFocusTraversalPolicy (FocusTraversalPolicy policy) + { + if (policy == null) +- throw new IllegalArgumentException(); +- firePropertyChange("defaultFocusTraversalPolicy", defaultPolicy, policy); ++ throw new IllegalArgumentException (); ++ firePropertyChange ("defaultFocusTraversalPolicy", defaultPolicy, policy); + defaultPolicy = policy; + } + +- public void setDefaultFocusTraversalKeys(int id, Set keystrokes) +- { ++ /** ++ * Set the default {@link java.util.Set} of focus traversal keys for ++ * one of the focus traversal directions. ++ * ++ * @param id focus traversal direction identifier ++ * @param keystrokes set of AWTKeyStrokes ++ * ++ * @see #FORWARD_TRAVERSAL_KEYS ++ * @see #BACKWARD_TRAVERSAL_KEYS ++ * @see #UP_CYCLE_TRAVERSAL_KEYS ++ * @see #DOWN_CYCLE_TRAVERSAL_KEYS ++ */ ++ public void setDefaultFocusTraversalKeys (int id, Set keystrokes) ++ { ++ if (id != KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS && ++ id != KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS) ++ throw new IllegalArgumentException (); ++ + if (keystrokes == null) +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); ++ + Set sa; + Set sb; + Set sc; +@@ -340,56 +545,82 @@ + type = "downCycleDefaultFocusTraversalKeys"; + break; + default: +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); + } +- int i = keystrokes.size(); +- Iterator iter = keystrokes.iterator(); ++ int i = keystrokes.size (); ++ Iterator iter = keystrokes.iterator (); + while (--i >= 0) + { +- Object o = iter.next(); +- if (! (o instanceof AWTKeyStroke) +- || sa.contains(o) || sb.contains(o) || sc.contains(o) ++ Object o = iter.next (); ++ if (!(o instanceof AWTKeyStroke) ++ || sa.contains (o) || sb.contains (o) || sc.contains (o) + || ((AWTKeyStroke) o).keyCode == KeyEvent.VK_UNDEFINED) +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); + } +- keystrokes = Collections.unmodifiableSet(new HashSet(keystrokes)); +- firePropertyChange(type, defaultFocusKeys[id], keystrokes); ++ keystrokes = Collections.unmodifiableSet (new HashSet (keystrokes)); ++ firePropertyChange (type, defaultFocusKeys[id], keystrokes); + defaultFocusKeys[id] = keystrokes; + } + +- public Set getDefaultFocusTraversalKeys(int id) ++ /** ++ * Retrieve the default {@link java.util.Set} of focus traversal ++ * keys for one of the focus traversal directions. ++ * ++ * @param id focus traversal direction identifier ++ * ++ * @return the default set of AWTKeyStrokes ++ * ++ * @see #FORWARD_TRAVERSAL_KEYS ++ * @see #BACKWARD_TRAVERSAL_KEYS ++ * @see #UP_CYCLE_TRAVERSAL_KEYS ++ * @see #DOWN_CYCLE_TRAVERSAL_KEYS ++ */ ++ public Set getDefaultFocusTraversalKeys (int id) + { + if (id < FORWARD_TRAVERSAL_KEYS || id > DOWN_CYCLE_TRAVERSAL_KEYS) +- throw new IllegalArgumentException(); ++ throw new IllegalArgumentException (); + return defaultFocusKeys[id]; + } + +- public Container getCurrentFocusCycleRoot() ++ /** ++ * Retrieve the current focus cycle root, or null if the focus owner ++ * was not set by a thread in the current {@link ++ * java.lang.ThreadGroup}. ++ * ++ * @return the current focus cycle root or null ++ */ ++ public Container getCurrentFocusCycleRoot () ++ { ++ return (Container) getObject (currentFocusCycleRoots); ++ } ++ ++ /** ++ * Retrieve the current focus cycle root, regardless of whether or ++ * not it was made set by a thread in the current {@link ++ * java.lang.ThreadGroup}. ++ * ++ * @return the current focus cycle root ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ */ ++ protected Container getGlobalCurrentFocusCycleRoot () ++ { ++ return (Container) getGlobalObject (currentFocusCycleRoots); ++ } ++ ++ /** ++ * Set the {@link Container} that will be returned by {@link ++ * #getCurrentFocusCycleRoot} (when it is called from the current ++ * {@link java.lang.ThreadGroup}) and {@link ++ * #getGlobalCurrentFocusCycleRoot}. This method does not actually ++ * make cycleRoot the current focus cycle root. ++ * ++ * @param cycleRoot the focus cycle root to return from ++ * getCurrentFocusCycleRoot and getGlobalCurrentFocusCycleRoot ++ */ ++ public void setGlobalCurrentFocusCycleRoot (Container cycleRoot) + { +- // XXX Need an easy way to test if this thread is in the context of the +- // global focus owner, to avoid creating the exception in the first place. +- try +- { +- return getGlobalCurrentFocusCycleRoot(); +- } +- catch (SecurityException e) +- { +- return null; +- } +- } +- +- protected Container getGlobalCurrentFocusCycleRoot() +- { +- // XXX Need a way to test if this thread is in the context of the focus +- // owner, and throw a SecurityException if that is the case. +- // XXX Implement. +- return focusCycleRoot; +- } +- +- public void setGlobalCurrentFocusCycleRoot(Container cycleRoot) +- { +- firePropertyChange("currentFocusCycleRoot", focusCycleRoot, cycleRoot); +- focusCycleRoot = cycleRoot; ++ setGlobalObject (currentFocusCycleRoots, cycleRoot, "currentFocusCycleRoot"); + } + + public void addPropertyChangeListener(PropertyChangeListener l) +@@ -484,73 +715,199 @@ + keyEventDispatchers.remove(dispatcher); + } + +- protected List getKeyEventDispatchers() ++ protected List getKeyEventDispatchers () + { +- return (List) keyEventDispatchers.clone(); ++ return (List) keyEventDispatchers.clone (); + } + +- public void addKeyEventPostProcessor(KeyEventPostProcessor postProcessor) ++ public void addKeyEventPostProcessor (KeyEventPostProcessor postProcessor) + { + if (postProcessor != null) +- keyEventPostProcessors.add(postProcessor); ++ keyEventPostProcessors.add (postProcessor); + } + +- public void removeKeyEventPostProcessor(KeyEventPostProcessor postProcessor) ++ public void removeKeyEventPostProcessor (KeyEventPostProcessor postProcessor) + { +- keyEventPostProcessors.remove(postProcessor); ++ keyEventPostProcessors.remove (postProcessor); + } + +- protected List getKeyEventPostProcessors() ++ protected List getKeyEventPostProcessors () + { +- return (List) keyEventPostProcessors.clone(); ++ return (List) keyEventPostProcessors.clone (); + } + +- public abstract boolean dispatchEvent(AWTEvent e); ++ public abstract boolean dispatchEvent (AWTEvent e); + +- public final void redispatchEvent(Component target, AWTEvent e) ++ public final void redispatchEvent (Component target, AWTEvent e) + { +- throw new Error("not implemented"); ++ synchronized (e) ++ { ++ e.setSource (target); ++ target.dispatchEvent (e); ++ } + } + +- public abstract boolean dispatchKeyEvent(KeyEvent e); ++ public abstract boolean dispatchKeyEvent (KeyEvent e); + +- public abstract boolean postProcessKeyEvent(KeyEvent e); ++ public abstract boolean postProcessKeyEvent (KeyEvent e); + +- public abstract void processKeyEvent(Component focused, KeyEvent e); ++ public abstract void processKeyEvent (Component focused, KeyEvent e); + +- protected abstract void enqueueKeyEvents(long after, Component untilFocused); ++ protected abstract void enqueueKeyEvents (long after, Component untilFocused); + +- protected abstract void dequeueKeyEvents(long after, Component untilFocused); ++ protected abstract void dequeueKeyEvents (long after, Component untilFocused); + +- protected abstract void discardKeyEvents(Component comp); ++ protected abstract void discardKeyEvents (Component comp); + +- public abstract void focusNextComponent(Component comp); ++ public abstract void focusNextComponent (Component comp); + +- public abstract void focusPreviousComponent(Component comp); ++ public abstract void focusPreviousComponent (Component comp); + +- public abstract void upFocusCycle(Component comp); ++ public abstract void upFocusCycle (Component comp); + +- public abstract void downFocusCycle(Container cont); ++ public abstract void downFocusCycle (Container cont); + +- public final void focusNextComponent() ++ public final void focusNextComponent () + { +- focusNextComponent(focusOwner); ++ focusNextComponent (null); + } + +- public final void focusPreviousComponent() ++ public final void focusPreviousComponent () + { +- focusPreviousComponent(focusOwner); ++ focusPreviousComponent (null); + } + +- public final void upFocusCycle() ++ public final void upFocusCycle () + { +- upFocusCycle(focusOwner); ++ upFocusCycle (null); + } + +- public final void downFocusCycle() ++ public final void downFocusCycle () + { ++ Component focusOwner = getGlobalFocusOwner (); + if (focusOwner instanceof Container +- && ((Container) focusOwner).isFocusCycleRoot()) +- downFocusCycle((Container) focusOwner); ++ && ((Container) focusOwner).isFocusCycleRoot ()) ++ downFocusCycle ((Container) focusOwner); ++ } ++ ++ /** ++ * Retrieve an object from one of the global object {@link ++ * java.util.Map}s, if the object was set by the a thread in the ++ * current {@link java.lang.ThreadGroup}. Otherwise, return null. ++ * ++ * @param globalMap one of the global object Maps ++ * ++ * @return a global object set by the current ThreadGroup, or null ++ * ++ * @see getFocusOwner ++ * @see getPermanentFocusOwner ++ * @see getFocusedWindow ++ * @see getActiveWindow ++ * @see getCurrentFocusCycleRoot ++ */ ++ private Object getObject (Map globalMap) ++ { ++ ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); ++ return globalMap.get (currentGroup); ++ } ++ ++ /** ++ * Retrieve an object from one of the global object {@link ++ * java.util.Map}s, regardless of whether or not the object was set ++ * by a thread in the current {@link java.lang.ThreadGroup}. ++ * ++ * @param globalMap one of the global object Maps ++ * ++ * @return a global object set by the current ThreadGroup, or null ++ * ++ * @throws SecurityException if this is not the keyboard focus ++ * manager associated with the current {@link java.lang.ThreadGroup} ++ * ++ * @see getGlobalFocusOwner ++ * @see getGlobalPermanentFocusOwner ++ * @see getGlobalFocusedWindow ++ * @see getGlobalActiveWindow ++ * @see getGlobalCurrentFocusCycleRoot ++ */ ++ private Object getGlobalObject (Map globalMap) ++ { ++ ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); ++ KeyboardFocusManager managerForCallingThread ++ = (KeyboardFocusManager) currentKeyboardFocusManagers.get (currentGroup); ++ ++ if (this != managerForCallingThread) ++ throw new SecurityException ("Attempted to retrieve an object from a " ++ + "keyboard focus manager that isn't " ++ + "associated with the current thread group."); ++ ++ synchronized (globalMap) ++ { ++ Collection globalObjects = globalMap.values (); ++ Iterator i = globalObjects.iterator (); ++ Component globalObject; ++ ++ while (i.hasNext ()) ++ { ++ globalObject = (Component) i.next (); ++ if (globalObject != null) ++ return globalObject; ++ } ++ } ++ ++ // No Object was found. ++ return null; ++ } ++ ++ /** ++ * Set an object in one of the global object {@link java.util.Map}s, ++ * that will be returned by subsequent calls to getGlobalObject on ++ * the same {@link java.util.Map}. ++ * ++ * @param globalMap one of the global object Maps ++ * @param newObject the object to set ++ * @param property the property that will change ++ * ++ * @see setGlobalFocusOwner ++ * @see setGlobalPermanentFocusOwner ++ * @see setGlobalFocusedWindow ++ * @see setGlobalActiveWindow ++ * @see setGlobalCurrentFocusCycleRoot ++ */ ++ private void setGlobalObject (Map globalMap, ++ Object newObject, ++ String property) ++ { ++ synchronized (globalMap) ++ { ++ // Save old object. ++ Object oldObject = getGlobalObject (globalMap); ++ ++ // Nullify old object. ++ Collection threadGroups = globalMap.keySet (); ++ Iterator i = threadGroups.iterator (); ++ while (i.hasNext ()) ++ { ++ ThreadGroup oldThreadGroup = (ThreadGroup) i.next (); ++ if (globalMap.get (oldThreadGroup) != null) ++ { ++ globalMap.put (oldThreadGroup, null); ++ // There should only be one object set at a time, so ++ // we can short circuit. ++ break; ++ } ++ } ++ ++ ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); ++ firePropertyChange (property, oldObject, newObject); ++ try ++ { ++ fireVetoableChange (property, oldObject, newObject); ++ // Set new object. ++ globalMap.put (currentGroup, newObject); ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } + } +-} // class KeyboardFocusManager ++} +Index: java/awt/LayoutManager2.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/LayoutManager2.java,v +retrieving revision 1.6 +diff -u -r1.6 LayoutManager2.java +--- java/awt/LayoutManager2.java 9 Aug 2002 04:26:14 -0000 1.6 ++++ java/awt/LayoutManager2.java 6 Sep 2004 16:35:45 -0000 +@@ -52,12 +52,12 @@ + { + /** + * Adds the specified component to the layout, with the specified +- * constraint object. ++ * constraints object. + * + * @param component the component to add +- * @param constraint the constraint to satisfy ++ * @param constraints the constraints to satisfy + */ +- void addLayoutComponent(Component component, Object contraint); ++ void addLayoutComponent(Component component, Object contraints); + + /** + * Determines the maximum size of the specified target container. +Index: java/awt/List.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/List.java,v +retrieving revision 1.16 +diff -u -r1.16 List.java +--- java/awt/List.java 19 Dec 2003 02:53:36 -0000 1.16 ++++ java/awt/List.java 6 Sep 2004 16:35:45 -0000 +@@ -175,7 +175,7 @@ + public int + getItemCount() + { +- return(items.size()); ++ return countItems (); + } + + /*************************************************************************/ +@@ -191,7 +191,7 @@ + public int + countItems() + { +- return(getItemCount()); ++ return items.size (); + } + + /*************************************************************************/ +@@ -249,7 +249,7 @@ + public boolean + isMultipleMode() + { +- return(multipleMode); ++ return allowsMultipleSelections (); + } + + /*************************************************************************/ +@@ -266,7 +266,7 @@ + public boolean + allowsMultipleSelections() + { +- return(multipleMode); ++ return multipleMode; + } + + /*************************************************************************/ +@@ -281,12 +281,7 @@ + public void + setMultipleMode(boolean multipleMode) + { +- this.multipleMode = multipleMode; +- if (peer != null) +- { +- ListPeer l = (ListPeer) peer; +- l.setMultipleMode (multipleMode); +- } ++ setMultipleSelections (multipleMode); + } + + /*************************************************************************/ +@@ -303,7 +298,11 @@ + public void + setMultipleSelections(boolean multipleMode) + { +- setMultipleMode(multipleMode); ++ this.multipleMode = multipleMode; ++ ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ peer.setMultipleMode (multipleMode); + } + + /*************************************************************************/ +@@ -316,7 +315,7 @@ + public Dimension + getMinimumSize() + { +- return(getMinimumSize(rows)); ++ return getMinimumSize (getRows ()); + } + + /*************************************************************************/ +@@ -332,7 +331,7 @@ + public Dimension + minimumSize() + { +- return(getMinimumSize(rows)); ++ return minimumSize (getRows ()); + } + + /*************************************************************************/ +@@ -348,11 +347,7 @@ + public Dimension + getMinimumSize(int rows) + { +- ListPeer lp = (ListPeer)getPeer(); +- if (lp != null) +- return(lp.minimumSize(rows)); +- else +- return(new Dimension(0,0)); ++ return minimumSize (rows); + } + + /*************************************************************************/ +@@ -371,7 +366,11 @@ + public Dimension + minimumSize(int rows) + { +- return(getMinimumSize(rows)); ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ return peer.minimumSize (rows); ++ else ++ return new Dimension (0, 0); + } + + /*************************************************************************/ +@@ -384,7 +383,7 @@ + public Dimension + getPreferredSize() + { +- return(getPreferredSize(rows)); ++ return getPreferredSize (getRows ()); + } + + /*************************************************************************/ +@@ -400,7 +399,7 @@ + public Dimension + preferredSize() + { +- return(getPreferredSize(rows)); ++ return preferredSize (getRows ()); + } + + /*************************************************************************/ +@@ -416,11 +415,7 @@ + public Dimension + getPreferredSize(int rows) + { +- ListPeer lp = (ListPeer)getPeer(); +- if (lp != null) +- return(lp.preferredSize(rows)); +- else +- return(new Dimension(0,0)); ++ return preferredSize (rows); + } + + /*************************************************************************/ +@@ -439,7 +434,11 @@ + public Dimension + preferredSize(int rows) + { +- return(getPreferredSize(rows)); ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ return peer.preferredSize (rows); ++ else ++ return new Dimension (0, 0); + } + + /*************************************************************************/ +@@ -452,7 +451,7 @@ + public void + add(String item) + { +- add(item, -1); ++ add (item, -1); + } + + /*************************************************************************/ +@@ -467,7 +466,7 @@ + public void + addItem(String item) + { +- addItem(item, -1); ++ addItem (item, -1); + } + + /*************************************************************************/ +@@ -484,16 +483,7 @@ + public void + add(String item, int index) + { +- if ((index == -1) || (index >= items.size())) +- items.addElement(item); +- else +- items.insertElementAt(item, index); +- +- if (peer != null) +- { +- ListPeer l = (ListPeer) peer; +- l.add (item, index); +- } ++ addItem (item, index); + } + + /*************************************************************************/ +@@ -512,7 +502,14 @@ + public void + addItem(String item, int index) + { +- add(item, index); ++ if ((index == -1) || (index >= items.size ())) ++ items.addElement (item); ++ else ++ items.insertElementAt (item, index); ++ ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ peer.add (item, index); + } + + /*************************************************************************/ +@@ -529,7 +526,11 @@ + public void + delItem(int index) throws IllegalArgumentException + { +- remove(index); ++ items.removeElementAt (index); ++ ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ peer.delItems (index, index); + } + + /*************************************************************************/ +@@ -544,12 +545,7 @@ + public void + remove(int index) throws IllegalArgumentException + { +- items.removeElementAt (index); +- if (peer != null) +- { +- ListPeer l = (ListPeer) peer; +- l.delItems (index, index); +- } ++ delItem (index); + } + + /*************************************************************************/ +@@ -613,12 +609,7 @@ + public synchronized void + removeAll() + { +- items.clear(); +- if (peer != null) +- { +- ListPeer l = (ListPeer) peer; +- l.removeAll (); +- } ++ clear (); + } + + /*************************************************************************/ +@@ -631,7 +622,11 @@ + public void + clear() + { +- removeAll(); ++ items.clear(); ++ ++ ListPeer peer = (ListPeer) getPeer (); ++ if (peer != null) ++ peer.removeAll (); + } + + /*************************************************************************/ +@@ -782,13 +777,7 @@ + public boolean + isIndexSelected(int index) + { +- int[] indexes = getSelectedIndexes(); +- +- for (int i = 0; i < indexes.length; i++) +- if (indexes[i] == index) +- return(true); +- +- return(false); ++ return isSelected (index); + } + + /*************************************************************************/ +@@ -807,7 +796,13 @@ + public boolean + isSelected(int index) + { +- return(isIndexSelected(index)); ++ int[] indexes = getSelectedIndexes (); ++ ++ for (int i = 0; i < indexes.length; i++) ++ if (indexes[i] == index) ++ return true; ++ ++ return false; + } + + /*************************************************************************/ +Index: java/awt/MediaTracker.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/MediaTracker.java,v +retrieving revision 1.5 +diff -u -r1.5 MediaTracker.java +--- java/awt/MediaTracker.java 12 Nov 2003 00:37:34 -0000 1.5 ++++ java/awt/MediaTracker.java 6 Sep 2004 16:35:45 -0000 +@@ -81,12 +81,17 @@ + status = ERRORED | COMPLETE; + else if ((flags & ALLBITS) != 0) + status = COMPLETE; +- else ++ else if ((flags & SOMEBITS) != 0) + status = LOADING; +- +- synchronized (MediaTracker.this) ++ else ++ status = 0; ++ ++ if ((status & COMPLETE) == COMPLETE) + { +- MediaTracker.this.notifyAll(); ++ synchronized (MediaTracker.this) ++ { ++ MediaTracker.this.notifyAll(); ++ } + } + // If status is not COMPLETE then we need more updates. + return (status & COMPLETE) == 0; +@@ -106,7 +111,8 @@ + e.next = head; + head = e; + // Start tracking image status. +- target.checkImage(image, e); ++ int flags = target.checkImage(image, e); ++ e.imageUpdate(image, flags, -1, -1, -1, -1); + } + + public void addImage(Image image, int id, int width, int height) +@@ -119,7 +125,8 @@ + e.height = height; + head = e; + // Start tracking image status. +- target.checkImage(image, width, height, e); ++ int flags = target.checkImage(image, width, height, e); ++ e.imageUpdate(image, flags, -1, -1, width, height); + } + + public boolean checkAll() +Index: java/awt/Menu.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Menu.java,v +retrieving revision 1.13 +diff -u -r1.13 Menu.java +--- java/awt/Menu.java 11 Jun 2003 10:37:47 -0000 1.13 ++++ java/awt/Menu.java 6 Sep 2004 16:35:45 -0000 +@@ -1,5 +1,5 @@ + /* Menu.java -- A Java AWT Menu +- Copyright (C) 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -41,6 +41,7 @@ + import java.awt.peer.MenuPeer; + import java.io.Serializable; + import java.util.Vector; ++import java.util.Enumeration; + + /** + * This class represents a pull down or tear off menu in Java's AWT. +@@ -81,7 +82,7 @@ + // From the serialization spec. FIXME: what should it be? + private int menuSerializedDataVersion; + +-static final MenuItem separator = new MenuItem("-"); ++static final String separatorLabel = "-"; + + /*************************************************************************/ + +@@ -170,7 +171,7 @@ + public int + getItemCount() + { +- return(items.size()); ++ return countItems (); + } + + /** +@@ -182,7 +183,7 @@ + */ + public int countItems () + { +- return getItemCount (); ++ return items.size (); + } + + /*************************************************************************/ +@@ -294,7 +295,7 @@ + public void + addSeparator() + { +- add(separator); ++ add(new MenuItem(separatorLabel)); + } + + /*************************************************************************/ +@@ -312,7 +313,7 @@ + public void + insertSeparator(int index) + { +- insert(separator, index); ++ insert(new MenuItem(separatorLabel), index); + } + + /*************************************************************************/ +@@ -376,8 +377,14 @@ + public void + addNotify() + { +- if (peer != null) ++ if (peer == null) + peer = getToolkit().createMenu(this); ++ Enumeration e = items.elements(); ++ while (e.hasMoreElements()) ++ { ++ MenuItem mi = (MenuItem)e.nextElement(); ++ mi.addNotify(); ++ } + super.addNotify (); + } + +@@ -389,6 +396,12 @@ + public void + removeNotify() + { ++ Enumeration e = items.elements(); ++ while (e.hasMoreElements()) ++ { ++ MenuItem mi = (MenuItem) e.nextElement(); ++ mi.removeNotify(); ++ } + super.removeNotify(); + } + +Index: java/awt/MenuBar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/MenuBar.java,v +retrieving revision 1.10 +diff -u -r1.10 MenuBar.java +--- java/awt/MenuBar.java 2 Jan 2003 00:14:22 -0000 1.10 ++++ java/awt/MenuBar.java 6 Sep 2004 16:35:45 -0000 +@@ -1,5 +1,5 @@ + /* MenuBar.java -- An AWT menu bar class +- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -128,15 +128,15 @@ + helpMenu.removeNotify (); + helpMenu.parent = null; + } ++ helpMenu = menu; + + if (menu.parent != null) + menu.parent.remove (menu); +- if (menu.parent != null) +- menu.parent.remove (menu); + menu.parent = this; + + if (peer != null) + { ++ menu.addNotify(); + MenuBarPeer mp = (MenuBarPeer) peer; + mp.addHelpMenu (menu); + } +@@ -163,8 +163,7 @@ + + if (peer != null) + { +- MenuBarPeer mp = (MenuBarPeer) peer; +- mp.addMenu (menu); ++ menu.addNotify(); + } + + return(menu); +@@ -219,8 +218,7 @@ + public int + getMenuCount() + { +- // FIXME: How does the help menu fit in here? +- return(menus.size()); ++ return countMenus (); + } + + /*************************************************************************/ +@@ -235,7 +233,8 @@ + public int + countMenus() + { +- return(getMenuCount()); ++ // FIXME: How does the help menu fit in here? ++ return menus.size (); + } + + /*************************************************************************/ +@@ -263,6 +262,17 @@ + { + if (getPeer() == null) + setPeer((MenuComponentPeer)getToolkit().createMenuBar(this)); ++ Enumeration e = menus.elements(); ++ while (e.hasMoreElements()) ++ { ++ Menu mi = (Menu)e.nextElement(); ++ mi.addNotify(); ++ } ++ if (helpMenu != null) ++ { ++ helpMenu.addNotify(); ++ ((MenuBarPeer) peer).addHelpMenu(helpMenu); ++ } + } + + /*************************************************************************/ +@@ -273,6 +283,12 @@ + public void + removeNotify() + { ++ Enumeration e = menus.elements(); ++ while (e.hasMoreElements()) ++ { ++ Menu mi = (Menu) e.nextElement(); ++ mi.removeNotify(); ++ } + super.removeNotify(); + } + +Index: java/awt/MenuItem.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/MenuItem.java,v +retrieving revision 1.14 +diff -u -r1.14 MenuItem.java +--- java/awt/MenuItem.java 4 Dec 2003 19:31:01 -0000 1.14 ++++ java/awt/MenuItem.java 6 Sep 2004 16:35:46 -0000 +@@ -1,5 +1,5 @@ + /* MenuItem.java -- An item in a menu +- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -77,7 +77,7 @@ + /** + * @serial Indicates whether or not this menu item is enabled. + */ +-private boolean enabled; ++private boolean enabled = true; + + /** + * @serial The mask of events that are enabled for this menu item. +@@ -202,15 +202,7 @@ + public synchronized void + setEnabled(boolean enabled) + { +- if (enabled == this.enabled) +- return; +- +- this.enabled = enabled; +- if (peer != null) +- { +- MenuItemPeer mp = (MenuItemPeer) peer; +- mp.setEnabled (enabled); +- } ++ enable (enabled); + } + + /*************************************************************************/ +@@ -226,7 +218,10 @@ + public void + enable(boolean enabled) + { +- setEnabled(enabled); ++ if (enabled) ++ enable (); ++ else ++ disable (); + } + + /*************************************************************************/ +@@ -239,7 +234,12 @@ + public void + enable() + { +- setEnabled(true); ++ if (enabled) ++ return; ++ ++ this.enabled = true; ++ if (peer != null) ++ ((MenuItemPeer) peer).setEnabled (true); + } + + /*************************************************************************/ +@@ -252,7 +252,12 @@ + public void + disable() + { +- setEnabled(false); ++ if (!enabled) ++ return; ++ ++ this.enabled = false; ++ if (peer != null) ++ ((MenuItemPeer) peer).setEnabled (false); + } + + /*************************************************************************/ +@@ -305,7 +310,10 @@ + public String + getActionCommand() + { +- return(actionCommand); ++ if (actionCommand == null) ++ return label; ++ else ++ return actionCommand; + } + + /*************************************************************************/ +@@ -361,7 +369,7 @@ + public void + addNotify() + { +- if (peer != null) ++ if (peer == null) + peer = getToolkit ().createMenuItem (this); + } + +@@ -416,6 +424,11 @@ + && (action_listeners != null + || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0)) + processEvent(e); ++ ++ // Send the event to the parent menu if it has not yet been ++ // consumed. ++ if (!e.isConsumed ()) ++ ((Menu) getParent ()).processEvent (e); + } + + /** +Index: java/awt/Panel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Panel.java,v +retrieving revision 1.8 +diff -u -r1.8 Panel.java +--- java/awt/Panel.java 5 Jun 2003 19:58:39 -0000 1.8 ++++ java/awt/Panel.java 6 Sep 2004 16:35:46 -0000 +@@ -38,6 +38,7 @@ + + package java.awt; + ++import java.awt.event.PaintEvent; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; +@@ -62,6 +63,19 @@ + /** The cached accessible context. */ + private transient AccessibleContext context; + ++ /** Flag set when the first system-requested paint event is ++ dispatched. */ ++ private transient boolean initialSystemUpdateDone; ++ ++ /** Flag set when the first application-requested paint event is ++ consumed. */ ++ private transient boolean initialUpdateConsumed; ++ ++ /* ++ * The number used to generate the name returned by getName. ++ */ ++ private static transient long next_panel_number = 0; ++ + /** + * Initializes a new instance of Panel that has a default + * layout manager of FlowLayout. +@@ -84,6 +98,36 @@ + } + + /** ++ * Consume initial application-requested paint event if it has not ++ * already been consumed, and if the initial system-requested paint ++ * event has not already been handled. Otherwise, call ++ * super.dispatchEventImpl. These extra steps are required to ++ * prevent a Panel from being painted twice when it is initially ++ * shown. ++ * ++ * @param e the event to dispatch ++ */ ++ void dispatchEventImpl (AWTEvent e) ++ { ++ if (e instanceof PaintEvent) ++ { ++ if (e.id == PaintEvent.UPDATE) ++ { ++ if (!initialUpdateConsumed ++ && !initialSystemUpdateDone) ++ { ++ e.consume (); ++ initialUpdateConsumed = true; ++ } ++ } ++ else if (e.id == PaintEvent.PAINT) ++ initialSystemUpdateDone = true; ++ } ++ else ++ super.dispatchEventImpl (e); ++ } ++ ++ /** + * Notifies this object to create its native peer. + * + * @see #isDisplayable() +@@ -141,5 +185,20 @@ + { + return AccessibleRole.PANEL; + } +- } // class AccessibleAWTPanel +-} // class Panel ++ } ++ ++ /** ++ * Generate a unique name for this panel. ++ * ++ * @return A unique name for this panel. ++ */ ++ String generateName () ++ { ++ return "panel" + getUniqueLong (); ++ } ++ ++ private static synchronized long getUniqueLong () ++ { ++ return next_panel_number++; ++ } ++} +Index: java/awt/Polygon.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Polygon.java,v +retrieving revision 1.3 +diff -u -r1.3 Polygon.java +--- java/awt/Polygon.java 8 Dec 2003 22:59:51 -0000 1.3 ++++ java/awt/Polygon.java 6 Sep 2004 16:35:46 -0000 +@@ -258,10 +258,24 @@ + */ + public Rectangle getBounds() + { ++ return getBoundingBox (); ++ } ++ ++ /** ++ * Returns the bounding box of this polygon. This is the smallest ++ * rectangle with sides parallel to the X axis that will contain this ++ * polygon. ++ * ++ * @return the bounding box for this polygon ++ * @see #getBounds2D() ++ * @deprecated use {@link #getBounds()} instead ++ */ ++ public Rectangle getBoundingBox() ++ { + if (bounds == null) + { + if (npoints == 0) +- return bounds = new Rectangle(); ++ return bounds = new Rectangle (); + int i = npoints - 1; + int minx = xpoints[i]; + int maxx = minx; +@@ -280,26 +294,12 @@ + else if (y > maxy) + maxy = y; + } +- bounds = new Rectangle(minx, maxy, maxx - minx, maxy - miny); ++ bounds = new Rectangle (minx, miny, maxx - minx, maxy - miny); + } + return bounds; + } + + /** +- * Returns the bounding box of this polygon. This is the smallest +- * rectangle with sides parallel to the X axis that will contain this +- * polygon. +- * +- * @return the bounding box for this polygon +- * @see #getBounds2D() +- * @deprecated use {@link #getBounds()} instead +- */ +- public Rectangle getBoundingBox() +- { +- return getBounds(); +- } +- +- /** + * Tests whether or not the specified point is inside this polygon. + * + * @param p the point to test +Index: java/awt/PopupMenu.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/PopupMenu.java,v +retrieving revision 1.7 +diff -u -r1.7 PopupMenu.java +--- java/awt/PopupMenu.java 5 Jun 2003 19:58:39 -0000 1.7 ++++ java/awt/PopupMenu.java 6 Sep 2004 16:35:46 -0000 +@@ -105,7 +105,7 @@ + public void + addNotify() + { +- if (peer != null) ++ if (peer == null) + peer = getToolkit ().createPopupMenu (this); + super.addNotify (); + } +@@ -123,6 +123,8 @@ + public void + show(Component component, int x, int y) + { ++ if (getPeer() == null) ++ this.addNotify(); + PopupMenuPeer pmp = (PopupMenuPeer)getPeer(); + if (pmp != null) + { +Index: java/awt/Rectangle.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Rectangle.java,v +retrieving revision 1.11 +diff -u -r1.11 Rectangle.java +--- java/awt/Rectangle.java 5 Jun 2003 19:58:39 -0000 1.11 ++++ java/awt/Rectangle.java 6 Sep 2004 16:35:46 -0000 +@@ -281,10 +281,7 @@ + */ + public void setBounds(Rectangle r) + { +- x = r.x; +- y = r.y; +- width = r.width; +- height = r.height; ++ setBounds (r.x, r.y, r.width, r.height); + } + + /** +@@ -298,10 +295,7 @@ + */ + public void setBounds(int x, int y, int width, int height) + { +- this.x = x; +- this.y = y; +- this.width = width; +- this.height = height; ++ reshape (x, y, width, height); + } + + /** +@@ -333,7 +327,10 @@ + */ + public void reshape(int x, int y, int width, int height) + { +- setBounds(x, y, width, height); ++ this.x = x; ++ this.y = y; ++ this.width = width; ++ this.height = height; + } + + /** +@@ -360,8 +357,7 @@ + */ + public void setLocation(Point p) + { +- this.x = p.x; +- this.y = p.y; ++ setLocation (p.x, p.y); + } + + /** +@@ -374,8 +370,7 @@ + */ + public void setLocation(int x, int y) + { +- this.x = x; +- this.y = y; ++ move (x, y); + } + + /** +@@ -388,7 +383,8 @@ + */ + public void move(int x, int y) + { +- setLocation(x, y); ++ this.x = x; ++ this.y = y; + } + + /** +@@ -426,8 +422,7 @@ + */ + public void setSize(Dimension d) + { +- width = d.width; +- height = d.height; ++ setSize (d.width, d.height); + } + + /** +@@ -439,8 +434,7 @@ + */ + public void setSize(int width, int height) + { +- this.width = width; +- this.height = height; ++ resize (width, height); + } + + /** +@@ -452,7 +446,8 @@ + */ + public void resize(int width, int height) + { +- setSize(width, height); ++ this.width = width; ++ this.height = height; + } + + /** +@@ -469,9 +464,7 @@ + */ + public boolean contains(Point p) + { +- return width > 0 && height > 0 +- && p.x >= x && p.x < x + width +- && p.y >= y && p.y < y + height; ++ return contains (p.x, p.y); + } + + /** +@@ -487,9 +480,7 @@ + */ + public boolean contains(int x, int y) + { +- return width > 0 && height > 0 +- && x >= this.x && x < this.x + width +- && y >= this.y && y < this.y + height; ++ return inside (x, y); + } + + /** +@@ -504,9 +495,7 @@ + */ + public boolean contains(Rectangle r) + { +- return width > 0 && height > 0 && r.width > 0 && r.height > 0 +- && r.x >= x && r.x + r.width <= x + width +- && r.y >= y && r.y + r.height <= y + height; ++ return contains (r.x, r.y, r.width, r.height); + } + + /** +@@ -537,7 +526,9 @@ + */ + public boolean inside(int x, int y) + { +- return contains(x, y); ++ return width > 0 && height > 0 ++ && x >= this.x && x < this.x + width ++ && y >= this.y && y < this.y + height; + } + + /** +@@ -551,7 +542,7 @@ + */ + public boolean intersects(Rectangle r) + { +- return width > 0 && height > 0 && r.width > 0 && r.height > 0 ++ return r.width > 0 && r.height > 0 && width > 0 && height > 0 + && r.x < x + width && r.x + r.width > x + && r.y < y + height && r.y + r.height > y; + } +Index: java/awt/ScrollPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/ScrollPane.java,v +retrieving revision 1.14 +diff -u -r1.14 ScrollPane.java +--- java/awt/ScrollPane.java 5 Jan 2004 21:35:32 -0000 1.14 ++++ java/awt/ScrollPane.java 6 Sep 2004 16:35:46 -0000 +@@ -157,6 +157,9 @@ + } + + wheelScrollingEnabled = true; ++ ++ // Default size. ++ setSize(100,100); + } + + /*************************************************************************/ +@@ -400,6 +403,15 @@ + + setPeer((ComponentPeer)getToolkit().createScrollPane(this)); + super.addNotify(); ++ ++ Component[] list = getComponents(); ++ if (list != null && list.length > 0 && ! (list[0] instanceof Panel)) ++ { ++ Panel panel = new Panel(); ++ panel.setLayout(new BorderLayout()); ++ panel.add(list[0], BorderLayout.CENTER); ++ add(panel); ++ } + } + + /*************************************************************************/ +@@ -446,10 +458,25 @@ + public void + doLayout() + { +- Component[] list = getComponents(); ++ layout (); ++} ++ ++/*************************************************************************/ ++ ++/** ++ * Lays out this component. This consists of resizing the sole child ++ * component to its perferred size. ++ * ++ * @deprecated This method is deprecated in favor of ++ * doLayout(). ++ */ ++public void ++layout() ++{ ++ Component[] list = getComponents (); + if ((list != null) && (list.length > 0)) + { +- Dimension dim = list[0].getPreferredSize(); ++ Dimension dim = list[0].getPreferredSize (); + Dimension vp = getViewportSize (); + + if (dim.width < vp.width) +@@ -462,36 +489,21 @@ + if (peer != null) + peer.childResized (dim.width, dim.height); + +- list[0].resize (dim); ++ list[0].setSize (dim); + +- Point p = getScrollPosition(); ++ Point p = getScrollPosition (); + if (p.x > dim.width) + p.x = dim.width; + if (p.y > dim.height) + p.y = dim.height; + +- setScrollPosition(p); ++ setScrollPosition (p); + } + } + + /*************************************************************************/ + + /** +- * Lays out this component. This consists of resizing the sole child +- * component to its perferred size. +- * +- * @deprecated This method is deprecated in favor of +- * doLayout(). +- */ +-public void +-layout() +-{ +- doLayout(); +-} +- +-/*************************************************************************/ +- +-/** + * This method overrides its superclass method to ensure no layout + * manager is set for this container. ScrollPane's do + * not have layout managers. +@@ -527,7 +539,19 @@ + public String + paramString() + { +- return(getClass().getName()); ++ Insets insets = getInsets(); ++ return getName() + "," ++ + getX() + "," ++ + getY() + "," ++ + getWidth() + "x" + getHeight() + "," ++ + "ScrollPosition=(" + scrollPosition.getX() + "," ++ + scrollPosition.getY() + ")," ++ + "Insets=(" + insets.top + "," ++ + insets.left + "," ++ + insets.bottom + "," ++ + insets.right + ")," ++ + "ScrollbarDisplayPolicy=" + getScrollbarDisplayPolicy() + "," ++ + "wheelScrollingEnabled=" + isWheelScrollingEnabled(); + } + + /** +Index: java/awt/Scrollbar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Scrollbar.java,v +retrieving revision 1.15 +diff -u -r1.15 Scrollbar.java +--- java/awt/Scrollbar.java 5 Jun 2003 19:58:39 -0000 1.15 ++++ java/awt/Scrollbar.java 6 Sep 2004 16:35:46 -0000 +@@ -120,6 +120,11 @@ + + private transient boolean valueIsAdjusting = false; + ++ /* ++ * The number used to generate the name returned by getName. ++ */ ++ private static transient long next_scrollbar_number = 0; ++ + /*************************************************************************/ + + /* +@@ -194,9 +199,8 @@ + // Default is 1 according to online docs. + lineIncrement = 1; + +- pageIncrement = (maximum - minimum) / 5; +- if (pageIncrement == 0) +- pageIncrement = 1; ++ // Default is 10 according to javadocs. ++ pageIncrement = 10; + } + + /*************************************************************************/ +@@ -333,7 +337,7 @@ + public int + getVisibleAmount() + { +- return(visibleAmount); ++ return getVisible (); + } + + /*************************************************************************/ +@@ -350,7 +354,7 @@ + public int + getVisible() + { +- return(getVisibleAmount()); ++ return visibleAmount; + } + + /*************************************************************************/ +@@ -394,15 +398,17 @@ + if (visibleAmount > maximum - minimum) + visibleAmount = maximum - minimum; + ++ ScrollbarPeer peer = (ScrollbarPeer) getPeer (); ++ if (peer != null ++ && (this.value != value || this.visibleAmount != visibleAmount ++ || this.minimum != minimum || this.maximum != maximum)) ++ peer.setValues(value, visibleAmount, minimum, maximum); ++ + this.value = value; + this.visibleAmount = visibleAmount; + this.minimum = minimum; + this.maximum = maximum; + +- ScrollbarPeer sp = (ScrollbarPeer)getPeer(); +- if (sp != null) +- sp.setValues(value, visibleAmount, minimum, maximum); +- + int range = maximum - minimum; + if (lineIncrement > range) + { +@@ -411,8 +417,8 @@ + else + lineIncrement = range; + +- if (sp != null) +- sp.setLineIncrement(lineIncrement); ++ if (peer != null) ++ peer.setLineIncrement(lineIncrement); + } + + if (pageIncrement > range) +@@ -422,8 +428,8 @@ + else + pageIncrement = range; + +- if (sp != null) +- sp.setPageIncrement(pageIncrement); ++ if (peer != null) ++ peer.setPageIncrement(pageIncrement); + } + } + +@@ -438,7 +444,7 @@ + public int + getUnitIncrement() + { +- return(lineIncrement); ++ return getLineIncrement (); + } + + /*************************************************************************/ +@@ -455,7 +461,7 @@ + public int + getLineIncrement() + { +- return(lineIncrement); ++ return lineIncrement; + } + + /*************************************************************************/ +@@ -469,26 +475,7 @@ + public synchronized void + setUnitIncrement(int unitIncrement) + { +- if (unitIncrement < 0) +- throw new IllegalArgumentException("Unit increment less than zero."); +- +- int range = maximum - minimum; +- if (unitIncrement > range) +- { +- if (range == 0) +- unitIncrement = 1; +- else +- unitIncrement = range; +- } +- +- if (unitIncrement == lineIncrement) +- return; +- +- lineIncrement = unitIncrement; +- +- ScrollbarPeer sp = (ScrollbarPeer)getPeer(); +- if (sp != null) +- sp.setLineIncrement(lineIncrement); ++ setLineIncrement (unitIncrement); + } + + /*************************************************************************/ +@@ -505,7 +492,26 @@ + public void + setLineIncrement(int lineIncrement) + { +- setUnitIncrement(lineIncrement); ++ if (lineIncrement < 0) ++ throw new IllegalArgumentException ("Unit increment less than zero."); ++ ++ int range = maximum - minimum; ++ if (lineIncrement > range) ++ { ++ if (range == 0) ++ lineIncrement = 1; ++ else ++ lineIncrement = range; ++ } ++ ++ if (lineIncrement == this.lineIncrement) ++ return; ++ ++ this.lineIncrement = lineIncrement; ++ ++ ScrollbarPeer peer = (ScrollbarPeer) getPeer (); ++ if (peer != null) ++ peer.setLineIncrement (this.lineIncrement); + } + + /*************************************************************************/ +@@ -519,7 +525,7 @@ + public int + getBlockIncrement() + { +- return(pageIncrement); ++ return getPageIncrement (); + } + + /*************************************************************************/ +@@ -536,7 +542,7 @@ + public int + getPageIncrement() + { +- return(pageIncrement); ++ return pageIncrement; + } + + /*************************************************************************/ +@@ -550,26 +556,7 @@ + public synchronized void + setBlockIncrement(int blockIncrement) + { +- if (blockIncrement < 0) +- throw new IllegalArgumentException("Block increment less than zero."); +- +- int range = maximum - minimum; +- if (blockIncrement > range) +- { +- if (range == 0) +- blockIncrement = 1; +- else +- blockIncrement = range; +- } +- +- if (blockIncrement == pageIncrement) +- return; +- +- pageIncrement = blockIncrement; +- +- ScrollbarPeer sp = (ScrollbarPeer)getPeer(); +- if (sp != null) +- sp.setPageIncrement(pageIncrement); ++ setPageIncrement (blockIncrement); + } + + /*************************************************************************/ +@@ -586,7 +573,26 @@ + public void + setPageIncrement(int pageIncrement) + { +- setBlockIncrement(pageIncrement); ++ if (pageIncrement < 0) ++ throw new IllegalArgumentException ("Block increment less than zero."); ++ ++ int range = maximum - minimum; ++ if (pageIncrement > range) ++ { ++ if (range == 0) ++ pageIncrement = 1; ++ else ++ pageIncrement = range; ++ } ++ ++ if (pageIncrement == this.pageIncrement) ++ return; ++ ++ this.pageIncrement = pageIncrement; ++ ++ ScrollbarPeer peer = (ScrollbarPeer) getPeer (); ++ if (peer != null) ++ peer.setPageIncrement (this.pageIncrement); + } + + /*************************************************************************/ +@@ -746,5 +752,20 @@ + { + this.valueIsAdjusting = valueIsAdjusting; + } ++ ++ /** ++ * Generate a unique name for this scroll bar. ++ * ++ * @return A unique name for this scroll bar. ++ */ ++ String generateName () ++ { ++ return "scrollbar" + getUniqueLong (); ++ } ++ ++ private static synchronized long getUniqueLong () ++ { ++ return next_scrollbar_number++; ++ } + } // class Scrollbar + +Index: java/awt/SystemColor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/SystemColor.java,v +retrieving revision 1.4 +diff -u -r1.4 SystemColor.java +--- java/awt/SystemColor.java 9 Aug 2002 04:26:14 -0000 1.4 ++++ java/awt/SystemColor.java 6 Sep 2004 16:35:47 -0000 +@@ -427,7 +427,7 @@ + * as the system color is solid, the context does not need any of the + * passed parameters to do its job. + * +- * @param cm the requested color model, ignored ++ * @param cm the requested color model + * @param deviceBounds the bounding box in device coordinates, ignored + * @param userBounds the bounding box in user coordinates, ignored + * @param xform the bounds transformation, ignored +@@ -441,8 +441,8 @@ + { + Toolkit.getDefaultToolkit().loadSystemColors(colors); + int color = colors[value] | ALPHA_MASK; +- if (context == null || color != context.color) +- context = new ColorPaintContext(color); ++ if (context == null || color != context.color || !context.getColorModel().equals(cm)) ++ context = new ColorPaintContext(cm,color); + return context; + } + +Index: java/awt/TextArea.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/TextArea.java,v +retrieving revision 1.8 +diff -u -r1.8 TextArea.java +--- java/awt/TextArea.java 5 Jun 2003 19:58:39 -0000 1.8 ++++ java/awt/TextArea.java 6 Sep 2004 16:35:47 -0000 +@@ -1,565 +1,599 @@ +-/* TextArea.java -- A multi-line text entry widget +- Copyright (C) 1999 Free Software Foundation, Inc. ++/* TextArea.java -- A multi-line text entry component ++ Copyright (C) 1999, 2004 Free Software Foundation, Inc. + +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ ++ This file is part of GNU Classpath. + ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ + + package java.awt; + + import java.awt.peer.ComponentPeer; + import java.awt.peer.TextAreaPeer; ++import java.awt.event.KeyEvent; ++import java.util.HashSet; ++import java.util.Set; + +-/** +- * This implements a multi-line text entry widget. +- * +- * @author Aaron M. Renn (arenn@urbanophile.com) +- */ +-public class TextArea extends TextComponent implements java.io.Serializable +-{ +- +-/* +- * Static Variables +- */ +- +-/** +- * Use both horiztonal and vertical scroll bars. +- */ +-public static final int SCROLLBARS_BOTH = 0; +- +-/** +- * Use vertical scroll bars only. +- */ +-public static final int SCROLLBARS_VERTICAL_ONLY = 1; +- +-/** +- * Use horizatonal scroll bars only. +- */ +-public static final int SCROLLBARS_HORIZONTAL_ONLY = 2; +- +-/** +- * Use no scrollbars. +- */ +-public static final int SCROLLBARS_NONE = 3; +- +-// Serialization constant +-private static final long serialVersionUID = 3692302836626095722L; +- +-/*************************************************************************/ +- +-/* +- * Instance Variables +- */ +- +-/** +- * @serial The number of columns in this text area. +- */ +-private int columns; +- +-/** +- * @serial The number of rows in this text area. +- */ +-private int rows; + + /** +- * @serial The type of scrollbars to display, which will be one of +- * the contstants from this class. +- */ +-private int scrollbarVisibility; +- +-/*************************************************************************/ +- +-/* +- * Constructors ++ * A TextArea is a text component capable of displaying multiple lines ++ * of user-editable text. A TextArea handles its own scrolling and ++ * can display vertical and horizontal scrollbars as navigation aids. ++ * ++ * @author Aaron M. Renn (arenn@urbanophile.com) + */ +- +-/** +- * Initialize a new instance of TextArea that is empty +- * and is one row and one column. Both horizontal and vertical +- * scrollbars will be used. +- * +- * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, +- */ +-public +-TextArea() +-{ +- this("", 1, 1, SCROLLBARS_BOTH); +-} +- +-/*************************************************************************/ +- +-/** +- * Initializes a new instance of TextArea that +- * contains the specified string. Both horizontal and veritcal +- * scrollbars will be used. +- * +- * @param text The text to display in this text area. +- * +- * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, +- */ +-public +-TextArea(String text) +-{ +- this(text, 1, text.length(), SCROLLBARS_BOTH); +-} +- +-/*************************************************************************/ +- +-/** +- * Initializes a new instance of TextArea that is empty +- * and has the specified number of rows and columns. Both +- * horizontal and vertical scrollbars will be used. +- * +- * @param rows The number of rows in this text area. +- * @param columns The number of columns in this text area. +- * +- * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, +- */ +-public +-TextArea(int rows, int columns) +-{ +- this("", rows, columns, SCROLLBARS_BOTH); +-} +- +-/*************************************************************************/ +- +-/** +- * Initializes a new instance of TextArea that is the +- * specified size and has the specified text. +- * +- * @param text The text to display in this text area. +- * @param rows The number of rows in this text area. +- * @param columns The number of columns in this text area. +- * +- * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, +- */ +-public +-TextArea(String text, int rows, int columns) +-{ +- this(text, rows, columns, SCROLLBARS_BOTH); +-} +- +-/*************************************************************************/ +- +-/** +- * Initializes a new instance of TextArea with the +- * specified values. The scrollbar visibility value must be one +- * of the constants in this class. +- * +- * @param text The text to display in this text area. +- * @param rows The number of rows in this text area. +- * @param columns The number of columns in this text area. +- * @param scrollbarVisibility Which scrollbars to display. +- * +- * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, +- */ +-public +-TextArea(String text, int rows, int columns, int scrollbarVisibility) +-{ +- super(text); +- +- if (GraphicsEnvironment.isHeadless()) +- throw new HeadlessException (); +- +- if ((rows < 1) || (columns < 0)) +- throw new IllegalArgumentException("Bad row or column value"); +- +- if ((scrollbarVisibility != SCROLLBARS_BOTH) && +- (scrollbarVisibility != SCROLLBARS_VERTICAL_ONLY) && +- (scrollbarVisibility != SCROLLBARS_HORIZONTAL_ONLY) && +- (scrollbarVisibility != SCROLLBARS_NONE)) +- throw new IllegalArgumentException("Bad scrollbar visibility value"); +- +- this.rows = rows; +- this.columns = columns; +- this.scrollbarVisibility = scrollbarVisibility; +-} +- +-/*************************************************************************/ +- +-/* +- * Instance Variables +- */ +- +-/** +- * Returns the number of columns in the field. +- * +- * @return The number of columns in the field. +- */ +-public int +-getColumns() +-{ +- return(columns); +-} +- +-/*************************************************************************/ +- +-/** +- * Sets the number of columns in this field to the specified value. +- * +- * @param columns The new number of columns in the field. +- * +- * @exception IllegalArgumentException If columns is less than zero. +- */ +-public synchronized void +-setColumns(int columns) +-{ +- if (columns < 0) +- throw new IllegalArgumentException("Value is less than zero: " + +- columns); +- +- this.columns = columns; +- // FIXME: How to we communicate this to our peer? +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the number of rows in the field. +- * +- * @return The number of rows in the field. +- */ +-public int +-getRows() +-{ +- return(rows); +-} +- +-/*************************************************************************/ +- +-/** +- * Sets the number of rows in this field to the specified value. +- * +- * @param rows The new number of rows in the field. +- * +- * @exception IllegalArgumentException If rows is less than zero. +- */ +-public synchronized void +-setRows(int rows) +-{ +- if (rows < 1) +- throw new IllegalArgumentException("Value is less than one: " + +- rows); +- +- this.rows = rows; +- // FIXME: How to we communicate this to our peer? +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the minimum size for this text field. +- * +- * @return The minimum size for this text field. +- */ +-public Dimension +-getMinimumSize() +-{ +- return(getMinimumSize(getRows(), getColumns())); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the minimum size of a text field with the specified number +- * of rows and columns. +- * +- * @param rows The number of rows to get the minimum size for. +- * @param columns The number of columns to get the minimum size for. +- */ +-public Dimension +-getMinimumSize(int rows, int columns) +-{ +- TextAreaPeer tap = (TextAreaPeer)getPeer(); +- if (tap == null) +- return(null); // FIXME: What do we do if there is no peer? +- +- return(tap.getMinimumSize(rows, columns)); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the minimum size for this text field. +- * +- * @return The minimum size for this text field. +- * +- * @deprecated This method is depcreated in favor of +- * getMinimumSize(). +- */ +-public Dimension +-minimumSize() +-{ +- return(getMinimumSize(getRows(), getColumns())); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the minimum size of a text field with the specified number +- * of rows and columns. +- * +- * @param rows The number of rows to get the minimum size for. +- * @param columns The number of columns to get the minimum size for. +- * +- * @deprecated This method is deprecated in favor of +- * getMinimumSize(int). +- */ +-public Dimension +-minimumSize(int rows, int columns) +-{ +- return(getMinimumSize(rows, columns)); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the preferred size for this text field. +- * +- * @return The preferred size for this text field. +- */ +-public Dimension +-getPreferredSize() +-{ +- return(getPreferredSize(getRows(), getColumns())); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the preferred size of a text field with the specified number +- * of rows and columns. +- * +- * @param rows The number of rows to get the preferred size for. +- * @param columns The number of columns to get the preferred size for. +- */ +-public Dimension +-getPreferredSize(int rows, int columns) +-{ +- TextAreaPeer tap = (TextAreaPeer)getPeer(); +- if (tap == null) +- { +- // Sun's JDK just seems to return Dimension(0,0) in this case. +- // we do the same. +- return new Dimension(0, 0); +- } +- +- return(tap.getPreferredSize(rows, columns)); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the preferred size for this text field. +- * +- * @return The preferred size for this text field. +- * +- * @deprecated This method is deprecated in favor of +- * getPreferredSize(). +- */ +-public Dimension +-preferredSize() +-{ +- return(getPreferredSize(getRows(), getColumns())); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns the preferred size of a text field with the specified number +- * of rows and columns. +- * +- * @param rows The number of rows to get the preferred size for. +- * @param columns The number of columns to get the preferred size for. +- * +- * @deprecated This method is deprecated in favor of +- * getPreferredSize(int). +- */ +-public Dimension +-preferredSize(int rows, int columns) +-{ +- return(getPreferredSize(rows, columns)); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns one of the constants from this class indicating which +- * types of scrollbars this object uses, if any. +- * +- * @return The scrollbar type constant for this object. +- */ +-public int +-getScrollbarVisibility() +-{ +- return(scrollbarVisibility); +-} +- +-/*************************************************************************/ +- +-/** +- * Notify this object that it should create its native peer. +- */ +-public void +-addNotify() +-{ +- if (getPeer() != null) +- return; +- +- setPeer((ComponentPeer)getToolkit().createTextArea(this)); +-} +- +-/*************************************************************************/ +- +-/** +- * Appends the specified text to the end of the current text. +- * +- * @param text The text to append. +- */ +-public void +-append(String str) +-{ +- TextAreaPeer tap = (TextAreaPeer)getPeer(); +- if (tap == null) +- return; +- +- tap.insert(str, tap.getText().length()); +-} +- +-/*************************************************************************/ +- +-/** +- * Appends the specified text to the end of the current text. +- * +- * @param text The text to append. +- * +- * @deprecated This method is deprecated in favor of +- * append(). +- */ +-public void +-appendText(String text) +-{ +- append(text); +-} +- +-/*************************************************************************/ +- +-/** +- * Inserts the specified text at the specified location. +- * +- * @param text The text to insert. +- * @param pos The insert position. +- */ +-public void +-insert(String text, int pos) +-{ +- TextAreaPeer tap = (TextAreaPeer)getPeer(); +- if (tap == null) +- return; +- +- tap.insert(text, pos); +-} +- +-/*************************************************************************/ +- +-/** +- * Inserts the specified text at the specified location. +- * +- * @param text The text to insert. +- * @param pos The insert position. +- * +- * @deprecated This method is depcreated in favor of insert(). +- */ +-public void +-insertText(String text, int pos) +-{ +- insert(text, pos); +-} +- +-/*************************************************************************/ +- +-/** +- * Replaces the text bounded by the specified start and end positions +- * with the specified text. +- * +- * @param text The new text for the range. +- * @param start The start position of the replacement range. +- * @param end The end position of the replacement range. +- */ +-public void +-replaceRange(String text, int start, int end) +-{ +- TextAreaPeer tap = (TextAreaPeer)getPeer(); +- if (tap == null) +- return; +- +- tap.replaceRange(text, start, end); +-} +- +-/*************************************************************************/ +- +-/** +- * Replaces the text bounded by the specified start and end positions +- * with the specified text. +- * +- * @param text The new text for the range. +- * @param start The start position of the replacement range. +- * @param end The end position of the replacement range. +- * +- * @deprecated This method is deprecated in favor of +- * replaceRange(). +- */ +-public void +-replaceText(String text, int start, int end) +-{ +- replaceRange(text, start, end); +-} +- +-/*************************************************************************/ +- +-/** +- * Returns a debugging string for this text area. +- * +- * @return A debugging string for this text area. +- */ +-protected String +-paramString() ++public class TextArea extends TextComponent implements java.io.Serializable + { +- return(getClass().getName() + "(rows=" + getRows() + ",columns=" + +- getColumns() + ",scrollbars=" + getScrollbarVisibility() + +- ")"); ++ /** ++ * Display both horiztonal and vertical scroll bars. ++ */ ++ public static final int SCROLLBARS_BOTH = 0; ++ ++ /** ++ * Display vertical scroll bar only. ++ */ ++ public static final int SCROLLBARS_VERTICAL_ONLY = 1; ++ ++ /** ++ * Display horizatonal scroll bar only. ++ */ ++ public static final int SCROLLBARS_HORIZONTAL_ONLY = 2; ++ ++ /** ++ * Do not display scrollbars. ++ */ ++ public static final int SCROLLBARS_NONE = 3; ++ ++ /** ++ * Serialization constant. ++ */ ++ private static final long serialVersionUID = 3692302836626095722L; ++ ++ /** ++ * @serial The number of columns used in this text area's preferred ++ * and minimum size calculations. ++ */ ++ private int columns; ++ ++ /** ++ * @serial The number of rows used in this text area's preferred and ++ * minimum size calculations. ++ */ ++ private int rows; ++ ++ /** ++ * @serial The scrollbar display policy. One of SCROLLBARS_BOTH, ++ * SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_HORIZONTAL_ONLY, ++ * SCROLLBARS_NONE. ++ */ ++ private int scrollbarVisibility; ++ ++ /* ++ * The number used to generate the name returned by getName. ++ */ ++ private static transient long next_text_number = 0; ++ ++ /** ++ * Initialize a new instance of TextArea that is empty. ++ * Conceptually the TextArea has 0 rows and 0 columns ++ * but its initial bounds are defined by its peer or by the ++ * container in which it is packed. Both horizontal and vertical ++ * scrollbars will be displayed. ++ * ++ * @exception HeadlessException if GraphicsEnvironment.isHeadless () is true ++ */ ++ public TextArea () ++ { ++ this ("", 0, 0, SCROLLBARS_BOTH); ++ } ++ ++ /** ++ * Initialize a new instance of TextArea that contains ++ * the specified text. Conceptually the TextArea has 0 ++ * rows and 0 columns but its initial bounds are defined by its peer ++ * or by the container in which it is packed. Both horizontal and ++ * veritcal scrollbars will be displayed. ++ * ++ * @param text The text to display in this text area. ++ * ++ * @exception HeadlessException if GraphicsEnvironment.isHeadless () is true ++ */ ++ public TextArea (String text) ++ { ++ this (text, 0, 0, SCROLLBARS_BOTH); ++ } ++ ++ /** ++ * Initialize a new instance of TextArea that is empty ++ * and can display the specified number of rows and columns of text, ++ * without the need to scroll. Both horizontal and vertical ++ * scrollbars will be displayed. ++ * ++ * @param rows The number of rows in this text area. ++ * @param columns The number of columns in this text area. ++ * ++ * @exception HeadlessException if GraphicsEnvironment.isHeadless () is true ++ */ ++ public TextArea (int rows, int columns) ++ { ++ this ("", rows, columns, SCROLLBARS_BOTH); ++ } ++ ++ /** ++ * Initialize a new instance of TextArea that can ++ * display the specified number of rows and columns of text, without ++ * the need to scroll. The TextArea initially contains the ++ * specified text. ++ * ++ * @param text The text to display in this text area. ++ * @param rows The number of rows in this text area. ++ * @param columns The number of columns in this text area. ++ * ++ * @exception HeadlessException if GraphicsEnvironment.isHeadless () is true ++ */ ++ public TextArea (String text, int rows, int columns) ++ { ++ this (text, rows, columns, SCROLLBARS_BOTH); ++ } ++ ++ /** ++ * Initialize a new instance of TextArea that initially ++ * contains the specified text. The TextArea can display the ++ * specified number of rows and columns of text, without the need to ++ * scroll. This constructor allows specification of the scroll bar ++ * display policy. ++ * ++ * @param text The text to display in this text area. ++ * @param rows The number of rows in this text area. ++ * @param columns The number of columns in this text area. ++ * @param scrollbarVisibility The scroll bar display policy. One of ++ * SCROLLBARS_BOTH, SCROLLBARS_VERTICAL_ONLY, ++ * SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_NONE. ++ * ++ * @exception HeadlessException if GraphicsEnvironment.isHeadless () is true ++ */ ++ public TextArea (String text, int rows, int columns, int scrollbarVisibility) ++ { ++ super (text); ++ ++ if (GraphicsEnvironment.isHeadless ()) ++ throw new HeadlessException (); ++ ++ if (rows < 0 || columns < 0) ++ throw new IllegalArgumentException ("Bad row or column value"); ++ ++ if (scrollbarVisibility != SCROLLBARS_BOTH ++ && scrollbarVisibility != SCROLLBARS_VERTICAL_ONLY ++ && scrollbarVisibility != SCROLLBARS_HORIZONTAL_ONLY ++ && scrollbarVisibility != SCROLLBARS_NONE) ++ throw new IllegalArgumentException ("Bad scrollbar visibility value"); ++ ++ this.rows = rows; ++ this.columns = columns; ++ this.scrollbarVisibility = scrollbarVisibility; ++ ++ // TextAreas need to receive tab key events so we override the ++ // default forward and backward traversal key sets. ++ Set s = new HashSet (); ++ s.add (AWTKeyStroke.getAWTKeyStroke (KeyEvent.VK_TAB, ++ KeyEvent.CTRL_DOWN_MASK)); ++ setFocusTraversalKeys (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, s); ++ s = new HashSet (); ++ s.add (AWTKeyStroke.getAWTKeyStroke (KeyEvent.VK_TAB, ++ KeyEvent.SHIFT_DOWN_MASK ++ | KeyEvent.CTRL_DOWN_MASK)); ++ setFocusTraversalKeys (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, s); ++ } ++ ++ /** ++ * Retrieve the number of columns that this text area would prefer ++ * to display. This value may or may not correspond to the number ++ * of columns that are actually displayed. ++ * ++ * @return The preferred number of columns. ++ */ ++ public int getColumns () ++ { ++ return columns; ++ } ++ ++ /** ++ * Set the preferred number of columns for this text area. This ++ * method does not cause the number of columns displayed by the text ++ * area to be updated, if the text area is currently visible. ++ * ++ * @param columns The preferred number of columns. ++ * ++ * @exception IllegalArgumentException If columns is less than zero. ++ */ ++ public synchronized void setColumns (int columns) ++ { ++ if (columns < 0) ++ throw new IllegalArgumentException ("Value is less than zero: " ++ + columns); ++ ++ this.columns = columns; ++ } ++ ++ /** ++ * Retrieve the number of rows that this text area would prefer to ++ * display. This value may or may not correspond to the number of ++ * rows that are actually displayed. ++ * ++ * @return The preferred number of rows. ++ */ ++ public int getRows () ++ { ++ return rows; ++ } ++ ++ /** ++ * Set the preferred number of rows for this text area. This method ++ * does not cause the number of columns displayed by the text area ++ * to be updated, if the text area is currently visible. ++ * ++ * @param rows The preferred number of rows. ++ * ++ * @exception IllegalArgumentException If rows is less than zero. ++ */ ++ public synchronized void setRows (int rows) ++ { ++ if (rows < 1) ++ throw new IllegalArgumentException ("Value is less than one: " + rows); ++ ++ this.rows = rows; ++ } ++ ++ /** ++ * Retrieve the minimum size for this text area, considering the ++ * text area's current row and column values. A text area's minimum ++ * size depends on the number of rows and columns of text it would ++ * prefer to display, and on the size of the font in which the text ++ * would be displayed. ++ * ++ * @return The minimum size for this text field. ++ */ ++ public Dimension getMinimumSize () ++ { ++ return getMinimumSize (getRows (), getColumns ()); ++ } ++ ++ /** ++ * Retrieve the minimum size that this text area would have if its ++ * row and column values were equal to those specified. A text ++ * area's minimum size depends on the number of rows and columns of ++ * text it would prefer to display, and on the size of the font in ++ * which the text would be displayed. ++ * ++ * @param rows The number of rows to use in the minimum size ++ * calculation. ++ * @param columns The number of columns to use in the minimum size ++ * calculation. ++ * ++ * @return The minimum size for this text area. ++ */ ++ public Dimension getMinimumSize (int rows, int columns) ++ { ++ return minimumSize (rows, columns); ++ } ++ ++ /** ++ * Retrieve the minimum size for this text area, considering the ++ * text area's current row and column values. A text area's minimum ++ * size depends on the number of rows and columns of text it would ++ * prefer to display, and on the size of the font in which the text ++ * would be displayed. ++ * ++ * @return The minimum size for this text area. ++ * ++ * @deprecated This method is deprecated in favor of ++ * getMinimumSize (). ++ */ ++ public Dimension minimumSize () ++ { ++ return minimumSize (getRows (), getColumns ()); ++ } ++ ++ /** ++ * Retrieve the minimum size that this text area would have if its ++ * row and column values were equal to those specified. A text ++ * area's minimum size depends on the number of rows and columns of ++ * text it would prefer to display, and on the size of the font in ++ * which the text would be displayed. ++ * ++ * @param rows The number of rows to use in the minimum size ++ * calculation. ++ * @param columns The number of columns to use in the minimum size ++ * calculation. ++ * ++ * @return The minimum size for this text area. ++ * ++ * @deprecated This method is deprecated in favor of ++ * getMinimumSize (int, int). ++ */ ++ public Dimension minimumSize (int rows, int columns) ++ { ++ TextAreaPeer peer = (TextAreaPeer) getPeer (); ++ ++ // Sun returns Dimension (0,0) in this case. ++ if (peer == null) ++ return new Dimension (0, 0); ++ ++ return peer.getMinimumSize (rows, columns); ++ } ++ ++ /** ++ * Retrieve the preferred size for this text area, considering the ++ * text area's current row and column values. A text area's preferred ++ * size depends on the number of rows and columns of text it would ++ * prefer to display, and on the size of the font in which the text ++ * would be displayed. ++ * ++ * @return The preferred size for this text field. ++ */ ++ public Dimension getPreferredSize () ++ { ++ return getPreferredSize (getRows (), getColumns ()); ++ } ++ ++ /** ++ * Retrieve the preferred size that this text area would have if its ++ * row and column values were equal to those specified. A text ++ * area's preferred size depends on the number of rows and columns ++ * of text it would prefer to display, and on the size of the font ++ * in which the text would be displayed. ++ * ++ * @param rows The number of rows to use in the preferred size ++ * calculation. ++ * @param columns The number of columns to use in the preferred size ++ * calculation. ++ * ++ * @return The preferred size for this text area. ++ */ ++ public Dimension getPreferredSize (int rows, int columns) ++ { ++ return preferredSize (rows, columns); ++ } ++ ++ /** ++ * Retrieve the preferred size for this text area, considering the ++ * text area's current row and column values. A text area's preferred ++ * size depends on the number of rows and columns of text it would ++ * prefer to display, and on the size of the font in which the text ++ * would be displayed. ++ * ++ * @return The preferred size for this text field. ++ * ++ * @deprecated This method is deprecated in favor of ++ * getPreferredSize (). ++ */ ++ public Dimension preferredSize () ++ { ++ return preferredSize (getRows (), getColumns ()); ++ } ++ ++ /** ++ * Retrieve the preferred size that this text area would have if its ++ * row and column values were equal to those specified. A text ++ * area's preferred size depends on the number of rows and columns ++ * of text it would prefer to display, and on the size of the font ++ * in which the text would be displayed. ++ * ++ * @param rows The number of rows to use in the preferred size ++ * calculation. ++ * @param columns The number of columns to use in the preferred size ++ * calculation. ++ * ++ * @return The preferred size for this text area. ++ * ++ * @deprecated This method is deprecated in favor of ++ * getPreferredSize (int, int). ++ */ ++ public Dimension preferredSize (int rows, int columns) ++ { ++ TextAreaPeer peer = (TextAreaPeer) getPeer (); ++ ++ // Sun returns Dimension (0,0) in this case. ++ if (peer == null) ++ return new Dimension (0, 0); ++ ++ return peer.getPreferredSize (rows, columns); ++ } ++ ++ /** ++ * Retrieve the scroll bar display policy -- one of SCROLLBARS_BOTH, ++ * SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_HORIZONTAL_ONLY, ++ * SCROLLBARS_NONE. ++ * ++ * @return The current scroll bar display policy. ++ */ ++ public int getScrollbarVisibility () ++ { ++ return scrollbarVisibility; ++ } ++ ++ /** ++ * Notify this object that it should create its native peer. ++ */ ++ public void addNotify () ++ { ++ if (getPeer () == null) ++ setPeer ((ComponentPeer) getToolkit().createTextArea (this)); ++ } ++ ++ /** ++ * Append the specified text to the end of the current text. ++ * ++ * @param str The text to append. ++ */ ++ public void append (String str) ++ { ++ appendText (str); ++ } ++ ++ /** ++ * Append the specified text to the end of the current text. ++ * ++ * @param str The text to append. ++ * ++ * @deprecated This method is deprecated in favor of ++ * append (). ++ */ ++ public void appendText (String str) ++ { ++ TextAreaPeer peer = (TextAreaPeer) getPeer (); ++ ++ if (peer != null) ++ peer.insert (str, peer.getText().length ()); ++ } ++ ++ /** ++ * Insert the specified text at the specified position. The first ++ * character in the text area is at position zero. ++ * ++ * @param str The text to insert. ++ * @param pos The position at which to insert text. ++ */ ++ public void insert (String str, int pos) ++ { ++ insertText (str, pos); ++ } ++ ++ /** ++ * Insert the specified text at the specified position. The first ++ * character in the text area is at position zero. ++ * ++ * @param str The text to insert. ++ * @param pos The position at which to insert text. ++ * ++ * @deprecated This method is deprecated in favor of ++ * insert (). ++ */ ++ public void insertText (String str, int pos) ++ { ++ TextAreaPeer peer = (TextAreaPeer) getPeer (); ++ ++ if (peer != null) ++ peer.insert (str, pos); ++ } ++ ++ /** ++ * Replace a range of characters with the specified text. The ++ * character at the start position will be replaced, unless start == ++ * end. The character at the end posistion will not be replaced. ++ * The first character in the text area is at position zero. The ++ * length of the replacement text may differ from the length of the ++ * text that is replaced. ++ * ++ * @param str The new text for the range. ++ * @param start The start position of the replacement range. ++ * @param end The end position of the replacement range. ++ */ ++ public void replaceRange (String str, int start, int end) ++ { ++ replaceText (str, start, end); ++ } ++ ++ /** ++ * Replace a range of characters with the specified text. The ++ * character at the start position will be replaced, unless start == ++ * end. The character at the end posistion will not be replaced. ++ * The first character in the text area is at position zero. The ++ * length of the replacement text may differ from the length of the ++ * text that is replaced. ++ * ++ * @param str The new text for the range. ++ * @param start The start position of the replacement range. ++ * @param end The end position of the replacement range. ++ * ++ * @deprecated This method is deprecated in favor of ++ * replaceRange (). ++ */ ++ public void replaceText (String str, int start, int end) ++ { ++ TextAreaPeer peer = (TextAreaPeer) getPeer (); ++ ++ if (peer != null) ++ peer.replaceRange (str, start, end); ++ } ++ ++ /** ++ * Retrieve a debugging string for this text area. ++ * ++ * @return A debugging string for this text area. ++ */ ++ protected String paramString () ++ { ++ String sbVisibility = ""; ++ ++ switch (scrollbarVisibility) ++ { ++ case SCROLLBARS_BOTH: ++ sbVisibility = "both"; ++ break; ++ case SCROLLBARS_VERTICAL_ONLY: ++ sbVisibility = "vertical-only"; ++ break; ++ case SCROLLBARS_HORIZONTAL_ONLY: ++ sbVisibility = "horizontal-only"; ++ break; ++ case SCROLLBARS_NONE: ++ sbVisibility = "none"; ++ break; ++ } ++ ++ String editable = ""; ++ if (isEditable ()) ++ editable = "editable,"; ++ ++ return getName () + "," + getX () + "," + getY () + "," + getWidth () ++ + "x" + getHeight () + "," + "text=" + getText () + "," + editable ++ + "selection=" + getSelectionStart () + "-" + getSelectionEnd () ++ + ",rows=" + rows + ",columns=" + columns + ",scrollbarVisibility=" ++ + sbVisibility; ++ } ++ ++ /** ++ * Generate a unique name for this text area. ++ * ++ * @return A unique name for this text area. ++ */ ++ String generateName () ++ { ++ return "text" + getUniqueLong (); ++ } ++ ++ private static synchronized long getUniqueLong () ++ { ++ return next_text_number++; ++ } + } +- +-} // class TextArea +- +Index: java/awt/TextComponent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/TextComponent.java,v +retrieving revision 1.11 +diff -u -r1.11 TextComponent.java +--- java/awt/TextComponent.java 4 Dec 2003 19:31:01 -0000 1.11 ++++ java/awt/TextComponent.java 6 Sep 2004 16:35:47 -0000 +@@ -41,7 +41,6 @@ + import java.awt.event.TextEvent; + import java.awt.event.TextListener; + import java.awt.peer.TextComponentPeer; +-import java.awt.peer.ComponentPeer; + import java.io.Serializable; + import java.util.EventListener; + +@@ -142,6 +141,7 @@ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setText(text); ++ setCaretPosition(0); + } + + /*************************************************************************/ +@@ -234,11 +234,11 @@ + * specified start and end positions. Illegal values for these + * positions are silently fixed. + * +- * @param startSelection The new start position for the selected text. +- * @param endSelection The new end position for the selected text. ++ * @param selectionStart The new start position for the selected text. ++ * @param selectionEnd The new end position for the selected text. + */ + public synchronized void +-select(int selectionStart, int endSelection) ++select(int selectionStart, int selectionEnd) + { + if (selectionStart < 0) + selectionStart = 0; +Index: java/awt/TextField.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/TextField.java,v +retrieving revision 1.8 +diff -u -r1.8 TextField.java +--- java/awt/TextField.java 5 Jun 2003 19:58:39 -0000 1.8 ++++ java/awt/TextField.java 6 Sep 2004 16:35:47 -0000 +@@ -212,11 +212,7 @@ + public void + setEchoChar(char echoChar) + { +- this.echoChar = echoChar; +- +- TextFieldPeer tfp = (TextFieldPeer)getPeer(); +- if (tfp != null) +- tfp.setEchoChar(echoChar); ++ setEchoCharacter (echoChar); + } + + /*************************************************************************/ +@@ -233,7 +229,11 @@ + public void + setEchoCharacter(char echoChar) + { +- setEchoChar(echoChar); ++ this.echoChar = echoChar; ++ ++ TextFieldPeer peer = (TextFieldPeer) getPeer (); ++ if (peer != null) ++ peer.setEchoChar (echoChar); + } + + /*************************************************************************/ +@@ -264,7 +264,7 @@ + public Dimension + getMinimumSize() + { +- return(getMinimumSize(getColumns())); ++ return getMinimumSize (getColumns ()); + } + + /*************************************************************************/ +@@ -278,11 +278,7 @@ + public Dimension + getMinimumSize(int columns) + { +- TextFieldPeer tfp = (TextFieldPeer)getPeer(); +- if (tfp == null) +- return(null); // FIXME: What do we do if there is no peer? +- +- return(tfp.getMinimumSize(columns)); ++ return minimumSize (columns); + } + + /*************************************************************************/ +@@ -292,13 +288,13 @@ + * + * @return The minimum size for this text field. + * +- * @deprecated This method is depcreated in favor of ++ * @deprecated This method is deprecated in favor of + * getMinimumSize(). + */ + public Dimension + minimumSize() + { +- return(getMinimumSize(getColumns())); ++ return minimumSize (getColumns ()); + } + + /*************************************************************************/ +@@ -315,7 +311,11 @@ + public Dimension + minimumSize(int columns) + { +- return(getMinimumSize(columns)); ++ TextFieldPeer peer = (TextFieldPeer) getPeer (); ++ if (peer == null) ++ return null; // FIXME: What do we do if there is no peer? ++ ++ return peer.getMinimumSize (columns); + } + + /*************************************************************************/ +@@ -328,7 +328,7 @@ + public Dimension + getPreferredSize() + { +- return(getPreferredSize(getColumns())); ++ return getPreferredSize (getColumns ()); + } + + /*************************************************************************/ +@@ -342,12 +342,7 @@ + public Dimension + getPreferredSize(int columns) + { +- TextFieldPeer tfp = (TextFieldPeer)getPeer(); +- if (tfp == null) +- { +- return new Dimension(0, 0); +- } +- return(tfp.getPreferredSize(columns)); ++ return preferredSize (columns); + } + + /*************************************************************************/ +@@ -363,7 +358,7 @@ + public Dimension + preferredSize() + { +- return(getPreferredSize(getColumns())); ++ return preferredSize (getColumns ()); + } + + /*************************************************************************/ +@@ -380,7 +375,11 @@ + public Dimension + preferredSize(int columns) + { +- return(getPreferredSize(columns)); ++ TextFieldPeer peer = (TextFieldPeer) getPeer (); ++ if (peer == null) ++ return new Dimension (0, 0); ++ ++ return peer.getPreferredSize (columns); + } + + /*************************************************************************/ +Index: java/awt/Toolkit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Toolkit.java,v +retrieving revision 1.25 +diff -u -r1.25 Toolkit.java +--- java/awt/Toolkit.java 18 Sep 2003 22:37:48 -0000 1.25 ++++ java/awt/Toolkit.java 6 Sep 2004 16:35:47 -0000 +@@ -1,5 +1,6 @@ + /* Toolkit.java -- AWT Toolkit superclass +- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -365,15 +366,46 @@ + + /** + * Copies the current system colors into the specified array. This is +- * the interface used by the SystemColors class. ++ * the interface used by the SystemColor class. Although ++ * this method fills in the array with some default colors a real Toolkit ++ * should override this method and provide real system colors for the ++ * native GUI platform. + * + * @param colors The array to copy the system colors into. ++ * It must be at least 26 elements. + * + * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. ++ * ++ * @see java.awt.SystemColor + */ + protected void loadSystemColors(int systemColors[]) + { +- // XXX Implement. ++ systemColors[SystemColor.DESKTOP] = 0xFF005C5C; ++ systemColors[SystemColor.ACTIVE_CAPTION] = 0xFF000080; ++ systemColors[SystemColor.ACTIVE_CAPTION_TEXT] = 0xFFFFFFFF; ++ systemColors[SystemColor.ACTIVE_CAPTION_BORDER] = 0xFFC0C0C0; ++ systemColors[SystemColor.INACTIVE_CAPTION] = 0xFF808080; ++ systemColors[SystemColor.INACTIVE_CAPTION_TEXT] = 0xFFC0C0C0; ++ systemColors[SystemColor.INACTIVE_CAPTION_BORDER] = 0xFFC0C0C0; ++ systemColors[SystemColor.WINDOW] = 0xFFFFFFFF; ++ systemColors[SystemColor.WINDOW_BORDER] = 0xFF000000; ++ systemColors[SystemColor.WINDOW_TEXT] = 0xFF000000; ++ systemColors[SystemColor.MENU] = 0xFFC0C0C0; ++ systemColors[SystemColor.MENU_TEXT] = 0xFF000000; ++ systemColors[SystemColor.TEXT] = 0xFFC0C0C0; ++ systemColors[SystemColor.TEXT_TEXT] = 0xFF000000; ++ systemColors[SystemColor.TEXT_HIGHLIGHT] = 0xFF000090; ++ systemColors[SystemColor.TEXT_HIGHLIGHT_TEXT] = 0xFFFFFFFF; ++ systemColors[SystemColor.TEXT_INACTIVE_TEXT] = 0xFF808080; ++ systemColors[SystemColor.CONTROL] = 0xFFC0C0C0; ++ systemColors[SystemColor.CONTROL_TEXT] = 0xFF000000; ++ systemColors[SystemColor.CONTROL_HIGHLIGHT] = 0xFFFFFFFF; ++ systemColors[SystemColor.CONTROL_LT_HIGHLIGHT] = 0xFFE0E0E0; ++ systemColors[SystemColor.CONTROL_SHADOW] = 0xFF808080; ++ systemColors[SystemColor.CONTROL_DK_SHADOW] = 0xFF000000; ++ systemColors[SystemColor.SCROLLBAR] = 0xFFE0E0E0; ++ systemColors[SystemColor.INFO] = 0xFFE0E000; ++ systemColors[SystemColor.INFO_TEXT] = 0xFF000000; + } + + /** +Index: java/awt/Window.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/Window.java,v +retrieving revision 1.32 +diff -u -r1.32 Window.java +--- java/awt/Window.java 24 Oct 2003 19:40:29 -0000 1.32 ++++ java/awt/Window.java 6 Sep 2004 16:35:47 -0000 +@@ -38,6 +38,9 @@ + + package java.awt; + ++import java.awt.event.ComponentEvent; ++import java.awt.event.FocusEvent; ++import java.awt.event.WindowAdapter; + import java.awt.event.WindowEvent; + import java.awt.event.WindowFocusListener; + import java.awt.event.WindowListener; +@@ -82,6 +85,10 @@ + private transient GraphicsConfiguration graphicsConfiguration; + private transient AccessibleContext accessibleContext; + ++ private transient boolean shown; ++ ++ private transient Component windowFocusOwner; ++ + /** + * This (package access) constructor is used by subclasses that want + * to build windows that do not have parents. Eg. toplevel +@@ -91,7 +98,37 @@ + Window() + { + visible = false; ++ // Windows are the only Containers that default to being focus ++ // cycle roots. ++ focusCycleRoot = true; + setLayout(new BorderLayout()); ++ ++ addWindowFocusListener (new WindowAdapter () ++ { ++ public void windowGainedFocus (WindowEvent event) ++ { ++ if (windowFocusOwner != null) ++ { ++ // FIXME: move this section and the other similar ++ // sections in Component into a separate method. ++ EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue (); ++ synchronized (eq) ++ { ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ Component currentFocusOwner = manager.getGlobalPermanentFocusOwner (); ++ if (currentFocusOwner != null) ++ { ++ eq.postEvent (new FocusEvent (currentFocusOwner, FocusEvent.FOCUS_LOST, ++ false, windowFocusOwner)); ++ eq.postEvent (new FocusEvent (windowFocusOwner, FocusEvent.FOCUS_GAINED, ++ false, currentFocusOwner)); ++ } ++ else ++ eq.postEvent (new FocusEvent (windowFocusOwner, FocusEvent.FOCUS_GAINED, false)); ++ } ++ } ++ } ++ }); + } + + Window(GraphicsConfiguration gc) +@@ -241,6 +278,23 @@ + validate(); + super.show(); + toFront(); ++ ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ manager.setGlobalFocusedWindow (this); ++ ++ if (!shown) ++ { ++ FocusTraversalPolicy policy = getFocusTraversalPolicy (); ++ Component initialFocusOwner = null; ++ ++ if (policy != null) ++ initialFocusOwner = policy.getInitialComponent (this); ++ ++ if (initialFocusOwner != null) ++ initialFocusOwner.requestFocusInWindow (false); ++ ++ shown = true; ++ } + } + + public void hide() +@@ -626,10 +680,31 @@ + * @return The component that has focus, or null if no + * component has focus. + */ +- public Component getFocusOwner() ++ public Component getFocusOwner () + { +- // FIXME +- return null; ++ KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); ++ ++ Window activeWindow = manager.getActiveWindow (); ++ ++ // The currently-focused Component belongs to the active Window. ++ if (activeWindow == this) ++ return manager.getFocusOwner (); ++ else ++ return windowFocusOwner; ++ } ++ ++ /** ++ * Set the focus owner for this window. This method is used to ++ * remember which component was focused when this window lost ++ * top-level focus, so that when it regains top-level focus the same ++ * child component can be refocused. ++ * ++ * @param windowFocusOwner the component in this window that owns ++ * the focus. ++ */ ++ void setFocusOwner (Component windowFocusOwner) ++ { ++ this.windowFocusOwner = windowFocusOwner; + } + + /** +@@ -641,8 +716,7 @@ + */ + public boolean postEvent(Event e) + { +- // FIXME +- return false; ++ return handleEvent (e); + } + + /** +@@ -673,7 +747,8 @@ + */ + public void applyResourceBundle(String rbName) + { +- ResourceBundle rb = ResourceBundle.getBundle(rbName); ++ ResourceBundle rb = ResourceBundle.getBundle(rbName, Locale.getDefault(), ++ ClassLoader.getSystemClassLoader()); + if (rb != null) + applyResourceBundle(rb); + } +@@ -784,9 +859,23 @@ + if (this.x == x && this.y == y && width == w && height == h) + return; + invalidate(); ++ boolean resized = width != w || height != h; ++ boolean moved = this.x != x || this.y != y; + this.x = x; + this.y = y; + width = w; + height = h; ++ if (resized) ++ { ++ ComponentEvent ce = ++ new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } ++ if (moved) ++ { ++ ComponentEvent ce = ++ new ComponentEvent(this, ComponentEvent.COMPONENT_MOVED); ++ getToolkit().getSystemEventQueue().postEvent(ce); ++ } + } + } +Index: java/awt/datatransfer/DataFlavor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/datatransfer/DataFlavor.java,v +retrieving revision 1.12 +diff -u -r1.12 DataFlavor.java +--- java/awt/datatransfer/DataFlavor.java 8 Dec 2003 23:37:58 -0000 1.12 ++++ java/awt/datatransfer/DataFlavor.java 6 Sep 2004 16:35:47 -0000 +@@ -1,5 +1,5 @@ + /* DataFlavor.java -- A type of data to transfer via the clipboard. +- Copyright (C) 1999, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -60,11 +60,7 @@ + { + static final long serialVersionUID = 8367026044764648243L; + +-// FIXME: Serialization: Need to write methods for. +- +-/* +- * Static Variables +- */ ++ // FIXME: Serialization: Need to write methods for. + + /** + * This is the data flavor used for tranferring plain text. The MIME +@@ -90,6 +86,10 @@ + */ + public static final DataFlavor javaFileListFlavor; + ++/** ++ * This is an image flavor used for transferring images. The ++ * representation type is a java.awt.Image. ++ */ + public static final DataFlavor imageFlavor; + + /** +@@ -105,7 +105,7 @@ + * being transferred. + */ + public static final String javaJVMLocalObjectMimeType = +- "application/x-java-jvm-local-object"; ++ "application/x-java-jvm-local-objectref"; + + /** + * This is the MIME type used to transfer a link to a remote object. +@@ -270,7 +270,7 @@ + /** + * Initializes a new instance of DataFlavor with the + * specified MIME type and description. If the MIME type has a +- * "class=" parameter then the representation class will ++ * "class=<rep class>" parameter then the representation class will + * be the class name specified. Otherwise the class defaults to + * java.io.InputStream. If the human readable name + * is not specified (null) then the human readable name +@@ -319,7 +319,7 @@ + /** + * Initializes a new instance of DataFlavor with the + * specified MIME type and description. If the MIME type has a +- * "class=" parameter then the representation class will ++ * "class=<rep class>" parameter then the representation class will + * be the class name specified. Otherwise the class defaults to + * java.io.InputStream. If the human readable name + * is not specified (null) then the human readable name +@@ -709,10 +709,10 @@ + * are met: + *

    + *

      +- *
    • The object is not null. +- *
    • The object is an instance of DataFlavor. ++ *
    • The object is not null.
    • ++ *
    • The object is an instance of DataFlavor.
    • + *
    • The object's MIME type and representation class are equal to +- * this object's. ++ * this object's.
    • + *
    + * + * @param obj The Object to test against. +Index: java/awt/event/InvocationEvent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/event/InvocationEvent.java,v +retrieving revision 1.4 +diff -u -r1.4 InvocationEvent.java +--- java/awt/event/InvocationEvent.java 9 Aug 2002 04:26:15 -0000 1.4 ++++ java/awt/event/InvocationEvent.java 6 Sep 2004 16:35:48 -0000 +@@ -189,8 +189,13 @@ + } + else + runnable.run(); +- if (notifier != null) +- notifier.notifyAll(); ++ ++ Object o = notifier; ++ if (o != null) ++ synchronized(o) ++ { ++ o.notifyAll(); ++ } + } + + /** +Index: java/awt/event/MouseEvent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/event/MouseEvent.java,v +retrieving revision 1.5 +diff -u -r1.5 MouseEvent.java +--- java/awt/event/MouseEvent.java 9 Aug 2002 04:26:15 -0000 1.5 ++++ java/awt/event/MouseEvent.java 6 Sep 2004 16:35:48 -0000 +@@ -220,11 +220,11 @@ + if ((modifiers & EventModifier.OLD_MASK) != 0) + { + if ((modifiers & BUTTON1_MASK) != 0) +- button = BUTTON1; ++ this.button = BUTTON1; + else if ((modifiers & BUTTON2_MASK) != 0) +- button = BUTTON2; ++ this.button = BUTTON2; + else if ((modifiers & BUTTON3_MASK) != 0) +- button = BUTTON3; ++ this.button = BUTTON3; + } + } + +Index: java/awt/geom/AffineTransform.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/geom/AffineTransform.java,v +retrieving revision 1.7 +diff -u -r1.7 AffineTransform.java +--- java/awt/geom/AffineTransform.java 17 Sep 2003 19:06:55 -0000 1.7 ++++ java/awt/geom/AffineTransform.java 6 Sep 2004 16:35:48 -0000 +@@ -226,7 +226,7 @@ + private double m00; + + /** +- * The Y coordinate scaling element of the transform matrix. ++ * The Y coordinate shearing element of the transform matrix. + * + * @serial matrix[1,0] + */ +@@ -240,7 +240,7 @@ + private double m01; + + /** +- * The Y coordinate shearing element of the transform matrix. ++ * The Y coordinate scaling element of the transform matrix. + * + * @serial matrix[1,1] + */ +@@ -738,10 +738,10 @@ + */ + public void shear(double shx, double shy) + { +- double n00 = m00 + shx * m01; +- double n01 = shx * m00 + m01; +- double n10 = m10 * shy + m11; +- double n11 = shx * m10 + m11; ++ double n00 = m00 + (shy * m01); ++ double n01 = m01 + (shx * m00); ++ double n10 = m10 + (shy * m11); ++ double n11 = m11 + (shx * m10); + m00 = n00; + m01 = n01; + m10 = n10; +@@ -996,6 +996,38 @@ + * map multiple points to the same line or point). A transform exists only + * if getDeterminant() has a non-zero value. + * ++ * The inverse is calculated as: ++ * ++ *
    ++   *
    ++   * Let A be the matrix for which we want to find the inverse:
    ++   *
    ++   * A = [ m00 m01 m02 ]
    ++   *     [ m10 m11 m12 ]
    ++   *     [ 0   0   1   ] 
    ++   *
    ++   *
    ++   *                 1    
    ++   * inverse (A) =  ---   x  adjoint(A) 
    ++   *                det 
    ++   *
    ++   *
    ++   *
    ++   *             =   1       [  m11  -m01   m01*m12-m02*m11  ]
    ++   *                ---   x  [ -m10   m00  -m00*m12+m10*m02  ]
    ++   *                det      [  0     0     m00*m11-m10*m01  ]
    ++   *
    ++   *
    ++   *
    ++   *             = [  m11/det  -m01/det   m01*m12-m02*m11/det ]
    ++   *               [ -m10/det   m00/det  -m00*m12+m10*m02/det ]
    ++   *               [   0           0          1               ]
    ++   *
    ++   *
    ++   * 
    ++ * ++ * ++ * + * @return a new inverse transform + * @throws NoninvertibleTransformException if inversion is not possible + * @see #getDeterminant() +@@ -1006,8 +1038,15 @@ + double det = getDeterminant(); + if (det == 0) + throw new NoninvertibleTransformException("can't invert transform"); +- return new AffineTransform(m11 / det, -m10 / det, m01 / det, -m00 / det, +- -m02, -m12); ++ ++ double im00 = m11 / det; ++ double im10 = -m10 / det; ++ double im01 = -m01 / det; ++ double im11 = m00 / det; ++ double im02 = (m01 * m12 - m02 * m11) / det; ++ double im12 = (-m00 * m12 + m10 * m02) / det; ++ ++ return new AffineTransform (im00, im10, im01, im11, im02, im12); + } + + /** +Index: java/awt/geom/Arc2D.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/geom/Arc2D.java,v +retrieving revision 1.3 +diff -u -r1.3 Arc2D.java +--- java/awt/geom/Arc2D.java 17 Sep 2003 19:06:55 -0000 1.3 ++++ java/awt/geom/Arc2D.java 6 Sep 2004 16:35:49 -0000 +@@ -50,7 +50,7 @@ + * and while the angle can be any value, the path iterator only traverses the + * first 360 degrees. Storage is up to the subclasses. + * +- * @author Eric Blake ++ * @author Eric Blake (ebb9@email.byu.edu) + * @since 1.2 + * @status updated to 1.4, but still missing functionality + */ +@@ -527,7 +527,7 @@ + * This class is used to iterate over an arc. Since ellipses are a subclass + * of arcs, this is used by Ellipse2D as well. + * +- * @author Eric Blake ++ * @author Eric Blake (ebb9@email.byu.edu) + */ + static final class ArcIterator implements PathIterator + { +@@ -766,7 +766,7 @@ + /** + * This class implements an arc in double precision. + * +- * @author Eric Blake x
    coordinate of the curve’s start + * point. + */ + public abstract double getX1(); + +- + /** + * Returns the y coordinate of the curve’s start + * point. + */ + public abstract double getY1(); + +- + /** + * Returns the curve’s start point. + */ + public abstract Point2D getP1(); + +- + /** + * Returns the x coordinate of the curve’s first + * control point. + */ + public abstract double getCtrlX1(); + +- + /** + * Returns the y coordinate of the curve’s first + * control point. + */ + public abstract double getCtrlY1(); + +- + /** + * Returns the curve’s first control point. + */ + public abstract Point2D getCtrlP1(); + +- + /** + * Returns the x coordinate of the curve’s second + * control point. + */ + public abstract double getCtrlX2(); + +- + /** + * Returns the y coordinate of the curve’s second + * control point. + */ + public abstract double getCtrlY2(); + +- + /** + * Returns the curve’s second control point. + */ + public abstract Point2D getCtrlP2(); + +- + /** + * Returns the x coordinate of the curve’s end + * point. + */ + public abstract double getX2(); + +- + /** + * Returns the y coordinate of the curve’s end + * point. + */ + public abstract double getY2(); + +- + /** + * Returns the curve’s end point. + */ + public abstract Point2D getP2(); + +- + /** + * Changes the curve geometry, separately specifying each coordinate + * value. +@@ -183,7 +171,6 @@ + public abstract void setCurve(double x1, double y1, double cx1, double cy1, + double cx2, double cy2, double x2, double y2); + +- + /** + * Changes the curve geometry, specifying coordinate values in an + * array. +@@ -206,13 +193,11 @@ + */ + public void setCurve(double[] coords, int offset) + { +- setCurve(coords[offset++], coords[offset++], +- coords[offset++], coords[offset++], +- coords[offset++], coords[offset++], ++ setCurve(coords[offset++], coords[offset++], coords[offset++], ++ coords[offset++], coords[offset++], coords[offset++], + coords[offset++], coords[offset++]); + } + +- + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. +@@ -232,11 +217,10 @@ + */ + public void setCurve(Point2D p1, Point2D c1, Point2D c2, Point2D p2) + { +- setCurve(p1.getX(), p1.getY(), c1.getX(), c1.getY(), +- c2.getX(), c2.getY(), p2.getX(), p2.getY()); ++ setCurve(p1.getX(), p1.getY(), c1.getX(), c1.getY(), c2.getX(), c2.getY(), ++ p2.getX(), p2.getY()); + } + +- + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. +@@ -258,12 +242,10 @@ + */ + public void setCurve(Point2D[] pts, int offset) + { +- setCurve(pts[offset].getX(), pts[offset++].getY(), +- pts[offset].getX(), pts[offset++].getY(), +- pts[offset].getX(), pts[offset++].getY(), ++ setCurve(pts[offset].getX(), pts[offset++].getY(), pts[offset].getX(), ++ pts[offset++].getY(), pts[offset].getX(), pts[offset++].getY(), + pts[offset].getX(), pts[offset++].getY()); + } +- + + /** + * Changes the curve geometry to that of another curve. +@@ -276,7 +258,6 @@ + c.getCtrlX2(), c.getCtrlY2(), c.getX2(), c.getY2()); + } + +- + /** + * Calculates the squared flatness of a cubic curve, directly + * specifying each coordinate value. The flatness is the maximal +@@ -309,7 +290,6 @@ + Line2D.ptSegDistSq(x1, y1, x2, y2, cx2, cy2)); + } + +- + /** + * Calculates the flatness of a cubic curve, directly specifying + * each coordinate value. The flatness is the maximal distance of a +@@ -340,7 +320,6 @@ + return Math.sqrt(getFlatnessSq(x1, y1, cx1, cy1, cx2, cy2, x2, y2)); + } + +- + /** + * Calculates the squared flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal +@@ -374,13 +353,11 @@ + */ + public static double getFlatnessSq(double[] coords, int offset) + { +- return getFlatnessSq(coords[offset++], coords[offset++], +- coords[offset++], coords[offset++], +- coords[offset++], coords[offset++], ++ return getFlatnessSq(coords[offset++], coords[offset++], coords[offset++], ++ coords[offset++], coords[offset++], coords[offset++], + coords[offset++], coords[offset++]); + } + +- + /** + * Calculates the flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal +@@ -420,7 +397,6 @@ + coords[offset++], coords[offset++])); + } + +- + /** + * Calculates the squared flatness of this curve. The flatness is + * the maximal distance of a control point to the line between start +@@ -441,7 +417,6 @@ + getCtrlX2(), getCtrlY2(), getX2(), getY2()); + } + +- + /** + * Calculates the flatness of this curve. The flatness is the + * maximal distance of a control point to the line between start and +@@ -458,12 +433,10 @@ + */ + public double getFlatness() + { +- return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX1(), +- getCtrlY1(), getCtrlX2(), getCtrlY2(), +- getX2(), getY2())); ++ return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX1(), getCtrlY1(), ++ getCtrlX2(), getCtrlY2(), getX2(), getY2())); + } + +- + /** + * Subdivides this curve into two halves. + * +@@ -482,9 +455,11 @@ + public void subdivide(CubicCurve2D left, CubicCurve2D right) + { + // Use empty slots at end to share single array. +- double[] d = new double[] { getX1(), getY1(), getCtrlX1(), getCtrlY1(), +- getCtrlX2(), getCtrlY2(), getX2(), getY2(), +- 0, 0, 0, 0, 0, 0 }; ++ double[] d = new double[] ++ { ++ getX1(), getY1(), getCtrlX1(), getCtrlY1(), getCtrlX2(), ++ getCtrlY2(), getX2(), getY2(), 0, 0, 0, 0, 0, 0 ++ }; + subdivide(d, 0, d, 0, d, 6); + if (left != null) + left.setCurve(d, 0); +@@ -492,7 +467,6 @@ + right.setCurve(d, 6); + } + +- + /** + * Subdivides a cubic curve into two halves. + * +@@ -510,13 +484,12 @@ + * of src, or null if the caller is not + * interested in the right half. + */ +- public static void subdivide(CubicCurve2D src, +- CubicCurve2D left, CubicCurve2D right) ++ public static void subdivide(CubicCurve2D src, CubicCurve2D left, ++ CubicCurve2D right) + { + src.subdivide(left, right); + } + +- + /** + * Subdivides a cubic curve into two halves, passing all coordinates + * in an array. +@@ -563,18 +536,29 @@ + * index where the start point’s x coordinate will be + * stored. + */ +- public static void subdivide(double[] src, int srcOff, +- double[] left, int leftOff, +- double[] right, int rightOff) ++ public static void subdivide(double[] src, int srcOff, double[] left, ++ int leftOff, double[] right, int rightOff) + { + // To understand this code, please have a look at the image + // "CubicCurve2D-3.png" in the sub-directory "doc-files". +- double src_C1_x, src_C1_y, src_C2_x, src_C2_y; +- double left_P1_x, left_P1_y; +- double left_C1_x, left_C1_y, left_C2_x, left_C2_y; +- double right_C1_x, right_C1_y, right_C2_x, right_C2_y; +- double right_P2_x, right_P2_y; +- double Mid_x, Mid_y; // Mid = left.P2 = right.P1 ++ double src_C1_x; ++ double src_C1_y; ++ double src_C2_x; ++ double src_C2_y; ++ double left_P1_x; ++ double left_P1_y; ++ double left_C1_x; ++ double left_C1_y; ++ double left_C2_x; ++ double left_C2_y; ++ double right_C1_x; ++ double right_C1_y; ++ double right_C2_x; ++ double right_C2_y; ++ double right_P2_x; ++ double right_P2_y; ++ double Mid_x; // Mid = left.P2 = right.P1 ++ double Mid_y; // Mid = left.P2 = right.P1 + + left_P1_x = src[srcOff]; + left_P1_y = src[srcOff + 1]; +@@ -599,31 +583,30 @@ + Mid_y = (left_C2_y + right_C1_y) / 2; + + if (left != null) +- { +- left[leftOff] = left_P1_x; +- left[leftOff + 1] = left_P1_y; +- left[leftOff + 2] = left_C1_x; +- left[leftOff + 3] = left_C1_y; +- left[leftOff + 4] = left_C2_x; +- left[leftOff + 5] = left_C2_y; +- left[leftOff + 6] = Mid_x; +- left[leftOff + 7] = Mid_y; +- } ++ { ++ left[leftOff] = left_P1_x; ++ left[leftOff + 1] = left_P1_y; ++ left[leftOff + 2] = left_C1_x; ++ left[leftOff + 3] = left_C1_y; ++ left[leftOff + 4] = left_C2_x; ++ left[leftOff + 5] = left_C2_y; ++ left[leftOff + 6] = Mid_x; ++ left[leftOff + 7] = Mid_y; ++ } + + if (right != null) +- { +- right[rightOff] = Mid_x; +- right[rightOff + 1] = Mid_y; +- right[rightOff + 2] = right_C1_x; +- right[rightOff + 3] = right_C1_y; +- right[rightOff + 4] = right_C2_x; +- right[rightOff + 5] = right_C2_y; +- right[rightOff + 6] = right_P2_x; +- right[rightOff + 7] = right_P2_y; +- } ++ { ++ right[rightOff] = Mid_x; ++ right[rightOff + 1] = Mid_y; ++ right[rightOff + 2] = right_C1_x; ++ right[rightOff + 3] = right_C1_y; ++ right[rightOff + 4] = right_C2_x; ++ right[rightOff + 5] = right_C2_y; ++ right[rightOff + 6] = right_P2_x; ++ right[rightOff + 7] = right_P2_y; ++ } + } + +- + /** + * Finds the non-complex roots of a cubic equation, placing the + * results into the same array as the equation coefficients. The +@@ -670,7 +653,6 @@ + return solveCubic(eqn, eqn); + } + +- + /** + * Finds the non-complex roots of a cubic equation. The following + * equation is being solved: +@@ -727,9 +709,19 @@ + // The Java implementation is very similar to the GSL code, but + // not a strict one-to-one copy. For example, GSL would sort the + // result. +- +- double a, b, c, q, r, Q, R; +- double c3, Q3, R2, CR2, CQ3; ++ ++ double a; ++ double b; ++ double c; ++ double q; ++ double r; ++ double Q; ++ double R; ++ double c3; ++ double Q3; ++ double R2; ++ double CR2; ++ double CQ3; + + // If the cubic coefficient is zero, we have a quadratic equation. + c3 = eqn[3]; +@@ -755,219 +747,267 @@ + CQ3 = 2916 * q * q * q; + + if (R == 0 && Q == 0) +- { +- // The GNU Scientific Library would return three identical +- // solutions in this case. +- res[0] = -a/3; +- return 1; +- } +- +- if (CR2 == CQ3) +- { +- /* this test is actually R2 == Q3, written in a form suitable +- for exact computation with integers */ +- +- /* Due to finite precision some double roots may be missed, and +- considered to be a pair of complex roots z = x +/- epsilon i +- close to the real axis. */ +- +- double sqrtQ = Math.sqrt(Q); +- +- if (R > 0) + { +- res[0] = -2 * sqrtQ - a/3; +- res[1] = sqrtQ - a/3; ++ // The GNU Scientific Library would return three identical ++ // solutions in this case. ++ res[0] = -a / 3; ++ return 1; + } +- else ++ ++ if (CR2 == CQ3) + { +- res[0] = -sqrtQ - a/3; +- res[1] = 2 * sqrtQ - a/3; ++ /* this test is actually R2 == Q3, written in a form suitable ++ for exact computation with integers */ ++ /* Due to finite precision some double roots may be missed, and ++ considered to be a pair of complex roots z = x +/- epsilon i ++ close to the real axis. */ ++ double sqrtQ = Math.sqrt(Q); ++ ++ if (R > 0) ++ { ++ res[0] = -2 * sqrtQ - a / 3; ++ res[1] = sqrtQ - a / 3; ++ } ++ else ++ { ++ res[0] = -sqrtQ - a / 3; ++ res[1] = 2 * sqrtQ - a / 3; ++ } ++ return 2; + } +- return 2; +- } + + if (CR2 < CQ3) /* equivalent to R2 < Q3 */ +- { +- double sqrtQ = Math.sqrt(Q); +- double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ; +- double theta = Math.acos(R / sqrtQ3); +- double norm = -2 * sqrtQ; +- res[0] = norm * Math.cos(theta / 3) - a / 3; +- res[1] = norm * Math.cos((theta + 2.0 * Math.PI) / 3) - a/3; +- res[2] = norm * Math.cos((theta - 2.0 * Math.PI) / 3) - a/3; ++ { ++ double sqrtQ = Math.sqrt(Q); ++ double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ; ++ double theta = Math.acos(R / sqrtQ3); ++ double norm = -2 * sqrtQ; ++ res[0] = norm * Math.cos(theta / 3) - a / 3; ++ res[1] = norm * Math.cos((theta + 2.0 * Math.PI) / 3) - a / 3; ++ res[2] = norm * Math.cos((theta - 2.0 * Math.PI) / 3) - a / 3; + +- // The GNU Scientific Library sorts the results. We don't. +- return 3; +- } ++ // The GNU Scientific Library sorts the results. We don't. ++ return 3; ++ } + + double sgnR = (R >= 0 ? 1 : -1); +- double A = -sgnR * Math.pow(Math.abs(R) + Math.sqrt(R2 - Q3), 1.0/3.0); +- double B = Q / A ; +- res[0] = A + B - a/3; ++ double A = -sgnR * Math.pow(Math.abs(R) + Math.sqrt(R2 - Q3), 1.0 / 3.0); ++ double B = Q / A; ++ res[0] = A + B - a / 3; + return 1; + } + +- + /** +- * Determines whether a position lies inside the area that is bounded ++ * Determines whether a position lies inside the area bounded + * by the curve and the straight line connecting its end points. + * + *

    A drawing of the area spanned by the curve + * + *

    The above drawing illustrates in which area points are +- * considered “contained” in a CubicCurve2D. ++ * considered “inside” a CubicCurve2D. + */ + public boolean contains(double x, double y) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().contains(x, y)) ++ return false; + ++ return ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0); ++ } + + /** +- * Determines whether a point lies inside the area that is bounded ++ * Determines whether a point lies inside the area bounded + * by the curve and the straight line connecting its end points. + * + *

    A drawing of the area spanned by the curve + * + *

    The above drawing illustrates in which area points are +- * considered “contained” in a CubicCurve2D. ++ * considered “inside” a CubicCurve2D. + */ + public boolean contains(Point2D p) + { + return contains(p.getX(), p.getY()); + } + +- ++ /** ++ * Determines whether any part of a rectangle is inside the area bounded ++ * by the curve and the straight line connecting its end points. ++ * ++ *

    A drawing of the area spanned by the curve ++ * ++ *

    The above drawing illustrates in which area points are ++ * considered “inside” in a CubicCurve2D. ++ * @see #contains(double, double) ++ */ + public boolean intersects(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().contains(x, y, w, h)) ++ return false; + ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, true, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, true, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, false, h) != 0 /* right */ ++ || getAxisIntersections(x, y, false, h) != 0) /* left */ ++ return true; + ++ /* No intersections, is any point inside? */ ++ if ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0) ++ return true; ++ ++ return false; ++ } ++ ++ /** ++ * Determines whether any part of a Rectangle2D is inside the area bounded ++ * by the curve and the straight line connecting its end points. ++ * @see #intersects(double, double, double, double) ++ */ + public boolean intersects(Rectangle2D r) + { + return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +- ++ /** ++ * Determine whether a rectangle is entirely inside the area that is bounded ++ * by the curve and the straight line connecting its end points. ++ * ++ *

    A drawing of the area spanned by the curve ++ * ++ *

    The above drawing illustrates in which area points are ++ * considered “inside” a CubicCurve2D. ++ * @see #contains(double, double) ++ */ + public boolean contains(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().intersects(x, y, w, h)) ++ return false; ++ ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, true, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, true, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, false, h) != 0 /* right */ ++ || getAxisIntersections(x, y, false, h) != 0) /* left */ ++ return false; + ++ /* No intersections, is any point inside? */ ++ if ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0) ++ return true; + ++ return false; ++ } ++ ++ /** ++ * Determine whether a Rectangle2D is entirely inside the area that is ++ * bounded by the curve and the straight line connecting its end points. ++ * ++ *

    A drawing of the area spanned by the curve ++ * ++ *

    The above drawing illustrates in which area points are ++ * considered “inside” a CubicCurve2D. ++ * @see #contains(double, double) ++ */ + public boolean contains(Rectangle2D r) + { + return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +- + /** + * Determines the smallest rectangle that encloses the +- * curve’s start, end and control points. As the illustration +- * below shows, the invisible control points may cause the bounds to +- * be much larger than the area that is actually covered by the +- * curve. +- * +- *

    An illustration of the bounds of a CubicCurve2D ++ * curve’s start, end and control points. + */ + public Rectangle getBounds() + { + return getBounds2D().getBounds(); + } + +- + public PathIterator getPathIterator(final AffineTransform at) + { + return new PathIterator() +- { +- /** Current coordinate. */ +- private int current = 0; +- +- public int getWindingRule() +- { +- return WIND_NON_ZERO; +- } +- +- public boolean isDone() + { +- return current >= 2; +- } +- +- public void next() +- { +- current++; +- } ++ /** Current coordinate. */ ++ private int current = 0; + +- public int currentSegment(float[] coords) +- { +- int result; +- switch (current) +- { +- case 0: +- coords[0] = (float) getX1(); +- coords[1] = (float) getY1(); +- result = SEG_MOVETO; +- break; +- case 1: +- coords[0] = (float) getCtrlX1(); +- coords[1] = (float) getCtrlY1(); +- coords[2] = (float) getCtrlX2(); +- coords[3] = (float) getCtrlY2(); +- coords[4] = (float) getX2(); +- coords[5] = (float) getY2(); +- result = SEG_CUBICTO; +- break; +- default: +- throw new NoSuchElementException("cubic iterator out of bounds"); +- } +- if (at != null) +- at.transform(coords, 0, coords, 0, 3); +- return result; +- } +- +- public int currentSegment(double[] coords) +- { +- int result; +- switch (current) +- { +- case 0: +- coords[0] = getX1(); +- coords[1] = getY1(); +- result = SEG_MOVETO; +- break; +- case 1: +- coords[0] = getCtrlX1(); +- coords[1] = getCtrlY1(); +- coords[2] = getCtrlX2(); +- coords[3] = getCtrlY2(); +- coords[4] = getX2(); +- coords[5] = getY2(); +- result = SEG_CUBICTO; +- break; +- default: +- throw new NoSuchElementException("cubic iterator out of bounds"); +- } +- if (at != null) +- at.transform(coords, 0, coords, 0, 3); +- return result; +- } +- }; ++ public int getWindingRule() ++ { ++ return WIND_NON_ZERO; ++ } ++ ++ public boolean isDone() ++ { ++ return current >= 2; ++ } ++ ++ public void next() ++ { ++ current++; ++ } ++ ++ public int currentSegment(float[] coords) ++ { ++ int result; ++ switch (current) ++ { ++ case 0: ++ coords[0] = (float) getX1(); ++ coords[1] = (float) getY1(); ++ result = SEG_MOVETO; ++ break; ++ case 1: ++ coords[0] = (float) getCtrlX1(); ++ coords[1] = (float) getCtrlY1(); ++ coords[2] = (float) getCtrlX2(); ++ coords[3] = (float) getCtrlY2(); ++ coords[4] = (float) getX2(); ++ coords[5] = (float) getY2(); ++ result = SEG_CUBICTO; ++ break; ++ default: ++ throw new NoSuchElementException("cubic iterator out of bounds"); ++ } ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 3); ++ return result; ++ } ++ ++ public int currentSegment(double[] coords) ++ { ++ int result; ++ switch (current) ++ { ++ case 0: ++ coords[0] = getX1(); ++ coords[1] = getY1(); ++ result = SEG_MOVETO; ++ break; ++ case 1: ++ coords[0] = getCtrlX1(); ++ coords[1] = getCtrlY1(); ++ coords[2] = getCtrlX2(); ++ coords[3] = getCtrlY2(); ++ coords[4] = getX2(); ++ coords[5] = getY2(); ++ result = SEG_CUBICTO; ++ break; ++ default: ++ throw new NoSuchElementException("cubic iterator out of bounds"); ++ } ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 3); ++ return result; ++ } ++ }; + } + +- + public PathIterator getPathIterator(AffineTransform at, double flatness) + { + return new FlatteningPathIterator(getPathIterator(at), flatness); + } + +- + /** + * Create a new curve with the same contents as this one. + * +@@ -976,15 +1016,118 @@ + public Object clone() + { + try +- { +- return super.clone(); +- } ++ { ++ return super.clone(); ++ } + catch (CloneNotSupportedException e) +- { +- throw (Error) new InternalError().initCause(e); // Impossible +- } ++ { ++ throw (Error) new InternalError().initCause(e); // Impossible ++ } + } + ++ /** ++ * Helper method used by contains() and intersects() methods, that ++ * returns the number of curve/line intersections on a given axis ++ * extending from a certain point. ++ * ++ * @param x x coordinate of the origin point ++ * @param y y coordinate of the origin point ++ * @param useYaxis axis used, if true the positive Y axis is used, ++ * false uses the positive X axis. ++ * ++ * This is an implementation of the line-crossings algorithm, ++ * Detailed in an article on Eric Haines' page: ++ * http://www.acm.org/tog/editors/erich/ptinpoly/ ++ * ++ * A special-case not adressed in this code is self-intersections ++ * of the curve, e.g. if the axis intersects the self-itersection, ++ * the degenerate roots of the polynomial will erroneously count as ++ * a single intersection of the curve, and not two. ++ */ ++ private int getAxisIntersections(double x, double y, boolean useYaxis, ++ double distance) ++ { ++ int nCrossings = 0; ++ double a0; ++ double a1; ++ double a2; ++ double a3; ++ double b0; ++ double b1; ++ double b2; ++ double b3; ++ double[] r = new double[4]; ++ int nRoots; ++ ++ a0 = a3 = 0.0; ++ ++ if (useYaxis) ++ { ++ a0 = getY1() - y; ++ a1 = getCtrlY1() - y; ++ a2 = getCtrlY2() - y; ++ a3 = getY2() - y; ++ b0 = getX1() - x; ++ b1 = getCtrlX1() - x; ++ b2 = getCtrlX2() - x; ++ b3 = getX2() - x; ++ } ++ else ++ { ++ a0 = getX1() - x; ++ a1 = getCtrlX1() - x; ++ a2 = getCtrlX2() - x; ++ a3 = getX2() - x; ++ b0 = getY1() - y; ++ b1 = getCtrlY1() - y; ++ b2 = getCtrlY2() - y; ++ b3 = getY2() - y; ++ } ++ ++ /* If the axis intersects a start/endpoint, shift it up by some small ++ amount to guarantee the line is 'inside' ++ If this is not done, bad behaviour may result for points on that axis.*/ ++ if (a0 == 0.0 || a3 == 0.0) ++ { ++ double small = getFlatness() * (1E-10); ++ if (a0 == 0.0) ++ a0 += small; ++ if (a3 == 0.0) ++ a3 += small; ++ } ++ ++ if (useYaxis) ++ { ++ if (Line2D.linesIntersect(b0, a0, b3, a3, 0.0, 0.0, distance, 0.0)) ++ nCrossings++; ++ } ++ else ++ { ++ if (Line2D.linesIntersect(a0, b0, a3, b3, 0.0, 0.0, 0.0, distance)) ++ nCrossings++; ++ } ++ ++ r[0] = a0; ++ r[1] = 3 * (a1 - a0); ++ r[2] = 3 * (a2 + a0 - 2 * a1); ++ r[3] = a3 - 3 * a2 + 3 * a1 - a0; ++ ++ if ((nRoots = solveCubic(r)) != 0) ++ for (int i = 0; i < nRoots; i++) ++ { ++ double t = r[i]; ++ if (t >= 0.0 && t <= 1.0) ++ { ++ double crossing = -(t * t * t) * (b0 - 3 * b1 + 3 * b2 - b3) ++ + 3 * t * t * (b0 - 2 * b1 + b2) ++ + 3 * t * (b1 - b0) + b0; ++ if (crossing > 0.0 && crossing <= distance) ++ nCrossings++; ++ } ++ } ++ ++ return (nCrossings); ++ } + + /** + * A two-dimensional curve that is parameterized with a cubic +@@ -996,57 +1139,48 @@ + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) + */ +- public static class Double +- extends CubicCurve2D ++ public static class Double extends CubicCurve2D + { + /** + * The x coordinate of the curve’s start point. + */ + public double x1; + +- + /** + * The y coordinate of the curve’s start point. + */ + public double y1; + +- + /** + * The x coordinate of the curve’s first control point. + */ + public double ctrlx1; + +- + /** + * The y coordinate of the curve’s first control point. + */ + public double ctrly1; + +- + /** + * The x coordinate of the curve’s second control point. + */ + public double ctrlx2; + +- + /** + * The y coordinate of the curve’s second control point. + */ + public double ctrly2; + +- + /** + * The x coordinate of the curve’s end point. + */ + public double x2; + +- + /** + * The y coordinate of the curve’s end point. + */ + public double y2; + +- + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format. All points are +@@ -1056,7 +1190,6 @@ + { + } + +- + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format, specifying the +@@ -1089,8 +1222,8 @@ + * @param y2 the y coordinate of the curve’s end + * point. + */ +- public Double(double x1, double y1, double cx1, double cy1, +- double cx2, double cy2, double x2, double y2) ++ public Double(double x1, double y1, double cx1, double cy1, double cx2, ++ double cy2, double x2, double y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -1102,7 +1235,6 @@ + this.y2 = y2; + } + +- + /** + * Returns the x coordinate of the curve’s start + * point. +@@ -1112,7 +1244,6 @@ + return x1; + } + +- + /** + * Returns the y coordinate of the curve’s start + * point. +@@ -1122,7 +1253,6 @@ + return y1; + } + +- + /** + * Returns the curve’s start point. + */ +@@ -1131,7 +1261,6 @@ + return new Point2D.Double(x1, y1); + } + +- + /** + * Returns the x coordinate of the curve’s first + * control point. +@@ -1141,7 +1270,6 @@ + return ctrlx1; + } + +- + /** + * Returns the y coordinate of the curve’s first + * control point. +@@ -1151,7 +1279,6 @@ + return ctrly1; + } + +- + /** + * Returns the curve’s first control point. + */ +@@ -1160,7 +1287,6 @@ + return new Point2D.Double(ctrlx1, ctrly1); + } + +- + /** + * Returns the x coordinate of the curve’s second + * control point. +@@ -1170,7 +1296,6 @@ + return ctrlx2; + } + +- + /** + * Returns the y coordinate of the curve’s second + * control point. +@@ -1180,7 +1305,6 @@ + return ctrly2; + } + +- + /** + * Returns the curve’s second control point. + */ +@@ -1189,7 +1313,6 @@ + return new Point2D.Double(ctrlx2, ctrly2); + } + +- + /** + * Returns the x coordinate of the curve’s end + * point. +@@ -1199,7 +1322,6 @@ + return x2; + } + +- + /** + * Returns the y coordinate of the curve’s end + * point. +@@ -1209,7 +1331,6 @@ + return y2; + } + +- + /** + * Returns the curve’s end point. + */ +@@ -1218,7 +1339,6 @@ + return new Point2D.Double(x2, y2); + } + +- + /** + * Changes the curve geometry, separately specifying each coordinate + * value. +@@ -1263,7 +1383,6 @@ + this.y2 = y2; + } + +- + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the +@@ -1284,7 +1403,6 @@ + } + } + +- + /** + * A two-dimensional curve that is parameterized with a cubic + * function and stores coordinate values in single-precision +@@ -1295,57 +1413,48 @@ + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) + */ +- public static class Float +- extends CubicCurve2D ++ public static class Float extends CubicCurve2D + { + /** + * The x coordinate of the curve’s start point. + */ + public float x1; + +- + /** + * The y coordinate of the curve’s start point. + */ + public float y1; + +- + /** + * The x coordinate of the curve’s first control point. + */ + public float ctrlx1; + +- + /** + * The y coordinate of the curve’s first control point. + */ + public float ctrly1; + +- + /** + * The x coordinate of the curve’s second control point. + */ + public float ctrlx2; + +- + /** + * The y coordinate of the curve’s second control point. + */ + public float ctrly2; + +- + /** + * The x coordinate of the curve’s end point. + */ + public float x2; + +- + /** + * The y coordinate of the curve’s end point. + */ + public float y2; + +- + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format. All points are +@@ -1355,7 +1464,6 @@ + { + } + +- + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format, specifying the +@@ -1388,8 +1496,8 @@ + * @param y2 the y coordinate of the curve’s end + * point. + */ +- public Float(float x1, float y1, float cx1, float cy1, +- float cx2, float cy2, float x2, float y2) ++ public Float(float x1, float y1, float cx1, float cy1, float cx2, ++ float cy2, float x2, float y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -1401,7 +1509,6 @@ + this.y2 = y2; + } + +- + /** + * Returns the x coordinate of the curve’s start + * point. +@@ -1411,7 +1518,6 @@ + return x1; + } + +- + /** + * Returns the y coordinate of the curve’s start + * point. +@@ -1421,7 +1527,6 @@ + return y1; + } + +- + /** + * Returns the curve’s start point. + */ +@@ -1430,7 +1535,6 @@ + return new Point2D.Float(x1, y1); + } + +- + /** + * Returns the x coordinate of the curve’s first + * control point. +@@ -1440,7 +1544,6 @@ + return ctrlx1; + } + +- + /** + * Returns the y coordinate of the curve’s first + * control point. +@@ -1450,7 +1553,6 @@ + return ctrly1; + } + +- + /** + * Returns the curve’s first control point. + */ +@@ -1459,7 +1561,6 @@ + return new Point2D.Float(ctrlx1, ctrly1); + } + +- + /** + * Returns the s coordinate of the curve’s second + * control point. +@@ -1469,7 +1570,6 @@ + return ctrlx2; + } + +- + /** + * Returns the y coordinate of the curve’s second + * control point. +@@ -1479,7 +1579,6 @@ + return ctrly2; + } + +- + /** + * Returns the curve’s second control point. + */ +@@ -1488,7 +1587,6 @@ + return new Point2D.Float(ctrlx2, ctrly2); + } + +- + /** + * Returns the x coordinate of the curve’s end + * point. +@@ -1498,7 +1596,6 @@ + return x2; + } + +- + /** + * Returns the y coordinate of the curve’s end + * point. +@@ -1508,7 +1605,6 @@ + return y2; + } + +- + /** + * Returns the curve’s end point. + */ +@@ -1517,7 +1613,6 @@ + return new Point2D.Float(x2, y2); + } + +- + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a double-precision floating-point number. +@@ -1562,7 +1657,6 @@ + this.y2 = (float) y2; + } + +- + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a single-precision floating-point number. +@@ -1594,8 +1688,8 @@ + * @param y2 the y coordinate of the curve’s new end + * point. + */ +- public void setCurve(float x1, float y1, float cx1, float cy1, +- float cx2, float cy2, float x2, float y2) ++ public void setCurve(float x1, float y1, float cx1, float cy1, float cx2, ++ float cy2, float x2, float y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -1607,7 +1701,6 @@ + this.y2 = y2; + } + +- + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the +Index: java/awt/geom/GeneralPath.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/geom/GeneralPath.java,v +retrieving revision 1.3 +diff -u -r1.3 GeneralPath.java +--- java/awt/geom/GeneralPath.java 21 Oct 2003 13:18:22 -0000 1.3 ++++ java/awt/geom/GeneralPath.java 6 Sep 2004 16:35:49 -0000 +@@ -1,50 +1,80 @@ + /* GeneralPath.java -- represents a shape built from subpaths +- Copyright (C) 2002, 2003 Free Software Foundation ++ Copyright (C) 2002, 2003, 2004 Free Software Foundation + +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ ++ This file is part of GNU Classpath. + ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ + + package java.awt.geom; + + import java.awt.Rectangle; + import java.awt.Shape; + ++ + /** +- * STUBS ONLY +- * XXX Implement and document. Note that Sun's implementation only expects +- * float precision, not double. ++ * A general geometric path, consisting of any number of subpaths ++ * constructed out of straight lines and cubic or quadratic Bezier ++ * curves. ++ * ++ *

    The inside of the curve is defined for drawing purposes by a winding ++ * rule. Either the WIND_EVEN_ODD or WIND_NON_ZERO winding rule can be chosen. ++ * ++ *

    A drawing of a GeneralPath ++ *

    The EVEN_ODD winding rule defines a point as inside a path if: ++ * A ray from the point towards infinity in an arbitrary direction ++ * intersects the path an odd number of times. Points A and ++ * C in the image are considered to be outside the path. ++ * (both intersect twice) ++ * Point B intersects once, and is inside. ++ * ++ *

    The NON_ZERO winding rule defines a point as inside a path if: ++ * The path intersects the ray in an equal number of opposite directions. ++ * Point A in the image is outside (one intersection in the ++ * ’up’ ++ * direction, one in the ’down’ direction) Point B in ++ * the image is inside (one intersection ’down’) ++ * Point C in the image is outside (two intersections ++ * ’down’) ++ * ++ * @see Line2D ++ * @see CubicCurve2D ++ * @see QuadCurve2D ++ * ++ * @author Sascha Brawer (brawer@dandelis.ch) ++ * @author Sven de Marothy (sven@physto.se) ++ * ++ * @since 1.2 + */ + public final class GeneralPath implements Shape, Cloneable + { +@@ -52,35 +82,63 @@ + public static final int WIND_NON_ZERO = PathIterator.WIND_NON_ZERO; + + /** Initial size if not specified. */ +- private static final int INIT_SIZE = 20; ++ private static final int INIT_SIZE = 10; ++ ++ /** A big number, but not so big it can't survive a few float operations */ ++ private static final double BIG_VALUE = java.lang.Double.MAX_VALUE / 10.0; + + /** The winding rule. */ + private int rule; ++ + /** +- * The path type in points. Note that points[index] maps to +- * types[index >> 1]; the control points of quad and cubic paths map as ++ * The path type in points. Note that xpoints[index] and ypoints[index] maps ++ * to types[index]; the control points of quad and cubic paths map as + * well but are ignored. + */ + private byte[] types; ++ + /** + * The list of all points seen. Since you can only append floats, it makes +- * sense for this to be a float[]. I have no idea why Sun didn't choose to ++ * sense for these to be float[]. I have no idea why Sun didn't choose to + * allow a general path of double precision points. ++ * Note: Storing x and y coords seperately makes for a slower transforms, ++ * But it speeds up and simplifies box-intersection checking a lot. + */ +- private float[] points; ++ private float[] xpoints; ++ private float[] ypoints; ++ + /** The index of the most recent moveto point, or null. */ + private int subpath = -1; ++ + /** The next available index into points. */ + private int index; + ++ /** ++ * Constructs a GeneralPath with the default (NON_ZERO) ++ * winding rule and initial capacity (20). ++ */ + public GeneralPath() + { + this(WIND_NON_ZERO, INIT_SIZE); + } ++ ++ /** ++ * Constructs a GeneralPath with a specific winding rule ++ * and the default initial capacity (20). ++ * @param rule the winding rule (WIND_NON_ZERO or WIND_EVEN_ODD) ++ */ + public GeneralPath(int rule) + { + this(rule, INIT_SIZE); + } ++ ++ /** ++ * Constructs a GeneralPath with a specific winding rule ++ * and the initial capacity. The initial capacity should be ++ * the approximate number of path segments to be used. ++ * @param rule the winding rule (WIND_NON_ZERO or WIND_EVEN_ODD) ++ * @param capacity the inital capacity, in path segments ++ */ + public GeneralPath(int rule, int capacity) + { + if (rule != WIND_EVEN_ODD && rule != WIND_NON_ZERO) +@@ -88,68 +146,112 @@ + this.rule = rule; + if (capacity < INIT_SIZE) + capacity = INIT_SIZE; +- types = new byte[capacity >> 1]; +- points = new float[capacity]; ++ types = new byte[capacity]; ++ xpoints = new float[capacity]; ++ ypoints = new float[capacity]; + } ++ ++ /** ++ * Constructs a GeneralPath from an arbitrary shape object. ++ * The Shapes PathIterator path and winding rule will be used. ++ * @param s the shape ++ */ + public GeneralPath(Shape s) + { +- types = new byte[INIT_SIZE >> 1]; +- points = new float[INIT_SIZE]; ++ types = new byte[INIT_SIZE]; ++ xpoints = new float[INIT_SIZE]; ++ ypoints = new float[INIT_SIZE]; + PathIterator pi = s.getPathIterator(null); + setWindingRule(pi.getWindingRule()); + append(pi, false); + } + ++ /** ++ * Adds a new point to a path. ++ */ + public void moveTo(float x, float y) + { + subpath = index; +- ensureSize(index + 2); +- types[index >> 1] = PathIterator.SEG_MOVETO; +- points[index++] = x; +- points[index++] = y; ++ ensureSize(index + 1); ++ types[index] = PathIterator.SEG_MOVETO; ++ xpoints[index] = x; ++ ypoints[index++] = y; + } ++ ++ /** ++ * Appends a straight line to the current path. ++ * @param x x coordinate of the line endpoint. ++ * @param y y coordinate of the line endpoint. ++ */ + public void lineTo(float x, float y) + { +- ensureSize(index + 2); +- types[index >> 1] = PathIterator.SEG_LINETO; +- points[index++] = x; +- points[index++] = y; ++ ensureSize(index + 1); ++ types[index] = PathIterator.SEG_LINETO; ++ xpoints[index] = x; ++ ypoints[index++] = y; + } ++ ++ /** ++ * Appends a quadratic Bezier curve to the current path. ++ * @param x1 x coordinate of the control point ++ * @param y1 y coordinate of the control point ++ * @param x2 x coordinate of the curve endpoint. ++ * @param y2 y coordinate of the curve endpoint. ++ */ + public void quadTo(float x1, float y1, float x2, float y2) + { +- ensureSize(index + 4); +- types[index >> 1] = PathIterator.SEG_QUADTO; +- points[index++] = x1; +- points[index++] = y1; +- points[index++] = x2; +- points[index++] = y2; +- } +- public void curveTo(float x1, float y1, float x2, float y2, +- float x3, float y3) +- { +- ensureSize(index + 6); +- types[index >> 1] = PathIterator.SEG_CUBICTO; +- points[index++] = x1; +- points[index++] = y1; +- points[index++] = x2; +- points[index++] = y2; +- points[index++] = x3; +- points[index++] = y3; ++ ensureSize(index + 2); ++ types[index] = PathIterator.SEG_QUADTO; ++ xpoints[index] = x1; ++ ypoints[index++] = y1; ++ xpoints[index] = x2; ++ ypoints[index++] = y2; + } ++ ++ /** ++ * Appends a cubic Bezier curve to the current path. ++ * @param x1 x coordinate of the first control point ++ * @param y1 y coordinate of the first control point ++ * @param x2 x coordinate of the second control point ++ * @param y2 y coordinate of the second control point ++ * @param x3 x coordinate of the curve endpoint. ++ * @param y3 y coordinate of the curve endpoint. ++ */ ++ public void curveTo(float x1, float y1, float x2, float y2, float x3, ++ float y3) ++ { ++ ensureSize(index + 3); ++ types[index] = PathIterator.SEG_CUBICTO; ++ xpoints[index] = x1; ++ ypoints[index++] = y1; ++ xpoints[index] = x2; ++ ypoints[index++] = y2; ++ xpoints[index] = x3; ++ ypoints[index++] = y3; ++ } ++ ++ /** ++ * Closes the current subpath by drawing a line ++ * back to the point of the last moveTo. ++ */ + public void closePath() + { +- ensureSize(index + 2); +- types[index >> 1] = PathIterator.SEG_CLOSE; +- points[index++] = points[subpath]; +- points[index++] = points[subpath + 1]; ++ ensureSize(index + 1); ++ types[index] = PathIterator.SEG_CLOSE; ++ xpoints[index] = xpoints[subpath]; ++ ypoints[index++] = ypoints[subpath]; + } + ++ /** ++ * Appends the segments of a Shape to the path. If connect is ++ * true, the new path segments are connected to the existing one with a line. ++ * The winding rule of the Shape is ignored. ++ */ + public void append(Shape s, boolean connect) + { + append(s.getPathIterator(null), connect); + } + +- + /** + * Appends the segments of a PathIterator to this GeneralPath. + * Optionally, the initial {@link PathIterator#SEG_MOVETO} segment +@@ -158,7 +260,7 @@ + * + * @param iter the PathIterator specifying which segments shall be + * appended. +- * ++ * + * @param connect true for substituting the initial + * {@link PathIterator#SEG_MOVETO} segment by a {@link + * PathIterator#SEG_LINETO}, or false for not +@@ -171,50 +273,55 @@ + { + // A bad implementation of this method had caused Classpath bug #6076. + float[] f = new float[6]; +- while (!iter.isDone()) +- { +- switch (iter.currentSegment(f)) ++ while (! iter.isDone()) + { +- case PathIterator.SEG_MOVETO: +- if (!connect || (index == 0)) +- { +- moveTo(f[0], f[1]); +- break; +- } ++ switch (iter.currentSegment(f)) ++ { ++ case PathIterator.SEG_MOVETO: ++ if (! connect || (index == 0)) ++ { ++ moveTo(f[0], f[1]); ++ break; ++ } ++ if ((index >= 1) && (types[index - 1] == PathIterator.SEG_CLOSE) ++ && (f[0] == xpoints[index - 1]) ++ && (f[1] == ypoints[index - 1])) ++ break; ++ ++ // Fall through. ++ case PathIterator.SEG_LINETO: ++ lineTo(f[0], f[1]); ++ break; ++ case PathIterator.SEG_QUADTO: ++ quadTo(f[0], f[1], f[2], f[3]); ++ break; ++ case PathIterator.SEG_CUBICTO: ++ curveTo(f[0], f[1], f[2], f[3], f[4], f[5]); ++ break; ++ case PathIterator.SEG_CLOSE: ++ closePath(); ++ break; ++ } + +- if ((index >= 2) && (types[(index - 2) >> 2] == PathIterator.SEG_CLOSE) +- && (f[0] == points[index - 2]) && (f[1] == points[index - 1])) +- break; +- +- // Fall through. +- +- case PathIterator.SEG_LINETO: +- lineTo(f[0], f[1]); +- break; +- +- case PathIterator.SEG_QUADTO: +- quadTo(f[0], f[1], f[2], f[3]); +- break; +- +- case PathIterator.SEG_CUBICTO: +- curveTo(f[0], f[1], f[2], f[3], f[4], f[5]); +- break; +- +- case PathIterator.SEG_CLOSE: +- closePath(); +- break; ++ connect = false; ++ iter.next(); + } +- +- connect = false; +- iter.next(); +- } + } + +- ++ /** ++ * Returns the path’s current winding rule. ++ */ + public int getWindingRule() + { + return rule; + } ++ ++ /** ++ * Sets the path’s winding rule, which controls which areas are ++ * considered ’inside’ or ’outside’ the path ++ * on drawing. Valid rules are WIND_EVEN_ODD for an even-odd winding rule, ++ * or WIND_NON_ZERO for a non-zero winding rule. ++ */ + public void setWindingRule(int rule) + { + if (rule != WIND_EVEN_ODD && rule != WIND_NON_ZERO) +@@ -222,22 +329,48 @@ + this.rule = rule; + } + ++ /** ++ * Returns the current appending point of the path. ++ */ + public Point2D getCurrentPoint() + { + if (subpath < 0) + return null; +- return new Point2D.Float(points[index - 2], points[index - 1]); ++ return new Point2D.Float(xpoints[index - 1], ypoints[index - 1]); + } ++ ++ /** ++ * Resets the path. All points and segments are destroyed. ++ */ + public void reset() + { + subpath = -1; + index = 0; + } + ++ /** ++ * Applies a transform to the path. ++ */ + public void transform(AffineTransform xform) + { +- xform.transform(points, 0, points, 0, index >> 1); ++ double nx; ++ double ny; ++ double[] m = new double[6]; ++ xform.getMatrix(m); ++ for (int i = 0; i < index; i++) ++ { ++ nx = m[0] * xpoints[i] + m[2] * ypoints[i] + m[4]; ++ ny = m[1] * xpoints[i] + m[3] * ypoints[i] + m[5]; ++ xpoints[i] = (float) nx; ++ ypoints[i] = (float) ny; ++ } + } ++ ++ /** ++ * Creates a transformed version of the path. ++ * @param xform the transform to apply ++ * @return a new transformed GeneralPath ++ */ + public Shape createTransformedShape(AffineTransform xform) + { + GeneralPath p = new GeneralPath(this); +@@ -245,85 +378,174 @@ + return p; + } + ++ /** ++ * Returns the path’s bounding box. ++ */ + public Rectangle getBounds() + { + return getBounds2D().getBounds(); + } ++ ++ /** ++ * Returns the path’s bounding box, in float precision ++ */ + public Rectangle2D getBounds2D() + { +- // XXX Implement. +- throw new Error("not implemented"); ++ float x1; ++ float y1; ++ float x2; ++ float y2; ++ ++ if (index > 0) ++ { ++ x1 = x2 = xpoints[0]; ++ y1 = y2 = ypoints[0]; ++ } ++ else ++ x1 = x2 = y1 = y2 = 0.0f; ++ ++ for (int i = 0; i < index; i++) ++ { ++ x1 = Math.min(xpoints[i], x1); ++ y1 = Math.min(ypoints[i], y1); ++ x2 = Math.max(xpoints[i], x2); ++ y2 = Math.max(ypoints[i], y2); ++ } ++ return (new Rectangle2D.Float(x1, y1, x2 - x1, y2 - y1)); + } + ++ /** ++ * Evaluates if a point is within the GeneralPath, ++ * The NON_ZERO winding rule is used, regardless of the ++ * set winding rule. ++ * @param x x coordinate of the point to evaluate ++ * @param y y coordinate of the point to evaluate ++ * @return true if the point is within the path, false otherwise ++ */ + public boolean contains(double x, double y) + { +- // XXX Implement. +- throw new Error("not implemented"); ++ return (getWindingNumber(x, y) != 0); + } ++ ++ /** ++ * Evaluates if a Point2D is within the GeneralPath, ++ * The NON_ZERO winding rule is used, regardless of the ++ * set winding rule. ++ * @param p The Point2D to evaluate ++ * @return true if the point is within the path, false otherwise ++ */ + public boolean contains(Point2D p) + { + return contains(p.getX(), p.getY()); + } ++ ++ /** ++ * Evaluates if a rectangle is completely contained within the path. ++ * This method will return false in the cases when the box ++ * intersects an inner segment of the path. ++ * (i.e.: The method is accurate for the EVEN_ODD winding rule) ++ */ + public boolean contains(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); ++ if (! getBounds2D().intersects(x, y, w, h)) ++ return false; ++ ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, false, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, false, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, true, h) != 0 /* right */ ++ || getAxisIntersections(x, y, true, h) != 0) /* left */ ++ return false; ++ ++ /* No intersections, is any point inside? */ ++ if (getWindingNumber(x, y) != 0) ++ return true; ++ ++ return false; + } ++ ++ /** ++ * Evaluates if a rectangle is completely contained within the path. ++ * This method will return false in the cases when the box ++ * intersects an inner segment of the path. ++ * (i.e.: The method is accurate for the EVEN_ODD winding rule) ++ * @param r the rectangle ++ * @return true if the rectangle is completely contained ++ * within the path, false otherwise ++ */ + public boolean contains(Rectangle2D r) + { + return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + ++ /** ++ * Evaluates if a rectangle intersects the path. ++ * @param x x coordinate of the rectangle ++ * @param y y coordinate of the rectangle ++ * @param w width of the rectangle ++ * @param h height of the rectangle ++ * @return true if the rectangle intersects the path, ++ * false otherwise ++ */ + public boolean intersects(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, false, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, false, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, true, h) != 0 /* right */ ++ || getAxisIntersections(x, y, true, h) != 0) /* left */ ++ return true; ++ ++ /* No intersections, is any point inside? */ ++ if (getWindingNumber(x, y) != 0) ++ return true; ++ ++ return false; + } ++ ++ /** ++ * Evaluates if a Rectangle2D intersects the path. ++ * @param r The rectangle ++ * @return true if the rectangle intersects the path, ++ * false otherwise ++ */ + public boolean intersects(Rectangle2D r) + { + return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +- + /** + * A PathIterator that iterates over the segments of a GeneralPath. + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ +- private static class GeneralPathIterator +- implements PathIterator ++ private static class GeneralPathIterator implements PathIterator + { + /** + * The number of coordinate values for each segment type. + */ +- private static final int[] NUM_COORDS = +- { +- /* 0: SEG_MOVETO */ 2, +- /* 1: SEG_LINETO */ 2, +- /* 2: SEG_QUADTO */ 4, +- /* 3: SEG_CUBICTO */ 6, +- /* 4: SEG_CLOSE */ 0 +- }; +- ++ private static final int[] NUM_COORDS = { ++ /* 0: SEG_MOVETO */ 1, ++ /* 1: SEG_LINETO */ 1, ++ /* 2: SEG_QUADTO */ 2, ++ /* 3: SEG_CUBICTO */ 3, ++ /* 4: SEG_CLOSE */ 0}; + + /** + * The GeneralPath whose segments are being iterated. + */ + private final GeneralPath path; + +- + /** + * The affine transformation used to transform coordinates. + */ + private final AffineTransform transform; + +- + /** + * The current position of the iterator. + */ + private int pos; + +- + /** + * Constructs a new iterator for enumerating the segments of a + * GeneralPath. +@@ -338,7 +560,6 @@ + this.transform = transform; + } + +- + /** + * Returns the current winding rule of the GeneralPath. + */ +@@ -347,7 +568,6 @@ + return path.rule; + } + +- + /** + * Determines whether the iterator has reached the last segment in + * the path. +@@ -357,7 +577,6 @@ + return pos >= path.index; + } + +- + /** + * Advances the iterator position by one segment. + */ +@@ -365,70 +584,72 @@ + { + int seg; + +- /* Increment pos by the number of coordinate values. Note that +- * we store two values even for a SEG_CLOSE segment, which is +- * why we increment pos at least by 2. ++ /* ++ * Increment pos by the number of coordinate pairs. + */ +- seg = path.types[pos >> 1]; ++ seg = path.types[pos]; + if (seg == SEG_CLOSE) +- pos += 2; ++ pos++; + else +- pos += NUM_COORDS[seg]; ++ pos += NUM_COORDS[seg]; + } + +- + /** + * Returns the current segment in float coordinates. + */ + public int currentSegment(float[] coords) + { +- int seg, numCoords; ++ int seg; ++ int numCoords; + +- seg = path.types[pos >> 1]; ++ seg = path.types[pos]; + numCoords = NUM_COORDS[seg]; + if (numCoords > 0) +- { +- if (transform == null) +- System.arraycopy(path.points, pos, coords, 0, numCoords); +- else +- transform.transform(/* src */ path.points, /* srcOffset */ pos, +- /* dest */ coords, /* destOffset */ 0, +- /* numPoints */ numCoords >> 1); +- } ++ { ++ for (int i = 0; i < numCoords; i++) ++ { ++ coords[i << 1] = path.xpoints[pos + i]; ++ coords[(i << 1) + 1] = path.ypoints[pos + i]; ++ } ++ ++ if (transform != null) ++ transform.transform( /* src */ ++ coords, /* srcOffset */ ++ 0, /* dest */ coords, /* destOffset */ ++ 0, /* numPoints */ numCoords); ++ } + return seg; + } + +- + /** + * Returns the current segment in double coordinates. + */ + public int currentSegment(double[] coords) + { +- int seg, numCoords; ++ int seg; ++ int numCoords; + +- seg = path.types[pos >> 1]; ++ seg = path.types[pos]; + numCoords = NUM_COORDS[seg]; + if (numCoords > 0) +- { +- if (transform == null) + { +- // System.arraycopy throws an exception if the source and destination +- // array are not of the same primitive type. +- for (int i = 0; i < numCoords; i++) +- coords[i] = (double) path.points[pos + i]; ++ for (int i = 0; i < numCoords; i++) ++ { ++ coords[i << 1] = (double) path.xpoints[pos + i]; ++ coords[(i << 1) + 1] = (double) path.ypoints[pos + i]; ++ } ++ if (transform != null) ++ transform.transform( /* src */ ++ coords, /* srcOffset */ ++ pos, /* dest */ coords, /* destOffset */ ++ 0, /* numPoints */ numCoords); + } +- else +- transform.transform(/* src */ path.points, /* srcOffset */ pos, +- /* dest */ coords, /* destOffset */ 0, +- /* numPoints */ numCoords >> 1); +- } + return seg; + } + } + +- + /** +- * Creates a PathIterator for iterating along the segments of this path. ++ * Creates a PathIterator for iterating along the segments of the path. + * + * @param at an affine transformation for projecting the returned + * points, or null to let the created iterator return +@@ -439,15 +660,17 @@ + return new GeneralPathIterator(this, at); + } + +- ++ /** ++ * Creates a new FlatteningPathIterator for the path ++ */ + public PathIterator getPathIterator(AffineTransform at, double flatness) + { + return new FlatteningPathIterator(getPathIterator(at), flatness); + } + + /** +- * Create a new shape of the same run-time type with the same contents as +- * this one. ++ * Creates a new shape of the same run-time type with the same contents ++ * as this one. + * + * @return the clone + * +@@ -461,17 +684,261 @@ + return new GeneralPath(this); + } + ++ /** ++ * Helper method - ensure the size of the data arrays, ++ * otherwise, reallocate new ones twice the size ++ */ + private void ensureSize(int size) + { + if (subpath < 0) + throw new IllegalPathStateException("need initial moveto"); +- if (size <= points.length) ++ if (size <= xpoints.length) + return; +- byte[] b = new byte[points.length]; +- System.arraycopy(types, 0, b, 0, index >> 1); ++ byte[] b = new byte[types.length << 1]; ++ System.arraycopy(types, 0, b, 0, index); + types = b; +- float[] f = new float[points.length << 1]; +- System.arraycopy(points, 0, f, 0, index); +- points = f; ++ float[] f = new float[xpoints.length << 1]; ++ System.arraycopy(xpoints, 0, f, 0, index); ++ xpoints = f; ++ f = new float[ypoints.length << 1]; ++ System.arraycopy(ypoints, 0, f, 0, index); ++ ypoints = f; ++ } ++ ++ /** ++ * Helper method - Get the total number of intersections from (x,y) along ++ * a given axis, within a given distance. ++ */ ++ private int getAxisIntersections(double x, double y, boolean useYaxis, ++ double distance) ++ { ++ return (evaluateCrossings(x, y, false, useYaxis, distance)); ++ } ++ ++ /** ++ * Helper method - returns the winding number of a point. ++ */ ++ private int getWindingNumber(double x, double y) ++ { ++ /* Evaluate the crossings from x,y to infinity on the y axis (arbitrary ++ choice). Note that we don't actually use Double.INFINITY, since that's ++ slower, and may cause problems. */ ++ return (evaluateCrossings(x, y, true, true, BIG_VALUE)); ++ } ++ ++ /** ++ * Helper method - evaluates the number of intersections on an axis from ++ * the point (x,y) to the point (x,y+distance) or (x+distance,y). ++ * @param x x coordinate. ++ * @param y y coordinate. ++ * @param neg True if opposite-directed intersections should cancel, ++ * false to sum all intersections. ++ * @param useYaxis Use the Y axis, false uses the X axis. ++ * @param distance Interval from (x,y) on the selected axis to find ++ * intersections. ++ */ ++ private int evaluateCrossings(double x, double y, boolean neg, ++ boolean useYaxis, double distance) ++ { ++ float cx = 0.0f; ++ float cy = 0.0f; ++ float firstx = 0.0f; ++ float firsty = 0.0f; ++ ++ int negative = (neg) ? -1 : 1; ++ double x0; ++ double x1; ++ double x2; ++ double x3; ++ double y0; ++ double y1; ++ double y2; ++ double y3; ++ double[] r = new double[4]; ++ int nRoots; ++ double epsilon = 0.0; ++ int pos = 0; ++ int windingNumber = 0; ++ boolean pathStarted = false; ++ ++ if (index == 0) ++ return (0); ++ if (useYaxis) ++ { ++ float[] swap1; ++ swap1 = ypoints; ++ ypoints = xpoints; ++ xpoints = swap1; ++ double swap2; ++ swap2 = y; ++ y = x; ++ x = swap2; ++ } ++ ++ /* Get a value which is hopefully small but not insignificant relative ++ the path. */ ++ epsilon = ypoints[0] * 1E-9; ++ ++ pos = 0; ++ while (pos < index) ++ { ++ switch (types[pos]) ++ { ++ case PathIterator.SEG_MOVETO: ++ if (pathStarted) // close old path ++ { ++ x0 = cx; ++ y0 = cy; ++ x1 = firstx; ++ y1 = firsty; ++ ++ if (y0 == 0.0) ++ y0 += epsilon; ++ if (y1 == 0.0) ++ y1 += epsilon; ++ if (Line2D.linesIntersect(x0, y0, x1, y1, 0.0, 0.0, distance, ++ 0.0)) ++ windingNumber += (y1 < y0) ? 1 : negative; ++ ++ cx = firstx; ++ cy = firsty; ++ } ++ cx = firstx = xpoints[pos] - (float) x; ++ cy = firsty = ypoints[pos++] - (float) y; ++ pathStarted = true; ++ break; ++ case PathIterator.SEG_CLOSE: ++ x0 = cx; ++ y0 = cy; ++ x1 = firstx; ++ y1 = firsty; ++ ++ if (y0 == 0.0) ++ y0 += epsilon; ++ if (y1 == 0.0) ++ y1 += epsilon; ++ if (Line2D.linesIntersect(x0, y0, x1, y1, 0.0, 0.0, distance, 0.0)) ++ windingNumber += (y1 < y0) ? 1 : negative; ++ ++ cx = firstx; ++ cy = firsty; ++ pos++; ++ pathStarted = false; ++ break; ++ case PathIterator.SEG_LINETO: ++ x0 = cx; ++ y0 = cy; ++ x1 = xpoints[pos] - (float) x; ++ y1 = ypoints[pos++] - (float) y; ++ ++ if (y0 == 0.0) ++ y0 += epsilon; ++ if (y1 == 0.0) ++ y1 += epsilon; ++ if (Line2D.linesIntersect(x0, y0, x1, y1, 0.0, 0.0, distance, 0.0)) ++ windingNumber += (y1 < y0) ? 1 : negative; ++ ++ cx = xpoints[pos - 1] - (float) x; ++ cy = ypoints[pos - 1] - (float) y; ++ break; ++ case PathIterator.SEG_QUADTO: ++ x0 = cx; ++ y0 = cy; ++ x1 = xpoints[pos] - x; ++ y1 = ypoints[pos++] - y; ++ x2 = xpoints[pos] - x; ++ y2 = ypoints[pos++] - y; ++ ++ /* check if curve may intersect X+ axis. */ ++ if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0) ++ && (y0 * y1 <= 0 || y1 * y2 <= 0)) ++ { ++ if (y0 == 0.0) ++ y0 += epsilon; ++ if (y2 == 0.0) ++ y2 += epsilon; ++ ++ r[0] = y0; ++ r[1] = 2 * (y1 - y0); ++ r[2] = (y2 - 2 * y1 + y0); ++ ++ /* degenerate roots (=tangent points) do not ++ contribute to the winding number. */ ++ if ((nRoots = QuadCurve2D.solveQuadratic(r)) == 2) ++ for (int i = 0; i < nRoots; i++) ++ { ++ float t = (float) r[i]; ++ if (t > 0.0f && t < 1.0f) ++ { ++ double crossing = t * t * (x2 - 2 * x1 + x0) ++ + 2 * t * (x1 - x0) + x0; ++ if (crossing >= 0.0 && crossing <= distance) ++ windingNumber += (2 * t * (y2 - 2 * y1 + y0) ++ + 2 * (y1 - y0) < 0) ? 1 : negative; ++ } ++ } ++ } ++ ++ cx = xpoints[pos - 1] - (float) x; ++ cy = ypoints[pos - 1] - (float) y; ++ break; ++ case PathIterator.SEG_CUBICTO: ++ x0 = cx; ++ y0 = cy; ++ x1 = xpoints[pos] - x; ++ y1 = ypoints[pos++] - y; ++ x2 = xpoints[pos] - x; ++ y2 = ypoints[pos++] - y; ++ x3 = xpoints[pos] - x; ++ y3 = ypoints[pos++] - y; ++ ++ /* check if curve may intersect X+ axis. */ ++ if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0 || x3 > 0.0) ++ && (y0 * y1 <= 0 || y1 * y2 <= 0 || y2 * y3 <= 0)) ++ { ++ if (y0 == 0.0) ++ y0 += epsilon; ++ if (y3 == 0.0) ++ y3 += epsilon; ++ ++ r[0] = y0; ++ r[1] = 3 * (y1 - y0); ++ r[2] = 3 * (y2 + y0 - 2 * y1); ++ r[3] = y3 - 3 * y2 + 3 * y1 - y0; ++ ++ if ((nRoots = CubicCurve2D.solveCubic(r)) != 0) ++ for (int i = 0; i < nRoots; i++) ++ { ++ float t = (float) r[i]; ++ if (t > 0.0 && t < 1.0) ++ { ++ double crossing = -(t * t * t) * (x0 - 3 * x1 ++ + 3 * x2 - x3) ++ + 3 * t * t * (x0 - 2 * x1 + x2) ++ + 3 * t * (x1 - x0) + x0; ++ if (crossing >= 0 && crossing <= distance) ++ windingNumber += (3 * t * t * (y3 + 3 * y1 ++ - 3 * y2 - y0) ++ + 6 * t * (y0 - 2 * y1 + y2) ++ + 3 * (y1 - y0) < 0) ? 1 : negative; ++ } ++ } ++ } ++ ++ cx = xpoints[pos - 1] - (float) x; ++ cy = ypoints[pos - 1] - (float) y; ++ break; ++ } ++ } ++ ++ // swap coordinates back ++ if (useYaxis) ++ { ++ float[] swap; ++ swap = ypoints; ++ ypoints = xpoints; ++ xpoints = swap; ++ } ++ return (windingNumber); + } + } // class GeneralPath +Index: java/awt/geom/QuadCurve2D.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/geom/QuadCurve2D.java,v +retrieving revision 1.6 +diff -u -r1.6 QuadCurve2D.java +--- java/awt/geom/QuadCurve2D.java 5 Jan 2004 19:19:29 -0000 1.6 ++++ java/awt/geom/QuadCurve2D.java 6 Sep 2004 16:35:49 -0000 +@@ -1,5 +1,5 @@ + /* QuadCurve2D.java -- represents a parameterized quadratic curve in 2-D space +- Copyright (C) 2002, 2003 Free Software Foundation ++ Copyright (C) 2002, 2003, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package java.awt.geom; + + import java.awt.Rectangle; +@@ -53,12 +52,14 @@ + * @author Eric Blake (ebb9@email.byu.edu) + * @author Graydon Hoare (graydon@redhat.com) + * @author Sascha Brawer (brawer@dandelis.ch) ++ * @author Sven de Marothy (sven@physto.se) + * + * @since 1.2 + */ +-public abstract class QuadCurve2D +- implements Shape, Cloneable ++public abstract class QuadCurve2D implements Shape, Cloneable + { ++ private static final double BIG_VALUE = java.lang.Double.MAX_VALUE / 10.0; ++ + /** + * Constructs a new QuadCurve2D. Typical users will want to + * construct instances of a subclass, such as {@link +@@ -68,67 +69,57 @@ + { + } + +- + /** + * Returns the x coordinate of the curve’s start + * point. + */ + public abstract double getX1(); + +- + /** + * Returns the y coordinate of the curve’s start + * point. + */ + public abstract double getY1(); + +- + /** + * Returns the curve’s start point. + */ + public abstract Point2D getP1(); + +- + /** + * Returns the x coordinate of the curve’s control + * point. + */ + public abstract double getCtrlX(); + +- + /** + * Returns the y coordinate of the curve’s control + * point. + */ + public abstract double getCtrlY(); + +- + /** + * Returns the curve’s control point. + */ + public abstract Point2D getCtrlPt(); + +- + /** + * Returns the x coordinate of the curve’s end + * point. + */ + public abstract double getX2(); + +- + /** + * Returns the y coordinate of the curve’s end + * point. + */ + public abstract double getY2(); + +- + /** + * Returns the curve’s end point. + */ + public abstract Point2D getP2(); + +- + /** + * Changes the curve geometry, separately specifying each coordinate + * value. +@@ -154,7 +145,6 @@ + public abstract void setCurve(double x1, double y1, double cx, double cy, + double x2, double y2); + +- + /** + * Changes the curve geometry, passing coordinate values in an + * array. +@@ -174,12 +164,10 @@ + */ + public void setCurve(double[] coords, int offset) + { +- setCurve(coords[offset++], coords[offset++], +- coords[offset++], coords[offset++], +- coords[offset++], coords[offset++]); ++ setCurve(coords[offset++], coords[offset++], coords[offset++], ++ coords[offset++], coords[offset++], coords[offset++]); + } + +- + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. +@@ -198,11 +186,9 @@ + */ + public void setCurve(Point2D p1, Point2D c, Point2D p2) + { +- setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(), +- p2.getX(), p2.getY()); ++ setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(), p2.getX(), p2.getY()); + } + +- + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. +@@ -223,12 +209,11 @@ + */ + public void setCurve(Point2D[] pts, int offset) + { +- setCurve(pts[offset].getX(), pts[offset].getY(), +- pts[offset + 1].getX(), pts[offset + 1].getY(), +- pts[offset + 2].getX(), pts[offset + 2].getY()); ++ setCurve(pts[offset].getX(), pts[offset].getY(), pts[offset + 1].getX(), ++ pts[offset + 1].getY(), pts[offset + 2].getX(), ++ pts[offset + 2].getY()); + } + +- + /** + * Changes the geometry of the curve to that of another curve. + * +@@ -236,11 +221,10 @@ + */ + public void setCurve(QuadCurve2D c) + { +- setCurve(c.getX1(), c.getY1(), c.getCtrlX(), c.getCtrlY(), +- c.getX2(), c.getY2()); ++ setCurve(c.getX1(), c.getY1(), c.getCtrlX(), c.getCtrlY(), c.getX2(), ++ c.getY2()); + } + +- + /** + * Calculates the squared flatness of a quadratic curve, directly + * specifying each coordinate value. The flatness is the distance of +@@ -267,7 +251,6 @@ + return Line2D.ptSegDistSq(x1, y1, x2, y2, cx, cy); + } + +- + /** + * Calculates the flatness of a quadratic curve, directly specifying + * each coordinate value. The flatness is the distance of the +@@ -294,7 +277,6 @@ + return Line2D.ptSegDist(x1, y1, x2, y2, cx, cy); + } + +- + /** + * Calculates the squared flatness of a quadratic curve, specifying + * the coordinate values in an array. The flatness is the distance +@@ -328,7 +310,6 @@ + coords[offset + 2], coords[offset + 3]); + } + +- + /** + * Calculates the flatness of a quadratic curve, specifying the + * coordinate values in an array. The flatness is the distance of +@@ -362,7 +343,6 @@ + coords[offset + 2], coords[offset + 3]); + } + +- + /** + * Calculates the squared flatness of this curve. The flatness is + * the distance of the control point to the line between start and +@@ -378,12 +358,10 @@ + */ + public double getFlatnessSq() + { +- return Line2D.ptSegDistSq(getX1(), getY1(), +- getX2(), getY2(), +- getCtrlX(), getCtrlY()); ++ return Line2D.ptSegDistSq(getX1(), getY1(), getX2(), getY2(), getCtrlX(), ++ getCtrlY()); + } + +- + /** + * Calculates the flatness of this curve. The flatness is the + * distance of the control point to the line between start and end +@@ -399,12 +377,10 @@ + */ + public double getFlatness() + { +- return Line2D.ptSegDist(getX1(), getY1(), +- getX2(), getY2(), +- getCtrlX(), getCtrlY()); ++ return Line2D.ptSegDist(getX1(), getY1(), getX2(), getY2(), getCtrlX(), ++ getCtrlY()); + } + +- + /** + * Subdivides this curve into two halves. + * +@@ -423,8 +399,11 @@ + public void subdivide(QuadCurve2D left, QuadCurve2D right) + { + // Use empty slots at end to share single array. +- double[] d = new double[] { getX1(), getY1(), getCtrlX(), getCtrlY(), +- getX2(), getY2(), 0, 0, 0, 0 }; ++ double[] d = new double[] ++ { ++ getX1(), getY1(), getCtrlX(), getCtrlY(), getX2(), getY2(), ++ 0, 0, 0, 0 ++ }; + subdivide(d, 0, d, 0, d, 4); + if (left != null) + left.setCurve(d, 0); +@@ -432,7 +411,6 @@ + right.setCurve(d, 4); + } + +- + /** + * Subdivides a quadratic curve into two halves. + * +@@ -456,7 +434,6 @@ + src.subdivide(left, right); + } + +- + /** + * Subdivides a quadratic curve into two halves, passing all + * coordinates in an array. +@@ -500,11 +477,15 @@ + * index where the start point’s x coordinate will be + * stored. + */ +- public static void subdivide(double[] src, int srcOff, +- double[] left, int leftOff, +- double[] right, int rightOff) ++ public static void subdivide(double[] src, int srcOff, double[] left, ++ int leftOff, double[] right, int rightOff) + { +- double x1, y1, xc, yc, x2, y2; ++ double x1; ++ double y1; ++ double xc; ++ double yc; ++ double x2; ++ double y2; + + x1 = src[srcOff]; + y1 = src[srcOff + 1]; +@@ -514,16 +495,16 @@ + y2 = src[srcOff + 5]; + + if (left != null) +- { +- left[leftOff] = x1; +- left[leftOff + 1] = y1; +- } ++ { ++ left[leftOff] = x1; ++ left[leftOff + 1] = y1; ++ } + + if (right != null) +- { +- right[rightOff + 4] = x2; +- right[rightOff + 5] = y2; +- } ++ { ++ right[rightOff + 4] = x2; ++ right[rightOff + 5] = y2; ++ } + + x1 = (x1 + xc) / 2; + x2 = (xc + x2) / 2; +@@ -533,23 +514,22 @@ + yc = (y1 + y2) / 2; + + if (left != null) +- { +- left[leftOff + 2] = x1; +- left[leftOff + 3] = y1; +- left[leftOff + 4] = xc; +- left[leftOff + 5] = yc; +- } ++ { ++ left[leftOff + 2] = x1; ++ left[leftOff + 3] = y1; ++ left[leftOff + 4] = xc; ++ left[leftOff + 5] = yc; ++ } + + if (right != null) +- { +- right[rightOff] = xc; +- right[rightOff + 1] = yc; +- right[rightOff + 2] = x2; +- right[rightOff + 3] = y2; +- } ++ { ++ right[rightOff] = xc; ++ right[rightOff + 1] = yc; ++ right[rightOff + 2] = x2; ++ right[rightOff + 3] = y2; ++ } + } + +- + /** + * Finds the non-complex roots of a quadratic equation, placing the + * results into the same array as the equation coefficients. The +@@ -594,7 +574,6 @@ + return solveQuadratic(eqn, eqn); + } + +- + /** + * Finds the non-complex roots of a quadratic equation. The + * following equation is being solved: +@@ -649,8 +628,10 @@ + // The Java implementation is very similar to the GSL code, but + // not a strict one-to-one copy. For example, GSL would sort the + // result. +- +- double a, b, c, disc; ++ double a; ++ double b; ++ double c; ++ double disc; + + c = eqn[0]; + b = eqn[1]; +@@ -661,13 +642,13 @@ + // wouldn't return -1 for constant functions, and 2 instead of 1 + // for linear functions. + if (a == 0) +- { +- if (b == 0) +- return -1; +- +- res[0] = -c / b; +- return 1; +- } ++ { ++ if (b == 0) ++ return -1; ++ ++ res[0] = -c / b; ++ return 1; ++ } + + disc = b * b - 4 * a * c; + +@@ -675,96 +656,149 @@ + return 0; + + if (disc == 0) +- { +- // The GNU Scientific Library returns two identical results here. +- // We just return one. +- res[0] = -0.5 * b / a ; +- return 1; +- } ++ { ++ // The GNU Scientific Library returns two identical results here. ++ // We just return one. ++ res[0] = -0.5 * b / a; ++ return 1; ++ } + + // disc > 0 + if (b == 0) +- { +- double r; ++ { ++ double r; + +- r = Math.abs(0.5 * Math.sqrt(disc) / a); +- res[0] = -r; +- res[1] = r; +- } ++ r = Math.abs(0.5 * Math.sqrt(disc) / a); ++ res[0] = -r; ++ res[1] = r; ++ } + else +- { +- double sgnb, temp; +- +- sgnb = (b > 0 ? 1 : -1); +- temp = -0.5 * (b + sgnb * Math.sqrt(disc)); +- +- // The GNU Scientific Library sorts the result here. We don't. +- res[0] = temp / a; +- res[1] = c / temp; +- } ++ { ++ double sgnb; ++ double temp; ++ ++ sgnb = (b > 0 ? 1 : -1); ++ temp = -0.5 * (b + sgnb * Math.sqrt(disc)); ++ ++ // The GNU Scientific Library sorts the result here. We don't. ++ res[0] = temp / a; ++ res[1] = c / temp; ++ } + return 2; + } + +- + /** +- * Determines whether a point lies inside the area that is bounded ++ * Determines whether a point is inside the area bounded + * by the curve and the straight line connecting its end points. + * + *

    A drawing of the area spanned by the curve + * + *

    The above drawing illustrates in which area points are +- * considered “contained” in a QuadCurve2D. ++ * considered “inside” a QuadCurve2D. + */ + public boolean contains(double x, double y) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().contains(x, y)) ++ return false; + ++ return ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0); ++ } + + /** +- * Determines whether a point lies inside the area that is bounded ++ * Determines whether a point is inside the area bounded + * by the curve and the straight line connecting its end points. + * + *

    A drawing of the area spanned by the curve + * + *

    The above drawing illustrates in which area points are +- * considered “contained” in a QuadCurve2D. ++ * considered “inside” a QuadCurve2D. + */ + public boolean contains(Point2D p) + { + return contains(p.getX(), p.getY()); + } + +- ++ /** ++ * Determines whether any part of a rectangle is inside the area bounded ++ * by the curve and the straight line connecting its end points. ++ * ++ *

    A drawing of the area spanned by the curve ++ * ++ *

    The above drawing illustrates in which area points are ++ * considered “inside” in a CubicCurve2D. ++ */ + public boolean intersects(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().contains(x, y, w, h)) ++ return false; ++ ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, true, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, true, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, false, h) != 0 /* right */ ++ || getAxisIntersections(x, y, false, h) != 0) /* left */ ++ return true; ++ ++ /* No intersections, is any point inside? */ ++ if ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0) ++ return true; + ++ return false; ++ } + ++ /** ++ * Determines whether any part of a Rectangle2D is inside the area bounded ++ * by the curve and the straight line connecting its end points. ++ * @see #intersects(double, double, double, double) ++ */ + public boolean intersects(Rectangle2D r) + { + return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +- ++ /** ++ * Determines whether a rectangle is entirely inside the area bounded ++ * by the curve and the straight line connecting its end points. ++ * ++ *

    A drawing of the area spanned by the curve ++ * ++ *

    The above drawing illustrates in which area points are ++ * considered “inside” a QuadCurve2D. ++ * @see #contains(double, double) ++ */ + public boolean contains(double x, double y, double w, double h) + { +- // XXX Implement. +- throw new Error("not implemented"); +- } ++ if (! getBounds2D().intersects(x, y, w, h)) ++ return false; ++ ++ /* Does any edge intersect? */ ++ if (getAxisIntersections(x, y, true, w) != 0 /* top */ ++ || getAxisIntersections(x, y + h, true, w) != 0 /* bottom */ ++ || getAxisIntersections(x + w, y, false, h) != 0 /* right */ ++ || getAxisIntersections(x, y, false, h) != 0) /* left */ ++ return false; + ++ /* No intersections, is any point inside? */ ++ if ((getAxisIntersections(x, y, true, BIG_VALUE) & 1) != 0) ++ return true; ++ ++ return false; ++ } + ++ /** ++ * Determines whether a Rectangle2D is entirely inside the area that is ++ * bounded by the curve and the straight line connecting its end points. ++ * @see #contains(double, double, double, double) ++ */ + public boolean contains(Rectangle2D r) + { + return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +- + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control point. As the illustration +@@ -780,97 +814,85 @@ + return getBounds2D().getBounds(); + } + +- + public PathIterator getPathIterator(final AffineTransform at) + { + return new PathIterator() +- { +- /** Current coordinate. */ +- private int current = 0; +- +- +- public int getWindingRule() +- { +- return WIND_NON_ZERO; +- } +- +- +- public boolean isDone() +- { +- return current >= 2; +- } +- +- +- public void next() +- { +- current++; +- } +- +- +- public int currentSegment(float[] coords) + { +- int result; +- switch (current) +- { +- case 0: +- coords[0] = (float) getX1(); +- coords[1] = (float) getY1(); +- result = SEG_MOVETO; +- break; +- +- case 1: +- coords[0] = (float) getCtrlX(); +- coords[1] = (float) getCtrlY(); +- coords[2] = (float) getX2(); +- coords[3] = (float) getY2(); +- result = SEG_QUADTO; +- break; +- +- default: +- throw new NoSuchElementException("quad iterator out of bounds"); +- } +- if (at != null) +- at.transform(coords, 0, coords, 0, 2); +- return result; +- } +- ++ /** Current coordinate. */ ++ private int current = 0; + +- public int currentSegment(double[] coords) +- { +- int result; +- switch (current) +- { +- case 0: +- coords[0] = getX1(); +- coords[1] = getY1(); +- result = SEG_MOVETO; +- break; +- +- case 1: +- coords[0] = getCtrlX(); +- coords[1] = getCtrlY(); +- coords[2] = getX2(); +- coords[3] = getY2(); +- result = SEG_QUADTO; +- break; +- +- default: +- throw new NoSuchElementException("quad iterator out of bounds"); +- } +- if (at != null) +- at.transform(coords, 0, coords, 0, 2); +- return result; +- } +- }; ++ public int getWindingRule() ++ { ++ return WIND_NON_ZERO; ++ } ++ ++ public boolean isDone() ++ { ++ return current >= 2; ++ } ++ ++ public void next() ++ { ++ current++; ++ } ++ ++ public int currentSegment(float[] coords) ++ { ++ int result; ++ switch (current) ++ { ++ case 0: ++ coords[0] = (float) getX1(); ++ coords[1] = (float) getY1(); ++ result = SEG_MOVETO; ++ break; ++ case 1: ++ coords[0] = (float) getCtrlX(); ++ coords[1] = (float) getCtrlY(); ++ coords[2] = (float) getX2(); ++ coords[3] = (float) getY2(); ++ result = SEG_QUADTO; ++ break; ++ default: ++ throw new NoSuchElementException("quad iterator out of bounds"); ++ } ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 2); ++ return result; ++ } ++ ++ public int currentSegment(double[] coords) ++ { ++ int result; ++ switch (current) ++ { ++ case 0: ++ coords[0] = getX1(); ++ coords[1] = getY1(); ++ result = SEG_MOVETO; ++ break; ++ case 1: ++ coords[0] = getCtrlX(); ++ coords[1] = getCtrlY(); ++ coords[2] = getX2(); ++ coords[3] = getY2(); ++ result = SEG_QUADTO; ++ break; ++ default: ++ throw new NoSuchElementException("quad iterator out of bounds"); ++ } ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 2); ++ return result; ++ } ++ }; + } + +- + public PathIterator getPathIterator(AffineTransform at, double flatness) + { + return new FlatteningPathIterator(getPathIterator(at), flatness); + } + +- + /** + * Creates a new curve with the same contents as this one. + * +@@ -879,15 +901,106 @@ + public Object clone() + { + try +- { +- return super.clone(); +- } ++ { ++ return super.clone(); ++ } + catch (CloneNotSupportedException e) +- { +- throw (Error) new InternalError().initCause(e); // Impossible +- } ++ { ++ throw (Error) new InternalError().initCause(e); // Impossible ++ } + } + ++ /** ++ * Helper method used by contains() and intersects() methods ++ * Return the number of curve/line intersections on a given axis ++ * extending from a certain point. useYaxis is true for using the Y axis, ++ * @param x x coordinate of the origin point ++ * @param y y coordinate of the origin point ++ * @param useYaxis axis to follow, if true the positive Y axis is used, ++ * false uses the positive X axis. ++ * ++ * This is an implementation of the line-crossings algorithm, ++ * Detailed in an article on Eric Haines' page: ++ * http://www.acm.org/tog/editors/erich/ptinpoly/ ++ */ ++ private int getAxisIntersections(double x, double y, boolean useYaxis, ++ double distance) ++ { ++ int nCrossings = 0; ++ double a0; ++ double a1; ++ double a2; ++ double b0; ++ double b1; ++ double b2; ++ double[] r = new double[3]; ++ int nRoots; ++ ++ a0 = a2 = 0.0; ++ ++ if (useYaxis) ++ { ++ a0 = getY1() - y; ++ a1 = getCtrlY() - y; ++ a2 = getY2() - y; ++ b0 = getX1() - x; ++ b1 = getCtrlX() - x; ++ b2 = getX2() - x; ++ } ++ else ++ { ++ a0 = getX1() - x; ++ a1 = getCtrlX() - x; ++ a2 = getX2() - x; ++ b0 = getY1() - y; ++ b1 = getCtrlY() - y; ++ b2 = getY2() - y; ++ } ++ ++ /* If the axis intersects a start/endpoint, shift it up by some small ++ amount to guarantee the line is 'inside' ++ If this is not done,bad behaviour may result for points on that axis. */ ++ if (a0 == 0.0 || a2 == 0.0) ++ { ++ double small = getFlatness() * (1E-10); ++ if (a0 == 0.0) ++ a0 += small; ++ ++ if (a2 == 0.0) ++ a2 += small; ++ } ++ ++ r[0] = a0; ++ r[1] = 2 * (a1 - a0); ++ r[2] = (a2 - 2 * a1 + a0); ++ ++ nRoots = solveQuadratic(r); ++ for (int i = 0; i < nRoots; i++) ++ { ++ double t = r[i]; ++ if (t >= 0.0 && t <= 1.0) ++ { ++ double crossing = t * t * (b2 - 2 * b1 + b0) + 2 * t * (b1 - b0) ++ + b0; ++ /* single root is always doubly degenerate in quads */ ++ if (crossing > 0 && crossing < distance) ++ nCrossings += (nRoots == 1) ? 2 : 1; ++ } ++ } ++ ++ if (useYaxis) ++ { ++ if (Line2D.linesIntersect(b0, a0, b2, a2, 0.0, 0.0, distance, 0.0)) ++ nCrossings++; ++ } ++ else ++ { ++ if (Line2D.linesIntersect(a0, b0, a2, b2, 0.0, 0.0, 0.0, distance)) ++ nCrossings++; ++ } ++ ++ return (nCrossings); ++ } + + /** + * A two-dimensional curve that is parameterized with a quadratic +@@ -899,45 +1012,38 @@ + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) + */ +- public static class Double +- extends QuadCurve2D ++ public static class Double extends QuadCurve2D + { + /** + * The x coordinate of the curve’s start point. + */ + public double x1; + +- + /** + * The y coordinate of the curve’s start point. + */ + public double y1; + +- + /** + * The x coordinate of the curve’s control point. + */ + public double ctrlx; + +- + /** + * The y coordinate of the curve’s control point. + */ + public double ctrly; + +- + /** + * The x coordinate of the curve’s end point. + */ + public double x2; + +- + /** + * The y coordinate of the curve’s end point. + */ + public double y2; + +- + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in double-precision floating-point format. All points are +@@ -947,7 +1053,6 @@ + { + } + +- + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in double-precision floating-point format, specifying the +@@ -971,8 +1076,8 @@ + * @param y2 the y coordinate of the curve’s end + * point. + */ +- public Double(double x1, double y1, double cx, double cy, +- double x2, double y2) ++ public Double(double x1, double y1, double cx, double cy, double x2, ++ double y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -982,7 +1087,6 @@ + this.y2 = y2; + } + +- + /** + * Returns the x coordinate of the curve’s start + * point. +@@ -992,7 +1096,6 @@ + return x1; + } + +- + /** + * Returns the y coordinate of the curve’s start + * point. +@@ -1002,7 +1105,6 @@ + return y1; + } + +- + /** + * Returns the curve’s start point. + */ +@@ -1011,7 +1113,6 @@ + return new Point2D.Double(x1, y1); + } + +- + /** + * Returns the x coordinate of the curve’s control + * point. +@@ -1021,7 +1122,6 @@ + return ctrlx; + } + +- + /** + * Returns the y coordinate of the curve’s control + * point. +@@ -1031,7 +1131,6 @@ + return ctrly; + } + +- + /** + * Returns the curve’s control point. + */ +@@ -1040,7 +1139,6 @@ + return new Point2D.Double(ctrlx, ctrly); + } + +- + /** + * Returns the x coordinate of the curve’s end + * point. +@@ -1050,7 +1148,6 @@ + return x2; + } + +- + /** + * Returns the y coordinate of the curve’s end + * point. +@@ -1060,7 +1157,6 @@ + return y2; + } + +- + /** + * Returns the curve’s end point. + */ +@@ -1069,7 +1165,6 @@ + return new Point2D.Double(x2, y2); + } + +- + /** + * Changes the geometry of the curve. + * +@@ -1102,7 +1197,6 @@ + this.y2 = y2; + } + +- + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control point. As the +@@ -1123,7 +1217,6 @@ + } + } + +- + /** + * A two-dimensional curve that is parameterized with a quadratic + * function and stores coordinate values in single-precision +@@ -1134,45 +1227,38 @@ + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) + */ +- public static class Float +- extends QuadCurve2D ++ public static class Float extends QuadCurve2D + { + /** + * The x coordinate of the curve’s start point. + */ + public float x1; + +- + /** + * The y coordinate of the curve’s start point. + */ + public float y1; + +- + /** + * The x coordinate of the curve’s control point. + */ + public float ctrlx; + +- + /** + * The y coordinate of the curve’s control point. + */ + public float ctrly; + +- + /** + * The x coordinate of the curve’s end point. + */ + public float x2; + +- + /** + * The y coordinate of the curve’s end point. + */ + public float y2; + +- + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in single-precision floating-point format. All points are +@@ -1182,7 +1268,6 @@ + { + } + +- + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in single-precision floating-point format, specifying the +@@ -1206,8 +1291,7 @@ + * @param y2 the y coordinate of the curve’s end + * point. + */ +- public Float(float x1, float y1, float cx, float cy, +- float x2, float y2) ++ public Float(float x1, float y1, float cx, float cy, float x2, float y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -1217,7 +1301,6 @@ + this.y2 = y2; + } + +- + /** + * Returns the x coordinate of the curve’s start + * point. +@@ -1227,7 +1310,6 @@ + return x1; + } + +- + /** + * Returns the y coordinate of the curve’s start + * point. +@@ -1237,7 +1319,6 @@ + return y1; + } + +- + /** + * Returns the curve’s start point. + */ +@@ -1246,7 +1327,6 @@ + return new Point2D.Float(x1, y1); + } + +- + /** + * Returns the x coordinate of the curve’s control + * point. +@@ -1256,7 +1336,6 @@ + return ctrlx; + } + +- + /** + * Returns the y coordinate of the curve’s control + * point. +@@ -1266,7 +1345,6 @@ + return ctrly; + } + +- + /** + * Returns the curve’s control point. + */ +@@ -1275,7 +1353,6 @@ + return new Point2D.Float(ctrlx, ctrly); + } + +- + /** + * Returns the x coordinate of the curve’s end + * point. +@@ -1285,7 +1362,6 @@ + return x2; + } + +- + /** + * Returns the y coordinate of the curve’s end + * point. +@@ -1295,7 +1371,6 @@ + return y2; + } + +- + /** + * Returns the curve’s end point. + */ +@@ -1304,7 +1379,6 @@ + return new Point2D.Float(x2, y2); + } + +- + /** + * Changes the geometry of the curve, specifying coordinate values + * as double-precision floating-point numbers. +@@ -1338,7 +1412,6 @@ + this.y2 = (float) y2; + } + +- + /** + * Changes the geometry of the curve, specifying coordinate values + * as single-precision floating-point numbers. +@@ -1361,8 +1434,8 @@ + * @param y2 the y coordinate of the curve’s new + * end point. + */ +- public void setCurve(float x1, float y1, float cx, float cy, +- float x2, float y2) ++ public void setCurve(float x1, float y1, float cx, float cy, float x2, ++ float y2) + { + this.x1 = x1; + this.y1 = y1; +@@ -1372,7 +1445,6 @@ + this.y2 = y2; + } + +- + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control point. As the +Index: java/awt/geom/RoundRectangle2D.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/geom/RoundRectangle2D.java,v +retrieving revision 1.5 +diff -u -r1.5 RoundRectangle2D.java +--- java/awt/geom/RoundRectangle2D.java 26 Sep 2003 15:14:21 -0000 1.5 ++++ java/awt/geom/RoundRectangle2D.java 6 Sep 2004 16:35:49 -0000 +@@ -1,5 +1,5 @@ + /* RoundRectangle2D.java -- represents a rectangle with rounded corners +- Copyright (C) 2000, 2002, 2003 Free Software Foundation ++ Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -39,6 +39,7 @@ + + import java.util.NoSuchElementException; + ++ + /** This class implements a rectangle with rounded corners. + * @author Tom Tromey + * @date December 3, 2000 +@@ -60,12 +61,12 @@ + * @param arcHeight The arc height + */ + public abstract void setRoundRect(double x, double y, double w, double h, +- double arcWidth, double arcHeight); ++ double arcWidth, double arcHeight); + + /** Create a RoundRectangle2D. This is protected because this class + * is abstract and cannot be instantiated. + */ +- protected RoundRectangle2D() ++ protected RoundRectangle2D() + { + } + +@@ -87,8 +88,11 @@ + // Now check to see if the point is in range of an arc. + double dy = Math.min(Math.abs(my - y), Math.abs(my + mh - y)); + double dx = Math.min(Math.abs(mx - x), Math.abs(mx + mw - x)); +- double aw = getArcWidth(); +- double ah = getArcHeight(); ++ ++ // The arc dimensions are that of the corresponding ellipse ++ // thus a 90 degree segment is half of that. ++ double aw = getArcWidth() / 2.0; ++ double ah = getArcHeight() / 2.0; + if (dx > aw || dy > ah) + return true; + +@@ -112,8 +116,8 @@ + { + // We have to check all four points here (for ordinary rectangles + // we can just check opposing corners). +- return (contains(x, y) && contains(x + w, h) +- && contains(x, y + h) && contains(x + w, y + h)); ++ return (contains(x, y) && contains(x, y + h) && contains(x + w, y + h) ++ && contains(x + w, y)); + } + + /** Return a new path iterator which iterates over this rectangle. +@@ -128,154 +132,161 @@ + final double arcwidth = getArcWidth(); + final double archeight = getArcHeight(); + return new PathIterator() +- { +- /** We iterate clockwise around the rectangle, starting in the +- * upper left. This variable tracks our current point, which +- * can be on either side of a given corner. */ +- private int current = 0; +- +- /** Child path iterator, used for corners. */ +- private PathIterator corner; +- +- /** This is used when rendering the corners. We re-use the arc +- * for each corner. */ +- private Arc2D arc = new Arc2D.Double(); +- +- /** Temporary array used by getPoint. */ +- private double[] temp = new double[2]; +- +- public int getWindingRule() +- { +- return WIND_NON_ZERO; +- } +- +- public boolean isDone() +- { +- return current > 9; +- } +- +- private void getPoint(int val) +- { +- switch (val) +- { +- case 0: +- case 8: +- temp[0] = minx; +- temp[1] = miny + archeight; +- break; +- case 1: +- temp[0] = minx + arcwidth; +- temp[1] = miny; +- break; +- case 2: +- temp[0] = maxx - arcwidth; +- temp[1] = maxy; +- break; +- case 3: +- temp[0] = maxx; +- temp[1] = miny + archeight; +- break; +- case 4: +- temp[0] = maxx; +- temp[1] = maxy - archeight; +- break; +- case 5: +- temp[0] = maxx - arcwidth; +- temp[1] = maxy; +- break; +- case 6: +- temp[0] = minx + arcwidth; +- temp[1] = maxy; +- break; +- case 7: +- temp[0] = minx; +- temp[1] = maxy - archeight; +- break; +- } +- } +- +- public void next() +- { +- if (current >= 8) +- ++current; +- else if (corner != null) +- { +- // We're iterating through the corner. Work on the child +- // iterator; if it finishes, reset and move to the next +- // point along the rectangle. +- corner.next(); +- if (corner.isDone()) +- { +- corner = null; +- ++current; +- } +- } +- else +- { +- // Make an arc between this point on the rectangle and +- // the next one, and then iterate over this arc. +- getPoint(current); +- double x1 = temp[0]; +- double y1 = temp[1]; +- getPoint(current + 1); +- arc.setFrameFromDiagonal(x1, y1, temp[0], temp[1]); +- arc.setAngles(x1, y1, temp[0], temp[1]); +- corner = arc.getPathIterator(at); +- } +- } +- +- public int currentSegment(float[] coords) +- { +- if (corner != null) +- { +- int r = corner.currentSegment(coords); +- if (r == SEG_MOVETO) +- r = SEG_LINETO; +- return r; +- } +- +- if (current < 9) +- { +- getPoint(current); +- coords[0] = (float) temp[0]; +- coords[1] = (float) temp[1]; +- } +- else if (current == 9) +- return SEG_CLOSE; +- else +- throw new NoSuchElementException("rect iterator out of bounds"); +- +- if (at != null) +- at.transform(coords, 0, coords, 0, 1); +- return current == 0 ? SEG_MOVETO : SEG_LINETO; +- } +- +- public int currentSegment(double[] coords) + { +- if (corner != null) +- { +- int r = corner.currentSegment(coords); +- if (r == SEG_MOVETO) +- r = SEG_LINETO; +- return r; +- } +- +- if (current < 9) +- { +- getPoint(current); +- coords[0] = temp[0]; +- coords[1] = temp[1]; +- } +- else if (current == 9) +- return SEG_CLOSE; +- else +- throw new NoSuchElementException("rect iterator out of bounds"); +- +- if (at != null) +- at.transform(coords, 0, coords, 0, 1); +- return current == 0 ? SEG_MOVETO : SEG_LINETO; +- } +- }; ++ /** We iterate counterclockwise around the rectangle, starting in the ++ * upper right. This variable tracks our current point, which ++ * can be on either side of a given corner. */ ++ private int current = 0; ++ ++ /** Child path iterator, used for corners. */ ++ private PathIterator corner; ++ ++ /** This is used when rendering the corners. We re-use the arc ++ * for each corner. */ ++ private Arc2D arc = new Arc2D.Double(); ++ ++ /** Temporary array used by getPoint. */ ++ private double[] temp = new double[2]; ++ ++ public int getWindingRule() ++ { ++ return WIND_NON_ZERO; ++ } ++ ++ public boolean isDone() ++ { ++ return current > 9; ++ } ++ ++ private void getPoint(int val) ++ { ++ switch (val) ++ { ++ case 0: ++ case 8: ++ temp[0] = maxx; ++ temp[1] = miny + archeight; ++ break; ++ case 7: ++ temp[0] = maxx; ++ temp[1] = maxy - archeight; ++ break; ++ case 6: ++ temp[0] = maxx - arcwidth; ++ temp[1] = maxy; ++ break; ++ case 5: ++ temp[0] = minx + arcwidth; ++ temp[1] = maxy; ++ break; ++ case 4: ++ temp[0] = minx; ++ temp[1] = maxy - archeight; ++ break; ++ case 3: ++ temp[0] = minx; ++ temp[1] = miny + archeight; ++ break; ++ case 2: ++ temp[0] = minx + arcwidth; ++ temp[1] = miny; ++ break; ++ case 1: ++ temp[0] = maxx - arcwidth; ++ temp[1] = miny; ++ break; ++ } ++ } ++ ++ public void next() ++ { ++ if (current >= 8) ++ ++current; ++ else if (corner != null) ++ { ++ // We're iterating through the corner. Work on the child ++ // iterator; if it finishes, reset and move to the next ++ // point along the rectangle. ++ corner.next(); ++ if (corner.isDone()) ++ { ++ corner = null; ++ ++current; ++ } ++ } ++ else ++ { ++ // Make an arc between this point on the rectangle and ++ // the next one, and then iterate over this arc. ++ getPoint(current); ++ double x1 = temp[0]; ++ double y1 = temp[1]; ++ getPoint(current + 1); ++ Rectangle2D.Double r = new Rectangle2D.Double(Math.min(x1, ++ temp[0]), ++ Math.min(y1, ++ temp[1]), ++ Math.abs(x1 ++ - temp[0]), ++ Math.abs(y1 ++ - temp[1])); ++ arc.setArc(r, (current >> 1) * 90.0, 90.0, Arc2D.OPEN); ++ corner = arc.getPathIterator(at); ++ } ++ } ++ ++ public int currentSegment(float[] coords) ++ { ++ if (corner != null) ++ { ++ int r = corner.currentSegment(coords); ++ if (r == SEG_MOVETO) ++ r = SEG_LINETO; ++ return r; ++ } ++ ++ if (current < 9) ++ { ++ getPoint(current); ++ coords[0] = (float) temp[0]; ++ coords[1] = (float) temp[1]; ++ } ++ else if (current == 9) ++ return SEG_CLOSE; ++ else ++ throw new NoSuchElementException("rect iterator out of bounds"); ++ ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 1); ++ return current == 0 ? SEG_MOVETO : SEG_LINETO; ++ } ++ ++ public int currentSegment(double[] coords) ++ { ++ if (corner != null) ++ { ++ int r = corner.currentSegment(coords); ++ if (r == SEG_MOVETO) ++ r = SEG_LINETO; ++ return r; ++ } ++ ++ if (current < 9) ++ { ++ getPoint(current); ++ coords[0] = temp[0]; ++ coords[1] = temp[1]; ++ } ++ else if (current == 9) ++ return SEG_CLOSE; ++ else ++ throw new NoSuchElementException("rect iterator out of bounds"); ++ ++ if (at != null) ++ at.transform(coords, 0, coords, 0, 1); ++ return current == 0 ? SEG_MOVETO : SEG_LINETO; ++ } ++ }; + } + + /** Return true if the given rectangle intersects this shape. +@@ -286,14 +297,9 @@ + */ + public boolean intersects(double x, double y, double w, double h) + { +- // Here we can use the same code we use for an ordinary rectangle. +- double mx = getX(); +- double mw = getWidth(); +- if (x < mx || x >= mx + mw || x + w < mx || x + w >= mx + mw) +- return false; +- double my = getY(); +- double mh = getHeight(); +- return y >= my && y < my + mh && y + h >= my && y + h < my + mh; ++ // Check if any corner is within the rectangle ++ return (contains(x, y) || contains(x, y + h) || contains(x + w, y + h) ++ || contains(x + w, y)); + } + + /** Set the boundary of this round rectangle. +@@ -315,7 +321,7 @@ + public void setRoundRect(RoundRectangle2D rr) + { + setRoundRect(rr.getX(), rr.getY(), rr.getWidth(), rr.getHeight(), +- rr.getArcWidth(), rr.getArcHeight()); ++ rr.getArcWidth(), rr.getArcHeight()); + } + + /** A subclass of RoundRectangle which keeps its parameters as +@@ -353,8 +359,8 @@ + * @param arcWidth The arc width + * @param arcHeight The arc height + */ +- public Double(double x, double y, double w, double h, +- double arcWidth, double arcHeight) ++ public Double(double x, double y, double w, double h, double arcWidth, ++ double arcHeight) + { + this.x = x; + this.y = y; +@@ -405,7 +411,7 @@ + } + + public void setRoundRect(double x, double y, double w, double h, +- double arcWidth, double arcHeight) ++ double arcWidth, double arcHeight) + { + this.x = x; + this.y = y; +@@ -451,8 +457,8 @@ + * @param arcWidth The arc width + * @param arcHeight The arc height + */ +- public Float(float x, float y, float w, float h, +- float arcWidth, float arcHeight) ++ public Float(float x, float y, float w, float h, float arcWidth, ++ float arcHeight) + { + this.x = x; + this.y = y; +@@ -503,7 +509,7 @@ + } + + public void setRoundRect(float x, float y, float w, float h, +- float arcWidth, float arcHeight) ++ float arcWidth, float arcHeight) + { + this.x = x; + this.y = y; +@@ -514,7 +520,7 @@ + } + + public void setRoundRect(double x, double y, double w, double h, +- double arcWidth, double arcHeight) ++ double arcWidth, double arcHeight) + { + this.x = (float) x; + this.y = (float) y; +Index: java/awt/im/InputContext.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/im/InputContext.java,v +retrieving revision 1.3 +diff -u -r1.3 InputContext.java +--- java/awt/im/InputContext.java 11 Jul 2003 18:27:54 -0000 1.3 ++++ java/awt/im/InputContext.java 6 Sep 2004 16:35:49 -0000 +@@ -86,22 +86,22 @@ + private static final ArrayList descriptors = new ArrayList(); + static + { +- Enumeration enum; ++ Enumeration e; + try + { +- enum = ClassLoader.getSystemResources ++ e = ClassLoader.getSystemResources + ("META_INF/services/java.awt.im.spi.InputMethodDescriptor"); + } + catch (IOException ex) + { + // XXX Should we do something else? +- enum = EmptyEnumeration.getInstance(); ++ e = EmptyEnumeration.getInstance(); + } +- while (enum.hasMoreElements()) ++ while (e.hasMoreElements()) + { +- URL url = (URL) enum.nextElement(); +- BufferedReader in; +- String line; ++ URL url = (URL) e.nextElement(); ++ BufferedReader in = null; ++ String line = null; + try + { + in = new BufferedReader +@@ -125,7 +125,7 @@ + } + line = in.readLine().trim(); + } +- catch (IOException e) ++ catch (IOException ex) + { + continue outer; + } +Index: java/awt/image/AffineTransformOp.java +=================================================================== +RCS file: java/awt/image/AffineTransformOp.java +diff -N java/awt/image/AffineTransformOp.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/AffineTransformOp.java 6 Sep 2004 16:35:50 -0000 +@@ -0,0 +1,264 @@ ++/* AffineTransformOp.java -- This class performs affine ++ * transformation between two images or rasters in 2 ++ * dimensions. Copyright (C) 2004 Free Software Foundation ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.awt.image; ++ ++import java.awt.*; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.geom.*; ++ ++ ++/** ++ * This class performs affine transformation between two images or ++ * rasters in 2 dimensions. ++ * ++ * @author Olga Rodimina ++ */ ++ ++public class AffineTransformOp implements BufferedImageOp, RasterOp ++{ ++ public static final int TYPE_BILINEAR = 0; ++ public static final int TYPE_NEAREST_NEIGHBOR = 1; ++ ++ private AffineTransform transform; ++ private RenderingHints hints; ++ ++ /** ++ * Construct AffineTransformOp with the given xform and interpolationType. ++ * Interpolation type can be either TYPE_BILINEAR or TYPE_NEAREST_NEIGHBOR. ++ * ++ * @param xform AffineTransform that will applied to the source image ++ * @param interpolationType type of interpolation used ++ */ ++ public AffineTransformOp (AffineTransform xform, int interpolationType) ++ { ++ this.transform = xform; ++ ++ if (interpolationType == 0) ++ hints = new RenderingHints (RenderingHints.KEY_INTERPOLATION, ++ RenderingHints.VALUE_INTERPOLATION_BILINEAR); ++ ++ else ++ hints = new RenderingHints (RenderingHints.KEY_INTERPOLATION, ++ RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); ++ ++ } ++ ++ /** ++ * Construct AffineTransformOp with the given xform and rendering hints. ++ * ++ * @param xform AffineTransform that will applied to the source image ++ * @param hints rendering hints that will be used during transformation ++ */ ++ public AffineTransformOp (AffineTransform xform, RenderingHints hints) ++ { ++ this.transform = xform; ++ this.hints = hints; ++ } ++ ++ /** ++ * Creates empty BufferedImage with the size equal to that of the ++ * transformed image and correct number of bands. The newly created ++ * image is created with the specified ColorModel. ++ * If the ColorModel is equal to null, then image is created ++ * with the ColorModel of the source image. ++ * ++ * @param src source image ++ * @param destCM color model for the destination image ++ * @return new compatible destination image ++ */ ++ public BufferedImage createCompatibleDestImage (BufferedImage src, ++ ColorModel destCM) ++ { ++ ++ // if destCm is not specified, use color model of the source image ++ ++ if (destCM == null) ++ destCM = src.getColorModel (); ++ ++ return new BufferedImage (destCM, ++ createCompatibleDestRaster (src.getRaster ()), ++ src.isAlphaPremultiplied (), ++ null); ++ ++ } ++ ++ /** ++ * Creates empty WritableRaster with the size equal to the transformed ++ * source raster and correct number of bands ++ * ++ * @param src source raster ++ * @throws RasterFormatException if resulting width or height of raster is 0 ++ * @return new compatible raster ++ */ ++ public WritableRaster createCompatibleDestRaster (Raster src) ++ { ++ Rectangle rect = (Rectangle) getBounds2D (src); ++ ++ // throw RasterFormatException if resulting width or height of the ++ // transformed raster is 0 ++ ++ if (rect.getWidth () == 0 || rect.getHeight () == 0) ++ throw new RasterFormatException("width or height is 0"); ++ ++ return src.createCompatibleWritableRaster ((int) rect.getWidth (), ++ (int) rect.getHeight ()); ++ } ++ ++ /** ++ * Transforms source image using transform specified at the constructor. ++ * The resulting transformed image is stored in the destination image. ++ * ++ * @param src source image ++ * @param dst destination image ++ * @return transformed source image ++ */ ++ public BufferedImage filter (BufferedImage src, BufferedImage dst) ++ { ++ ++ if (dst == src) ++ throw new IllegalArgumentException ("src image cannot be the same as the dst image"); ++ ++ // If the destination image is null, then BufferedImage is ++ // created with ColorModel of the source image ++ ++ if (dst == null) ++ dst = createCompatibleDestImage(src, src.getColorModel ()); ++ ++ // FIXME: Must check if color models of src and dst images are the same. ++ // If it is not, then source image should be converted to color model ++ // of the destination image ++ ++ Graphics2D gr = (Graphics2D) dst.createGraphics (); ++ gr.setRenderingHints (hints); ++ gr.drawImage (src, transform, null); ++ return dst; ++ ++ } ++ ++ /** ++ * Transforms source raster using transform specified at the constructor. ++ * The resulting raster is stored in the destination raster. ++ * ++ * @param src source raster ++ * @param dst destination raster ++ * @return transformed raster ++ */ ++ public WritableRaster filter (Raster src, WritableRaster dst) ++ { ++ throw new UnsupportedOperationException ("not implemented yet"); ++ } ++ ++ /** ++ * Transforms source image using transform specified at the constructor and ++ * returns bounds of the transformed image. ++ * ++ * @param src image to be transformed ++ * @return bounds of the transformed image. ++ */ ++ public Rectangle2D getBounds2D (BufferedImage src) ++ { ++ return getBounds2D (src.getRaster()); ++ } ++ ++ /** ++ * Returns bounds of the transformed raster. ++ * ++ * @param src raster to be transformed ++ * @return bounds of the transformed raster. ++ */ ++ public Rectangle2D getBounds2D (Raster src) ++ { ++ // determine new size for the transformed raster. ++ // Need to calculate transformed coordinates of the lower right ++ // corner of the raster. The upper left corner is always (0,0) ++ ++ double x2 = (double) src.getWidth () + src.getMinX (); ++ double y2 = (double) src.getHeight () + src.getMinY (); ++ Point2D p2 = getPoint2D (new Point2D.Double (x2,y2), null); ++ ++ Rectangle2D rect = new Rectangle (0, 0, (int) p2.getX (), (int) p2.getY ()); ++ return rect.getBounds (); ++ } ++ ++ /** ++ * Returns interpolation type used during transformations ++ * ++ * @return interpolation type ++ */ ++ public int getInterpolationType () ++ { ++ if(hints.containsValue (RenderingHints.VALUE_INTERPOLATION_BILINEAR)) ++ return TYPE_BILINEAR; ++ else ++ return TYPE_NEAREST_NEIGHBOR; ++ } ++ ++ /** ++ * Returns location of the transformed source point. The resulting point ++ * is stored in the dstPt if one is specified. ++ * ++ * @param srcPt point to be transformed ++ * @param dstPt destination point ++ * @return the location of the transformed source point. ++ */ ++ public Point2D getPoint2D (Point2D srcPt, Point2D dstPt) ++ { ++ return transform.transform (srcPt, dstPt); ++ } ++ ++ /** Returns rendering hints that are used during transformation. ++ * ++ * @return rendering hints ++ */ ++ public RenderingHints getRenderingHints () ++ { ++ return hints; ++ } ++ ++ /** Returns transform used in transformation between source and destination ++ * image. ++ * ++ * @return transform ++ */ ++ public AffineTransform getTransform () ++ { ++ return transform; ++ } ++} +Index: java/awt/image/BufferedImage.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/BufferedImage.java,v +retrieving revision 1.9 +diff -u -r1.9 BufferedImage.java +--- java/awt/image/BufferedImage.java 25 Sep 2003 18:35:44 -0000 1.9 ++++ java/awt/image/BufferedImage.java 6 Sep 2004 16:35:50 -0000 +@@ -39,6 +39,7 @@ + + import java.awt.Graphics; + import java.awt.Graphics2D; ++import java.awt.GraphicsEnvironment; + import java.awt.Image; + import java.awt.Point; + import java.awt.Rectangle; +@@ -46,6 +47,8 @@ + import java.awt.color.ColorSpace; + import java.util.Hashtable; + import java.util.Vector; ++import java.util.HashSet; ++import java.util.Iterator; + import gnu.java.awt.ComponentDataBlitOp; + + /** +@@ -255,7 +258,8 @@ + public WritableRaster copyData(WritableRaster dest) + { + if (dest == null) +- dest = raster.createCompatibleWritableRaster(); ++ dest = raster.createCompatibleWritableRaster(getMinX(), getMinY(), ++ getWidth(),getHeight()); + + int x = dest.getMinX(); + int y = dest.getMinY(); +@@ -282,8 +286,9 @@ + + public Graphics2D createGraphics() + { +- throw new UnsupportedOperationException("not implemented"); +- // will require a lot of effort to implement ++ GraphicsEnvironment env; ++ env = GraphicsEnvironment.getLocalGraphicsEnvironment (); ++ return env.createGraphics (this); + } + + public void flush() { +@@ -439,7 +444,57 @@ + + public ImageProducer getSource() + { +- throw new UnsupportedOperationException("not implemented"); ++ return new ImageProducer() { ++ ++ HashSet consumers = new HashSet(); ++ ++ public void addConsumer(ImageConsumer ic) ++ { ++ consumers.add(ic); ++ } ++ ++ public boolean isConsumer(ImageConsumer ic) ++ { ++ return consumers.contains(ic); ++ } ++ ++ public void removeConsumer(ImageConsumer ic) ++ { ++ consumers.remove(ic); ++ } ++ ++ public void startProduction(ImageConsumer ic) ++ { ++ int x = 0; ++ int y = 0; ++ int width = getWidth(); ++ int height = getHeight(); ++ int stride = width; ++ int offset = 0; ++ int[] pixels = getRGB(x, y, ++ width, height, ++ (int[])null, offset, stride); ++ ColorModel model = getColorModel(); ++ ++ consumers.add(ic); ++ ++ Iterator i = consumers.iterator(); ++ while(i.hasNext()) ++ { ++ ImageConsumer c = (ImageConsumer) i.next(); ++ c.setHints(ImageConsumer.SINGLEPASS); ++ c.setDimensions(getWidth(), getHeight()); ++ c.setPixels(x, y, width, height, model, pixels, offset, stride); ++ c.imageComplete(ImageConsumer.STATICIMAGEDONE); ++ } ++ } ++ ++ public void requestTopDownLeftRightResend(ImageConsumer ic) ++ { ++ startProduction(ic); ++ } ++ ++ }; + } + + public Vector getSources() +Index: java/awt/image/ByteLookupTable.java +=================================================================== +RCS file: java/awt/image/ByteLookupTable.java +diff -N java/awt/image/ByteLookupTable.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/ByteLookupTable.java 6 Sep 2004 16:35:50 -0000 +@@ -0,0 +1,162 @@ ++/* ByteLookupTable.java -- Java class for a pixel translation table. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package java.awt.image; ++ ++/** ++ * ByteLookupTable represents translation arrays for pixel values. It wraps ++ * one or more data arrays for each layer (or component) in an image, such as ++ * Alpha, R, G, and B. When doing translation, the offset is subtracted from ++ * the pixel values to allow a subset of an array to be used. ++ * ++ * @author Jerry Quinn ++ * @version 1.0 ++ */ ++public class ByteLookupTable extends LookupTable ++{ ++ // Array of translation tables. ++ private byte data[][]; ++ ++ /** ++ * Creates a new ByteLookupTable instance. ++ * ++ * Offset is subtracted from pixel values when looking up in the translation ++ * tables. If data.length is one, the same table is applied to all pixel ++ * components. ++ * ++ * @param offset Offset to be subtracted. ++ * @param data Array of lookup tables. ++ * @exception IllegalArgumentException if offset < 0 or data.length < 1. ++ */ ++ public ByteLookupTable(int offset, byte[][] data) ++ throws IllegalArgumentException ++ { ++ super(offset, data.length); ++ this.data = data; ++ } ++ ++ /** ++ * Creates a new ByteLookupTable instance. ++ * ++ * Offset is subtracted from pixel values when looking up in the translation ++ * table. The same table is applied to all pixel components. ++ * ++ * @param offset Offset to be subtracted. ++ * @param data Lookup table for all components. ++ * @exception IllegalArgumentException if offset < 0. ++ */ ++ public ByteLookupTable(int offset, byte[] data) ++ throws IllegalArgumentException ++ { ++ super(offset, 1); ++ this.data = new byte[][] {data}; ++ } ++ ++ /** Return the lookup tables. */ ++ public final byte[][] getTable() ++ { ++ return data; ++ } ++ ++ /** ++ * Return translated values for a pixel. ++ * ++ * For each value in the pixel src, use the value minus offset as an index ++ * in the component array and copy the value there to the output for the ++ * component. If dest is null, the output is a new array, otherwise the ++ * translated values are written to dest. Dest can be the same array as ++ * src. ++ * ++ * For example, if the pixel src is [2, 4, 3], and offset is 1, the output ++ * is [comp1[1], comp2[3], comp3[2]], where comp1, comp2, and comp3 are the ++ * translation arrays. ++ * ++ * @param src Component values of a pixel. ++ * @param dest Destination array for values, or null. ++ * @return Translated values for the pixel. ++ */ ++ public int[] lookupPixel(int[] src, int[] dst) ++ throws ArrayIndexOutOfBoundsException ++ { ++ if (dst == null) ++ dst = new int[numComponents]; ++ ++ if (data.length == 1) ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[0][src[i] - offset]; ++ else ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[i][src[i] - offset]; ++ ++ return dst; ++ } ++ ++ /** ++ * Return translated values for a pixel. ++ * ++ * For each value in the pixel src, use the value minus offset as an index ++ * in the component array and copy the value there to the output for the ++ * component. If dest is null, the output is a new array, otherwise the ++ * translated values are written to dest. Dest can be the same array as ++ * src. ++ * ++ * For example, if the pixel src is [2, 4, 3], and offset is 1, the output ++ * is [comp1[1], comp2[3], comp3[2]], where comp1, comp2, and comp3 are the ++ * translation arrays. ++ * ++ * @param src Component values of a pixel. ++ * @param dest Destination array for values, or null. ++ * @return Translated values for the pixel. ++ */ ++ public byte[] lookupPixel(byte[] src, byte[] dst) ++ throws ArrayIndexOutOfBoundsException ++ { ++ if (dst == null) ++ dst = new byte[numComponents]; ++ ++ if (data.length == 1) ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[0][((int)src[i]) - offset]; ++ else ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[i][((int)src[i]) - offset]; ++ ++ return dst; ++ ++ } ++} +Index: java/awt/image/ColorModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/ColorModel.java,v +retrieving revision 1.13 +diff -u -r1.13 ColorModel.java +--- java/awt/image/ColorModel.java 25 Jun 2003 11:23:33 -0000 1.13 ++++ java/awt/image/ColorModel.java 6 Sep 2004 16:35:51 -0000 +@@ -37,6 +37,7 @@ + + package java.awt.image; + ++import java.util.Arrays; + import java.awt.Point; + import java.awt.Transparency; + import java.awt.color.ColorSpace; +@@ -166,7 +167,7 @@ + */ + public static ColorModel getRGBdefault() + { +- return new DirectColorModel(8, 0xff0000, 0xff00, 0xff, 0xff000000); ++ return new DirectColorModel(32, 0xff0000, 0xff00, 0xff, 0xff000000); + } + + public final boolean hasAlpha() +@@ -551,8 +552,8 @@ + (transferType == o.transferType) && + (transparency == o.transparency) && + (hasAlpha == o.hasAlpha) && +- (isAlphaPremultiplied == isAlphaPremultiplied) && +- (bits.equals(o.bits)) && ++ (isAlphaPremultiplied == o.isAlphaPremultiplied) && ++ Arrays.equals(bits, o.bits) && + (cspace.equals(o.cspace)); + } + +@@ -597,7 +598,11 @@ + return null; + } + +- // Typically overridden ++ /** ++ * Checks if the given raster has a compatible data-layout (SampleModel). ++ * @param raster The Raster to test. ++ * @return true if raster is compatible. ++ */ + public boolean isCompatibleRaster(Raster raster) + { + SampleModel sampleModel = raster.getSampleModel(); +Index: java/awt/image/ComponentColorModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/ComponentColorModel.java,v +retrieving revision 1.5 +diff -u -r1.5 ComponentColorModel.java +--- java/awt/image/ComponentColorModel.java 5 Jun 2003 19:58:40 -0000 1.5 ++++ java/awt/image/ComponentColorModel.java 6 Sep 2004 16:35:51 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2002 Free Software Foundation ++/* Copyright (C) 2000, 2002, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -292,19 +292,56 @@ + return Raster.createWritableRaster(sm, origin); + } + ++ ++ /** ++ * Creates a SampleModel whose arrangement of pixel ++ * data is compatible to this ColorModel. ++ * ++ * @param w the number of pixels in the horizontal direction. ++ * @param h the number of pixels in the vertical direction. ++ */ + public SampleModel createCompatibleSampleModel(int w, int h) + { +- int pixelStride = getNumComponents(); +- +- /* TODO: Maybe we don't need to create a new offset array each +- time, but rather use the same array every time. */ +- int[] bandOffsets = new int[pixelStride]; +- for (int i=0; i +@@ -92,7 +93,7 @@ + */ + public void setProperties(Hashtable props) + { +-// props.put("filters", "ReplicateScaleFilter"); ++ props.put("filters", "CropImageFilter"); + consumer.setProperties(props); + } + +@@ -113,7 +114,27 @@ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { +- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); ++ Rectangle filterBounds = new Rectangle(this.x, this.y, ++ this.width, this.height); ++ Rectangle pixelBounds = new Rectangle(x, y, w, h); ++ ++ if (filterBounds.intersects(pixelBounds)) ++ { ++ Rectangle bounds = filterBounds.intersection(pixelBounds); ++ ++ byte[] cropped = new byte[bounds.width * bounds.height]; ++ for (int i = 0; i < bounds.height; i++) ++ { ++ int start = (bounds.y - pixelBounds.y + i) * scansize + offset; ++ ++ for (int j = 0; j < bounds.width; j++) ++ cropped[i * bounds.width + j] = pixels[start + bounds.x + j]; ++ } ++ ++ consumer.setPixels(bounds.x, bounds.y, ++ bounds.width, bounds.height, ++ model, cropped, 0, bounds.width); ++ } + } + + /** +@@ -133,7 +154,27 @@ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { +- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); ++ Rectangle filterBounds = new Rectangle(this.x, this.y, ++ this.width, this.height); ++ Rectangle pixelBounds = new Rectangle(x, y, w, h); ++ ++ if (filterBounds.intersects(pixelBounds)) ++ { ++ Rectangle bounds = filterBounds.intersection(pixelBounds); ++ ++ int[] cropped = new int[bounds.width * bounds.height]; ++ for (int i = 0; i < bounds.height; i++) ++ { ++ int start = (bounds.y - pixelBounds.y + i) * scansize + offset; ++ ++ for (int j = 0; j < bounds.width; j++) ++ cropped[i * bounds.width + j] = pixels[start + bounds.x + j]; ++ } ++ ++ consumer.setPixels(bounds.x, bounds.y, ++ bounds.width, bounds.height, ++ model, cropped, 0, bounds.width); ++ } + } + + } +Index: java/awt/image/DataBufferDouble.java +=================================================================== +RCS file: java/awt/image/DataBufferDouble.java +diff -N java/awt/image/DataBufferDouble.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/DataBufferDouble.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,174 @@ ++/* Copyright (C) 2004 Free Software Foundation ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.awt.image; ++ ++/* This is one of several classes that are nearly identical. Maybe we ++ should have a central template and generate all these files. This ++ is one of the cases where templates or macros would have been ++ useful to have in Java. ++ ++ This file has been created using search-replace. My only fear is ++ that these classes will grow out-of-sync as of a result of changes ++ that are not propagated to the other files. As always, mirroring ++ code is a maintenance nightmare. */ ++ ++/** ++ * @since 1.4 ++ * ++ * @author Rolf W. Rasmussen ++ * @author Sascha Brawer ++ */ ++public final class DataBufferDouble ++ extends DataBuffer ++{ ++ private double[] data; ++ private double[][] bankData; ++ ++ public DataBufferDouble(int size) ++ { ++ super(TYPE_DOUBLE, size); ++ data = new double[size]; ++ } ++ ++ public DataBufferDouble(int size, int numBanks) ++ { ++ super(TYPE_DOUBLE, size, numBanks); ++ bankData = new double[numBanks][size]; ++ data = bankData[0]; ++ } ++ ++ public DataBufferDouble(double[] dataArray, int size) ++ { ++ super(TYPE_DOUBLE, size); ++ data = dataArray; ++ } ++ ++ public DataBufferDouble(double[] dataArray, int size, int offset) ++ { ++ super(TYPE_DOUBLE, size, 1, offset); ++ data = dataArray; ++ } ++ ++ public DataBufferDouble(double[][] dataArray, int size) ++ { ++ super(TYPE_DOUBLE, size, dataArray.length); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public DataBufferDouble(double[][] dataArray, int size, int[] offsets) ++ { ++ super(TYPE_DOUBLE, size, dataArray.length, offsets); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public double[] getData() ++ { ++ return data; ++ } ++ ++ public double[] getData(int bank) ++ { ++ return bankData[bank]; ++ } ++ ++ public double[][] getBankData() ++ { ++ return bankData; ++ } ++ ++ public int getElem(int i) ++ { ++ return (int) data[i+offset]; ++ } ++ ++ public int getElem(int bank, int i) ++ { ++ return (int) bankData[bank][i+offsets[bank]]; ++ } ++ ++ public void setElem(int i, int val) ++ { ++ data[i+offset] = (double) val; ++ } ++ ++ public void setElem(int bank, int i, int val) ++ { ++ bankData[bank][i+offsets[bank]] = (double) val; ++ } ++ ++ public float getElemFloat(int i) ++ { ++ return (float) data[i+offset]; ++ } ++ ++ public float getElemFloat(int bank, int i) ++ { ++ return (float) bankData[bank][i+offsets[bank]]; ++ } ++ ++ public void setElemFloat(int i, float val) ++ { ++ data[i+offset] = val; ++ } ++ ++ public void setElemFloat(int bank, int i, float val) ++ { ++ bankData[bank][i+offsets[bank]] = val; ++ } ++ ++ public double getElemDouble(int i) ++ { ++ return data[i + offset]; ++ } ++ ++ public double getElemDouble(int bank, int i) ++ { ++ return bankData[bank][i + offsets[bank]]; ++ } ++ ++ public void setElemDouble(int i, double val) ++ { ++ data[i + offset] = val; ++ } ++ ++ public void setElemDouble(int bank, int i, double val) ++ { ++ bankData[bank][i + offsets[bank]] = val; ++ } ++} +Index: java/awt/image/DataBufferFloat.java +=================================================================== +RCS file: java/awt/image/DataBufferFloat.java +diff -N java/awt/image/DataBufferFloat.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/DataBufferFloat.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,172 @@ ++/* Copyright (C) 2004 Free Software Foundation ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.awt.image; ++ ++/* This is one of several classes that are nearly identical. Maybe we ++ should have a central template and generate all these files. This ++ is one of the cases where templates or macros would have been ++ useful to have in Java. ++ ++ This file has been created using search-replace. My only fear is ++ that these classes will grow out-of-sync as of a result of changes ++ that are not propagated to the other files. As always, mirroring ++ code is a maintenance nightmare. */ ++ ++/** ++ * @author Rolf W. Rasmussen ++ * @author Sascha Brawer ++ */ ++public final class DataBufferFloat ++ extends DataBuffer ++{ ++ private float[] data; ++ private float[][] bankData; ++ ++ public DataBufferFloat(int size) ++ { ++ super(TYPE_FLOAT, size); ++ data = new float[size]; ++ } ++ ++ public DataBufferFloat(int size, int numBanks) ++ { ++ super(TYPE_FLOAT, size, numBanks); ++ bankData = new float[numBanks][size]; ++ data = bankData[0]; ++ } ++ ++ public DataBufferFloat(float[] dataArray, int size) ++ { ++ super(TYPE_FLOAT, size); ++ data = dataArray; ++ } ++ ++ public DataBufferFloat(float[] dataArray, int size, int offset) ++ { ++ super(TYPE_FLOAT, size, 1, offset); ++ data = dataArray; ++ } ++ ++ public DataBufferFloat(float[][] dataArray, int size) ++ { ++ super(TYPE_FLOAT, size, dataArray.length); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public DataBufferFloat(float[][] dataArray, int size, int[] offsets) ++ { ++ super(TYPE_FLOAT, size, dataArray.length, offsets); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public float[] getData() ++ { ++ return data; ++ } ++ ++ public float[] getData(int bank) ++ { ++ return bankData[bank]; ++ } ++ ++ public float[][] getBankData() ++ { ++ return bankData; ++ } ++ ++ public int getElem(int i) ++ { ++ return (int) data[i+offset]; ++ } ++ ++ public int getElem(int bank, int i) ++ { ++ return (int) bankData[bank][i+offsets[bank]]; ++ } ++ ++ public void setElem(int i, int val) ++ { ++ data[i+offset] = (float) val; ++ } ++ ++ public void setElem(int bank, int i, int val) ++ { ++ bankData[bank][i+offsets[bank]] = (float) val; ++ } ++ ++ public float getElemFloat(int i) ++ { ++ return data[i+offset]; ++ } ++ ++ public float getElemFloat(int bank, int i) ++ { ++ return bankData[bank][i+offsets[bank]]; ++ } ++ ++ public void setElemFloat(int i, float val) ++ { ++ data[i+offset] = val; ++ } ++ ++ public void setElemFloat(int bank, int i, float val) ++ { ++ bankData[bank][i+offsets[bank]] = val; ++ } ++ ++ public double getElemDouble(int i) ++ { ++ return getElemFloat(i); ++ } ++ ++ public double getElemDouble(int bank, int i) ++ { ++ return getElemFloat(bank, i); ++ } ++ ++ public void setElemDouble(int i, double val) ++ { ++ setElemFloat(i, (float) val); ++ } ++ ++ public void setElemDouble(int bank, int i, double val) ++ { ++ setElemFloat(bank, i, (float) val); ++ } ++} +Index: java/awt/image/DataBufferShort.java +=================================================================== +RCS file: java/awt/image/DataBufferShort.java +diff -N java/awt/image/DataBufferShort.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/DataBufferShort.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,130 @@ ++/* Copyright (C) 2004 Free Software Foundation ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.awt.image; ++ ++/* This is one of several classes that are nearly identical. Maybe we ++ should have a central template and generate all these files. This ++ is one of the cases where templates or macros would have been ++ useful to have in Java. ++ ++ This file has been created using search-replace. My only fear is ++ that these classes will grow out-of-sync as of a result of changes ++ that are not propagated to the other files. As always, mirroring ++ code is a maintenance nightmare. */ ++ ++/** ++ * @author Rolf W. Rasmussen ++ */ ++public final class DataBufferShort extends DataBuffer ++{ ++ private short[] data; ++ private short[][] bankData; ++ ++ public DataBufferShort(int size) ++ { ++ super(TYPE_SHORT, size); ++ data = new short[size]; ++ } ++ ++ public DataBufferShort(int size, int numBanks) ++ { ++ super(TYPE_SHORT, size, numBanks); ++ bankData = new short[numBanks][size]; ++ data = bankData[0]; ++ } ++ ++ public DataBufferShort(short[] dataArray, int size) ++ { ++ super(TYPE_SHORT, size); ++ data = dataArray; ++ } ++ ++ public DataBufferShort(short[] dataArray, int size, int offset) ++ { ++ super(TYPE_SHORT, size, 1, offset); ++ data = dataArray; ++ } ++ ++ public DataBufferShort(short[][] dataArray, int size) ++ { ++ super(TYPE_SHORT, size, dataArray.length); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public DataBufferShort(short[][] dataArray, int size, int[] offsets) ++ { ++ super(TYPE_SHORT, size, dataArray.length, offsets); ++ bankData = dataArray; ++ data = bankData[0]; ++ } ++ ++ public short[] getData() ++ { ++ return data; ++ } ++ ++ public short[] getData(int bank) ++ { ++ return bankData[bank]; ++ } ++ ++ public short[][] getBankData() ++ { ++ return bankData; ++ } ++ ++ public int getElem(int i) ++ { ++ return data[i+offset]; ++ } ++ ++ public int getElem(int bank, int i) ++ { ++ return bankData[bank][i+offsets[bank]]; ++ } ++ ++ public void setElem(int i, int val) ++ { ++ data[i+offset] = (short) val; ++ } ++ ++ public void setElem(int bank, int i, int val) ++ { ++ bankData[bank][i+offsets[bank]] = (short) val; ++ } ++} +Index: java/awt/image/DirectColorModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/DirectColorModel.java,v +retrieving revision 1.5 +diff -u -r1.5 DirectColorModel.java +--- java/awt/image/DirectColorModel.java 27 Jun 2003 20:53:01 -0000 1.5 ++++ java/awt/image/DirectColorModel.java 6 Sep 2004 16:35:51 -0000 +@@ -60,7 +60,6 @@ + * @param rmask the bits describing the red component of a pixel + * @param gmask the bits describing the green component of a pixel + * @param bmask the bits describing the blue component of a pixel +- * @param amask the bits describing the alpha component of a pixel + */ + public DirectColorModel(int pixelBits, int rmask, int gmask, int bmask) + { +@@ -82,6 +81,7 @@ + * @param rmask the bits describing the red component of a pixel + * @param gmask the bits describing the green component of a pixel + * @param bmask the bits describing the blue component of a pixel ++ * @param amask the bits describing the alpha component of a pixel + */ + public DirectColorModel(int pixelBits, + int rmask, int gmask, int bmask, int amask) +Index: java/awt/image/Kernel.java +=================================================================== +RCS file: java/awt/image/Kernel.java +diff -N java/awt/image/Kernel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/Kernel.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,143 @@ ++/* Kernel.java -- Java class for an image processing kernel ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package java.awt.image; ++ ++/** ++ * Kernel represents an image processing kernel. It gets used to hold ++ * convolution filters among other purposes. It stores an array of float ++ * values representing a 2-dimensional array in row-major order. ++ * ++ * @author Jerry Quinn ++ * @version 1.0 ++ */ ++public class Kernel implements Cloneable ++{ ++ private final int width; ++ private final int height; ++ private final float[] data; ++ ++ /** ++ * Creates a new Kernel instance. ++ * ++ * @param width The 2D width of data. ++ * @param height The 2D height of data. ++ * @param data The source data array. ++ * @exception IllegalArgumentException if width * height < data.length. ++ */ ++ public Kernel(int width, int height, float[] data) ++ throws IllegalArgumentException ++ { ++ this.width = width; ++ this.height = height; ++ if (data.length < width * height || width < 0 || height < 0) ++ throw new IllegalArgumentException(); ++ this.data = new float[width * height]; ++ System.arraycopy(data, 0, this.data, 0, width * height); ++ } ++ ++ /** ++ * Return the X origin: (width - 1) / 2 ++ */ ++ public final int getXOrigin() ++ { ++ return (width - 1) / 2; ++ } ++ ++ /** ++ * Return the Y origin: (height - 1) / 2 ++ */ ++ public final int getYOrigin() ++ { ++ return (height - 1) / 2; ++ } ++ ++ /** ++ * @return The kernel width. ++ */ ++ public final int getWidth() ++ { ++ return width; ++ } ++ ++ /** ++ * @return The kernel height. ++ */ ++ public final int getHeight() ++ { ++ return height; ++ } ++ ++ /** ++ * Return the kernel data. ++ * ++ * If data is null, allocates a new array and returns it. Otherwise, the ++ * kernel values are copied into data. ++ * ++ * @param data Array to copy values into, or null. ++ * @return The array with copied values. ++ * @exception IllegalArgumentException if data != null and too small. ++ */ ++ public final float[] getKernelData(float[] data) ++ throws IllegalArgumentException ++ { ++ if (data == null) ++ return (float[])this.data.clone(); ++ ++ if (data.length < this.data.length) ++ throw new IllegalArgumentException(); ++ ++ System.arraycopy(this.data, 0, data, 0, this.data.length); ++ return data; ++ } ++ ++ /** ++ * @return a clone of this Kernel. ++ */ ++ public Object clone() ++ { ++ try ++ { ++ return super.clone(); ++ } ++ catch (CloneNotSupportedException e) ++ { ++ throw (Error) new InternalError().initCause(e); // Impossible ++ } ++ } ++} +Index: java/awt/image/LookupTable.java +=================================================================== +RCS file: java/awt/image/LookupTable.java +diff -N java/awt/image/LookupTable.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/LookupTable.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,109 @@ ++/* LookupTable.java -- Java class for a pixel translation table. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package java.awt.image; ++ ++/** ++ * LookupTable represents translation arrays for pixel values. It wraps one ++ * or more data arrays for each layer (or component) in an image, such as ++ * Alpha, R, G, and B. When doing translation, the offset is subtracted from ++ * the pixel values to allow a subset of an array to be used. ++ * ++ * @see ByteLookupTable ++ * @see ShortLookupTable ++ * ++ * @author Jerry Quinn ++ * @version 1.0 ++ */ ++public abstract class LookupTable ++{ ++ // Not protected since that's part of the public API. ++ int offset; ++ int numComponents; ++ ++ /** ++ * Creates a new LookupTable instance. ++ * ++ * If numComponents is 1, the same translation table is used for all pixel ++ * components. ++ * ++ * @param offset Offset to be subtracted. ++ * @param numComponents Number of image components. ++ * @exception IllegalArgumentException if offset < 0 or numComponents < 1. ++ */ ++ protected LookupTable(int offset, int numComponents) ++ throws IllegalArgumentException ++ { ++ if (offset < 0 || numComponents < 1) ++ throw new IllegalArgumentException(); ++ this.offset = offset; ++ this.numComponents = numComponents; ++ } ++ ++ /** Return the number of components. */ ++ public int getNumComponents() ++ { ++ return numComponents; ++ } ++ ++ /** Return the offset. */ ++ public int getOffset() ++ { ++ return offset; ++ } ++ ++ ++ /** ++ * Return translated values for a pixel. ++ * ++ * For each value in the pixel src, use the value minus offset as an index ++ * in the component array and copy the value there to the output for the ++ * component. If dest is null, the output is a new array, otherwise the ++ * translated values are written to dest. Dest can be the same array as ++ * src. ++ * ++ * For example, if the pixel src is [2, 4, 3], and offset is 1, the output ++ * is [comp1[1], comp2[3], comp3[2]], where comp1, comp2, and comp3 are the ++ * translation arrays. ++ * ++ * @param src Component values of a pixel. ++ * @param dest Destination array for values, or null. ++ * @return Translated values for the pixel. ++ */ ++ public abstract int[] lookupPixel(int[] src, int[] dest); ++} +Index: java/awt/image/MemoryImageSource.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/MemoryImageSource.java,v +retrieving revision 1.5 +diff -u -r1.5 MemoryImageSource.java +--- java/awt/image/MemoryImageSource.java 14 Jul 2003 05:33:30 -0000 1.5 ++++ java/awt/image/MemoryImageSource.java 6 Sep 2004 16:35:51 -0000 +@@ -41,6 +41,7 @@ + import java.awt.Image; + import java.util.Enumeration; + import java.util.Hashtable; ++import java.util.Vector; + + public class MemoryImageSource implements ImageProducer + { +@@ -49,7 +50,8 @@ + private int pixeli[], width, height, offset, scansize; + private byte pixelb[]; + private ColorModel cm; +- private Hashtable props, consumers = new Hashtable(); ++ private Hashtable props = new Hashtable(); ++ private Vector consumers = new Vector(); + + /** + Constructs an ImageProducer from memory +@@ -126,10 +128,10 @@ + * ImageProducer. + */ + public synchronized void addConsumer(ImageConsumer ic) { +- if (consumers.containsKey(ic)) ++ if (consumers.contains(ic)) + return; + +- consumers.put(ic, ic); ++ consumers.addElement(ic); + } + + /** +@@ -137,7 +139,7 @@ + * already registered with this ImageProducer. + */ + public synchronized boolean isConsumer(ImageConsumer ic) { +- if (consumers.containsKey(ic)) ++ if (consumers.contains(ic)) + return true; + return false; + } +@@ -147,7 +149,7 @@ + * registered consumers for this ImageProducer. + */ + public synchronized void removeConsumer(ImageConsumer ic) { +- consumers.remove(ic); ++ consumers.removeElement(ic); + } + + /** +@@ -157,16 +159,16 @@ + * registered consumers. + */ + public void startProduction(ImageConsumer ic) { +- if (!(consumers.containsKey(ic))) { +- consumers.put(ic, ic); ++ if (!(consumers.contains(ic))) { ++ consumers.addElement(ic); + } +- Enumeration e = consumers.elements(); +- for( ; e.hasMoreElements(); ) { +- ic = (ImageConsumer)e.nextElement(); ++ ++ Vector list = (Vector) consumers.clone(); ++ for(int i = 0; i < list.size(); i++) { ++ ic = (ImageConsumer) list.elementAt(i); + sendPicture( ic ); +- ic.imageComplete( ImageConsumer.SINGLEFRAME ); ++ ic.imageComplete( ImageConsumer.STATICIMAGEDONE ); + } +- + } + + /** +@@ -210,9 +212,9 @@ + { + if( animated == true ) { + ImageConsumer ic; +- Enumeration e = consumers.elements(); +- for( ; e.hasMoreElements(); ) { +- ic = (ImageConsumer)e.nextElement(); ++ Vector list = (Vector) consumers.clone(); ++ for(int i = 0; i < list.size(); i++) { ++ ic = (ImageConsumer) list.elementAt(i); + sendPicture( ic ); + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } +@@ -227,6 +229,7 @@ + ic.setProperties( props ); + } + ic.setDimensions(width, height); ++ ic.setColorModel(cm); + if( pixeli != null ) { + ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + } else { +@@ -249,17 +252,23 @@ + newPixels(); + } else { + ImageConsumer ic; +- Enumeration e = consumers.elements(); +- for( ; e.hasMoreElements(); ) { +- ic = (ImageConsumer)e.nextElement(); ++ Vector list = (Vector) consumers.clone(); ++ for(int i = 0; i < list.size(); i++) { ++ ic = (ImageConsumer) list.elementAt(i); + ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); + if( props != null ) { + ic.setProperties( props ); + } + if( pixeli != null ) { +- ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); ++ int[] pixelbuf = new int[w * h]; ++ for (int row = y; row < h; row++) ++ System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, row * w, w); ++ ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); + } else { +- ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); ++ byte[] pixelbuf = new byte[w * h]; ++ for (int row = y; row < h; row++) ++ System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, row * w, w); ++ ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); + } + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } +@@ -288,17 +297,23 @@ + newPixels(); + } else { + ImageConsumer ic; +- Enumeration e = consumers.elements(); +- for( ; e.hasMoreElements(); ) { +- ic = (ImageConsumer)e.nextElement(); ++ Vector list = (Vector) consumers.clone(); ++ for(int i = 0; i < list.size(); i++) { ++ ic = (ImageConsumer) list.elementAt(i); + ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); + if( props != null ) { + ic.setProperties( props ); + } + if( pixeli != null ) { +- ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); ++ int[] pixelbuf = new int[w * h]; ++ for (int row = y; row < h; row++) ++ System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, row * w, w); ++ ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); + } else { +- ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); ++ byte[] pixelbuf = new byte[w * h]; ++ for (int row = y; row < h; row++) ++ System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, row * w, w); ++ ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); + } + if( framenotify == true ) + ic.imageComplete( ImageConsumer.SINGLEFRAME ); +@@ -313,9 +328,14 @@ + int scansize) + + { ++ pixeli = null; ++ pixelb = newpix; ++ cm = newmodel; ++ this.offset = offset; ++ this.scansize = scansize; + if( animated == true ) + { +- //FIXME ++ newPixels(); + } + } + +@@ -325,9 +345,14 @@ + int scansize) + + { ++ pixelb = null; ++ pixeli = newpix; ++ cm = newmodel; ++ this.offset = offset; ++ this.scansize = scansize; + if( animated == true ) + { +- //FIXME ++ newPixels(); + } + } + +Index: java/awt/image/PixelInterleavedSampleModel.java +=================================================================== +RCS file: java/awt/image/PixelInterleavedSampleModel.java +diff -N java/awt/image/PixelInterleavedSampleModel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/PixelInterleavedSampleModel.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,98 @@ ++/* PixelInterleavedSampleModel.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.awt.image; ++ ++ ++/** ++ * A SampleModel that uses exactly one element of the ++ * raster’s {@link DataBuffer} per pixel, holds all bands in a ++ * single bank, and stores band data in pixel-interleaved manner. ++ * ++ * @since 1.2 ++ * ++ * @author Sascha Brawer ++ */ ++public class PixelInterleavedSampleModel ++ extends ComponentSampleModel ++{ ++ public PixelInterleavedSampleModel(int dataType, int width, int height, ++ int pixelStride, int scanlineStride, ++ int[] bandOffsets) ++ { ++ super(dataType, width, height, pixelStride, scanlineStride, ++ bandOffsets); ++ } ++ ++ ++ /** ++ * Creates a new SampleModel that is like this one, but ++ * uses the specified width and height. ++ * ++ * @param width the number of pixels in the horizontal direction. ++ * ++ * @param height the number of pixels in the vertical direction. ++ */ ++ public SampleModel createCompatibleSampleModel(int width, int height) ++ { ++ return new PixelInterleavedSampleModel(dataType, width, height, ++ pixelStride, scanlineStride, ++ bandOffsets); ++ } ++ ++ ++ /** ++ * Creates a new SampleModel that is like this one, but ++ * uses only a subset of its bands. ++ * ++ * @param bands an array whose elements indicate which bands shall ++ * be part of the subset. For example, [0, 2, 3] would ++ * create a SampleModel containing bands #0, #2 and #3. ++ */ ++ public SampleModel createSubsetSampleModel(int[] bands) ++ { ++ int[] subOffsets; ++ ++ subOffsets = new int[bands.length]; ++ for (int i = 0; i < bands.length; i++) ++ subOffsets[i] = bandOffsets[bands[i]]; ++ ++ return new PixelInterleavedSampleModel(dataType, width, height, ++ pixelStride, scanlineStride, ++ subOffsets); ++ } ++} +Index: java/awt/image/RGBImageFilter.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/RGBImageFilter.java,v +retrieving revision 1.2 +diff -u -r1.2 RGBImageFilter.java +--- java/awt/image/RGBImageFilter.java 11 Oct 2003 17:19:46 -0000 1.2 ++++ java/awt/image/RGBImageFilter.java 6 Sep 2004 16:35:51 -0000 +@@ -46,7 +46,7 @@ + */ + public abstract class RGBImageFilter extends ImageFilter + { +- protected ColorModel origmodel = ColorModel.getRGBdefault(); ++ protected ColorModel origmodel; + + protected ColorModel newmodel; + +@@ -79,6 +79,10 @@ + + if( ( model instanceof IndexColorModel) && canFilterIndexColorModel ) { + newmodel = filterIndexColorModel( (IndexColorModel) model ); ++ consumer.setColorModel(newmodel); ++ } ++ else { ++ consumer.setColorModel(ColorModel.getRGBdefault()); + } + } + +@@ -126,7 +130,7 @@ + + private int makeColor( byte a, byte r, byte g, byte b ) + { +- return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); ++ return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b ); + } + + /** +@@ -149,11 +153,15 @@ + int off, + int scansize) + { +- int xp, yp; ++ int xp, yp, i; + ++ i = 0; + for( xp = x; xp < ( x + w); xp++ ) + for( yp = y; yp < (y + h); yp++ ) +- pixels[ off + yp * scansize + xp ] = filterRGB( xp, yp, pixels[ off + yp * scansize + xp ] ); ++ { ++ pixels[i] = filterRGB( xp, yp, pixels[i] ); ++ i++; ++ } + } + + +@@ -172,15 +180,19 @@ + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, +- ColorModel model, byte[] pixels, int offset, int scansize) ++ ColorModel model, byte[] pixels, ++ int offset, int scansize) + { +- if( model == origmodel ) { ++ if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel) ++ { + consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize); +- } else { +- //FIXME +- //convert to proper CM +- int pixelsi[] = new int[ pixels.length / 4 ]; +- filterRGBPixels( x, y, w, h, pixelsi, offset, scansize ); ++ } ++ else ++ { ++ int intPixels[] = ++ convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize ); ++ filterRGBPixels( x, y, w, h, intPixels, offset, scansize ); ++ consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), intPixels, offset, scansize); + } + } + +@@ -199,35 +211,53 @@ + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, +- ColorModel model, int[] pixels, int offset, int scansize) ++ ColorModel model, int[] pixels, ++ int offset, int scansize) + { +- if( model == origmodel ) { ++ if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel) ++ { + consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize); +- } else { ++ } ++ else ++ { ++ //FIXME: Store the filtered pixels in a separate temporary buffer? + convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize ); + filterRGBPixels( x, y, w, h, pixels, offset, scansize ); ++ consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), pixels, offset, scansize); + } + } + +- private void convertColorModelToDefault( int x, int y, int w, int h, +- ColorModel model, int pixels[], int offset, int scansize) +- { +- int xp, yp; ++ private int[] convertColorModelToDefault(int x, int y, int w, int h, ++ ColorModel model, byte pixels[], ++ int offset, int scansize) ++ { ++ int intPixels[] = new int[pixels.length]; ++ for (int i = 0; i < pixels.length; i++) ++ intPixels[i] = makeColorbyDefaultCM(model, pixels[i]); ++ return intPixels; ++ } + +- for( xp = x; xp < ( x + w); xp++ ) +- for( yp = y; yp < (y + h); yp++ ) +- pixels[ offset + yp * scansize + xp ] = makeColorbyDefaultCM( pixels[ offset + yp * scansize + xp ] ); +- +- } +- private int makeColorbyDefaultCM( int rgb ) +- { +- return makeColor( origmodel.getRed( rgb ), origmodel.getGreen( rgb ), origmodel.getGreen( rgb ), origmodel.getBlue( rgb ) ); +- } ++ private void convertColorModelToDefault(int x, int y, int w, int h, ++ ColorModel model, int pixels[], ++ int offset, int scansize) ++ { ++ for (int i = 0; i < pixels.length; i++) ++ pixels[i] = makeColorbyDefaultCM(model, pixels[i]); ++ } ++ ++ private int makeColorbyDefaultCM(ColorModel model, byte rgb) ++ { ++ return makeColor( model.getAlpha( rgb ) * 4, model.getRed( rgb ) * 4, model.getGreen( rgb ) * 4, model.getBlue( rgb ) * 4 ); ++ } + ++ private int makeColorbyDefaultCM(ColorModel model, int rgb) ++ { ++ return makeColor( model.getAlpha( rgb ), model.getRed( rgb ), model.getGreen( rgb ), model.getBlue( rgb ) ); ++ } + + private int makeColor( int a, int r, int g, int b ) + { +- return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); ++ return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b ); + } + + +Index: java/awt/image/Raster.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/Raster.java,v +retrieving revision 1.6 +diff -u -r1.6 Raster.java +--- java/awt/image/Raster.java 25 Sep 2003 18:35:44 -0000 1.6 ++++ java/awt/image/Raster.java 6 Sep 2004 16:35:51 -0000 +@@ -452,4 +452,25 @@ + y-sampleModelTranslateY, + w, h, b, dArray, dataBuffer); + } ++ ++ /** ++ * Create a String representing the stat of this Raster. ++ * @return A String representing the stat of this Raster. ++ * @see java.lang.Object#toString() ++ */ ++ public String toString() ++ { ++ StringBuffer result = new StringBuffer(); ++ ++ result.append(getClass().getName()); ++ result.append("[("); ++ result.append(minX).append(",").append(minY).append("), "); ++ result.append(width).append(" x ").append(height).append(","); ++ result.append(sampleModel).append(","); ++ result.append(dataBuffer); ++ result.append("]"); ++ ++ return result.toString(); ++ } ++ + } +Index: java/awt/image/ReplicateScaleFilter.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/ReplicateScaleFilter.java,v +retrieving revision 1.1 +diff -u -r1.1 ReplicateScaleFilter.java +--- java/awt/image/ReplicateScaleFilter.java 24 Jan 2002 01:05:12 -0000 1.1 ++++ java/awt/image/ReplicateScaleFilter.java 6 Sep 2004 16:35:51 -0000 +@@ -104,7 +104,27 @@ + */ + public void setDimensions(int width, int height) + { +- consumer.setDimensions(width, height); ++ srcWidth = width; ++ srcHeight = height; ++ ++ /* If either destHeight or destWidth is < 0, the image should ++ maintain its original aspect ratio. When both are < 0, ++ just maintain the original width and height. */ ++ if (destWidth < 0 && destHeight < 0) ++ { ++ destWidth = width; ++ destHeight = height; ++ } ++ else if (destWidth < 0) ++ { ++ destWidth = (int) (width * ((double) destHeight / srcHeight)); ++ } ++ else if (destHeight < 0) ++ { ++ destHeight = (int) (height * ((double) destWidth / srcWidth)); ++ } ++ ++ consumer.setDimensions(destWidth, destHeight); + } + + /** +@@ -136,7 +156,18 @@ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { +- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); ++ double rx = ((double) srcWidth) / destWidth; ++ double ry = ((double) srcHeight) / destHeight; ++ ++ int destScansize = (int) Math.round(scansize / rx); ++ ++ byte[] destPixels = replicatePixels(x, y, w, h, ++ model, pixels, offset, scansize, ++ rx, ry, destScansize); ++ ++ consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry), ++ (int) Math.ceil(w/rx), (int) Math.ceil(h/ry), ++ model, destPixels, 0, destScansize); + } + + /** +@@ -156,8 +187,58 @@ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { +- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); ++ double rx = ((double) srcWidth) / destWidth; ++ double ry = ((double) srcHeight) / destHeight; ++ ++ int destScansize = (int) Math.round(scansize / rx); ++ ++ int[] destPixels = replicatePixels(x, y, w, h, ++ model, pixels, offset, scansize, ++ rx, ry, destScansize); ++ ++ consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry), ++ (int) Math.ceil(w/rx), (int) Math.ceil(h/ry), ++ model, destPixels, 0, destScansize); + } + ++ protected byte[] replicatePixels(int srcx, int srcy, int srcw, int srch, ++ ColorModel model, byte[] srcPixels, ++ int srcOffset, int srcScansize, ++ double rx, double ry, int destScansize) ++ { ++ byte[] destPixels = ++ new byte[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)]; ++ ++ int a, b; ++ for (int i = 0; i < destPixels.length; i++) ++ { ++ a = (int) ((int) ( ((double) i) / destScansize) * ry) * srcScansize; ++ b = (int) ((i % destScansize) * rx); ++ if ((a + b + srcOffset) < srcPixels.length) ++ destPixels[i] = srcPixels[a + b + srcOffset]; ++ } ++ ++ return destPixels; ++ } ++ ++ protected int[] replicatePixels(int srcx, int srcy, int srcw, int srch, ++ ColorModel model, int[] srcPixels, ++ int srcOffset, int srcScansize, ++ double rx, double ry, int destScansize) ++ { ++ int[] destPixels = ++ new int[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)]; ++ ++ int a, b; ++ for (int i = 0; i < destPixels.length; i++) ++ { ++ a = (int) ((int) ( ((double) i) / destScansize) * ry) * srcScansize; ++ b = (int) ((i % destScansize) * rx); ++ if ((a + b + srcOffset) < srcPixels.length) ++ destPixels[i] = srcPixels[a + b + srcOffset]; ++ } ++ ++ return destPixels; ++ } + } + +Index: java/awt/image/SampleModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/SampleModel.java,v +retrieving revision 1.6 +diff -u -r1.6 SampleModel.java +--- java/awt/image/SampleModel.java 22 Jan 2002 22:40:10 -0000 1.6 ++++ java/awt/image/SampleModel.java 6 Sep 2004 16:35:51 -0000 +@@ -58,7 +58,9 @@ + + public SampleModel(int dataType, int w, int h, int numBands) + { +- if ((w<=0) || (h<=0)) throw new IllegalArgumentException(); ++ if ((w <= 0) || (h <= 0)) ++ throw new IllegalArgumentException((w <= 0 ? " width<=0" : " width is ok") ++ +(h <= 0 ? " height<=0" : " height is ok")); + + // FIXME: How can an int be greater than Integer.MAX_VALUE? + // FIXME: How do we identify an unsupported data type? +@@ -68,7 +70,7 @@ + this.height = h; + this.numBands = numBands; + } +- ++ + public final int getWidth() + { + return width; +Index: java/awt/image/ShortLookupTable.java +=================================================================== +RCS file: java/awt/image/ShortLookupTable.java +diff -N java/awt/image/ShortLookupTable.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ java/awt/image/ShortLookupTable.java 6 Sep 2004 16:35:51 -0000 +@@ -0,0 +1,162 @@ ++/* ShortLookupTable.java -- Java class for a pixel translation table. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package java.awt.image; ++ ++/** ++ * ShortLookupTable represents translation arrays for pixel values. It wraps ++ * one or more data arrays for each layer (or component) in an image, such as ++ * Alpha, R, G, and B. When doing translation, the offset is subtracted from ++ * the pixel values to allow a subset of an array to be used. ++ * ++ * @author Jerry Quinn ++ * @version 1.0 ++ */ ++public class ShortLookupTable extends LookupTable ++{ ++ // Array of translation tables. ++ private short data[][]; ++ ++ /** ++ * Creates a new ShortLookupTable instance. ++ * ++ * Offset is subtracted from pixel values when looking up in the translation ++ * tables. If data.length is one, the same table is applied to all pixel ++ * components. ++ * ++ * @param offset Offset to be subtracted. ++ * @param data Array of lookup tables. ++ * @exception IllegalArgumentException if offset < 0 or data.length < 1. ++ */ ++ public ShortLookupTable(int offset, short[][] data) ++ throws IllegalArgumentException ++ { ++ super(offset, data.length); ++ this.data = data; ++ } ++ ++ /** ++ * Creates a new ShortLookupTable instance. ++ * ++ * Offset is subtracted from pixel values when looking up in the translation ++ * table. The same table is applied to all pixel components. ++ * ++ * @param offset Offset to be subtracted. ++ * @param data Lookup table for all components. ++ * @exception IllegalArgumentException if offset < 0. ++ */ ++ public ShortLookupTable(int offset, short[] data) ++ throws IllegalArgumentException ++ { ++ super(offset, 1); ++ this.data = new short[][] {data}; ++ } ++ ++ /** Return the lookup tables. */ ++ public final short[][] getTable() ++ { ++ return data; ++ } ++ ++ /** ++ * Return translated values for a pixel. ++ * ++ * For each value in the pixel src, use the value minus offset as an index ++ * in the component array and copy the value there to the output for the ++ * component. If dest is null, the output is a new array, otherwise the ++ * translated values are written to dest. Dest can be the same array as ++ * src. ++ * ++ * For example, if the pixel src is [2, 4, 3], and offset is 1, the output ++ * is [comp1[1], comp2[3], comp3[2]], where comp1, comp2, and comp3 are the ++ * translation arrays. ++ * ++ * @param src Component values of a pixel. ++ * @param dest Destination array for values, or null. ++ * @return Translated values for the pixel. ++ */ ++ public int[] lookupPixel(int[] src, int[] dst) ++ throws ArrayIndexOutOfBoundsException ++ { ++ if (dst == null) ++ dst = new int[numComponents]; ++ ++ if (data.length == 1) ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[0][src[i] - offset]; ++ else ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[i][src[i] - offset]; ++ ++ return dst; ++ } ++ ++ /** ++ * Return translated values for a pixel. ++ * ++ * For each value in the pixel src, use the value minus offset as an index ++ * in the component array and copy the value there to the output for the ++ * component. If dest is null, the output is a new array, otherwise the ++ * translated values are written to dest. Dest can be the same array as ++ * src. ++ * ++ * For example, if the pixel src is [2, 4, 3], and offset is 1, the output ++ * is [comp1[1], comp2[3], comp3[2]], where comp1, comp2, and comp3 are the ++ * translation arrays. ++ * ++ * @param src Component values of a pixel. ++ * @param dest Destination array for values, or null. ++ * @return Translated values for the pixel. ++ */ ++ public short[] lookupPixel(short[] src, short[] dst) ++ throws ArrayIndexOutOfBoundsException ++ { ++ if (dst == null) ++ dst = new short[numComponents]; ++ ++ if (data.length == 1) ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[0][((int)src[i]) - offset]; ++ else ++ for (int i=0; i < src.length; i++) ++ dst[i] = data[i][((int)src[i]) - offset]; ++ ++ return dst; ++ ++ } ++} +Index: java/awt/image/SinglePixelPackedSampleModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/awt/image/SinglePixelPackedSampleModel.java,v +retrieving revision 1.6 +diff -u -r1.6 SinglePixelPackedSampleModel.java +--- java/awt/image/SinglePixelPackedSampleModel.java 9 Jan 2004 08:58:57 -0000 1.6 ++++ java/awt/image/SinglePixelPackedSampleModel.java 6 Sep 2004 16:35:51 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2002, 2003 Free Software Foundation ++/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation + + This file is part of GNU Classpath. + +@@ -162,6 +162,63 @@ + 1 // length + ); + } ++ ++ /** ++ * This is a more efficient implementation of the default implementation in the super ++ * class. ++ * @param x The x-coordinate of the pixel rectangle to store in obj. ++ * @param y The y-coordinate of the pixel rectangle to store in obj. ++ * @param w The width of the pixel rectangle to store in obj. ++ * @param h The height of the pixel rectangle to store in obj. ++ * @param obj The primitive array to store the pixels into or null to force creation. ++ * @param data The DataBuffer that is the source of the pixel data. ++ * @return The primitive array containing the pixel data. ++ * @see java.awt.image.SampleModel#getDataElements(int, int, int, int, java.lang.Object, java.awt.image.DataBuffer) ++ */ ++ public Object getDataElements(int x, int y, int w, int h, Object obj, ++ DataBuffer data) ++ { ++ int size = w*h; ++ int dataSize = size; ++ Object pixelData = null; ++ switch (getTransferType()) ++ { ++ case DataBuffer.TYPE_BYTE: ++ pixelData = ((DataBufferByte) data).getData(); ++ if (obj == null) obj = new byte[dataSize]; ++ break; ++ case DataBuffer.TYPE_USHORT: ++ pixelData = ((DataBufferUShort) data).getData(); ++ if (obj == null) obj = new short[dataSize]; ++ break; ++ case DataBuffer.TYPE_INT: ++ pixelData = ((DataBufferInt) data).getData(); ++ if (obj == null) obj = new int[dataSize]; ++ break; ++ default: ++ // Seems like the only sensible thing to do. ++ throw new ClassCastException(); ++ } ++ if(x==0 && scanlineStride == w) ++ { ++ // The full width need to be copied therefore we can copy in one shot. ++ System.arraycopy(pixelData, scanlineStride*y + data.getOffset(), obj, 0, size); ++ } ++ else ++ { ++ // Since we do not need the full width we need to copy line by line. ++ int outOffset = 0; ++ int dataOffset = scanlineStride*y + x + data.getOffset(); ++ for (int yy = y; yy<(y+h); yy++) ++ { ++ System.arraycopy(pixelData, dataOffset, obj, outOffset, w); ++ dataOffset += scanlineStride; ++ outOffset += w; ++ } ++ } ++ return obj; ++ } ++ + + public int[] getPixel(int x, int y, int[] iArray, DataBuffer data) + { +@@ -201,7 +258,51 @@ + int samples = data.getElem(offset); + return (samples & bitMasks[b]) >>> bitOffsets[b]; + } +- ++ ++ /** ++ * This method implements a more efficient way to set data elements than the default ++ * implementation of the super class. It sets the data elements line by line instead ++ * of pixel by pixel. ++ * @param x The x-coordinate of the data elements in obj. ++ * @param y The y-coordinate of the data elements in obj. ++ * @param w The width of the data elements in obj. ++ * @param h The height of the data elements in obj. ++ * @param obj The primitive array containing the data elements to set. ++ * @param data The DataBuffer to store the data elements into. ++ * @see java.awt.image.SampleModel#setDataElements(int, int, int, int, java.lang.Object, java.awt.image.DataBuffer) ++ */ ++ public void setDataElements(int x, int y, int w, int h, ++ Object obj, DataBuffer data) ++ { ++ ++ Object pixelData; ++ switch (getTransferType()) ++ { ++ case DataBuffer.TYPE_BYTE: ++ pixelData = ((DataBufferByte) data).getData(); ++ break; ++ case DataBuffer.TYPE_USHORT: ++ pixelData = ((DataBufferUShort) data).getData(); ++ break; ++ case DataBuffer.TYPE_INT: ++ pixelData = ((DataBufferInt) data).getData(); ++ break; ++ default: ++ // Seems like the only sensible thing to do. ++ throw new ClassCastException(); ++ } ++ ++ int inOffset = 0; ++ int dataOffset = scanlineStride*y + x + data.getOffset(); ++ for (int yy=y; yy<(y+h); yy++) ++ { ++ System.arraycopy(obj,inOffset,pixelData,dataOffset,w); ++ dataOffset += scanlineStride; ++ inOffset += w; ++ } ++ } ++ ++ + public void setDataElements(int x, int y, Object obj, DataBuffer data) + { + int offset = scanlineStride*y + x + data.getOffset(); +@@ -273,6 +374,39 @@ + data.setElem(offset, samples); + } + ++ /** ++ * This method implements a more efficient way to set pixels than the default ++ * implementation of the super class. It copies the pixel components directly ++ * from the input array instead of creating a intermediate buffer. ++ * @param x The x-coordinate of the pixel rectangle in obj. ++ * @param y The y-coordinate of the pixel rectangle in obj. ++ * @param w The width of the pixel rectangle in obj. ++ * @param h The height of the pixel rectangle in obj. ++ * @param obj The primitive array containing the pixels to set. ++ * @param data The DataBuffer to store the pixels into. ++ * @see java.awt.image.SampleModel#setPixels(int, int, int, int, int[], java.awt.image.DataBuffer) ++ */ ++ public void setPixels(int x, int y, int w, int h, int[] iArray, ++ DataBuffer data) ++ { ++ int inOffset = 0; ++ int[] pixel = new int[numBands]; ++ for (int yy=y; yy<(y+h); yy++) ++ { ++ int offset = scanlineStride*yy + x; ++ for (int xx=x; xx<(x+w); xx++) ++ { ++ int samples = 0; ++ for (int b=0; bThe purpose of this class is to serve as a facade over a number of ++ * classes which collectively represent the semantics of a button: the ++ * button's model, its listeners, its action, and its look and feel. Some ++ * parts of a button's state are stored explicitly in this class, other ++ * parts are delegates to the model. Some methods related to buttons are ++ * implemented in this class, other methods pass through to the current ++ * model or look and feel.

    ++ * ++ *

    Furthermore this class is supposed to serve as a base class for ++ * several kinds of buttons with similar but non-identical semantics: ++ * toggle buttons (radio buttons and checkboxes), simple "push" buttons, ++ * menu items.

    ++ * ++ *

    Buttons have many properties, some of which are stored in this class ++ * while others are delegated to the button's model. The following properties ++ * are available:

    ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Property Stored inBound?
    action button no
    actionCommand model no
    borderPainted button yes
    contentAreaFilled button yes
    disabledIcon button yes
    disabledSelectedIcon button yes
    displayedMnemonicIndex button no
    enabled model no
    focusPainted button yes
    horizontalAlignment button yes
    horizontalTextPosition button yes
    icon button yes
    iconTextGap button no
    label (same as text) model yes
    margin button yes
    multiClickThreshold button no
    pressedIcon button yes
    rolloverEnabled button yes
    rolloverIcon button yes
    rolloverSelectedIcon button yes
    selected model no
    selectedIcon button yes
    selectedObjects button no
    text model yes
    UI button yes
    verticalAlignment button yes
    verticalTextPosition button yes
    ++ * ++ *

    The various behavioral aspects of these properties follows:

    ++ * ++ *
      ++ * ++ *
    • When non-bound properties stored in the button change, the button ++ * fires ChangeEvents to its ChangeListeners.
    • ++ * ++ *
    • When bound properties stored in the button change, the button fires ++ * PropertyChangeEvents to its PropertyChangeListeners
    • ++ * ++ *
    • If any of the model's properties change, it fires a ChangeEvent to ++ * its ChangeListeners, which include the button.
    • ++ * ++ *
    • If the button receives a ChangeEvent from its model, it will ++ * propagate the ChangeEvent to its ChangeListeners, with the ChangeEvent's ++ * "source" property set to refer to the button, rather than the model. The ++ * the button will request a repaint, to paint its updated state.
    • ++ * ++ *
    • If the model's "selected" property changes, the model will fire an ++ * ItemEvent to its ItemListeners, which include the button, in addition to ++ * the ChangeEvent which models the property change. The button propagates ++ * ItemEvents directly to its ItemListeners.
    • ++ * ++ *
    • If the model's armed and pressed properties are simultaneously ++ * true, the model will fire an ActionEvent to its ++ * ActionListeners, which include the button. The button will propagate ++ * this ActionEvent to its ActionListeners, with the ActionEvent's "source" ++ * property set to refer to the button, rather than the model.
    • ++ * ++ *
    + * + * @author Ronald Veldema (rveldema@cs.vu.nl) ++ * @author Graydon Hoare (graydon@redhat.com) + */ ++ + public abstract class AbstractButton extends JComponent + implements ItemSelectable, SwingConstants + { +- Icon default_icon, pressed_button, disabled_button, +- selected_button, disabled_selected_button, current_icon; ++ private static final long serialVersionUID = -937921345538462020L; ++ ++ /** The icon displayed by default. */ ++ Icon default_icon; ++ ++ /** The icon displayed when the button is pressed. */ ++ Icon pressed_icon; ++ ++ /** The icon displayed when the button is disabled. */ ++ Icon disabeldIcon; ++ ++ /** The icon displayed when the button is selected. */ ++ Icon selectedIcon; ++ ++ /** The icon displayed when the button is selected but disabled. */ ++ Icon disabledSelectedIcon; ++ ++ /** The icon displayed when the button is rolled over. */ ++ Icon rolloverIcon; ++ ++ /** The icon displayed when the button is selected and rolled over. */ ++ Icon rolloverSelectedIcon; ++ ++ /** The icon currently displayed. */ ++ Icon current_icon; ++ ++ /** The text displayed in the button. */ + String text; + +- int vert_align = CENTER; +- int hori_align = CENTER; +- int hori_text_pos = CENTER; +- int vert_text_pos = CENTER; +- +- boolean paint_border = true, paint_focus; +- Action action_taken; +- ButtonModel model; ++ /** The gap between icon and text, if both icon and text are non-null. */ ++ int iconTextGap; ++ ++ /** The vertical alignment of the button's text and icon. */ ++ int verticalAlignment; ++ ++ /** The horizontal alignment of the button's text and icon. */ ++ int horizontalAlignment; ++ ++ /** The horizontal position of the button's text relative to its icon. */ ++ int horizontalTextPosition; ++ ++ /** The vertical position of the button's text relative to its icon. */ ++ int verticalTextPosition; ++ ++ /** Whether or not the button paints its border. */ ++ boolean borderPainted; ++ ++ /** Whether or not the button paints its focus state. */ ++ boolean focusPainted; ++ ++ /** Whether or not the button fills its content area. */ ++ boolean contentAreaFilled; ++ ++ /** Whether rollover is enabled. */ ++ boolean rollOverEnabled; ++ ++ /** The action taken when the button is clicked. */ ++ Action action; ++ ++ /** The button's current state. */ ++ protected ButtonModel model; ++ ++ /** The margin between the button's border and its label. */ + Insets margin; + ++ /** A hint to the look and feel class, suggesting which character in the ++ * button's label should be underlined when drawing the label. */ ++ int mnemonicIndex; ++ ++ /** Listener the button uses to receive ActionEvents from its model. */ ++ protected ActionListener actionListener; ++ ++ /** Listener the button uses to receive ItemEvents from its model. */ ++ protected ItemListener itemListener; ++ ++ /** Listener the button uses to receive ChangeEvents from its model. */ ++ protected ChangeListener changeListener; ++ ++ /** The time in miliseconds in which clicks get coalesced into a single ++ * ActionEvent. */ ++ long multiClickThreshhold; ++ ++ /** Listener the button uses to receive PropertyChangeEvents from its ++ Action. */ ++ PropertyChangeListener actionPropertyChangeListener; ++ ++ /** ChangeEvent that is fired to button's ChangeEventListeners */ ++ private ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ /** Fired in a PropertyChangeEvent when the "borderPainted" property changes. */ ++ public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted"; ++ ++ /** Fired in a PropertyChangeEvent when the "contentAreaFilled" property changes. */ ++ public static final String CONTENT_AREA_FILLED_CHANGED_PROPERTY = "contentAreaFilled"; ++ ++ /** Fired in a PropertyChangeEvent when the "disabledIcon" property changes. */ ++ public static final String DISABLED_ICON_CHANGED_PROPERTY = "disabledIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "disabledSelectedIcon" property changes. */ ++ public static final String DISABLED_SELECTED_ICON_CHANGED_PROPERTY = "disabledSelectedIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "focusPainted" property changes. */ + public static final String FOCUS_PAINTED_CHANGED_PROPERTY = "focusPainted"; + ++ /** Fired in a PropertyChangeEvent when the "horizontalAlignment" property changes. */ ++ public static final String HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY = "horizontalAlignment"; ++ ++ /** Fired in a PropertyChangeEvent when the "horizontalTextPosition" property changes. */ ++ public static final String HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY = "horizontalTextPosition"; ++ ++ /** Fired in a PropertyChangeEvent when the "icon" property changes. */ ++ public static final String ICON_CHANGED_PROPERTY = "icon"; ++ ++ /** Fired in a PropertyChangeEvent when the "margin" property changes. */ ++ public static final String MARGIN_CHANGED_PROPERTY = "margin"; ++ ++ /** Fired in a PropertyChangeEvent when the "mnemonic" property changes. */ ++ public static final String MNEMONIC_CHANGED_PROPERTY = "mnemonic"; ++ ++ /** Fired in a PropertyChangeEvent when the "model" property changes. */ ++ public static final String MODEL_CHANGED_PROPERTY = "model"; ++ ++ /** Fired in a PropertyChangeEvent when the "pressedIcon" property changes. */ ++ public static final String PRESSED_ICON_CHANGED_PROPERTY = "pressedIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "rolloverEnabled" property changes. */ ++ public static final String ROLLOVER_ENABLED_CHANGED_PROPERTY = "rolloverEnabled"; ++ ++ /** Fired in a PropertyChangeEvent when the "rolloverIcon" property changes. */ ++ public static final String ROLLOVER_ICON_CHANGED_PROPERTY = "rolloverIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "rolloverSelectedIcon" property changes. */ ++ public static final String ROLLOVER_SELECTED_ICON_CHANGED_PROPERTY = "rolloverSelectedIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "selectedIcon" property changes. */ ++ public static final String SELECTED_ICON_CHANGED_PROPERTY = "selectedIcon"; ++ ++ /** Fired in a PropertyChangeEvent when the "text" property changes. */ ++ public static final String TEXT_CHANGED_PROPERTY = "text"; ++ ++ /** Fired in a PropertyChangeEvent when the "verticalAlignment" property changes. */ ++ public static final String VERTICAL_ALIGNMENT_CHANGED_PROPERTY = "verticalAlignment"; ++ ++ /** Fired in a PropertyChangeEvent when the "verticalTextPosition" property changes. */ ++ public static final String VERTICAL_TEXT_POSITION_CHANGED_PROPERTY = "verticalTextPosition"; ++ + /** +- * AccessibleAbstractButton ++ * A Java Accessibility extension of the AbstractButton. + */ +- protected abstract class AccessibleAbstractButton +- extends AccessibleJComponent +- implements AccessibleAction, AccessibleValue, AccessibleText { +- +- /** +- * Constructor AccessibleAbstractButton +- * @param component TODO +- */ +- protected AccessibleAbstractButton(AbstractButton component) { +- super(component); +- // TODO +- } // AccessibleAbstractButton() +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleName +- * @returns String +- */ +- public String getAccessibleName() { +- return null; // TODO +- } // getAccessibleName() +- +- /** +- * getAccessibleIcon +- * @returns AccessibleIcon[] +- */ +- public AccessibleIcon[] getAccessibleIcon() { +- return null; // TODO +- } // getAccessibleIcon() +- +- /** +- * getAccessibleRelationSet +- * @returns AccessibleRelationSet +- */ +- public AccessibleRelationSet getAccessibleRelationSet() { +- return null; // TODO +- } // getAccessibleRelationSet() +- +- /** +- * getAccessibleAction +- * @returns AccessibleAction +- */ +- public AccessibleAction getAccessibleAction() { +- return null; // TODO +- } // getAccessibleAction() +- +- /** +- * getAccessibleValue +- * @returns AccessibleValue +- */ +- public AccessibleValue getAccessibleValue() { +- return null; // TODO +- } // getAccessibleValue() +- +- /** +- * getAccessibleActionCount +- * @returns int +- */ +- public int getAccessibleActionCount() { ++ protected abstract class AccessibleAbstractButton ++ extends AccessibleJComponent implements AccessibleAction, AccessibleValue, ++ AccessibleText ++ { ++ private static final long serialVersionUID = -5673062525319836790L; ++ ++ protected AccessibleAbstractButton() ++ { ++ } ++ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; // TODO ++ } ++ ++ public String getAccessibleName() ++ { ++ return null; // TODO ++ } ++ ++ public AccessibleIcon[] getAccessibleIcon() ++ { ++ return null; // TODO ++ } ++ ++ public AccessibleRelationSet getAccessibleRelationSet() ++ { ++ return null; // TODO ++ } ++ ++ public AccessibleAction getAccessibleAction() ++ { ++ return null; // TODO ++ } ++ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; // TODO ++ } ++ ++ public int getAccessibleActionCount() ++ { + return 0; // TODO +- } // getAccessibleActionCount() ++ } + +- /** +- * getAccessibleActionDescription +- * @param value0 TODO +- * @returns String +- */ +- public String getAccessibleActionDescription(int value0) { +- return null; // TODO +- } // getAccessibleActionDescription() +- +- /** +- * doAccessibleAction +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean doAccessibleAction(int value0) { ++ public String getAccessibleActionDescription(int value0) ++ { ++ return null; // TODO ++ } ++ ++ public boolean doAccessibleAction(int value0) ++ { + return false; // TODO +- } // doAccessibleAction() ++ } ++ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; // TODO ++ } + +- /** +- * getCurrentAccessibleValue +- * @returns Number +- */ +- public Number getCurrentAccessibleValue() { +- return null; // TODO +- } // getCurrentAccessibleValue() +- +- /** +- * setCurrentAccessibleValue +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean setCurrentAccessibleValue(Number value0) { ++ public boolean setCurrentAccessibleValue(Number value0) ++ { + return false; // TODO +- } // setCurrentAccessibleValue() ++ } + +- /** +- * getMinimumAccessibleValue +- * @returns Number +- */ +- public Number getMinimumAccessibleValue() { +- return null; // TODO +- } // getMinimumAccessibleValue() +- +- /** +- * getMaximumAccessibleValue +- * @returns Number +- */ +- public Number getMaximumAccessibleValue() { +- return null; // TODO +- } // getMaximumAccessibleValue() +- +- /** +- * getAccessibleText +- * @returns AccessibleText +- */ +- public AccessibleText getAccessibleText() { +- return null; // TODO +- } // getAccessibleText() +- +- /** +- * getIndexAtPoint +- * @param value0 TODO +- * @returns int +- */ +- public int getIndexAtPoint(Point value0) { +- return 0; // TODO +- } // getIndexAtPoint() ++ public Number getMinimumAccessibleValue() ++ { ++ return null; // TODO ++ } + +- /** +- * getCharacterBounds +- * @param value0 TODO +- * @returns Rectangle +- */ +- public Rectangle getCharacterBounds(int value0) { +- return null; // TODO +- } // getCharacterBounds() +- +- /** +- * getCharCount +- * @returns int +- */ +- public int getCharCount() { +- return 0; // TODO +- } // getCharCount() ++ public Number getMaximumAccessibleValue() ++ { ++ return null; // TODO ++ } + +- /** +- * getCaretPosition +- * @returns int +- */ +- public int getCaretPosition() { ++ public AccessibleText getAccessibleText() ++ { ++ return null; // TODO ++ } ++ ++ public int getIndexAtPoint(Point value0) ++ { + return 0; // TODO +- } // getCaretPosition() ++ } ++ ++ public Rectangle getCharacterBounds(int value0) ++ { ++ return null; // TODO ++ } + +- /** +- * getAtIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getAtIndex(int value0, int value1) { +- return null; // TODO +- } // getAtIndex() +- +- /** +- * getAfterIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getAfterIndex(int value0, int value1) { +- return null; // TODO +- } // getAfterIndex() +- +- /** +- * getBeforeIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getBeforeIndex(int value0, int value1) { +- return null; // TODO +- } // getBeforeIndex() +- +- /** +- * getCharacterAttribute +- * @param value0 TODO +- * @returns AttributeSet +- */ +- public AttributeSet getCharacterAttribute(int value0) { +- return null; // TODO +- } // getCharacterAttribute() +- +- /** +- * getSelectionStart +- * @returns int +- */ +- public int getSelectionStart() { ++ public int getCharCount() ++ { + return 0; // TODO +- } // getSelectionStart() ++ } + +- /** +- * getSelectionEnd +- * @returns int +- */ +- public int getSelectionEnd() { ++ public int getCaretPosition() ++ { + return 0; // TODO +- } // getSelectionEnd() ++ } + +- /** +- * getSelectedText +- * @returns String +- */ +- public String getSelectedText() { ++ public String getAtIndex(int value0, int value1) ++ { + return null; // TODO +- } // getSelectedText() ++ } + +- /** +- * getTextRectangle +- * @returns Rectangle +- */ +- private Rectangle getTextRectangle() { ++ public String getAfterIndex(int value0, int value1) ++ { + return null; // TODO +- } // getTextRectangle() +- +- +- } // AccessibleAbstractButton ++ } + ++ public String getBeforeIndex(int value0, int value1) ++ { ++ return null; // TODO ++ } + +- static private class JFocusListener implements FocusListener +- { +- AbstractButton c; ++ public AttributeSet getCharacterAttribute(int value0) ++ { ++ return null; // TODO ++ } + +- JFocusListener(AbstractButton c) ++ public int getSelectionStart() + { +- this.c = c; ++ return 0; // TODO + } + +- public void focusLost(FocusEvent event) ++ public int getSelectionEnd() + { +- c.getModel().setArmed(false); ++ return 0; // TODO ++ } + +- System.out.println("LOST FOCUS"); +- if (c.isFocusPainted()) +- { +- c.repaint(); +- } ++ public String getSelectedText() ++ { ++ return null; // TODO + } +- public void focusGained(FocusEvent event) ++ ++ private Rectangle getTextRectangle() + { +- System.out.println("GAIN FOCUS"); ++ return null; // TODO + } +- } ++ } ++ + +- AbstractButton() ++ /** ++ * Creates a new AbstractButton object. ++ */ ++ public AbstractButton() + { + this("",null); + } + +- AbstractButton(String text, +- Icon icon) ++ /** ++ * Creates a new AbstractButton object. ++ * ++ * @param txt Value to use for the button's "text" property ++ * @param icon Value to use for the button's "defaultIcon" property ++ */ ++ AbstractButton(String txt, Icon icon) + { +- this.text = text; +- setIcon(icon); +- +- setAlignmentX(LEFT_ALIGNMENT); +- setAlignmentY(CENTER_ALIGNMENT); ++ init (txt, icon); ++ updateUI(); ++ } + +- addFocusListener( new JFocusListener(this) ); ++ /** ++ * Get the model the button is currently using. ++ * ++ * @return The current model ++ */ ++ public ButtonModel getModel() ++ { ++ return model; ++ } + +- setModel(new DefaultButtonModel(this)); ++ /** ++ * Set the model the button is currently using. This un-registers all ++ * listeners associated with the current model, and re-registers them ++ * with the new model. ++ * ++ * @param newModel The new model ++ */ ++ public void setModel(ButtonModel newModel) ++ { ++ if (newModel == model) ++ return; + +- updateUI(); // get a proper ui ++ if (model != null) ++ { ++ model.removeActionListener(actionListener); ++ model.removeChangeListener(changeListener); ++ model.removeItemListener(itemListener); ++ } ++ ButtonModel old = model; ++ model = newModel; ++ if (model != null) ++ { ++ model.addActionListener(actionListener); ++ model.addChangeListener(changeListener); ++ model.addItemListener(itemListener); ++ } ++ firePropertyChange(MODEL_CHANGED_PROPERTY, old, model); ++ revalidate(); ++ repaint(); + } + +- public ButtonModel getModel() +- { return model; } ++ protected void init(String text, Icon icon) ++ { ++ this.text = text; ++ default_icon = icon; ++ model = new DefaultButtonModel(); ++ actionListener = createActionListener(); ++ changeListener = createChangeListener(); ++ itemListener = createItemListener(); ++ ++ model.addActionListener(actionListener); ++ model.addChangeListener(changeListener); ++ model.addItemListener(itemListener); ++ ++ horizontalAlignment = CENTER; ++ horizontalTextPosition = TRAILING; ++ verticalAlignment = CENTER; ++ verticalTextPosition = CENTER; ++ borderPainted = true; ++ contentAreaFilled = true; + +- public void setModel(ButtonModel newModel) +- { model = newModel; } ++ focusPainted = true; ++ setFocusable(true); + ++ setAlignmentX(LEFT_ALIGNMENT); ++ setAlignmentY(CENTER_ALIGNMENT); ++ ++ setDisplayedMnemonicIndex(-1); ++ } ++ ++ /** ++ * Get the action command string for this button's model. ++ * ++ * @return The current action command string from the button's model ++ */ + public String getActionCommand() +- { return getModel().getActionCommand(); } ++ { ++ return getModel().getActionCommand(); ++ } + ++ /** ++ * Set the action command string for this button's model. ++ * ++ * @param aCommand The new action command string to set in the button's ++ * model. ++ */ + public void setActionCommand(String aCommand) +- { getModel().setActionCommand(aCommand); } ++ { ++ getModel().setActionCommand(aCommand); ++ } + ++ /** ++ * Adds an ActionListener to the button's listener list. When the ++ * button's model is clicked it fires an ActionEvent, and these ++ * listeners will be called. ++ * ++ * @param l The new listener to add ++ */ + public void addActionListener(ActionListener l) +- { getModel().addActionListener(l); } ++ { ++ listenerList.add(ActionListener.class, l); ++ } + ++ /** ++ * Removes an ActionListener from the button's listener list. ++ * ++ * @param l The listener to remove ++ */ + public void removeActionListener(ActionListener l) +- { getModel().removeActionListener(l); } ++ { ++ listenerList.remove(ActionListener.class, l); ++ } ++ ++ /** ++ * Returns all added ActionListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public ActionListener[] getActionListeners() ++ { ++ return (ActionListener[]) listenerList.getListeners(ActionListener.class); ++ } + ++ /** ++ * Adds an ItemListener to the button's listener list. When the button's ++ * model changes state (between any of ARMED, ENABLED, PRESSED, ROLLOVER ++ * or SELECTED) it fires an ItemEvent, and these listeners will be ++ * called. ++ * ++ * @param l The new listener to add ++ */ ++ public void addItemListener(ItemListener l) ++ { ++ listenerList.add(ItemListener.class, l); ++ } ++ ++ /** ++ * Removes an ItemListener from the button's listener list. ++ * ++ * @param l The listener to remove ++ */ ++ public void removeItemListener(ItemListener l) ++ { ++ listenerList.remove(ItemListener.class, l); ++ } ++ ++ /** ++ * Returns all added ItemListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public ItemListener[] getItemListeners() ++ { ++ return (ItemListener[]) listenerList.getListeners(ItemListener.class); ++ } ++ ++ /** ++ * Adds a ChangeListener to the button's listener list. When the button's ++ * model changes any of its (non-bound) properties, these listeners will be ++ * called. ++ * ++ * @param l The new listener to add ++ */ + public void addChangeListener(ChangeListener l) +- { getModel().addChangeListener(l); } ++ { ++ listenerList.add(ChangeListener.class, l); ++ } + ++ /** ++ * Removes a ChangeListener from the button's listener list. ++ * ++ * @param l The listener to remove ++ */ + public void removeChangeListener(ChangeListener l) +- { getModel().removeChangeListener(l); } ++ { ++ listenerList.remove(ChangeListener.class, l); ++ } + +- public void addItemListener(ItemListener l) +- { getModel().addItemListener(l); } ++ /** ++ * Returns all added ChangeListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } + +- public void removeItemListener(ItemListener l) +- { getModel().removeItemListener(l); } ++ /** ++ * Calls {@link ItemListener.itemStateChanged} on each ItemListener in ++ * the button's listener list. ++ * ++ * @param e The event signifying that the button's model changed state ++ */ ++ public void fireItemStateChanged(ItemEvent e) ++ { ++ e.setSource(this); ++ ItemListener[] listeners = getItemListeners(); ++ ++ for (int i = 0; i < listeners.length; i++) ++ listeners[i].itemStateChanged(e); ++ } + +- public int getHorizontalAlignment() +- { return hori_align; } ++ /** ++ * Calls {@link ActionListener.actionPerformed} on each {@link ++ * ActionListener} in the button's listener list. ++ * ++ * @param e The event signifying that the button's model was clicked ++ */ ++ public void fireActionPerformed(ActionEvent e) ++ { ++ e.setSource(this); ++ ActionListener[] listeners = getActionListeners(); ++ ++ for (int i = 0; i < listeners.length; i++) ++ listeners[i].actionPerformed(e); ++ } + +- public int getHorizontalTextPosition() +- { return hori_text_pos; } ++ /** ++ * Calls {@link ChangeEvent.stateChanged} on each {@link ChangeListener} ++ * in the button's listener list. ++ * ++ * @param e The event signifying a change in one of the (non-bound) ++ * properties of the button's model. ++ */ ++ public void fireStateChanged(ChangeEvent e) ++ { ++ ChangeListener[] listeners = getChangeListeners(); + +- public int getVerticalAlignment() +- { return vert_align; } ++ for (int i = 0; i < listeners.length; i++) ++ listeners[i].stateChanged(changeEvent); ++ } + +- public int getVerticalTextPosition() +- { return vert_text_pos; } ++ /** ++ * Get the current keyboard mnemonic value. This value corresponds to a ++ * single key code (one of the {@link java.awt.event.KeyEvent} VK_* ++ * codes) and is used to activate the button when pressed in conjunction ++ * with the "mouseless modifier" of the button's look and feel class, and ++ * when focus is in one of the button's ancestors. ++ * ++ * @return The button's current keyboard mnemonic ++ */ ++ public int getMnemonic() ++ { ++ return getModel().getMnemonic(); ++ } ++ ++ /** ++ * Set the current keyboard mnemonic value. This value corresponds to a ++ * single key code (one of the {@link java.awt.event.KeyEvent} VK_* ++ * codes) and is used to activate the button when pressed in conjunction ++ * with the "mouseless modifier" of the button's look and feel class, and ++ * when focus is in one of the button's ancestors. ++ * ++ * @param mne A new mnemonic to use for the button ++ */ ++ public void setMnemonic(char mne) ++ { ++ setMnemonic((int) mne); ++ } ++ ++ /** ++ * Set the current keyboard mnemonic value. This value corresponds to a ++ * single key code (one of the {@link java.awt.event.KeyEvent} VK_* ++ * codes) and is used to activate the button when pressed in conjunction ++ * with the "mouseless modifier" of the button's look and feel class, and ++ * when focus is in one of the button's ancestors. ++ * ++ * @param mne A new mnemonic to use for the button ++ */ ++ public void setMnemonic(int mne) ++ { ++ int old = getModel().getMnemonic(); ++ ++ if (old != mne) ++ { ++ getModel().setMnemonic(mne); ++ ++ if (text != null && ! text.equals("")) ++ { ++ // Since lower case char = upper case char for ++ // mnemonic, we will convert both text and mnemonic ++ // to upper case before checking if mnemonic character occurs ++ // in the menu item text. ++ int upperCaseMne = Character.toUpperCase((char) mne); ++ String upperCaseText = text.toUpperCase(); ++ setDisplayedMnemonicIndex(upperCaseText.indexOf(upperCaseMne)); ++ } ++ ++ firePropertyChange(MNEMONIC_CHANGED_PROPERTY, old, mne); ++ revalidate(); ++ repaint(); ++ } ++ } + +- protected void fireItemStateChanged(ItemEvent event) ++ /** ++ * Sets the button's mnemonic index. The mnemonic index is a hint to the ++ * look and feel class, suggesting which character in the button's label ++ * should be underlined when drawing the label. If the mnemonic index is ++ * -1, no mnemonic will be displayed. ++ * ++ * If no mnemonic index is set, the button will choose a mnemonic index ++ * by default, which will be the first occurrence of the mnemonic ++ * character in the button's text. ++ * ++ * @param index An offset into the "text" property of the button ++ * @throws IllegalArgumentException If index is not within the ++ * range of legal offsets for the "text" property of the button. ++ * @since 1.4 ++ */ ++ ++ public void setDisplayedMnemonicIndex(int index) + { ++ if (index < -1 || (text != null && index >= text.length())) ++ throw new IllegalArgumentException(); ++ else ++ mnemonicIndex = index; + } + +- protected void fireStateChanged(ChangeEvent event) ++ /** ++ * Get the button's mnemonic index, which is an offset into the button's ++ * "text" property. The character specified by this offset should be ++ * underlined when the look and feel class draws this button. ++ * ++ * @return An index into the button's "text" property ++ */ ++ public int getDisplayedMnemonicIndex() + { ++ return mnemonicIndex; + } + +- protected void fireActionPerformed(ActionEvent event) ++ ++ /** ++ * Set the "rolloverEnabled" property. When rollover is enabled, and the ++ * look and feel supports it, the button will change its icon to ++ * rolloverIcon, when the mouse passes over it. ++ * ++ * @param r Whether or not to enable rollover icon changes ++ */ ++ public void setRolloverEnabled(boolean r) + { ++ if (rollOverEnabled != r) ++ { ++ rollOverEnabled = r; ++ firePropertyChange(ROLLOVER_ENABLED_CHANGED_PROPERTY, !r, r); ++ revalidate(); ++ repaint(); ++ } + } + +- public void setVerticalAlignment(int alignment) +- { vert_align = alignment; } ++ /** ++ * Returns whether or not rollover icon changes are enabled on the ++ * button. ++ * ++ * @return The state of the "rolloverEnabled" property ++ */ ++ public boolean isRolloverEnabled() ++ { ++ return rollOverEnabled; ++ } + +- public void setHorizontalAlignment(int alignment) +- { hori_align = alignment; } ++ /** ++ * Set the value of the button's "selected" property. Selection is only ++ * meaningful for toggle-type buttons (check boxes, radio buttons). ++ * ++ * @param s New value for the property ++ */ ++ public void setSelected(boolean s) ++ { ++ getModel().setSelected(s); ++ } + +- public void setVerticalTextPosition(int textPosition) +- { vert_text_pos = textPosition; } ++ /** ++ * Get the value of the button's "selected" property. Selection is only ++ * meaningful for toggle-type buttons (check boxes, radio buttons). ++ * ++ * @return The value of the property ++ */ ++ public boolean isSelected() ++ { ++ return getModel().isSelected(); ++ } + +- public void setHorizontalTextPosition(int textPosition) +- { hori_text_pos = textPosition; } ++ /** ++ * Enables or disables the button. A button will neither be selectable ++ * nor preform any actions unless it is enabled. ++ * ++ * @param b Whether or not to enable the button ++ */ ++ public void setEnabled(boolean b) ++ { ++ super.setEnabled(b); ++ getModel().setEnabled(b); ++ } + +- public int getMnemonic() +- { return getModel().getMnemonic(); } ++ /** ++ * Set the horizontal alignment of the button's text and icon. The ++ * alignment is a numeric constant from {@link SwingConstants}. It must ++ * be one of: RIGHT, LEFT, CENTER, ++ * LEADING or TRAILING. The default is ++ * RIGHT. ++ * ++ * @return The current horizontal alignment ++ */ ++ public int getHorizontalAlignment() ++ { ++ return horizontalAlignment; ++ } + +- public void setMnemonic(char mne) +- { getModel().setMnemonic(mne); } ++ /** ++ * Set the horizontal alignment of the button's text and icon. The ++ * alignment is a numeric constant from {@link SwingConstants}. It must ++ * be one of: RIGHT, LEFT, CENTER, ++ * LEADING or TRAILING. The default is ++ * RIGHT. ++ * ++ * @param a The new horizontal alignment ++ * @throws IllegalArgumentException If alignment is not one of the legal ++ * constants. ++ */ ++ public void setHorizontalAlignment(int a) ++ { ++ int old = horizontalAlignment; ++ horizontalAlignment = a; ++ if (old != a) ++ { ++ firePropertyChange(HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY, old, a); ++ revalidate(); ++ repaint(); ++ } ++ } + +- public void setMnemonic(int mne) +- { getModel().setMnemonic(mne); } ++ /** ++ * Get the horizontal position of the button's text relative to its ++ * icon. The position is a numeric constant from {@link ++ * SwingConstants}. It must be one of: RIGHT, ++ * LEFT, CENTER, LEADING or ++ * TRAILING. The default is TRAILING. ++ * ++ * @return The current horizontal text position ++ */ ++ public int getHorizontalTextPosition() ++ { ++ return horizontalTextPosition; ++ } + +- public void setRolloverEnabled(boolean b) +- { getModel().setRollover(b); } ++ /** ++ * Set the horizontal position of the button's text relative to its ++ * icon. The position is a numeric constant from {@link ++ * SwingConstants}. It must be one of: RIGHT, ++ * LEFT, CENTER, LEADING or ++ * TRAILING. The default is TRAILING. ++ * ++ * @param t The new horizontal text position ++ * @throws IllegalArgumentException If position is not one of the legal ++ * constants. ++ */ ++ public void setHorizontalTextPosition(int t) ++ { ++ int old = horizontalTextPosition; ++ horizontalTextPosition = t; ++ if (old != t) ++ { ++ firePropertyChange(HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY, old, t); ++ revalidate(); ++ repaint(); ++ } ++ } + +- public boolean isRolloverEnabled() +- { return getModel().isRollover(); } ++ /** ++ * Get the vertical alignment of the button's text and icon. The ++ * alignment is a numeric constant from {@link SwingConstants}. It must ++ * be one of: CENTER, TOP, or ++ * BOTTOM. The default is CENTER. ++ * ++ * @return The current vertical alignment ++ */ ++ public int getVerticalAlignment() ++ { ++ return verticalAlignment; ++ } + ++ /** ++ * Set the vertical alignment of the button's text and icon. The ++ * alignment is a numeric constant from {@link SwingConstants}. It must ++ * be one of: CENTER, TOP, or ++ * BOTTOM. The default is CENTER. ++ * ++ * @param a The new vertical alignment ++ * @throws IllegalArgumentException If alignment is not one of the legal ++ * constants. ++ */ ++ public void setVerticalAlignment(int a) ++ { ++ int old = verticalAlignment; ++ verticalAlignment = a; ++ if (old != a) ++ { ++ firePropertyChange(VERTICAL_ALIGNMENT_CHANGED_PROPERTY, old, a); ++ revalidate(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * Get the vertical position of the button's text relative to its ++ * icon. The alignment is a numeric constant from {@link ++ * SwingConstants}. It must be one of: CENTER, ++ * TOP, or BOTTOM. The default is ++ * CENTER. ++ * ++ * @return The current vertical position ++ */ ++ public int getVerticalTextPosition() ++ { ++ return verticalTextPosition; ++ } ++ ++ /** ++ * Set the vertical position of the button's text relative to its ++ * icon. The alignment is a numeric constant from {@link ++ * SwingConstants}. It must be one of: CENTER, ++ * TOP, or BOTTOM. The default is ++ * CENTER. ++ * ++ * @param t The new vertical position ++ * @throws IllegalArgumentException If position is not one of the legal ++ * constants. ++ */ ++ public void setVerticalTextPosition(int t) ++ { ++ int old = verticalTextPosition; ++ verticalTextPosition = t; ++ if (old != t) ++ { ++ firePropertyChange(VERTICAL_TEXT_POSITION_CHANGED_PROPERTY, old, t); ++ revalidate(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * Set the value of the "borderPainted" property. If set to ++ * false, the button's look and feel class should not paint ++ * a border for the button. The default is true. ++ * ++ * @return The current value of the property. ++ */ + public boolean isBorderPainted() +- { return paint_border; } ++ { ++ return borderPainted; ++ } + ++ /** ++ * Set the value of the "borderPainted" property. If set to ++ * false, the button's look and feel class should not paint ++ * a border for the button. The default is true. ++ * ++ * @param b The new value of the property. ++ */ + public void setBorderPainted(boolean b) + { +- if (b != paint_border) ++ boolean old = borderPainted; ++ borderPainted = b; ++ if (b != old) + { +- paint_border = b; ++ firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, old, b); + revalidate(); + repaint(); + } + } + ++ /** ++ * Get the value of the "action" property. ++ * ++ * @return The current value of the "action" property ++ */ + public Action getAction() +- { return action_taken; } ++ { ++ return action; ++ } + ++ /** ++ *

    Set the button's "action" property, subscribing the new action to the ++ * button, as an ActionListener, if it is not already subscribed. The old ++ * Action, if it exists, is unsubscribed, and the button is unsubscribed ++ * from the old Action if it was previously subscribed as a ++ * PropertyChangeListener.

    ++ * ++ *

    This method also configures several of the button's properties from ++ * the Action, by calling {@link configurePropertiesFromAction}, and ++ * subscribes the button to the Action as a PropertyChangeListener. ++ * Subsequent changes to the Action will thus reconfigure the button ++ * automatically.

    ++ * ++ * @param a The new value of the "action" property ++ */ + public void setAction(Action a) + { +- action_taken = a; +- revalidate(); +- repaint(); +- } ++ if (action != null) ++ { ++ action.removePropertyChangeListener(actionPropertyChangeListener); ++ removeActionListener(action); ++ if (actionPropertyChangeListener != null) ++ { ++ action.removePropertyChangeListener(actionPropertyChangeListener); ++ actionPropertyChangeListener = null; ++ } + +- public void setSelected(boolean b) +- { getModel().setSelected(b); } + +- public boolean isSelected() +- { return getModel().isSelected(); } ++ } ++ + +- public Icon getIcon() +- { return default_icon; } ++ Action old = action; ++ action = a; ++ configurePropertiesFromAction(action); ++ if (action != null) ++ { ++ actionPropertyChangeListener = createActionPropertyChangeListener(a); ++ action.addPropertyChangeListener(actionPropertyChangeListener); ++ addActionListener(action); ++ } ++ } + +- public void setIcon(Icon defaultIcon) ++ /** ++ * Return the button's default "icon" property. ++ * ++ * @return The current default icon ++ */ ++ public Icon getIcon() + { +- if (default_icon == defaultIcon) +- return; ++ return default_icon; ++ } + +- default_icon = defaultIcon; +- if (default_icon != null) ++ /** ++ * Set the button's default "icon" property. This icon is used as a basis ++ * for the pressed and disabled icons, if none are explicitly set. ++ * ++ * @param i The new default icon ++ */ ++ public void setIcon(Icon i) ++ { ++ if (default_icon != i) + { +- // XXX FIXME - icons do not know their parent +- // default_icon.setParent(this); +- } ++ Icon old = default_icon; ++ default_icon = i; ++ firePropertyChange(ICON_CHANGED_PROPERTY, old, i); + revalidate(); + repaint(); ++ } + } + ++ /** ++ * Return the button's "text" property. This property is synonymous with ++ * the "label" property. ++ * ++ * @return The current "text" property ++ */ + public String getText() +- { return text; } ++ { ++ return text; ++ } + ++ /** ++ * Set the button's "label" property. This property is synonymous with the ++ * "text" property. ++ * ++ * @param label The new "label" property ++ */ + public void setLabel(String label) +- { setText(label); } ++ { ++ setText(label); ++ } + ++ /** ++ * Return the button's "label" property. This property is synonymous with ++ * the "text" property. ++ * ++ * @return The current "label" property ++ */ + public String getLabel() +- { return getText(); } ++ { ++ return getText(); ++ } + +- public void setText(String text) ++ /** ++ * Set the button's "text" property. This property is synonymous with the ++ * "label" property. ++ * ++ * @param t The new "text" property ++ */ ++ public void setText(String t) + { +- this.text = text; ++ String old = text; ++ text = t; ++ if (t != old) ++ { ++ firePropertyChange(TEXT_CHANGED_PROPERTY, old, t); + revalidate(); + repaint(); + } ++ } ++ ++ /** ++ * Set the value of the {@link #iconTextGap} property. ++ * ++ * @param i The new value of the property ++ */ ++ public void setIconTextGap(int i) ++ { ++ int old = iconTextGap; ++ iconTextGap = i; ++ if (old != i) ++ { ++ fireStateChanged(new ChangeEvent(this)); ++ revalidate(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * Get the value of the {@link #iconTextGap} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getIconTextGap() ++ { ++ return iconTextGap; ++ } + ++ /** ++ * Return the button's "margin" property, which is an {@link Insets} object ++ * describing the distance between the button's border and its text and ++ * icon. ++ * ++ * @return The current "margin" property ++ */ + public Insets getMargin() +- { return margin; } ++ { ++ return margin; ++ } + ++ /** ++ * Set the button's "margin" property, which is an {@link Insets} object ++ * describing the distance between the button's border and its text and ++ * icon. ++ * ++ * @param m The new "margin" property ++ */ + public void setMargin(Insets m) + { ++ Insets old = margin; + margin = m; +- revalidate(); ++ if (m != old) ++ { ++ firePropertyChange(MARGIN_CHANGED_PROPERTY, old, m); ++ revalidate(); + repaint(); + } +- +- public void setEnabled(boolean b) +- { +- super.setEnabled(b); +- getModel().setEnabled(b); +- repaint(); + } + ++ /** ++ * Return the button's "pressedIcon" property. The look and feel class ++ * should paint this icon when the "pressed" property of the button's ++ * {@link ButtonModel} is true. This property may be ++ * null, in which case the default icon is used. ++ * ++ * @return The current "pressedIcon" property ++ */ + public Icon getPressedIcon() +- { return pressed_button; } ++ { ++ return pressed_icon; ++ } + ++ /** ++ * Set the button's "pressedIcon" property. The look and feel class ++ * should paint this icon when the "pressed" property of the button's ++ * {@link ButtonModel} is true. This property may be ++ * null, in which case the default icon is used. ++ * ++ * @param pressedIcon The new "pressedIcon" property ++ */ + public void setPressedIcon(Icon pressedIcon) + { +- pressed_button = pressedIcon; ++ Icon old = pressed_icon; ++ pressed_icon = pressedIcon; ++ if (pressed_icon != old) ++ { ++ firePropertyChange(PRESSED_ICON_CHANGED_PROPERTY, old, pressed_icon); + revalidate(); + repaint(); + } ++ } + ++ /** ++ * Return the button's "disabledIcon" property. The look and feel class ++ * should paint this icon when the "enabled" property of the button's ++ * {@link ButtonModel} is false. This property may be ++ * null, in which case an icon is constructed, based on the ++ * default icon. ++ * ++ * @return The current "disabledIcon" property ++ */ + public Icon getDisabledIcon() +- { return disabled_button; } ++ { ++ if (disabeldIcon == null ++ && default_icon instanceof ImageIcon) ++ disabeldIcon = new ImageIcon(GrayFilter.createDisabledImage(((ImageIcon) default_icon).getImage())); ++ ++ return disabeldIcon; ++ } + +- public void setDisabledIcon(Icon disabledIcon) ++ /** ++ * Set the button's "disabledIcon" property. The look and feel class should ++ * paint this icon when the "enabled" property of the button's {@link ++ * ButtonModel} is false. This property may be ++ * null, in which case an icon is constructed, based on the ++ * default icon. ++ * ++ * @param disabledIcon The new "disabledIcon" property ++ */ ++ public void setDisabledIcon(Icon d) + { +- disabled_button = disabledIcon; ++ disabeldIcon = d; + revalidate(); + repaint(); + } + ++ /** ++ * Return the button's "paintFocus" property. This property controls ++ * whether or not the look and feel class will paint a special indicator ++ * of focus state for the button. If it is false, the button still paints ++ * when focused, but no special decoration is painted to indicate the ++ * presence of focus. ++ * ++ * @return The current "paintFocus" property ++ */ + public boolean isFocusPainted() +- { return paint_focus; } ++ { ++ return focusPainted; ++ } + +- public void setFocusPainted(boolean b) ++ /** ++ * Set the button's "paintFocus" property. This property controls whether ++ * or not the look and feel class will paint a special indicator of focus ++ * state for the button. If it is false, the button still paints when ++ * focused, but no special decoration is painted to indicate the presence ++ * of focus. ++ * ++ * @param b The new "paintFocus" property ++ */ ++ public void setFocusPainted(boolean p) + { +- boolean old = paint_focus; +- paint_focus = b; ++ boolean old = focusPainted; ++ focusPainted = p; + +- firePropertyChange(FOCUS_PAINTED_CHANGED_PROPERTY, +- old, +- b); +- if (hasFocus()) ++ if (old != focusPainted) + { ++ firePropertyChange(FOCUS_PAINTED_CHANGED_PROPERTY, old, p); + revalidate(); + repaint(); + } + } + ++ /** ++ * Return the button's "focusTraversable" property. This property controls ++ * whether or not the button can receive focus when the user attempts to ++ * traverse the focus hierarchy. ++ * ++ * @return The current "focusTraversable" property ++ */ + public boolean isFocusTraversable() + { +- //Identifies whether or not this component can receive the focus. + return true; + } + +- ++ /** ++ * Verifies that a particular key is one of the valid constants used for ++ * describing horizontal alignment and positioning. The valid constants ++ * are the following members of {@link SwingConstants}: ++ * RIGHT, LEFT, CENTER, ++ * LEADING or TRAILING. ++ * ++ * @param key The key to check ++ * @param exception A message to include in an IllegalArgumentException ++ * ++ * @return the value of key ++ * ++ * @throws IllegalArgumentException If key is not one of the valid constants ++ * ++ * @see setHorizontalTextPosition() ++ * @see setHorizontalAlignment() ++ */ + protected int checkHorizontalKey(int key, String exception) + { +- // Verify that key is a legal value for the horizontalAlignment properties. +- return 0; ++ switch (key) ++ { ++ case SwingConstants.RIGHT: ++ case SwingConstants.LEFT: ++ case SwingConstants.CENTER: ++ case SwingConstants.LEADING: ++ case SwingConstants.TRAILING: ++ break; ++ default: ++ throw new IllegalArgumentException(exception); ++ } ++ return key; + } + ++ /** ++ * Verifies that a particular key is one of the valid constants used for ++ * describing vertical alignment and positioning. The valid constants are ++ * the following members of {@link SwingConstants}: TOP, ++ * BOTTOM or CENTER. ++ * ++ * @param key The key to check ++ * @param exception A message to include in an IllegalArgumentException ++ * ++ * @return the value of key ++ * ++ * @throws IllegalArgumentException If key is not one of the valid constants ++ * ++ * @see setVerticalTextPosition() ++ * @see setVerticalAlignment() ++ */ + protected int checkVerticalKey(int key, String exception) + { +- // Ensures that the key is a valid. +- return 0; ++ switch (key) ++ { ++ case SwingConstants.TOP: ++ case SwingConstants.BOTTOM: ++ case SwingConstants.CENTER: ++ break; ++ default: ++ throw new IllegalArgumentException(exception); ++ } ++ return key; + } + ++ /** ++ * Configure various properties of the button by reading properties ++ * of an {@link Action}. The mapping of properties is as follows: ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Action keyed property AbstractButton property
    NAME text
    SMALL_ICON icon
    SHORT_DESCRIPTION toolTipText
    MNEMONIC_KEY mnemonic
    ACTION_COMMAND_KEY actionCommand
    ++ * ++ *

    In addition, this method always sets the button's "enabled" property to ++ * the value of the Action's "enabled" property.

    ++ * ++ *

    If the provided Action is null, the text, icon, and ++ * toolTipText properties of the button are set to null, and ++ * the "enabled" property is set to true; the mnemonic and ++ * actionCommand properties are unchanged.

    ++ * ++ * @param a An Action to configure the button from ++ */ + protected void configurePropertiesFromAction(Action a) + { +- //Factory method which sets the ActionEvent source's properties according to values from the Action instance. ++ if (a == null) ++ { ++ setText(null); ++ setIcon(null); ++ setEnabled(true); ++ setToolTipText(null); ++ } ++ else ++ { ++ setText((String)(a.getValue(Action.NAME))); ++ setIcon((Icon)(a.getValue(Action.SMALL_ICON))); ++ setEnabled(a.isEnabled()); ++ setToolTipText((String)(a.getValue(Action.SHORT_DESCRIPTION))); ++ if (a.getValue(Action.MNEMONIC_KEY) != null) ++ setMnemonic(((Integer)(a.getValue(Action.MNEMONIC_KEY))).intValue()); ++ String actionCommand = (String)(a.getValue(Action.ACTION_COMMAND_KEY)); ++ ++ // Set actionCommand to button's text by default if it is not specified ++ if (actionCommand != null) ++ setActionCommand((String)(a.getValue(Action.ACTION_COMMAND_KEY))); ++ else ++ setActionCommand(getText()); ++ } + } + ++ /** ++ *

    A factory method which should return an {@link ActionListener} that ++ * propagates events from the button's {@link ButtonModel} to any of the ++ * button's ActionListeners. By default, this is an inner class which ++ * calls {@link AbstractButton.fireActionPerformed} with a modified copy ++ * of the incoming model {@link ActionEvent}.

    ++ * ++ *

    The button calls this method during construction, stores the ++ * resulting ActionListener in its actionListener member ++ * field, and subscribes it to the button's model. If the button's model ++ * is changed, this listener is unsubscribed from the old model and ++ * subscribed to the new one.

    ++ * ++ * @return A new ActionListener ++ */ + protected ActionListener createActionListener() + { + return new ActionListener() + { +- public void actionPerformed(ActionEvent e) { } ++ public void actionPerformed(ActionEvent e) ++ { ++ AbstractButton.this.fireActionPerformed(e); ++ } + }; + } + ++ /** ++ *

    A factory method which should return a {@link PropertyChangeListener} ++ * that accepts changes to the specified {@link Action} and reconfigure ++ * the {@link AbstractButton}, by default using the {@link ++ * configurePropertiesFromAction} method.

    ++ * ++ *

    The button calls this method whenever a new Action is assigned to ++ * the button's "action" property, via {@link setAction}, and stores the ++ * resulting PropertyChangeListener in its ++ * actionPropertyChangeListener member field. The button ++ * then subscribes the listener to the button's new action. If the ++ * button's action is changed subsequently, the listener is unsubscribed ++ * from the old action and subscribed to the new one.

    ++ * ++ * @param a The Action which will be listened to, and which should be ++ * the same as the source of any PropertyChangeEvents received by the ++ * new listener returned from this method. ++ * ++ * @return A new PropertyChangeListener ++ */ + protected PropertyChangeListener createActionPropertyChangeListener(Action a) + { +- //Factory method which creates the PropertyChangeListener used to update the ActionEvent source as properties change on its Action instance. +- return null; ++ return new PropertyChangeListener() ++ { ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ Action act = (Action) (e.getSource()); ++ if (e.getPropertyName().equals(AbstractAction.ENABLED_PROPERTY)) ++ setEnabled(act.isEnabled()); ++ else if (e.getPropertyName().equals(Action.NAME)) ++ setText((String)(act.getValue(Action.NAME))); ++ else if (e.getPropertyName().equals(Action.SMALL_ICON)) ++ setIcon((Icon)(act.getValue(Action.SMALL_ICON))); ++ else if (e.getPropertyName().equals(Action.SHORT_DESCRIPTION)) ++ setToolTipText((String)(act.getValue(Action.SHORT_DESCRIPTION))); ++ else if (e.getPropertyName().equals(Action.MNEMONIC_KEY)) ++ if (act.getValue(Action.MNEMONIC_KEY) != null) ++ setMnemonic(((Integer)(act.getValue(Action.MNEMONIC_KEY))).intValue()); ++ else if (e.getPropertyName().equals(Action.ACTION_COMMAND_KEY)) ++ setActionCommand((String)(act.getValue(Action.ACTION_COMMAND_KEY))); ++ } ++ }; + } + ++ /** ++ *

    Factory method which creates a {@link ChangeListener}, used to ++ * subscribe to ChangeEvents from the button's model. Subclasses of ++ * AbstractButton may wish to override the listener used to subscribe to ++ * such ChangeEvents. By default, the listener just propagates the ++ * {@link ChangeEvent} to the button's ChangeListeners, via the {@link ++ * AbstractButton.fireStateChanged} method.

    ++ * ++ *

    The button calls this method during construction, stores the ++ * resulting ChangeListener in its changeListener member ++ * field, and subscribes it to the button's model. If the button's model ++ * is changed, this listener is unsubscribed from the old model and ++ * subscribed to the new one.

    ++ * ++ * @return The new ChangeListener ++ */ + protected ChangeListener createChangeListener() + { +- // Subclasses that want to handle ChangeEvents differently can override this to return another ChangeListener implementation. + return new ChangeListener() + { +- public void stateChanged(ChangeEvent e) { } ++ public void stateChanged(ChangeEvent e) ++ { ++ AbstractButton.this.fireStateChanged(e); ++ AbstractButton.this.repaint(); ++ } + }; + } + ++ /** ++ *

    Factory method which creates a {@link ItemListener}, used to ++ * subscribe to ItemEvents from the button's model. Subclasses of ++ * AbstractButton may wish to override the listener used to subscribe to ++ * such ItemEvents. By default, the listener just propagates the ++ * {@link ItemEvent} to the button's ItemListeners, via the {@link ++ * AbstractButton.fireItemStateChanged} method.

    ++ * ++ *

    The button calls this method during construction, stores the ++ * resulting ItemListener in its changeListener member ++ * field, and subscribes it to the button's model. If the button's model ++ * is changed, this listener is unsubscribed from the old model and ++ * subscribed to the new one.

    ++ * ++ *

    Note that ItemEvents are only generated from the button's model ++ * when the model's selected property changes. If you want to ++ * subscribe to other properties of the model, you must subscribe to ++ * ChangeEvents. ++ * ++ * @return The new ItemListener ++ */ + protected ItemListener createItemListener() + { + return new ItemListener() + { +- public void itemStateChanged(ItemEvent e) { } ++ public void itemStateChanged(ItemEvent e) ++ { ++ AbstractButton.this.fireItemStateChanged(e); ++ } + }; + } + ++ /** ++ * Programmatically perform a "click" on the button: arming, pressing, ++ * waiting, un-pressing, and disarming the model. ++ */ + public void doClick() + { + doClick(100); + } + ++ /** ++ * Programmatically perform a "click" on the button: arming, pressing, ++ * waiting, un-pressing, and disarming the model. ++ * ++ * @param pressTime The number of milliseconds to wait in the pressed state ++ */ + public void doClick(int pressTime) + { +- //Toolkit.tlkBeep (); +- //Programmatically perform a "click". +- } +- +- public Icon getDisabledSelectedIcon() ++ getModel().setArmed(true); ++ getModel().setPressed(true); ++ try + { +- //Returns the icon used by the button when it's disabled and selected. +- return disabled_selected_button; ++ java.lang.Thread.sleep(pressTime); + } +- +- public Icon getRolloverIcon() ++ catch (java.lang.InterruptedException e) + { +- // Returns the rollover icon for the button. +- return null; ++ // probably harmless + } +- +- Icon getRolloverSelectedIcon() +- { +- // Returns the rollover selection icon for the button. +- return null; ++ getModel().setPressed(false); ++ getModel().setArmed(false); + } + +- Icon getSelectedIcon() ++ /** ++ * Return the button's disabled selected icon. The look and feel class ++ * should paint this icon when the "enabled" property of the button's model ++ * is false and its "selected" property is ++ * true. This icon can be null, in which case ++ * it is synthesized from the button's selected icon. ++ * ++ * @return The current disabled selected icon ++ */ ++ public Icon getDisabledSelectedIcon() + { +- // Returns the selected icon for the button. +- return selected_button; ++ return disabledSelectedIcon; + } + +- public Object[] getSelectedObjects() ++ /** ++ * Set the button's disabled selected icon. The look and feel class ++ * should paint this icon when the "enabled" property of the button's model ++ * is false and its "selected" property is ++ * true. This icon can be null, in which case ++ * it is synthesized from the button's selected icon. ++ * ++ * @param disabledSelectedIcon The new disabled selected icon ++ */ ++ public void setDisabledSelectedIcon(Icon disabledSelectedIcon) + { +- //Returns an array (length 1) containing the label or null if the button is not selected. +- return null; +- } +- +- public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) ++ Icon old = disabledSelectedIcon; ++ disabledSelectedIcon = disabledSelectedIcon; ++ if (old != disabledSelectedIcon) + { +- //This is overridden to return false if the current Icon's Image is not equal to the passed in Image img. +- return current_icon == img; ++ firePropertyChange(DISABLED_SELECTED_ICON_CHANGED_PROPERTY, old, ++ disabledSelectedIcon); ++ revalidate(); ++ repaint(); + } +- +- public boolean isContentAreaFilled() +- { +- // Checks whether the "content area" of the button should be filled. +- return false; + } + +- protected void paintBorder(Graphics g) +- { +- // Paint the button's border if BorderPainted property is true. +- if (isBorderPainted()) +- super.paintBorder(g); +- } + +- protected String paramString() ++ /** ++ * Return the button's rollover icon. The look and feel class should ++ * paint this icon when the "rolloverEnabled" property of the button is ++ * true and the mouse rolls over the button. ++ * ++ * @return The current rollover icon ++ */ ++ public Icon getRolloverIcon() + { +- // Returns a string representation of this AbstractButton. +- return "AbstractButton"; ++ return rolloverIcon; + } + +- public void setContentAreaFilled(boolean b) ++ /** ++ * Set the button's rollover icon. The look and feel class should ++ * paint this icon when the "rolloverEnabled" property of the button is ++ * true and the mouse rolls over the button. ++ * ++ * @param rolloverIcon The new rollover icon ++ */ ++ public void setRolloverIcon(Icon r) + { +- //Sets whether the button should paint the content area or leave it transparent. ++ Icon old = rolloverIcon; ++ rolloverIcon = r; ++ if (old != rolloverIcon) ++ { ++ firePropertyChange(ROLLOVER_ICON_CHANGED_PROPERTY, old, ++ rolloverIcon); ++ revalidate(); ++ repaint(); ++ } + } + +- public void setDisabledSelectedIcon(Icon disabledSelectedIcon) ++ /** ++ * Return the button's rollover selected icon. The look and feel class ++ * should paint this icon when the "rolloverEnabled" property of the button ++ * is true, the "selected" property of the button's model is ++ * true, and the mouse rolls over the button. ++ * ++ * @return The current rollover selected icon ++ */ ++ public Icon getRolloverSelectedIcon() + { +- // Sets the disabled selection icon for the button. ++ return rolloverSelectedIcon; + } + +- public void setRolloverIcon(Icon rolloverIcon) ++ /** ++ * Set the button's rollover selected icon. The look and feel class ++ * should paint this icon when the "rolloverEnabled" property of the button ++ * is true, the "selected" property of the button's model is ++ * true, and the mouse rolls over the button. ++ * ++ * @param rolloverSelectedIcon The new rollover selected icon ++ */ ++ public void setRolloverSelectedIcon(Icon r) + { +- // Sets the rollover icon for the button. +- } +- public void setRolloverSelectedIcon(Icon rolloverSelectedIcon) ++ Icon old = rolloverSelectedIcon; ++ rolloverSelectedIcon = r; ++ if (old != rolloverSelectedIcon) + { +- // Sets the rollover selected icon for the button. ++ firePropertyChange(ROLLOVER_SELECTED_ICON_CHANGED_PROPERTY, old, ++ rolloverSelectedIcon); ++ revalidate(); ++ repaint(); + } +- +- public void setSelectedIcon(Icon selectedIcon) +- { +- // Sets the selected icon for the button. + } + +- public void setUI(ButtonUI ui) +- { // Sets the L&F object that renders this component. +- super.setUI(ui); +- } + +- public ButtonUI getUI() ++ /** ++ * Return the button's selected icon. The look and feel class should ++ * paint this icon when the "selected" property of the button's model is ++ * true, and either the "rolloverEnabled" property of the ++ * button is false or the mouse is not currently rolled ++ * over the button. ++ * ++ * @return The current selected icon ++ */ ++ public Icon getSelectedIcon() + { +- //Returns the L&F object that renders this component. +- return (ButtonUI) ui; ++ return selectedIcon; + } + +- public void updateUI() ++ /** ++ * Set the button's selected icon. The look and feel class should ++ * paint this icon when the "selected" property of the button's model is ++ * true, and either the "rolloverEnabled" property of the ++ * button is false or the mouse is not currently rolled ++ * over the button. ++ * ++ * @param selectedIcon The new selected icon ++ */ ++ public void setSelectedIcon(Icon s) + { +- /* +- // Notification from the UIFactory that the L&F has changed. +- if (getUI() == null) ++ Icon old = selectedIcon; ++ selectedIcon = s; ++ if (old != selectedIcon) + { +- setUI(getUI()); ++ firePropertyChange(SELECTED_ICON_CHANGED_PROPERTY, old, ++ selectedIcon); ++ revalidate(); ++ repaint(); + } +- */ + } + +- protected void processActionEvent(ActionEvent e) ++ /** ++ * Returns an single-element array containing the "text" property of the ++ * button if the "selected" property of the button's model is ++ * true, otherwise returns null. ++ * ++ * @return The button's "selected object" array ++ */ ++ public Object[] getSelectedObjects() + { +- System.out.println("PROCESS-ACTION-EVENT: " + e); ++ if (isSelected()) ++ { ++ Object[] objs = new Object[1]; ++ objs[0] = getText(); ++ return objs; + } +- +- protected void processMouseEvent(MouseEvent e) ++ else + { +- // System.out.println("PROCESS-MOUSE-EVENT: " + e + ", PRESSED-IN-MODEL="+getModel().isPressed()); ++ return null; ++ } ++ } + +- switch (e.getID()) +- { +- case MouseEvent.MOUSE_MOVED: ++ /** ++ * Called when image data becomes available for one of the button's icons. ++ * ++ * @param img The image being updated ++ * @param infoflags One of the constant codes in {@link ImageObserver} used to describe ++ * updated portions of an image. ++ * @param x X coordinate of the region being updated ++ * @param y Y coordinate of the region being updated ++ * @param w Width of the region beign updated ++ * @param h Height of the region being updated ++ * ++ * @return true if img is equal to the button's current ++ * icon, otherwise false ++ */ ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, ++ int h) + { +- break; ++ return current_icon == img; + } +- case MouseEvent.MOUSE_PRESSED: +- { +- if (! isEnabled()) ++ ++ /** ++ * Returns the value of the button's "contentAreaFilled" property. This ++ * property indicates whether the area surrounding the text and icon of ++ * the button should be filled by the look and feel class. If this ++ * property is false, the look and feel class should leave ++ * the content area transparent. ++ * ++ * @return The current value of the "contentAreaFilled" property ++ */ ++ public boolean isContentAreaFilled() + { +- System.out.println("button not enabled, ignoring press"); ++ return contentAreaFilled; + } +- else ++ ++ /** ++ * Sets the value of the button's "contentAreaFilled" property. This ++ * property indicates whether the area surrounding the text and icon of ++ * the button should be filled by the look and feel class. If this ++ * property is false, the look and feel class should leave ++ * the content area transparent. ++ * ++ * @param b The new value of the "contentAreaFilled" property ++ */ ++ public void setContentAreaFilled(boolean b) + { +- System.out.println("telling model:press: " + getModel()); +- getModel().setPressed(true); ++ boolean old = contentAreaFilled; ++ contentAreaFilled = b; ++ if (b != old) ++ { ++ firePropertyChange(CONTENT_AREA_FILLED_CHANGED_PROPERTY, old, b); ++ revalidate(); + repaint(); + } +- break; + } + +- case MouseEvent.MOUSE_RELEASED: +- { +- if (! isEnabled()) ++ /** ++ * Paints the button's border, if the button's "borderPainted" property is ++ * true, by out calling to the button's look and feel class. ++ * ++ * @param g The graphics context used to paint the border ++ */ ++ protected void paintBorder(Graphics g) + { +- System.out.println("button not enabled, ignoring release"); ++ if (isBorderPainted()) ++ super.paintBorder(g); + } +- else +- { +- int flags = 0; + +- System.out.println(" XXX--> " + getActionCommand()); ++ /** ++ * Returns a string, used only for debugging, which identifies or somehow ++ * represents this button. The exact value is implementation-defined. ++ * ++ * @return A string representation of the button ++ */ ++ protected String paramString() ++ { ++ return "AbstractButton"; ++ } + +- fireActionPerformed(new ActionEvent(this, +- ActionEvent.ACTION_PERFORMED, +- getActionCommand(), +- flags)); + +- //System.out.println("telling model:release"); +- getModel().setPressed(false); +- repaint(); +- } +- break; +- } +- case MouseEvent.MOUSE_CLICKED: ++ /** ++ * Set the "UI" property of the button, which is a look and feel class ++ * responsible for handling the button's input events and painting it. ++ * ++ * @param ui The new "UI" property ++ */ ++ public void setUI(ButtonUI ui) + { +- break; ++ super.setUI(ui); + } ++ ++ /** ++ * Set the "UI" property of the button, which is a look and feel class ++ * responsible for handling the button's input events and painting it. ++ * ++ * @return The current "UI" property ++ */ ++ public ButtonUI getUI() ++ { ++ return (ButtonUI) ui; + } ++ ++ /** ++ * Set the "UI" property to a class constructed, via the {@link ++ * UIManager}, from the current look and feel. This should be overridden ++ * for each subclass of AbstractButton, to retrieve a suitable {@link ++ * ButtonUI} look and feel class. ++ */ ++ public void updateUI() ++ { ++ } ++ ++ /** ++ * Returns the current time in milliseconds in which clicks gets coalesced ++ * into a single ActionEvent. ++ * ++ * @return the time in milliseconds ++ * ++ * @since 1.4 ++ */ ++ public long getMultiClickThreshhold() ++ { ++ return multiClickThreshhold; ++ } ++ ++ /** ++ * Sets the time in milliseconds in which clicks gets coalesced into a single ++ * ActionEvent. ++ * ++ * @param threshhold the time in milliseconds ++ * ++ * @since 1.4 ++ */ ++ public void setMultiClickThreshhold(long threshhold) ++ { ++ if (threshhold < 0) ++ throw new IllegalArgumentException(); ++ ++ multiClickThreshhold = threshhold; + } + } +Index: javax/swing/AbstractCellEditor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/AbstractCellEditor.java,v +retrieving revision 1.3 +diff -u -r1.3 AbstractCellEditor.java +--- javax/swing/AbstractCellEditor.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/AbstractCellEditor.java 6 Sep 2004 16:35:53 -0000 +@@ -1,5 +1,5 @@ + /* AbstractCellEditor.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -54,24 +54,15 @@ + { + static final long serialVersionUID = -1048006551406220959L; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * listenerList +- */ +- protected EventListenerList listenerList; +- +- /** +- * changeEvent +- */ +- protected transient ChangeEvent changeEvent; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- ++ /** ++ * listenerList ++ */ ++ protected EventListenerList listenerList; ++ ++ /** ++ * changeEvent ++ */ ++ protected transient ChangeEvent changeEvent; + + /** + * Constructor AbstractCellEditor +@@ -80,11 +71,6 @@ + // TODO + } // AbstractCellEditor() + +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- + /** + * isCellEditable + * @param event TODO +@@ -118,41 +104,59 @@ + // TODO + } // cancelCellEditing() + +- /** +- * addCellEditorListener +- * @param listener TODO +- */ +- public void addCellEditorListener(CellEditorListener listener) { +- // TODO +- } // addCellEditorListener() +- +- /** +- * removeCellEditorListener +- * @param listener TODO +- */ +- public void removeCellEditorListener(CellEditorListener listener) { +- // TODO +- } // removeCellEditorListener() +- +- /** +- * fireEditingStopped +- */ +- protected void fireEditingStopped() { +- // TODO +- } // fireEditingStopped() +- +- /** +- * fireEditingCanceled +- */ +- protected void fireEditingCanceled() { +- // TODO +- } // fireEditingCanceled() +- +- /** +- * getCellEditorValue +- * @returns Object +- */ +- public abstract Object getCellEditorValue(); +- +- +-} // AbstractCellEditor ++ /** ++ * addCellEditorListener ++ * ++ * @param listener The listener to add ++ */ ++ public void addCellEditorListener (CellEditorListener listener) ++ { ++ listenerList.add (CellEditorListener.class, listener); ++ } ++ ++ /** ++ * removeCellEditorListener ++ * ++ * @param listener The listener to remove ++ */ ++ public void removeCellEditorListener (CellEditorListener listener) ++ { ++ listenerList.remove (CellEditorListener.class, listener); ++ } ++ ++ /** ++ * getCellEditorListeners ++ * ++ * @since 1.4 ++ */ ++ public CellEditorListener[] getCellEditorListeners() ++ { ++ return (CellEditorListener[]) listenerList.getListeners (CellEditorListener.class); ++ } ++ ++ /** ++ * fireEditingStopped ++ */ ++ protected void fireEditingStopped() ++ { ++ CellEditorListener[] listeners = getCellEditorListeners(); ++ ++ for (int index = 0; index < listeners.length; index++) ++ { ++ listeners [index].editingStopped (changeEvent); ++ } ++ } ++ ++ /** ++ * fireEditingCanceled ++ */ ++ protected void fireEditingCanceled() ++ { ++ CellEditorListener[] listeners = getCellEditorListeners(); ++ ++ for (int index = 0; index < listeners.length; index++) ++ { ++ listeners [index].editingCanceled (changeEvent); ++ } ++ } ++} +Index: javax/swing/AbstractListModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/AbstractListModel.java,v +retrieving revision 1.5 +diff -u -r1.5 AbstractListModel.java +--- javax/swing/AbstractListModel.java 11 Jun 2003 13:20:39 -0000 1.5 ++++ javax/swing/AbstractListModel.java 6 Sep 2004 16:35:53 -0000 +@@ -40,57 +40,64 @@ + import java.io.Serializable; + import java.util.EventListener; + import javax.swing.event.EventListenerList; +-import javax.swing.event.ListDataListener; + import javax.swing.event.ListDataEvent; ++import javax.swing.event.ListDataListener; ++ + + /** + * AbstractListModel +- * A2uthor Ronald Veldema +- * @author Andrew Selkirk +- * @version 1.0 ++ * ++ * @author Ronald Veldema ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public abstract class AbstractListModel +- implements ListModel, Serializable ++public abstract class AbstractListModel implements ListModel, Serializable + { + static final long serialVersionUID = -3285184064379168730L; + +- /** +- * listenerList +- */ +- protected EventListenerList listenerList = new EventListenerList (); +- +- /** +- * Constructor AbstractListModel +- */ +- public AbstractListModel () ++ /** List of ListDataListeners called for each change to the list. */ ++ protected EventListenerList listenerList; ++ ++ public AbstractListModel() + { ++ listenerList = new EventListenerList(); + } + + /** +- * addListDataListener +- * @param listener TODO ++ * Add a listener object to this model. The listener will be called ++ * any time the set of elements in the model is changed. ++ * ++ * @param listener The listener to add + */ +- public void addListDataListener(ListDataListener listener) ++ public void addListDataListener(ListDataListener listener) + { +- listenerList.add (ListDataListener.class, listener); ++ listenerList.add(ListDataListener.class, listener); + } + + /** +- * removeListDataListener +- * @param listener TODO ++ * Add a listener object to this model. The listener will no longer be ++ * called when the set of elements in the model is changed. ++ * ++ * @param listener The listener to remove + */ + public void removeListDataListener(ListDataListener listener) + { +- listenerList.remove (ListDataListener.class, listener); ++ listenerList.remove(ListDataListener.class, listener); + } + + /** +- * fireContentsChanged +- * @param source TODO +- * @param startIndex TODO +- * @param endIndex TODO ++ * Call {@link ListDataListener#contentsChanged} on each element of the ++ * {@link listenerList} which is a {@link ListDataListener}. The event ++ * fired has type {@ListDataEvent.CONTENTS_CHANGED} and represents a ++ * change to the data elements in the range [startIndex, endIndex] ++ * inclusive. ++ * ++ * @param source The source of the change, typically this ++ * @param startIndex The index of the first element which changed ++ * @param endIndex The index of the last element which changed + */ +- protected void fireContentsChanged(Object source, int startIndex, int endIndex) ++ protected void fireContentsChanged(Object source, int startIndex, ++ int endIndex) + { + // Variables + ListDataEvent event; +@@ -100,10 +107,10 @@ + + // Create Event + event = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, +- startIndex, endIndex); ++ startIndex, endIndex); + + // Get Listeners +- listeners = getListDataListeners (); ++ listeners = getListDataListeners(); + + // Process Listeners + for (index = 0; index < listeners.length; index++) +@@ -114,12 +121,17 @@ + } + + /** +- * fireIntervalAdded +- * @param source TODO +- * @param startIndex TODO +- * @param endIndex TODO ++ * Call {@link ListDataListener#intervalAdded} on each element of the ++ * {@link listenerList} which is a {@link ListDataListener}. The event ++ * fired has type {@ListDataEvent.INTERVAL_ADDED} and represents an ++ * addition of the data elements in the range [startIndex, endIndex] ++ * inclusive. ++ * ++ * @param source The source of the change, typically this ++ * @param startIndex The index of the first new element ++ * @param endIndex The index of the last new element + */ +- protected void fireIntervalAdded (Object source, int startIndex, int endIndex) ++ protected void fireIntervalAdded(Object source, int startIndex, int endIndex) + { + // Variables + ListDataEvent event; +@@ -128,27 +140,32 @@ + int index; + + // Create Event +- event = new ListDataEvent (source, ListDataEvent.INTERVAL_ADDED, startIndex, +- endIndex); ++ event = new ListDataEvent(source, ListDataEvent.INTERVAL_ADDED, ++ startIndex, endIndex); + + // Get Listeners +- listeners = getListDataListeners (); ++ listeners = getListDataListeners(); + + // Process Listeners + for (index = 0; index < listeners.length; index++) + { +- listener = listeners [index]; +- listener.intervalAdded (event); ++ listener = listeners[index]; ++ listener.intervalAdded(event); + } + } + + /** +- * fireIntervalRemoved +- * @param source TODO +- * @param startIndex TODO +- * @param endIndex TODO ++ * Call {@link ListDataListener#intervalRemoved} on each element of the ++ * {@link listenerList} which is a {@link ListDataListener}. The event ++ * fired has type {@ListDataEvent.INTERVAL_REMOVED} and represents a ++ * removal of the data elements in the range [startIndex, endIndex] ++ * inclusive. ++ * ++ * @param source The source of the change, typically this ++ * @param startIndex The index of the first element removed ++ * @param endIndex The index of the last element removed + */ +- protected void fireIntervalRemoved (Object source, int startIndex, ++ protected void fireIntervalRemoved(Object source, int startIndex, + int endIndex) + { + // Variables +@@ -158,35 +175,41 @@ + int index; + + // Create Event +- event = new ListDataEvent (source, ListDataEvent.INTERVAL_REMOVED, +- startIndex, endIndex); ++ event = new ListDataEvent(source, ListDataEvent.INTERVAL_REMOVED, ++ startIndex, endIndex); + + // Get Listeners +- listeners = getListDataListeners (); ++ listeners = getListDataListeners(); + + // Process Listeners + for (index = 0; index < listeners.length; index++) + { +- listener = listeners [index]; +- listener.intervalRemoved (event); ++ listener = listeners[index]; ++ listener.intervalRemoved(event); + } + } + + /** +- * getListeners +- * @param listenerType TODO +- * @returns EventListener[] ++ * Return the subset of {@link EventListener} objects found in this ++ * object's {@link listenerList} which are elements of the specified ++ * type. ++ * ++ * @param listenerType The type of listeners to select ++ * ++ * @return The set of listeners of the specified type + */ +- public EventListener[] getListeners (Class listenerType) ++ public EventListener[] getListeners(Class listenerType) + { +- return listenerList.getListeners (listenerType); ++ return listenerList.getListeners(listenerType); + } + + /** +- * getListDataListeners ++ * A synonym for getListeners(ListDataListener.class). ++ * ++ * @return The set of ListDataListeners found in the {@link listenerList} + */ +- public ListDataListener[] getListDataListeners () ++ public ListDataListener[] getListDataListeners() + { +- return (ListDataListener[]) getListeners (ListDataListener.class); ++ return (ListDataListener[]) getListeners(ListDataListener.class); + } + } +Index: javax/swing/AbstractSpinnerModel.java +=================================================================== +RCS file: javax/swing/AbstractSpinnerModel.java +diff -N javax/swing/AbstractSpinnerModel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/AbstractSpinnerModel.java 6 Sep 2004 16:35:53 -0000 +@@ -0,0 +1,115 @@ ++/* AbstractSpinnerModel.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++import java.util.EventListener; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.EventListenerList; ++ ++/** ++ * AbstractSpinnerModel ++ * @author Ka-Hing Cheung ++ * @version 1.0 ++ */ ++public abstract class AbstractSpinnerModel implements SpinnerModel ++{ ++ private ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ protected EventListenerList listenerList = new EventListenerList(); ++ ++ /** ++ * Creates an AbstractSpinnerModel. ++ */ ++ public AbstractSpinnerModel() ++ { ++ } ++ ++ /** ++ * Adds a ChangeListener. ++ * ++ * @param listener the listener to add ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Gets all the listeners that are of a particular type. ++ * ++ * @param c the type of listener ++ * @return the listeners that are of the specific type ++ */ ++ public EventListener[] getListeners(Class c) ++ { ++ return listenerList.getListeners(c); ++ } ++ ++ /** ++ * Gets all the ChangeListeners. ++ * ++ * @return all the ChangeListeners ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * Remove a particular listener. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Fires a ChangeEvent to all the ChangeListeners ++ * added to this model ++ */ ++ protected void fireStateChanged() ++ { ++ ChangeListener[] listeners = getChangeListeners(); ++ ++ for(int i = 0; i < listeners.length; ++i) ++ listeners[i].stateChanged(changeEvent); ++ } ++} +Index: javax/swing/ActionMap.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ActionMap.java,v +retrieving revision 1.3 +diff -u -r1.3 ActionMap.java +--- javax/swing/ActionMap.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/ActionMap.java 6 Sep 2004 16:35:53 -0000 +@@ -42,25 +42,21 @@ + import java.io.ObjectOutputStream; + import java.io.Serializable; + import java.util.Arrays; +-import java.util.Collection; + import java.util.HashMap; + import java.util.HashSet; + import java.util.Iterator; + import java.util.Map; + import java.util.Set; + ++ + /** +- * ActionMap + * @author Andrew Selkirk +- * @version 1.0 ++ * @author Michael Koch + */ +-public class ActionMap implements Serializable ++public class ActionMap ++ implements Serializable + { +- static final long serialVersionUID = -6277518704513986346L; +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++ private static final long serialVersionUID = -6277518704513986346L; + + /** + * actionMap +@@ -70,170 +66,146 @@ + /** + * parent + */ +- private ActionMap parent = null; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- ++ private ActionMap parent; + + /** +- * Constructor ActionMap ++ * Creates a new ActionMap instance. + */ +- public ActionMap() { +- } // ActionMap() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ public ActionMap() ++ { ++ } + + /** +- * get +- * @param key TODO +- * @returns Action ++ * Returns an action associated with an object. ++ * ++ * @param key the key of the enty ++ * ++ * @return the action associated with key, may be null + */ +- public Action get(Object key) { ++ public Action get(Object key) ++ { ++ Object result = actionMap.get(key); + +- // Variables +- Object result; +- +- // Check Local store +- result = actionMap.get(key); +- +- // Check Parent +- if (result == null) { +- result = parent.get(key); +- } // if ++ if (result == null && parent != null) ++ result = parent.get(key); + + return (Action) result; +- +- } // get() ++ } + + /** +- * put +- * @param key TODO +- * @param action TODO +- */ +- public void put(Object key, Action action) { +- if (action == null) { ++ * Puts a new Action into the ActionMap. ++ * If action is null an existing entry will be removed. ++ * ++ * @param key the key for the entry ++ * @param action the action. ++ */ ++ public void put(Object key, Action action) ++ { ++ if (action == null) + actionMap.remove(key); +- } else { ++ else + actionMap.put(key, action); +- } // if +- } // put() ++ } + + /** +- * remove +- * @param key TODO ++ * Remove an entry from the ActionMap. ++ * ++ * @param key the key of the entry to remove + */ +- public void remove(Object key) { ++ public void remove(Object key) ++ { + actionMap.remove(key); +- } // remove() ++ } + + /** +- * getParent +- * @returns ActionMap ++ * Returns the parent of this ActionMap. ++ * ++ * @return the parent, may be null. + */ +- public ActionMap getParent() { ++ public ActionMap getParent() ++ { + return parent; +- } // getParent() ++ } + + /** +- * setParent +- * @param parentMap TODO ++ * Sets a parent for this ActionMap. ++ * ++ * @param parentMap the new parent + */ +- public void setParent(ActionMap parentMap) { ++ public void setParent(ActionMap parentMap) ++ { + parent = parentMap; +- } // setParent() ++ } + + /** +- * size +- * @returns int ++ * Returns the number of entries in this ActionMap. ++ * ++ * @return the number of entries + */ +- public int size() { ++ public int size() ++ { + return actionMap.size(); +- } // size() ++ } + + /** +- * clear ++ * Clears the ActionMap. + */ +- public void clear() { ++ public void clear() ++ { + actionMap.clear(); +- } // clear() ++ } + + /** +- * keys +- * @returns Object[] ++ * Returns all keys of entries in this ActionMap. ++ * ++ * @return an array of keys + */ +- public Object[] keys() { +- return convertSet(actionMap.keySet()); +- } // keys() ++ public Object[] keys() ++ { ++ return actionMap.keySet().toArray(); ++ } + + /** +- * allKeys +- * @returns Object[] ++ * Returns all keys of entries in this ActionMap ++ * and all its parents. ++ * ++ * @return an array of keys + */ +- public Object[] allKeys() { +- +- // Variables +- Set set; +- +- // Initialize +- set = new HashSet(); ++ public Object[] allKeys() ++ { ++ Set set = new HashSet(); + +- // Get Key Sets +- if (parent != null) { ++ if (parent != null) + set.addAll(Arrays.asList(parent.allKeys())); +- } // if +- set.addAll(actionMap.keySet()); + +- return convertSet(set); +- +- } // allKeys() +- +- private Object[] convertSet(Set set) { +- +- // Variables +- int index; +- Iterator iterator; +- Object[] keys; +- +- // Create Final array +- keys = new Object[set.size()]; +- iterator = set.iterator(); +- index = 0; +- while (iterator.hasNext()) { +- keys[index++] = iterator.next(); +- } // while +- +- return keys; +- +- } // convertSet() +- +- +- //------------------------------------------------------------- +- // Interface: Serializable ------------------------------------ +- //------------------------------------------------------------- ++ set.addAll(actionMap.keySet()); ++ return set.toArray(); ++ } + + /** + * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream value0) throws IOException { ++ * ++ * @param stream the stream to write to ++ * ++ * @exception IOException If an error occurs ++ */ ++ private void writeObject(ObjectOutputStream stream) ++ throws IOException ++ { + // TODO +- } // writeObject() ++ } + + /** + * readObject +- * @param stream TODO +- * @exception ClassNotFoundException TODO +- * @exception IOException TODO +- */ +- private void readObject(ObjectInputStream value0) throws ClassNotFoundException, IOException { ++ * ++ * @param stream the stream to read from ++ * ++ * @exception ClassNotFoundException If the serialized class cannot be found ++ * @exception IOException If an error occurs ++ */ ++ private void readObject(ObjectInputStream stream) ++ throws ClassNotFoundException, IOException ++ { + // TODO +- } // readObject() +- +- +-} // ActionMap ++ } ++} +Index: javax/swing/Box.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/Box.java,v +retrieving revision 1.2 +diff -u -r1.2 Box.java +--- javax/swing/Box.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/Box.java 6 Sep 2004 16:35:53 -0000 +@@ -1,5 +1,5 @@ + /* Box.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,17 +39,245 @@ + package javax.swing; + + import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import java.awt.LayoutManager; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.AWTError; + + /** +- * Needs some work I guess.... ++ * A component that uses a {@link BoxLayout} as Layout Manager. ++ * ++ * In addition to that, this class provides a set of static methods for ++ * creating some filler components ('struts' and 'glue') for use in ++ * containers that are laid out using BoxLayout. + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ + public class Box extends JComponent implements Accessible + { +- Box(int a) ++ private static final long serialVersionUID = 1525417495883046342L; ++ ++ // FIXME: disable to make libjava compile; visibility rules are broken ++ protected class AccessibleBox // extends Container.AccessibleAWTContainer ++ { ++ private static final long serialVersionUID = -7775079816389931944L; ++ ++ protected AccessibleBox() ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ } ++ ++ /** ++ * A component that servers as a filler in BoxLayout controlled containers. ++ */ ++ public static class Filler extends JComponent implements Accessible ++ { ++ private static final long serialVersionUID = -1204263191910183998L; ++ ++ // FIXME: disable to make libjava compile; visibility rules are broken ++ protected class AccessibleBoxFiller // extends Component.AccessibleAWTComponent ++ { ++ private static final long serialVersionUID = 164963348357479321L; ++ ++ protected AccessibleBoxFiller() ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ } ++ ++ protected AccessibleContext accessibleContext; ++ ++ private transient Dimension min, pref, max; ++ ++ /** ++ * Creates a new instance of Filler. ++ * ++ * @param min the minimum size of the filler. ++ * @param pref the preferred size of the filler. ++ * @param max the maximum size of the filler. ++ */ ++ public Filler(Dimension min, Dimension pref, Dimension max) ++ { ++ changeShape(min, pref, max); ++ } ++ ++ /** ++ * Changes the dimensions of this Filler. ++ * ++ * @param min the new minimum size of the filler. ++ * @param pref the new preferred size of the filler. ++ * @param max the new maximum size of the filler. ++ */ ++ public void changeShape(Dimension min, Dimension pref, Dimension max) ++ { ++ this.min = min; ++ this.pref = pref; ++ this.max = max; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ // FIXME: disable to make libjava compile; visibility rules are broken ++ // if (accessibleContext == null) ++ // accessibleContext = new AccessibleBoxFiller(); ++ return accessibleContext; ++ } ++ ++ /** ++ * Returns the maximum size of this Filler. ++ * ++ * @return the maximum size of this Filler. ++ */ ++ public Dimension getMaximumSize() ++ { ++ return max; ++ } ++ ++ /** ++ * Returns the minimum size of this Filler. ++ * ++ * @return the minimum size of this Filler. ++ */ ++ public Dimension getMinimumSize() ++ { ++ return min; ++ } ++ ++ /** ++ * Returns the preferred size of this Filler. ++ * ++ * @return the preferred size of this Filler. ++ */ ++ public Dimension getPreferredSize() + { +- setLayout(new BoxLayout(this, +- a)); ++ return pref; + } ++ } ++ ++ /** ++ * Creates a new Box component, that lays out its children according ++ * to the axis parameter. ++ * ++ * @param axis the orientation of the BoxLayout. ++ * ++ * @see BoxLayout#X_AXIS ++ * @see BoxLayout#Y_AXIS ++ * @see BoxLayout#LINE_AXIS ++ * @see BoxLayout#PAGE_AXIS ++ */ ++ public Box(int axis) ++ { ++ super.setLayout(new BoxLayout(this, axis)); ++ } ++ ++ /** ++ * Creates a filler component which acts as glue between components. ++ * It does not take space unless some extra space is available. If extra ++ * space is available, this component can expand in both X and Y directions. ++ * ++ * @return a glue-like filler component. ++ */ ++ public static Component createGlue() ++ { ++ Filler glue = new Filler(new Dimension(0,0), new Dimension(0,0), ++ new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE) ++ ); ++ return glue; ++ } ++ ++ public static Box createHorizontalBox() ++ { ++ return new Box(BoxLayout.X_AXIS); ++ } ++ ++ /** ++ * Creates a filler component which acts as glue between components. ++ * It does not take space unless some extra space is available. If extra ++ * space is available, this component can expand in the X direction. ++ * ++ * @return a glue-like filler component. ++ */ ++ public static Component createHorizontalGlue() ++ { ++ return createGlue(); ++ } ++ ++ /** ++ * Creates a filler component which acts as strut between components. ++ * It will fill exactly the specified horizontal size. ++ * ++ * @param width the width of this strut in pixels. ++ * ++ * @return a strut-like filler component. ++ */ ++ public static Component createHorizontalStrut(int width) ++ { ++ Filler strut = new Filler(new Dimension(width, 0), ++ new Dimension(width, 0), ++ new Dimension(width, Integer.MAX_VALUE)); ++ return strut; ++ } ++ ++ public static Component createRigidArea(Dimension d) ++ { ++ return new Filler(d, d, d); ++ } ++ ++ public static Box createVerticalBox() ++ { ++ return new Box(BoxLayout.Y_AXIS); ++ } ++ ++ /** ++ * Creates a filler component which acts as glue between components. ++ * It does not take space unless some extra space is available. If extra ++ * space is available, this component can expand in the Y direction. ++ * ++ * @return a glue-like filler component. ++ */ ++ public static Component createVerticalGlue() ++ { ++ return createGlue(); ++ } ++ ++ /** ++ * Creates a filler component which acts as strut between components. ++ * It will fill exactly the specified vertical size. ++ * ++ * @param height the height of this strut in pixels. ++ * ++ * @return a strut-like filler component. ++ */ ++ public static Component createVerticalStrut(int height) ++ { ++ Filler strut = new Filler(new Dimension(0, height), ++ new Dimension(0, height), ++ new Dimension(Integer.MAX_VALUE, height)); ++ return strut; ++ } ++ ++ public void setLayout(LayoutManager l) ++ { ++ throw new AWTError("Not allowed to set layout managers for boxes."); ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ // if (accessibleContext == null) ++ // accessibleContext = new AccessibleBox(); ++ return accessibleContext; ++ } ++ ++ + } +Index: javax/swing/BoxLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/BoxLayout.java,v +retrieving revision 1.3 +diff -u -r1.3 BoxLayout.java +--- javax/swing/BoxLayout.java 24 Nov 2003 16:55:43 -0000 1.3 ++++ javax/swing/BoxLayout.java 6 Sep 2004 16:35:53 -0000 +@@ -42,15 +42,11 @@ + import java.awt.ComponentOrientation; + import java.awt.Container; + import java.awt.Dimension; +-import java.awt.GridLayout; + import java.awt.LayoutManager2; + import java.io.Serializable; + +- + /** + * A layout for swing components. +- * This implementation delegates its methods to +- * java.awt.GridLayout to do its work. + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ +@@ -87,11 +83,6 @@ + private Container container; + + /* +- * Internal layout. +- */ +- private GridLayout grid; +- +- /* + * Current type of component layouting. Defaults to X_AXIS. + */ + private int way = X_AXIS; +@@ -108,75 +99,41 @@ + { + int width = 0; + int height = 0; +- ComponentOrientation orientation = container.getComponentOrientation(); +- + this.container = container; + this.way = way; +- +- switch (way) +- { +- case X_AXIS: +- width = 1; +- break; +- case Y_AXIS: +- height = 1; +- break; +- case LINE_AXIS: +- if (orientation.isHorizontal()) +- height = 1; +- else +- width = 1; +- break; +- case PAGE_AXIS: +- if (!orientation.isHorizontal()) +- height = 1; +- else +- width = 1; +- break; +- default: +- throw new AWTError("Invalid value for way"); +- } +- +- grid = new GridLayout(width, height); + } + + /** +- * Adds a component to the layout. ++ * Adds a component to the layout. Not used in BoxLayout. + * + * @param name The name of the component to add. + * @param component the component to add to the layout. + */ + public void addLayoutComponent(String name, Component component) + { +- if (way == X_AXIS +- || (way == LINE_AXIS +- && component.getComponentOrientation().isHorizontal()) +- || (way == PAGE_AXIS +- && !component.getComponentOrientation().isHorizontal())) +- grid.setColumns(grid.getColumns() + 1); +- else +- grid.setRows(grid.getRows() + 1); + } + + /** +- * Removes a component from the layout. ++ * Removes a component from the layout. Not used in BoxLayout. + * + * @param component The component to remove from the layout. + */ + public void removeLayoutComponent(Component component) + { +- grid.removeLayoutComponent(component); ++ } + +- if (way == X_AXIS +- || (way == LINE_AXIS +- && component.getComponentOrientation().isHorizontal()) +- || (way == PAGE_AXIS +- && !component.getComponentOrientation().isHorizontal())) +- grid.setColumns(grid.getColumns() - 1); +- else +- grid.setRows(grid.getRows() - 1); ++ private boolean isHorizontalIn(Container parent) ++ { ++ ComponentOrientation orientation = parent.getComponentOrientation(); ++ return this.way == X_AXIS ++ || (this.way == LINE_AXIS ++ && orientation.isHorizontal()) ++ || (this.way == PAGE_AXIS ++ && (!orientation.isHorizontal())); + } + ++ ++ + /** + * Returns the preferred size of the layout. + * +@@ -188,8 +145,38 @@ + { + if (parent != container) + throw new AWTError("invalid parent"); ++ ++ int x = 0; ++ int y = 0; ++ ++ Component[] children = parent.getComponents(); ++ ++ if (isHorizontalIn(parent)) ++ { ++ // sum up preferred widths of components, find maximum of preferred ++ // heights ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getPreferredSize(); ++ x += sz.width; ++ y = Math.max(y, sz.height); ++ } ++ } ++ else ++ { ++ // sum up preferred heights of components, find maximum of ++ // preferred widths ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getPreferredSize(); ++ y += sz.height; ++ x = Math.max(x, sz.width); ++ } ++ } + +- return grid.preferredLayoutSize(parent); ++ return new Dimension(x, y); + } + + /** +@@ -203,8 +190,38 @@ + { + if (parent != container) + throw new AWTError("invalid parent"); ++ ++ int x = 0; ++ int y = 0; ++ ++ Component[] children = parent.getComponents(); ++ ++ if (isHorizontalIn(parent)) ++ { ++ // sum up preferred widths of components, find maximum of preferred ++ // heights ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getMinimumSize(); ++ x += sz.width; ++ y = Math.max(y, sz.height); ++ } ++ } ++ else ++ { ++ // sum up preferred heights of components, find maximum of ++ // preferred widths ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getMinimumSize(); ++ y += sz.height; ++ x = Math.max(x, sz.width); ++ } ++ } + +- return grid.minimumLayoutSize(parent); ++ return new Dimension(x, y); + } + + /** +@@ -216,19 +233,69 @@ + { + if (parent != container) + throw new AWTError("invalid parent"); +- +- grid.layoutContainer(parent); +- } + ++ Dimension size = parent.getSize(); ++ ++ Component[] children = parent.getComponents(); ++ ++ if (isHorizontalIn(parent)) ++ { ++ int x = 0; ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getPreferredSize(); ++ int width = sz.width; ++ int height = sz.height; ++ int cy = 0; ++ if (height > size.height) ++ { ++ height = size.height; ++ } ++ else ++ { ++ cy = (int) ((size.height - height) * comp.getAlignmentY()); ++ } ++ ++ comp.setSize(width, height); ++ comp.setLocation(x, cy); ++ x = x + width; ++ } ++ } ++ else ++ { ++ int y = 0; ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getPreferredSize(); ++ int width = sz.width; ++ int height = sz.height; ++ int cx = 0; ++ if (width > size.width) ++ { ++ width = size.width; ++ } ++ else ++ { ++ cx = (int) ((size.width - width) * comp.getAlignmentX()); ++ } ++ ++ comp.setSize(width, height); ++ comp.setLocation(cx, y); ++ y = y + height; ++ } ++ } ++ } ++ + /** +- * Adds a component to the layout. ++ * Adds a component to the layout. Not used in BoxLayout + * + * @param child The component to add to the layout. + * @param constraints The constraints for the component in the layout. + */ + public void addLayoutComponent(Component child, Object constraints) + { +- addLayoutComponent("", child); + } + + /** +@@ -284,7 +351,37 @@ + { + if (parent != container) + throw new AWTError("invalid parent"); +- +- return preferredLayoutSize(parent); ++ ++ int x = 0; ++ int y = 0; ++ ++ Component[] children = parent.getComponents(); ++ ++ if (isHorizontalIn(parent)) ++ { ++ ++ // sum up preferred widths of components, find maximum of preferred ++ // heights ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getMaximumSize(); ++ x += sz.width; ++ y = Math.max(y, sz.height); ++ } ++ } ++ else ++ { ++ // sum up preferred heights of components, find maximum of ++ // preferred widths ++ for (int index = 0; index < children.length; index++) ++ { ++ Component comp = children[index]; ++ Dimension sz = comp.getMaximumSize(); ++ y += sz.height; ++ x = Math.max(x, sz.width); ++ } ++ } ++ return new Dimension(x, y); + } + } +Index: javax/swing/ButtonGroup.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ButtonGroup.java,v +retrieving revision 1.3 +diff -u -r1.3 ButtonGroup.java +--- javax/swing/ButtonGroup.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/ButtonGroup.java 6 Sep 2004 16:35:53 -0000 +@@ -1,4 +1,4 @@ +-/* ButtonGroup.java -- ++/* ButtonGroup.java -- + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -35,105 +35,145 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.io.Serializable; + import java.util.Enumeration; + import java.util.Vector; + +-public class ButtonGroup implements Serializable +-{ +- static final long serialVersionUID = 4259076101881721375L; +- +- Vector v = new Vector(); +- ButtonModel sel; +- +- public ButtonGroup() {} +- +- public void add(AbstractButton b) +- { +- b.getModel().setGroup(this); +- v.addElement(b); +- } +- +- public void remove(AbstractButton b) +- { +- b.getModel().setGroup(null); +- v.removeElement(b); +- } +- +- +- public Enumeration getElements() { +- return v.elements(); +- } +- +- public ButtonModel getSelection() { +- return sel; +- } +- +- AbstractButton FindButton(ButtonModel m) +- { +- for (int i=0;iEnumeration over all added buttons ++ */ ++ public Enumeration getElements() ++ { ++ return buttons.elements(); ++ } ++ ++ /** ++ * Returns the currently selected button model. ++ * ++ * @return the currently selected button model, null if none was selected ++ * yet ++ */ ++ public ButtonModel getSelection() ++ { ++ return sel; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param m DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ AbstractButton FindButton(ButtonModel m) ++ { ++ for (int i = 0; i < buttons.size(); i++) ++ { ++ AbstractButton a = (AbstractButton) buttons.get(i); ++ if (a.getModel() == m) ++ return a; ++ } ++ return null; ++ } ++ ++ /** ++ * Sets the currently selected button model. Only one button of a group can ++ * be selected at a time. ++ * ++ * @param m the model to select ++ * @param b true if this button is to be selected, false otherwise ++ */ ++ public void setSelected(ButtonModel m, boolean b) ++ { ++ if ((sel != m || b) && (! b || sel == m)) ++ return; ++ ++ if (b && sel != m) ++ { ++ ButtonModel old = sel; ++ sel = m; + ++ if (old != null) ++ old.setSelected(false); ++ AbstractButton button = FindButton(old); ++ if (button != null) ++ button.repaint(); ++ } ++ else if (! b && sel == m) ++ m.setSelected(true); ++ } ++ ++ /** ++ * Checks if the given ButtonModel is selected in this button ++ * group. ++ * ++ * @param m DOCUMENT ME! ++ * ++ * @return true of given ButtonModel is selected, false ++ * otherwise ++ */ ++ public boolean isSelected(ButtonModel m) ++ { ++ return m == sel; ++ } ++ ++ /** ++ * Return the number of buttons in this button group. ++ * ++ * @return the number of buttons ++ * ++ * @since 1.3 ++ */ ++ public int getButtonCount() ++ { ++ return buttons.size(); ++ } ++} +Index: javax/swing/CellEditor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/CellEditor.java,v +retrieving revision 1.3 +diff -u -r1.3 CellEditor.java +--- javax/swing/CellEditor.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/CellEditor.java 6 Sep 2004 16:35:53 -0000 +@@ -45,54 +45,49 @@ + * @author Andrew Selkirk + * @version 1.0 + */ +-public interface CellEditor { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getCellEditorValue +- * @returns Object +- */ +- Object getCellEditorValue(); +- +- /** +- * isCellEditable +- * @param event TODO +- * @returns boolean +- */ +- boolean isCellEditable(EventObject event); +- +- /** +- * shouldSelectCell +- * @param event TODO +- * @returns boolean +- */ +- boolean shouldSelectCell(EventObject event); +- +- /** +- * stopCellEditing +- * @returns boolean +- */ +- boolean stopCellEditing(); +- +- /** +- * cancelCellEditing +- */ +- void cancelCellEditing(); +- +- /** +- * addCellEditorListener +- * @param value0 TODO +- */ +- void addCellEditorListener(CellEditorListener listener); +- +- /** +- * removeCellEditorListener +- * @param listener TODO +- */ +- void removeCellEditorListener(CellEditorListener listener); +- ++public interface CellEditor ++{ ++ /** ++ * getCellEditorValue ++ * @returns Object ++ */ ++ Object getCellEditorValue(); ++ ++ /** ++ * isCellEditable ++ * @param event TODO ++ * @returns boolean ++ */ ++ boolean isCellEditable(EventObject event); ++ ++ /** ++ * shouldSelectCell ++ * @param event TODO ++ * @returns boolean ++ */ ++ boolean shouldSelectCell(EventObject event); ++ ++ /** ++ * stopCellEditing ++ * @returns boolean ++ */ ++ boolean stopCellEditing(); ++ ++ /** ++ * cancelCellEditing ++ */ ++ void cancelCellEditing(); ++ ++ /** ++ * addCellEditorListener ++ * @param value0 TODO ++ */ ++ void addCellEditorListener(CellEditorListener listener); ++ ++ /** ++ * removeCellEditorListener ++ * @param listener TODO ++ */ ++ void removeCellEditorListener(CellEditorListener listener); + + } // CellEditor +Index: javax/swing/CellRendererPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/CellRendererPane.java,v +retrieving revision 1.2 +diff -u -r1.2 CellRendererPane.java +--- javax/swing/CellRendererPane.java 9 Jan 2004 10:18:47 -0000 1.2 ++++ javax/swing/CellRendererPane.java 6 Sep 2004 16:35:53 -0000 +@@ -52,50 +52,34 @@ + * @author Andrew Selkirk + * @version 1.0 + */ +-public class CellRendererPane extends Container implements Accessible { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleCellRendererPane +- */ +- protected class AccessibleCellRendererPane extends AccessibleAWTContainer { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleCellRendererPane +- * @param component TODO +- */ +- protected AccessibleCellRendererPane(CellRendererPane component) { +- super(); +- // TODO +- } // AccessibleCellRendererPane() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.PANEL; +- } // getAccessibleRole() +- +- +- } // AccessibleCellRendererPane +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++public class CellRendererPane extends Container implements Accessible ++{ ++ private static final long serialVersionUID = -7642183829532984273L; ++ ++ /** ++ * AccessibleCellRendererPane ++ */ ++ protected class AccessibleCellRendererPane extends AccessibleAWTContainer ++ { ++ private static final long serialVersionUID = -8981090083147391074L; ++ ++ /** ++ * Constructor AccessibleCellRendererPane ++ * @param component TODO ++ */ ++ protected AccessibleCellRendererPane() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * @returns AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.PANEL; ++ } ++ } + + /** + * accessibleContext +@@ -205,16 +189,15 @@ + // TODO + } // paintComponent() + +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleCellRendererPane(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // CellRendererPane ++ /** ++ * getAccessibleContext ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleCellRendererPane(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/ComboBoxEditor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ComboBoxEditor.java,v +retrieving revision 1.3 +diff -u -r1.3 ComboBoxEditor.java +--- javax/swing/ComboBoxEditor.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/ComboBoxEditor.java 6 Sep 2004 16:35:53 -0000 +@@ -42,49 +42,56 @@ + + /** + * ComboBoxEditor +- * @author Andrew Selkirk +- * @version 1.0 ++ * ++ * @author Andrew Selkirk ++ * @author Olga Rodimina ++ * @version 1.0 + */ +-public interface ComboBoxEditor { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getEditorComponent +- * @returns Component +- */ +- Component getEditorComponent(); +- +- /** +- * setItem +- * @param item TODO +- */ +- void setItem(Object item); +- +- /** +- * getItem +- * @returns Object +- */ +- Object getItem(); +- +- /** +- * selectAll +- */ +- void selectAll(); +- +- /** +- * addActionListener +- * @param listener TODO +- */ +- void addActionListener(ActionListener listener); +- +- /** +- * removeActionListener +- * @param listener TODO +- */ +- void removeActionListener(ActionListener listener); +- +- ++public interface ComboBoxEditor ++{ ++ /** ++ * This method returns component that will be used by the combo box to ++ * display/edit currently selected item in the combo box. ++ * ++ * @return Component that will be used by the combo box to display/edit ++ * currently selected item ++ */ ++ Component getEditorComponent(); ++ ++ /** ++ * Sets item that should be editted when any editting operation is performed ++ * by the user. The value is always equal to the currently selected value ++ * in the combo box. Thus, whenever a different value is selected from the ++ * combo box list then this method should be called to change editting item ++ * to the new selected item. ++ * ++ * @param selectedItem item that is currently selected in the combo box ++ */ ++ void setItem(Object item); ++ ++ /** ++ * This method returns item that is currently editable. ++ * ++ * @return Item in the combo box that is currently editable ++ */ ++ Object getItem(); ++ ++ /** ++ * selectAll ++ */ ++ void selectAll(); ++ ++ /** ++ * This method adds specified ActionListener to this ComboBoxEditor. ++ * ++ * @param listener ++ */ ++ void addActionListener(ActionListener listener); ++ ++ /** ++ * This method removes given ActionListener from this ComboBoxEditor. ++ * ++ * @param listener TODO ++ */ ++ void removeActionListener(ActionListener listener); + } // ComboBoxEditor +Index: javax/swing/ComboBoxModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ComboBoxModel.java,v +retrieving revision 1.2 +diff -u -r1.2 ComboBoxModel.java +--- javax/swing/ComboBoxModel.java 12 Oct 2003 13:20:49 -0000 1.2 ++++ javax/swing/ComboBoxModel.java 6 Sep 2004 16:35:53 -0000 +@@ -37,28 +37,32 @@ + + package javax.swing; + ++ + /** +- * ComboBoxModel +- * @author Andrew Selkirk +- * @version 1.0 ++ * ComboBoxModel is a data model for JComboBox. This model keeps ++ * track of elements contained in the JComboBox as well as the current ++ * combo box selection. Whenever selection in the JComboBox changes, the ++ * ComboBoxModel should fire ListDataEvents to ComboBox's ListDataListeners. ++ * ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public interface ComboBoxModel extends ListModel { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * setSelectedItem +- * @param item TODO +- */ +- void setSelectedItem(Object item); +- +- /** +- * getSelectedItem +- * @returns Object +- */ +- Object getSelectedItem(); +- ++public interface ComboBoxModel extends ListModel ++{ ++ /** ++ * This method sets the selected item in the combo box. Class ++ * implementing this interface should fire ListDataEvents to ++ * all registered ListDataListeners to indicated that the ++ * selection has changed. ++ * ++ * @param item item in the combo box that should be selected ++ */ ++ void setSelectedItem(Object item); + ++ /** ++ * The method returns currently selected item in the combo box ++ * ++ * @returns item that is currently selected in the combo box. ++ */ ++ Object getSelectedItem(); + } // ComboBoxModel +Index: javax/swing/ComponentInputMap.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ComponentInputMap.java,v +retrieving revision 1.1 +diff -u -r1.1 ComponentInputMap.java +--- javax/swing/ComponentInputMap.java 9 Aug 2002 04:26:10 -0000 1.1 ++++ javax/swing/ComponentInputMap.java 6 Sep 2004 16:35:53 -0000 +@@ -1,5 +1,5 @@ + /* ComponentInputMap.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,79 +37,94 @@ + + package javax.swing; + ++ + /** +- * ComponentInputMap + * @author Andrew Selkirk +- * @version 1.0 ++ * @author Michael Koch + */ +-public class ComponentInputMap extends InputMap { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- ++public class ComponentInputMap extends InputMap ++{ + /** +- * component ++ * The component to notify. + */ + private JComponent component; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ComponentInputMap +- * @param value0 TODO +- */ +- public ComponentInputMap(JComponent value0) { +- // TODO +- } // ComponentInputMap() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * put +- * @param keystroke TODO +- * @param value TODO +- */ +- public void put(KeyStroke keystroke, Object value) { +- // TODO +- } // put() +- + /** +- * clear +- */ +- public void clear() { +- // TODO +- } // clear() +- +- /** +- * remove +- * @param keystroke TODO +- */ +- public void remove(KeyStroke keystroke) { +- // TODO +- } // remove() +- +- /** +- * setParent +- * @param parent TODO +- */ +- public void setParent(InputMap parent) { +- // TODO +- } // setParent() +- +- /** +- * getComponent +- * @returns JComponent +- */ +- public JComponent getComponent() { +- return null; // TODO +- } // getComponent() +- +- +-} // ComponentInputMap ++ * Creates ComponentInputMap object that notifies the given ++ * component about changes to it. ++ * ++ * @param comp the component to notify ++ * ++ * @exception IllegalArgumentException if comp is null ++ */ ++ public ComponentInputMap(JComponent comp) ++ { ++ if (comp == null) ++ throw new IllegalArgumentException(); ++ ++ this.component = comp; ++ } ++ ++ /** ++ * Puts a new entry into the InputMap. ++ * If actionMapKey is null an existing entry will be removed. ++ * ++ * @param keystroke the keystroke for the entry ++ * @param actionMapKey the action. ++ */ ++ public void put(KeyStroke keystroke, Object value) ++ { ++ super.put(keystroke, value); ++ // FIXME: Notify component. ++ } ++ ++ /** ++ * Clears the InputMap. ++ */ ++ public void clear() ++ { ++ super.clear(); ++ // FIXME: Notify component. ++ } ++ ++ /** ++ * Remove an entry from the InputMap. ++ * ++ * @param key the key of the entry to remove ++ */ ++ public void remove(KeyStroke keystroke) ++ { ++ super.remove(keystroke); ++ // FIXME: Notify component. ++ } ++ ++ /** ++ * Sets a parent for this ComponentInputMap. ++ * ++ * @param parentMap the new parent ++ * ++ * @exception IllegalArgument if parentMap is not a ++ * ComponentInputMap or not associated with the same component ++ */ ++ public void setParent(InputMap parentMap) ++ { ++ if (! (parentMap instanceof ComponentInputMap)) ++ throw new IllegalArgumentException(); ++ ++ if (((ComponentInputMap) parentMap).getComponent() != component) ++ throw new IllegalArgumentException(); ++ ++ super.setParent(parentMap); ++ // FIXME: Notify component. ++ } ++ ++ /** ++ * Returns the component to notify about changes. ++ * ++ * @return a JComponent object ++ */ ++ public JComponent getComponent() ++ { ++ return component; ++ } ++} +Index: javax/swing/DefaultBoundedRangeModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultBoundedRangeModel.java,v +retrieving revision 1.5 +diff -u -r1.5 DefaultBoundedRangeModel.java +--- javax/swing/DefaultBoundedRangeModel.java 7 Jan 2004 14:42:03 -0000 1.5 ++++ javax/swing/DefaultBoundedRangeModel.java 6 Sep 2004 16:35:53 -0000 +@@ -203,7 +203,7 @@ + * Changes the current value of this bounded range model. In a + * scroll bar visualization of a {@link BoundedRangeModel}, the + * value is displayed as the position of the thumb; +- * changing the value of a scroll bar’s model ++ * changing the value of a scroll bar's model + * thus moves the thumb to a different position. + */ + public void setValue(int value) +Index: javax/swing/DefaultButtonModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultButtonModel.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultButtonModel.java +--- javax/swing/DefaultButtonModel.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/DefaultButtonModel.java 6 Sep 2004 16:35:53 -0000 +@@ -1,5 +1,5 @@ +-/* DefaultButtonModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* DefaultButtonModel.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,144 +35,502 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.awt.event.ItemEvent; + import java.awt.event.ItemListener; ++import java.awt.event.KeyEvent; + import java.io.Serializable; + import java.util.EventListener; +-import java.util.Vector; + import javax.swing.event.ChangeEvent; + import javax.swing.event.ChangeListener; + import javax.swing.event.EventListenerList; + +-public class DefaultButtonModel +- implements ButtonModel, Serializable ++ ++/** ++ * The purpose of this class is to model the dynamic state of an abstract ++ * button. The concrete button type holding this state may be a a "toggle" ++ * button (checkbox, radio button) or a "push" button (menu button, button). ++ * If the model is disabled, only the "selected" property can be changed. An ++ * attempt to change the "armed", "rollover" or "pressed" properties while ++ * the model is disabled will be blocked. Any successful (non-blocked) change ++ * to the model's properties will trigger the firing of a ChangeEvent. Any ++ * change to the "selected" property will trigger the firing of an ItemEvent ++ * in addition to ChangeEvent. This is true whether the model is enabled or ++ * not. One other state change is special: the transition from "enabled, ++ * armed and pressd" to "enabled, armed and not-pressed". This is considered ++ * the "trailing edge" of a successful mouse click, and therefore fires an ++ * ActionEvent in addition to a ChangeEvent. In all other respects this class ++ * is just a container of boolean flags. ++ * ++ * @author Graydon Hoare (graydon_at_redhat.com) ++ */ ++public class DefaultButtonModel implements ButtonModel, Serializable + { ++ /** DOCUMENT ME! */ + static final long serialVersionUID = -5342609566534980231L; + +- Vector actions = new Vector(); +- +- Vector items = new Vector(); +- Vector changes = new Vector(); +- ButtonGroup group; +- JComponent comp; +- +- +- DefaultButtonModel(JComponent a) +- { +- comp = a; +- } +- +- +- public Object[] getSelectedObjects() +- { +- return null; +- } +- +- +- public void fireItemStateChanged(ItemEvent event) +- { +- for (int i=0;ipartially committed to being ++ * pressed, but not entirely. This usually happens when a user has pressed ++ * but not yet released the mouse button. ++ */ ++ public static final int ARMED = 1; ++ ++ /** ++ * State constant indicating that the button is enabled. Buttons cannot be ++ * pressed or selected unless they are enabled. ++ */ ++ public static final int ENABLED = 8; ++ ++ /** ++ * State constant indicating that the user is holding down the button. When ++ * this transitions from true to false, an ActionEvent may be fired, ++ * depending on the value of the "armed" property. ++ */ ++ public static final int PRESSED = 4; ++ ++ /** ++ * State constant indicating that the mouse is currently positioned over the ++ * button. ++ */ ++ public static final int ROLLOVER = 16; ++ ++ /** ++ * State constant indicating that the button is selected. This constant is ++ * only meaningful for toggle-type buttons (radio buttons, checkboxes). ++ */ ++ public static final int SELECTED = 2; ++ ++ /** ++ * Represents the "state properties" (armed, enabled, pressed, rollover and ++ * selected) by a bitwise combination of integer constants. ++ */ ++ protected int stateMask = ENABLED; ++ ++ /** ++ * List of ItemListeners, ChangeListeners, and ActionListeners registered on ++ * this model. ++ */ ++ protected EventListenerList listenerList = new EventListenerList(); ++ ; ++ ++ /** The single ChangeEvent this model (re)uses to call its ChangeListeners. */ ++ protected ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ /** ++ * The group this model belongs to. Only one button in a group may be ++ * selected at any given time. ++ */ ++ protected ButtonGroup group; ++ ++ /** ++ * The key code (one of {@link java.awt.event.KeyEvent} VK_) used to press ++ * this button via a keyboard interface. ++ */ ++ protected int mnemonic = KeyEvent.VK_UNDEFINED; ++ ++ /** ++ * The string used as the "command" property of any ActionEvent this model ++ * sends. ++ */ ++ protected String actionCommand; ++ ++ /** ++ * Creates a new DefaultButtonModel object. ++ */ ++ public DefaultButtonModel() ++ { ++ } ++ ++ /** ++ * Return null. Use {@link AbstractButton} if you wish to ++ * interface with a button via an {@link ItemSelectable} interface. ++ * ++ * @return null ++ */ ++ public Object[] getSelectedObjects() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns a specified class of listeners. ++ * ++ * @param listenerType the type of listener to return ++ * ++ * @return array of listeners ++ */ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ /** ++ * Add an ActionListener to the model. Usually only called to subscribe an ++ * AbstractButton's listener to the model. ++ * ++ * @param l The listener to add ++ */ ++ public void addActionListener(ActionListener l) ++ { ++ listenerList.add(ActionListener.class, l); ++ } ++ ++ /** ++ * Remove an ActionListener to the model. Usually only called to unsubscribe ++ * an AbstractButton's listener to the model. ++ * ++ * @param l The listener to remove ++ */ ++ public void removeActionListener(ActionListener l) ++ { ++ listenerList.remove(ActionListener.class, l); ++ } ++ ++ /** ++ * Returns all registered ActionListener objects. ++ * ++ * @return array of ActionListener objects ++ */ ++ public ActionListener[] getActionListeners() ++ { ++ return (ActionListener[]) listenerList.getListeners(ActionListener.class); ++ } ++ ++ /** ++ * Add an ItemListener to the model. Usually only called to subscribe an ++ * AbstractButton's listener to the model. ++ * ++ * @param l The listener to add ++ */ ++ public void addItemListener(ItemListener l) ++ { ++ listenerList.add(ItemListener.class, l); ++ } ++ ++ /** ++ * Remove an ItemListener to the model. Usually only called to unsubscribe ++ * an AbstractButton's listener to the model. ++ * ++ * @param l The listener to remove ++ */ ++ public void removeItemListener(ItemListener l) ++ { ++ listenerList.remove(ItemListener.class, l); ++ } ++ ++ /** ++ * Returns all registered ItemListener objects. ++ * ++ * @return array of ItemListener objects ++ */ ++ public ItemListener[] getItemListeners() ++ { ++ return (ItemListener[]) listenerList.getListeners(ItemListener.class); ++ } ++ ++ /** ++ * Add a ChangeListener to the model. Usually only called to subscribe an ++ * AbstractButton's listener to the model. ++ * ++ * @param l The listener to add ++ */ ++ public void addChangeListener(ChangeListener l) ++ { ++ listenerList.add(ChangeListener.class, l); ++ } ++ ++ /** ++ * Remove a ChangeListener to the model. Usually only called to unsubscribe ++ * an AbstractButton's listener to the model. ++ * ++ * @param l The listener to remove ++ */ ++ public void removeChangeListener(ChangeListener l) ++ { ++ listenerList.remove(ChangeListener.class, l); ++ } ++ ++ /** ++ * Returns all registered ChangeListener objects. ++ * ++ * @return array of ChangeListener objects ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * Inform each ItemListener in the {@link listenerList} that an ItemEvent ++ * has occurred. This happens in response to any change to the {@link ++ * stateMask} field. ++ * ++ * @param e The ItemEvent to fire ++ */ ++ public void fireItemStateChanged(ItemEvent e) ++ { ++ ItemListener[] ll = getItemListeners(); ++ ++ for (int i = 0; i < ll.length; i++) ++ ll[i].itemStateChanged(e); ++ } ++ ++ /** ++ * Inform each ActionListener in the {@link listenerList} that an ++ * ActionEvent has occurred. This happens in response to the any change to ++ * the {@link stateMask} field which makes the enabled, armed and pressed ++ * properties all simultaneously true. ++ * ++ * @param e The ActionEvent to fire ++ */ ++ public void fireActionPerformed(ActionEvent e) ++ { ++ ActionListener[] ll = getActionListeners(); ++ ++ for (int i = 0; i < ll.length; i++) ++ ll[i].actionPerformed(e); ++ } ++ ++ /** ++ * Inform each ChangeListener in the {@link listenerList} that a ChangeEvent ++ * has occurred. This happens in response to the any change to a property ++ * of the model. ++ */ ++ public void fireStateChanged() ++ { ++ ChangeListener[] ll = getChangeListeners(); ++ ++ for (int i = 0; i < ll.length; i++) ++ ll[i].stateChanged(changeEvent); ++ } ++ ++ /** ++ * Helper method to fire a ChangeEvent with the model as the event's source. ++ * ++ * @param stateflag DOCUMENT ME! ++ * @param b DOCUMENT ME! ++ */ ++ protected void changeState(int stateflag, boolean b) ++ { ++ int oldstate = stateMask; ++ int newstate; ++ ++ if (b) ++ newstate = oldstate | stateflag; ++ else ++ newstate = oldstate & ~ stateflag; ++ ++ if (oldstate == newstate) ++ return; ++ ++ if ((stateflag != SELECTED) && (stateflag != ENABLED) ++ && (stateMask & ENABLED) == 0) ++ return; ++ ++ stateMask = newstate; ++ ++ fireStateChanged(); ++ ++ if ((oldstate & SELECTED) == 0 && (newstate & SELECTED) == SELECTED) ++ { ++ fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, ++ null, ItemEvent.SELECTED)); ++ if (group != null) ++ group.setSelected(this, true); ++ } ++ ++ else if ((oldstate & SELECTED) == SELECTED && (newstate & SELECTED) == 0) ++ { ++ fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, ++ null, ItemEvent.DESELECTED)); ++ if (group != null) ++ group.setSelected(this, false); ++ } ++ ++ else if (((oldstate & ARMED) == ARMED && (oldstate & PRESSED) == PRESSED) ++ && ((newstate & ARMED) == ARMED && (newstate & PRESSED) == 0)) ++ fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, ++ actionCommand)); ++ } ++ ++ /** ++ * Get the value of the model's "armed" property. ++ * ++ * @return The current "armed" property ++ */ ++ public boolean isArmed() ++ { ++ return (stateMask & ARMED) == ARMED; ++ } ++ ++ /** ++ * Set the value of the model's "armed" property. ++ * ++ * @param a The new "armed" property ++ */ ++ public void setArmed(boolean a) ++ { ++ changeState(ARMED, a); ++ } ++ ++ /** ++ * Get the value of the model's "enabled" property. ++ * ++ * @return The current "enabled" property. ++ */ ++ public boolean isEnabled() ++ { ++ return (stateMask & ENABLED) == ENABLED; ++ } ++ ++ /** ++ * Set the value of the model's "enabled" property. ++ * ++ * @param e The new "enabled" property ++ */ ++ public void setEnabled(boolean e) ++ { ++ changeState(ENABLED, e); ++ } ++ ++ /** ++ * Set the value of the model's "pressed" property. ++ * ++ * @param p The new "pressed" property ++ */ ++ public void setPressed(boolean p) ++ { ++ changeState(PRESSED, p); ++ } ++ ++ /** ++ * Get the value of the model's "pressed" property. ++ * ++ * @return The current "pressed" property ++ */ ++ public boolean isPressed() ++ { ++ return (stateMask & PRESSED) == PRESSED; ++ } ++ ++ /** ++ * Set the value of the model's "rollover" property. ++ * ++ * @param r The new "rollover" property ++ */ ++ public void setRollover(boolean r) ++ { ++ changeState(ROLLOVER, r); ++ } ++ ++ /** ++ * Set the value of the model's "selected" property. ++ * ++ * @param s The new "selected" property ++ */ ++ public void setSelected(boolean s) ++ { ++ changeState(SELECTED, s); ++ } ++ ++ /** ++ * Get the value of the model's "selected" property. ++ * ++ * @return The current "selected" property ++ */ ++ public boolean isSelected() ++ { ++ return (stateMask & SELECTED) == SELECTED; ++ } ++ ++ /** ++ * Get the value of the model's "rollover" property. ++ * ++ * @return The current "rollover" property ++ */ ++ public boolean isRollover() ++ { ++ return (stateMask & ROLLOVER) == ROLLOVER; ++ } ++ ++ /** ++ * Get the value of the model's "mnemonic" property. ++ * ++ * @return The current "mnemonic" property ++ */ ++ public int getMnemonic() ++ { ++ return mnemonic; ++ } ++ ++ /** ++ * Set the value of the model's "mnemonic" property. ++ * ++ * @param key The new "mnemonic" property ++ */ ++ public void setMnemonic(int key) ++ { ++ if (mnemonic != key) ++ { ++ mnemonic = key; ++ fireStateChanged(); ++ } ++ } ++ ++ /** ++ * Set the value of the model's "actionCommand" property. This property is ++ * used as the "command" property of the {@link ActionEvent} fired from the ++ * model. ++ * ++ * @param s The new "actionCommand" property. ++ */ ++ public void setActionCommand(String s) ++ { ++ if (actionCommand != s) ++ { ++ actionCommand = s; ++ fireStateChanged(); ++ } ++ } ++ ++ /** ++ * Returns the current value of the model's "actionCommand" property. ++ * ++ * @return The current "actionCommand" property ++ */ ++ public String getActionCommand() ++ { ++ return actionCommand; ++ } ++ ++ /** ++ * Set the value of the model's "group" property. The model is said to be a ++ * member of the {@link ButtonGroup} held in its "group" property, and only ++ * one model in a given group can have their "selected" property be ++ * true at a time. ++ * ++ * @param g The new "group" property ++ */ ++ public void setGroup(ButtonGroup g) ++ { ++ if (group != g) ++ { ++ group = g; ++ fireStateChanged(); ++ } ++ } ++ ++ /** ++ * Returns the current value of the model's "group" property. ++ * ++ * @return The value of the "group" property ++ */ ++ public ButtonGroup getGroup() ++ { ++ return group; ++ } + } +- +- +- +- +- +- +- +Index: javax/swing/DefaultCellEditor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultCellEditor.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultCellEditor.java +--- javax/swing/DefaultCellEditor.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/DefaultCellEditor.java 6 Sep 2004 16:35:53 -0000 +@@ -58,50 +58,34 @@ + { + static final long serialVersionUID = 3564035141373880027L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * EditorDelegate +- */ +- protected class EditorDelegate implements ActionListener, +- ItemListener, Serializable { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * value +- */ +- protected Object value; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor EditorDelegate +- * @param value0 TODO +- */ +- protected EditorDelegate(DefaultCellEditor editor) { +- // TODO +- } // EditorDelegate() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * setValue +- * @param event TODO +- */ +- public void setValue(Object event) { +- // TODO +- } // setValue() ++ /** ++ * EditorDelegate ++ */ ++ protected class EditorDelegate ++ implements ActionListener, ItemListener, Serializable ++ { ++ private static final long serialVersionUID = -1420007406015481933L; ++ ++ /** ++ * value ++ */ ++ protected Object value; ++ ++ /** ++ * Constructor EditorDelegate ++ * @param value0 TODO ++ */ ++ protected EditorDelegate() ++ { ++ } ++ ++ /** ++ * setValue ++ * @param event TODO ++ */ ++ public void setValue(Object event) ++ { ++ } + + /** + * getCellEditorValue +@@ -172,11 +156,6 @@ + + } // EditorDelegate + +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- + /** + * editorComponent + */ +@@ -192,11 +171,6 @@ + */ + protected int clickCountToStart; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor DefaultCellEditor + * @param textfield TODO +@@ -221,11 +195,6 @@ + // TODO + } // DefaultCellEditor() + +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- + /** + * getComponent + * @returns Component +@@ -320,6 +289,4 @@ + Object value, boolean isSelected, int row, int column) { + return null; // TODO + } // getTableCellEditorComponent() +- +- +-} // DefaultCellEditor ++} +Index: javax/swing/DefaultComboBoxModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultComboBoxModel.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultComboBoxModel.java +--- javax/swing/DefaultComboBoxModel.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/DefaultComboBoxModel.java 6 Sep 2004 16:35:53 -0000 +@@ -38,146 +38,191 @@ + package javax.swing; + + import java.io.Serializable; ++import java.util.Arrays; + import java.util.Vector; + ++ + /** +- * DefaultComboBoxModel +- * @author Andrew Selkirk +- * @version 1.0 ++ * DefaultComboBoxModel is a data model for JComboBox. This model keeps track ++ * of elements contained in the JComboBox as well as the current combo box ++ * selection. Whenever selection in the JComboBox changes, the ComboBoxModel ++ * will fire ListDataEvents to ComboBox's ListDataListeners. ++ * ++ * @author Andrew Selkirk ++ * @author Olga Rodimina ++ * @version 1.0 + */ +-public class DefaultComboBoxModel extends AbstractListModel +- implements MutableComboBoxModel, Serializable ++public class DefaultComboBoxModel extends AbstractListModel ++ implements MutableComboBoxModel, Serializable + { + static final long serialVersionUID = 6698657703676921904L; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * list +- */ +- private Vector list; +- +- /** +- * selectedItem +- */ +- private Object selectedItem; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultComboBoxModel +- */ +- public DefaultComboBoxModel() { +- // TODO +- } // DefaultComboBoxModel() +- +- /** +- * Constructor DefaultComboBoxModel +- * @param items TODO +- */ +- public DefaultComboBoxModel(Object[] items) { +- // TODO +- } // DefaultComboBoxModel() +- +- /** +- * Constructor DefaultComboBoxModel +- * @param vector TODO +- */ +- public DefaultComboBoxModel(Vector vector) { +- // TODO +- } // DefaultComboBoxModel() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * addElement +- * @param object TODO +- */ +- public void addElement(Object object) { +- // TODO +- } // addElement() +- +- /** +- * removeElementAt +- * @param index TODO +- */ +- public void removeElementAt(int index) { +- // TODO +- } // removeElementAt() +- +- /** +- * insertElementAt +- * @param object TODO +- * @param index TODO +- */ +- public void insertElementAt(Object object, int index) { +- // TODO +- } // insertElementAt() +- +- /** +- * removeElement +- * @param object TODO +- */ +- public void removeElement(Object object) { +- // TODO +- } // removeElement() +- +- /** +- * removeAllElements +- */ +- public void removeAllElements() { +- // TODO +- } // removeAllElements() +- +- /** +- * getSize +- * @returns int +- */ +- public int getSize() { +- return 0; // TODO +- } // getSize() +- +- /** +- * setSelectedItem +- * @param object TODO +- */ +- public void setSelectedItem(Object object) { +- // TODO +- } // setSelectedItem() +- +- /** +- * getSelectedItem +- * @returns Object +- */ +- public Object getSelectedItem() { +- return null; // TODO +- } // getSelectedItem() +- +- /** +- * getElementAt +- * @param index TODO +- * @returns Object +- */ +- public Object getElementAt(int index) { +- return null; // TODO +- } // getElementAt() +- +- /** +- * getIndexOf +- * @param object TODO +- * @returns int +- */ +- public int getIndexOf(Object object) { +- return 0; // TODO +- } // getIndexOf() +- +- +-} // DefaultComboBoxModel ++ /** ++ * List containing items in the combo box ++ */ ++ private Vector list; ++ ++ /** ++ * Currently selected item in the combo box list ++ */ ++ private Object selectedItem = null; ++ ++ /** ++ * Constructor DefaultComboBoxModel. Create empty JComboBox. ++ */ ++ public DefaultComboBoxModel() ++ { ++ list = new Vector(); ++ } ++ ++ /** ++ * Constructs new DefaultComboBoxModel object and initializes its item list ++ * to values in the given array. ++ * ++ * @param items array containing items of the combo box. ++ */ ++ public DefaultComboBoxModel(Object[] items) ++ { ++ list = new Vector(Arrays.asList(items)); ++ } ++ ++ /** ++ * Consturcts new DefaultComboBoxModel object and initializes its item list ++ * to values in the given vector. ++ * ++ * @param vector Vector containing items for this combo box. ++ */ ++ public DefaultComboBoxModel(Vector vector) ++ { ++ this.list = vector; ++ } ++ ++ /** ++ * This method adds element to the combo box list. It fires ListDataEvent ++ * indicating that component was added to the combo box to all of the ++ * JComboBox's registered ListDataListeners. ++ * ++ * @param object item to add to the combo box list ++ */ ++ public void addElement(Object object) ++ { ++ list.add(object); ++ fireIntervalAdded(this, list.size(), list.size()); ++ } ++ ++ /** ++ * This method removes element at the specified index from the combo box ++ * list. It fires ListDataEvent indicating that component was removed from ++ * the combo box list to all of the JComboBox's registered ++ * ListDataListeners. ++ * ++ * @param index index specifying location of the element to remove in the ++ * combo box list. ++ */ ++ public void removeElementAt(int index) ++ { ++ list.remove(index); ++ fireIntervalRemoved(this, index, index); ++ } ++ ++ /** ++ * This method inserts given object to the combo box list at the specified ++ * index. It fires ListDataEvent indicating that component was inserted to ++ * the combo box list to all of the JComboBox's registered ++ * ListDataListeners. ++ * ++ * @param object element to insert ++ * @param index index specifing position in the list where given element ++ * should be inserted. ++ */ ++ public void insertElementAt(Object object, int index) ++ { ++ list.insertElementAt(object, index); ++ fireIntervalAdded(this, index, index); ++ } ++ ++ /** ++ * Removes given object from the combo box list. It fires ListDataEvent ++ * indicating that component was removed from the combo box list to all of ++ * the JComboBox's registered ListDataListeners. ++ * ++ * @param object Element that will be removed from the combo box list ++ */ ++ public void removeElement(Object object) ++ { ++ int index = getIndexOf(object); ++ if (index != -1) ++ removeElementAt(index); ++ } ++ ++ /** ++ * Removes all the items from the JComboBox's item list. It fires ++ * ListDataEvent indicating that all the elements were removed from the ++ * combo box list to all of the JComboBox's registered ListDataListeners. ++ */ ++ public void removeAllElements() ++ { ++ int listSize = getSize(); ++ list.clear(); ++ fireIntervalAdded(this, 0, listSize - 1); ++ } ++ ++ /** ++ * Returns number of items in the combo box list ++ * ++ * @return number of items in the combo box list ++ */ ++ public int getSize() ++ { ++ return list.size(); ++ } ++ ++ /** ++ * Selects given object in the combo box list. This method fires ++ * ListDataEvent to all registered ListDataListeners of the JComboBox. The ++ * start and end index of the event is set to -1 to indicate combo box's ++ * selection has changed, and not its contents. ++ * ++ * @param object item to select in the JComboBox ++ */ ++ public void setSelectedItem(Object object) ++ { ++ selectedItem = object; ++ fireContentsChanged(this, -1, -1); ++ } ++ ++ /** ++ * Returns currently selected item in the combo box list ++ * ++ * @return currently selected item in the combo box list ++ */ ++ public Object getSelectedItem() ++ { ++ return selectedItem; ++ } ++ ++ /** ++ * Returns element in the combo box list located at the given index ++ * ++ * @param index specifying location of the element in the list ++ * ++ * @return return element in the combo box list located at the given index ++ */ ++ public Object getElementAt(int index) ++ { ++ return list.elementAt(index); ++ } ++ ++ /** ++ * Returns index of the specified object in the combo box list. ++ * ++ * @param object element to look for in the combo box list . ++ * ++ * @return Index specifying position of the specified element in combo box ++ * list. ++ */ ++ public int getIndexOf(Object object) ++ { ++ return list.indexOf(object); ++ } ++} +Index: javax/swing/DefaultDesktopManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultDesktopManager.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultDesktopManager.java +--- javax/swing/DefaultDesktopManager.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/DefaultDesktopManager.java 6 Sep 2004 16:35:54 -0000 +@@ -37,249 +37,594 @@ + + package javax.swing; + ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; + import java.awt.Rectangle; ++import java.beans.PropertyVetoException; + import java.io.Serializable; ++import javax.swing.JDesktopPane; ++import javax.swing.JInternalFrame; ++import javax.swing.JInternalFrame.JDesktopIcon; ++ + + /** +- * DefaultDesktopManager +- * @author Andrew Selkirk +- * @version 1.0 ++ * DefaultDesktopManager is the default implementation of DesktopManager for ++ * swing. It implements the basic beaviours for JInternalFrames in arbitrary ++ * parents. The methods provided by the class are not meant to be called by ++ * the user, instead, the JInternalFrame methods will call these methods. + */ + public class DefaultDesktopManager implements DesktopManager, Serializable + { ++ /** DOCUMENT ME! */ + static final long serialVersionUID = 4657624909838017887L; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * HAS_BEEN_ICONIFIED_PROPERTY +- */ +- static final String HAS_BEEN_ICONIFIED_PROPERTY = ""; // TODO +- +- /** +- * DEFAULT_DRAG_MODE +- */ +- static final int DEFAULT_DRAG_MODE = 0; // TODO +- +- /** +- * OUTLINE_DRAG_MODE +- */ +- static final int OUTLINE_DRAG_MODE = 0; // TODO +- +- /** +- * FASTER_DRAG_MODE +- */ +- static final int FASTER_DRAG_MODE = 0; // TODO +- +- /** +- * dragMode +- */ +- int dragMode; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultDesktopManager +- */ +- public DefaultDesktopManager() { +- // TODO +- } // DefaultDesktopManager() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * openFrame +- * @param frame TODO +- */ +- public void openFrame(JInternalFrame frame) { +- // TODO +- } // openFrame() +- +- /** +- * closeFrame +- * @param frame TODO +- */ +- public void closeFrame(JInternalFrame frame) { +- // TODO +- } // closeFrame() +- +- /** +- * maximizeFrame +- * @param frame TODO +- */ +- public void maximizeFrame(JInternalFrame frame) { +- // TODO +- } // maximizeFrame() +- +- /** +- * minimizeFrame +- * @param frame TODO +- */ +- public void minimizeFrame(JInternalFrame frame) { +- // TODO +- } // minimizeFrame() +- +- /** +- * iconifyFrame +- * @param frame TODO +- */ +- public void iconifyFrame(JInternalFrame frame) { +- // TODO +- } // iconifyFrame() +- +- /** +- * deiconifyFrame +- * @param frame TODO +- */ +- public void deiconifyFrame(JInternalFrame frame) { +- // TODO +- } // deiconifyFrame() +- +- /** +- * activateFrame +- * @param frame TODO +- */ +- public void activateFrame(JInternalFrame frame) { +- // TODO +- } // activateFrame() +- +- /** +- * deactivateFrame +- * @param frame TODO +- */ +- public void deactivateFrame(JInternalFrame frame) { +- // TODO +- } // deactivateFrame() +- +- /** +- * beginDraggingFrame +- * @param component TODO +- */ +- public void beginDraggingFrame(JComponent component) { +- // TODO +- } // beginDraggingFrame() +- +- /** +- * dragFrame +- * @param component TODO +- * @param newX TODO +- * @param newY TODO +- */ +- public void dragFrame(JComponent component, int newX, int newY) { +- // TODO +- } // dragFrame() +- +- /** +- * endDraggingFrame +- * @param component TODO +- */ +- public void endDraggingFrame(JComponent component) { +- // TODO +- } // endDraggingFrame() +- +- /** +- * beginResizingFrame +- * @param component TODO +- * @param direction TODO +- */ +- public void beginResizingFrame(JComponent component, int direction) { +- // TODO +- } // beginResizingFrame() +- +- /** +- * resizeFrame +- * @param component TODO +- * @param newX TODO +- * @param newY TODO +- * @param newWidth TODO +- * @param newHeight TODO +- */ +- public void resizeFrame(JComponent component, int newX, int newY, +- int newWidth, int newHeight) { +- // TODO +- } // resizeFrame() +- +- /** +- * endResizingFrame +- * @param component TODO +- */ +- public void endResizingFrame(JComponent component) { +- // TODO +- } // endResizingFrame() +- +- /** +- * setBoundsForFrame +- * @param component TODO +- * @param newX TODO +- * @param newY TODO +- * @param newWidth TODO +- * @param newHeight TODO +- */ +- public void setBoundsForFrame(JComponent component, int newX, +- int newY, int newWidth, int newHeight) { +- // TODO +- } // setBoundsForFrame() +- +- /** +- * removeIconFor +- * @param frame TODO +- */ +- protected void removeIconFor(JInternalFrame frame) { +- // TODO +- } // removeIconFor() +- +- /** +- * getBoundsForIconOf +- * @param frame TODO +- * @returns Rectangle +- */ +- protected Rectangle getBoundsForIconOf(JInternalFrame frame) { +- return null; // TODO +- } // getBoundsForIconOf() +- +- /** +- * setPreviousBounds +- * @param frame TODO +- * @param rect TODO +- */ +- protected void setPreviousBounds(JInternalFrame frame, Rectangle rect) { +- // TODO +- } // setPreviousBounds() +- +- /** +- * getPreviousBounds +- * @param frame TODO +- * @returns Rectangle +- */ +- protected Rectangle getPreviousBounds(JInternalFrame frame) { +- return null; // TODO +- } // getPreviousBounds() +- +- /** +- * setWasIcon +- * @param frame TODO +- * @param value TODO +- */ +- protected void setWasIcon(JInternalFrame frame, Boolean value) { +- // TODO +- } // setWasIcon() +- +- /** +- * wasIcon +- * @param frame TODO +- * @returns boolean +- */ +- protected boolean wasIcon(JInternalFrame frame) { +- return false; // TODO +- } // wasIcon() +- ++ /** The property change event fired when the wasIcon property changes. */ ++ static final String WAS_ICON_ONCE_PROPERTY = "wasIconOnce"; + ++ /** ++ * The method of dragging used by the JDesktopPane that parents the ++ * JInternalFrame that is being dragged. ++ */ ++ private int currentDragMode = 0; ++ ++ /** ++ * The cache of the bounds used to draw the outline rectangle when ++ * OUTLINE_DRAG_MODE is used. ++ */ ++ private transient Rectangle dragCache = new Rectangle(); ++ ++ /** ++ * A cached JDesktopPane that is stored when the JInternalFrame is initially ++ * dragged. ++ */ ++ private transient Container pane; ++ ++ /** ++ * An array of Rectangles that holds the bounds of the JDesktopIcons in the ++ * JDesktopPane when looking for where to place a new icon. ++ */ ++ private transient Rectangle[] iconRects; ++ ++ /** ++ * This creates a new DefaultDesktopManager object. ++ */ ++ public DefaultDesktopManager() ++ { ++ } // DefaultDesktopManager() ++ ++ /** ++ * This method is not normally called since the user will typically add the ++ * JInternalFrame to a Container. If this is called, it will try to ++ * determine the parent of the JInternalFrame and remove any icon that ++ * represents this JInternalFrame and add this JInternalFrame. ++ * ++ * @param frame The JInternalFrame to open. ++ */ ++ public void openFrame(JInternalFrame frame) ++ { ++ Container c = frame.getParent(); ++ if (c == null) ++ c = frame.getDesktopIcon().getParent(); ++ if (c == null) ++ return; ++ ++ c.remove(frame.getDesktopIcon()); ++ c.add(frame); ++ frame.setVisible(true); ++ } // openFrame() ++ ++ /** ++ * This method removes the JInternalFrame and JDesktopIcon (if one is ++ * present) from their parents. ++ * ++ * @param frame The JInternalFrame to close. ++ */ ++ public void closeFrame(JInternalFrame frame) ++ { ++ Container c = frame.getParent(); ++ frame.doDefaultCloseAction(); ++ ++ if (c != null) ++ { ++ if (frame.isIcon()) ++ c.remove(frame.getDesktopIcon()); ++ else ++ c.remove(frame); ++ c.repaint(); ++ } ++ } // closeFrame() ++ ++ /** ++ * This method resizes the JInternalFrame to match its parent's bounds. ++ * ++ * @param frame The JInternalFrame to maximize. ++ */ ++ public void maximizeFrame(JInternalFrame frame) ++ { ++ // Can't maximize from iconified state. ++ // It can only return to maximized state, but that would fall under ++ // deiconify. ++ if (frame.isIcon()) ++ return; ++ frame.setNormalBounds(frame.getBounds()); ++ ++ Container p = frame.getParent(); ++ if (p != null) ++ { ++ Rectangle pBounds = p.getBounds(); ++ Insets insets = p.getInsets(); ++ pBounds.width -= insets.left + insets.right; ++ pBounds.height -= insets.top + insets.bottom; ++ ++ setBoundsForFrame(frame, 0, 0, pBounds.width, pBounds.height); ++ } ++ if (p instanceof JDesktopPane) ++ ((JDesktopPane) p).setSelectedFrame(frame); ++ else ++ { ++ try ++ { ++ frame.setSelected(true); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing. ++ } ++ } ++ } // maximizeFrame() ++ ++ /** ++ * This method restores the JInternalFrame's bounds to what they were ++ * previous to the setMaximize call. ++ * ++ * @param frame The JInternalFrame to minimize. ++ */ ++ public void minimizeFrame(JInternalFrame frame) ++ { ++ Rectangle normalBounds = frame.getNormalBounds(); ++ ++ JDesktopPane p = frame.getDesktopPane(); ++ if (p != null) ++ p.setSelectedFrame(frame); ++ else ++ { ++ try ++ { ++ frame.setSelected(true); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing. ++ } ++ } ++ ++ setBoundsForFrame(frame, normalBounds.x, normalBounds.y, ++ normalBounds.width, normalBounds.height); ++ } // minimizeFrame() ++ ++ /** ++ * This method removes the JInternalFrame from its parent and adds its ++ * JDesktopIcon representation. ++ * ++ * @param frame The JInternalFrame to iconify. ++ */ ++ public void iconifyFrame(JInternalFrame frame) ++ { ++ JDesktopPane p = frame.getDesktopPane(); ++ JDesktopIcon icon = frame.getDesktopIcon(); ++ if (p != null && p.getSelectedFrame() == frame) ++ p.setSelectedFrame(null); ++ else ++ { ++ try ++ { ++ frame.setSelected(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } ++ ++ Container c = frame.getParent(); ++ ++ if (! wasIcon(frame)) ++ { ++ Rectangle r = getBoundsForIconOf(frame); ++ icon.setBounds(r); ++ setWasIcon(frame, true); ++ } ++ ++ if (c != null) ++ { ++ if (icon != null) ++ { ++ c.add(icon); ++ icon.setVisible(true); ++ } ++ c.remove(frame); ++ } ++ } // iconifyFrame() ++ ++ /** ++ * This method removes the JInternalFrame's JDesktopIcon representation and ++ * adds the JInternalFrame back to its parent. ++ * ++ * @param frame The JInternalFrame to deiconify. ++ */ ++ public void deiconifyFrame(JInternalFrame frame) ++ { ++ JDesktopIcon icon = frame.getDesktopIcon(); ++ Container c = icon.getParent(); ++ ++ removeIconFor(frame); ++ c.add(frame); ++ frame.setVisible(true); ++ ++ if (! frame.isSelected()) ++ { ++ JDesktopPane p = frame.getDesktopPane(); ++ if (p != null) ++ p.setSelectedFrame(frame); ++ else ++ { ++ try ++ { ++ frame.setSelected(true); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing. ++ } ++ } ++ } ++ ++ c.invalidate(); ++ } // deiconifyFrame() ++ ++ /** ++ * This method activates the JInternalFrame by moving it to the front and ++ * selecting it. ++ * ++ * @param frame The JInternalFrame to activate. ++ */ ++ public void activateFrame(JInternalFrame frame) ++ { ++ JDesktopPane p = frame.getDesktopPane(); ++ ++ if (p != null) ++ p.setSelectedFrame(frame); ++ else ++ { ++ try ++ { ++ frame.setSelected(true); ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } ++ ++ frame.toFront(); ++ } // activateFrame() ++ ++ /** ++ * This method is called when the JInternalFrame loses focus. ++ * ++ * @param frame The JInternalFram to deactivate. ++ */ ++ public void deactivateFrame(JInternalFrame frame) ++ { ++ JDesktopPane p = frame.getDesktopPane(); ++ if (p != null) ++ { ++ if (p.getSelectedFrame() == frame) ++ p.setSelectedFrame(null); ++ } ++ else ++ { ++ try ++ { ++ frame.setSelected(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } ++ } // deactivateFrame() ++ ++ /** ++ * This method is called to indicate that the DesktopManager should prepare ++ * to drag the JInternalFrame. Any state information needed to drag the ++ * frame will be prepared now. ++ * ++ * @param component The JComponent to drag, usually a JInternalFrame. ++ */ ++ public void beginDraggingFrame(JComponent component) ++ { ++ if (component instanceof JDesktopIcon) ++ pane = ((JDesktopIcon) component).getInternalFrame().getDesktopPane(); ++ else ++ pane = ((JInternalFrame) component).getDesktopPane(); ++ if (pane == null) ++ return; ++ ++ dragCache = component.getBounds(); ++ ++ if (! (pane instanceof JDesktopPane)) ++ currentDragMode = JDesktopPane.LIVE_DRAG_MODE; ++ else ++ currentDragMode = ((JDesktopPane) pane).getDragMode(); ++ } // beginDraggingFrame() ++ ++ /** ++ * This method is called to drag the JInternalFrame to a new location. ++ * ++ * @param component The JComponent to drag, usually a JInternalFrame. ++ * @param newX The new x coordinate. ++ * @param newY The new y coordinate. ++ */ ++ public void dragFrame(JComponent component, int newX, int newY) ++ { ++ if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) ++ { ++ // FIXME: Do outline drag mode painting. ++ } ++ else ++ { ++ Rectangle b = component.getBounds(); ++ if (component instanceof JDesktopIcon) ++ component.setBounds(newX, newY, b.width, b.height); ++ else ++ setBoundsForFrame((JInternalFrame) component, newX, newY, b.width, ++ b.height); ++ } ++ } // dragFrame() ++ ++ /** ++ * This method indicates that the dragging is done. Any state information ++ * stored by the DesktopManager can be cleared. ++ * ++ * @param component The JComponent that has finished dragging. ++ */ ++ public void endDraggingFrame(JComponent component) ++ { ++ if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) ++ { ++ setBoundsForFrame((JInternalFrame) component, dragCache.x, ++ dragCache.y, dragCache.width, dragCache.height); ++ pane = null; ++ dragCache = null; ++ } ++ component.repaint(); ++ } // endDraggingFrame() ++ ++ /** ++ * This method is called to indicate that the given JComponent will be ++ * resized. Any state information necessary to resize the JComponent will ++ * be prepared now. ++ * ++ * @param component The JComponent to resize, usually a JInternalFrame. ++ * @param direction The direction to drag in (a SwingConstant). ++ */ ++ public void beginResizingFrame(JComponent component, int direction) ++ { ++ pane = ((JInternalFrame) component).getDesktopPane(); ++ if (pane == null) ++ return; ++ ++ dragCache = component.getBounds(); ++ if (! (pane instanceof JDesktopPane)) ++ currentDragMode = JDesktopPane.LIVE_DRAG_MODE; ++ else ++ currentDragMode = ((JDesktopPane) pane).getDragMode(); ++ } // beginResizingFrame() ++ ++ /** ++ * This method resizes the give JComponent. ++ * ++ * @param component The JComponent to resize. ++ * @param newX The new x coordinate. ++ * @param newY The new y coordinate. ++ * @param newWidth The new width. ++ * @param newHeight The new height. ++ */ ++ public void resizeFrame(JComponent component, int newX, int newY, ++ int newWidth, int newHeight) ++ { ++ dragCache.setBounds(newX, newY, newWidth, newHeight); ++ ++ if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) ++ { ++ // FIXME: Do outline drag painting. ++ } ++ else ++ setBoundsForFrame(component, dragCache.x, dragCache.y, dragCache.width, ++ dragCache.height); ++ } // resizeFrame() ++ ++ /** ++ * This method is called to indicate that the given JComponent has finished ++ * dragging. Any state information stored by the DesktopManager can be ++ * cleared. ++ * ++ * @param component The JComponent that finished resizing. ++ */ ++ public void endResizingFrame(JComponent component) ++ { ++ if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) ++ { ++ setBoundsForFrame((JInternalFrame) component, dragCache.x, ++ dragCache.y, dragCache.width, dragCache.height); ++ pane = null; ++ dragCache = null; ++ } ++ component.repaint(); ++ } // endResizingFrame() ++ ++ /** ++ * This method calls setBounds with the given parameters and repaints the ++ * JComponent. ++ * ++ * @param component The JComponent to set bounds for. ++ * @param newX The new x coordinate. ++ * @param newY The new y coordinate. ++ * @param newWidth The new width. ++ * @param newHeight The new height. ++ */ ++ public void setBoundsForFrame(JComponent component, int newX, int newY, ++ int newWidth, int newHeight) ++ { ++ component.setBounds(newX, newY, newWidth, newHeight); ++ component.revalidate(); ++ ++ // If not null, I'd rather repaint the parent ++ if (component.getParent() != null) ++ component.getParent().repaint(); ++ else ++ component.repaint(); ++ } // setBoundsForFrame() ++ ++ /** ++ * This is a helper method that removes the JDesktopIcon of the given ++ * JInternalFrame from the parent. ++ * ++ * @param frame The JInternalFrame to remove an icon for. ++ */ ++ protected void removeIconFor(JInternalFrame frame) ++ { ++ JDesktopIcon icon = frame.getDesktopIcon(); ++ Container c = icon.getParent(); ++ if (c != null && icon != null) ++ c.remove(icon); ++ } // removeIconFor() ++ ++ /** ++ * This method is called by iconifyFrame to determine the bounds of the ++ * JDesktopIcon for the given JInternalFrame. ++ * ++ * @param frame The JInternalFrame to find the bounds of its JDesktopIcon ++ * for. ++ * ++ * @return The bounds of the JDesktopIcon. ++ */ ++ protected Rectangle getBoundsForIconOf(JInternalFrame frame) ++ { ++ // IconRects has no order to it. ++ // The icon _must_ be placed in the first free slot (working from ++ // the bottom left corner) ++ // The icon also must not be placed where another icon is placed ++ // (regardless whether that frame is an icon currently or not) ++ JDesktopPane desktopPane = frame.getDesktopPane(); ++ Rectangle paneBounds = desktopPane.getBounds(); ++ Insets insets = desktopPane.getInsets(); ++ Dimension pref = frame.getDesktopIcon().getPreferredSize(); ++ ++ if (desktopPane == null) ++ return frame.getDesktopIcon().getBounds(); ++ ++ Component[] frames = desktopPane.getComponents(); ++ ++ int count = 0; ++ for (int i = 0, j = 0; i < frames.length; i++) ++ if (frames[i] instanceof JDesktopIcon ++ || frames[i] instanceof JInternalFrame ++ && ((JInternalFrame) frames[i]).getWasIcon() && frames[i] != frame) ++ count++; ++ iconRects = new Rectangle[count]; ++ for (int i = 0, j = 0; i < frames.length; i++) ++ if (frames[i] instanceof JDesktopIcon) ++ iconRects[--count] = frames[i].getBounds(); ++ else if (frames[i] instanceof JInternalFrame ++ && ((JInternalFrame) frames[i]).getWasIcon() ++ && frames[i] != frame) ++ iconRects[--count] = ((JInternalFrame) frames[i]).getDesktopIcon() ++ .getBounds(); ++ ++ int startingX = insets.left; ++ int startingY = paneBounds.height - insets.bottom - pref.height; ++ Rectangle ideal = new Rectangle(startingX, startingY, pref.width, ++ pref.height); ++ boolean clear = true; ++ ++ while (iconRects.length > 0) ++ { ++ clear = true; ++ for (int i = 0; i < iconRects.length; i++) ++ { ++ if (iconRects[i] != null && iconRects[i].intersects(ideal)) ++ { ++ clear = false; ++ break; ++ } ++ } ++ if (clear) ++ return ideal; ++ ++ startingX += pref.width; ++ if (startingX + pref.width > paneBounds.width - insets.right) ++ { ++ startingX = insets.left; ++ startingY -= pref.height; ++ } ++ ideal.setBounds(startingX, startingY, pref.width, pref.height); ++ } ++ ++ return ideal; ++ } // getBoundsForIconOf() ++ ++ /** ++ * This method sets the bounds of the JInternalFrame right before the ++ * maximizeFrame call. ++ * ++ * @param frame The JInternalFrame being maximized. ++ * @param rect The normal bounds. ++ */ ++ protected void setPreviousBounds(JInternalFrame frame, Rectangle rect) ++ { ++ frame.setNormalBounds(rect); ++ } // setPreviousBounds() ++ ++ /** ++ * This method returns the normal bounds of the JInternalFrame from before ++ * the maximize call. ++ * ++ * @param frame The JInternalFrame that is being restored. ++ * ++ * @return The previous bounds of the JInternalFrame. ++ */ ++ protected Rectangle getPreviousBounds(JInternalFrame frame) ++ { ++ return frame.getNormalBounds(); ++ } // getPreviousBounds() ++ ++ /** ++ * This method sets the value to true if the given JInternalFrame has been ++ * iconized and the bounds of its DesktopIcon are valid. ++ * ++ * @param frame The JInternalFrame for the JDesktopIcon. ++ * @param value True if the JInternalFrame has been iconized and the bounds ++ * of the JDesktopIcon are valid. ++ */ ++ protected void setWasIcon(JInternalFrame frame, boolean value) ++ { ++ frame.setWasIcon(value, WAS_ICON_ONCE_PROPERTY); ++ } // setWasIcon() ++ ++ /** ++ * This method returns true if the given JInternalFrame has been iconized ++ * and the bounds of its DesktopIcon are valid. ++ * ++ * @param frame The JInternalFrame for the JDesktopIcon. ++ * ++ * @return True if the given JInternalFrame has been iconized and the bounds ++ * of its DesktopIcon are valid. ++ */ ++ protected boolean wasIcon(JInternalFrame frame) ++ { ++ return frame.getWasIcon(); ++ } // wasIcon() + } // DefaultDesktopManager +Index: javax/swing/DefaultListCellRenderer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultListCellRenderer.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultListCellRenderer.java +--- javax/swing/DefaultListCellRenderer.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/DefaultListCellRenderer.java 6 Sep 2004 16:35:54 -0000 +@@ -41,214 +41,137 @@ + import java.awt.Rectangle; + import java.io.Serializable; + import javax.swing.border.Border; ++import javax.swing.border.EmptyBorder; ++ + + /** +- * DefaultListCellRenderer +- * @author Andrew Selkirk +- * @version 1.0 ++ * DefaultListCellRenderer. This class is responsible for rendering list ++ * cells. ++ * ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public class DefaultListCellRenderer extends JLabel +- implements ListCellRenderer, Serializable ++public class DefaultListCellRenderer extends JLabel implements ListCellRenderer, ++ Serializable + { + static final long serialVersionUID = 7708947179685189462L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * UIResource +- */ +- public static class UIResource extends DefaultListCellRenderer +- implements javax.swing.plaf.UIResource { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor UIResource +- */ +- public UIResource() { +- // TODO +- } // UIResource() +- +- +- } // UIResource +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * noFocusBorder +- */ +- protected static Border noFocusBorder = null; // TODO +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultListCellRenderer +- */ +- public DefaultListCellRenderer() { +- // TODO +- } // DefaultListCellRenderer() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getListCellRendererComponent +- * @param list TODO +- * @param value TODO +- * @param index TODO +- * @param isSelected TODO +- * @param cellHasFocus TODO +- * @returns Component +- */ +- public Component getListCellRendererComponent(JList list, +- Object value, int index, boolean isSelected, boolean cellHasFocus) { +- return null; // TODO +- } // getListCellRendererComponent() +- +- /** +- * validate +- */ +- public void validate() { +- // TODO +- } // validate() +- +- /** +- * revalidate +- */ +- public void revalidate() { +- // TODO +- } // revalidate() +- +- /** +- * repaint +- * @param tm TODO +- * @param x TODO +- * @param y TODO +- * @param w TODO +- * @param h TODO +- */ +- public void repaint(long tm, int x, int y, int w, int h) { +- // TODO +- } // repaint() +- +- /** +- * repaint +- * @param rect TODO +- */ +- public void repaint(Rectangle rect) { +- // TODO +- } // repaint() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- protected void firePropertyChange(String propertyName, +- Object oldValue, Object newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- byte oldValue, byte newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- char oldValue, char newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- short oldValue, short newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- int oldValue, int newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- long oldValue, long newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- float oldValue, float newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- double oldValue, double newValue) { +- // TODO +- } // firePropertyChange() +- +- /** +- * firePropertyChange +- * @param propertyName TODO +- * @param oldValue TODO +- * @param newValue TODO +- */ +- public void firePropertyChange(String propertyName, +- boolean oldValue, boolean newValue) { +- // TODO +- } // firePropertyChange() +- +- +-} // DefaultListCellRenderer ++ public static class UIResource extends DefaultListCellRenderer ++ implements javax.swing.plaf.UIResource ++ { ++ public UIResource() ++ { ++ } ++ } ++ ++ /** ++ * This border is used whenever renderer doesn't have a focus. ++ */ ++ protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); ++ ++ /** ++ * getListCellRendererComponent ++ * ++ * @param list JList list for the 'value' ++ * @param value object that should be rendered in the cell ++ * @param index index of the cell ++ * @param isSelected draw cell highlighted if isSelected is true ++ * @param cellHasFocus draw focus rectangle around cell if the cell has ++ * focus ++ * ++ * @return Component that will be painted to the desired cell. ++ */ ++ public Component getListCellRendererComponent(JList list, Object value, ++ int index, boolean isSelected, ++ boolean cellHasFocus) ++ { ++ String s = value.toString(); ++ setText(s); ++ setOpaque(true); ++ ++ if (isSelected) ++ { ++ setBackground(list.getSelectionBackground()); ++ setForeground(list.getSelectionForeground()); ++ } ++ else ++ { ++ setBackground(list.getBackground()); ++ setForeground(list.getForeground()); ++ } ++ ++ setEnabled(list.isEnabled()); ++ setFont(list.getFont()); ++ ++ // Use focusCellHighlightBorder when renderer has focus and ++ // noFocusBorder otherwise ++ ++ if (cellHasFocus) ++ setBorder(UIManager.getBorder("List.focusCellHighlightBorder")); ++ else ++ setBorder(noFocusBorder); ++ ++ return this; ++ } ++ ++ public void validate() ++ { ++ } ++ ++ public void revalidate() ++ { ++ } ++ ++ public void repaint(long tm, int x, int y, int w, int h) ++ { ++ } ++ ++ public void repaint(Rectangle rect) ++ { ++ } ++ ++ protected void firePropertyChange(String propertyName, Object oldValue, ++ Object newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, byte oldValue, ++ byte newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, char oldValue, ++ char newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, short oldValue, ++ short newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, int oldValue, ++ int newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, long oldValue, ++ long newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, float oldValue, ++ float newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, double oldValue, ++ double newValue) ++ { ++ } ++ ++ public void firePropertyChange(String propertyName, boolean oldValue, ++ boolean newValue) ++ { ++ } ++} +Index: javax/swing/DefaultListModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultListModel.java,v +retrieving revision 1.2 +diff -u -r1.2 DefaultListModel.java +--- javax/swing/DefaultListModel.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/DefaultListModel.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* DefaultListModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,499 +35,473 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + +-import java.util.ArrayList; + import java.util.Enumeration; +-import java.util.NoSuchElementException; + import java.util.Vector; + + /** +- * DefaultListModel +- * @author Andrew Selkirk +- * @version 1.0 ++ * This is a default subclass of the {@link AbstractListModel}, used by ++ * {@link javax.swing.JList} and similar objects as the model of a list of ++ * values. The implementation is based on an underlying {@link ++ * java.util.Vector}. ++ * ++ * @author Andrew Selkirk ++ * @author Graydon Hoare (graydon@redhat.com) + */ ++ + public class DefaultListModel extends AbstractListModel + { ++ private static final long serialVersionUID = 2315945659722172272L; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * elements. Note: Sun obviously implemented the storage as a +- * Vector according to the similar API on this class. I choose +- * instead to implement the model with a proper collection object. +- * Is this a good choice? Probably not (ya..I know there are +- * sync issues by doing this) +- */ +- private ArrayList elements = new ArrayList(); +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultListModel +- */ +- public DefaultListModel() { +- // TODO +- } // DefaultListModel() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * elementAt +- * @param index TODO +- * @returns Object +- */ +- public Object elementAt(int index) { +- return elements.get(index); +- } // elementAt() +- +- /** +- * toString +- * @returns String +- */ +- public String toString() { +- return elements.toString(); +- } // toString() +- +- /** +- * indexOf +- * @param element TODO +- * @returns int +- */ +- public int indexOf(Object element) { +- return elements.indexOf(element); +- } // indexOf() +- +- /** +- * indexOf +- * @param element TODO +- * @param startIndex TODO +- * @returns int +- */ +- public int indexOf(Object element, int startIndex) { +- +- // Variables +- int index; +- Object test; +- +- // Process Elements +- for (index = startIndex; index < elements.size(); index++) { +- test = elements.get(index); +- if (test.equals(element) == true) { +- return index; +- } // if +- } // for +- return -1; +- +- } // indexOf() +- +- /** +- * lastIndexOf +- * @param element TODO +- * @returns int +- */ +- public int lastIndexOf(Object element) { +- return elements.lastIndexOf(element); +- } // lastIndexOf() +- +- /** +- * lastIndexOf +- * @param element TODO +- * @param endIndex TODO +- * @returns int +- */ +- public int lastIndexOf(Object element, int endIndex) { +- +- // Variables +- int index; +- Object test; +- +- // Process Elements +- for (index = endIndex; index >= 0; index--) { +- test = elements.get(index); +- if (test.equals(element) == true) { +- return index; +- } // if +- } // for +- return -1; +- +- } // lastIndexOf() +- +- /** +- * get +- * @param index TODO +- * @returns Object +- */ +- public Object get(int index) { +- return elements.get(index); +- } // get() +- +- /** +- * set +- * @param index TODO +- * @param element TODO +- * @returns Object +- */ +- public Object set(int index, Object element) { +- +- // Variables +- Object result; +- +- // Process Action +- result = elements.set(index, element); +- +- // Send event +- fireContentsChanged(this, index, index); +- +- return result; +- +- } // set() +- +- /** +- * add +- * @param index TODO +- * @param element TODO +- */ +- public void add(int index, Object element) { +- +- // Process Action +- elements.add(index, element); +- +- // Send event +- fireContentsChanged(this, index, index); +- +- } // add() +- +- /** +- * addElement +- * @param element TODO +- */ +- public void addElement(Object element) { +- +- // Process Action +- elements.add(element); +- +- // Send event +- fireIntervalAdded(this, elements.size(), elements.size()); +- +- } // addElement() +- +- /** +- * size +- * @returns int +- */ +- public int size() { +- return elements.size(); +- } // size() +- +- /** +- * toArray +- * @returns Object[] +- */ +- public Object[] toArray() { +- return elements.toArray(); +- } // toArray() +- +- /** +- * contains +- * @param element TODO +- * @returns boolean +- */ +- public boolean contains(Object element) { +- return elements.contains(element); +- } // contains() +- +- /** +- * copyInto +- * @param array TODO +- */ +- public void copyInto(Object[] array) { +- +- // Variables +- int index; +- int size; +- Object[] srcArray; +- +- // Initialize +- size = size(); +- srcArray = toArray(); +- +- // Process Elements +- for (index = 0; index < size; index++) { +- array[index] = srcArray[index]; +- } // for +- +- } // copyInto() +- +- /** +- * clear +- */ +- public void clear() { +- +- // Process Action +- elements.clear(); +- +- // Send event +- fireIntervalRemoved(this, 0, elements.size()); +- +- } // clear() +- +- /** +- * remove +- * @param index TODO +- * @returns Object +- */ +- public Object remove(int index) { +- +- // Variables +- Object result; +- +- // Process Action +- result = elements.remove(index); +- +- // Send event +- fireIntervalRemoved(this, index, index); +- +- return result; +- +- } // remove() +- +- /** +- * isEmpty +- * @returns boolean +- */ +- public boolean isEmpty() { +- return elements.isEmpty(); +- } // isEmpty() +- +- /** +- * elements +- * @returns Enumeration +- */ +- public Enumeration elements() { +- +- // TODO +- // Note: This is a pathetic implementation. If Vector +- // was used for storage, this wouldn't be an issue. I'll +- // have to implement an Enumeration inner class sometime. +- +- // Variables +- Vector vector; +- +- // Get Enumeration +- vector = new Vector(elements); +- return vector.elements(); +- +- } // elements() +- +- /** +- * trimToSize +- */ +- public void trimToSize() { +- elements.trimToSize(); +- } // trimToSize() +- +- /** +- * ensureCapacity +- * @param size TODO +- */ +- public void ensureCapacity(int size) { +- elements.ensureCapacity(size); +- } // ensureCapacity() +- +- /** +- * setSize +- * @param size TODO +- */ +- public void setSize(int size) { +- elements.ensureCapacity(size); +- } // setSize() +- +- /** +- * capacity +- * @returns int +- */ +- public int capacity() { +- return elements.size(); +- } // capacity() +- +- /** +- * firstElement +- * @returns Object +- */ +- public Object firstElement() { +- +- // Variables +- Object element; +- +- try { +- element = elements.get(0); +- return element; +- } catch (IndexOutOfBoundsException e) { +- throw new NoSuchElementException(); +- } // try +- +- } // firstElement() +- +- /** +- * lastElement +- * @returns Object +- */ +- public Object lastElement() { +- +- // Variables +- Object element; +- +- try { +- element = elements.get(elements.size() - 1); +- return element; +- } catch (ArrayIndexOutOfBoundsException e) { +- throw new NoSuchElementException(); +- } // try +- +- } // lastElement() +- +- /** +- * setElementAt +- * @param element TODO +- * @param index TODO +- */ +- public void setElementAt(Object element, int index) { +- +- // Process Action +- elements.set(index, element); +- +- // Send event +- fireContentsChanged(this, index, index); +- +- } // setElementAt() +- +- /** +- * removeElementAt +- * @param index TODO +- */ +- public void removeElementAt(int index) { +- +- // Process Action +- elements.remove(index); +- +- // Send event +- fireIntervalRemoved(this, index, index); +- +- } // removeElementAt() +- +- /** +- * insertElementAt +- * @param element TODO +- * @param index TODO +- */ +- public void insertElementAt(Object element, int index) { +- +- // Process Action +- elements.add(index, element); +- +- // Send event +- fireIntervalRemoved(this, index, index); +- +- } // insertElementAt() +- +- /** +- * removeElement +- * @param element TODO +- * @returns boolean +- */ +- public boolean removeElement(Object element) { +- +- // Variables +- int index; +- +- index = elements.indexOf(element); +- if (index != -1) { +- elements.remove(index); +- +- // Send event +- fireIntervalRemoved(this, index, index); +- +- return true; +- +- } // if +- +- return false; +- +- } // removeElement() +- +- /** +- * removeAllElements +- */ +- public void removeAllElements() { +- +- // Variables +- int size; +- +- size = size(); +- +- if (size > 0) { +- +- // Process Action +- elements.clear(); +- +- // Send event +- fireIntervalRemoved(this, 0, size - 1); +- +- } // if +- +- } // removeAllElements() +- +- /** +- * removeRange +- * @param startIndex TODO +- * @param endIndex TODO +- */ +- public void removeRange(int startIndex, int endIndex) { +- +- // Variables +- int index; +- +- // Check Indices +- if (startIndex > endIndex) { +- throw new IllegalArgumentException(); +- } // if +- +- // Process Elements +- for (index = endIndex; index >= startIndex; index--) { +- elements.remove(index); +- } // for +- +- // Send event +- fireIntervalRemoved(this, startIndex, endIndex); +- +- } // removeRange() +- +- /** +- * getSize +- * @returns int +- */ +- public int getSize() { +- return elements.size(); +- } // getSize() +- +- /** +- * getElementAt +- * @param index TODO +- * @returns Object +- */ +- public Object getElementAt(int index) { +- return elements.get(index); +- } // getElementAt() +- +- +-} // DefaultListModel ++ /** ++ * The vector of elements in this list model. ++ */ ++ private Vector elements = new Vector(); ++ ++ /** ++ * Gets an element of the list at the provided index. ++ * ++ * @param index The index of the element to get ++ * ++ * @return The object at the given index ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public Object elementAt(int index) ++ { ++ return elements.elementAt(index); ++ } ++ ++ /** ++ * Convert the list to a string representation. ++ * ++ * @return A string representation of the list ++ */ ++ public String toString() ++ { ++ return elements.toString(); ++ } ++ ++ /** ++ * Gets the first index of a particular element in the list. ++ * ++ * @param element The element to search for ++ * ++ * @return The first index in the list at which an object ++ * obj exists such that obj.equals(element) is ++ * true; if no such object exists, the method returns ++ * -1 ++ */ ++ public int indexOf(Object element) ++ { ++ return elements.indexOf(element); ++ } ++ ++ /** ++ * Gets the first index of a particular element in a list which occurs ++ * at or after a particular index. ++ * ++ * @param element The element to search for ++ * @param startIndex The index to begin searching at ++ * ++ * @return The first index in the list, greater than or equal to ++ * startIndex, at which an object obj exists ++ * such that obj.equals(element) is true; if no ++ * such object exists, the method returns -1 ++ */ ++ public int indexOf(Object element, int startIndex) ++ { ++ return elements.indexOf(element, startIndex); ++ } ++ ++ /** ++ * Gets the last index of a particular element in the list. ++ * ++ * @param element The element to search for ++ * ++ * @return The last index in the list at which an object ++ * obj exists such that obj.equals(element) is ++ * true; if no such object exists, the method returns ++ * -1 ++ */ ++ public int lastIndexOf(Object element) ++ { ++ return elements.lastIndexOf(element); ++ } ++ ++ /** ++ * Gets the last index of a particular element in a list which occurs ++ * at or before a particular index. ++ * ++ * @param element The element to search for ++ * @param endIndex The index to finish searching at ++ * ++ * @return The last index in the list, less than to or equal to ++ * endIndexIndex, at which an object obj exists ++ * such that obj.equals(element) is true; if no ++ * such object exists, the method returns -1 ++ */ ++ public int lastIndexOf(Object element, int endIndex) ++ { ++ return elements.lastIndexOf(element, endIndex); ++ } ++ ++ /** ++ * Gets the list element at a particular index. ++ * ++ * @param index The index to get the list value at ++ * ++ * @return The list value at the provided index ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public Object get(int index) ++ { ++ return elements.get(index); ++ } ++ ++ /** ++ * Sets the list element at a particular index. ++ * ++ * @param index The list index at which to set a value ++ * @param element The value to set at the specified index ++ * ++ * @return The value previously held at the specified index ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public Object set(int index, Object element) ++ { ++ Object result; ++ result = elements.set(index, element); ++ fireContentsChanged(this, index, index); ++ return result; ++ } ++ ++ /** ++ * Inserts an element at a particular index in the list. Each element at ++ * index i >= index is shifted to position i+1. ++ * If index is equal to size(), this is ++ * equivalent to appending an element to the array. Any ++ * index greater than size() is illegal. ++ * ++ * @param index The index to insert the element at ++ * @param element The element to insert at the index ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds [0, size()] ++ */ ++ public void add(int index, Object element) ++ { ++ elements.add(index, element); ++ fireContentsChanged(this, index, index); ++ } ++ ++ /** ++ * Inserts an element at the end of the list. This is equivalent to ++ * calling list.add(list.size(), element). ++ * ++ * @param element The element to add to the list ++ */ ++ public void addElement(Object element) ++ { ++ elements.add(element); ++ fireIntervalAdded(this, elements.size(), elements.size()); ++ } ++ ++ /** ++ * Gets the number of elements in the list. ++ * ++ * @return The number of elements in the list ++ */ ++ public int size() ++ { ++ return elements.size(); ++ } ++ ++ /** ++ * Gets an array containing the elements of the list. ++ * ++ * @return An array of the objects in the list, in the order they occur ++ * in the list ++ */ ++ public Object[] toArray() ++ { ++ return elements.toArray(); ++ } ++ ++ /** ++ * Determines whether a particular element is a member of the list. ++ * ++ * @param element The element to search for ++ * ++ * @return true if element is a member of the ++ * list, otherwise false ++ */ ++ public boolean contains(Object element) ++ { ++ return elements.contains(element); ++ } ++ ++ /** ++ * Copies the list into a provided array. The provided array must be at ++ * least as large as the list. ++ * ++ * @param array The array to copy the list into ++ * ++ * @throws IndexOutOfBoundsException if the array is too small to hold the ++ * elements of the list ++ */ ++ public void copyInto(Object[] array) ++ { ++ elements.copyInto(array); ++ } ++ ++ /** ++ * Erases all the elements of the list, setting the list's size to 0. ++ */ ++ public void clear() ++ { ++ elements.clear(); ++ fireIntervalRemoved(this, 0, elements.size()); ++ } ++ ++ /** ++ * Removes the element at a particular index from the list. ++ * ++ * @param index The index of the element to remove ++ * ++ * @return The value at the index, which has been removed from the list ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public Object remove(int index) ++ { ++ Object result; ++ result = elements.remove(index); ++ fireIntervalRemoved(this, index, index); ++ return result; ++ } ++ ++ /** ++ * Determines whether the list is empty. ++ * ++ * @return true if the list is empty, otherwise ++ * false ++ */ ++ public boolean isEmpty() ++ { ++ return elements.isEmpty(); ++ } ++ ++ /** ++ * Returns an {@link java.util.Enumeration} over the elements of the list. ++ * ++ * @return A new enumeration which iterates over the list ++ */ ++ public Enumeration elements() ++ { ++ return elements.elements(); ++ } ++ ++ /** ++ * Sets the capacity of the list to be equal to its size. The list's capacity ++ * is the number of elements it can hold before it needs to be reallocated. ++ * The list's size is the number of elements it currently holds. ++ */ ++ public void trimToSize() ++ { ++ elements.trimToSize(); ++ } ++ ++ /** ++ * Ensures that the list's capacity is at least equal to ++ * size. The list's capacity is the number of elements it ++ * can hold before it needs to be reallocated. ++ * ++ * @param size The capacity to ensure the list can hold ++ */ ++ public void ensureCapacity(int size) ++ { ++ elements.ensureCapacity(size); ++ } ++ ++ /** ++ * Sets the size of the list to a particular value. If the specified size ++ * is greater than the current size, the values at the excess list ++ * indices are set to null. If the specified size is less ++ * than the current size, the excess elements are removed from the list. ++ * ++ * @param size The new size to set the list to ++ */ ++ public void setSize(int size) ++ { ++ elements.setSize(size); ++ } ++ ++ /** ++ * Gets the capacity of the list. The list's capacity is the number of ++ * elements it can hold before it needs to be reallocated. ++ * ++ * @return The capacity of the list ++ */ ++ public int capacity() ++ { ++ return elements.capacity(); ++ } ++ ++ /** ++ * Gets the first element in the list. ++ * ++ * @return The first element in the list ++ */ ++ public Object firstElement() ++ { ++ return elements.firstElement(); ++ } ++ ++ /** ++ * Gets the last element in the list. ++ * ++ * @return The last element in the list ++ */ ++ public Object lastElement() ++ { ++ return elements.lastElement(); ++ } ++ ++ /** ++ * Sets the list element at a particular index. ++ * ++ * @param element The value to set at the specified index ++ * @param index The list index at which to set a value ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public void setElementAt(Object element, int index) ++ { ++ elements.setElementAt(element, index); ++ fireContentsChanged(this, index, index); ++ } ++ ++ /** ++ * Removes the element at a particular index from the list. ++ * ++ * @param index The index of the element to remove ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public void removeElementAt(int index) ++ { ++ elements.remove(index); ++ fireIntervalRemoved(this, index, index); ++ } ++ ++ /** ++ * Inserts an element at a particular index in the list. Each element at ++ * index i >= index is shifted to position i+1. ++ * If index is equal to size(), this is ++ * equivalent to appending an element to the array. Any ++ * index greater than size() is illegal. ++ * ++ * @param element The element to insert at the index ++ * @param index The index to insert the element at ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds [0, size()] ++ */ ++ public void insertElementAt(Object element, int index) ++ { ++ elements.insertElementAt(element, index); ++ fireIntervalAdded(this, index, index); ++ } ++ ++ /** ++ * Removes the first occurrence of a particular element in the list. If the ++ * element does not exist in the list, nothing happens. ++ * ++ * @param element The element to remove ++ * ++ * @return true if the element existed in the list (and was ++ * removed), false otherwise ++ */ ++ public boolean removeElement(Object element) ++ { ++ int index; ++ index = elements.indexOf(element); ++ if (index != -1) ++ { ++ elements.remove(index); ++ fireIntervalRemoved(this, index, index); ++ return true; ++ } ++ return false; ++ } ++ ++ /** ++ * Remove all elements in the list. ++ */ ++ public void removeAllElements() ++ { ++ int size; ++ size = size(); ++ if (size > 0) ++ { ++ elements.clear(); ++ fireIntervalRemoved(this, 0, size - 1); ++ } ++ } ++ ++ /** ++ * Remove all elements between startIndex and ++ * endIndex inclusive. ++ * ++ * @param startIndex The first index in the range to remove ++ * @param endIndex The last index in the range to remove ++ * ++ * @throws ArrayIndexOutOfBoundsException if either index is outside the ++ * valid range of indices for this list [0, size()) ++ * @throws IllegalArgumentException if startIndex > endIndex ++ */ ++ public void removeRange(int startIndex, int endIndex) ++ { ++ int index; ++ if (startIndex > endIndex) ++ throw new IllegalArgumentException(); ++ for (index = endIndex; index >= startIndex; index--) ++ elements.remove(index); ++ fireIntervalRemoved(this, startIndex, endIndex); ++ } ++ ++ /** ++ * Gets the size of the list. ++ * ++ * @return The number of elements currently in the list ++ */ ++ public int getSize() ++ { ++ return elements.size(); ++ } ++ ++ /** ++ * Gets the list element at a particular index. ++ * ++ * @param index The index to get the list value at ++ * ++ * @return The list value at the provided index ++ * ++ * @throws ArrayIndexOutOfBoundsException If the provided index is ++ * outside the bounds of the list [0, size()) ++ */ ++ public Object getElementAt(int index) ++ { ++ return elements.get(index); ++ } ++} +Index: javax/swing/DefaultListSelectionModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultListSelectionModel.java,v +retrieving revision 1.2 +diff -u -r1.2 DefaultListSelectionModel.java +--- javax/swing/DefaultListSelectionModel.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/DefaultListSelectionModel.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ +-/* DefaultListSelectionModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* DefaultListSelectionModel.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,151 +35,556 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.io.Serializable; + import java.util.EventListener; +-import java.util.Vector; ++import java.util.BitSet; + import javax.swing.event.EventListenerList; ++import javax.swing.event.ListSelectionEvent; + import javax.swing.event.ListSelectionListener; + +-public class DefaultListSelectionModel implements Cloneable, ListSelectionModel, Serializable ++ ++/** ++ *

    This class provides a default implementation of {@link ++ * ListSelectioModel}, which is used by {@link javax.swing.JList} and ++ * similar classes to manage the selection status of a number of data ++ * elements.

    ++ * ++ *

    The class is organized abstractly as a set of intervals of ++ * integers. Each interval indicates an inclusive range of indices in a ++ * list -- held by some other object and unknown to this class -- which is ++ * considered "selected". There are various accessors for querying and ++ * modifying the set of intervals, with simplified forms accepting a single ++ * index, representing an interval with only one element.

    ++ */ ++public class DefaultListSelectionModel implements Cloneable, ++ ListSelectionModel, ++ Serializable + { +- int mode = SINGLE_SELECTION; ++ private static final long serialVersionUID = -5718799865110415860L; ++ ++ /** The list of ListSelectionListeners subscribed to this selection model. */ ++ protected EventListenerList listenerList = new EventListenerList(); + +- Vector sel = new Vector(); + +- Vector listeners; ++ /** ++ * The current list selection mode. Must be one of the numeric constants ++ * SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION ++ * or MULTIPLE_INTERVAL_SELECTION from {@link ++ * ListSelectionModel}. The default value is ++ * MULTIPLE_INTERVAL_SELECTION. ++ */ ++ int selectionMode = MULTIPLE_INTERVAL_SELECTION; ++ ++ ++ /** ++ * The index of the "lead" of the most recent selection. The lead is the ++ * second argument in any call to {@link #setSelectionInterval}, {@link ++ * #addSelectionInterval} or {@link #removeSelectionInterval}. Generally ++ * the lead refers to the most recent position a user dragged their mouse ++ * over. ++ */ ++ int leadSelectionIndex = -1; ++ ++ ++ /** ++ * The index of the "anchor" of the most recent selection. The anchor is ++ * the first argument in any call to {@link #setSelectionInterval}, ++ * {@link #addSelectionInterval} or {@link ++ * #removeSelectionInterval}. Generally the anchor refers to the first ++ * recent position a user clicks when they begin to drag their mouse over ++ * a list. ++ * ++ * @see #getAnchorSelectionIndex ++ * @see #setAnchorSelectionIndex ++ */ ++ int anchorSelectionIndex = -1; ++ ++ ++ /** ++ * controls the range of indices provided in any {@link ++ * ListSelectionEvent} fired by the selectionModel. Let ++ * [A,L] be the range of indices between {@link ++ * anchorSelectionIndex} and {@link leadSelectionIndex} inclusive, and ++ * let [i0,i1] be the range of indices changed in a given ++ * call which generates a {@link ListSelectionEvent}. Then when this ++ * property is true, the {@link ListSelectionEvent} contains ++ * the range [A,L] union [i0,i1]; when false it ++ * will contain only [i0,i1]. The default is ++ * true. ++ * ++ * @see #isLeadAnchorNotificationEnabled ++ * @see #setLeadAnchorNotificationEnabled ++ */ ++ boolean leadAnchorNotificationEnabled = true; ++ ++ ++ /** ++ * Whether the selection is currently "adjusting". Any {@link ++ * ListSelectionEvent} events constructed in response to changes in this ++ * list selection model will have their {@link ++ * ListSelectionEvent#isAdjusting} field set to this value. ++ * ++ * @see #getValueIsAdjusting ++ * @see #setValueIsAdjusting ++ */ ++ boolean valueIsAdjusting = false; ++ ++ ++ /** ++ * The current set of "intervals", represented simply by a {@link ++ * java.util.BitSet}. A set bit indicates a selected index, whereas a ++ * cleared bit indicates a non-selected index. ++ */ ++ BitSet sel = new BitSet(); ++ ++ ++ /** ++ * Gets the value of the {@link #selectionMode} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getSelectionMode() ++ { ++ return selectionMode; ++ } ++ ++ /** ++ * Sets the value of the {@link #selectionMode} property. ++ * ++ * @param a The new value of the property ++ */ ++ public void setSelectionMode(int a) ++ { ++ selectionMode = a; ++ } ++ ++ /** ++ * Gets the value of the {@link #anchorSelectionIndex} property. ++ * ++ * @return The current property value ++ * ++ * @see #setAnchorSelectionIndex ++ */ ++ public int getAnchorSelectionIndex() ++ { ++ return anchorSelectionIndex; ++ } ++ ++ /** ++ * Sets the value of the {@link #anchorSelectionIndex} property. ++ * ++ * @param anchorIndex The new property value ++ * ++ * @see #getAnchorSelectionIndex ++ */ ++ public void setAnchorSelectionIndex(int anchorIndex) ++ { ++ anchorSelectionIndex = anchorIndex; ++ } ++ ++ /** ++ * Gets the value of the {@link #leadSelectionIndex} property. ++ * ++ * @return The current property value ++ * ++ * @see #setLeadSelectionIndex ++ */ ++ public int getLeadSelectionIndex() ++ { ++ return leadSelectionIndex; ++ } ++ ++ /** ++ *

    Sets the value of the {@link #anchorSelectionIndex} property. As a ++ * side effect, alters the selection status of two ranges of indices. Let ++ * OL be the old lead selection index, NL be ++ * the new lead selection index, and A be the anchor ++ * selection index. Then if A is a valid selection index, ++ * one of two things happens depending on the seleciton status of ++ * A:

    ++ * ++ *
      ++ * ++ *
    • isSelectedIndex(A) == true: set [A,OL] ++ * to deselected, then set [A,NL] to ++ * selected.
    • ++ * ++ *
    • isSelectedIndex(A) == false: set [A,OL] ++ * to selected, then set [A,NL] to ++ * deselected.
    • ++ * ++ *
    ++ * ++ *

    This method generates at most a single {@link ListSelectionEvent} ++ * despite changing multiple ranges. The range of values provided to the ++ * {@link ListSelectionEvent} includes only the minimum range of values ++ * which changed selection status between the beginning and end of the ++ * method.

    ++ * ++ * @param anchorIndex The new property value ++ * ++ * @see #getAnchorSelectionIndex ++ */ ++ public void setLeadSelectionIndex(int leadIndex) ++ { ++ int oldLeadIndex = leadSelectionIndex; ++ leadSelectionIndex = leadIndex; ++ ++ if (anchorSelectionIndex == -1) ++ return; ++ ++ int R1 = Math.min(anchorSelectionIndex, oldLeadIndex); ++ int R2 = Math.max(anchorSelectionIndex, oldLeadIndex); ++ int S1 = Math.min(anchorSelectionIndex, leadIndex); ++ int S2 = Math.max(anchorSelectionIndex, leadIndex); ++ ++ int lo = Math.min(R1, S1); ++ int hi = Math.max(R2, S2); ++ ++ BitSet oldRange = sel.get(lo, hi+1); + +- Vector get_listeners() +- { +- if (listeners == null) +- listeners = new Vector(); +- return listeners; +- } ++ if (isSelectedIndex(anchorSelectionIndex)) ++ { ++ sel.clear(R1, R2+1); ++ sel.set(S1, S2+1); ++ } ++ else ++ { ++ sel.set(R1, R2+1); ++ sel.clear(S1, S2+1); ++ } + ++ BitSet newRange = sel.get(lo, hi+1); ++ newRange.xor(oldRange); + +- public void addListSelectionListener(ListSelectionListener listener) +- { +- get_listeners().addElement(listener); +- } +- +- public void removeListSelectionListener(ListSelectionListener listener) +- { +- get_listeners().removeElement(listener); +- } ++ int beg = sel.nextSetBit(0), end = -1; ++ for(int i=beg; i >= 0; i=sel.nextSetBit(i+1)) ++ { ++ end = i; ++ } ++ fireValueChanged(beg, end, valueIsAdjusting); ++ } ++ ++ /** ++ * Gets the value of the {@link #leadAnchorNotificationEnabled} property. ++ * ++ * @return The current property value ++ * ++ * @see #setLeadAnchorNotificationEnabled ++ */ ++ public boolean isLeadAnchorNotificationEnabled() ++ { ++ return leadAnchorNotificationEnabled; ++ } ++ ++ /** ++ * Sets the value of the {@link #leadAnchorNotificationEnabled} property. ++ * ++ * @param flag The new property value ++ * ++ * @see #getLeadAnchorNotificationEnabled ++ */ ++ public void setLeadAnchorNotificationEnabled(boolean l) ++ { ++ leadAnchorNotificationEnabled = l; ++ } ++ ++ ++ /** ++ * Gets the value of the {@link #valueIsAdjusting} property. ++ * ++ * @return The current property value ++ * ++ * @see #setValueIsAdjusting ++ */ ++ public boolean getValueIsAdjusting() ++ { ++ return valueIsAdjusting; ++ } ++ ++ /** ++ * Sets the value of the {@link #valueIsAdjusting} property. ++ * ++ * @param v The new property value ++ * ++ * @see #getValueIsAdjusting ++ */ ++ public void setValueIsAdjusting(boolean v) ++ { ++ valueIsAdjusting = v; ++ } ++ ++ /** ++ * Determines whether the selection is empty. ++ * ++ * @return true if the selection is empty, otherwise ++ * false ++ */ ++ public boolean isSelectionEmpty() ++ { ++ return sel.isEmpty(); ++ } ++ ++ ++ /** ++ * Gets the smallest index which is currently a member of a selection ++ * interval. ++ * ++ * @return The least integer i such that i >= ++ * 0 and i is a member of a selected interval, or ++ * -1 if there are no selected intervals ++ * ++ * @see #getMaxSelectionIndex ++ */ ++ public int getMinSelectionIndex() ++ { ++ if (isSelectionEmpty()) ++ return -1; + +- class Range +- { +- int i0, i1; +- +- Range(int a, int b) +- { +- if (a > b) +- { +- i0 = b; +- i1 = a; +- } +- else +- { +- i0 = a; +- i1 = b; +- } +- } +- } ++ return sel.nextSetBit(0); ++ } + ++ /** ++ * Gets the largest index which is currently a member of a selection ++ * interval. ++ * ++ * @return The greatest integer i such that i >= ++ * 0 and i is a member of a selected interval, or ++ * -1 if there are no selected intervals ++ * ++ * @see #getMinSelectionIndex ++ */ ++ public int getMaxSelectionIndex() ++ { ++ if (isSelectionEmpty()) ++ return -1; ++ ++ int mx = -1; ++ for(int i=sel.nextSetBit(0); i >= 0; i=sel.nextSetBit(i+1)) ++ { ++ mx = i; ++ } ++ return mx; ++ } ++ ++ /** ++ * Determines whether a particular index is a member of a selection ++ * interval. ++ * ++ * @param a The index to search for ++ * ++ * @return true if the index is a member of a selection interval, ++ * otherwise false ++ */ ++ public boolean isSelectedIndex(int a) ++ { ++ return sel.get(a); ++ } ++ ++ /** ++ * If the {@link #selectionMode} property is equal to ++ * SINGLE_SELECTION or ++ * SINGLE_INTERVAL_SELECTION, equivalent to calling ++ * setSelectionInterval(index1, index2); otherwise adds the ++ * range [index0, index1] to the selection interval set. ++ * ++ * @param index0 The beginning of the range of indices to select ++ * @param index1 The end of the range of indices to select ++ * ++ * @see #setSelectionInterval ++ * @see #removeSelectionInterval ++ */ ++ public void addSelectionInterval(int index0, int index1) ++ { ++ if (selectionMode == SINGLE_SELECTION ++ || selectionMode == SINGLE_INTERVAL_SELECTION) ++ sel.clear(); + +- public int getMinSelectionIndex() +- { +- if (isSelectionEmpty()) +- return -1; +- +- boolean first = true; +- int min = -1; +- for (int i=0;i min) +- { +- min = r.i0; +- } +- } +- } +- return min; +- } +- +- public int getMaxSelectionIndex() +- { +- if (isSelectionEmpty()) +- return -1; +- +- boolean first = true; +- int max = -1; +- for (int i=1;i max) +- { +- max = r.i1; +- } +- } +- } +- return max; +- } +- +- public boolean isSelectedIndex(int a) +- { +- for (int i=0;i= a) +- { +- return true; +- } +- } +- return false; +- } +- +- +- public int getSelectionMode() +- { return mode; } +- public void setSelectionMode(int a) +- { mode = a; } +- +- boolean isSelectionEmpty() +- { +- return sel.size() == 0; +- } +- +- public void clearSelection() +- { +- sel.removeAllElements(); +- } +- +- public void setSelectionInterval(int index0, int index1) +- { +- if (mode == SINGLE_SELECTION) +- { +- sel.removeAllElements(); +- } ++ if (selectionMode == SINGLE_SELECTION) ++ index0 = index1; ++ ++ int lo = Math.min(index0, index1); ++ int hi = Math.max(index0, index1); + +- sel.addElement(new Range(index0, index1)); +- } ++ sel.set(lo, hi+1); ++ fireValueChanged(lo, hi, valueIsAdjusting); ++ } ++ ++ ++ /** ++ * Deselects all indices in the inclusive range ++ * [index0,index1]. ++ * ++ * @param index0 The beginning of the range of indices to deselect ++ * @param index1 The end of the range of indices to deselect ++ * ++ * @see #addSelectionInterval ++ * @see #setSelectionInterval ++ */ ++ public void removeSelectionInterval(int index0, ++ int index1) ++ { ++ int lo = Math.min(index0, index1); ++ int hi = Math.max(index0, index1); ++ sel.clear(lo, hi+1); ++ fireValueChanged(lo, hi, valueIsAdjusting); ++ } ++ ++ /** ++ * Removes all intervals in the selection set. ++ */ ++ public void clearSelection() ++ { ++ int sz = sel.size(); ++ sel.clear(); ++ fireValueChanged(0, sz, valueIsAdjusting); ++ } ++ ++ /** ++ * Clears the current selection and marks a given interval as ++ * "selected". If the current selection mode is ++ * SINGLE_SELECTION only the index index2 is ++ * selected. ++ * ++ * @param index0 The low end of the new selection ++ * @param index1 The high end of the new selection ++ */ ++ public void setSelectionInterval(int index0, int index1) ++ { ++ sel.clear(); ++ if (selectionMode == SINGLE_SELECTION) ++ index0 = index1; ++ ++ int lo = Math.min(index0, index1); ++ int hi = Math.max(index0, index1); ++ sel.set(lo, hi+1); ++ fireValueChanged(lo, hi, valueIsAdjusting); ++ } ++ ++ /** ++ * Inserts a number of indices either before or after a particular ++ * position in the set of indices. Renumbers all indices after the ++ * inserted range. The new indices in the inserted range are not ++ * selected. This method is typically called to synchronize the selection ++ * model with an inserted range of elements in a {@link ListModel}. ++ * ++ * @param index The position to insert indices at ++ * @param length The number of indices to insert ++ * @param before Indicates whether to insert the indices before the index ++ * or after it ++ */ ++ public void insertIndexInterval(int index, ++ int length, ++ boolean before) ++ { ++ if (!before) ++ { ++ index++; ++ length--; ++ } ++ BitSet tmp = sel.get(index, sel.size()); ++ sel.clear(index, sel.size()); ++ int n = tmp.size(); ++ for (int i = 0; i < n; ++i) ++ sel.set(index + length + i, tmp.get(i)); ++ } ++ ++ /** ++ * Removes a range from the set of indices. Renumbers all indices after ++ * the removed range. This method is typically called to synchronize the ++ * selection model with a deleted range of elements in a {@link ++ * ListModel}. ++ * ++ * @param index0 The first index to remove (inclusive) ++ * @param index1 The last index to remove (inclusive) ++ */ ++ public void removeIndexInterval(int index0, ++ int index1) ++ { ++ int lo = Math.min(index0, index1); ++ int hi = Math.max(index0, index1); ++ ++ BitSet tmp = sel.get(hi, sel.size()); ++ sel.clear(lo, sel.size()); ++ int n = tmp.size(); ++ for (int i = 0; i < n; ++i) ++ sel.set(lo + i, tmp.get(i)); ++ } ++ ++ /** ++ * Fires a {@link ListSelectionEvent} to all the listeners of type {@link ++ * ListSelectionListener} registered with this selection model. ++ * ++ * @param firstIndex The low index of the changed range ++ * @param lastIndex The high index of the changed range ++ * @param isAdjusting Whether this change is part of a seqence of adjustments ++ * made to the selection, such as during interactive scrolling ++ */ ++ protected void fireValueChanged(int firstIndex, int lastIndex, ++ boolean isAdjusting) ++ { ++ ListSelectionEvent evt = new ListSelectionEvent(this, firstIndex, ++ lastIndex, isAdjusting); ++ ListSelectionListener[] listeners = getListSelectionListeners(); ++ for (int i = 0; i < listeners.length; ++i) ++ listeners[i].valueChanged(evt); ++ } ++ ++ /** ++ * Adds a listener. ++ * ++ * @param listener The listener to add ++ * ++ * @see removeListSelectionListener ++ * @see getListSelectionListeners ++ */ ++ public void addListSelectionListener(ListSelectionListener listener) ++ { ++ listenerList.add(ListSelectionListener.class, listener); ++ } ++ ++ /** ++ * Removes a registered listener. ++ * ++ * @param listener The listener to remove ++ * ++ * @see addListSelectionListener ++ * @see getListSelectionListeners ++ */ ++ public void removeListSelectionListener(ListSelectionListener listener) ++ { ++ listenerList.remove(ListSelectionListener.class, listener); ++ } ++ ++ /** ++ * Returns an array of all registerers listeners. ++ * ++ * @param listenerType The type of listener to retrieve ++ * ++ * @return The array ++ * ++ * @see getListSelectionListener ++ * @since 1.3 ++ */ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ /** ++ * Returns an array of all registerd list selection listeners. ++ * ++ * @return the array ++ * ++ * @see addListSelectionListener ++ * @see removeListSelectionListener ++ * @see getListeners ++ * @since 1.4 ++ */ ++ public ListSelectionListener[] getListSelectionListeners() ++ { ++ return (ListSelectionListener[]) getListeners(ListSelectionListener.class); ++ } + } +Index: javax/swing/DefaultSingleSelectionModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DefaultSingleSelectionModel.java,v +retrieving revision 1.4 +diff -u -r1.4 DefaultSingleSelectionModel.java +--- javax/swing/DefaultSingleSelectionModel.java 29 Apr 2003 09:26:29 -0000 1.4 ++++ javax/swing/DefaultSingleSelectionModel.java 6 Sep 2004 16:35:54 -0000 +@@ -115,7 +115,7 @@ + */ + public boolean isSelected () + { +- return (index == -1); ++ return (index != -1); + } + + /** +Index: javax/swing/DesktopManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/DesktopManager.java,v +retrieving revision 1.2 +diff -u -r1.2 DesktopManager.java +--- javax/swing/DesktopManager.java 12 Oct 2003 13:20:49 -0000 1.2 ++++ javax/swing/DesktopManager.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* DesktopManager.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,118 +38,140 @@ + package javax.swing; + + /** +- * DesktopManager +- * @author Andrew Selkirk +- * @version 1.0 ++ * DesktopManagers are responsible for implementing the behaviours for the ++ * JInternalFrames that belong to JDesktopPanes. Actions such as maximizing, ++ * minimizing, iconifying, etc will be delegated to the DesktopManager. + */ +-public interface DesktopManager { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * openFrame +- * @param frame TODO +- */ +- void openFrame(JInternalFrame frame); +- +- /** +- * closeFrame +- * @param frame TODO +- */ +- void closeFrame(JInternalFrame frame); +- +- /** +- * maximizeFrame +- * @param frame TODO +- */ +- void maximizeFrame(JInternalFrame frame); +- +- /** +- * minimizeFrame +- * @param frame TODO +- */ +- void minimizeFrame(JInternalFrame frame); +- +- /** +- * iconifyFrame +- * @param frame TODO +- */ +- void iconifyFrame(JInternalFrame frame); +- +- /** +- * deiconifyFrame +- * @param frame TODO +- */ +- void deiconifyFrame(JInternalFrame frame); +- +- /** +- * activateFrame +- * @param frame TODO +- */ +- void activateFrame(JInternalFrame vframe); +- +- /** +- * deactivateFrame +- * @param frame TODO +- */ +- void deactivateFrame(JInternalFrame frame); +- +- /** +- * beginDraggingFrame +- * @param frame TODO +- */ +- void beginDraggingFrame(JComponent frame); +- +- /** +- * dragFrame +- * @param frame TODO +- * @param x TODO +- * @param y TODO +- */ +- void dragFrame(JComponent frame, int x, int y); +- +- /** +- * endDraggingFrame +- * @param frame TODO +- */ +- void endDraggingFrame(JComponent frame); +- +- /** +- * beginResizingFrame +- * @param frame TODO +- * @param direction TODO +- */ +- void beginResizingFrame(JComponent frame, int direction); +- +- /** +- * resizeFrame +- * @param frame TODO +- * @param x TODO +- * @param y TODO +- * @param width TODO +- * @param height TODO +- */ +- void resizeFrame(JComponent frame, int x, int y, +- int width, int height); +- +- /** +- * endResizingFrame +- * @param frame TODO +- */ +- void endResizingFrame(JComponent frame); +- +- /** +- * setBoundsForFrame +- * @param frame TODO +- * @param x TODO +- * @param y TODO +- * @param width TODO +- * @param height TODO +- */ +- void setBoundsForFrame(JComponent frame, int x, int y, +- int width, int height); +- +- ++public interface DesktopManager ++{ ++ /** ++ * This method will cause the JInternalFrame to be displayed in the set ++ * location. This usually is not needed since the user will add the ++ * JInternalFrame to a Container separately. ++ * ++ * @param frame The JInternalFrame to open. ++ */ ++ void openFrame(JInternalFrame frame); ++ ++ /** ++ * This method should remove the JInternalFrame from its parent. ++ * ++ * @param frame The JInternalFrame to close. ++ */ ++ void closeFrame(JInternalFrame frame); ++ ++ /** ++ * This method should maximize the JInternalFrame to match its parent's ++ * bounds. ++ * ++ * @param frame The JInternalFrame to maximize. ++ */ ++ void maximizeFrame(JInternalFrame frame); ++ ++ /** ++ * This method should restore the JInternalFrame to its normal bounds. ++ * ++ * @param frame The JInternalFrame to minimize. ++ */ ++ void minimizeFrame(JInternalFrame frame); ++ ++ /** ++ * This method should remove the JInternalFrame from its parent and replace ++ * it with a JDesktopIcon. ++ * ++ * @param frame The JInternalFrame to iconify. ++ */ ++ void iconifyFrame(JInternalFrame frame); ++ ++ /** ++ * This method should remove the JDesktopIcon from its parent and replace it ++ * with the JInternalFrame that the JDesktopIcon represents. ++ * ++ * @param frame The JInternalFrame to deiconify. ++ */ ++ void deiconifyFrame(JInternalFrame frame); ++ ++ /** ++ * This method should give focus to the JInternalFrame and its default focus ++ * owner. ++ * ++ * @param frame The JInternalFrame to activate. ++ */ ++ void activateFrame(JInternalFrame vframe); ++ ++ /** ++ * This method should be called when the JInternalFrame gets deselected and ++ * subsequently loses focus. ++ * ++ * @param frame The JInternalFrame to deactivate. ++ */ ++ void deactivateFrame(JInternalFrame frame); ++ ++ /** ++ * This method should be called in preparation for dragging. This needs to ++ * be called prior to dragFrame calls so that the DesktopManager can ++ * prepare any state information. ++ * ++ * @param frame The JInternalFrame to prepare for dragging. ++ */ ++ void beginDraggingFrame(JComponent frame); ++ ++ /** ++ * This method drags the given JInternalFrame to the given x and y ++ * coordinates. ++ * ++ * @param frame The JInternalFrame to drag. ++ * @param x The new x coordinate. ++ * @param y The new y coordinate. ++ */ ++ void dragFrame(JComponent frame, int x, int y); ++ ++ /** ++ * This method should be called after dragFrame calls. Any information used ++ * by the DesktopManager for dragging the JInternalFrame can be cleared. ++ * ++ * @param frame The JInternalFrame that finished dragging. ++ */ ++ void endDraggingFrame(JComponent frame); ++ ++ /** ++ * This method should be called prior to any resizeFrame calls. Any state ++ * information needed by the DesktopManager to resize the JInternalFrame ++ * will be prepared here. ++ * ++ * @param frame The JInternalFrame to resize. ++ * @param direction One of eight directions specified by SwingConstants. ++ */ ++ void beginResizingFrame(JComponent frame, int direction); ++ ++ /** ++ * This method is called to resize the given JInternalFrame to the given ++ * bounds. ++ * ++ * @param frame The JInternalFrame to resize. ++ * @param x The new x coordinate. ++ * @param y The new y coordinate. ++ * @param width The new width. ++ * @param height The new height. ++ */ ++ void resizeFrame(JComponent frame, int x, int y, int width, int height); ++ ++ /** ++ * This method is called to signify that the resize is finished. Any ++ * information used to resize the JInternalFrame can now be cleared. ++ * ++ * @param frame The JInternalFrame that just finished dragging. ++ */ ++ void endResizingFrame(JComponent frame); ++ ++ /** ++ * This method does the actual work for reshaping the JInternalFrame. ++ * ++ * @param frame The JInternalFrame to resize. ++ * @param x The new x coordinate. ++ * @param y The new y coordinate. ++ * @param width The new width. ++ * @param height The new height. ++ */ ++ void setBoundsForFrame(JComponent frame, int x, int y, int width, int height); + } // DesktopManager +Index: javax/swing/GrayFilter.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/GrayFilter.java,v +retrieving revision 1.1 +diff -u -r1.1 GrayFilter.java +--- javax/swing/GrayFilter.java 9 Aug 2002 04:26:10 -0000 1.1 ++++ javax/swing/GrayFilter.java 6 Sep 2004 16:35:54 -0000 +@@ -45,41 +45,41 @@ + + public class GrayFilter extends RGBImageFilter + { +- private boolean b; +- private int p; ++ private boolean b; ++ private int p; + +- /** +- Create a GrayFilter. If b is true then brighten. Also, indicate how much gray. +- +- @param b if brighten +- @param p percent of gray, 0 - 100 +- */ +- public GrayFilter(boolean b, int p) +- { +- this.b = b; //FIXME - HANDLE THIS +- this.p = p; +- } ++ /** ++ * Create a GrayFilter. If b is true then brighten. Also, indicate how much gray. ++ * ++ * @param b if brighten ++ * @param p percent of gray, 0 - 100 ++ */ ++ public GrayFilter(boolean b, int p) ++ { ++ this.b = b; //FIXME - HANDLE THIS ++ this.p = p; ++ } + +- /** +- Create grayed image +- +- @param i image to gray +- +- @return a grayed image +- */ +- public static Image createDisabledImage(Image src) +- { +- return Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(src.getSource(), +- new GrayFilter(false, 100))); +- } +- +- /** +- Filter RGB to gray +- */ +- public int filterRGB(int x, +- int y, +- int rgb) +- { +- return (int) ( ( p * ( 0.299 * ( (0xff0000 & rgb) >> 16) + 0.587 * ( (0xff00 & rgb) >> 8 ) + 0.114 * (0xff & rgb ) ) )); +- } ++ /** ++ * Create grayed image ++ * ++ * @param src image to gray ++ * ++ * @return a grayed image ++ */ ++ public static Image createDisabledImage(Image src) ++ { ++ return (Toolkit.getDefaultToolkit(). ++ createImage(new FilteredImageSource(src.getSource(), ++ new GrayFilter(false, 100)))); ++ } ++ ++ /** ++ * Filter RGB to gray ++ */ ++ public int filterRGB(int x, int y, int rgb) ++ { ++ return (int) (p * (0.299 * ((0xff0000 & rgb) >> 16) ++ + 0.587 * ((0xff00 & rgb) >> 8) + 0.114 * (0xff & rgb))); ++ } + } +Index: javax/swing/ImageIcon.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ImageIcon.java,v +retrieving revision 1.2 +diff -u -r1.2 ImageIcon.java +--- javax/swing/ImageIcon.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/ImageIcon.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* ImageIcon.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,67 +35,107 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Component; + import java.awt.Graphics; + import java.awt.Image; +-import java.awt.MediaTracker; + import java.awt.Toolkit; ++import java.awt.image.ImageObserver; + import java.io.Serializable; + import java.net.URL; +-import javax.accessibility.Accessible; +-import javax.accessibility.AccessibleContext; + +-public class ImageIcon implements Icon ++ ++public class ImageIcon ++ implements Icon, Serializable + { +- Image image; +- String file, descr; +- Component observer; +- +- public ImageIcon(String s) +- { +- this(s, ""); +- } +- +- public ImageIcon(String file, +- String descr) +- { +- this.file = file; +- this.descr = descr; +- +- image = Toolkit.getDefaultToolkit().getImage(file); +- if (image == null) { +- return; +- } +- //loadImage(image); +- } +- +- // not in SUN's spec !!! +- public void setParent(Component p) +- { +- observer = p; +- } +- +- public Image getImage() +- { return image; } +- +- public String getDescription() +- { return descr; } +- public void setDescription(String description) +- { this.descr = description; } +- +- public int getIconHeight() +- { return image.getHeight(observer); } +- public int getIconWidth() +- { return image.getWidth(observer); } +- +- public void paintIcon(Component c, +- Graphics g, +- int x, +- int y) +- { +- g.drawImage(image, x, y, observer); +- } ++ private static final long serialVersionUID = 532615968316031794L; ++ Image image; ++ String description; ++ ImageObserver observer; ++ ++ public ImageIcon() ++ { ++ } ++ ++ public ImageIcon(String file) ++ { ++ this(file, file); ++ } ++ ++ public ImageIcon(String file, String description) ++ { ++ this(Toolkit.getDefaultToolkit().getImage(file), description); ++ } ++ ++ public ImageIcon(byte[] imageData) ++ { ++ this(imageData, null); ++ } ++ ++ public ImageIcon(byte[] imageData, String description) ++ { ++ this(Toolkit.getDefaultToolkit().createImage(imageData), description); ++ } ++ ++ public ImageIcon(URL url) ++ { ++ this(url, null); ++ } ++ ++ public ImageIcon(URL url, String description) ++ { ++ this(Toolkit.getDefaultToolkit().getImage(url), description); ++ } ++ ++ public ImageIcon(Image image) ++ { ++ this(image, null); ++ } ++ ++ public ImageIcon(Image image, String description) ++ { ++ this.image = Toolkit.getDefaultToolkit().createImage(image.getSource()); ++ this.description = description; ++ } ++ ++ public ImageObserver getImageObserver() ++ { ++ return observer; ++ } ++ ++ public void setImageObserver(ImageObserver newObserver) ++ { ++ observer = newObserver; ++ } ++ ++ public Image getImage() ++ { ++ return image; ++ } ++ ++ public String getDescription() ++ { ++ return description; ++ } ++ ++ public void setDescription(String description) ++ { ++ this.description = description; ++ } ++ ++ public int getIconHeight() ++ { ++ return image.getHeight(observer); ++ } ++ ++ public int getIconWidth() ++ { ++ return image.getWidth(observer); ++ } ++ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.drawImage(image, x, y, observer != null ? observer : c); ++ } + } +Index: javax/swing/InputMap.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/InputMap.java,v +retrieving revision 1.3 +diff -u -r1.3 InputMap.java +--- javax/swing/InputMap.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/InputMap.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* InputMap.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.io.IOException; +@@ -43,24 +42,23 @@ + import java.io.ObjectOutputStream; + import java.io.Serializable; + import java.util.Arrays; +-import java.util.Iterator; + import java.util.HashMap; + import java.util.HashSet; ++import java.util.Iterator; + import java.util.Map; + import java.util.Set; + ++ + /** +- * InputMap + * @author Andrew Selkirk +- * @version 1.0 ++ * @author Michael Koch ++ * ++ * @since 1.3 + */ +-public class InputMap implements Serializable ++public class InputMap ++ implements Serializable + { +- static final long serialVersionUID = -5429059542008604257L; +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++ private static final long serialVersionUID = -5429059542008604257L; + + /** + * inputMap +@@ -70,171 +68,147 @@ + /** + * parent + */ +- private InputMap parent = null; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- ++ private InputMap parent; + + /** +- * Constructor InputMap ++ * Creates a new InputMap instance. + */ +- public InputMap() { ++ public InputMap() ++ { + // TODO +- } // InputMap() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** +- * get +- * @param value0 TODO +- * @returns Object +- */ +- public Object get(KeyStroke keystroke) { +- +- // Variables +- Object result; +- +- // Check Local store +- result = inputMap.get(keystroke); +- +- // Check Parent +- if (result == null) { +- result = parent.get(keystroke); +- } // if +- +- return result; +- +- } // get() +- +- /** +- * put +- * @param keystroke TODO +- * @param actionMapKey TODO +- */ +- public void put(KeyStroke keystroke, Object actionMapKey) { +- if (actionMapKey == null) { ++ * Returns the binding for keystroke. ++ * ++ * @param key the key of the enty ++ * ++ * @return the binding associated with keystroke may be null ++ */ ++ public Object get(KeyStroke keystroke) ++ { ++ Object result = inputMap.get(keystroke); ++ ++ if (result == null && parent != null) ++ result = parent.get(keystroke); ++ return result; ++ } ++ ++ /** ++ * Puts a new entry into the InputMap. ++ * If actionMapKey is null an existing entry will be removed. ++ * ++ * @param keystroke the keystroke for the entry ++ * @param actionMapKey the action. ++ */ ++ public void put(KeyStroke keystroke, Object actionMapKey) ++ { ++ if (actionMapKey == null) + inputMap.remove(keystroke); +- } else { ++ else + inputMap.put(keystroke, actionMapKey); +- } // if +- } // put() ++ } + + /** +- * remove +- * @param keystroke TODO ++ * Remove an entry from the InputMap. ++ * ++ * @param key the key of the entry to remove + */ +- public void remove(KeyStroke keystroke) { ++ public void remove(KeyStroke keystroke) ++ { + inputMap.remove(keystroke); +- } // remove() ++ } + + /** +- * getParent +- * @returns InputMap ++ * Returns the parent of this InputMap. ++ * ++ * @return the parent, may be null. + */ +- public InputMap getParent() { ++ public InputMap getParent() ++ { + return parent; +- } // getParent() ++ } + + /** +- * setParent +- * @param parentMap TODO ++ * Sets a parent for this InputMap. ++ * ++ * @param parentMap the new parent + */ +- public void setParent(InputMap parentMap) { ++ public void setParent(InputMap parentMap) ++ { + parent = parentMap; +- } // setParent() ++ } + + /** +- * size +- * @returns int ++ * Returns the number of entries in this InputMap. ++ * ++ * @return the number of entries + */ +- public int size() { ++ public int size() ++ { + return inputMap.size(); +- } // size() ++ } + + /** +- * clear ++ * Clears the InputMap. + */ +- public void clear() { ++ public void clear() ++ { + inputMap.clear(); +- } // clear() ++ } + + /** +- * keys +- * @returns KeyStroke[] ++ * Returns all keys of entries in this InputMap. ++ * ++ * @return an array of keys + */ +- public KeyStroke[] keys() { +- return convertSet(inputMap.keySet()); +- } // keys() ++ public KeyStroke[] keys() ++ { ++ KeyStroke[] array = new KeyStroke[size()]; ++ return (KeyStroke[]) inputMap.keySet().toArray(array); ++ } + + /** +- * allKeys +- * @returns KeyStroke[] ++ * Returns all keys of entries in this InputMap ++ * and all its parents. ++ * ++ * @return an array of keys + */ +- public KeyStroke[] allKeys() { +- +- // Variables +- Set set; +- +- // Initialize +- set = new HashSet(); ++ public KeyStroke[] allKeys() ++ { ++ Set set = new HashSet(); + +- // Get Key Sets +- if (parent != null) { ++ if (parent != null) + set.addAll(Arrays.asList(parent.allKeys())); +- } // if +- set.addAll(inputMap.keySet()); +- +- return convertSet(set); +- +- } // allKeys() +- +- private KeyStroke[] convertSet(Set set) { +- +- // Variables +- int index; +- Iterator iterator; +- KeyStroke[] keys; + +- // Create Final array +- keys = new KeyStroke[set.size()]; +- iterator = set.iterator(); +- index = 0; +- while (iterator.hasNext()) { +- keys[index++] = (KeyStroke) iterator.next(); +- } // while +- +- return keys; +- +- } // convertSet() +- +- +- //------------------------------------------------------------- +- // Interface: Serializable ------------------------------------ +- //------------------------------------------------------------- ++ set.addAll(inputMap.keySet()); ++ KeyStroke[] array = new KeyStroke[size()]; ++ return (KeyStroke[]) set.toArray(array); ++ } + + /** + * writeObject +- * @param stream TODO +- * @exception IOException TODO ++ * ++ * @param stream the stream to write to ++ * ++ * @exception IOException If an error occurs + */ +- private void writeObject(ObjectOutputStream stream) throws IOException { ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { + // TODO +- } // writeObject() ++ } + + /** + * readObject +- * @param stream TODO +- * @exception ClassNotFoundException TODO +- * @exception IOException TODO +- */ +- private void readObject(ObjectInputStream stream) throws ClassNotFoundException, IOException { ++ * ++ * @param stream the stream to read from ++ * ++ * @exception ClassNotFoundException If the serialized class cannot be found ++ * @exception IOException If an error occurs ++ */ ++ private void readObject(ObjectInputStream stream) ++ throws ClassNotFoundException, IOException ++ { + // TODO +- } // readObject() +- +- +-} // InputMap ++ } ++} +Index: javax/swing/JApplet.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JApplet.java,v +retrieving revision 1.2 +diff -u -r1.2 JApplet.java +--- javax/swing/JApplet.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JApplet.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* JApplet.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -49,8 +49,9 @@ + import java.awt.event.WindowEvent; + import javax.accessibility.AccessibleContext; + +-public class JApplet extends Applet ++public class JApplet extends Applet implements RootPaneContainer + { ++ private static final long serialVersionUID = 7269359214497372587L; + + public final static int HIDE_ON_CLOSE = 0; + public final static int EXIT_ON_CLOSE = 1; +@@ -80,27 +81,27 @@ + public Dimension getPreferredSize() + { + Dimension d = super.getPreferredSize(); +- System.out.println("JFrame.getPrefSize(): " + d + " , comp="+countComponents() + ", layout=" + getLayout()); ++ System.out.println("JFrame.getPrefSize(): " + d + " , comp="+ getComponentCount () + ", layout=" + getLayout()); + return d; + } + + public void setLayout(LayoutManager manager) + { super.setLayout(manager); } + +- void setLayeredPane(JLayeredPane layeredPane) ++ public void setLayeredPane(JLayeredPane layeredPane) + { getRootPane().setLayeredPane(layeredPane); } + +- JLayeredPane getLayeredPane() ++ public JLayeredPane getLayeredPane() + { return getRootPane().getLayeredPane(); } + +- JRootPane getRootPane() ++ public JRootPane getRootPane() + { + if (rootPane == null) + setRootPane(createRootPane()); + return rootPane; + } + +- void setRootPane(JRootPane root) ++ public void setRootPane(JRootPane root) + { + if (rootPane != null) + remove(rootPane); +@@ -109,19 +110,19 @@ + add(rootPane, BorderLayout.CENTER); + } + +- JRootPane createRootPane() ++ public JRootPane createRootPane() + { return new JRootPane(); } + +- Container getContentPane() ++ public Container getContentPane() + { return getRootPane().getContentPane(); } + +- void setContentPane(Container contentPane) ++ public void setContentPane(Container contentPane) + { getRootPane().setContentPane(contentPane); } + +- Component getGlassPane() ++ public Component getGlassPane() + { return getRootPane().getGlassPane(); } + +- void setGlassPane(Component glassPane) ++ public void setGlassPane(Component glassPane) + { getRootPane().setGlassPane(glassPane); } + + +@@ -136,10 +137,10 @@ + { return close_action; } + + +- JMenuBar getJMenuBar() ++ public JMenuBar getJMenuBar() + { return getRootPane().getJMenuBar(); } + +- void setJMenuBar(JMenuBar menubar) ++ public void setJMenuBar(JMenuBar menubar) + { getRootPane().setJMenuBar(menubar); } + + +Index: javax/swing/JButton.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JButton.java,v +retrieving revision 1.3 +diff -u -r1.3 JButton.java +--- javax/swing/JButton.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JButton.java 6 Sep 2004 16:35:54 -0000 +@@ -41,17 +41,18 @@ + import javax.accessibility.AccessibleContext; + import javax.swing.plaf.ButtonUI; + ++ + /** + * An instance of JButton can be added to a panel, frame etc + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ +-public class JButton extends AbstractButton implements Accessible ++public class JButton extends AbstractButton ++ implements Accessible + { + private static final long serialVersionUID = -1907255238954382202L; +- +- boolean def, is_def; +- ++ boolean def; ++ boolean is_def; + + public JButton() + { +@@ -87,6 +88,7 @@ + protected void configurePropertiesFromAction(Action a) + { + //Factory method which sets the AbstractButton's properties according to values from the Action instance. ++ super.configurePropertiesFromAction(a); + } + + public AccessibleContext getAccessibleContext() +@@ -97,8 +99,8 @@ + + public String getUIClassID() + { +- //Returns a string that specifies the name of the L&F class that renders this component. +- return "JButton"; ++ //Returns a string that specifies the name of the L&F class that renders this component. ++ return "ButtonUI"; + } + + public boolean isDefaultButton() +@@ -118,17 +120,23 @@ + return "JButton"; + } + ++ /** ++ * Overrides JComponent.removeNotify to check if this button is currently ++ * set as the default button on the RootPane, and if so, sets the RootPane's ++ * default button to null to ensure the RootPane doesn't hold onto an invalid ++ * button reference. ++ */ + public void removeNotify() + { +- //Overrides JComponent.removeNotify to check if this button is currently set as the default button on the RootPane, and if so, sets the RootPane's default button to null to ensure the RootPane doesn't hold onto an invalid button reference. + } + + public void setDefaultCapable(boolean defaultCapable) +- { def = defaultCapable; } ++ { ++ def = defaultCapable; ++ } + + public void updateUI() + { +- ButtonUI b = (ButtonUI)UIManager.getUI(this); +- setUI(b); ++ setUI((ButtonUI) UIManager.getUI(this)); + } + } +Index: javax/swing/JCheckBox.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JCheckBox.java,v +retrieving revision 1.2 +diff -u -r1.2 JCheckBox.java +--- javax/swing/JCheckBox.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JCheckBox.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* JCheckBox.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -47,46 +47,94 @@ + */ + public class JCheckBox extends JToggleButton + { ++ private static final long serialVersionUID = -5246739313864538930L; ++ ++ private boolean borderPaintedFlat; ++ ++ private void init() ++ { ++ borderPainted = false; ++ contentAreaFilled = false; ++ } ++ + public JCheckBox() + { +- this(null, null); ++ super(); ++ init(); + } +- public JCheckBox(Action a) ++ ++ public JCheckBox(Action action) + { +- this(); +- setAction(a); ++ super(action); ++ init(); + } + + public JCheckBox(Icon icon) + { +- this(null, icon); ++ super(icon); ++ init(); ++ } ++ ++ public JCheckBox(Icon icon, boolean selected) ++ { ++ super(icon, selected); ++ init(); + } + + public JCheckBox(String text) + { +- this(text, null); ++ super(text); ++ init(); ++ } ++ ++ public JCheckBox(String text, boolean selected) ++ { ++ super(text, selected); ++ init(); + } + + public JCheckBox(String text, Icon icon) + { + super(text, icon); ++ init(); + } + ++ public JCheckBox(String text, Icon icon, boolean selected) ++ { ++ super(text, icon, selected); ++ init(); ++ } + ++ /** ++ * Gets the AccessibleContext associated with this JCheckBox. ++ */ + public AccessibleContext getAccessibleContext() + { +- //Gets the AccessibleContext associated with this JCheckBox. + return null; + } + ++ /** ++ * Returns a string that specifies the name of the Look and Feel class ++ * that renders this component. ++ */ + public String getUIClassID() + { +- //Returns a string that specifies the name of the L&F class that renders this component. +- return "JCheckBox"; ++ return "CheckBoxUI"; + } + + protected String paramString() + { + return "JCheckBox"; + } ++ ++ public boolean isBorderPaintedFlat() ++ { ++ return borderPaintedFlat; ++ } ++ ++ public void setBorderPaintedFlat(boolean newValue) ++ { ++ firePropertyChange("borderPaintedFlat", borderPaintedFlat, newValue); ++ borderPaintedFlat = newValue; ++ } + } +Index: javax/swing/JCheckBoxMenuItem.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JCheckBoxMenuItem.java,v +retrieving revision 1.3 +diff -u -r1.3 JCheckBoxMenuItem.java +--- javax/swing/JCheckBoxMenuItem.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JCheckBoxMenuItem.java 6 Sep 2004 16:35:54 -0000 +@@ -43,202 +43,207 @@ + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + ++ + /** +- * JCheckBoxMenuItem +- * @author Andrew Selkirk +- * @version 1.0 ++ * This class represents JCheckBoxMenuItem. Its behaviour is very similar ++ * to JCheckBoxButton. Just like the JCheckBoxButton, user can check and ++ * uncheck this menu item by clicking on it. Also setSelected()/setState() ++ * can be use used for the same purpose. JCheckBoxMenuItem uses ++ * ToggleButtonModel to keep track of its selection. + */ +-public class JCheckBoxMenuItem extends JMenuItem implements SwingConstants, Accessible ++public class JCheckBoxMenuItem extends JMenuItem implements SwingConstants, ++ Accessible + { ++ private static final long serialVersionUID = -6676402307973384715L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJCheckBoxMenuItem +- */ +- protected class AccessibleJCheckBoxMenuItem extends AccessibleJMenuItem { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJCheckBoxMenuItem +- * @param component TODO +- */ +- protected AccessibleJCheckBoxMenuItem(JCheckBoxMenuItem component) { +- super(component); +- // TODO +- } // AccessibleJCheckBoxMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.CHECK_BOX; +- } // getAccessibleRole() +- +- +- } // AccessibleJCheckBoxMenuItem +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "CheckBoxMenuItemUI"; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JCheckBoxMenuItem +- */ +- public JCheckBoxMenuItem() { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param icon TODO +- */ +- public JCheckBoxMenuItem(Icon icon) { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param text TODO +- */ +- public JCheckBoxMenuItem(String text) { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param action TODO +- */ +- public JCheckBoxMenuItem(Action action) { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param text TODO +- * @param icon TODO +- */ +- public JCheckBoxMenuItem(String text, Icon icon) { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param text TODO +- * @param state TODO +- */ +- public JCheckBoxMenuItem(String text, boolean state) { +- // TODO +- } // JCheckBoxMenuItem() +- +- /** +- * Constructor JCheckBoxMenuItem +- * @param text TODO +- * @param icon TODO +- * @param state TODO +- */ +- public JCheckBoxMenuItem(String text, Icon icon, boolean state) { +- // TODO +- } // JCheckBoxMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getState +- * @returns boolean +- */ +- public boolean getState() { +- return false; // TODO +- } // getState() +- +- /** +- * setState +- * @param state TODO +- */ +- public synchronized void setState(boolean state) { +- // TODO +- } // setState() +- +- /** +- * getSelectedObjects +- * @returns Object[] +- */ +- public Object[] getSelectedObjects() { +- return null; // TODO +- } // getSelectedObjects() +- +- /** +- * requestFocus +- */ +- public void requestFocus() { +- // TODO +- } // requestFocus() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJCheckBoxMenuItem(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() ++ /** name for the UI delegate for this menuItem. */ ++ private static final String uiClassID = "CheckBoxMenuItemUI"; + ++ /** Indicates whether this menu item is checked. */ ++ private boolean state; + +-} // JCheckBoxMenuItem ++ /** ++ * This array contains text of this menu item if this menu item is in ++ * checked state and null it is not. ++ */ ++ private Object[] selectedObjects = new Object[1]; ++ ++ /** ++ * Creates a new JCheckBoxMenuItem object. ++ */ ++ public JCheckBoxMenuItem() ++ { ++ this(null, null); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem with given icon ++ * ++ * @param icon Icon for this menu item ++ */ ++ public JCheckBoxMenuItem(Icon icon) ++ { ++ this(null, icon); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem with given label ++ * ++ * @param text Label for this menu item ++ */ ++ public JCheckBoxMenuItem(String text) ++ { ++ this(text, null); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem using given action ++ * ++ * @param action Action for this menu item. ++ */ ++ public JCheckBoxMenuItem(Action action) ++ { ++ this(); ++ setAction(action); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem object with given label and icon ++ * ++ * @param text Label for this menu item ++ * @param icon Icon for this menu item ++ */ ++ public JCheckBoxMenuItem(String text, Icon icon) ++ { ++ this(text, icon, false); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem object using specified label and ++ * marked as checked if given 'state' is true ++ * ++ * @param text Label for this menu item ++ * @param state True if this item should be in checked state and false otherwise ++ */ ++ public JCheckBoxMenuItem(String text, boolean state) ++ { ++ this(text, null, state); ++ } ++ ++ /** ++ * Creates a new JCheckBoxMenuItem object with given label, icon, ++ * and marked as checked if given 'state' is true ++ * ++ * @param text Label for this menu item ++ * @param icon icon for this menu item ++ * @param state True if this item should be in checked state and false otherwise ++ */ ++ public JCheckBoxMenuItem(String text, Icon icon, boolean state) ++ { ++ super(text, icon); ++ setModel(new JToggleButton.ToggleButtonModel()); ++ this.state = state; ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menuItem. ++ * ++ * @return The Look and Feel classID. "JCheckBoxMenuItemUI" ++ */ ++ public String getUIClassID() ++ { ++ return uiClassID; ++ } ++ ++ /** ++ * Returns checked state for this check box menu item. ++ * ++ * @return Returns true if this menu item is in checked state ++ * and false otherwise. ++ */ ++ public boolean getState() ++ { ++ return state; ++ } ++ ++ /** ++ * Sets state for this check box menu item. If ++ * given 'state' is true, then mark menu item as checked, ++ * and uncheck this menu item otherwise. ++ * ++ * @param state new state for this menu item ++ * ++ */ ++ public synchronized void setState(boolean state) ++ { ++ this.state = state; ++ } ++ ++ /** ++ * This method returns array containing label of this ++ * menu item if it is selected and null otherwise. ++ * ++ * @return Array containing label of this ++ * menu item if this menu item is selected or null otherwise. ++ */ ++ public Object[] getSelectedObjects() ++ { ++ if (state == true) ++ selectedObjects[0] = this.getText(); ++ else ++ selectedObjects[0] = null; ++ ++ return selectedObjects; ++ } ++ ++ /** ++ * This method overrides JComponent.requestFocus with an empty ++ * implementation, since JCheckBoxMenuItems should not ++ * receve focus in general. ++ */ ++ public void requestFocus() ++ { ++ // Should do nothing here ++ } ++ ++ /** ++ * A string that describes this JCheckBoxMenuItem. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JCheckBoxMenuItem ++ */ ++ protected String paramString() ++ { ++ return "JCheckBoxMenuItem"; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJCheckBoxMenuItem(); ++ ++ return accessibleContext; ++ } ++ ++ protected class AccessibleJCheckBoxMenuItem extends AccessibleJMenuItem ++ { ++ private static final long serialVersionUID = 1079958073579370777L; ++ ++ /** ++ * Creates a new AccessibleJCheckBoxMenuItem object. ++ */ ++ protected AccessibleJCheckBoxMenuItem() ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.CHECK_BOX; ++ } ++ } ++} +Index: javax/swing/JColorChooser.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JColorChooser.java,v +retrieving revision 1.2 +diff -u -r1.2 JColorChooser.java +--- javax/swing/JColorChooser.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JColorChooser.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* JColorChooser.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,11 +35,16 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.AWTError; ++import java.awt.BorderLayout; + import java.awt.Color; + import java.awt.Component; ++import java.awt.Dialog; ++import java.awt.FlowLayout; ++import java.awt.Frame; ++import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.io.IOException; + import java.io.ObjectOutputStream; +@@ -47,324 +52,654 @@ + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + import javax.swing.colorchooser.AbstractColorChooserPanel; ++import javax.swing.colorchooser.ColorChooserComponentFactory; + import javax.swing.colorchooser.ColorSelectionModel; ++import javax.swing.colorchooser.DefaultColorSelectionModel; + import javax.swing.plaf.ColorChooserUI; + ++ + /** +- * JColorChooser +- * @author Andrew Selkirk +- * @version 1.0 ++ * The JColorChooser is a Swing widget that offers users different ways to ++ * select a color. By default, three different panels are presented to the ++ * user that are capable of changing the selected color. There are three ways ++ * to utilize JColorChooser. The first is to build a JColorChooser and add it ++ * to the content pane. The second is to use the createDialog method to ++ * create a JDialog that holds a JColorChooser. The third is to show a ++ * JColorChooser in a JDialog directly using the showDialog method. + */ +-public class JColorChooser extends JComponent implements Accessible { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJColorChooser +- */ +- protected class AccessibleJColorChooser extends JComponent.AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJColorChooser +- * @param component TODO +- */ +- protected AccessibleJColorChooser(JColorChooser component) { +- super(component); +- // TODO +- } // AccessibleJColorChooser() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.COLOR_CHOOSER; +- } // getAccessibleRole() +- +- +- } // AccessibleJColorChooser +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "ColorChooserUI"; +- +- /** +- * selectionModel +- */ +- private ColorSelectionModel selectionModel; +- +- /** +- * previewPanel +- */ +- private JComponent previewPanel; +- +- /** +- * chooserPanels +- */ +- private AbstractColorChooserPanel[] chooserPanels; +- +- /** +- * SELECTION_MODEL_PROPERTY +- */ +- public static final String SELECTION_MODEL_PROPERTY = "selectionModel"; +- +- /** +- * PREVIEW_PANEL_PROPERTY +- */ +- public static final String PREVIEW_PANEL_PROPERTY = "previewPanel"; +- +- /** +- * CHOOSER_PANELS_PROPERTY +- */ +- public static final String CHOOSER_PANELS_PROPERTY = "chooserPanels"; +- +- /** +- * accessibleContext +- */ +- protected AccessibleContext accessibleContext; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JColorChooser +- */ +- public JColorChooser() { +- // TODO +- } // JColorChooser() +- +- /** +- * Constructor JColorChooser +- * @param initial TODO +- */ +- public JColorChooser(Color initial) { +- // TODO +- } // JColorChooser() +- +- /** +- * Constructor JColorChooser +- * @param model TODO +- */ +- public JColorChooser(ColorSelectionModel model) { +- // TODO +- } // JColorChooser() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * setColor +- * @param color TODO +- */ +- public void setColor(Color color) { +- // TODO +- } // setColor() +- +- /** +- * setColor +- * @param r TODO +- * @param g TODO +- * @param b TODO +- */ +- public void setColor(int r, int g, int b) { +- // TODO +- } // setColor() +- +- /** +- * setColor +- * @param color TODO +- */ +- public void setColor(int color) { +- // TODO +- } // setColor() +- +- /** +- * showDialog +- * @param component TODO +- * @param title TODO +- * @param initial TODO +- * @returns Color +- */ +- public static Color showDialog(Component component, String title, +- Color initial) { +- return null; // TODO +- } // showDialog() +- +- /** +- * createDialog +- * @param component TODO +- * @param title TODO +- * @param modal TODO +- * @param chooserPane TODO +- * @param okListener TODO +- * @param cancelListener TODO +- * @returns JDialog +- */ +- public static JDialog createDialog(Component component, String title, +- boolean modal, JColorChooser chooserPane, +- ActionListener okListener, ActionListener cancelListener) { +- return null; // TODO +- } // createDialog() +- +- /** +- * getUI +- * @returns ColorChooserUI +- */ +- public ColorChooserUI getUI() { +- return (ColorChooserUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(ColorChooserUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((ColorChooserUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getColor +- * @returns Color +- */ +- public Color getColor() { +- return null; // TODO +- } // getColor() +- +- /** +- * setPreviewPanel +- * @param component TODO +- */ +- public void setPreviewPanel(JComponent component) { +- // TODO +- } // setPreviewPanel() +- +- /** +- * getPreviewPanel +- * @returns JComponent +- */ +- public JComponent getPreviewPanel() { +- return null; // TODO +- } // getPreviewPanel() +- +- /** +- * addChooserPanel +- * @param panel TODO +- */ +- public void addChooserPanel(AbstractColorChooserPanel panel) { +- // TODO +- } // addChooserPanel() +- +- /** +- * removeChooserPanel +- * @param panel TODO +- * @returns AbstractColorChooserPanel +- */ +- public AbstractColorChooserPanel removeChooserPanel( +- AbstractColorChooserPanel panel) { +- return null; // TODO +- } // removeChooserPanel() +- +- /** +- * setChooserPanels +- * @param panels TODO +- */ +- public void setChooserPanels(AbstractColorChooserPanel[] panels) { +- // TODO +- } // setChooserPanels() +- +- /** +- * getChooserPanels +- * @returns AbstractColorChooserPanel[] +- */ +- public AbstractColorChooserPanel[] getChooserPanels() { +- return null; // TODO +- } // getChooserPanels() +- +- /** +- * getSelectionModel +- * @returns ColorSelectionModel +- */ +- public ColorSelectionModel getSelectionModel() { +- return null; // TODO +- } // getSelectionModel() +- +- /** +- * setSelectionModel +- * @param model TODO +- */ +- public void setSelectionModel(ColorSelectionModel model) { +- // TODO +- } // setSelectionModel() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJColorChooser(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JColorChooser ++public class JColorChooser extends JComponent implements Accessible ++{ ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 9168066781620640889L; ++ ++ /** ++ * AccessibleJColorChooser ++ */ ++ protected class AccessibleJColorChooser ++ extends JComponent.AccessibleJComponent ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -2038297864782299082L; ++ ++ /** ++ * Constructor AccessibleJColorChooser ++ */ ++ protected AccessibleJColorChooser() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.COLOR_CHOOSER; ++ } // getAccessibleRole() ++ } // AccessibleJColorChooser ++ ++ /** The model used with the JColorChooser. */ ++ private ColorSelectionModel selectionModel; ++ ++ /** The preview panel associated with the JColorChooser. */ ++ private JComponent previewPanel; ++ ++ /** ++ * The set of AbstractColorChooserPanels associated with the JColorChooser. ++ */ ++ private AbstractColorChooserPanel[] chooserPanels; ++ ++ /** A Drag and Drop property. */ ++ private boolean dragEnabled; ++ ++ /** ++ * The property fired by the JColorChooser when the selectionModel property ++ * changes. ++ */ ++ public static final String SELECTION_MODEL_PROPERTY = "selectionModel"; ++ ++ /** ++ * The property fired by the JColorChooser when the previewPanel property ++ * changes. ++ */ ++ public static final String PREVIEW_PANEL_PROPERTY = "previewPanel"; ++ ++ /** ++ * The property fired by the JColorChooser when the chooserPanels property ++ * changes. ++ */ ++ public static final String CHOOSER_PANELS_PROPERTY = "chooserPanels"; ++ ++ /** accessibleContext */ ++ protected AccessibleContext accessibleContext; ++ ++ /** ++ * This method creates a new JColorChooser with the default initial color. ++ */ ++ public JColorChooser() ++ { ++ this(new DefaultColorSelectionModel()); ++ } // JColorChooser() ++ ++ /** ++ * This method creates a new JColorChooser with the given initial color. ++ * ++ * @param initial The initial color. ++ */ ++ public JColorChooser(Color initial) ++ { ++ this(new DefaultColorSelectionModel(initial)); ++ } // JColorChooser() ++ ++ /** ++ * This method creates a new JColorChooser with the given model. The model ++ * will dictate what the initial color for the JColorChooser is. ++ * ++ * @param model The Model to use with the JColorChooser. ++ */ ++ public JColorChooser(ColorSelectionModel model) ++ { ++ if (model == null) ++ model = new DefaultColorSelectionModel(); ++ selectionModel = model; ++ updateUI(); ++ } // JColorChooser() ++ ++ /** ++ * This method sets the current color for the JColorChooser. ++ * ++ * @param color The new color for the JColorChooser. ++ */ ++ public void setColor(Color color) ++ { ++ if (color != null) ++ selectionModel.setSelectedColor(color); ++ } // setColor() ++ ++ /** ++ * This method sets the current color for the JColorChooser using RGB ++ * values. ++ * ++ * @param r The red value. ++ * @param g The green value. ++ * @param b The blue value. ++ */ ++ public void setColor(int r, int g, int b) ++ { ++ selectionModel.setSelectedColor(new Color(r, g, b)); ++ } // setColor() ++ ++ /** ++ * This method sets the current color for the JColorChooser using the ++ * integer value. Bits 0-7 represent the blue value. Bits 8-15 represent ++ * the green value. Bits 16-23 represent the red value. ++ * ++ * @param color The new current color of the JColorChooser. ++ */ ++ public void setColor(int color) ++ { ++ setColor(new Color(color, false)); ++ } // setColor() ++ ++ /** ++ * This method shows a JColorChooser inside a JDialog. The JDialog will ++ * block until it is hidden. The JDialog comes with three buttons: OK, ++ * Cancel, and Reset. Pressing OK or Cancel hide the JDialog. Pressing ++ * Reset will reset the JColorChooser to its initial value. ++ * ++ * @param component The Component that parents the JDialog. ++ * @param title The title displayed in the JDialog. ++ * @param initial The initial color. ++ * ++ * @return The selected color. ++ */ ++ public static Color showDialog(Component component, String title, ++ Color initial) ++ { ++ JColorChooser choose = new JColorChooser(initial); ++ ++ JDialog dialog = createDialog(component, title, true, choose, null, null); ++ ++ dialog.getContentPane().add(choose); ++ dialog.pack(); ++ dialog.show(); ++ ++ return choose.getColor(); ++ } // showDialog() ++ ++ /** ++ * This is a helper method to make the given JDialog block until it is ++ * hidden. ++ * ++ * @param dialog The JDialog to block. ++ */ ++ private static void makeModal(JDialog dialog) ++ { ++ try ++ { ++ synchronized (dialog) ++ { ++ while (dialog.isVisible()) ++ dialog.wait(); ++ } ++ } ++ catch (InterruptedException e) ++ { ++ } ++ } ++ ++ /** ++ * This is a helper method to find the first Frame or Dialog ancestor of the ++ * given Component. ++ * ++ * @param c The Component to find ancestors for. ++ * ++ * @return A Frame or Dialog ancestor. Null if none are found. ++ */ ++ private static Component findParent(Component c) ++ { ++ Component parent = SwingUtilities.getAncestorOfClass(Frame.class, c); ++ if (parent != null) ++ return parent; ++ parent = SwingUtilities.getAncestorOfClass(Dialog.class, c); ++ return parent; ++ } ++ ++ /** ++ * This method will take the given JColorChooser and place it in a JDialog ++ * with the given modal property. Three buttons are displayed in the ++ * JDialog: OK, Cancel and Reset. If OK or Cancel are pressed, the JDialog ++ * is hidden. If Reset is pressed, then the JColorChooser will take on its ++ * default color value. The given okListener will be registered to the OK ++ * button and the cancelListener will be registered to the Cancel button. ++ * If the modal property is set, then the JDialog will block until it is ++ * hidden. ++ * ++ * @param component The Component that will parent the JDialog. ++ * @param title The title displayed in the JDialog. ++ * @param modal The modal property. ++ * @param chooserPane The JColorChooser to place in the JDialog. ++ * @param okListener The ActionListener to register to the OK button. ++ * @param cancelListener The ActionListener to register to the Cancel ++ * button. ++ * ++ * @return A JDialog with the JColorChooser inside of it. ++ * ++ * @throws AWTError If the component is not a suitable parent. ++ */ ++ public static JDialog createDialog(Component component, String title, ++ boolean modal, JColorChooser chooserPane, ++ ActionListener okListener, ++ ActionListener cancelListener) ++ { ++ Component parent = findParent(component); ++ if (parent == null) ++ throw new AWTError("No suitable parent found for Component."); ++ JDialog dialog; ++ if (parent instanceof Frame) ++ dialog = new ModalDialog((Frame) parent, title); ++ else ++ dialog = new ModalDialog((Dialog) parent, title); ++ dialog.setModal(modal); ++ ++ dialog.getContentPane().setLayout(new BorderLayout()); ++ ++ JPanel panel = new JPanel(); ++ panel.setLayout(new FlowLayout()); ++ ++ ActionListener al = new DefaultOKCancelListener(dialog); ++ ++ JButton ok = new JButton("OK"); ++ ok.addActionListener(okListener); ++ ok.addActionListener(al); ++ ++ JButton cancel = new JButton("Cancel"); ++ cancel.addActionListener(cancelListener); ++ cancel.addActionListener(al); ++ ++ JButton reset = new JButton("Reset"); ++ reset.addActionListener(new DefaultResetListener(chooserPane)); ++ ++ dialog.getContentPane().add(chooserPane, BorderLayout.NORTH); ++ ++ panel.add(ok); ++ panel.add(cancel); ++ panel.add(reset); ++ ++ dialog.getContentPane().add(panel, BorderLayout.SOUTH); ++ ++ return dialog; ++ } // createDialog() ++ ++ /** ++ * This method returns the UI Component used for this JColorChooser. ++ * ++ * @return The UI Component for this JColorChooser. ++ */ ++ public ColorChooserUI getUI() ++ { ++ return (ColorChooserUI) ui; ++ } // getUI() ++ ++ /** ++ * This method sets the UI Component used for this JColorChooser. ++ * ++ * @param ui The UI Component to use with this JColorChooser. ++ */ ++ public void setUI(ColorChooserUI ui) ++ { ++ super.setUI(ui); ++ } // setUI() ++ ++ /** ++ * This method resets the UI Component property to the Look and Feel ++ * default. ++ */ ++ public void updateUI() ++ { ++ setUI((ColorChooserUI) UIManager.getUI(this)); ++ revalidate(); ++ } // updateUI() ++ ++ /** ++ * This method returns a String identifier for the UI Class to be used with ++ * the JColorChooser. ++ * ++ * @return The String identifier for the UI Class. ++ */ ++ public String getUIClassID() ++ { ++ return "ColorChooserUI"; ++ } // getUIClassID() ++ ++ /** ++ * This method returns the current color for the JColorChooser. ++ * ++ * @return The current color for the JColorChooser. ++ */ ++ public Color getColor() ++ { ++ return selectionModel.getSelectedColor(); // TODO ++ } // getColor() ++ ++ /** ++ * This method changes the previewPanel property for the JTabbedPane. The ++ * previewPanel is responsible for indicating the current color of the ++ * JColorChooser. ++ * ++ * @param component The Component that will act as the previewPanel. ++ */ ++ public void setPreviewPanel(JComponent component) ++ { ++ if (component != previewPanel) ++ { ++ JComponent old = previewPanel; ++ previewPanel = component; ++ firePropertyChange(PREVIEW_PANEL_PROPERTY, old, previewPanel); ++ } ++ } // setPreviewPanel() ++ ++ /** ++ * This method returns the current previewPanel used with this ++ * JColorChooser. ++ * ++ * @return The current previewPanel. ++ */ ++ public JComponent getPreviewPanel() ++ { ++ return previewPanel; // TODO ++ } // getPreviewPanel() ++ ++ /** ++ * This method adds the given AbstractColorChooserPanel to the list of the ++ * JColorChooser's chooserPanels. ++ * ++ * @param panel The AbstractColorChooserPanel to add. ++ */ ++ public void addChooserPanel(AbstractColorChooserPanel panel) ++ { ++ if (panel == null) ++ return; ++ AbstractColorChooserPanel[] old = chooserPanels; ++ AbstractColorChooserPanel[] newPanels = new AbstractColorChooserPanel[(old == null) ++ ? 1 ++ : old.length ++ + 1]; ++ if (old != null) ++ System.arraycopy(old, 0, newPanels, 0, old.length); ++ newPanels[newPanels.length - 1] = panel; ++ chooserPanels = newPanels; ++ panel.installChooserPanel(this); ++ firePropertyChange(CHOOSER_PANELS_PROPERTY, old, newPanels); ++ } // addChooserPanel() ++ ++ /** ++ * This method removes the given AbstractColorChooserPanel from the ++ * JColorChooser's list of chooserPanels. ++ * ++ * @param panel The AbstractColorChooserPanel to remove. ++ * ++ * @return The AbstractColorChooserPanel that was removed. ++ */ ++ public AbstractColorChooserPanel removeChooserPanel(AbstractColorChooserPanel panel) ++ { ++ int index = -1; ++ for (int i = 0; i < chooserPanels.length; i++) ++ if (panel == chooserPanels[i]) ++ { ++ index = i; ++ break; ++ } ++ ++ if (index == -1) ++ return null; ++ ++ AbstractColorChooserPanel[] old = chooserPanels; ++ if (chooserPanels.length == 1) ++ chooserPanels = null; ++ else ++ { ++ AbstractColorChooserPanel[] newPanels = new AbstractColorChooserPanel[chooserPanels.length ++ - 1]; ++ System.arraycopy(chooserPanels, 0, newPanels, 0, index); ++ System.arraycopy(chooserPanels, index, newPanels, index - 1, ++ chooserPanels.length - index); ++ chooserPanels = newPanels; ++ } ++ panel.uninstallChooserPanel(this); ++ firePropertyChange(CHOOSER_PANELS_PROPERTY, old, chooserPanels); ++ return panel; ++ } ++ ++ /** ++ * This method sets the chooserPanels property for this JColorChooser. ++ * ++ * @param panels The new set of AbstractColorChooserPanels to use. ++ */ ++ public void setChooserPanels(AbstractColorChooserPanel[] panels) ++ { ++ if (panels != chooserPanels) ++ { ++ if (chooserPanels != null) ++ for (int i = 0; i < chooserPanels.length; i++) ++ if (chooserPanels[i] != null) ++ chooserPanels[i].uninstallChooserPanel(this); ++ ++ AbstractColorChooserPanel[] old = chooserPanels; ++ chooserPanels = panels; ++ ++ if (panels != null) ++ for (int i = 0; i < panels.length; i++) ++ if (panels[i] != null) ++ panels[i].installChooserPanel(this); ++ ++ firePropertyChange(CHOOSER_PANELS_PROPERTY, old, chooserPanels); ++ } ++ } // setChooserPanels() ++ ++ /** ++ * This method returns the AbstractColorChooserPanels used with this ++ * JColorChooser. ++ * ++ * @return The AbstractColorChooserPanels used with this JColorChooser. ++ */ ++ public AbstractColorChooserPanel[] getChooserPanels() ++ { ++ return chooserPanels; ++ } // getChooserPanels() ++ ++ /** ++ * This method returns the ColorSelectionModel used with this JColorChooser. ++ * ++ * @return The ColorSelectionModel. ++ */ ++ public ColorSelectionModel getSelectionModel() ++ { ++ return selectionModel; ++ } // getSelectionModel() ++ ++ /** ++ * This method sets the ColorSelectionModel to be used with this ++ * JColorChooser. ++ * ++ * @param model The ColorSelectionModel to be used with this JColorChooser. ++ * ++ * @throws AWTError If the given model is null. ++ */ ++ public void setSelectionModel(ColorSelectionModel model) ++ { ++ if (model == null) ++ throw new AWTError("ColorSelectionModel is not allowed to be null."); ++ selectionModel = model; ++ } // setSelectionModel() ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean getDragEnabled() ++ { ++ return dragEnabled; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param b DOCUMENT ME! ++ */ ++ public void setDragEnabled(boolean b) ++ { ++ dragEnabled = b; ++ } ++ ++ /** ++ * This method returns a String describing the JColorChooser. ++ * ++ * @return A String describing the JColorChooser. ++ */ ++ protected String paramString() ++ { ++ return "JColorChooser"; ++ } // paramString() ++ ++ /** ++ * getAccessibleContext ++ * ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJColorChooser(); ++ ++ return accessibleContext; ++ } ++ ++ /** ++ * A helper class that hides a JDialog when the action is performed. ++ */ ++ static class DefaultOKCancelListener implements ActionListener ++ { ++ /** The JDialog to hide. */ ++ private JDialog dialog; ++ ++ /** ++ * Creates a new DefaultOKCancelListener with the given JDialog to hide. ++ * ++ * @param dialog The JDialog to hide. ++ */ ++ public DefaultOKCancelListener(JDialog dialog) ++ { ++ super(); ++ this.dialog = dialog; ++ } ++ ++ /** ++ * This method hides the JDialog when called. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ dialog.hide(); ++ } ++ } ++ ++ /** ++ * This method resets the JColorChooser color to the initial color when the ++ * action is performed. ++ */ ++ static class DefaultResetListener implements ActionListener ++ { ++ /** The JColorChooser to reset. */ ++ private JColorChooser chooser; ++ ++ /** The initial color. */ ++ private Color init; ++ ++ /** ++ * Creates a new DefaultResetListener with the given JColorChooser. ++ * ++ * @param chooser The JColorChooser to reset. ++ */ ++ public DefaultResetListener(JColorChooser chooser) ++ { ++ super(); ++ this.chooser = chooser; ++ init = chooser.getColor(); ++ } ++ ++ /** ++ * This method resets the JColorChooser to its initial color. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ chooser.setColor(init); ++ } ++ } ++ ++ /** ++ * This is a custom JDialog that will notify when it is hidden and the modal ++ * property is set. ++ */ ++ static class ModalDialog extends JDialog ++ { ++ /** The modal property. */ ++ private boolean modal; ++ ++ /** ++ * Creates a new ModalDialog object with the given parent and title. ++ * ++ * @param parent The parent of the JDialog. ++ * @param title The title of the JDialog. ++ */ ++ public ModalDialog(Frame parent, String title) ++ { ++ super(parent, title); ++ } ++ ++ /** ++ * Creates a new ModalDialog object with the given parent and title. ++ * ++ * @param parent The parent of the JDialog. ++ * @param title The title of the JDialog. ++ */ ++ public ModalDialog(Dialog parent, String title) ++ { ++ super(parent, title); ++ } ++ ++ /** ++ * This method sets the modal property. ++ * ++ * @param modal The modal property. ++ */ ++ public void setModal(boolean modal) ++ { ++ this.modal = modal; ++ } ++ ++ /** ++ * This method shows the ModalDialog. ++ */ ++ public void show() ++ { ++ super.show(); ++ if (modal) ++ makeModal(this); ++ } ++ ++ /** ++ * This method hides the ModalDialog. ++ */ ++ public synchronized void hide() ++ { ++ super.hide(); ++ notifyAll(); ++ } ++ } ++} +Index: javax/swing/JComboBox.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JComboBox.java,v +retrieving revision 1.3 +diff -u -r1.3 JComboBox.java +--- javax/swing/JComboBox.java 12 Oct 2003 13:20:49 -0000 1.3 ++++ javax/swing/JComboBox.java 6 Sep 2004 16:35:54 -0000 +@@ -1,5 +1,5 @@ + /* JComboBox.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,805 +35,1139 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + +-import java.awt.*; +-import java.awt.event.*; +-import java.beans.*; +-import java.io.*; +-import java.util.*; +-import javax.accessibility.*; +-import javax.swing.event.*; +-import javax.swing.plaf.*; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.ItemSelectable; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.awt.event.ItemEvent; ++import java.awt.event.ItemListener; ++import java.awt.event.KeyEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.io.IOException; ++import java.io.ObjectOutputStream; ++import java.util.Vector; ++import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleAction; ++import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleSelection; ++import javax.swing.JComponent; ++import javax.swing.event.ListDataEvent; ++import javax.swing.event.ListDataListener; ++import javax.swing.event.PopupMenuListener; ++import javax.swing.plaf.ComboBoxUI; ++ + + /** +- * JComboBox +- * @author Andrew Selkirk +- * @version 1.0 ++ * JComboBox. JComboBox is a container, that keeps track of elements added to ++ * it by the user. JComboBox allows user to select any item in its list and ++ * displays the selected item to the user. JComboBox also can show/hide popup ++ * menu containing its list of item whenever the mouse is pressed over it. ++ * ++ * @author Andrew Selkirk ++ * @author Olga Rodimina + */ +-public class JComboBox extends JComponent +- implements ItemSelectable, ListDataListener, ActionListener, Accessible ++public class JComboBox extends JComponent implements ItemSelectable, ++ ListDataListener, ++ ActionListener, ++ Accessible + { + private static final long serialVersionUID = 5654585963292734470L; + +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJComboBox +- */ +- protected class AccessibleJComboBox extends AccessibleJComponent +- implements AccessibleAction, AccessibleSelection { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJComboBox +- * @param component TODO +- */ +- protected AccessibleJComboBox(JComboBox component) { +- super(component); +- // TODO +- } // AccessibleJComboBox() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleChildrenCount +- * @returns int +- */ +- public int getAccessibleChildrenCount() { +- return 0; // TODO +- } // getAccessibleChildrenCount() +- +- /** +- * getAccessibleChild +- * @param value0 TODO +- * @returns Accessible +- */ +- public Accessible getAccessibleChild(int value0) { +- return null; // TODO +- } // getAccessibleChild() +- +- /** +- * getAccessibleSelection +- * @returns AccessibleSelection +- */ +- public AccessibleSelection getAccessibleSelection() { +- return null; // TODO +- } // getAccessibleSelection() +- +- /** +- * getAccessibleSelection +- * @param value0 TODO +- * @returns Accessible +- */ +- public Accessible getAccessibleSelection(int value0) { +- return null; // TODO +- } // getAccessibleSelection() +- +- /** +- * isAccessibleChildSelected +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean isAccessibleChildSelected(int value0) { +- return false; // TODO +- } // isAccessibleChildSelected() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.COMBO_BOX; +- } // getAccessibleRole() +- +- /** +- * getAccessibleAction +- * @returns AccessibleAction +- */ +- public AccessibleAction getAccessibleAction() { +- return null; // TODO +- } // getAccessibleAction() +- +- /** +- * getAccessibleActionDescription +- * @param value0 TODO +- * @returns String +- */ +- public String getAccessibleActionDescription(int value0) { +- return null; // TODO +- } // getAccessibleActionDescription() +- +- /** +- * getAccessibleActionCount +- * @returns int +- */ +- public int getAccessibleActionCount() { +- return 0; // TODO +- } // getAccessibleActionCount() +- +- /** +- * doAccessibleAction +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean doAccessibleAction(int value0) { +- return false; // TODO +- } // doAccessibleAction() +- +- /** +- * getAccessibleSelectionCount +- * @returns int +- */ +- public int getAccessibleSelectionCount() { +- return 0; // TODO +- } // getAccessibleSelectionCount() +- +- /** +- * addAccessibleSelection +- * @param value0 TODO +- */ +- public void addAccessibleSelection(int value0) { +- // TODO +- } // addAccessibleSelection() +- +- /** +- * removeAccessibleSelection +- * @param value0 TODO +- */ +- public void removeAccessibleSelection(int value0) { +- // TODO +- } // removeAccessibleSelection() +- +- /** +- * clearAccessibleSelection +- */ +- public void clearAccessibleSelection() { +- // TODO +- } // clearAccessibleSelection() +- +- /** +- * selectAllAccessibleSelection +- */ +- public void selectAllAccessibleSelection() { +- // TODO +- } // selectAllAccessibleSelection() +- +- +- } // AccessibleJComboBox +- +- /** +- * KeySelectionManager +- */ +- public static interface KeySelectionManager { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * selectionForKey +- * @param value0 TODO +- * @param value1 TODO +- * @returns int +- */ +- int selectionForKey(char value0, ComboBoxModel value1); +- +- +- } // KeySelectionManager +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "ComboBoxUI"; +- +- /** +- * dataModel +- */ +- protected ComboBoxModel dataModel; +- +- /** +- * renderer +- */ +- protected ListCellRenderer renderer; +- +- /** +- * editor +- */ +- protected ComboBoxEditor editor; +- +- /** +- * maximumRowCount +- */ +- protected int maximumRowCount; +- +- /** +- * isEditable +- */ +- protected boolean isEditable; +- +- /** +- * selectedItemReminder +- */ +- protected Object selectedItemReminder; +- +- /** +- * keySelectionManager +- */ +- protected JComboBox.KeySelectionManager keySelectionManager; +- +- /** +- * actionCommand +- */ +- protected String actionCommand; +- +- /** +- * lightWeightPopupEnabled +- */ +- protected boolean lightWeightPopupEnabled; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JComboBox +- * @param value0 TODO +- */ +- public JComboBox(ComboBoxModel value0) { +- // TODO +- } // JComboBox() +- +- /** +- * Constructor JComboBox +- * @param value0 TODO +- */ +- public JComboBox(Object[] value0) { +- // TODO +- } // JComboBox() +- +- /** +- * Constructor JComboBox +- * @param value0 TODO +- */ +- public JComboBox(Vector value0) { +- // TODO +- } // JComboBox() +- +- /** +- * Constructor JComboBox +- */ +- public JComboBox() { +- // TODO +- } // JComboBox() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * isEditable +- * @returns boolean +- */ +- public boolean isEditable() { +- return false; // TODO +- } // isEditable() +- +- /** +- * installAncestorListener +- */ +- protected void installAncestorListener() { +- // TODO +- } // installAncestorListener() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(ComboBoxUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((ComboBoxUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getUI +- * @returns ComboBoxUI +- */ +- public ComboBoxUI getUI() { +- return (ComboBoxUI) ui; +- } // getUI() +- +- /** +- * setModel +- * @param value0 TODO +- */ +- public void setModel(ComboBoxModel value0) { +- // TODO +- } // setModel() +- +- /** +- * getModel +- * @returns ComboBoxModel +- */ +- public ComboBoxModel getModel() { +- return null; // TODO +- } // getModel() +- +- /** +- * setLightWeightPopupEnabled +- * @param value0 TODO +- */ +- public void setLightWeightPopupEnabled(boolean value0) { +- // TODO +- } // setLightWeightPopupEnabled() +- +- /** +- * isLightWeightPopupEnabled +- * @returns boolean +- */ +- public boolean isLightWeightPopupEnabled() { +- return false; // TODO +- } // isLightWeightPopupEnabled() +- +- /** +- * setEditable +- * @param value0 TODO +- */ +- public void setEditable(boolean value0) { +- // TODO +- } // setEditable() +- +- /** +- * setMaximumRowCount +- * @param value0 TODO +- */ +- public void setMaximumRowCount(int value0) { +- // TODO +- } // setMaximumRowCount() +- +- /** +- * getMaximumRowCount +- * @returns int +- */ +- public int getMaximumRowCount() { +- return 0; // TODO +- } // getMaximumRowCount() +- +- /** +- * setRenderer +- * @param value0 TODO +- */ +- public void setRenderer(ListCellRenderer value0) { +- // TODO +- } // setRenderer() +- +- /** +- * getRenderer +- * @returns ListCellRenderer +- */ +- public ListCellRenderer getRenderer() { +- return null; // TODO +- } // getRenderer() +- +- /** +- * setEditor +- * @param value0 TODO +- */ +- public void setEditor(ComboBoxEditor value0) { +- // TODO +- } // setEditor() +- +- /** +- * getEditor +- * @returns ComboBoxEditor +- */ +- public ComboBoxEditor getEditor() { +- return null; // TODO +- } // getEditor() +- +- /** +- * setSelectedItem +- * @param value0 TODO +- */ +- public void setSelectedItem(Object value0) { +- // TODO +- } // setSelectedItem() +- +- /** +- * getSelectedItem +- * @returns Object +- */ +- public Object getSelectedItem() { +- return null; // TODO +- } // getSelectedItem() +- +- /** +- * setSelectedIndex +- * @param value0 TODO +- */ +- public void setSelectedIndex(int value0) { +- // TODO +- } // setSelectedIndex() +- +- /** +- * getSelectedIndex +- * @returns int +- */ +- public int getSelectedIndex() { +- return 0; // TODO +- } // getSelectedIndex() +- +- /** +- * addItem +- * @param value0 TODO +- */ +- public void addItem(Object value0) { +- // TODO +- } // addItem() +- +- /** +- * insertItemAt +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void insertItemAt(Object value0, int value1) { +- // TODO +- } // insertItemAt() +- +- /** +- * removeItem +- * @param value0 TODO +- */ +- public void removeItem(Object value0) { +- // TODO +- } // removeItem() +- +- /** +- * removeItemAt +- * @param value0 TODO +- */ +- public void removeItemAt(int value0) { +- // TODO +- } // removeItemAt() +- +- /** +- * removeAllItems +- */ +- public void removeAllItems() { +- // TODO +- } // removeAllItems() +- +- /** +- * showPopup +- */ +- public void showPopup() { +- // TODO +- } // showPopup() +- +- /** +- * hidePopup +- */ +- public void hidePopup() { +- // TODO +- } // hidePopup() +- +- /** +- * setPopupVisible +- * @param value0 TODO +- */ +- public void setPopupVisible(boolean value0) { +- // TODO +- } // setPopupVisible() +- +- /** +- * isPopupVisible +- * @returns boolean +- */ +- public boolean isPopupVisible() { +- return false; // TODO +- } // isPopupVisible() +- +- /** +- * addItemListener +- * @param value0 TODO +- */ +- public void addItemListener(ItemListener value0) { +- // TODO +- } // addItemListener() +- +- /** +- * removeItemListener +- * @param value0 TODO +- */ +- public void removeItemListener(ItemListener value0) { +- // TODO +- } // removeItemListener() +- +- /** +- * addActionListener +- * @param value0 TODO +- */ +- public void addActionListener(ActionListener value0) { +- // TODO +- } // addActionListener() +- +- /** +- * removeActionListener +- * @param value0 TODO +- */ +- public void removeActionListener(ActionListener value0) { +- // TODO +- } // removeActionListener() +- +- /** +- * setActionCommand +- * @param value0 TODO +- */ +- public void setActionCommand(String value0) { +- // TODO +- } // setActionCommand() +- +- /** +- * getActionCommand +- * @returns String +- */ +- public String getActionCommand() { +- return null; // TODO +- } // getActionCommand() +- +- /** +- * setAction +- * @param value0 TODO +- */ +- public void setAction(Action value0) { +- // TODO +- } // setAction() +- +- /** +- * isListener +- * @param value0 TODO +- * @param value1 TODO +- * @returns boolean +- */ +- private boolean isListener(Class value0, ActionListener value1) { +- return false; // TODO +- } // isListener() +- +- /** +- * getAction +- * @returns Action +- */ +- public Action getAction() { +- return null; // TODO +- } // getAction() +- +- /** +- * configurePropertiesFromAction +- * @param value0 TODO +- */ +- protected void configurePropertiesFromAction(Action value0) { +- // TODO +- } // configurePropertiesFromAction() +- +- /** +- * createActionPropertyChangeListener +- * @param value0 TODO +- * @returns PropertyChangeListener +- */ +- protected PropertyChangeListener createActionPropertyChangeListener(Action value0) { +- return null; // TODO +- } // createActionPropertyChangeListener() +- +- /** +- * fireItemStateChanged +- * @param value0 TODO +- */ +- protected void fireItemStateChanged(ItemEvent value0) { +- // TODO +- } // fireItemStateChanged() +- +- /** +- * fireActionEvent +- */ +- protected void fireActionEvent() { +- // TODO +- } // fireActionEvent() +- +- /** +- * selectedItemChanged +- */ +- protected void selectedItemChanged() { +- // TODO +- } // selectedItemChanged() +- +- /** +- * getSelectedObjects +- * @returns Object[] +- */ +- public Object[] getSelectedObjects() { +- return null; // TODO +- } // getSelectedObjects() +- +- /** +- * actionPerformed +- * @param value0 TODO +- */ +- public void actionPerformed(ActionEvent value0) { +- // TODO +- } // actionPerformed() +- +- /** +- * contentsChanged +- * @param value0 TODO +- */ +- public void contentsChanged(ListDataEvent value0) { +- // TODO +- } // contentsChanged() +- +- /** +- * selectWithKeyChar +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean selectWithKeyChar(char value0) { +- return false; // TODO +- } // selectWithKeyChar() +- +- /** +- * intervalAdded +- * @param value0 TODO +- */ +- public void intervalAdded(ListDataEvent value0) { +- // TODO +- } // intervalAdded() +- +- /** +- * intervalRemoved +- * @param value0 TODO +- */ +- public void intervalRemoved(ListDataEvent value0) { +- // TODO +- } // intervalRemoved() +- +- /** +- * setEnabled +- * @param value0 TODO +- */ +- public void setEnabled(boolean value0) { +- // TODO +- } // setEnabled() +- +- /** +- * configureEditor +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void configureEditor(ComboBoxEditor value0, Object value1) { +- // TODO +- } // configureEditor() +- +- /** +- * processKeyEvent +- * @param value0 TODO +- */ +- public void processKeyEvent(KeyEvent value0) { +- // TODO +- } // processKeyEvent() +- +- /** +- * isFocusTraversable +- * @returns boolean +- * @deprecated +- */ +- public boolean isFocusTraversable() { +- return false; // TODO +- } // isFocusTraversable() +- +- /** +- * setKeySelectionManager +- * @param value0 TODO +- */ +- public void setKeySelectionManager(KeySelectionManager value0) { +- // TODO +- } // setKeySelectionManager() +- +- /** +- * getKeySelectionManager +- * @returns JComboBox.KeySelectionManager +- */ +- public JComboBox.KeySelectionManager getKeySelectionManager() { +- return null; // TODO +- } // getKeySelectionManager() +- +- /** +- * getItemCount +- * @returns int +- */ +- public int getItemCount() { +- return 0; // TODO +- } // getItemCount() +- +- /** +- * getItemAt +- * @param value0 TODO +- * @returns Object +- */ +- public Object getItemAt(int value0) { +- return null; // TODO +- } // getItemAt() +- +- /** +- * createDefaultKeySelectionManager +- * @returns KeySelectionManager +- */ +- protected KeySelectionManager createDefaultKeySelectionManager() { +- return null; // TODO +- } // createDefaultKeySelectionManager() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJComboBox(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JComboBox ++ /** ++ * KeySelectionManager interface. Class implementing this interface are ++ * responsible for matching key characters typed by the user with combo ++ * box's items. ++ */ ++ public static interface KeySelectionManager ++ { ++ int selectionForKey(char aKey, ComboBoxModel aModel); ++ } ++ ++ /** ++ * Maximum number of rows that should be visible by default in the ++ * JComboBox's popup ++ */ ++ public static final int DEFAULT_MAXIMUM_ROW_COUNT = 8; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'editable' property changes. ++ */ ++ public static final String EDITABLE_CHANGED_PROPERTY = "editable"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'maximumRowCount' property ++ * changes. ++ */ ++ public static final String MAXIMUM_ROW_COUNT_CHANGED_PROPERTY = "maximumRowCount"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'enabled' property changes. ++ */ ++ public static final String ENABLED_CHANGED_PROPERTY = "enabled"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'renderer' property changes. ++ */ ++ public static final String RENDERER_CHANGED_PROPERTY = "renderer"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'editor' property changes. ++ */ ++ public static final String EDITOR_CHANGED_PROPERTY = "editor"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the 'dataModel' property changes. ++ */ ++ public static final String MODEL_CHANGED_PROPERTY = "dataModel"; ++ ++ /** ++ * name for the UI delegate for this combo box. ++ */ ++ private static final String uiClassID = "ComboBoxUI"; ++ ++ /** ++ * dataModel used by JComboBox to keep track of its list data and currently ++ * selected element in the list. ++ */ ++ protected ComboBoxModel dataModel; ++ ++ /** ++ * Renderer renders(paints) every object in the combo box list in its ++ * associated list cell. This ListCellRenderer is used only when this ++ * JComboBox is uneditable. ++ */ ++ protected ListCellRenderer renderer; ++ ++ /** ++ * editor that is responsible for editting an object in a combo box list ++ */ ++ protected ComboBoxEditor editor; ++ ++ /** ++ * Number of rows that will be visible in the JComboBox's popup. ++ */ ++ protected int maximumRowCount; ++ ++ /** ++ * This field indicates if textfield of this JComboBox is editable or not. ++ */ ++ protected boolean isEditable; ++ ++ /** ++ * This field is reference to the current selection of the combo box. ++ */ ++ protected Object selectedItemReminder; ++ ++ /** ++ * keySelectionManager ++ */ ++ protected KeySelectionManager keySelectionManager; ++ ++ /** ++ * This actionCommand is used in ActionEvent that is fired to JComboBox's ++ * ActionListeneres. ++ */ ++ protected String actionCommand; ++ ++ /** ++ * This property indicates if heavyweight popup or lightweight popup will be ++ * used to diplay JComboBox's elements. ++ */ ++ protected boolean lightWeightPopupEnabled; ++ ++ /** ++ * The action taken when new item is selected in the JComboBox ++ */ ++ private Action action; ++ ++ /** ++ * since 1.4 If this field is set then comboBox's display area for the ++ * selected item will be set by default to this value. ++ */ ++ private Object prototypeDisplayValue; ++ ++ /** ++ * Constructs JComboBox object with specified data model for it. The first ++ * item in the specified data model is selected by default. ++ * ++ * @param model Data model that will be used by this JComboBox to keep track ++ * of its list of items. ++ */ ++ public JComboBox(ComboBoxModel model) ++ { ++ setEditable(false); ++ setEnabled(true); ++ setMaximumRowCount(DEFAULT_MAXIMUM_ROW_COUNT); ++ setModel(model); ++ setActionCommand("comboBoxChanged"); ++ ++ // by default set selected item to the first element in the combo box ++ if (getItemCount() != 0) ++ setSelectedItem(getItemAt(0)); ++ ++ lightWeightPopupEnabled = true; ++ isEditable = false; ++ ++ updateUI(); ++ } ++ ++ /** ++ * Constructs JComboBox with specified list of items. ++ * ++ * @param itemArray array containing list of items for this JComboBox ++ */ ++ public JComboBox(Object[] itemArray) ++ { ++ this(new DefaultComboBoxModel(itemArray)); ++ } ++ ++ /** ++ * Constructs JComboBox object with specified list of items. ++ * ++ * @param itemVector vector containing list of items for this JComboBox. ++ */ ++ public JComboBox(Vector itemVector) ++ { ++ this(new DefaultComboBoxModel(itemVector)); ++ } ++ ++ /** ++ * Constructor. Creates new empty JComboBox. ComboBox's data model is set to ++ * DefaultComboBoxModel. ++ */ ++ public JComboBox() ++ { ++ this(new DefaultComboBoxModel()); ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * This method returns true JComboBox is editable and false otherwise ++ * ++ * @return boolean true if JComboBox is editable and false otherwise ++ */ ++ public boolean isEditable() ++ { ++ return isEditable; ++ } ++ ++ /* ++ * This method adds ancestor listener to this JComboBox. ++ */ ++ protected void installAncestorListener() ++ { ++ /* FIXME: Need to implement. ++ * ++ * Need to add ancestor listener to this JComboBox. This listener ++ * should close combo box's popup list of items whenever it ++ * receives an AncestorEvent. ++ */ ++ } ++ ++ /** ++ * Set the "UI" property of the combo box, which is a look and feel class ++ * responsible for handling comboBox's input events and painting it. ++ * ++ * @param ui The new "UI" property ++ */ ++ public void setUI(ComboBoxUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets this comboBox's UI to the UIManager's default for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((ComboBoxUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns the String identifier for the UI class to the used ++ * with the JComboBox. ++ * ++ * @return The String identifier for the UI class. ++ */ ++ public String getUIClassID() ++ { ++ return uiClassID; ++ } ++ ++ /** ++ * This method returns the UI used to display the JComboBox. ++ * ++ * @return The UI used to display the JComboBox. ++ */ ++ public ComboBoxUI getUI() ++ { ++ return (ComboBoxUI) ui; ++ } ++ ++ /** ++ * Set the data model for this JComboBox. This un-registers all listeners ++ * associated with the current model, and re-registers them with the new ++ * model. ++ * ++ * @param newDataModel The new data model for this JComboBox ++ */ ++ public void setModel(ComboBoxModel newDataModel) ++ { ++ if (this.dataModel == newDataModel) ++ return; ++ ++ if (this.dataModel != null) ++ // remove all listeners currently registered with the model. ++ dataModel.removeListDataListener(this); ++ ++ ComboBoxModel oldDataModel = this.dataModel; ++ this.dataModel = newDataModel; ++ ++ if (this.dataModel != null) ++ // register all listeners with the new data model ++ dataModel.addListDataListener(this); ++ ++ firePropertyChange(MODEL_CHANGED_PROPERTY, oldDataModel, this.dataModel); ++ } ++ ++ /** ++ * This method returns data model for this comboBox. ++ * ++ * @return ComboBoxModel containing items for this combo box. ++ */ ++ public ComboBoxModel getModel() ++ { ++ return dataModel; ++ } ++ ++ /** ++ * This method sets JComboBox's popup to be either lightweight or ++ * heavyweight. If 'enabled' is true then lightweight popup is used and ++ * heavyweight otherwise. By default lightweight popup is used to display ++ * this JComboBox's elements. ++ * ++ * @param enabled indicates if lightweight popup or heavyweight popup should ++ * be used to display JComboBox's elements. ++ */ ++ public void setLightWeightPopupEnabled(boolean enabled) ++ { ++ this.lightWeightPopupEnabled = enabled; ++ } ++ ++ /** ++ * This method returns whether popup menu that is used to display list of ++ * combo box's item is lightWeight or not. ++ * ++ * @return boolean true if popup menu is lightweight and false otherwise. ++ */ ++ public boolean isLightWeightPopupEnabled() ++ { ++ return lightWeightPopupEnabled; ++ } ++ ++ /** ++ * This method sets editability of the combo box. If combo box is editable ++ * the user can choose component from the combo box list by typing ++ * component's name in the editor(JTextfield by default). Otherwise if not ++ * editable, the user should use the list to choose the component. This ++ * method fires PropertyChangeEvents to JComboBox's registered ++ * PropertyChangeListeners to indicate that 'editable' property of the ++ * JComboBox has changed. ++ * ++ * @param editable indicates if the JComboBox's textfield should be editable ++ * or not. ++ */ ++ public void setEditable(boolean editable) ++ { ++ if (this.isEditable != editable) ++ { ++ this.isEditable = editable; ++ firePropertyChange(EDITABLE_CHANGED_PROPERTY, ! isEditable, isEditable); ++ } ++ } ++ ++ /** ++ * Sets number of rows that should be visible in this JComboBox's popup. If ++ * this JComboBox's popup has more elements that maximum number or rows ++ * then popup will have a scroll pane to allow users to view other ++ * elements. ++ * ++ * @param rowCount number of rows that will be visible in JComboBox's popup. ++ */ ++ public void setMaximumRowCount(int rowCount) ++ { ++ if (maximumRowCount != rowCount) ++ { ++ int oldMaximumRowCount = this.maximumRowCount; ++ this.maximumRowCount = rowCount; ++ firePropertyChange(MAXIMUM_ROW_COUNT_CHANGED_PROPERTY, ++ oldMaximumRowCount, this.maximumRowCount); ++ } ++ } ++ ++ /** ++ * This method returns number of rows visible in the JComboBox's list of ++ * items. ++ * ++ * @return int maximun number of visible rows in the JComboBox's list. ++ */ ++ public int getMaximumRowCount() ++ { ++ return maximumRowCount; ++ } ++ ++ /** ++ * This method sets cell renderer for this JComboBox that will be used to ++ * paint combo box's items. The Renderer should only be used only when ++ * JComboBox is not editable. In the case when JComboBox is editable the ++ * editor must be used. This method also fires PropertyChangeEvent when ++ * cellRendered for this JComboBox has changed. ++ * ++ * @param aRenderer cell renderer that will be used by this JComboBox to ++ * paint its elements. ++ */ ++ public void setRenderer(ListCellRenderer aRenderer) ++ { ++ if (this.renderer != aRenderer) ++ { ++ ListCellRenderer oldRenderer = this.renderer; ++ this.renderer = aRenderer; ++ firePropertyChange(RENDERER_CHANGED_PROPERTY, oldRenderer, ++ this.renderer); ++ } ++ } ++ ++ /** ++ * This method returns renderer responsible for rendering selected item in ++ * the combo box ++ * ++ * @return ListCellRenderer ++ */ ++ public ListCellRenderer getRenderer() ++ { ++ return renderer; ++ } ++ ++ /** ++ * Sets editor for this JComboBox ++ * ++ * @param newEditor ComboBoxEditor for this JComboBox. This method fires ++ * PropertyChangeEvent when 'editor' property is changed. ++ */ ++ public void setEditor(ComboBoxEditor newEditor) ++ { ++ if (editor == newEditor) ++ return; ++ ++ if (editor != null) ++ editor.removeActionListener(this); ++ ++ ComboBoxEditor oldEditor = editor; ++ editor = newEditor; ++ ++ if (editor != null) ++ editor.addActionListener(this); ++ ++ firePropertyChange(EDITOR_CHANGED_PROPERTY, oldEditor, editor); ++ } ++ ++ /** ++ * Returns editor component that is responsible for displaying/editting ++ * selected item in the combo box. ++ * ++ * @return ComboBoxEditor ++ */ ++ public ComboBoxEditor getEditor() ++ { ++ return editor; ++ } ++ ++ /** ++ * Forces combo box to select given item ++ * ++ * @param item element in the combo box to select. ++ */ ++ public void setSelectedItem(Object item) ++ { ++ dataModel.setSelectedItem(item); ++ } ++ ++ /** ++ * Returns currently selected item in the combo box. ++ * ++ * @return element that is currently selected in this combo box. ++ */ ++ public Object getSelectedItem() ++ { ++ Object item = dataModel.getSelectedItem(); ++ ++ if (item == null && getItemCount() != 0) ++ item = getItemAt(0); ++ ++ return item; ++ } ++ ++ /** ++ * Forces JComboBox to select component located in the given index in the ++ * combo box. ++ * ++ * @param index index specifying location of the component that should be ++ * selected. ++ */ ++ public void setSelectedIndex(int index) ++ { ++ // FIXME: if index == -1 then nothing should be selected ++ setSelectedItem(dataModel.getElementAt(index)); ++ } ++ ++ /** ++ * Returns index of the item that is currently selected in the combo box. ++ * If no item is currently selected, then -1 is returned. ++ * ++ * @return int index specifying location of the currently selected item in ++ * the combo box or -1 if nothing is selected in the combo box. ++ */ ++ public int getSelectedIndex() ++ { ++ Object selectedItem = getSelectedItem(); ++ if (selectedItem != null && (dataModel instanceof DefaultComboBoxModel)) ++ return ((DefaultComboBoxModel) dataModel).getIndexOf(selectedItem); ++ ++ return -1; ++ } ++ ++ public Object getPrototypeDisplayValue() ++ { ++ return prototypeDisplayValue; ++ } ++ ++ public void setPrototypeDisplayValue(Object prototypeDisplayValue) ++ { ++ this.prototypeDisplayValue = prototypeDisplayValue; ++ } ++ ++ /** ++ * This method adds given element to this JComboBox. ++ * ++ * @param element element to add ++ */ ++ public void addItem(Object element) ++ { ++ ((MutableComboBoxModel) dataModel).addElement(element); ++ } ++ ++ /** ++ * Inserts given element at the specified index to this JComboBox ++ * ++ * @param element element to insert ++ * @param index position where to insert the element ++ */ ++ public void insertItemAt(Object element, int index) ++ { ++ ((MutableComboBoxModel) dataModel).insertElementAt(element, index); ++ } ++ ++ /** ++ * This method removes given element from this JComboBox. ++ * ++ * @param element element to remove ++ */ ++ public void removeItem(Object element) ++ { ++ ((MutableComboBoxModel) dataModel).removeElement(element); ++ } ++ ++ /** ++ * This method remove element location in the specified index in the ++ * JComboBox. ++ * ++ * @param index index specifying position of the element to remove ++ */ ++ public void removeItemAt(int index) ++ { ++ ((MutableComboBoxModel) dataModel).removeElementAt(index); ++ } ++ ++ /** ++ * This method removes all elements from this JComboBox. ++ */ ++ public void removeAllItems() ++ { ++ if (dataModel instanceof DefaultComboBoxModel) ++ ((DefaultComboBoxModel) dataModel).removeAllElements(); ++ } ++ ++ /** ++ * This method displays popup with list of combo box's items on the screen ++ */ ++ public void showPopup() ++ { ++ setPopupVisible(true); ++ } ++ ++ /** ++ * This method hides popup containing list of combo box's items ++ */ ++ public void hidePopup() ++ { ++ setPopupVisible(false); ++ } ++ ++ /** ++ * This method either displayes or hides the popup containing list of combo ++ * box's items. ++ * ++ * @param visible show popup if 'visible' is true and hide it otherwise ++ */ ++ public void setPopupVisible(boolean visible) ++ { ++ getUI().setPopupVisible(this, visible); ++ } ++ ++ /** ++ * Checks if popup is currently visible on the screen. ++ * ++ * @return boolean true if popup is visible and false otherwise ++ */ ++ public boolean isPopupVisible() ++ { ++ return getUI().isPopupVisible(this); ++ } ++ ++ /** ++ * This method sets actionCommand to the specified string. ActionEvent fired ++ * to this JComboBox registered ActionListeners will contain this ++ * actionCommand. ++ * ++ * @param aCommand new action command for the JComboBox's ActionEvent ++ */ ++ public void setActionCommand(String aCommand) ++ { ++ actionCommand = aCommand; ++ } ++ ++ /** ++ * Returns actionCommand associated with the ActionEvent fired by the ++ * JComboBox to its registered ActionListeners. ++ * ++ * @return String actionCommand for the ActionEvent ++ */ ++ public String getActionCommand() ++ { ++ return actionCommand; ++ } ++ ++ /** ++ * setAction ++ * ++ * @param a action to set ++ */ ++ public void setAction(Action a) ++ { ++ Action old = action; ++ action = a; ++ configurePropertiesFromAction(action); ++ if (action != null) ++ // FIXME: remove from old action and add to new action ++ // PropertyChangeListener to listen to changes in the action ++ addActionListener(action); ++ } ++ ++ /** ++ * This method returns Action that is invoked when selected item is changed ++ * in the JComboBox. ++ * ++ * @return Action ++ */ ++ public Action getAction() ++ { ++ return action; ++ } ++ ++ /** ++ * Configure properties of the JComboBox by reading properties of specified ++ * action. This method always sets the comboBox's "enabled" property to the ++ * value of the Action's "enabled" property. ++ * ++ * @param a An Action to configure the combo box from ++ */ ++ protected void configurePropertiesFromAction(Action a) ++ { ++ if (a == null) ++ { ++ setEnabled(true); ++ setToolTipText(null); ++ } ++ else ++ { ++ setEnabled(a.isEnabled()); ++ setToolTipText((String) (a.getValue(Action.SHORT_DESCRIPTION))); ++ } ++ } ++ ++ /** ++ * Creates PropertyChangeListener to listen for the changes in comboBox's ++ * action properties. ++ * ++ * @param action action to listen to for property changes ++ * ++ * @return $PropertyChangeListener$ Listener that listens to changes in ++ * action properties. ++ */ ++ protected PropertyChangeListener createActionPropertyChangeListener(Action action) ++ { ++ return new PropertyChangeListener() ++ { ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ Action act = (Action) (e.getSource()); ++ configurePropertiesFromAction(act); ++ } ++ }; ++ } ++ ++ /** ++ * This method fires ItemEvent to this JComboBox's registered ItemListeners. ++ * This method is invoked when currently selected item in this combo box ++ * has changed. ++ * ++ * @param e the ItemEvent describing the change in the combo box's ++ * selection. ++ */ ++ protected void fireItemStateChanged(ItemEvent e) ++ { ++ ItemListener[] ll = getItemListeners(); ++ ++ for (int i = 0; i < ll.length; i++) ++ ll[i].itemStateChanged(e); ++ } ++ ++ /** ++ * This method fires ActionEvent to this JComboBox's registered ++ * ActionListeners. This method is invoked when user explicitly changes ++ * currently selected item. ++ */ ++ protected void fireActionEvent() ++ { ++ ActionListener[] ll = getActionListeners(); ++ ++ for (int i = 0; i < ll.length; i++) ++ ll[i].actionPerformed(new ActionEvent(this, ++ ActionEvent.ACTION_PERFORMED, ++ actionCommand)); ++ } ++ ++ /** ++ * This method is invoked whenever selected item changes in the combo box's ++ * data model. It fires ItemEvent and ActionEvent to all registered ++ * ComboBox's ItemListeners and ActionListeners respectively, indicating ++ * the change. ++ */ ++ protected void selectedItemChanged() ++ { ++ // Fire ItemEvent to indicated that previously selected item is now ++ // deselected ++ if (selectedItemReminder != null) ++ fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, ++ selectedItemReminder, ++ ItemEvent.DESELECTED)); ++ ++ // Fire ItemEvent to indicate that new item is selected ++ Object newSelection = getSelectedItem(); ++ fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, ++ newSelection, ItemEvent.SELECTED)); ++ ++ // Fire Action Event to JComboBox's registered listeners ++ fireActionEvent(); ++ ++ selectedItemReminder = newSelection; ++ } ++ ++ /** ++ * Returns Object array of size 1 containing currently selected element in ++ * the JComboBox. ++ * ++ * @return Object[] Object array of size 1 containing currently selected ++ * element in the JComboBox. ++ */ ++ public Object[] getSelectedObjects() ++ { ++ Object selectedObject = getSelectedItem(); ++ return new Object[] { selectedObject }; ++ } ++ ++ /** ++ * This method handles actionEvents fired by the ComboBoxEditor. It changes ++ * this JComboBox's selection to the new value currently in the editor and ++ * hides list of combo box items. ++ * ++ * @param e the ActionEvent ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ setSelectedItem(((ComboBoxEditor) e.getSource()).getItem()); ++ setPopupVisible(false); ++ } ++ ++ /** ++ * This method selects item in this combo box that matches specified ++ * specified keyChar and returns true if such item is found. Otherwise ++ * false is returned. ++ * ++ * @param keyChar character indicating which item in the combo box should be ++ * selected. ++ * ++ * @return boolean true if item corresponding to the specified keyChar ++ * exists in the combo box. Otherwise false is returned. ++ */ ++ public boolean selectWithKeyChar(char keyChar) ++ { ++ // FIXME: Need to implement ++ return false; ++ } ++ ++ /** ++ * The part of implementation of ListDataListener interface. This method is ++ * invoked when some items where added to the JComboBox's data model. ++ * ++ * @param event ListDataEvent describing the change ++ */ ++ public void intervalAdded(ListDataEvent event) ++ { ++ // FIXME: Need to implement ++ repaint(); ++ } ++ ++ /** ++ * The part of implementation of ListDataListener interface. This method is ++ * invoked when some items where removed from the JComboBox's data model. ++ * ++ * @param event ListDataEvent describing the change. ++ */ ++ public void intervalRemoved(ListDataEvent event) ++ { ++ // FIXME: Need to implement ++ repaint(); ++ } ++ ++ /** ++ * The part of implementation of ListDataListener interface. This method is ++ * invoked when contents of the JComboBox's data model changed. ++ * ++ * @param event ListDataEvent describing the change ++ */ ++ public void contentsChanged(ListDataEvent event) ++ { ++ // if first and last index of the given ListDataEvent are both -1, ++ // then it indicates that selected item in the combo box data model ++ // have changed. ++ if (event.getIndex0() == -1 && event.getIndex1() == -1) ++ selectedItemChanged(); ++ } ++ ++ /** ++ * This method disables or enables JComboBox. If the JComboBox is enabled, ++ * then user is able to make item choice, otherwise if JComboBox is ++ * disabled then user is not able to make a selection. ++ * ++ * @param enabled if 'enabled' is true then enable JComboBox and disable it ++ */ ++ public void setEnabled(boolean enabled) ++ { ++ boolean oldEnabled = super.isEnabled(); ++ if (enabled != oldEnabled) ++ { ++ super.setEnabled(enabled); ++ firePropertyChange(ENABLED_CHANGED_PROPERTY, oldEnabled, ++ (boolean) enabled); ++ } ++ } ++ ++ /** ++ * This method initializes specified ComboBoxEditor to display given item. ++ * ++ * @param anEditor ComboBoxEditor to initialize ++ * @param anItem Item that should displayed in the specified editor ++ */ ++ public void configureEditor(ComboBoxEditor anEditor, Object anItem) ++ { ++ anEditor.setItem(anItem); ++ } ++ ++ /** ++ * This method hides combo box's popup whenever TAB key is pressed. ++ * ++ * @param e The KeyEvent indicating which key was pressed. ++ */ ++ public void processKeyEvent(KeyEvent e) ++ { ++ } ++ ++ /** ++ * This method always returns false to indicate that JComboBox itself is ++ * not focus traversable. ++ * ++ * @return false to indicate that JComboBox itself is not focus traversable. ++ * ++ * @deprecated ++ */ ++ public boolean isFocusTraversable() ++ { ++ return false; ++ } ++ ++ /** ++ * setKeySelectionManager ++ * ++ * @param aManager ++ */ ++ public void setKeySelectionManager(KeySelectionManager aManager) ++ { ++ } ++ ++ /** ++ * getKeySelectionManager ++ * ++ * @return JComboBox.KeySelectionManager ++ */ ++ public KeySelectionManager getKeySelectionManager() ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns number of elements in this JComboBox ++ * ++ * @return int number of elements in this JComboBox ++ */ ++ public int getItemCount() ++ { ++ return ((DefaultComboBoxModel) dataModel).getSize(); ++ } ++ ++ /** ++ * Returns elements located in the combo box at the given index. ++ * ++ * @param index index specifying location of the component to return. ++ * ++ * @return component in the combo box that is located in the given index. ++ */ ++ public Object getItemAt(int index) ++ { ++ return ((MutableComboBoxModel) dataModel).getElementAt(index); ++ } ++ ++ /** ++ * createDefaultKeySelectionManager ++ * ++ * @return KeySelectionManager ++ */ ++ protected KeySelectionManager createDefaultKeySelectionManager() ++ { ++ return null; ++ } ++ ++ /** ++ * A string that describes this JComboBox. Normally only used for debugging. ++ * ++ * @return A string describing this JComboBox ++ */ ++ protected String paramString() ++ { ++ return "JComboBox"; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJComboBox(); ++ ++ return accessibleContext; ++ } ++ ++ /** ++ * This methods adds specified ActionListener to this JComboBox. ++ * ++ * @param listener to add ++ */ ++ public void addActionListener(ActionListener listener) ++ { ++ listenerList.add(ActionListener.class, listener); ++ } ++ ++ /** ++ * This method removes specified ActionListener from this JComboBox. ++ * ++ * @param listener ActionListener ++ */ ++ public void removeActionListener(ActionListener listener) ++ { ++ listenerList.remove(ActionListener.class, listener); ++ } ++ ++ /** ++ * This method returns array of ActionListeners that are registered with ++ * this JComboBox. ++ * ++ * @since 1.4 ++ */ ++ public ActionListener[] getActionListeners() ++ { ++ return (ActionListener[]) getListeners(ActionListener.class); ++ } ++ ++ /** ++ * This method registers given ItemListener with this JComboBox ++ * ++ * @param listener to remove ++ */ ++ public void addItemListener(ItemListener listener) ++ { ++ listenerList.add(ItemListener.class, listener); ++ } ++ ++ /** ++ * This method unregisters given ItemListener from this JComboBox ++ * ++ * @param listener to remove ++ */ ++ public void removeItemListener(ItemListener listener) ++ { ++ listenerList.remove(ItemListener.class, listener); ++ } ++ ++ /** ++ * This method returns array of ItemListeners that are registered with this ++ * JComboBox. ++ * ++ * @since 1.4 ++ */ ++ public ItemListener[] getItemListeners() ++ { ++ return (ItemListener[]) getListeners(ItemListener.class); ++ } ++ ++ /** ++ * Adds PopupMenuListener to combo box to listen to the events fired by the ++ * combo box's popup menu containing its list of items ++ * ++ * @param listener to add ++ */ ++ public void addPopupMenuListener(PopupMenuListener listener) ++ { ++ listenerList.add(PopupMenuListener.class, listener); ++ } ++ ++ /** ++ * Removes PopupMenuListener to combo box to listen to the events fired by ++ * the combo box's popup menu containing its list of items ++ * ++ * @param listener to add ++ */ ++ public void removePopupMenuListener(PopupMenuListener listener) ++ { ++ listenerList.remove(PopupMenuListener.class, listener); ++ } ++ ++ /** ++ * Returns array of PopupMenuListeners that are registered with combo box. ++ */ ++ public PopupMenuListener[] getPopupMenuListeners() ++ { ++ return (PopupMenuListener[]) getListeners(PopupMenuListener.class); ++ } ++ ++ /** ++ * AccessibleJComboBox ++ */ ++ protected class AccessibleJComboBox extends AccessibleJComponent ++ implements AccessibleAction, AccessibleSelection ++ { ++ private static final long serialVersionUID = 8217828307256675666L; ++ ++ protected AccessibleJComboBox() ++ { ++ } ++ ++ public int getAccessibleChildrenCount() ++ { ++ return 0; ++ } ++ ++ public Accessible getAccessibleChild(int value0) ++ { ++ return null; ++ } ++ ++ public AccessibleSelection getAccessibleSelection() ++ { ++ return null; ++ } ++ ++ public Accessible getAccessibleSelection(int value0) ++ { ++ return null; ++ } ++ ++ public boolean isAccessibleChildSelected(int value0) ++ { ++ return false; ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.COMBO_BOX; ++ } ++ ++ public AccessibleAction getAccessibleAction() ++ { ++ return null; ++ } ++ ++ public String getAccessibleActionDescription(int value0) ++ { ++ return null; ++ } ++ ++ public int getAccessibleActionCount() ++ { ++ return 0; ++ } ++ ++ public boolean doAccessibleAction(int value0) ++ { ++ return false; ++ } ++ ++ public int getAccessibleSelectionCount() ++ { ++ return 0; ++ } ++ ++ public void addAccessibleSelection(int value0) ++ { ++ } ++ ++ public void removeAccessibleSelection(int value0) ++ { ++ } ++ ++ public void clearAccessibleSelection() ++ { ++ } ++ ++ public void selectAllAccessibleSelection() ++ { ++ } ++ } ++} +Index: javax/swing/JComponent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JComponent.java,v +retrieving revision 1.4 +diff -u -r1.4 JComponent.java +--- javax/swing/JComponent.java 19 Jun 2003 16:30:09 -0000 1.4 ++++ javax/swing/JComponent.java 6 Sep 2004 16:35:55 -0000 +@@ -1,5 +1,5 @@ + /* JComponent.java -- Every component in swing inherits from this class. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.AWTEvent; +@@ -46,9 +45,11 @@ + import java.awt.FlowLayout; + import java.awt.Font; + import java.awt.Graphics; ++import java.awt.Image; + import java.awt.Insets; + import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.awt.event.ContainerEvent; + import java.awt.event.ContainerListener; +@@ -56,947 +57,2066 @@ + import java.awt.event.FocusListener; + import java.awt.event.KeyEvent; + import java.awt.event.MouseEvent; ++import java.awt.geom.Rectangle2D; ++import java.awt.image.ImageObserver; + import java.awt.peer.LightweightPeer; ++import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; + import java.beans.PropertyVetoException; + import java.beans.VetoableChangeListener; + import java.io.Serializable; +-import java.util.Vector; ++import java.util.EventListener; + import java.util.Hashtable; ++import java.util.Locale; ++import java.util.Vector; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; +-import javax.accessibility.AccessibleExtendedComponent; + import javax.accessibility.AccessibleRole; + import javax.accessibility.AccessibleStateSet; ++import javax.swing.border.Border; + import javax.swing.event.AncestorListener; + import javax.swing.event.EventListenerList; +-import javax.swing.border.Border; ++import javax.swing.event.SwingPropertyChangeSupport; + import javax.swing.plaf.ComponentUI; + ++ + /** + * Every component in swing inherits from this class (JLabel, JButton, etc). +- * It contains generic methods to manage events, properties and sizes. +- * Actual drawing of the component is channeled to a look-and-feel class +- * that is implemented elsewhere. ++ * It contains generic methods to manage events, properties and sizes. Actual ++ * drawing of the component is channeled to a look-and-feel class that is ++ * implemented elsewhere. + * +- * @author Ronald Veldema (rveldema@cs.vu.nl) ++ * @author Ronald Veldema (rveldema&064;cs.vu.nl) ++ * @author Graydon Hoare (graydon&064;redhat.com) + */ + public abstract class JComponent extends Container implements Serializable + { +- static final long serialVersionUID = -5242478962609715464L; +- /** +- * accessibleContext +- */ +- protected AccessibleContext accessibleContext; +- +- Dimension pref,min,max; +- Border border; +- JToolTip tooltip; +- String tool_tip_text; +- boolean use_double_buffer, opaque; +- protected ComponentUI ui; +- +- Vector ancestor_list; +- Vector veto_list; +- Vector change_list; +- Hashtable prop_hash; +- +- /** +- * AccessibleJComponent +- */ +- public abstract class AccessibleJComponent +- extends AccessibleAWTContainer { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleFocusHandler +- */ +- protected class AccessibleFocusHandler implements FocusListener { +- /** +- * Constructor AccessibleFocusHandler +- * @param component TODO +- */ +- protected AccessibleFocusHandler(AccessibleJComponent component) { +- // TODO +- } // AccessibleFocusHandler() +- +- /** +- * focusGained +- * @param event TODO +- */ +- public void focusGained(FocusEvent event) { +- // TODO +- } // focusGained() +- +- /** +- * focusLost +- * @param event TODO +- */ +- public void focusLost(FocusEvent valevent) { +- // TODO +- } // focusLost() +- } // AccessibleFocusHandler +- +- /** +- * AccessibleContainerHandler +- */ +- protected class AccessibleContainerHandler implements ContainerListener { +- /** +- * Constructor AccessibleContainerHandler +- * @param component TODO +- */ +- protected AccessibleContainerHandler(AccessibleJComponent component) { +- // TODO +- } // AccessibleContainerHandler() +- +- /** +- * componentAdded +- * @param event TODO +- */ +- public void componentAdded(ContainerEvent event) { +- // TODO +- } // componentAdded() +- +- /** +- * componentRemoved +- * @param event TODO +- */ +- public void componentRemoved(ContainerEvent valevent) { +- // TODO +- } // componentRemoved() +- } // AccessibleContainerHandler +- +- /** +- * accessibleContainerHandler +- */ +- protected ContainerListener accessibleContainerHandler; +- +- /** +- * accessibleFocusHandler +- */ +- protected FocusListener accessibleFocusHandler; +- +- /** +- * Constructor AccessibleJComponent +- * @param component TODO +- */ +- protected AccessibleJComponent(JComponent component) { +-// super((Container)component); +- // TODO +- } // AccessibleJComponent() +- +- /** +- * addPropertyChangeListener +- * @param listener TODO +- */ +- public void addPropertyChangeListener(PropertyChangeListener listener) { +- // TODO +- } // addPropertyChangeListener() +- +- /** +- * removePropertyChangeListener +- * @param listener TODO +- */ +- public void removePropertyChangeListener(PropertyChangeListener listener) { +- // TODO +- } // removePropertyChangeListener() +- +- /** +- * getAccessibleChildrenCount +- * @returns int +- */ +- public int getAccessibleChildrenCount() { +- return 0; // TODO +- } // getAccessibleChildrenCount() +- +- /** +- * getAccessibleChild +- * @param value0 TODO +- * @returns Accessible +- */ +- public Accessible getAccessibleChild(int value0) { +- return null; // TODO +- } // getAccessibleChild() +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleName +- * @returns String +- */ +- public String getAccessibleName() { +- return null; // TODO +- } // getAccessibleName() +- +- /** +- * getAccessibleDescription +- * @returns String +- */ +- public String getAccessibleDescription() { +- return null; // TODO +- } // getAccessibleDescription() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return null; // TODO +- } // getAccessibleRole() +- +- /** +- * getBorderTitle +- * @param value0 TODO +- * @returns String +- */ +- protected String getBorderTitle(Border value0) { +- return null; // TODO +- } // getBorderTitle() +- +- +- } // AccessibleJComponent +- +- +- public JComponent() +- { +- super(); +- super.setLayout(new FlowLayout()); ++ private static final long serialVersionUID = -7908749299918704233L; ++ ++ /** ++ * Accessibility support is currently missing. ++ */ ++ ++ protected AccessibleContext accessibleContext; ++ ++ public abstract class AccessibleJComponent ++ extends AccessibleAWTContainer ++ { ++ protected class AccessibleFocusHandler ++ implements FocusListener ++ { ++ protected AccessibleFocusHandler(){} ++ public void focusGained(FocusEvent event){} ++ public void focusLost(FocusEvent valevent){} ++ } ++ ++ protected class AccessibleContainerHandler ++ implements ContainerListener ++ { ++ protected AccessibleContainerHandler() {} ++ public void componentAdded(ContainerEvent event) {} ++ public void componentRemoved(ContainerEvent valevent) {} ++ } ++ ++ private static final long serialVersionUID = -7047089700479897799L; ++ ++ protected ContainerListener accessibleContainerHandler; ++ protected FocusListener accessibleFocusHandler; ++ ++ protected AccessibleJComponent() {} ++ public void addPropertyChangeListener(PropertyChangeListener listener) {} ++ public void removePropertyChangeListener(PropertyChangeListener listener) {} ++ public int getAccessibleChildrenCount() { return 0; } ++ public Accessible getAccessibleChild(int value0) { return null; } ++ public AccessibleStateSet getAccessibleStateSet() { return null; } ++ public String getAccessibleName() { return null; } ++ public String getAccessibleDescription() { return null; } ++ public AccessibleRole getAccessibleRole() { return null; } ++ protected String getBorderTitle(Border value0) { return null; } ++ } ++ ++ /** ++ * An explicit value for the component's preferred size; if not set by a ++ * user, this is calculated on the fly by delegating to the {@link ++ * ComponentUI.getPreferredSize} method on the {@link #ui} property. ++ */ ++ Dimension preferredSize; ++ ++ /** ++ * An explicit value for the component's minimum size; if not set by a ++ * user, this is calculated on the fly by delegating to the {@link ++ * ComponentUI.getMinimumSize} method on the {@link #ui} property. ++ */ ++ Dimension minimumSize; ++ ++ /** ++ * An explicit value for the component's maximum size; if not set by a ++ * user, this is calculated on the fly by delegating to the {@link ++ * ComponentUI.getMaximumSize} method on the {@link #ui} property. ++ */ ++ Dimension maximumSize; ++ ++ ++ /** ++ * A value between 0.0 and 1.0 indicating the preferred horizontal ++ * alignment of the component, relative to its siblings. The values ++ * {@link #LEFT_ALIGNMENT}, {@link #CENTER_ALIGNMENT}, and {@link ++ * #RIGHT_ALIGNMENT} can also be used, as synonyms for 0.0, ++ * 0.5, and 1.0, respectively. Not all layout ++ * managers use this property. ++ * ++ * @see #getAlignmentX ++ * @see #setAlignmentX ++ * @see javax.swing.OverlayLayout ++ * @see javax.swing.BoxLayout ++ */ ++ float alignmentX = 0.0f; ++ ++ /** ++ * A value between 0.0 and 1.0 indicating the preferred vertical ++ * alignment of the component, relative to its siblings. The values ++ * {@link #TOP_ALIGNMENT}, {@link #CENTER_ALIGNMENT}, and {@link ++ * #BOTTOM_ALIGNMENT} can also be used, as synonyms for 0.0, ++ * 0.5, and 1.0, respectively. Not all layout ++ * managers use this property. ++ * ++ * @see #getAlignmentY ++ * @see #setAlignmentY ++ * @see javax.swing.OverlayLayout ++ * @see javax.swing.BoxLayout ++ */ ++ float alignmentY = 0.0f; ++ ++ /** ++ * The border painted around this component. ++ * ++ * @see #paintBorder ++ */ ++ Border border; ++ ++ /** ++ * The text to show in the tooltip associated with this component. ++ * ++ * @see #setToolTipText ++ * @see #getToolTipText ++ */ ++ String toolTipText; ++ ++ /** ++ *

    Whether to double buffer this component when painting. This flag ++ * should generally be false, except for top level ++ * components such as {@link JFrame} or {@link JApplet}.

    ++ * ++ *

    All children of a double buffered component are painted into the ++ * double buffer automatically, so only the top widget in a window needs ++ * to be double buffered.

    ++ * ++ * @see #setDoubleBuffered ++ * @see #isDoubleBuffered ++ * @see #paintLock ++ * @see #paint ++ */ ++ boolean doubleBuffered = false; ++ ++ /** ++ * A set of flags indicating which debugging graphics facilities should ++ * be enabled on this component. The values should be a combination of ++ * {@link DebugGraphics.NONE_OPTION}, {@link DebugGraphics.LOG_OPTION}, ++ * {@link DebugGraphics.FLASH_OPTION}, or {@link ++ * DebugGraphics.BUFFERED_OPTION}. ++ * ++ * @see setDebugGraphicsOptions ++ * @see getDebugGraphicsOptions ++ * @see DebugGraphics ++ * @see getComponentGraphics ++ */ ++ int debugGraphicsOptions; ++ ++ /** ++ *

    This property controls two independent behaviors simultaneously.

    ++ * ++ *

    First, it controls whether to fill the background of this widget ++ * when painting its body. This affects calls to {@link ++ * JComponent#paintComponent}, which in turn calls {@link ++ * ComponentUI#update} on the component's {@link #ui} property. If the ++ * component is opaque during this call, the background will be filled ++ * before calling {@link ComponentUI#paint}. This happens merely as a ++ * convenience; you may fill the component's background yourself too, ++ * but there is no need to do so if you will be filling with the same ++ * color.

    ++ * ++ *

    Second, it the opaque property informs swing's repaint system ++ * whether it will be necessary to paint the components "underneath" this ++ * component, in Z-order. If the component is opaque, it is considered to ++ * completely occlude components "underneath" it, so they will not be ++ * repainted along with the opaque component.

    ++ * ++ *

    The default value for this property is false, but most ++ * components will want to set it to true when installing UI ++ * defaults in {@link ComponentUI#installUI}.

    ++ * ++ * @see #setOpaque ++ * @see #isOpaque ++ * @see #paintComponent ++ */ ++ boolean opaque = false; ++ ++ /** ++ * The user interface delegate for this component. Event delivery and ++ * repainting of the component are usually delegated to this object. ++ * ++ * @see #setUI ++ * @see #getUI ++ * @see #updateUI ++ */ ++ protected ComponentUI ui; ++ ++ /** ++ * A hint to the focus system that this component should or should not ++ * get focus. If this is false, swing will not try to ++ * request focus on this component; if true, swing might ++ * try to request focus, but the request might fail. Thus it is only ++ * a hint guiding swing's behavior. ++ * ++ * @see #requestFocus ++ * @see #isRequestFocusEnabled ++ * @see #setRequestFocusEnabled ++ */ ++ boolean requestFocusEnabled; ++ ++ /** ++ * Flag indicating behavior of this component when the mouse is dragged ++ * outside the component and the mouse stops moving. If ++ * true, synthetic mouse events will be delivered on regular ++ * timed intervals, continuing off in the direction the mouse exited the ++ * component, until the mouse is released or re-enters the component. ++ * ++ * @see setAutoscrolls ++ * @see getAutoscrolls ++ */ ++ boolean autoscrolls = false; ++ ++ /** ++ * Listeners for events other than {@link PropertyChangeEvent} are ++ * handled by this listener list. PropertyChangeEvents are handled in ++ * {@link #changeSupport}. ++ */ ++ protected EventListenerList listenerList = new EventListenerList(); ++ ++ /** ++ * Support for {@link PropertyChangeEvent} events. This is constructed ++ * lazily when the component gets its first {@link ++ * PropertyChangeListener} subscription; until then it's an empty slot. ++ */ ++ private SwingPropertyChangeSupport changeSupport; ++ ++ ++ /** ++ * Storage for "client properties", which are key/value pairs associated ++ * with this component by a "client", such as a user application or a ++ * layout manager. This is lazily constructed when the component gets its ++ * first client property. ++ */ ++ private Hashtable clientProperties; ++ ++ private InputMap inputMap_whenFocused; ++ private InputMap inputMap_whenAncestorOfFocused; ++ private InputMap inputMap_whenInFocusedWindow; ++ private ActionMap actionMap; ++ ++ /** ++ * A lock held during recursive painting; this is used to serialize ++ * access to the double buffer, and also to select the "top level" ++ * object which should acquire the double buffer in a given widget ++ * tree (which may have multiple double buffered children). ++ * ++ * @see #doubleBuffered ++ * @see #paint ++ */ ++ private static final Object paintLock = new Object(); ++ ++ ++ /** ++ * The default locale of the component. ++ * ++ * @see #getDefaultLocale ++ * @see #setDefaultLocale ++ */ ++ private static Locale defaultLocale; ++ ++ public static final String TOOL_TIP_TEXT_KEY = "ToolTipText"; ++ ++ /** ++ * Constant used to indicate that no condition has been assigned to a ++ * particular action. ++ * ++ * @see #registerKeyboardAction ++ */ ++ public static final int UNDEFINED_CONDITION = -1; ++ ++ /** ++ * Constant used to indicate that an action should be performed only when ++ * the component has focus. ++ * ++ * @see #registerKeyboardAction ++ */ ++ public static final int WHEN_FOCUSED = 0; ++ ++ /** ++ * Constant used to indicate that an action should be performed only when ++ * the component is an ancestor of the component which has focus. ++ * ++ * @see #registerKeyboardAction ++ */ ++ public static final int WHEN_ANCESTOR_OF_FOCUSED_COMPONENT = 1; ++ ++ /** ++ * Constant used to indicate that an action should be performed only when ++ * the component is in the window which has focus. ++ * ++ * @see #registerKeyboardAction ++ */ ++ public static final int WHEN_IN_FOCUSED_WINDOW = 2; ++ ++ ++ public JComponent() ++ { ++ super(); ++ super.setLayout(new FlowLayout()); ++ defaultLocale = Locale.getDefault(); ++ debugGraphicsOptions = DebugGraphics.NONE_OPTION; ++ } ++ ++ /** ++ * Helper to lazily construct and return the client properties table. ++ * ++ * @return The current client properties table ++ * ++ * @see #clientProperties ++ * @see #getClientProperty ++ * @see #putClientProperty ++ */ ++ private Hashtable getClientProperties() ++ { ++ if (clientProperties == null) ++ clientProperties = new Hashtable(); ++ return clientProperties; ++ } ++ ++ /** ++ * Get a client property associated with this component and a particular ++ * key. ++ * ++ * @param key The key with which to look up the client property ++ * ++ * @return A client property associated with this object and key ++ * ++ * @see #clientProperties ++ * @see #getClientProperties ++ * @see #putClientProperty ++ */ ++ public Object getClientProperty(Object key) ++ { ++ return getClientProperties().get(key); ++ } ++ ++ /** ++ * Add a client property value to this component, associated ++ * with key. If there is an existing client property ++ * associated with key, it will be replaced. ++ * ++ * @param key The key of the client property association to add ++ * @param value The value of the client property association to add ++ * ++ * @see #clientProperties ++ * @see #getClientProperties ++ * @see #getClientProperty ++ */ ++ public void putClientProperty(Object key, Object value) ++ { ++ getClientProperties().put(key, value); ++ } ++ ++ /** ++ * Unregister an AncestorListener. ++ * ++ * @param listener The listener to unregister ++ * ++ * @see addAncestorListener ++ */ ++ public void removeAncestorListener(AncestorListener listener) ++ { ++ listenerList.remove(AncestorListener.class, listener); ++ } ++ ++ /** ++ * Unregister a PropertyChangeListener. ++ * ++ * @param listener The listener to register ++ * ++ * @see #addPropertyChangeListener ++ * @see #changeSupport ++ */ ++ public void removePropertyChangeListener(PropertyChangeListener listener) ++ { ++ if (changeSupport != null) ++ changeSupport.removePropertyChangeListener(listener); ++ } ++ ++ /** ++ * Unregister a PropertyChangeListener. ++ * ++ * @param propertyName The property name to unregister the listener from ++ * @param listener The listener to unregister ++ * ++ * @see #addPropertyChangeListener ++ * @see #changeSupport ++ */ ++ public void removePropertyChangeListener(String propertyName, ++ PropertyChangeListener listener) ++ { ++ if (changeSupport != null) ++ changeSupport.removePropertyChangeListener(propertyName, listener); ++ } ++ ++ /** ++ * Unregister a VetoableChangeChangeListener. ++ * ++ * @param listener The listener to unregister ++ * ++ * @see #addVetoableChangeListener ++ */ ++ public void removeVetoableChangeListener(VetoableChangeListener listener) ++ { ++ listenerList.remove(VetoableChangeListener.class, listener); ++ } ++ ++ /** ++ * Register an AncestorListener. ++ * ++ * @param listener The listener to register ++ * ++ * @see #removeVetoableChangeListener ++ */ ++ public void addAncestorListener(AncestorListener listener) ++ { ++ listenerList.add(AncestorListener.class, listener); ++ } ++ ++ /** ++ * Register a PropertyChangeListener. This listener will ++ * receive any PropertyChangeEvent, regardless of property name. To ++ * listen to a specific property name, use {@link ++ * #addPropertyChangeListener(String,PropertyChangeListener)} instead. ++ * ++ * @param listener The listener to register ++ * ++ * @see #removePropertyChangeListener ++ * @see #changeSupport ++ */ ++ public void addPropertyChangeListener(PropertyChangeListener listener) ++ { ++ if (changeSupport == null) ++ changeSupport = new SwingPropertyChangeSupport(this); ++ changeSupport.addPropertyChangeListener(listener); ++ } ++ ++ /** ++ * Register a PropertyChangeListener for a specific, named ++ * property. To listen to all property changes, regardless of name, use ++ * {@link #addPropertyChangeListener(PropertyChangeListener)} instead. ++ * ++ * @param propertyName The property name to listen to ++ * @param listener The listener to register ++ * ++ * @see #removePropertyChangeListener ++ * @see #changeSupport ++ */ ++ public void addPropertyChangeListener(String propertyName, ++ PropertyChangeListener listener) ++ { ++ listenerList.add(PropertyChangeListener.class, listener); ++ } ++ ++ /** ++ * Register a VetoableChangeListener. ++ * ++ * @param listener The listener to register ++ * ++ * @see #removeVetoableChangeListener ++ * @see #listenerList ++ */ ++ public void addVetoableChangeListener(VetoableChangeListener listener) ++ { ++ listenerList.add(VetoableChangeListener.class, listener); ++ } ++ ++ /** ++ * Return all registered listeners of a particular type. ++ * ++ * @param listenerType The type of listener to return ++ * ++ * @return All listeners in the {@link #listenerList} which ++ * are of the specified type ++ * ++ * @see #listenerList ++ */ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ /** ++ * Return all registered AncestorListener objects. ++ * ++ * @return The set of AncestorListener objects in {@link ++ * #listenerList} ++ */ ++ public AncestorListener[] getAncestorListeners() ++ { ++ return (AncestorListener[]) getListeners(AncestorListener.class); ++ } ++ ++ /** ++ * Return all registered VetoableChangeListener objects. ++ * ++ * @return The set of VetoableChangeListener objects in {@link ++ * #listenerList} ++ */ ++ public VetoableChangeListener[] getVetoableChangeListeners() ++ { ++ return (VetoableChangeListener[]) getListeners(VetoableChangeListener.class); ++ } ++ ++ /** ++ * Return all PropertyChangeListener objects registered to listen ++ * for a particular property. ++ * ++ * @param property The property to return the listeners of ++ * ++ * @return The set of PropertyChangeListener objects in ++ * {@link #changeSupport} registered to listen on the specified propert ++ */ ++ public PropertyChangeListener[] getPropertyChangeListeners(String property) ++ { ++ return changeSupport == null ? new PropertyChangeListener[0] ++ : changeSupport.getPropertyChangeListeners(property); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with boolean values. ++ */ ++ public void firePropertyChange(String propertyName, boolean oldValue, ++ boolean newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Boolean(oldValue), ++ new Boolean(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with byte values. ++ */ ++ public void firePropertyChange(String propertyName, byte oldValue, ++ byte newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Byte(oldValue), ++ new Byte(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with char values. ++ */ ++ public void firePropertyChange(String propertyName, char oldValue, ++ char newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Character(oldValue), ++ new Character(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with double values. ++ */ ++ public void firePropertyChange(String propertyName, double oldValue, ++ double newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Double(oldValue), ++ new Double(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with float values. ++ */ ++ public void firePropertyChange(String propertyName, float oldValue, ++ float newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Float(oldValue), ++ new Float(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with int values. ++ */ ++ public void firePropertyChange(String propertyName, int oldValue, ++ int newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Integer(oldValue), ++ new Integer(newValue)); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with long values. ++ */ ++ public void firePropertyChange(String propertyName, long oldValue, ++ long newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Long(oldValue), ++ new Long(newValue)); ++ } ++ ++ /** ++ * Call {@link PropertyChangeListener#propertyChange} on all listeners ++ * registered to listen to a given property. Any method which changes ++ * the specified property of this component should call this method. ++ * ++ * @param propertyName The property which changed ++ * @param oldValue The old value of the property ++ * @param newValue The new value of the property ++ * ++ * @see #changeSupport ++ * @see #addPropertyChangeListener ++ * @see #removePropertyChangeListener ++ */ ++ protected void firePropertyChange(String propertyName, Object oldValue, ++ Object newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, oldValue, newValue); ++ } ++ ++ /** ++ * A variant of {@link #firePropertyChange(String,Object,Object)} ++ * for properties with short values. ++ */ ++ public void firePropertyChange(String propertyName, short oldValue, ++ short newValue) ++ { ++ if (changeSupport != null) ++ changeSupport.firePropertyChange(propertyName, new Short(oldValue), ++ new Short(newValue)); ++ } ++ ++ /** ++ * Call {@link VetoableChangeListener#vetoableChange} on all listeners ++ * registered to listen to a given property. Any method which changes ++ * the specified property of this component should call this method. ++ * ++ * @param propertyName The property which changed ++ * @param oldValue The old value of the property ++ * @param newValue The new value of the property ++ * ++ * @throws PropertyVetoException if the change was vetoed by a listener ++ * ++ * @see addVetoableChangeListener ++ * @see removeVetoableChangeListener ++ */ ++ protected void fireVetoableChange(String propertyName, Object oldValue, ++ Object newValue) ++ throws PropertyVetoException ++ { ++ VetoableChangeListener[] listeners = getVetoableChangeListeners(); ++ ++ PropertyChangeEvent evt = new PropertyChangeEvent(this, propertyName, oldValue, newValue); ++ ++ for (int i = 0; i < listeners.length; i++) ++ listeners[i].vetoableChange(evt); ++ } ++ ++ /** ++ * Get the value of the accessibleContext property for this component. ++ * ++ * @return the current value of the property ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ ++ /** ++ * Get the value of the {@link #alignmentX} property. ++ * ++ * @return The current value of the property. ++ * ++ * @see #setAlignmentX ++ * @see #alignmentY ++ */ ++ public float getAlignmentX() ++ { ++ return alignmentX; ++ } ++ ++ /** ++ * Get the value of the {@link #alignmentY} property. ++ * ++ * @return The current value of the property. ++ * ++ * @see #setAlignmentY ++ * @see #alignmentX ++ */ ++ public float getAlignmentY() ++ { ++ return alignmentY; ++ } ++ ++ /** ++ * Get the current value of the {@link #autoscrolls} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getAutoscrolls() ++ { ++ return autoscrolls; ++ } ++ ++ /** ++ * Set the value of the {@link #border} property, revalidate ++ * and repaint this component. ++ * ++ * @param border The new value of the property ++ * ++ * @see #getBorder ++ */ ++ public void setBorder(Border border) ++ { ++ this.border = border; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Get the value of the {@link #border} property. ++ * ++ * @return The property's current value ++ * ++ * @see #setBorder ++ */ ++ public Border getBorder() ++ { ++ return border; ++ } ++ ++ /** ++ * Get the component's current bounding box. If a rectangle is provided, ++ * use this as the return value (adjusting its fields in place); ++ * otherwise (of null is provided) return a new {@link ++ * Rectangle}. ++ * ++ * @param rv Optional return value to use ++ * ++ * @return A rectangle bounding the component ++ */ ++ public Rectangle getBounds(Rectangle rv) ++ { ++ if (rv == null) ++ return new Rectangle(getX(), getY(), getWidth(), getHeight()); ++ else ++ { ++ rv.setBounds(getX(), getY(), getWidth(), getHeight()); ++ return rv; ++ } ++ } ++ ++ /** ++ * Prepares a graphics context for painting this object. If {@link ++ * #debugGraphicsOptions} is not equal to {@link ++ * DebugGraphics#NONE_OPTION}, produce a new {@link DebugGraphics} object ++ * wrapping the parameter. Otherwise configure the parameter with this ++ * component's foreground color and font. ++ * ++ * @param g The graphics context to wrap or configure ++ * ++ * @return A graphics context to paint this object with ++ * ++ * @see #debugGraphicsOptions ++ * @see #paint ++ */ ++ protected Graphics getComponentGraphics(Graphics g) ++ { ++ g.setFont(this.getFont()); ++ g.setColor(this.getForeground()); ++ return g; ++ } ++ ++ ++ /** ++ * Get the value of the {@link #debugGraphicsOptions} property. ++ * ++ * @return The current value of the property. ++ * ++ * @see #setDebugGraphicsOptions ++ * @see #debugGraphicsOptions ++ */ ++ public int getDebugGraphicsOptions() ++ { ++ return 0; ++ } ++ ++ /** ++ * Get the component's insets, which are calculated from ++ * the {@link #border} property. If the border is null, ++ * calls {@link Container#getInsets}. ++ * ++ * @return The component's current insets ++ */ ++ public Insets getInsets() ++ { ++ if (border == null) ++ return super.getInsets(); ++ return getBorder().getBorderInsets(this); ++ } ++ ++ /** ++ * Get the component's insets, which are calculated from the {@link ++ * #border} property. If the border is null, calls {@link ++ * Container#getInsets}. The passed-in {@link Insets} value will be ++ * used as the return value, if possible. ++ * ++ * @param insets Return value object to reuse, if possible ++ * ++ * @return The component's current insets ++ */ ++ public Insets getInsets(Insets insets) ++ { ++ Insets t = getInsets(); ++ ++ if (insets == null) ++ return t; ++ ++ insets.left = t.left; ++ insets.right = t.right; ++ insets.top = t.top; ++ insets.bottom = t.bottom; ++ return insets; ++ } ++ ++ /** ++ * Get the component's location. The passed-in {@link Point} value ++ * will be used as the return value, if possible. ++ * ++ * @param rv Return value object to reuse, if possible ++ * ++ * @return The component's current location ++ */ ++ public Point getLocation(Point rv) ++ { ++ if (rv == null) ++ return new Point(getX(), getY()); ++ ++ rv.setLocation(getX(), getY()); ++ return rv; ++ } ++ ++ /** ++ * Get the component's maximum size. If the {@link #maximumSize} property ++ * has been explicitly set, it is returned. If the {@link #maximumSize} ++ * property has not been set but the {@link ui} property has been, the ++ * result of {@link ComponentUI#getMaximumSize} is returned. If neither ++ * property has been set, the result of {@link Container#getMaximumSize} ++ * is returned. ++ * ++ * @return The maximum size of the component ++ * ++ * @see #maximumSize ++ * @see #setMaximumSize ++ */ ++ public Dimension getMaximumSize() ++ { ++ if (maximumSize != null) ++ return maximumSize; ++ ++ if (ui != null) ++ { ++ Dimension s = ui.getMaximumSize(this); ++ if (s != null) ++ return s; ++ } ++ ++ Dimension p = super.getMaximumSize(); ++ return p; ++ } ++ ++ /** ++ * Get the component's minimum size. If the {@link #minimumSize} property ++ * has been explicitly set, it is returned. If the {@link #minimumSize} ++ * property has not been set but the {@link ui} property has been, the ++ * result of {@link ComponentUI#getMinimumSize} is returned. If neither ++ * property has been set, the result of {@link Container#getMinimumSize} ++ * is returned. ++ * ++ * @return The minimum size of the component ++ * ++ * @see #minimumSize ++ * @see #setMinimumSize ++ */ ++ public Dimension getMinimumSize() ++ { ++ if (minimumSize != null) ++ return minimumSize; ++ ++ if (ui != null) ++ { ++ Dimension s = ui.getMinimumSize(this); ++ if (s != null) ++ return s; ++ } ++ ++ Dimension p = super.getMinimumSize(); ++ return p; ++ } ++ ++ /** ++ * Get the component's preferred size. If the {@link #preferredSize} ++ * property has been explicitly set, it is returned. If the {@link ++ * #preferredSize} property has not been set but the {@link ui} property ++ * has been, the result of {@link ComponentUI#getPreferredSize} is ++ * returned. If neither property has been set, the result of {@link ++ * Container#getPreferredSize} is returned. ++ * ++ * @return The preferred size of the component ++ * ++ * @see #preferredSize ++ * @see #setPreferredSize ++ */ ++ public Dimension getPreferredSize() ++ { ++ if (preferredSize != null) ++ return preferredSize; ++ ++ if (ui != null) ++ { ++ Dimension s = ui.getPreferredSize(this); ++ if (s != null) ++ return s; ++ } ++ Dimension p = super.getPreferredSize(); ++ return p; ++ } ++ ++ /** ++ * Return the value of the {@link #nextFocusableComponent} property. ++ * ++ * @deprecated See {@link java.awt.FocusTraversalPolicy} ++ * ++ * @return The current value of the property, or null ++ * if none has been set. ++ */ ++ public Component getNextFocusableComponent() ++ { ++ return null; ++ } ++ ++ /** ++ * Return the set of {@link KeyStroke} objects which are registered ++ * to initiate actions on this component. ++ * ++ * @return An array of the registered keystrokes ++ */ ++ public KeyStroke[] getRegisteredKeyStrokes() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns the first ancestor of this component which is a {@link JRootPane}. ++ * Equivalent to calling SwingUtilities.getRootPane(this);. ++ * ++ * @return An ancestral JRootPane, or null if none exists. ++ */ ++ public JRootPane getRootPane() ++ { ++ JRootPane p = SwingUtilities.getRootPane(this); ++ return p; ++ } ++ ++ /** ++ * Get the component's size. The passed-in {@link Dimension} value ++ * will be used as the return value, if possible. ++ * ++ * @param rv Return value object to reuse, if possible ++ * ++ * @return The component's current size ++ */ ++ public Dimension getSize(Dimension rv) ++ { ++ if (rv == null) ++ return new Dimension(getWidth(), getHeight()); ++ else ++ { ++ rv.setSize(getWidth(), getHeight()); ++ return rv; ++ } ++ } ++ ++ /** ++ * Return the {@link #toolTip} property of this component, creating it and ++ * setting it if it is currently null. This method can be ++ * overridden in subclasses which wish to control the exact form of ++ * tooltip created. ++ * ++ * @return The current toolTip ++ */ ++ public JToolTip createToolTip() ++ { ++ JToolTip toolTip = new JToolTip(); ++ toolTip.setComponent(this); ++ toolTip.setTipText(toolTipText); ++ ++ return toolTip; ++ } ++ ++ /** ++ * Return the location at which the {@link #toolTip} property should be ++ * displayed, when triggered by a particular mouse event. ++ * ++ * @param event The event the tooltip is being presented in response to ++ * ++ * @return The point at which to display a tooltip, or null ++ * if swing is to choose a default location. ++ */ ++ public Point getToolTipLocation(MouseEvent event) ++ { ++ return null; ++ } ++ ++ /** ++ * Set the value of the {@link #toolTipText} property. ++ * ++ * @param text The new property value ++ * ++ * @see #getToolTipText ++ */ ++ public void setToolTipText(String text) ++ { ++ if (text == null) ++ { ++ ToolTipManager.sharedInstance().unregisterComponent(this); ++ toolTipText = null; ++ return; ++ } + +- //eventMask |= AWTEvent.COMP_KEY_EVENT_MASK; +- enableEvents( AWTEvent.KEY_EVENT_MASK ); ++ // XXX: The tip text doesn't get updated unless you set it to null ++ // and then to something not-null. This is consistent with the behaviour ++ // of Sun's ToolTipManager. ++ ++ String oldText = toolTipText; ++ toolTipText = text; ++ ++ if (oldText == null) ++ ToolTipManager.sharedInstance().registerComponent(this); ++ } ++ ++ /** ++ * Get the value of the {@link #toolTipText} property. ++ * ++ * @return The current property value ++ * ++ * @see #setToolTipText ++ */ ++ public String getToolTipText() ++ { ++ return toolTipText; ++ } ++ ++ /** ++ * Get the value of the {@link #toolTipText} property, in response to a ++ * particular mouse event. ++ * ++ * @param event The mouse event which triggered the tooltip ++ * ++ * @return The current property value ++ * ++ * @see #setToolTipText ++ */ ++ public String getToolTipText(MouseEvent event) ++ { ++ return getToolTipText(); ++ } ++ ++ /** ++ * Return the top level ancestral container (usually a {@link ++ * java.awt.Window} or {@link java.awt.Applet}) which this component is ++ * contained within, or null if no ancestors exist. ++ * ++ * @return The top level container, if it exists ++ */ ++ public Container getTopLevelAncestor() ++ { ++ Container c = getParent(); ++ for (Container peek = c; peek != null; peek = peek.getParent()) ++ c = peek; ++ return c; ++ } ++ ++ /** ++ * Compute the component's visible rectangle, which is defined ++ * recursively as either the component's bounds, if it has no parent, or ++ * the intersection of the component's bounds with the visible rectangle ++ * of its parent. ++ * ++ * @param rect The return value slot to place the visible rectangle in ++ */ ++ public void computeVisibleRect(Rectangle rect) ++ { ++ Component c = getParent(); ++ if (c != null && c instanceof JComponent) ++ { ++ ((JComponent) c).computeVisibleRect(rect); ++ rect.translate(-getX(), -getY()); ++ Rectangle2D.intersect(rect, ++ new Rectangle(0, 0, getWidth(), getHeight()), ++ rect); ++ } ++ else ++ rect.setRect(0, 0, getWidth(), getHeight()); ++ } ++ ++ /** ++ * Return the component's visible rectangle in a new {@link Rectangle}, ++ * rather than via a return slot. ++ * ++ * @return The component's visible rectangle ++ * ++ * @see #computeVisibleRect(Rectangle) ++ */ ++ public Rectangle getVisibleRect() ++ { ++ Rectangle r = new Rectangle(); ++ computeVisibleRect(r); ++ return r; ++ } ++ ++ /** ++ *

    Requests that this component receive input focus, giving window ++ * focus to the top level ancestor of this component. Only works on ++ * displayable, focusable, visible components.

    ++ * ++ *

    This method should not be called by clients; it is intended for ++ * focus implementations. Use {@link Component#requestFocus} instead.

    ++ * ++ * @see {@link Component#requestFocus} ++ */ ++ public void grabFocus() ++ { ++ } ++ ++ /** ++ * Get the value of the {@link #doubleBuffered} property. ++ * ++ * @return The property's current value ++ */ ++ public boolean isDoubleBuffered() ++ { ++ return doubleBuffered; ++ } ++ ++ /** ++ * Return true if the provided component has no native peer; ++ * in other words, if it is a "lightweight component". ++ * ++ * @param c The component to test for lightweight-ness ++ * ++ * @return Whether or not the component is lightweight ++ */ ++ public static boolean isLightweightComponent(Component c) ++ { ++ return c.getPeer() instanceof LightweightPeer; ++ } ++ ++ /** ++ * Return true if you wish this component to manage its own ++ * focus. In particular: if you want this component to be sent ++ * TAB and SHIFT+TAB key events, and to not ++ * have its children considered as focus transfer targets. If ++ * true, focus traversal around this component changes to ++ * CTRL+TAB and CTRL+SHIFT+TAB. ++ * ++ * @return true if you want this component to manage its own ++ * focus, otherwise (by default) false ++ * ++ * @deprecated Use {@link Component.setFocusTraversalKeys(int,Set)} and ++ * {@link Container.setFocusCycleRoot(boolean)} instead ++ */ ++ public boolean isManagingFocus() ++ { ++ return false; ++ } ++ ++ /** ++ * Return the current value of the {@link opaque} property. ++ * ++ * @return The current property value ++ */ ++ public boolean isOpaque() ++ { ++ return opaque; ++ } ++ ++ /** ++ * Return true if the component can guarantee that none of its ++ * children will overlap in Z-order. This is a hint to the painting system. ++ * The default is to return true, but some components such as ++ * {@link JLayeredPane} should override this to return false. ++ * ++ * @return Whether the component tiles its children ++ */ ++ public boolean isOptimizedDrawingEnabled() ++ { ++ return true; ++ } ++ ++ /** ++ * Return true if this component is currently painting a tile. ++ * ++ * @return Whether the component is painting a tile ++ */ ++ public boolean isPaintingTile() ++ { ++ return false; ++ } ++ ++ /** ++ * Get the value of the {@link #requestFocusEnabled} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean isRequestFocusEnabled() ++ { ++ return requestFocusEnabled; ++ } ++ ++ /** ++ * Return true if this component is a validation root; this ++ * will cause calls to {@link #invalidate} in this component's children ++ * to be "captured" at this component, and not propagate to its parents. ++ * For most components this should return false, but some ++ * components such as {@link JViewPort} will want to return ++ * true. ++ * ++ * @return Whether this component is a validation root ++ */ ++ public boolean isValidateRoot() ++ { ++ return false; ++ } ++ ++ /** ++ *

    Paint the component. This is a delicate process, and should only be ++ * called from the repaint thread, under control of the {@link ++ * RepaintManager}. Client code should usually call {@link #repaint} to ++ * trigger painting.

    ++ * ++ *

    This method will acquire a double buffer from the {@link ++ * RepaintManager} if the component's {@link #doubleBuffered} property is ++ * true and the paint call is the ++ * first recursive paint call inside swing.

    ++ * ++ *

    The method will also modify the provided {@link Graphics} context ++ * via the {@link #getComponentGraphics} method. If you want to customize ++ * the graphics object used for painting, you should override that method ++ * rather than paint.

    ++ * ++ *

    The body of the paint call involves calling {@link ++ * #paintComponent}, {@link #paintBorder}, and {@link #paintChildren} in ++ * order. If you want to customize painting behavior, you should override ++ * one of these methods rather than paint.

    ++ * ++ *

    For more details on the painting sequence, see this ++ * article.

    ++ * ++ * @param g The graphics context to paint with ++ * ++ * @see #paintImmediately ++ */ ++ public void paint(Graphics g) ++ { ++ Graphics g2 = g; ++ Image doubleBuffer = null; ++ RepaintManager rm = RepaintManager.currentManager(this); ++ ++ if (isDoubleBuffered() ++ && (rm.isDoubleBufferingEnabled()) ++ && (! Thread.holdsLock(paintLock))) ++ { ++ doubleBuffer = rm.getOffscreenBuffer(this, getWidth(), getHeight()); ++ } ++ ++ synchronized (paintLock) ++ { ++ if (doubleBuffer != null) ++ { ++ g2 = doubleBuffer.getGraphics(); ++ g2.setClip(g.getClipBounds()); ++ } ++ ++ g2 = getComponentGraphics(g2); ++ paintComponent(g2); ++ paintBorder(g2); ++ paintChildren(g2); ++ ++ if (doubleBuffer != null) ++ g.drawImage(doubleBuffer, 0, 0, (ImageObserver) null); ++ } ++ } ++ ++ /** ++ * Paint the component's border. This usually means calling {@link ++ * Border#paintBorder} on the {@link #border} property, if it is ++ * non-null. You may override this if you wish to customize ++ * border painting behavior. The border is painted after the component's ++ * body, but before the component's children. ++ * ++ * @param g The graphics context with which to paint the border ++ * ++ * @see #paint ++ * @see #paintChildren ++ * @see #paintComponent ++ */ ++ protected void paintBorder(Graphics g) ++ { ++ if (getBorder() != null) ++ getBorder().paintBorder(this, g, 0, 0, getWidth(), getHeight()); ++ } ++ ++ /** ++ * Paint the component's children. This usually means calling {@link ++ * Container#paint}, which recursively calls {@link #paint} on any of the ++ * component's children, with appropriate changes to coordinate space and ++ * clipping region. You may override this if you wish to customize ++ * children painting behavior. The children are painted after the ++ * component's body and border. ++ * ++ * @param g The graphics context with which to paint the children ++ * ++ * @see #paint ++ * @see #paintBorder ++ * @see #paintComponent ++ */ ++ protected void paintChildren(Graphics g) ++ { ++ super.paint(g); ++ } ++ ++ /** ++ * Paint the component's body. This usually means calling {@link ++ * ComponentUI#update} on the {@link #ui} property of the component, if ++ * it is non-null. You may override this if you wish to ++ * customize the component's body-painting behavior. The component's body ++ * is painted first, before the border and children. ++ * ++ * @param g The graphics context with which to paint the body ++ * ++ * @see #paint ++ * @see #paintBorder ++ * @see #paintChildren ++ */ ++ protected void paintComponent(Graphics g) ++ { ++ if (ui != null) ++ ui.update(g, this); ++ } ++ ++ /** ++ * A variant of {@link #paintImmediately(Rectangle)} which takes ++ * integer parameters. ++ * ++ * @param x The left x coordinate of the dirty region ++ * @param y The top y coordinate of the dirty region ++ * @param w The width of the dirty region ++ * @param h The height of the dirty region ++ */ ++ public void paintImmediately(int x, int y, int w, int h) ++ { ++ paintImmediately(new Rectangle(x, y, w, h)); ++ } ++ ++ /** ++ * Transform the provided dirty rectangle for this component into the ++ * appropriate ancestral {@link JRootPane} and call {@link #paint} on ++ * that root pane. This method is called from the {@link RepaintManager} ++ * and should always be called within the painting thread. ++ * ++ * @param r The dirty rectangle to paint ++ */ ++ public void paintImmediately(Rectangle r) ++ { ++ Component root = SwingUtilities.getRoot(this); ++ if (root == null || ! root.isShowing()) ++ return; ++ Graphics g = root.getGraphics(); ++ if (g == null) ++ return; ++ ++ Rectangle clip = SwingUtilities.convertRectangle(this, r, root); ++ g.setClip(clip); ++ root.paint(g); ++ g.dispose(); ++ } ++ ++ /** ++ * Return a string representation for this component, for use in ++ * debugging. ++ * ++ * @return A string describing this component. ++ */ ++ protected String paramString() ++ { ++ return "JComponent"; ++ } ++ ++ /** ++ * A variant of {@link ++ * #registerKeyboardAction(ActionListener,String,KeyStroke,int)} which ++ * provides null for the command name. ++ */ ++ public void registerKeyboardAction(ActionListener act, ++ KeyStroke stroke, ++ int cond) ++ { ++ registerKeyboardAction(act, null, stroke, cond); ++ } ++ ++ /* ++ * There is some charmingly undocumented behavior sun seems to be using ++ * to simulate the old register/unregister keyboard binding API. It's not ++ * clear to me why this matters, but we shall endeavour to follow suit. ++ * ++ * Two main thing seem to be happening when you do registerKeyboardAction(): ++ * ++ * - no actionMap() entry gets created, just an entry in inputMap() ++ * ++ * - the inputMap() entry is a proxy class which invokes the the ++ * binding's actionListener as a target, and which clobbers the command ++ * name sent in the ActionEvent, providing the binding command name ++ * instead. ++ * ++ * This much you can work out just by asking the input and action maps ++ * what they contain after making bindings, and watching the event which ++ * gets delivered to the recipient. Beyond that, it seems to be a ++ * sun-private solution so I will only immitate it as much as it matters ++ * to external observers. ++ */ ++ ++ private static class ActionListenerProxy ++ extends AbstractAction ++ { ++ ActionListener target; ++ String bindingCommandName; ++ ++ public ActionListenerProxy(ActionListener li, ++ String cmd) ++ { ++ target = li; ++ bindingCommandName = cmd; ++ } ++ ++ public void actionPerformed(ActionEvent e) ++ { ++ ActionEvent derivedEvent = new ActionEvent(e.getSource(), ++ e.getID(), ++ bindingCommandName, ++ e.getModifiers()); ++ target.actionPerformed(derivedEvent); ++ } ++ } ++ ++ ++ /** ++ * An obsolete method to register a keyboard action on this component. ++ * You should use getInputMap and getActionMap ++ * to fetch mapping tables from keystrokes to commands, and commands to ++ * actions, respectively, and modify those mappings directly. ++ * ++ * @param anAction The action to be registered ++ * @param aCommand The command to deliver in the delivered {@link ++ * java.awt.ActionEvent} ++ * @param aKeyStroke The keystroke to register on ++ * @param aCondition One of the values {@link #UNDEFINED_CONDITION}, ++ * {@link #WHEN_ANCESTOR_OF_FOCUSED_COMPONENT}, {@link #WHEN_FOCUSED}, or ++ * {@link #WHEN_IN_FOCUSED_WINDOW}, indicating the condition which must ++ * be met for the action to be fired ++ * ++ * @see #unregisterKeyboardAction ++ * @see #getConditionForKeystroke ++ * @see #resetKeyboardActiond ++ */ ++ public void registerKeyboardAction(ActionListener act, ++ String cmd, ++ KeyStroke stroke, ++ int cond) ++ { ++ getInputMap(cond).put(stroke, new ActionListenerProxy(act, cmd)); ++ } ++ ++ ++ ++ public final void setInputMap(int condition, InputMap map) ++ { ++ enableEvents(AWTEvent.KEY_EVENT_MASK); ++ switch (condition) ++ { ++ case WHEN_FOCUSED: ++ inputMap_whenFocused = map; ++ break; ++ ++ case WHEN_ANCESTOR_OF_FOCUSED_COMPONENT: ++ inputMap_whenAncestorOfFocused = map; ++ break; ++ ++ case WHEN_IN_FOCUSED_WINDOW: ++ inputMap_whenInFocusedWindow = map; ++ break; ++ ++ case UNDEFINED_CONDITION: ++ default: ++ throw new IllegalArgumentException(); ++ } ++ } ++ ++ public final InputMap getInputMap(int condition) ++ { ++ enableEvents(AWTEvent.KEY_EVENT_MASK); ++ switch (condition) ++ { ++ case WHEN_FOCUSED: ++ if (inputMap_whenFocused == null) ++ inputMap_whenFocused = new InputMap(); ++ return inputMap_whenFocused; ++ ++ case WHEN_ANCESTOR_OF_FOCUSED_COMPONENT: ++ if (inputMap_whenAncestorOfFocused == null) ++ inputMap_whenAncestorOfFocused = new InputMap(); ++ return inputMap_whenAncestorOfFocused; ++ ++ case WHEN_IN_FOCUSED_WINDOW: ++ if (inputMap_whenInFocusedWindow == null) ++ inputMap_whenInFocusedWindow = new InputMap(); ++ return inputMap_whenInFocusedWindow; ++ ++ case UNDEFINED_CONDITION: ++ default: ++ return null; ++ } ++ } ++ ++ public final InputMap getInputMap() ++ { ++ return getInputMap(WHEN_FOCUSED); ++ } ++ ++ public final ActionMap getActionMap() ++ { ++ if (actionMap == null) ++ actionMap = new ActionMap(); ++ return actionMap; ++ } ++ ++ public final void setActionMap(ActionMap map) ++ { ++ actionMap = map; ++ } ++ ++ /** ++ * @deprecated As of 1.3 KeyStrokes can be registered with multiple ++ * simultaneous conditions. ++ * ++ * Return the condition that determines whether a registered action ++ * occurs in response to the specified keystroke. ++ * ++ * @param aKeyStroke The keystroke to return the condition of ++ * ++ * @return One of the values {@link #UNDEFINED_CONDITION}, {@link ++ * #WHEN_ANCESTOR_OF_FOCUSED_COMPONENT}, {@link #WHEN_FOCUSED}, or {@link ++ * #WHEN_IN_FOCUSED_WINDOW} ++ * ++ * @see #registerKeyboardAction ++ * @see #unregisterKeyboardAction ++ * @see #resetKeyboardActiond ++ */ ++ public int getConditionForKeyStroke(KeyStroke ks) ++ { ++ if (inputMap_whenFocused != null ++ && inputMap_whenFocused.get(ks) != null) ++ return WHEN_FOCUSED; ++ else if (inputMap_whenAncestorOfFocused != null ++ && inputMap_whenAncestorOfFocused.get(ks) != null) ++ return WHEN_ANCESTOR_OF_FOCUSED_COMPONENT; ++ else if (inputMap_whenInFocusedWindow != null ++ && inputMap_whenInFocusedWindow.get(ks) != null) ++ return WHEN_IN_FOCUSED_WINDOW; ++ else ++ return UNDEFINED_CONDITION; ++ } ++ ++ /** ++ * @deprecated Use {@link #getActionMap()} ++ * ++ * Get the ActionListener (typically an {@link Action} object) which is ++ * associated with a particular keystroke. ++ * ++ * @param aKeyStroke The keystroke to retrieve the action of ++ * ++ * @return The action associated with the specified keystroke ++ */ ++ public ActionListener getActionForKeyStroke(KeyStroke ks) ++ { ++ Object cmd = getInputMap().get(ks); ++ if (cmd != null) ++ { ++ if (cmd instanceof ActionListenerProxy) ++ return (ActionListenerProxy) cmd; ++ else if (cmd instanceof String) ++ return getActionMap().get(cmd); ++ } ++ return null; ++ } ++ ++ /** ++ * A hook for subclasses which want to customize event processing. ++ */ ++ protected void processComponentKeyEvent(KeyEvent e) ++ { ++ } ++ ++ /** ++ * Override the default key dispatch system from Component to hook into ++ * the swing {@link InputMap} / {@link ActionMap} system. ++ * ++ * See this ++ * report for more details, it's somewhat complex. ++ */ ++ protected void processKeyEvent(KeyEvent e) ++ { ++ processComponentKeyEvent(e); ++ ++ // FIXME: this needs to be elaborated significantly, to do all the ++ // focus / ancestor / window searching for the various binding modes. ++ if (! e.isConsumed() && ++ processKeyBinding(KeyStroke.getKeyStrokeForEvent(e), ++ e, WHEN_FOCUSED, e.getID() == KeyEvent.KEY_PRESSED)) ++ e.consume(); ++ } ++ ++ protected boolean processKeyBinding(KeyStroke ks, ++ KeyEvent e, ++ int condition, ++ boolean pressed) ++ { ++ if (isEnabled()) ++ { ++ Action act = null; ++ InputMap map = getInputMap(condition); ++ if (map != null) ++ { ++ Object cmd = map.get(ks); ++ if (cmd != null) ++ { ++ if (cmd instanceof ActionListenerProxy) ++ act = (Action) cmd; ++ else ++ act = (Action) getActionMap().get(cmd); ++ } ++ } ++ if (act != null && act.isEnabled()) ++ return SwingUtilities.notifyAction(act, ks, e, this, e.getModifiers()); ++ } ++ return false; ++ } ++ ++ /** ++ * Remove a keyboard action registry. ++ * ++ * @param stroke The keystroke to unregister ++ * ++ * @see #registerKeyboardAction ++ * @see #getConditionForKeystroke ++ * @see #resetKeyboardActiond ++ */ ++ public void unregisterKeyboardAction(KeyStroke aKeyStroke) ++ { ++ } ++ ++ ++ /** ++ * Reset all keyboard action registries. ++ * ++ * @see #registerKeyboardAction ++ * @see #unregisterKeyboardAction ++ * @see #getConditionForKeystroke ++ */ ++ public void resetKeyboardActions() ++ { ++ if (inputMap_whenFocused != null) ++ inputMap_whenFocused.clear(); ++ if (inputMap_whenAncestorOfFocused != null) ++ inputMap_whenAncestorOfFocused.clear(); ++ if (inputMap_whenInFocusedWindow != null) ++ inputMap_whenInFocusedWindow.clear(); ++ if (actionMap != null) ++ actionMap.clear(); ++ } ++ ++ ++ /** ++ * Mark the described region of this component as dirty in the current ++ * {@link RepaintManager}. This will queue an asynchronous repaint using ++ * the system painting thread in the near future. ++ * ++ * @param tm ignored ++ * @param x coordinate of the region to mark as dirty ++ * @param y coordinate of the region to mark as dirty ++ * @param width dimension of the region to mark as dirty ++ * @param height dimension of the region to mark as dirty ++ */ ++ public void repaint(long tm, int x, int y, int width, int height) ++ { ++ Rectangle dirty = new Rectangle(x, y, width, height); ++ Rectangle vis = getVisibleRect(); ++ dirty = dirty.intersection(vis); ++ RepaintManager.currentManager(this).addDirtyRegion(this, dirty.x, dirty.y, ++ dirty.width, ++ dirty.height); ++ } ++ ++ /** ++ * Mark the described region of this component as dirty in the current ++ * {@link RepaintManager}. This will queue an asynchronous repaint using ++ * the system painting thread in the near future. ++ * ++ * @param r The rectangle to mark as dirty ++ */ ++ public void repaint(Rectangle r) ++ { ++ repaint((long) 0, (int) r.getX(), (int) r.getY(), (int) r.getWidth(), ++ (int) r.getHeight()); ++ } ++ ++ /** ++ * Request focus on the default component of this component's {@link ++ * FocusTraversalPolicy}. ++ * ++ * @return The result of {@link #requestFocus} ++ * ++ * @deprecated Use {@link #requestFocus()} on the default component provided from ++ * the {@link FocusTraversalPolicy} instead. ++ */ ++ public boolean requestDefaultFocus() ++ { ++ return false; ++ } ++ ++ /** ++ * Queue a an invalidation and revalidation of this component, using ++ * {@link RepaintManager#addInvalidComponent}. ++ */ ++ public void revalidate() ++ { ++ invalidate(); ++ RepaintManager.currentManager(this).addInvalidComponent(this); ++ } ++ ++ /** ++ * Calls scrollRectToVisible on the component's parent. ++ * Components which can service this call should override. ++ * ++ * @param r The rectangle to make visible ++ */ ++ public void scrollRectToVisible(Rectangle r) ++ { ++ Component p = getParent(); ++ if (p instanceof JComponent) ++ ((JComponent) p).scrollRectToVisible(r); ++ } ++ ++ /** ++ * Set the value of the {@link #alignmentX} property. ++ * ++ * @param a The new value of the property ++ */ ++ public void setAlignmentX(float a) ++ { ++ alignmentX = a; ++ } ++ ++ /** ++ * Set the value of the {@link #alignmentY} property. ++ * ++ * @param a The new value of the property ++ */ ++ public void setAlignmentY(float a) ++ { ++ alignmentY = a; ++ } ++ ++ /** ++ * Set the value of the {@link #autoscrolls} property. ++ * ++ * @param a The new value of the property ++ */ ++ public void setAutoscrolls(boolean a) ++ { ++ autoscrolls = a; ++ } ++ ++ /** ++ * Set the value of the {@link #debugGraphicsOptions} property. ++ * ++ * @param debugOptions The new value of the property ++ */ ++ public void setDebugGraphicsOptions(int debugOptions) ++ { ++ debugGraphicsOptions = debugOptions; ++ } ++ ++ /** ++ * Set the value of the {@link #doubleBuffered} property. ++ * ++ * @param db The new value of the property ++ */ ++ public void setDoubleBuffered(boolean db) ++ { ++ doubleBuffered = db; ++ } ++ ++ /** ++ * Set the value of the {@link #enabled} property, revalidate ++ * and repaint this component. ++ * ++ * @param e The new value of the property ++ */ ++ public void setEnabled(boolean e) ++ { ++ super.setEnabled(e); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #font} property, revalidate ++ * and repaint this component. ++ * ++ * @param f The new value of the property ++ */ ++ public void setFont(Font f) ++ { ++ super.setFont(f); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #background} property, revalidate ++ * and repaint this component. ++ * ++ * @param bg The new value of the property ++ */ ++ public void setBackground(Color bg) ++ { ++ super.setBackground(bg); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #foreground} property, revalidate ++ * and repaint this component. ++ * ++ * @param fg The new value of the property ++ */ ++ public void setForeground(Color fg) ++ { ++ super.setForeground(fg); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #maximumSize} property, revalidate ++ * and repaint this component. ++ * ++ * @param max The new value of the property ++ */ ++ public void setMaximumSize(Dimension max) ++ { ++ maximumSize = max; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #minimumSize} property, revalidate ++ * and repaint this component. ++ * ++ * @param min The new value of the property ++ */ ++ public void setMinimumSize(Dimension min) ++ { ++ minimumSize = min; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #preferredSize} property, revalidate ++ * and repaint this component. ++ * ++ * @param pref The new value of the property ++ */ ++ public void setPreferredSize(Dimension pref) ++ { ++ preferredSize = pref; ++ } ++ ++ /** ++ * Set the specified component to be the next component in the ++ * focus cycle, overriding the {@link FocusTraversalPolicy} for ++ * this component. ++ * ++ * @param aComponent The component to set as the next focusable ++ * ++ * @deprecated Use FocusTraversalPolicy instead ++ */ ++ public void setNextFocusableComponent(Component aComponent) ++ { ++ } ++ ++ /** ++ * Set the value of the {@link #requestFocusEnabled} property. ++ * ++ * @param e The new value of the property ++ */ ++ public void setRequestFocusEnabled(boolean e) ++ { ++ requestFocusEnabled = e; ++ } ++ ++ /** ++ * Set the value of the {@link #opaque} property, revalidate and repaint ++ * this component. ++ * ++ * @param isOpaque The new value of the property ++ * ++ * @see ComponentUI#update ++ */ ++ public void setOpaque(boolean isOpaque) ++ { ++ opaque = isOpaque; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the visible property, and revalidate / repaint the ++ * component. ++ * ++ * @param v The new value of the property ++ */ ++ public void setVisible(boolean v) ++ { ++ super.setVisible(v); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Call {@link paint}. ++ * ++ * @param g The graphics context to paint into ++ */ ++ public void update(Graphics g) ++ { ++ paint(g); ++ } ++ ++ /** ++ * Get the value of the UIClassID property. This property should be a key ++ * in the {@link UIDefaults} table managed by {@link UIManager}, the ++ * value of which is the name of a class to load for the component's ++ * {@link ui} property. ++ * ++ * @return A "symbolic" name which will map to a class to use for the ++ * component's UI, such as "ComponentUI" ++ * ++ * @see #setUI ++ * @see #updateUI ++ */ ++ public String getUIClassID() ++ { ++ return "ComponentUI"; ++ } ++ ++ /** ++ * Install a new UI delegate as the component's {@link ui} property. In ++ * the process, this will call {@link ComponentUI.uninstallUI} on any ++ * existing value for the {@link ui} property, and {@link ++ * ComponentUI.installUI} on the new UI delegate. ++ * ++ * @param newUI The new UI delegate to install ++ * ++ * @see #updateUI ++ * @see #getUIClassID ++ */ ++ protected void setUI(ComponentUI newUI) ++ { ++ if (ui != null) ++ ui.uninstallUI(this); + +- //updateUI(); // get a proper ui +- } ++ ComponentUI oldUI = ui; ++ ui = newUI; + +- // protected EventListenerList listenerList +- public boolean contains(int x, int y) +- { +- //return dims.contains(x,y); +- return super.contains(x,y); +- } +- +- public void addNotify() +- { +- //Notification to this component that it now has a parent component. +- super.addNotify(); +- } +- +- Hashtable get_prop_hash() +- { +- if (prop_hash == null) +- prop_hash = new Hashtable(); +- return prop_hash; +- } +- public Vector get_veto_list() +- { +- if (veto_list == null) +- veto_list = new Vector(); +- return veto_list; +- } +- public Vector get_change_list() +- { +- if (change_list == null) +- change_list = new Vector(); +- return change_list; +- } +- public Vector get_ancestor_list() +- { +- if (ancestor_list == null) +- ancestor_list = new Vector(); +- return ancestor_list; +- } +- +- public Object getClientProperty(Object key) +- { return get_prop_hash().get(key); } +- +- public void putClientProperty(Object key, Object value) +- { get_prop_hash().put(key, value); } +- +- public void removeAncestorListener(AncestorListener listener) +- { get_ancestor_list().removeElement(listener); } +- +- public void removePropertyChangeListener(PropertyChangeListener listener) +- { get_change_list().removeElement(listener); } +- +- public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) +- { /* FIXME */ get_change_list().removeElement(listener); } +- +- public void removeVetoableChangeListener(VetoableChangeListener listener) +- { get_veto_list().removeElement(listener); } +- +- public void addAncestorListener(AncestorListener listener) +- { get_ancestor_list().addElement(listener); } +- +- public void addPropertyChangeListener(PropertyChangeListener listener) +- { get_change_list().addElement(listener); } +- +- public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) +- { /* FIXME */ get_change_list().addElement(listener); } +- +- public void addVetoableChangeListener(VetoableChangeListener listener) +- { get_veto_list().addElement(listener); } +- +- public void computeVisibleRect(Rectangle rect) +- { +- //Returns the Component's "visible rect rectangle" - the intersection of the visible rectangles for this component and all of its ancestors. +- //super.computeVisibleRect(rect); +- } +- +- public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) +- { +- //Reports a bound property change. +- } +- public void firePropertyChange(String propertyName, byte oldValue, byte newValue) +- { +- // Reports a bound property change. +- } +- public void firePropertyChange(String propertyName, char oldValue, char newValue) +- { +- //Reports a bound property change. +- } +- +- public void firePropertyChange(String propertyName, double oldValue, double newValue) +- { +- //Reports a bound property change. +- } +- +- public void firePropertyChange(String propertyName, float oldValue, float newValue) +- { +- // Reports a bound property change. +- } +- public void firePropertyChange(String propertyName, int oldValue, int newValue) +- { +- // Reports a bound property change. +- } +- public void firePropertyChange(String propertyName, long oldValue, long newValue) +- { +- //Reports a bound property change. protected +- } +- +- protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) +- { +- // Support for reporting bound property changes. +- } +- public void firePropertyChange(String propertyName, short oldValue, short newValue) +- { +- // Reports a bound property change. +- } +- +- protected void fireVetoableChange(String propertyName, Object oldValue, Object newValue) +- { +- // Support for reporting constrained property changes. +- } +- +- public AccessibleContext getAccessibleContext() +- { +- // Get the AccessibleContext associated with this JComponent +- return null; +- } +- +- public ActionListener getActionForKeyStroke(KeyStroke aKeyStroke) +- { +- //Return the object that will perform the action registered for a given keystroke. +- return null; +- } +- public float getAlignmentX() +- { +- // Overrides Container.getAlignmentX to return the vertical alignment. +- return 0; +- } +- +- public float getAlignmentY() +- { +- // Overrides Container.getAlignmentY to return the horizontal alignment. +- return 0; +- } +- public boolean getAutoscrolls() +- { +- //Returns true if this component automatically scrolls its contents when dragged, (when contained in a component that supports scrolling, like JViewport +- return false; +- } +- +- public void setBorder(Border border) +- { +- //System.out.println("set border called !, new border = " + border); +- this.border = border; +- revalidate(); +- repaint(); +- } +- +- public Border getBorder() +- { return border; } +- +- +- public Rectangle getBounds(Rectangle rv) +- { +- if (rv == null) +- return new Rectangle(getX(),getY(),getWidth(),getHeight()); +- else +- { +- rv.setBounds(getX(),getY(),getWidth(),getHeight()); +- return rv; +- } +- } +- +- protected Graphics getComponentGraphics(Graphics g) +- { return g; } +- +- public int getConditionForKeyStroke(KeyStroke aKeyStroke) +- { +- //Return the condition that determines whether a registered action occurs in response to the specified keystroke. +- return 0; +- } +- public int getDebugGraphicsOptions() +- { +- return 0; +- } +- +- public Graphics getGraphics() +- { return super.getGraphics(); } +- +- +- // static MantaNative void DebugMe(Border b); +- +- public Insets getInsets() +- { +- // System.out.println("watch this border"); +- // DebugMe(border); +- // System.out.println("border = " + border); +- +- if (border == null) +- { +- //System.out.println("compares to null !"); +- return super.getInsets(); +- } +- // System.out.println("compare failed !"); +- return getBorder().getBorderInsets(this); +- } +- +- public Insets getInsets(Insets insets) +- { +- Insets t = getInsets(); +- +- if (insets == null) +- return t; +- +- +- return new Insets(t.top, t.left, t.bottom, t.right); +- } +- public Point getLocation(Point rv) +- { +- //Store the x,y origin of this component into "return value" rv and return rv. +- +- if (rv == null) +- return new Point(getX(), +- getY()); +- +- rv.setLocation(getX(), +- getY()); +- return rv; +- } +- +- public Dimension getMaximumSize() +- { +- if (max != null) +- { +- //System.out.println("HAVE_MAX_SIZE = " + max); +- return max; +- } +- if (ui != null) +- { +- Dimension s = ui.getMaximumSize(this); +- if (s != null) +- { +- //System.out.println(" UI-MAX = " + s + ", UI = " + ui + ", IM="+this); +- return s; +- } +- } +- Dimension p = super.getMaximumSize(); +- //System.out.println(" MAX = " + p + ", COMP="+this); +- return p; +- } +- +- public Dimension getMinimumSize() +- { +- if (min != null) +- { +- //System.out.println("HAVE_MIN_SIZE = " + min); +- return min; +- } +- if (ui != null) +- { +- Dimension s = ui.getMinimumSize(this); +- if (s != null) +- { +- // System.out.println(" UI-MIN = " + s + ", UI = " + ui + ", IM="+this); +- return s; +- } +- } +- Dimension p = super.getMinimumSize(); +- // System.out.println(" MIN = " + p + ", COMP="+this); +- return p; +- } +- +- public Dimension getPreferredSize() +- { +- if (pref != null) +- { +- //System.out.println("HAVE_PREF_SIZE = " + pref); +- return pref; +- } +- +- if (ui != null) +- { +- Dimension s = ui.getPreferredSize(this); +- if (s != null) +- { +- //System.out.println(" UI-PREF = " + s + ", UI = " + ui + ", IM="+this); +- return s; +- } +- } +- Dimension p = super.getPreferredSize(); +- // System.out.println(" PREF = " + p + ", COMP="+this); +- return p; +- } +- +- public Component getNextFocusableComponent() +- { +- // Return the next focusable component or null if the focus manager should choose the next focusable component automatically +- return null; +- } +- +- +- public KeyStroke[] getRegisteredKeyStrokes() +- { +- // Return the KeyStrokes that will initiate registered actions. +- return null; +- } +- +- public JRootPane getRootPane() +- { +- JRootPane p = SwingUtilities.getRootPane(this); +- System.out.println("root = " + p); +- return p; +- } +- +- public Dimension getSize(Dimension rv) +- { +- // System.out.println("JComponent, getsize()"); +- if (rv == null) +- return new Dimension(getWidth(), +- getHeight()); +- else +- { +- rv.setSize(getWidth(), +- getHeight()); +- return rv; +- } +- } +- +- public JToolTip createToolTip() +- { +- if (tooltip == null) +- tooltip = new JToolTip(tool_tip_text); +- return tooltip; +- } +- +- public Point getToolTipLocation(MouseEvent event) +- { return null; } +- +- public void setToolTipText(String text) +- { tool_tip_text = text; } +- +- public String getToolTipText() +- { return tool_tip_text; } +- +- public String getToolTipText(MouseEvent event) +- { return tool_tip_text; } +- +- public Container getTopLevelAncestor() +- { +- // Returns the top-level ancestor of this component (either the containing Window or Applet), or null if this component has not been added to any container. +- System.out.println("JComponent, getTopLevelAncestor()"); +- return null; +- } +- +- public Rectangle getVisibleRect() +- { +- /// Returns the Component's "visible rectangle" - the intersection of this components visible rectangle: +- System.out.println("JComponent, getVisibleRect()"); +- return null; +- } +- +- public void grabFocus() +- { +- // Set the focus on the receiving component. +- } +- +- public boolean hasFocus() +- { +- // Returns true if this Component has the keyboard focus. +- return false; +- } +- +- public boolean isDoubleBuffered() +- { return use_double_buffer; } +- +- public boolean isFocusCycleRoot() +- { +- // Override this method and return true if your component is the root of of a component tree with its own focus cycle. +- return false; +- } +- +- public boolean isFocusTraversable() +- { +- // Identifies whether or not this component can receive the focus. +- return false; +- } +- +- public static boolean isLightweightComponent(Component c) +- { +- return c.getPeer() instanceof LightweightPeer; +- } +- +- public boolean isManagingFocus() +- { +- // Override this method and return true if your JComponent manages focus. +- return false; +- } +- +- public boolean isOpaque() +- { return opaque; } +- +- public boolean isOptimizedDrawingEnabled() +- { +- // Returns true if this component tiles its children, +- return true; +- } +- +- public boolean isPaintingTile() +- { +- // Returns true if the receiving component is currently painting a tile. +- return false; +- } +- +- public boolean isRequestFocusEnabled() +- { +- // Return whether the receiving component can obtain the focus by calling requestFocus +- return false; +- } +- +- public boolean isValidateRoot() +- { +- // If this method returns true, revalidate() calls by descendants of this component will cause the entire tree beginning with this root to be validated. +- return false; +- } +- +- public void paint(Graphics g) +- { +- // System.out.println("SWING_PAINT:" + this); +- +- paintBorder(g); +- paintComponent(g); +- paintChildren(g); +- } +- +- protected void paintBorder(Graphics g) +- { +- // System.out.println("PAINT_BORDER x XXXXXXX x x x x x x x x x x x x:" + getBorder() + ", THIS="+this); +- +- // Paint the component's border. +- if (getBorder() != null) +- { +- //System.out.println("PAINT_BORDER x XXXXXXX x x x x x x x x x x x x:" + getBorder() + ", THIS="+this); +- +- getBorder().paintBorder(this, +- g, +- 0, +- 0, +- getWidth(), +- getHeight()); +- } +- } +- +- protected void paintChildren(Graphics g) +- { +- // Paint this component's children. +- //super.paintChildren(g); +- } +- +- protected void paintComponent(Graphics g) +- { +- // If the UI delegate is non-null, call its paint method. +- if (ui != null) +- { +- ui.paint(g, this); +- } +- } +- +- /** +- * Paint the specified region in this component and all of +- * its descendants that overlap the region, immediately. +- */ +- public void paintImmediately(int x, int y, int w, int h) +- { +- +- //Ronald: this shoudld probably redirect to the PLAF .... +- } +- +- public void paintImmediately(Rectangle r) +- { +- /// Paint the specified region now. +- paintImmediately((int)r.getX(), +- (int)r.getY(), +- (int)r.getWidth(), +- (int)r.getHeight()); +- } +- protected String paramString() +- { +- // Returns a string representation of this JComponent. +- return "JComponent"; +- } +- protected void processComponentKeyEvent(KeyEvent e) +- { +- // Process any key events that the component itself recognizes. +- //System.out.println("COMP_KEY-EVENT: " + e); +- } +- protected void processFocusEvent(FocusEvent e) +- { +- // Processes focus events occurring on this component by dispatching them to any registered FocusListener objects. +- //System.out.println("FOCUS_EVENT: " + e); +- } +- +- protected void processKeyEvent(KeyEvent e) +- { +- // Override processKeyEvent to process events protected +- //System.out.println("KEY-EVENT: " + e); +- } +- +- public void processMouseMotionEvent(MouseEvent e) +- { +- // Processes mouse motion events occurring on this component by dispatching them to any registered MouseMotionListener objects. +- //System.out.println("COMP_MOUSE-EVENT: " + e + ", MEMORY = " + Runtime.getRuntime().freeMemory()); +- } +- +- public void registerKeyboardAction(ActionListener anAction, +- KeyStroke aKeyStroke, +- int aCondition) +- { +- registerKeyboardAction(anAction, +- null, +- aKeyStroke, +- aCondition); +- } +- +- public void registerKeyboardAction(ActionListener anAction, +- String aCommand, +- KeyStroke aKeyStroke, +- int aCondition) +- { +- // Register a new keyboard action. +- } +- +- +- public void removeNotify() +- { +- // Notification to this component that it no longer has a parent component. +- } +- +- public void repaint(long tm, int x, int y, int width, int height) +- { +- // Adds the specified region to the dirty region list if the component is showing. +- //System.out.println("JC: repaint"); +- super.repaint(tm, x,y,width,height); +- } +- +- public void repaint(Rectangle r) +- { +- // Adds the specified region to the dirty region list if the component is showing. +- repaint((long)0, +- (int)r.getX(), +- (int)r.getY(), +- (int)r.getWidth(), +- (int)r.getHeight()); +- } +- +- public boolean requestDefaultFocus() +- { +- // Request the focus for the component that should have the focus by default. +- return false; +- } +- +- public void requestFocus() +- { +- // Set focus on the receiving component if isRequestFocusEnabled returns true +- super.requestFocus(); +- } +- +- public void resetKeyboardActions() +- { +- // Unregister all keyboard actions +- } +- +- public void reshape(int x, int y, int w, int h) +- { +- /// Moves and resizes this component. +- super.reshape(x,y,w,h); +- } +- +- public void revalidate() +- { +- // Support for deferred automatic layout. +- if (getParent() == null) +- invalidate(); +- } +- +- public void scrollRectToVisible(Rectangle aRect) +- { +- // Forwards the scrollRectToVisible() message to the JComponent's parent. +- } +- +- public void setAlignmentX(float alignmentX) +- { +- // Set the the vertical alignment. +- } +- +- public void setAlignmentY(float alignmentY) +- { +- // Set the the horizontal alignment. +- } +- +- public void setAutoscrolls(boolean autoscrolls) +- { +- // If true this component will automatically scroll its contents when dragged, if contained in a component that supports scrolling, such as JViewport +- } +- +- public void setDebugGraphicsOptions(int debugOptions) +- { +- // Enables or disables diagnostic information about every graphics operation performed within the component or one of its children. +- } +- +- public void setDoubleBuffered(boolean aFlag) +- { +- use_double_buffer = aFlag; +- } +- +- public void setEnabled(boolean enabled) +- { +- // Sets whether or not this component is enabled. +- super.setEnabled(enabled); +- repaint(); +- } +- +- public void setFont(Font font) +- { +- super.setFont(font); +- revalidate(); +- repaint(); +- } +- +- public void setBackground(Color bg) +- { +- super.setBackground(bg); +- revalidate(); +- repaint(); +- } +- public void setForeground(Color fg) +- { +- super.setForeground(fg); +- revalidate(); +- repaint(); +- } +- +- public void setMaximumSize(Dimension maximumSize) +- { max = maximumSize; } +- +- public void setMinimumSize(Dimension minimumSize) +- { min = minimumSize; } +- +- public void setPreferredSize(Dimension preferredSize) +- { pref = preferredSize; } +- +- public void setNextFocusableComponent(Component aComponent) +- { +- // Specifies the next component to get the focus after this one, for example, when the tab key is pressed. +- } +- +- public void setOpaque(boolean isOpaque) +- { +- opaque = isOpaque; +- revalidate(); +- repaint(); +- } +- +- +- public void setRequestFocusEnabled(boolean aFlag) +- { +- } +- +- +- public void setVisible(boolean aFlag) +- { +- // Makes the component visible or invisible. +- +- super.setVisible(aFlag); +- if (getParent() != null) +- { +- Rectangle dims = getBounds(); +- getParent().repaint((int)dims.getX(), +- (int)dims.getY(), +- (int)dims.getWidth(), +- (int)dims.getHeight()); +- } +- } +- +- public void unregisterKeyboardAction(KeyStroke aKeyStroke) +- { +- // Unregister a keyboard action. +- } +- +- +- public void update(Graphics g) +- { +- paint(g); +- } +- +- public String getUIClassID() +- { +- /// Return the UIDefaults key used to look up the name of the swing. +- return "JComponent"; +- } +- +- protected void setUI(ComponentUI newUI) +- { +- if (ui != null) +- { +- ui.uninstallUI(this); +- } +- +- // Set the look and feel delegate for this component. +- ui = newUI; +- +- if (ui != null) +- { +- ui.installUI(this); +- } +- +- revalidate(); +- repaint(); +- } +- +- public void updateUI() +- { +- // Resets the UI property to a value from the current look and feel. +- System.out.println("update UI not overwritten in class: " + this); +- } ++ if (ui != null) ++ ui.installUI(this); + ++ firePropertyChange("UI", oldUI, newUI); ++ ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method should be overridden in subclasses. In JComponent, the ++ * method does nothing. In subclasses, it should a UI delegate ++ * (corresponding to the symbolic name returned from {@link ++ * getUIClassID}) from the {@link UIManager}, and calls {@link setUI} ++ * with the new delegate. ++ */ ++ public void updateUI() ++ { ++ System.out.println("update UI not overwritten in class: " + this); ++ } ++ ++ public static Locale getDefaultLocale() ++ { ++ return defaultLocale; ++ } ++ ++ public static void setDefaultLocale(Locale l) ++ { ++ defaultLocale = l; ++ } + } +Index: javax/swing/JDesktopPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JDesktopPane.java,v +retrieving revision 1.3 +diff -u -r1.3 JDesktopPane.java +--- javax/swing/JDesktopPane.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JDesktopPane.java 6 Sep 2004 16:35:55 -0000 +@@ -37,6 +37,8 @@ + + package javax.swing; + ++import java.awt.Component; ++import java.beans.PropertyVetoException; + import java.io.IOException; + import java.io.ObjectOutputStream; + import javax.accessibility.Accessible; +@@ -44,244 +46,281 @@ + import javax.accessibility.AccessibleRole; + import javax.swing.plaf.DesktopPaneUI; + ++ + /** +- * JDesktopPane +- * @author Andrew Selkirk +- * @version 1.0 ++ * JDesktopPane is a container (usually for JInternalFrames) that simulates a ++ * desktop. Typically, the user will create JInternalFrames and place thme in ++ * a JDesktopPane. The user can then interact with JInternalFrames like they ++ * usually would with JFrames. The actions (minimize, maximize, close, etc) ++ * are done by using a DesktopManager that is associated with the ++ * JDesktopPane. + */ + public class JDesktopPane extends JLayeredPane implements Accessible + { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 766333777224038726L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJDesktopPane +- */ +- protected class AccessibleJDesktopPane extends AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJDesktopPane +- * @param component TODO +- */ +- protected AccessibleJDesktopPane(JDesktopPane component) { +- super(component); +- // TODO +- } // AccessibleJDesktopPane() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.DESKTOP_PANE; +- } // getAccessibleRole() +- +- +- } // AccessibleJDesktopPane +- +- +- //------------------------------------------------------------- +- // Constants -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * LIVE_DRAG_MODE +- */ +- public static int LIVE_DRAG_MODE = 0; +- +- /** +- * OUTLINE_DRAG_MODE +- */ +- public static int OUTLINE_DRAG_MODE = 1; +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "DesktopPaneUI"; +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * selectedFrame +- */ +- private transient JInternalFrame selectedFrame; +- +- /** +- * desktopManager +- */ +- private transient DesktopManager desktopManager; +- +- +- /** +- * dragMode +- */ +- private int dragMode; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JDesktopPane +- */ +- public JDesktopPane() { +- // TODO +- } // JDesktopPane() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getUI +- * @returns DesktopPaneUI +- */ +- public DesktopPaneUI getUI() { +- return (DesktopPaneUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(DesktopPaneUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * setDragMode +- * @param mode TODO +- */ +- public void setDragMode(int mode) { +- this.dragMode = mode; +- // TODO +- } // setDragMode() +- +- /** +- * getDragMode +- * @returns int +- */ +- public int getDragMode() { +- return dragMode; +- } // getDragMode() +- +- /** +- * getDesktopManager +- * @returns DesktopManager +- */ +- public DesktopManager getDesktopManager() { +- return desktopManager; +- } // getDesktopManager() +- +- /** +- * setDesktopManager +- * @param manager TODO +- */ +- public void setDesktopManager(DesktopManager manager) { +- this.desktopManager = manager; +- // TODO +- } // setDesktopManager() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((DesktopPaneUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getAllFrames +- * @returns JInternalFrame[] +- */ +- public JInternalFrame[] getAllFrames() { +- return null; // TODO +- } // getAllFrames() +- +- /** +- * getSelectedFrame +- * @returns JInternalFrame +- */ +- public JInternalFrame getSelectedFrame() { +- return null; // TODO +- } // getSelectedFrame() +- +- /** +- * setSelectedFrame +- * @param frame TODO +- */ +- public void setSelectedFrame(JInternalFrame frame) { +- // TODO +- } // setSelectedFrame() +- +- /** +- * getAllFramesInLayer +- * @param layer TODO +- * @returns JInternalFrame[] +- */ +- public JInternalFrame[] getAllFramesInLayer(int layer) { +- return null; // TODO +- } // getAllFramesInLayer() +- +- /** +- * isOpaque +- * @returns boolean +- */ +- public boolean isOpaque() { +- return true; +- } // isOpaque() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJDesktopPane(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JDesktopPane ++ /** ++ * This specifies that when dragged, a JInternalFrame should be completely ++ * visible. ++ */ ++ public static int LIVE_DRAG_MODE = 0; ++ ++ /** ++ * This specifies that when dragged, a JInternalFrame should only be visible ++ * as an outline. ++ */ ++ public static int OUTLINE_DRAG_MODE = 1; ++ ++ /** The selected frame in the JDesktopPane. */ ++ private transient JInternalFrame selectedFrame; ++ ++ /** The JDesktopManager to use for acting on JInternalFrames. */ ++ transient DesktopManager desktopManager; ++ ++ /** The drag mode used by the JDesktopPane. */ ++ private transient int dragMode = LIVE_DRAG_MODE; ++ ++ /** ++ * AccessibleJDesktopPane ++ */ ++ protected class AccessibleJDesktopPane extends AccessibleJComponent ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 6079388927946077570L; ++ ++ /** ++ * Constructor AccessibleJDesktopPane ++ */ ++ protected AccessibleJDesktopPane() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.DESKTOP_PANE; ++ } ++ } ++ ++ /** ++ * Creates a new JDesktopPane object. ++ */ ++ public JDesktopPane() ++ { ++ setLayout(null); ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the UI used with the JDesktopPane. ++ * ++ * @return The UI used with the JDesktopPane. ++ */ ++ public DesktopPaneUI getUI() ++ { ++ return (DesktopPaneUI) ui; ++ } ++ ++ /** ++ * This method sets the UI used with the JDesktopPane. ++ * ++ * @param ui The UI to use with the JDesktopPane. ++ */ ++ public void setUI(DesktopPaneUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets the drag mode to use with the JDesktopPane. ++ * ++ * @param mode The drag mode to use. ++ * ++ * @throws IllegalArgumentException If the drag mode given is not ++ * LIVE_DRAG_MODE or OUTLINE_DRAG_MODE. ++ */ ++ public void setDragMode(int mode) ++ { ++ if ((mode != LIVE_DRAG_MODE) && (mode != OUTLINE_DRAG_MODE)) ++ throw new IllegalArgumentException("Drag mode not valid."); ++ ++ // FIXME: Unsupported mode. ++ if (mode == OUTLINE_DRAG_MODE) ++ throw new IllegalArgumentException("Outline drag modes are unsupported."); ++ ++ dragMode = mode; ++ } ++ ++ /** ++ * This method returns the drag mode used with the JDesktopPane. ++ * ++ * @return The drag mode used with the JDesktopPane. ++ */ ++ public int getDragMode() ++ { ++ return dragMode; ++ } ++ ++ /** ++ * This method returns the DesktopManager used with the JDesktopPane. ++ * ++ * @return The DesktopManager to use with the JDesktopPane. ++ */ ++ public DesktopManager getDesktopManager() ++ { ++ return desktopManager; ++ } ++ ++ /** ++ * This method sets the DesktopManager to use with the JDesktopPane. ++ * ++ * @param manager The DesktopManager to use with the JDesktopPane. ++ */ ++ public void setDesktopManager(DesktopManager manager) ++ { ++ desktopManager = manager; ++ } ++ ++ /** ++ * This method restores the UI used with the JDesktopPane to the default. ++ */ ++ public void updateUI() ++ { ++ setUI((DesktopPaneUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns a String identifier that allows the UIManager to know ++ * which class will act as JDesktopPane's UI. ++ * ++ * @return A String identifier for the UI class to use. ++ */ ++ public String getUIClassID() ++ { ++ return "DesktopPaneUI"; ++ } ++ ++ /** ++ * This method returns all JInternalFrames that are in the JDesktopPane. ++ * ++ * @return All JInternalFrames that are in the JDesktopPane. ++ */ ++ public JInternalFrame[] getAllFrames() ++ { ++ return getFramesFromComponents(getComponents()); ++ } ++ ++ /** ++ * This method returns the currently selected frame in the JDesktopPane. ++ * ++ * @return The currently selected frame in the JDesktopPane. ++ */ ++ public JInternalFrame getSelectedFrame() ++ { ++ return selectedFrame; ++ } ++ ++ /** ++ * This method sets the selected frame in the JDesktopPane. ++ * ++ * @param frame The selected frame in the JDesktopPane. ++ */ ++ public void setSelectedFrame(JInternalFrame frame) ++ { ++ if (selectedFrame != null) ++ { ++ try ++ { ++ selectedFrame.setSelected(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } ++ selectedFrame = null; ++ ++ try ++ { ++ if (frame != null) ++ frame.setSelected(true); ++ ++ selectedFrame = frame; ++ } ++ catch (PropertyVetoException e) ++ { ++ } ++ } ++ ++ /** ++ * This method returns all the JInternalFrames in the given layer. ++ * ++ * @param layer The layer to grab frames in. ++ * ++ * @return All JInternalFrames in the given layer. ++ */ ++ public JInternalFrame[] getAllFramesInLayer(int layer) ++ { ++ return getFramesFromComponents(getComponentsInLayer(layer)); ++ } ++ ++ /** ++ * This method always returns true to indicate that it is not transparent. ++ * ++ * @return true. ++ */ ++ public boolean isOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns a String that describes the JDesktopPane. ++ * ++ * @return A String that describes the JDesktopPane. ++ */ ++ protected String paramString() ++ { ++ return "JDesktopPane"; ++ } ++ ++ /** ++ * This method returns all the JInternalFrames in the given Component array. ++ * ++ * @param components An array to search for JInternalFrames in. ++ * ++ * @return An array of JInternalFrames found in the Component array. ++ */ ++ private static JInternalFrame[] getFramesFromComponents(Component[] components) ++ { ++ int count = 0; ++ ++ for (int i = 0; i < components.length; i++) ++ if (components[i] instanceof JInternalFrame) ++ count++; ++ ++ JInternalFrame[] value = new JInternalFrame[count]; ++ for (int i = 0, j = 0; i < components.length && j != count; i++) ++ if (components[i] instanceof JInternalFrame) ++ value[j++] = (JInternalFrame) components[i]; ++ return value; ++ } ++ ++ /** ++ * getAccessibleContext ++ * ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJDesktopPane(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JDialog.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JDialog.java,v +retrieving revision 1.2 +diff -u -r1.2 JDialog.java +--- javax/swing/JDialog.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JDialog.java 6 Sep 2004 16:35:55 -0000 +@@ -1,5 +1,5 @@ + /* JDialog.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.BorderLayout; +@@ -45,227 +44,519 @@ + import java.awt.Dimension; + import java.awt.Frame; + import java.awt.Graphics; ++import java.awt.GraphicsConfiguration; + import java.awt.LayoutManager; + import java.awt.event.KeyEvent; + import java.awt.event.WindowEvent; ++import java.awt.IllegalComponentStateException; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + ++ + /** +- * Unlike JComponent derivatives, JDialog inherits from +- * java.awt.Dialog. But also lets a look-and-feel component to its work. ++ * Unlike JComponent derivatives, JDialog inherits from java.awt.Dialog. But ++ * also lets a look-and-feel component to its work. + * +- * @author Ronald Veldema (rveldema@cs.vu.nl) ++ * @author Ronald Veldema (rveldema_AT_cs.vu.nl) + */ +-public class JDialog extends Dialog implements Accessible ++public class JDialog extends Dialog implements Accessible, WindowConstants, ++ RootPaneContainer + { +- public final static int HIDE_ON_CLOSE = 0; +- public final static int DISPOSE_ON_CLOSE = 1; +- public final static int DO_NOTHING_ON_CLOSE = 2; +- +- protected AccessibleContext accessibleContext; +- +- private int close_action = HIDE_ON_CLOSE; +- +- /*************************************************** +- * +- * +- * constructors +- * +- * +- *************/ +- +- JDialog(Frame owner) +- { +- this(owner, "dialog"); +- } +- +- JDialog(Frame owner, +- String s) +- { +- this(owner, s, true); +- } +- +- JDialog(Frame owner, +- String s, +- boolean modeld) +- { +- super(owner, s, modeld); +- } +- +- JDialog(Frame owner, +- // String s, +- boolean modeld) +- { +- super(owner, "JDialog", modeld); +- } +- JDialog(Dialog owner) +- { +- this(owner, "dialog"); +- } +- +- JDialog(Dialog owner, +- String s) +- { +- this(owner, s, true); +- } +- +- JDialog(Dialog owner, +- String s, +- boolean modeld) +- { +- super(owner, s, modeld); +- } +- +- +- /*************************************************** +- * +- * +- * methods, this part is shared with JDialog, JFrame +- * +- * +- *************/ ++ private static final long serialVersionUID = -864070866424508218L; + +- +- private boolean checking; +- protected JRootPane rootPane; ++ /** DOCUMENT ME! */ ++ protected AccessibleContext accessibleContext; + +- void setLocationRelativeTo(Component c) +- { +- } ++ /** The single RootPane in the Dialog. */ ++ protected JRootPane rootPane; + ++ /** Whether checking is enabled on the RootPane */ ++ protected boolean rootPaneCheckingEnabled = true; + +- protected void frameInit() +- { +- super.setLayout(new BorderLayout(1, 1)); +- getRootPane(); // will do set/create +- } ++ /** The default action taken when closed. */ ++ private int close_action = HIDE_ON_CLOSE; + ++ /** Whether JDialogs are decorated by the Look and Feel. */ ++ private static boolean decorated = false; ++ ++ /** ++ * Creates a new non-modal JDialog with no title ++ * using a shared Frame as the owner. ++ */ ++ public JDialog() ++ { ++ this(SwingUtilities.getOwnerFrame(), "", false, null); ++ } ++ ++ /** ++ * Creates a new non-modal JDialog with no title ++ * using the given owner. ++ * ++ * @param owner The owner of the JDialog. ++ */ ++ public JDialog(Dialog owner) ++ { ++ this(owner, "", false, null); ++ } ++ ++ /** ++ * Creates a new JDialog with no title using the ++ * given modal setting and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ */ ++ public JDialog(Dialog owner, boolean modal) ++ { ++ this(owner, "", modal, null); ++ } ++ ++ /** ++ * Creates a new non-modal JDialog using the ++ * given title and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ */ ++ public JDialog(Dialog owner, String title) ++ { ++ this(owner, title, false, null); ++ } ++ ++ /** ++ * Creates a new JDialog using the given modal ++ * settings, title, and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ */ ++ public JDialog(Dialog owner, String title, boolean modal) ++ { ++ this(owner, title, modal, null); ++ } ++ ++ /** ++ * Creates a new JDialog using the given modal ++ * settings, title, owner and graphics configuration. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ * @param gc The Graphics Configuration to use. ++ */ ++ public JDialog(Dialog owner, String title, boolean modal, ++ GraphicsConfiguration gc) ++ { ++ super(owner, title, modal, gc); ++ dialogInit(); ++ } ++ ++ /** ++ * Creates a new non-modal JDialog with no title ++ * using the given owner. ++ * ++ * @param owner The owner of the JDialog. ++ */ ++ public JDialog(Frame owner) ++ { ++ this(owner, "", false, null); ++ } ++ ++ /** ++ * Creates a new JDialog with no title using the ++ * given modal setting and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ */ ++ public JDialog(Frame owner, boolean modal) ++ { ++ this(owner, "", modal, null); ++ } ++ ++ /** ++ * Creates a new non-modal JDialog using the ++ * given title and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ */ ++ public JDialog(Frame owner, String title) ++ { ++ this(owner, title, false, null); ++ } ++ ++ /** ++ * Creates a new JDialog using the given modal ++ * settings, title, and owner. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ */ ++ public JDialog(Frame owner, String title, boolean modal) ++ { ++ this(owner, title, modal, null); ++ } ++ ++ /** ++ * Creates a new JDialog using the given modal ++ * settings, title, owner and graphics configuration. ++ * ++ * @param owner The owner of the JDialog. ++ * @param title The title of the JDialog. ++ * @param modal Whether the JDialog is modal. ++ * @param gc The Graphics Configuration to use. ++ */ ++ public JDialog(Frame owner, String title, boolean modal, ++ GraphicsConfiguration gc) ++ { ++ super((owner == null) ? SwingUtilities.getOwnerFrame() : owner, ++ title, modal, gc); ++ dialogInit(); ++ } ++ ++ /** ++ * This method is called to initialize the ++ * JDialog. It sets the layout used, the locale, ++ * and creates the RootPane. ++ */ ++ protected void dialogInit() ++ { ++ // FIXME: Do a check on GraphicsEnvironment.isHeadless() ++ setRootPaneCheckingEnabled(false); ++ setLocale(JComponent.getDefaultLocale()); ++ getRootPane(); // will do set/create ++ setRootPaneCheckingEnabled(true); ++ invalidate(); ++ ++ } ++ ++ /** ++ * This method returns whether JDialogs will have their ++ * window decorations provided by the Look and Feel. ++ * ++ * @return Whether the window decorations are Look and Feel provided. ++ */ ++ public static boolean isDefaultLookAndFeelDecorated() ++ { ++ return decorated; ++ } ++ ++ /** ++ * This method sets whether JDialogs will have their ++ * window decorations provided by the Look and Feel. ++ * ++ * @param defaultLookAndFeelDecorated Whether the window ++ * decorations are Look and Feel provided. ++ */ ++ public static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated) ++ { ++ decorated = defaultLookAndFeelDecorated; ++ } ++ ++ /** ++ * This method returns the preferred size of ++ * the JDialog. ++ * ++ * @return The preferred size. ++ */ + public Dimension getPreferredSize() + { + Dimension d = super.getPreferredSize(); + return d; + } + +- JMenuBar getJMenuBar() +- { return getRootPane().getJMenuBar(); } +- +- void setJMenuBar(JMenuBar menubar) +- { getRootPane().setJMenuBar(menubar); } +- ++ /** ++ * This method returns the JMenuBar used ++ * in this JDialog. ++ * ++ * @return The JMenuBar in the JDialog. ++ */ ++ public JMenuBar getJMenuBar() ++ { ++ return getRootPane().getJMenuBar(); ++ } + +- public void setLayout(LayoutManager manager) +- { super.setLayout(manager); } ++ /** ++ * This method sets the JMenuBar used ++ * in this JDialog. ++ * ++ * @param menubar The JMenuBar to use. ++ */ ++ public void setJMenuBar(JMenuBar menubar) ++ { ++ getRootPane().setJMenuBar(menubar); ++ } + +- void setLayeredPane(JLayeredPane layeredPane) +- { getRootPane().setLayeredPane(layeredPane); } +- +- JLayeredPane getLayeredPane() +- { return getRootPane().getLayeredPane(); } +- +- JRootPane getRootPane() +- { +- if (rootPane == null) +- setRootPane(createRootPane()); +- return rootPane; +- } +- +- void setRootPane(JRootPane root) +- { +- if (rootPane != null) +- remove(rootPane); +- +- rootPane = root; +- add(rootPane, BorderLayout.CENTER); +- } ++ /** ++ * This method sets the LayoutManager used in the JDialog. ++ * This method will throw an Error if rootPaneChecking is ++ * enabled. ++ * ++ * @param manager The LayoutManager to use. ++ */ ++ public void setLayout(LayoutManager manager) ++ { ++ if (isRootPaneCheckingEnabled()) ++ throw new Error("rootPaneChecking is enabled - cannot set layout."); ++ super.setLayout(manager); ++ } + +- JRootPane createRootPane() +- { return new JRootPane(); } ++ /** ++ * This method sets the JLayeredPane used in the JDialog. ++ * If the given JLayeredPane is null, then this method ++ * will throw an Error. ++ * ++ * @param layeredPane The JLayeredPane to use. ++ */ ++ public void setLayeredPane(JLayeredPane layeredPane) ++ { ++ if (layeredPane == null) ++ throw new IllegalComponentStateException("layeredPane cannot be null."); ++ getRootPane().setLayeredPane(layeredPane); ++ } + +- Container getContentPane() +- { return getRootPane().getContentPane(); } ++ /** ++ * This method returns the JLayeredPane used with this JDialog. ++ * ++ * @return The JLayeredPane used with this JDialog. ++ */ ++ public JLayeredPane getLayeredPane() ++ { ++ return getRootPane().getLayeredPane(); ++ } + +- void setContentPane(Container contentPane) +- { getRootPane().setContentPane(contentPane); } +- +- Component getGlassPane() +- { return getRootPane().getGlassPane(); } +- +- void setGlassPane(Component glassPane) +- { getRootPane().setGlassPane(glassPane); } ++ /** ++ * This method returns the JRootPane used with this JDialog. ++ * ++ * @return The JRootPane used with this JDialog. ++ */ ++ public JRootPane getRootPane() ++ { ++ if (rootPane == null) ++ setRootPane(createRootPane()); ++ return rootPane; ++ } + +- +- protected void addImpl(Component comp, Object constraints, int index) +- { super.addImpl(comp, constraints, index); } ++ /** ++ * This method sets the JRootPane used with this JDialog. ++ * ++ * @param root The JRootPane to use. ++ */ ++ protected void setRootPane(JRootPane root) ++ { ++ if (rootPane != null) ++ remove(rootPane); + ++ rootPane = root; ++ rootPane.show(); ++ add(rootPane); ++ } + +- public void remove(Component comp) +- { getContentPane().remove(comp); } +- +- protected boolean isRootPaneCheckingEnabled() +- { return checking; } ++ /** ++ * This method creates a new JRootPane. ++ * ++ * @return A new JRootPane. ++ */ ++ protected JRootPane createRootPane() ++ { ++ return new JRootPane(); ++ } + ++ /** ++ * This method returns the ContentPane ++ * in the JRootPane. ++ * ++ * @return The ContentPane in the JRootPane. ++ */ ++ public Container getContentPane() ++ { ++ return getRootPane().getContentPane(); ++ } + +- protected void setRootPaneCheckingEnabled(boolean enabled) +- { checking = enabled; } ++ /** ++ * This method sets the ContentPane to use with this ++ * JDialog. If the ContentPane given is null, this method ++ * will throw an exception. ++ * ++ * @param contentPane The ContentPane to use with the JDialog. ++ */ ++ public void setContentPane(Container contentPane) ++ { ++ if (contentPane == null) ++ throw new IllegalComponentStateException("contentPane cannot be null."); ++ getRootPane().setContentPane(contentPane); ++ } + ++ /** ++ * This method returns the GlassPane for this JDialog. ++ * ++ * @return The GlassPane for this JDialog. ++ */ ++ public Component getGlassPane() ++ { ++ return getRootPane().getGlassPane(); ++ } + +- public void update(Graphics g) +- { paint(g); } ++ /** ++ * This method sets the GlassPane for this JDialog. ++ * ++ * @param glassPane The GlassPane for this JDialog. ++ */ ++ public void setGlassPane(Component glassPane) ++ { ++ getRootPane().setGlassPane(glassPane); ++ } + +- protected void processKeyEvent(KeyEvent e) +- { super.processKeyEvent(e); } ++ /** ++ * This method is called when a component is added to the ++ * the JDialog. Calling this method with rootPaneCheckingEnabled ++ * will cause an Error to be thrown. ++ * ++ * @param comp The component to add. ++ * @param constraints The constraints. ++ * @param index The position of the component. ++ */ ++ protected void addImpl(Component comp, Object constraints, int index) ++ { ++ if (isRootPaneCheckingEnabled()) ++ throw new Error("rootPaneChecking is enabled - adding components disallowed."); ++ super.addImpl(comp, constraints, index); ++ } + +- ///////////////////////////////////////////////////////////////////////////////// +- ++ /** ++ * This method removes a component from the JDialog. ++ * ++ * @param comp The component to remove. ++ */ ++ public void remove(Component comp) ++ { ++ // The path changes if the component == root. ++ if (comp == rootPane) ++ super.remove(rootPane); ++ else ++ getContentPane().remove(comp); ++ } + +- protected void processWindowEvent(WindowEvent e) +- { +- // System.out.println("PROCESS_WIN_EV-1: " + e); +- super.processWindowEvent(e); +- // System.out.println("PROCESS_WIN_EV-2: " + e); +- switch (e.getID()) ++ /** ++ * This method returns whether rootPane checking is enabled. ++ * ++ * @return Whether rootPane checking is enabled. ++ */ ++ protected boolean isRootPaneCheckingEnabled() ++ { ++ return rootPaneCheckingEnabled; ++ } ++ ++ /** ++ * This method sets whether rootPane checking is enabled. ++ * ++ * @param enabled Whether rootPane checking is enabled. ++ */ ++ protected void setRootPaneCheckingEnabled(boolean enabled) ++ { ++ rootPaneCheckingEnabled = enabled; ++ } ++ ++ /** ++ * This method simply calls paint and returns. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void update(Graphics g) ++ { ++ paint(g); ++ } ++ ++ ++ /** ++ * This method handles window events. This allows the JDialog ++ * to honour its default close operation. ++ * ++ * @param e The WindowEvent. ++ */ ++ protected void processWindowEvent(WindowEvent e) ++ { ++ // System.out.println("PROCESS_WIN_EV-1: " + e); ++ super.processWindowEvent(e); ++ // System.out.println("PROCESS_WIN_EV-2: " + e); ++ switch (e.getID()) ++ { ++ case WindowEvent.WINDOW_CLOSING: ++ { ++ switch (getDefaultCloseOperation()) + { +- case WindowEvent.WINDOW_CLOSING: +- { +- switch(close_action) +- { +- case DISPOSE_ON_CLOSE: +- { +- System.out.println("user requested dispose on close"); +- dispose(); +- break; +- } +- case HIDE_ON_CLOSE: +- { +- setVisible(false); +- break; +- } +- case DO_NOTHING_ON_CLOSE: +- break; +- } +- break; +- } +- +- case WindowEvent.WINDOW_CLOSED: +- case WindowEvent.WINDOW_OPENED: +- case WindowEvent.WINDOW_ICONIFIED: +- case WindowEvent.WINDOW_DEICONIFIED: +- case WindowEvent.WINDOW_ACTIVATED: +- case WindowEvent.WINDOW_DEACTIVATED: ++ case DISPOSE_ON_CLOSE: ++ { ++ dispose(); ++ break; ++ } ++ case HIDE_ON_CLOSE: ++ { ++ setVisible(false); + break; ++ } ++ case DO_NOTHING_ON_CLOSE: ++ break; + } +- } +- ++ break; ++ } ++ case WindowEvent.WINDOW_CLOSED: ++ case WindowEvent.WINDOW_OPENED: ++ case WindowEvent.WINDOW_ICONIFIED: ++ case WindowEvent.WINDOW_DEICONIFIED: ++ case WindowEvent.WINDOW_ACTIVATED: ++ case WindowEvent.WINDOW_DEACTIVATED: ++ break; ++ } ++ } ++ ++ /** ++ * This method sets the action to take ++ * when the JDialog is closed. ++ * ++ * @param operation The action to take. ++ */ ++ public void setDefaultCloseOperation(int operation) ++ { ++ if (operation == DO_NOTHING_ON_CLOSE || ++ operation == HIDE_ON_CLOSE || ++ operation == DISPOSE_ON_CLOSE) ++ close_action = operation; ++ else ++ throw new IllegalArgumentException("Default close operation must be one of DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE"); ++ } + +- void setDefaultCloseOperation(int operation) +- { close_action = operation; } ++ /** ++ * This method returns the action taken when ++ * the JDialog is closed. ++ * ++ * @return The action to take. ++ */ ++ public int getDefaultCloseOperation() ++ { ++ return close_action; ++ } + +- protected String paramString() +- { return "JDialog"; } ++ /** ++ * This method returns a String describing the JDialog. ++ * ++ * @return A String describing the JDialog. ++ */ ++ protected String paramString() ++ { ++ return "JDialog"; ++ } + +- public AccessibleContext getAccessibleContext() +- { +- return null; +- } ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } + } +Index: javax/swing/JEditorPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JEditorPane.java,v +retrieving revision 1.2 +diff -u -r1.2 JEditorPane.java +--- javax/swing/JEditorPane.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JEditorPane.java 6 Sep 2004 16:35:55 -0000 +@@ -1,5 +1,5 @@ +-/* JEditorPane.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JEditorPane.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,189 +35,284 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Dimension; + import java.awt.event.KeyEvent; + import java.io.InputStream; ++import java.io.IOException; + import java.net.URL; ++ + import javax.accessibility.AccessibleContext; +-import javax.swing.text.EditorKit; +-import javax.swing.text.JTextComponent; +-import javax.swing.text.PlainEditorKit; + import javax.swing.event.HyperlinkEvent; + import javax.swing.event.HyperlinkListener; ++import javax.swing.text.DefaultEditorKit; ++import javax.swing.text.EditorKit; ++import javax.swing.text.JTextComponent; ++ + + public class JEditorPane extends JTextComponent + { +- URL page_url; +- EditorKit kit; +- String ctype = "text/plain"; +- boolean focus_root; +- boolean manages_focus; +- +- +- public JEditorPane() +- { +- } +- +- public JEditorPane(String url) +- { +- this(); +- setPage(url); +- } +- +- public JEditorPane(String type, String text) +- { +- ctype = text; +- setText(text); +- } +- +- public JEditorPane(URL url) +- { +- setPage(url); +- } +- +- void addHyperlinkListener(HyperlinkListener listener) +- { } +- +- protected EditorKit createDefaultEditorKit() +- { return new PlainEditorKit(); } +- +- static EditorKit createEditorKitForContentType(String type) +- { return new PlainEditorKit(); } +- +- void fireHyperlinkUpdate(HyperlinkEvent e) ++ private static final long serialVersionUID = 3140472492599046285L; ++ ++ URL page_url; ++ EditorKit kit; ++ String ctype = "text/plain"; ++ boolean focus_root; ++ boolean manages_focus; ++ ++ public JEditorPane() ++ { ++ } ++ ++ public JEditorPane(String url) throws IOException ++ { ++ setPage(url); ++ } ++ ++ public JEditorPane(String type, String text) + { ++ ctype = text; ++ setText(text); ++ } ++ ++ public JEditorPane(URL url) throws IOException ++ { ++ setPage(url); ++ } ++ ++ protected EditorKit createDefaultEditorKit() ++ { ++ return new DefaultEditorKit(); ++ } ++ ++ public static EditorKit createEditorKitForContentType(String type) ++ { ++ return new DefaultEditorKit(); ++ } ++ ++ /** ++ * Sends a given HyperlinkEvent to all registered listeners. ++ * ++ * @param event the event to send ++ */ ++ public void fireHyperlinkUpdate(HyperlinkEvent event) ++ { ++ HyperlinkListener[] listeners = getHyperlinkListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].hyperlinkUpdate(event); + } + + public AccessibleContext getAccessibleContext() +- { return null; } ++ { ++ return null; ++ } + +- String getContentType() +- { return ctype; } ++ public String getContentType() ++ { ++ return ctype; ++ } + +- EditorKit getEditorKit() +- { return kit; } +- +- static String getEditorKitClassNameForContentType(String type) +- { return "text/plain"; } +- +- EditorKit getEditorKitForContentType(String type) +- { return kit; } +- +- public Dimension getPreferredSize() +- { +- //Returns the preferred size for the JEditorPane. +- return super.getPreferredSize(); +- } ++ public EditorKit getEditorKit() ++ { ++ return kit; ++ } ++ ++ public static String getEditorKitClassNameForContentType(String type) ++ { ++ return "text/plain"; ++ } ++ ++ public EditorKit getEditorKitForContentType(String type) ++ { ++ return kit; ++ } ++ ++ /** ++ * Returns the preferred size for the JEditorPane. ++ */ ++ public Dimension getPreferredSize() ++ { ++ return super.getPreferredSize(); ++ } + + public boolean getScrollableTracksViewportHeight() +- { return false; } ++ { ++ return false; ++ } ++ + public boolean getScrollableTracksViewportWidth() +- { return false; } ++ { ++ return false; ++ } ++ ++ public URL getPage() ++ { ++ return page_url; ++ } + +- URL getPage() +- { return page_url; } ++ protected InputStream getStream(URL page) ++ { ++ try ++ { ++ return page.openStream(); ++ } ++ catch (Exception e) ++ { ++ System.out.println("Hhmmm, failed to open stream: " + e); ++ } ++ return null; ++ } + +- protected InputStream getStream(URL page) +- { +- try { +- return page.openStream(); +- } catch (Exception e) { +- System.out.println("Hhmmm, failed to open stream: " + e); +- } +- return null; +- } +- +- public String getText() +- { return super.getText(); } +- +- public String getUIClassID() +- { return "JEditorPane"; } +- +- public boolean isFocusCycleRoot() +- { return focus_root; } +- +- public boolean isManagingFocus() +- { return manages_focus; } +- +- protected String paramString() +- { return "JEditorPane"; } +- +- protected void processComponentKeyEvent(KeyEvent e) +- { +- //Overridden to handle processing of tab/shift tab. +- } +- ++ public String getText() ++ { ++ return super.getText(); ++ } ++ ++ public String getUIClassID() ++ { ++ return "EditorPaneUI"; ++ } ++ ++ public boolean isFocusCycleRoot() ++ { ++ return focus_root; ++ } ++ ++ public boolean isManagingFocus() ++ { ++ return manages_focus; ++ } ++ ++ protected String paramString() ++ { ++ return "JEditorPane"; ++ } ++ ++ /** ++ * Overridden to handle processing of tab/shift tab. ++ */ ++ protected void processComponentKeyEvent(KeyEvent e) ++ { ++ } ++ ++ /** ++ * Make sure that TAB and Shift-TAB events get consumed, ++ * so that awt doesn't attempt focus traversal. ++ */ + protected void processKeyEvent(KeyEvent e) +- { +- //Make sure that TAB and Shift-TAB events get consumed, so that awt doesn't attempt focus traversal. +- } +- +- void read(InputStream in, Object desc) +- { +- //This method initializes from a stream. +- } +- +- static void registerEditorKitForContentType(String type, String classname) +- { +- //Establishes the default bindings of type to classname. +- } +- +- static void registerEditorKitForContentType(String type, String classname, ClassLoader loader) +- { +- //Establishes the default bindings of type to classname. +- } +- +- void removeHyperlinkListener(HyperlinkListener listener) +- { +- //Removes a hyperlink listener. +- } +- +- void replaceSelection(String content) +- { +- //Replaces the currently selected content with new content represented by the given string. +- } +- +- protected void scrollToReference(String reference) +- { +- //Scrolls the view to the given reference location (that is, the value returned by the UL.getRef method for the URL being displayed). +- } +- +- void setContentType(String type) +- { +- ctype = type; +- invalidate(); +- repaint(); +- } +- +- void setEditorKit(EditorKit kit) +- { +- this.kit = kit; +- invalidate(); +- repaint(); +- } +- +- void setEditorKitForContentType(String type, EditorKit k) +- { +- ctype = type; +- setEditorKit(k); +- } +- +- void setPage(String url) +- { +- // Sets the current URL being displayed. +- } +- +- void setPage(URL page) +- { +- // Sets the current URL being displayed. +- } +- +- public void setText(String t) +- { +- super.setText(t); +- } +-} // class JEditorPane ++ { ++ } ++ ++ /** ++ * This method initializes from a stream. ++ */ ++ public void read(InputStream in, Object desc) ++ { ++ } ++ ++ /** ++ * Establishes the default bindings of type to classname. ++ */ ++ public static void registerEditorKitForContentType(String type, ++ String classname) ++ { ++ } ++ ++ /** ++ * Establishes the default bindings of type to classname. ++ */ ++ public static void registerEditorKitForContentType(String type, ++ String classname, ++ ClassLoader loader) ++ { ++ } ++ ++ /** ++ * Replaces the currently selected content with new content represented ++ * by the given string. ++ */ ++ public void replaceSelection(String content) ++ { ++ } ++ ++ /** ++ * Scrolls the view to the given reference location (that is, the value ++ * returned by the UL.getRef method for the URL being displayed). ++ */ ++ public void scrollToReference(String reference) ++ { ++ } ++ ++ public void setContentType(String type) ++ { ++ ctype = type; ++ invalidate(); ++ repaint(); ++ } ++ ++ public void setEditorKit(EditorKit kit) ++ { ++ this.kit = kit; ++ invalidate(); ++ repaint(); ++ } ++ ++ public void setEditorKitForContentType(String type, EditorKit k) ++ { ++ ctype = type; ++ setEditorKit(k); ++ } ++ ++ /** ++ * Sets the current URL being displayed. ++ */ ++ public void setPage(String url) throws IOException ++ { ++ } ++ ++ /** ++ * Sets the current URL being displayed. ++ */ ++ public void setPage(URL page) throws IOException ++ { ++ } ++ ++ public void setText(String t) ++ { ++ super.setText(t); ++ } ++ ++ /** ++ * Add a HyperlinkListener object to this editor pane. ++ * ++ * @param listener the listener to add ++ */ ++ public void addHyperlinkListener(HyperlinkListener listener) ++ { ++ listenerList.add(HyperlinkListener.class, listener); ++ } ++ ++ /** ++ * Removes a HyperlinkListener object to this editor pane. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeHyperlinkListener(HyperlinkListener listener) ++ { ++ listenerList.remove(HyperlinkListener.class, listener); ++ } ++ ++ /** ++ * Returns all added HyperlinkListener objects. ++ * ++ * @return array of listeners ++ * ++ * @since 1.4 ++ */ ++ public HyperlinkListener[] getHyperlinkListeners() ++ { ++ return (HyperlinkListener[]) getListeners(HyperlinkListener.class); ++ } ++} +Index: javax/swing/JFileChooser.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JFileChooser.java,v +retrieving revision 1.2 +diff -u -r1.2 JFileChooser.java +--- javax/swing/JFileChooser.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JFileChooser.java 6 Sep 2004 16:35:55 -0000 +@@ -59,53 +59,32 @@ + */ + public class JFileChooser extends JComponent implements Accessible { + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJFileChooser +- */ +- protected class AccessibleJFileChooser extends AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJFileChooser +- * @param component TODO +- */ +- protected AccessibleJFileChooser(JFileChooser component) { +- super(component); +- // TODO +- } // AccessibleJFileChooser() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.FILE_CHOOSER; +- } // getAccessibleRole() ++ private static final long serialVersionUID = 3162921138695327837L; + +- +- } // AccessibleJFileChooser +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++ /** ++ * AccessibleJFileChooser ++ */ ++ protected class AccessibleJFileChooser extends AccessibleJComponent ++ { ++ private static final long serialVersionUID = 8205148454060169244L; ++ ++ /** ++ * Constructor AccessibleJFileChooser ++ * @param component TODO ++ */ ++ protected AccessibleJFileChooser() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.FILE_CHOOSER; ++ } ++ } + + /** + * uiClassID +@@ -906,17 +885,24 @@ + * addActionListener + * @param listener TODO + */ +- public void addActionListener(ActionListener listener) { +- // TODO +- } // addActionListener() ++ public void addActionListener(ActionListener listener) ++ { ++ listenerList.add (ActionListener.class, listener); ++ } + + /** + * removeActionListener + * @param listener TODO + */ +- public void removeActionListener(ActionListener listener) { +- // TODO +- } // removeActionListener() ++ public void removeActionListener(ActionListener listener) ++ { ++ listenerList.remove (ActionListener.class, listener); ++ } ++ ++ public ActionListener[] getActionListeners() ++ { ++ return (ActionListener[]) listenerList.getListeners (ActionListener.class); ++ } + + /** + * fireActionPerformed +@@ -958,16 +944,15 @@ + return null; // TODO + } // paramString() + +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJFileChooser(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JFileChooser ++ /** ++ * getAccessibleContext ++ * @returns AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJFileChooser(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JFormattedTextField.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JFormattedTextField.java,v +retrieving revision 1.2 +diff -u -r1.2 JFormattedTextField.java +--- javax/swing/JFormattedTextField.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JFormattedTextField.java 6 Sep 2004 16:35:55 -0000 +@@ -1,5 +1,5 @@ + /* JFormattedTextField.java -- +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -52,14 +52,19 @@ + */ + public class JFormattedTextField extends JTextField + { ++ private static final long serialVersionUID = 5464657870110180632L; ++ + public abstract static class AbstractFormatter implements Serializable + { ++ private static final long serialVersionUID = -5193212041738979680L; ++ + public AbstractFormatter () + { + //Do nothing here. + } + + protected Object clone () ++ throws CloneNotSupportedException + { + throw new InternalError ("not implemented"); + } +@@ -99,14 +104,16 @@ + throw new InternalError ("not implemented"); + } + +- protected void setEditValid () ++ protected void setEditValid (boolean valid) + { + throw new InternalError ("not implemented"); + } + +- public abstract Object stringToValue (String text); ++ public abstract Object stringToValue (String text) ++ throws ParseException; + +- public abstract String valueToString (Object value); ++ public abstract String valueToString (Object value) ++ throws ParseException; + } + + public abstract static class AbstractFormatterFactory +@@ -124,9 +131,11 @@ + public static final int REVERT = 2; + public static final int PERSIST = 3; + ++ private Object value; ++ + public JFormattedTextField () + { +- throw new InternalError ("not implemented"); ++ this((AbstractFormatterFactory) null); + } + + public JFormattedTextField (Format format) +@@ -141,7 +150,7 @@ + + public JFormattedTextField (AbstractFormatterFactory factory) + { +- throw new InternalError ("not implemented"); ++ this(factory, null); + } + + public JFormattedTextField (AbstractFormatterFactory factory, Object value) +@@ -151,10 +160,11 @@ + + public JFormattedTextField (Object value) + { +- throw new InternalError ("not implemented"); ++ this.value = value; + } + + public void commitEdit () ++ throws ParseException + { + throw new InternalError ("not implemented"); + } +@@ -181,12 +191,12 @@ + + public String getUIClassID () + { +- throw new InternalError ("not implemented"); ++ return "FormattedTextFieldUI"; + } + + public Object getValue () + { +- throw new InternalError ("not implemented"); ++ return value; + } + + protected void invalidEdit () +@@ -204,9 +214,15 @@ + throw new InternalError ("not implemented"); + } + +- public void setDocument (Document document) ++ public void setDocument(Document newdoc) + { +- throw new InternalError ("not implemented"); ++ Document document = getDocument(); ++ ++ if (document == newdoc) ++ return; ++ ++ setDocument(newdoc); ++ firePropertyChange("document", document, newdoc); + } + + public void setLostFocusBehavior (int behavior) +@@ -224,8 +240,8 @@ + throw new InternalError ("not implemented"); + } + +- public void setValue (Object value) ++ public void setValue (Object newValue) + { +- throw new InternalError ("not implemented"); ++ value = newValue; + } + } +Index: javax/swing/JFrame.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JFrame.java,v +retrieving revision 1.3 +diff -u -r1.3 JFrame.java +--- javax/swing/JFrame.java 22 Nov 2003 00:03:35 -0000 1.3 ++++ javax/swing/JFrame.java 6 Sep 2004 16:35:55 -0000 +@@ -1,5 +1,5 @@ + /* JFrame.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,16 +38,17 @@ + + package javax.swing; + ++import java.awt.AWTEvent; + import java.awt.BorderLayout; + import java.awt.Component; + import java.awt.Container; + import java.awt.Dimension; + import java.awt.Frame; + import java.awt.Graphics; +-import java.awt.GraphicsConfiguration; + import java.awt.LayoutManager; + import java.awt.event.KeyEvent; + import java.awt.event.WindowEvent; ++ + import javax.accessibility.AccessibleContext; + + /** +@@ -56,17 +57,25 @@ + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ +-public class JFrame extends Frame ++public class JFrame extends Frame implements WindowConstants, RootPaneContainer + { +- public final static int HIDE_ON_CLOSE = 0; +- public final static int EXIT_ON_CLOSE = 1; +- public final static int DISPOSE_ON_CLOSE = 2; +- public final static int DO_NOTHING_ON_CLOSE = 3; ++ private static final long serialVersionUID = -3362141868504252139L; ++ ++ protected AccessibleContext accessibleContext; ++ ++ private int close_action = HIDE_ON_CLOSE; ++ ++ private static boolean defaultLookAndFeelDecorated = false; + +- protected AccessibleContext accessibleContext; ++ public static void setDefaultLookAndFeelDecorated(boolean d) ++ { ++ defaultLookAndFeelDecorated = d; ++ } + +- private int close_action = EXIT_ON_CLOSE; +- ++ public static boolean isDefaultLookAndFeelDecorated() ++ { ++ return defaultLookAndFeelDecorated; ++ } + + /*************************************************** + * +@@ -105,6 +114,7 @@ + protected void frameInit() + { + super.setLayout(new BorderLayout(1, 1)); ++ enableEvents(AWTEvent.WINDOW_EVENT_MASK); + getRootPane(); // will do set/create + } + +@@ -114,30 +124,30 @@ + return d; + } + +- JMenuBar getJMenuBar() ++ public JMenuBar getJMenuBar() + { return getRootPane().getJMenuBar(); } + +- void setJMenuBar(JMenuBar menubar) ++ public void setJMenuBar(JMenuBar menubar) + { getRootPane().setJMenuBar(menubar); } + + + public void setLayout(LayoutManager manager) + { super.setLayout(manager); } + +- void setLayeredPane(JLayeredPane layeredPane) ++ public void setLayeredPane(JLayeredPane layeredPane) + { getRootPane().setLayeredPane(layeredPane); } + +- JLayeredPane getLayeredPane() ++ public JLayeredPane getLayeredPane() + { return getRootPane().getLayeredPane(); } + +- JRootPane getRootPane() ++ public JRootPane getRootPane() + { + if (rootPane == null) + setRootPane(createRootPane()); + return rootPane; + } + +- void setRootPane(JRootPane root) ++ public void setRootPane(JRootPane root) + { + if (rootPane != null) + remove(rootPane); +@@ -146,19 +156,19 @@ + add(rootPane, BorderLayout.CENTER); + } + +- JRootPane createRootPane() ++ public JRootPane createRootPane() + { return new JRootPane(); } + +- public Container getContentPane() ++ public Container getContentPane() + { return getRootPane().getContentPane(); } + +- void setContentPane(Container contentPane) ++ public void setContentPane(Container contentPane) + { getRootPane().setContentPane(contentPane); } + +- Component getGlassPane() ++ public Component getGlassPane() + { return getRootPane().getGlassPane(); } + +- void setGlassPane(Component glassPane) ++ public void setGlassPane(Component glassPane) + { getRootPane().setGlassPane(glassPane); } + + +@@ -190,7 +200,7 @@ + return accessibleContext; + } + +- int getDefaultCloseOperation() ++ public int getDefaultCloseOperation() + { return close_action; } + + +@@ -201,9 +211,7 @@ + + protected void processWindowEvent(WindowEvent e) + { +- // System.out.println("PROCESS_WIN_EV-1: " + e); + super.processWindowEvent(e); +- // System.out.println("PROCESS_WIN_EV-2: " + e); + switch (e.getID()) + { + case WindowEvent.WINDOW_CLOSING: +@@ -212,13 +220,11 @@ + { + case EXIT_ON_CLOSE: + { +- System.out.println("user requested exit on close"); +- System.exit(1); ++ System.exit(0); + break; + } + case DISPOSE_ON_CLOSE: + { +- System.out.println("user requested dispose on close"); + dispose(); + break; + } +@@ -243,8 +249,30 @@ + } + } + +- +- void setDefaultCloseOperation(int operation) +- { close_action = operation; } ++ /** ++ * Defines what happens when this frame is closed. Can be one off ++ * EXIT_ON_CLOSE, ++ * DISPOSE_ON_CLOSE, ++ * HIDE_ON_CLOSE or ++ * DO_NOTHING_ON_CLOSE. ++ * The default is HIDE_ON_CLOSE. ++ * When EXIT_ON_CLOSE is specified this method calls ++ * SecurityManager.checkExit(0) which might throw a ++ * SecurityException. When the specified operation is ++ * not one of the above a IllegalArgumentException is ++ * thrown. ++ */ ++ public void setDefaultCloseOperation(int operation) ++ { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null && operation == EXIT_ON_CLOSE) ++ sm.checkExit(0); ++ ++ if (operation != EXIT_ON_CLOSE && operation != DISPOSE_ON_CLOSE ++ && operation != HIDE_ON_CLOSE && operation != DO_NOTHING_ON_CLOSE) ++ throw new IllegalArgumentException("operation = " + operation); ++ ++ close_action = operation; ++ } + + } +Index: javax/swing/JInternalFrame.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JInternalFrame.java,v +retrieving revision 1.2 +diff -u -r1.2 JInternalFrame.java +--- javax/swing/JInternalFrame.java 19 Jun 2003 16:30:09 -0000 1.2 ++++ javax/swing/JInternalFrame.java 6 Sep 2004 16:35:56 -0000 +@@ -1,5 +1,5 @@ + /* JInternalFrame.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,27 +35,1673 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.Color; + import java.awt.Component; + import java.awt.Container; ++import java.awt.Graphics; ++import java.awt.KeyboardFocusManager; ++import java.awt.LayoutManager; ++import java.awt.Rectangle; ++import java.beans.PropertyVetoException; + import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleValue; ++import javax.swing.event.InternalFrameEvent; ++import javax.swing.event.InternalFrameListener; ++import javax.swing.plaf.DesktopIconUI; ++import javax.swing.plaf.InternalFrameUI; ++ + +-public class JInternalFrame extends JComponent +-/*implements Accessible, WindowConstants, RootPaneContainer*/ ++/** ++ * This class implements a Swing widget that looks and acts like a native ++ * frame. The frame can be dragged, resized, closed, etc. Typically, ++ * JInternalFrames are placed in JDesktopPanes. The actions that the ++ * JInternalFrame performs (maximizing, minimizing, etc.) are performed by a ++ * DesktopManager. As with regular frames, components are added by calling ++ * frame.getContentPane().add. ++ */ ++public class JInternalFrame extends JComponent implements Accessible, ++ WindowConstants, ++ RootPaneContainer + { ++ /** DOCUMENT ME! */ + private static final long serialVersionUID = -5425177187760785402L; + +- public static final String CONTENT_PANE_PROPERTY = "contentPane"; +- public static final String MENU_BAR_PROPERTY = "JMenuBar"; +- public static final String TITLE_PROPERTY = "title"; +- public static final String LAYERED_PANE_PROPERTY = "layeredPane"; +- public static final String ROOT_PANE_PROPERTY = "rootPane"; +- public static final String GLASS_PANE_PROPERTY = "glassPane"; +- public static final String FRAME_ICON_PROPERTY = "frameIcon"; +- public static final String IS_SELECTED_PROPERTY = "selected"; +- public static final String IS_CLOSED_PROPERTY = "closed"; +- public static final String IS_MAXIMUM_PROPERTY = "maximum"; +- public static final String IS_ICON_PROPERTY = "icon"; ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJInternalFrame extends AccessibleJComponent ++ implements AccessibleValue ++ { ++ /** ++ * Creates a new AccessibleJInternalFrame object. ++ */ ++ protected AccessibleJInternalFrame() ++ { ++ super(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public String getAccessibleName() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param n DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean setCurrentAccessibleValue(Number n) ++ { ++ return false; ++ } ++ } ++ ++ /** ++ * This class represents the JInternalFrame while it is iconified. ++ */ ++ public static class JDesktopIcon extends JComponent implements Accessible ++ { ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJDesktopIcon extends AccessibleJComponent ++ implements AccessibleValue ++ { ++ /** ++ * Creates a new AccessibleJDesktopIcon object. ++ */ ++ protected AccessibleJDesktopIcon() ++ { ++ super(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param n DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean setCurrentAccessibleValue(Number n) ++ { ++ return false; ++ } ++ } ++ ++ /** The JInternalFrame this DesktopIcon represents. */ ++ JInternalFrame frame; ++ ++ /** ++ * Creates a new JDesktopIcon object for representing the given frame. ++ * ++ * @param f The JInternalFrame to represent. ++ */ ++ public JDesktopIcon(JInternalFrame f) ++ { ++ frame = f; ++ updateUI(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJDesktopIcon(); ++ return accessibleContext; ++ } ++ ++ /** ++ * This method returns the JDesktopPane this JDesktopIcon is in. ++ * ++ * @return The JDesktopPane this JDesktopIcon is in. ++ */ ++ public JDesktopPane getDesktopPane() ++ { ++ JDesktopPane p = (JDesktopPane) SwingUtilities.getAncestorOfClass(JDesktopPane.class, ++ this); ++ return p; ++ } ++ ++ /** ++ * This method returns the JInternalFrame this JDesktopIcon represents. ++ * ++ * @return The JInternalFrame this JDesktopIcon represents. ++ */ ++ public JInternalFrame getInternalFrame() ++ { ++ return frame; ++ } ++ ++ /** ++ * This method returns the UI that is responsible for the JDesktopIcon. ++ * ++ * @return The UI that is responsible for the JDesktopIcon. ++ */ ++ public DesktopIconUI getUI() ++ { ++ return (DesktopIconUI) ui; ++ } ++ ++ /** ++ * This method returns the String identifier that is used to determine ++ * which class is used for JDesktopIcon's UI. ++ * ++ * @return A String identifier for the UI class. ++ */ ++ public String getUIClassID() ++ { ++ return "DesktopIconUI"; ++ } ++ ++ /** ++ * This method sets the JInternalFrame that this JDesktopIcon represents. ++ * ++ * @param f The JInternalFrame that this JDesktopIcon represents. ++ */ ++ public void setInternalFrame(JInternalFrame f) ++ { ++ frame = f; ++ } ++ ++ /** ++ * This method sets the UI used for this JDesktopIcon. ++ * ++ * @param ui The UI to use. ++ */ ++ public void setUI(DesktopIconUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method restores the UI property to the defaults. ++ */ ++ public void updateUI() ++ { ++ setUI((DesktopIconUI) UIManager.getUI(this)); ++ } ++ } ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the contentPane property ++ * changes. ++ */ ++ public static String CONTENT_PANE_PROPERTY = "contentPane"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the frameIcon property ++ * changes. ++ */ ++ public static String FRAME_ICON_PROPERTY = "frameIcon"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the glassPane property ++ * changes. ++ */ ++ public static String GLASS_PANE_PROPERTY = "glassPane"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the closed property ++ * changes. ++ */ ++ public static String IS_CLOSED_PROPERTY = "closed"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the icon property ++ * changes. ++ */ ++ public static String IS_ICON_PROPERTY = "icon"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the maximum property ++ * changes. ++ */ ++ public static String IS_MAXIMUM_PROPERTY = "maximum"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the selected property ++ * changes. ++ */ ++ public static String IS_SELECTED_PROPERTY = "selected"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the layeredPane property ++ * changes. ++ */ ++ public static String LAYERED_PANE_PROPERTY = "layeredPane"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the jMenuBar property ++ * changes. ++ */ ++ public static String MENU_BAR_PROPERTY = "jMenuBar"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the rootPane property ++ * changes. ++ */ ++ public static String ROOT_PANE_PROPERTY = "rootPane"; ++ ++ /** ++ * The property fired in a PropertyChangeEvent when the title property ++ * changes. ++ */ ++ public static String TITLE_PROPERTY = "title"; ++ ++ /** Whether the JInternalFrame is closable. */ ++ protected boolean closable; ++ ++ /** Whether the JInternalFrame can be iconified. */ ++ protected boolean iconable; ++ ++ /** Whether the JInternalFrame is closed. */ ++ protected boolean isClosed; ++ ++ /** Whether the JInternalFrame has been iconified. */ ++ protected boolean isIcon; ++ ++ /** Whether the JInternalFrame has been maximized. */ ++ protected boolean isMaximum; ++ ++ /** Whether the JInternalFrame is the active frame. */ ++ protected boolean isSelected; ++ ++ /** Whether the JInternalFrame can be maximized. */ ++ protected boolean maximizable; ++ ++ /** Whether the JInternalFrame has rootPaneChecking enabled. */ ++ protected boolean rootPaneCheckingEnabled = true; ++ ++ /** Whether the JInternalFrame is resizable. */ ++ protected boolean resizable; ++ ++ /** ++ * The JDesktopIcon that represents the JInternalFrame while it is ++ * iconified. ++ */ ++ protected JDesktopIcon desktopIcon; ++ ++ /** The icon used in the JMenuBar in the TitlePane. */ ++ protected Icon frameIcon; ++ ++ /** The rootPane of the JInternalFrame. */ ++ protected JRootPane rootPane; ++ ++ /** The title on the TitlePane of the JInternalFrame. */ ++ protected String title; ++ ++ /** The bounds of the JInternalFrame before it was maximized. */ ++ private transient Rectangle storedBounds; ++ ++ /** The Component that receives focus by default. */ ++ private transient Component defaultFocus; ++ ++ /** The default close action taken, */ ++ private transient int defaultCloseOperation = DISPOSE_ON_CLOSE; ++ ++ /** Whether the JInternalFrame has become visible for the very first time. */ ++ private transient boolean isFirstTimeVisible = true; ++ ++ /** ++ * Whether the JInternalFrame is in the transition from being a maximized ++ * frame back to a regular sized frame. ++ */ ++ private transient boolean maxTransition = false; ++ ++ /** DOCUMENT ME! */ ++ private transient boolean wasIcon = false; ++ ++ /** ++ * Creates a new JInternalFrame object that has no title, and is ++ * non-resizable, non-maximizable, non-iconifiable, and non-closable. ++ */ ++ public JInternalFrame() ++ { ++ this(null, false, false, false, false); ++ } ++ ++ /** ++ * Creates a new JInternalFrame object with the given title and is ++ * non-resizable, non-maximizable, non-iconifiable, and non-closable. ++ * ++ * @param title The title displayed in the JInternalFrame. ++ */ ++ public JInternalFrame(String title) ++ { ++ this(title, false, false, false, false); ++ } ++ ++ /** ++ * Creates a new JInternalFrame object with the given title and resizable ++ * properties. The JInternalFrame is non-maximizable, non-iconifiable, and ++ * non-closable. ++ * ++ * @param title The title displayed in the JInternalFrame. ++ * @param resizable Whether the JInternalFrame is resizable. ++ */ ++ public JInternalFrame(String title, boolean resizable) ++ { ++ this(title, resizable, false, false, false); ++ } ++ ++ /** ++ * Creates a new JInternalFrame object with the given title, resizable, and ++ * closable properties. The JInternalFrame is non-maximizable and ++ * non-iconifiable. ++ * ++ * @param title The title displayed in the JInternalFrame. ++ * @param resizable Whether the JInternalFrame is resizable. ++ * @param closable Whether the JInternalFrame is closable. ++ */ ++ public JInternalFrame(String title, boolean resizable, boolean closable) ++ { ++ this(title, resizable, closable, false, false); ++ } ++ ++ /** ++ * Creates a new JInternalFrame object with the given title, resizable, ++ * closable and maximizable properties. The JInternalFrame is ++ * non-iconifiable. ++ * ++ * @param title The title displayed in the JInternalFrame. ++ * @param resizable Whether the JInternalFrame is resizable. ++ * @param closable Whether the JInternalFrame is closable. ++ * @param maximizable Whether the JInternalFrame is maximizable. ++ */ ++ public JInternalFrame(String title, boolean resizable, boolean closable, ++ boolean maximizable) ++ { ++ this(title, resizable, closable, maximizable, false); ++ } ++ ++ /** ++ * Creates a new JInternalFrame object with the given title, resizable, ++ * closable, maximizable and iconifiable properties. ++ * ++ * @param title The title displayed in the JInternalFrame. ++ * @param resizable Whether the JInternalFrame is resizable. ++ * @param closable Whether the JInternalFrame is closable. ++ * @param maximizable Whether the JInternalFrame is maximizable. ++ * @param iconifiable Whether the JInternalFrame is iconifiable. ++ */ ++ public JInternalFrame(String title, boolean resizable, boolean closable, ++ boolean maximizable, boolean iconifiable) ++ { ++ this.title = title; ++ this.resizable = resizable; ++ this.closable = closable; ++ this.maximizable = maximizable; ++ this.iconable = iconifiable; ++ storedBounds = new Rectangle(); ++ ++ setRootPaneCheckingEnabled(false); ++ setRootPane(createRootPane()); ++ ++ updateUI(); ++ setRootPaneCheckingEnabled(true); ++ } ++ ++ /** ++ * This method adds Components to this Container. For JInternalFrames, ++ * instead of calling add directly on the JInternalFrame, it should be ++ * called with JInternalFrame.getContentPane().add. If root pane checking ++ * is enabled, calling this method will cause an exception to be thrown. ++ * ++ * @param comp The Component to add. ++ * @param constraints The constraints on the Component added. ++ * @param index The position to place the Component. ++ * ++ * @throws Error DOCUMENT ME! ++ */ ++ protected void addImpl(Component comp, Object constraints, int index) ++ { ++ if (isRootPaneCheckingEnabled()) ++ throw new Error("Do not use add() on JInternalPane directly. Use getContentPane().add() instead"); ++ ++ super.addImpl(comp, constraints, index); ++ } ++ ++ /** ++ * This method adds an InternalFrameListener to this JInternalFrame. ++ * ++ * @param l The listener to add. ++ */ ++ public void addInternalFrameListener(InternalFrameListener l) ++ { ++ listenerList.add(InternalFrameListener.class, l); ++ } ++ ++ /** ++ * This method is used to create a root pane for the JInternalFrame. This ++ * method is called by the constructors. ++ * ++ * @return A root pane for the JInternalFrame to use. ++ */ ++ protected JRootPane createRootPane() ++ { ++ return new JRootPane(); ++ } ++ ++ /** ++ * This method makes this JInternalFrame invisible, unselected and closed. ++ * If this JInternalFrame is not closed already, it will fire an ++ * INTERNAL_FRAME_CLoSED event. This method is similar to setClosed but it ++ * doesn't give vetoable listeners a chance to veto and it will not fire an ++ * INTERNAL_FRAME_CLOSING event. ++ */ ++ public void dispose() ++ { ++ hide(); ++ JDesktopPane pane = getDesktopPane(); ++ if (pane != null) ++ pane.setSelectedFrame(null); ++ else ++ { ++ try ++ { ++ setSelected(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing if they don't want to be unselected. ++ } ++ } ++ isClosed = true; ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSED); ++ removeNotify(); ++ } ++ ++ /** ++ * This method is used for closing this JInternalFrame. It fires an ++ * INTERNAL_FRAME_CLOSING event and then performs the action specified by ++ * the default close operation. ++ */ ++ public void doDefaultCloseAction() ++ { ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING); ++ switch (getDefaultCloseOperation()) ++ { ++ case HIDE_ON_CLOSE: ++ hide(); ++ break; ++ case DISPOSE_ON_CLOSE: ++ dispose(); ++ break; ++ } ++ } ++ ++ /** ++ * This method fires an InternalFrameEvent to the listeners. ++ * ++ * @param id The type of event being fired. See InternalFrameEvent. ++ */ ++ protected void fireInternalFrameEvent(int id) ++ { ++ Object[] ifListeners = listenerList.getListenerList(); ++ InternalFrameEvent evt = new InternalFrameEvent(this, id); ++ switch (id) ++ { ++ case InternalFrameEvent.INTERNAL_FRAME_CLOSING: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]) ++ .internalFrameClosing(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_ACTIVATED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]) ++ .internalFrameActivated(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_CLOSED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]).internalFrameClosed(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]) ++ .internalFrameDeactivated(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]) ++ .internalFrameDeiconified(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_ICONIFIED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]) ++ .internalFrameIconified(evt); ++ } ++ break; ++ case InternalFrameEvent.INTERNAL_FRAME_OPENED: ++ for (int i = ifListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (ifListeners[i] == InternalFrameListener.class) ++ ((InternalFrameListener) ifListeners[i + 1]).internalFrameOpened(evt); ++ } ++ break; ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJInternalFrame(); ++ return accessibleContext; ++ } ++ ++ /** ++ * This method returns the Content Pane for this JInternalFrame. ++ * ++ * @return The Content Pane for this JInternalFrame. ++ */ ++ public Container getContentPane() ++ { ++ return getRootPane().getContentPane(); ++ } ++ ++ /** ++ * This method returns the default action taken when this JInternalFrame is ++ * closed. ++ * ++ * @return The default action taken when this JInternalFrame is closed. ++ */ ++ public int getDefaultCloseOperation() ++ { ++ return defaultCloseOperation; ++ } ++ ++ /** ++ * This method returns the JDesktopIcon that represents this JInternalFrame ++ * while it is iconified. ++ * ++ * @return The JDesktopIcon that represents this JInternalFrame while it is ++ * iconified. ++ */ ++ public JDesktopIcon getDesktopIcon() ++ { ++ if (desktopIcon == null) ++ desktopIcon = new JDesktopIcon(this); ++ return desktopIcon; ++ } ++ ++ /** ++ * This method searches this JInternalFrame ancestors for an instance of ++ * JDesktopPane. If one is found, it is returned. If none is found, then it ++ * will search the JDesktopIcon for a JDesktopPane. ++ * ++ * @return The JDesktopPane that this JInternalFrame belongs to. ++ */ ++ public JDesktopPane getDesktopPane() ++ { ++ JDesktopPane value = (JDesktopPane) SwingUtilities.getAncestorOfClass(JDesktopPane.class, ++ this); ++ if (value == null && desktopIcon != null) ++ value = desktopIcon.getDesktopPane(); ++ return value; ++ } ++ ++ /** ++ * This method returns null because this must always be the root of a focus ++ * traversal. ++ * ++ * @return null. ++ */ ++ public Container getFocusCycleRootAncestor() ++ { ++ // as defined. ++ return null; ++ } ++ ++ /** ++ * This method returns the child Component that will receive focus if this ++ * JInternalFrame is selected. ++ * ++ * @return The child Component that will receive focus. ++ */ ++ public Component getFocusOwner() ++ { ++ if (isSelected()) ++ { ++ Component focus = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); ++ if (SwingUtilities.isDescendingFrom(focus, this)) ++ { ++ defaultFocus = focus; ++ return focus; ++ } ++ } ++ return null; ++ } ++ ++ /** ++ * This method returns the Frame Icon (the icon used in the JInternalFrame ++ * TitlePane and iconified frame). ++ * ++ * @return The Frame Icon. ++ */ ++ public Icon getFrameIcon() ++ { ++ return frameIcon; ++ } ++ ++ /** ++ * This method returns the Glass Pane used with this JInternalFrame. ++ * ++ * @return The Glass Pane used with this JInternalFrame. ++ */ ++ public Component getGlassPane() ++ { ++ return getRootPane().getGlassPane(); ++ } ++ ++ /** ++ * This method returns an array of InternalFrameListeners that are listening ++ * to this JInternalFrame. ++ * ++ * @return An array of InternalFrameListeners that are listening to this ++ * JInternalFrame. ++ */ ++ public InternalFrameListener[] getInternalFrameListeners() ++ { ++ return (InternalFrameListener[]) listenerList.getListeners(InternalFrameListener.class); ++ } ++ ++ /** ++ * This method returns the JMenuBar for this JInternalFrame. ++ * ++ * @return The JMenuBar for this JInternalFrame. ++ */ ++ public JMenuBar getJMenuBar() ++ { ++ return getRootPane().getJMenuBar(); ++ } ++ ++ /** ++ * This method returns the layer that this JInternalFrame resides in. ++ * ++ * @return The layer that this JInternalFrame resides in. ++ */ ++ public int getLayer() ++ { ++ JDesktopPane pane = getDesktopPane(); ++ if (pane != null) ++ return pane.getLayer(this).intValue(); ++ return -1; ++ } ++ ++ /** ++ * This method returns the LayeredPane for this JInternalFrame. ++ * ++ * @return The LayeredPane for this JInternalFrame. ++ */ ++ public JLayeredPane getLayeredPane() ++ { ++ return getRootPane().getLayeredPane(); ++ } ++ ++ /** ++ * This method is deprecated. This method returns the JMenuBar for this ++ * JInternalFrame. ++ * ++ * @return The JMenuBar for this JInternalFrame. ++ */ ++ public JMenuBar getMenuBar() ++ { ++ return getJMenuBar(); ++ } ++ ++ /** ++ * This method returns the child Component that will receive focus when the ++ * JInternalFrame is selected. If the JInternalFrame is selected, this ++ * method returns getFocusOwner(). Otherwise, it will return the child ++ * Component that most recently requested focus. If that is null, then the ++ * initial focus Component is returned. If that is null, then the default ++ * focus component is returned. ++ * ++ * @return The most recent focus owner. ++ */ ++ public Component getMostRecentFocusOwner() ++ { ++ if (isSelected()) ++ return getFocusOwner(); ++ else ++ return defaultFocus; ++ } ++ ++ /** ++ * This method returns the bounds of the JInternalFrame if it is not ++ * maximized. If it is maximized, it returns the bounds of the ++ * JInternalFrame before it was maximized (the bounds that it will be ++ * restored to). ++ * ++ * @return A Rectangle that contains this JInternalFrame's normal bounds (or ++ * just its bounds if it is not maximized). ++ */ ++ public Rectangle getNormalBounds() ++ { ++ if (! isMaximum() && ! maxTransition) ++ return getBounds(); ++ else ++ return storedBounds; ++ } ++ ++ /** ++ * This method returns the Root Pane for this JInternalFrame. ++ * ++ * @return The Root Pane for this JInternalFrame. ++ */ ++ public JRootPane getRootPane() ++ { ++ return rootPane; ++ } ++ ++ /** ++ * This method sets the title of the JInternalFrame. ++ * ++ * @return The String displayed in the TitlePane of this JInternalFrame. ++ */ ++ public String getTitle() ++ { ++ return title; ++ } ++ ++ /** ++ * This method returns the UI used to represent the JInternalFrame. ++ * ++ * @return The UI used to represent the JInternalFrame. ++ */ ++ public InternalFrameUI getUI() ++ { ++ return (InternalFrameUI) ui; ++ } ++ ++ /** ++ * This method returns a String identifier that is used to determine which ++ * class acts as the JInternalFrame's UI. ++ * ++ * @return A String identifier to determine a UI class. ++ */ ++ public String getUIClassID() ++ { ++ return "InternalFrameUI"; ++ } ++ ++ /** ++ * This method returns null. ++ * ++ * @return null. ++ */ ++ public String getWarningString() ++ { ++ // as defined. ++ return null; ++ } ++ ++ /** ++ * This method deselects this JInternalFrame and hides it. ++ */ ++ public void hide() ++ { ++ JDesktopPane pane = getDesktopPane(); ++ if (pane != null) ++ pane.setSelectedFrame(null); ++ else ++ { ++ try ++ { ++ setSelected(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing. ++ } ++ } ++ super.hide(); ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame is closable. ++ * ++ * @return Whether this JInternalFrame is closable. ++ */ ++ public boolean isClosable() ++ { ++ return closable; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame has been closed. ++ * ++ * @return Whether this JInternalFrame is closed. ++ */ ++ public boolean isClosed() ++ { ++ return isClosed; ++ } ++ ++ /** ++ * This must always return true. ++ * ++ * @return True ++ */ ++ public boolean isFocusCycleRoot() ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame is currently iconified. ++ * ++ * @return Whether this JInternalFrame is currently iconified. ++ */ ++ public boolean isIcon() ++ { ++ return isIcon; ++ } ++ ++ /** ++ * This method returns whether the JInternalFrame can be iconified. ++ * ++ * @return Whether the JInternalFrame can be iconified. ++ */ ++ public boolean isIconifiable() ++ { ++ return iconable; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame can be maximized. ++ * ++ * @return Whether this JInternalFrame can be maximized. ++ */ ++ public boolean isMaximizable() ++ { ++ return maximizable; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame is currently maximized. ++ * ++ * @return Whether this JInternalFrame is maximized. ++ */ ++ public boolean isMaximum() ++ { ++ return isMaximum; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame is resizable. ++ * ++ * @return Whether this JInternalFrame is resizable. ++ */ ++ public boolean isResizable() ++ { ++ return resizable; ++ } ++ ++ /** ++ * This method returns whether root pane checking is enabled. If root pane ++ * checking is enabled, then calls to addImpl and setLayout will throw ++ * exceptions. ++ * ++ * @return Whether root pane checking is enabled. ++ */ ++ protected boolean isRootPaneCheckingEnabled() ++ { ++ return rootPaneCheckingEnabled; ++ } ++ ++ /** ++ * This method returns whether this JInternalFrame is selected. ++ * ++ * @return Whether this JInternalFrame is selected. ++ */ ++ public boolean isSelected() ++ { ++ return isSelected; ++ } ++ ++ /** ++ * A helper method that moves this JInternalFrame to the back if the parent ++ * is a JLayeredPane. ++ */ ++ public void moveToBack() ++ { ++ if (getParent() instanceof JLayeredPane) ++ ((JLayeredPane) getParent()).moveToBack(this); ++ } ++ ++ /** ++ * A helper method that moves this JInternalFrame to the front if the parent ++ * is a JLayeredPane. ++ */ ++ public void moveToFront() ++ { ++ if (getParent() instanceof JLayeredPane) ++ ((JLayeredPane) getParent()).moveToFront(this); ++ } ++ ++ /** ++ * This method causes the children of this JInternalFrame to be laid out. ++ * Before it begins, if this JInternalFrame is an icon, then it will be ++ * deiconified. If it is maximized, then it will be restored. If either ++ * operation fails, then this method will return. ++ */ ++ public void pack() ++ { ++ try ++ { ++ if (isIcon()) ++ setIcon(false); ++ else if (isMaximum()) ++ setMaximum(false); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing if they don't want to be restored first. ++ } ++ doLayout(); ++ } ++ ++ /** ++ * This method is overridden to allow for speedier painting while this ++ * JInternalFramme is being dragged. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ protected void paintComponent(Graphics g) ++ { ++ super.paintComponent(g); ++ } ++ ++ /** ++ * This method returns a String describing this JInternalFrame. ++ * ++ * @return A String describing this JInternalFrame. ++ */ ++ protected String paramString() ++ { ++ return "JInternalFrame"; ++ } ++ ++ /** ++ * This method removes the given Component from the Container. ++ * ++ * @param comp The Component to remove. ++ */ ++ public void remove(Component comp) ++ { ++ super.remove(comp); ++ } ++ ++ /** ++ * This method removes an InternalFrameListener from this JInternalFrame. ++ * ++ * @param l The listener to remove. ++ */ ++ public void removeInternalFrameListener(InternalFrameListener l) ++ { ++ listenerList.remove(InternalFrameListener.class, l); ++ } ++ ++ /** ++ * This method resizes and positions this JInternalFrame. It also forces a ++ * relayout of the Container. ++ * ++ * @param x The x position of this JInternalFrame. ++ * @param y The y position of this JInternalFrame. ++ * @param width The width of this JInternalFrame. ++ * @param height The height of this JInternalFrame. ++ */ ++ public void reshape(int x, int y, int width, int height) ++ { ++ super.reshape(x, y, width, height); ++ invalidate(); ++ doLayout(); ++ } ++ ++ /** ++ * This method gives focus to the last child Component that had focus. This ++ * is used by the UI when this JInternalFrame is activated. ++ */ ++ public void restoreSubcomponentFocus() ++ { ++ Component c = getMostRecentFocusOwner(); ++ if (c != null) ++ c.requestFocus(); ++ } ++ ++ /** ++ * This method sets whether this JInternalFrame can be closed. ++ * ++ * @param b Whether this JInternalFrame can be closed. ++ */ ++ public void setClosable(boolean b) ++ { ++ closable = b; ++ } ++ ++ /** ++ * This method closes the JInternalFrame if the given boolean is true. If it ++ * is false, then the result of this method is unspecified. If the ++ * JInternalFrame is closed, this method does nothing. This method will ++ * first fire an INTERNAL_FRAME_CLOSING event and give a chance for veto ++ * listeners to cancel the close. If no listener vetoes the change, the ++ * closed property is set to true and the JInternalFrame is hidden and ++ * unselected. The method will finish by firing an INTERNAL_FRAME_CLOSED ++ * event. ++ * ++ * @param b Whether the JInternalFrame will be closed. ++ * ++ * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. ++ */ ++ public void setClosed(boolean b) throws PropertyVetoException ++ { ++ if (b && ! isClosed()) ++ { ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING); ++ fireVetoableChange(IS_CLOSED_PROPERTY, false, true); ++ ++ isClosed = b; ++ ++ firePropertyChange(IS_CLOSED_PROPERTY, false, true); ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSED); ++ } ++ } ++ ++ /** ++ * This method sets the Container to be used as a Content Pane for this ++ * JInternalFrame. ++ * ++ * @param c The Container to use as a Content Pane. ++ */ ++ public void setContentPane(Container c) ++ { ++ if (c != getContentPane()) ++ { ++ Container old = getContentPane(); ++ getRootPane().setContentPane(c); ++ firePropertyChange(CONTENT_PANE_PROPERTY, old, c); ++ } ++ } ++ ++ /** ++ * This method sets the action taken when this JInternalFrame is closed. ++ * ++ * @param operation One of DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE or ++ * DISPOSE_ON_CLOSE. ++ * ++ * @throws Error If the given operation is not one of the allowed modes. ++ */ ++ public void setDefaultCloseOperation(int operation) ++ { ++ if (operation != DO_NOTHING_ON_CLOSE || operation != HIDE_ON_CLOSE ++ || operation != DISPOSE_ON_CLOSE) ++ throw new Error("Close operation must be one of DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE"); ++ defaultCloseOperation = operation; ++ } ++ ++ /** ++ * This method sets the JDesktopIcon that represents this JInternalFrame ++ * while it is iconified. ++ * ++ * @param d The JDesktopIcon that represents this JInternalFrame while it is ++ * iconified. ++ */ ++ public void setDesktopIcon(JDesktopIcon d) ++ { ++ d.setInternalFrame(this); ++ desktopIcon = d; ++ } ++ ++ /** ++ * This method does nothing because this must be the root of a focus ++ * traversal cycle. ++ * ++ * @param focusCycleRoot Not used. ++ */ ++ public final void setFocusCycleRoot(boolean focusCycleRoot) ++ { ++ // Do nothing ++ } ++ ++ /** ++ * This method sets the Icon to be used in two places. The first is icon ++ * that is painted at the top left corner of the JInternalFrame when it is ++ * not iconified (clicking on that icon will activate the TitlePane ++ * JMenuBar). When the JInternalFrame is iconified, it will be the icon ++ * displayed in the JDesktopIcon. If no icon is set, the JInternalFrame ++ * will use a Look and Feel default. ++ * ++ * @param icon The Icon used in the TitlePane JMenuBar and iconified frames. ++ */ ++ public void setFrameIcon(Icon icon) ++ { ++ if (icon != frameIcon) ++ { ++ Icon old = frameIcon; ++ frameIcon = icon; ++ firePropertyChange(FRAME_ICON_PROPERTY, old, frameIcon); ++ } ++ } ++ ++ /** ++ * This method sets the Glass Pane used with this JInternalFrame. ++ * ++ * @param glass The Glass Pane to use with this JInternalFrame. ++ */ ++ public void setGlassPane(Component glass) ++ { ++ if (glass != getGlassPane()) ++ { ++ Component old = getGlassPane(); ++ getRootPane().setGlassPane(glass); ++ firePropertyChange(GLASS_PANE_PROPERTY, old, glass); ++ } ++ } ++ ++ /** ++ * This method iconifies or deiconifies this JInternalFrame given the ++ * boolean argument. If the JInternalFrame becomes iconified, it will fire ++ * an INTERNAL_FRAME_ICONIFIED event. If the JInternalFrame becomes ++ * deiconified, it will fire anINTERNAL_FRAME_DEICONIFIED event. ++ * ++ * @param b Whether this JInternalFrame is to be iconified or deiconified. ++ * ++ * @throws PropertyVetoException DOCUMENT ME! ++ */ ++ public void setIcon(boolean b) throws PropertyVetoException ++ { ++ if (b != isIcon()) ++ { ++ fireVetoableChange(IS_ICON_PROPERTY, b, isIcon); ++ ++ isIcon = b; ++ ++ firePropertyChange(IS_ICON_PROPERTY, ! isIcon, isIcon); ++ if (b) ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ICONIFIED); ++ else ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED); ++ } ++ } ++ ++ /** ++ * This method sets whether the JInternalFrame can be iconified. (This means ++ * that the JInternalFrame can be turned into an icon if minimized). ++ * ++ * @param b Whether the JInternalFrame can be iconified. ++ */ ++ public void setIconifiable(boolean b) ++ { ++ iconable = b; ++ } ++ ++ /** ++ * This method sets the JMenuBar to be used with this JInternalFrame. ++ * ++ * @param b The JMenuBar to be used with this JInternalFrame. ++ */ ++ public void setJMenuBar(JMenuBar b) ++ { ++ getRootPane().setJMenuBar(b); ++ } ++ ++ /** ++ * A helper method that set the layer that this JInternalFrame resides in. ++ * Using this version of the method means that the user should not set it ++ * to values that are already defined in JLayeredPane. If predefined values ++ * are to be used, the user should use the setLayer(Integer) version. ++ * ++ * @param layer The layer to place this JInternalFrame in. ++ */ ++ public void setLayer(int layer) ++ { ++ setLayer(new Integer(layer)); ++ } ++ ++ /** ++ * A helper method that sets the layer that this JInternalFrame resides in. ++ * Calling this version of the method should use layer values that are ++ * already defined in JLayeredPane. ++ * ++ * @param layer The layer to place this JInternalFrame in. ++ */ ++ public void setLayer(Integer layer) ++ { ++ JDesktopPane p = getDesktopPane(); ++ if (p != null) ++ { ++ int pos = p.getPosition(this); ++ p.setLayer(this, layer.intValue(), pos); ++ } ++ } ++ ++ /** ++ * This method sets the JLayeredPane to use with this JInternalFrame. ++ * ++ * @param layered The JLayeredPane to use as a layeredPane. ++ */ ++ public void setLayeredPane(JLayeredPane layered) ++ { ++ if (layered != getLayeredPane()) ++ { ++ JLayeredPane old = getLayeredPane(); ++ getRootPane().setLayeredPane(layered); ++ firePropertyChange(LAYERED_PANE_PROPERTY, old, layered); ++ } ++ } ++ ++ /** ++ * This method sets whether the JInternalFrame can be maximized. ++ * ++ * @param b Whether this JInternalFrame can be maximized. ++ */ ++ public void setMaximizable(boolean b) ++ { ++ maximizable = b; ++ } ++ ++ /** ++ * This method sets the Layout Manager used in the JInternalFrame. SetLayout ++ * should not be called on the JInternalFrame directly. Instead, it should ++ * be called with JInternalFrame.getContentPane().setLayout. Calls to this ++ * method with root pane checking enabled will cause exceptions to be ++ * thrown. ++ * ++ * @param manager The Layout Manager to be used with the JInternalFrame. ++ * ++ * @throws Error If rootPaneChecking is enabled. ++ */ ++ public void setLayout(LayoutManager manager) ++ { ++ if (isRootPaneCheckingEnabled()) ++ throw new Error("Cannot set layout. Use getContentPane().setLayout() instead."); ++ super.setLayout(manager); ++ } ++ ++ /** ++ * This method sets the JInternalFrame to maximized (if the given argument ++ * is true) or restores the JInternalFrame to its normal bounds otherwise. ++ * ++ * @param b Whether this JInteralFrame will be maximized or restored. ++ * ++ * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. ++ */ ++ public void setMaximum(boolean b) throws PropertyVetoException ++ { ++ if (b != isMaximum()) ++ { ++ fireVetoableChange(IS_MAXIMUM_PROPERTY, b, isMaximum); ++ isMaximum = b; ++ if (b) ++ setNormalBounds(getBounds()); ++ maxTransition = ! b; ++ firePropertyChange(IS_MAXIMUM_PROPERTY, ! isMaximum, isMaximum); ++ maxTransition = false; ++ } ++ } ++ ++ /** ++ * This method is deprecated. This method sets the JMenuBar used with this ++ * JInternalFrame. ++ * ++ * @param m The JMenuBar to use with this JInternalFrame. ++ */ ++ public void setMenuBar(JMenuBar m) ++ { ++ setJMenuBar(m); ++ } ++ ++ /** ++ * This method sets the bounds that this JInternalFrame will be restored to. ++ * ++ * @param r The bounds that this JInternalFrame will be restored to. ++ */ ++ public void setNormalBounds(Rectangle r) ++ { ++ storedBounds.setBounds(r.x, r.y, r.width, r.height); ++ } ++ ++ /** ++ * This method sets whether the JInternalFrame can be resized by a user ++ * action (like dragging at the frame borders). ++ * ++ * @param b Whether this JInternalFramer can be resized. ++ */ ++ public void setResizable(boolean b) ++ { ++ resizable = b; ++ } ++ ++ /** ++ * This method sets the Root Pane for this JInternalFrame. ++ * ++ * @param root The Root Pane for this JInternalFrame. ++ */ ++ protected void setRootPane(JRootPane root) ++ { ++ if (rootPane != null) ++ remove(rootPane); ++ ++ rootPane = root; ++ add(root); ++ } ++ ++ /** ++ * This method sets whether root pane checking is enabled. If root pane ++ * checking is enabled, then calls to addImpl and setLayout will throw ++ * exceptions. ++ * ++ * @param enabled Whether root pane checking is enabled. ++ */ ++ protected void setRootPaneCheckingEnabled(boolean enabled) ++ { ++ rootPaneCheckingEnabled = enabled; ++ } ++ ++ /** ++ * This method sets whether this JInternalFrame is the selected frame in the ++ * JDesktopPane (or other container). When selected, a JInternalFrame will ++ * have focus and paint its TitlePane differently (usually a different ++ * colour). If this method selects the frame, this JInternalFrame will fire ++ * an INTERNAL_FRAME_ACTIVATED event. If it deselects this frame, it will ++ * fire an INTERNAL_FRAME_DEACTIVATED event. ++ * ++ * @param selected Whether this JInternalFrame will become selected or ++ * deselected. ++ * ++ * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. ++ */ ++ public void setSelected(boolean selected) throws PropertyVetoException ++ { ++ if (selected != isSelected()) ++ { ++ fireVetoableChange(IS_SELECTED_PROPERTY, selected, isSelected); ++ ++ if (! selected) ++ defaultFocus = getMostRecentFocusOwner(); ++ ++ isSelected = selected; ++ ++ if (selected) ++ restoreSubcomponentFocus(); ++ ++ firePropertyChange(IS_SELECTED_PROPERTY, ! isSelected, isSelected); ++ ++ if (isSelected) ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED); ++ else ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED); ++ } ++ } ++ ++ /** ++ * This method sets the title displayed in the TitlePane of this ++ * JInternalFrame. ++ * ++ * @param title The title displayed. ++ */ ++ public void setTitle(String title) ++ { ++ if (title == null && this.title == null) ++ return; ++ if (title == null || this.title == null || ! this.title.equals(title)) ++ { ++ String old = title; ++ this.title = title; ++ firePropertyChange(TITLE_PROPERTY, old, this.title); ++ } ++ } ++ ++ /** ++ * This method displays the JInternalFrame. If it is not visible, this ++ * method will bring this JInternalFrame to the front, make it visible and ++ * select it. If this is the first time this JInternalFrame is made ++ * visible, an INTERNAL_FRAME_OPENED event will be fired. ++ */ ++ public void show() ++ { ++ if (! isVisible()) ++ { ++ moveToFront(); ++ super.show(); ++ ++ JDesktopPane pane = getDesktopPane(); ++ if (pane != null) ++ pane.setSelectedFrame(this); ++ else ++ { ++ try ++ { ++ setSelected(true); ++ } ++ catch (PropertyVetoException e) ++ { ++ // Do nothing. if they don't want to be selected. ++ } ++ } ++ if (isFirstTimeVisible) ++ { ++ isFirstTimeVisible = false; ++ fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_OPENED); ++ } ++ } ++ } ++ ++ /** ++ * This method is used to set the UI responsible for the JInternalFrame. ++ * ++ * @param ui The UI responsible for the JInternalFrame. ++ */ ++ public void setUI(InternalFrameUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method causes the JInternalFrame to be brough to back in the ++ * z-order. ++ */ ++ public void toBack() ++ { ++ moveToBack(); ++ } ++ ++ /** ++ * This method causes the JInternalFrame to be brought to front in the ++ * z-order. ++ */ ++ public void toFront() ++ { ++ moveToFront(); ++ } ++ ++ /** ++ * This method resets the UI to the Look and Feel defaults. ++ */ ++ public void updateUI() ++ { ++ setUI((InternalFrameUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * This helper method allows JInternalFrames to signal that they were ++ * iconned for the first time. ++ * ++ * @param b Whether the JInternalFrame was iconned. ++ * @param ID The identifier of the property change event to fire if the ++ * JInternalFrame is iconned for the first time. ++ */ ++ void setWasIcon(boolean b, String ID) ++ { ++ if (b && ! wasIcon) ++ { ++ wasIcon = b; ++ firePropertyChange(ID, ! b, b); ++ } ++ } ++ ++ /** ++ * This helper method returns whether the JInternalFrame has been iconned ++ * once already. ++ * ++ * @return Whether the JInternalFrame has been iconned once already. ++ */ ++ boolean getWasIcon() ++ { ++ return wasIcon; ++ } ++ ++ /** ++ * This method is a convenience method to fire vetoable property changes. ++ * ++ * @param name The identifier of the property change. ++ * @param oldValue The old value. ++ * @param newValue The new value. ++ * ++ * @throws PropertyVetoException Fired if a vetoable change listener vetoes ++ * the change. ++ */ ++ private void fireVetoableChange(String name, boolean oldValue, ++ boolean newValue) ++ throws PropertyVetoException ++ { ++ super.fireVetoableChange(name, new Boolean(oldValue), new Boolean(newValue)); ++ } + } // class JInternalFrame +Index: javax/swing/JLabel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JLabel.java,v +retrieving revision 1.2 +diff -u -r1.2 JLabel.java +--- javax/swing/JLabel.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JLabel.java 6 Sep 2004 16:35:56 -0000 +@@ -1,5 +1,5 @@ +-/* JLabel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JLabel.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,203 +35,662 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Component; ++import java.awt.Font; + import java.awt.Image; ++import java.awt.event.KeyEvent; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; ++import javax.swing.Icon; + import javax.swing.plaf.LabelUI; + ++ ++/** ++ *

    ++ * A swing widget that displays a text message and/or an icon. ++ *

    ++ */ + public class JLabel extends JComponent implements Accessible, SwingConstants + { +- String text; +- Icon icon; +- int gap; +- int align; +- +- int hor_align; +- int hor_text_pos; +- +- int vert_align; +- int vert_text_pos; +- +- public JLabel() +- { +- this("", null, 0); +- } +- +- public JLabel(Icon image) +- { +- this("", image, 0); +- } +- +- public JLabel(Icon image, int horizontalAlignment) +- { +- this("", image, horizontalAlignment); +- } +- +- public JLabel(String text) +- { +- this(text, null, 0); +- } +- +- public JLabel(String text, int horizontalAlignment) +- { +- this(text, null, horizontalAlignment); +- } +- +- public JLabel(String text, Icon icon, int horizontalAlignment) +- { +- // do the work..... +- this.text = text; +- setIcon(icon); +- this.align = horizontalAlignment; +- +- updateUI(); // get a proper ui +- } +- +- +- protected int checkHorizontalKey(int key, String message) +- { +- // Verify that key is a legal value for the horizontalAlignment properties. +- return 0; +- } +- protected int checkVerticalKey(int key, String message) +- { +- // Verify that key is a legal value for the verticalAlignment or verticalTextPosition properties. +- return 0; +- } +- public AccessibleContext getAccessibleContext() +- { +- // Get the AccessibleContext of this object +- return null; +- } +- public Icon getDisabledIcon() +- { +- // Returns the value of the disabledIcon property if it's been set, If it hasn't been set and the value of the icon property is an ImageIcon, we compute a "grayed out" version of the icon and update the disabledIcon property with that. +- return null; +- } +- public int getDisplayedMnemonic() +- { +- // Return the keycode that indicates a mnemonic key. +- return 0; +- } +- public int getHorizontalAlignment() +- { +- // Returns the alignment of the label's contents along the X axis. +- return hor_align; +- } +- public int getHorizontalTextPosition() +- { +- // Returns the horizontal position of the label's text, relative to its image. +- return hor_text_pos; +- } +- +- public Icon getIcon() +- { return icon; } +- +- public int getIconTextGap() +- { +- // Returns the amount of space between the text and the icon displayed in this label. +- return 0; +- } +- public Component getLabelFor() +- { +- // Get the component this is labelling. +- return null; +- } +- public String getText() +- { return text; } +- +- public String getUIClassID() +- { return "JLabel"; } +- +- public int getVerticalAlignment() +- { +- // Returns the alignment of the label's contents along the Y axis. +- return vert_align; +- } +- public int getVerticalTextPosition() +- { +- // Returns the vertical position of the label's text, relative to its image. +- return vert_text_pos; +- } +- +- public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) +- { +- // This is overriden to return false if the current Icon's Image is not equal to the passed in Image img. +- return (img == icon); +- } +- protected String paramString() +- { +- // Returns a string representation of this JLabel. +- return "JLabel"; +- } +- public void setDisabledIcon(Icon disabledIcon) +- { +- // Set the icon to be displayed if this JLabel is "disabled" (JLabel.setEnabled(false)). +- } +- public void setDisplayedMnemonic(char aChar) +- { +- // Specifies the displayedMnemonic as a char value. +- } +- public void setDisplayedMnemonic(int key) +- { +- // Specify a keycode that indicates a mnemonic key. +- } +- public void setHorizontalAlignment(int alignment) +- { +- // Sets the alignment of the label's contents along the X axis. +- hor_align = alignment; +- } +- public void setHorizontalTextPosition(int textPosition) +- { +- // Sets the horizontal position of the label's text, relative to its image. +- hor_text_pos = textPosition; +- } +- public void setIcon(Icon icon) +- { +- this.icon = icon; +- if (icon != null) +- { +- // XXX FIXME - icons do not know their parent +-// icon.setParent(this); +- } +- revalidate(); +- repaint(); +- } +- +- public void setIconTextGap(int iconTextGap) +- { +- gap = iconTextGap; +- } +- +- public void setLabelFor(Component c) +- { +- // Set the component this is labelling. +- } +- public void setText(String text) +- { +- this.text = text; +- revalidate(); +- repaint(); +- } +- +- public void setVerticalAlignment(int alignment) +- { +- // Sets the alignment of the label's contents along the Y axis. +- vert_align = alignment; +- } +- public void setVerticalTextPosition(int textPosition) +- { +- // Sets the vertical position of the label's text, relative to its image. +- vert_text_pos = textPosition; +- } +- public void updateUI() +- { +- LabelUI b = (LabelUI)UIManager.getUI(this); +- setUI(b); +- } ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 5496508283662221534L; ++ ++ /** ++ * The Component the label will give focus to when its mnemonic is ++ * activated. ++ */ ++ protected Component labelFor; ++ ++ /** The label's text. */ ++ private transient String text; ++ ++ /** Where the label will be positioned horizontally. */ ++ private transient int horizontalAlignment = LEADING; ++ ++ /** Where the label text will be placed horizontally relative to the icon. */ ++ private transient int horizontalTextPosition = TRAILING; ++ ++ /** Where the label will be positioned vertically. */ ++ private transient int verticalAlignment = CENTER; ++ ++ /** Where the label text will be place vertically relative to the icon. */ ++ private transient int verticalTextPosition = CENTER; ++ ++ /** The icon painted when the label is enabled. */ ++ private transient Icon icon; ++ ++ /** The icon painted when the label is disabled. */ ++ private transient Icon disabledIcon; ++ ++ /** The label's mnemnonic key. */ ++ private transient int displayedMnemonic = KeyEvent.VK_UNDEFINED; ++ ++ /** The index of the menemonic character in the text. */ ++ private transient int displayedMnemonicIndex = -1; ++ ++ /** The gap between the icon and the text. */ ++ private transient int iconTextGap = 4; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "disabledIcon" property changes. ++ */ ++ public static final String DISABLED_ICON_CHANGED_PROPERTY = "disabledIcon"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "displayedMnemonic" property ++ * changes. ++ */ ++ public static final String DISPLAYED_MNEMONIC_CHANGED_PROPERTY = "displayedMnemonic"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "displayedMnemonicIndex" property ++ * changes. ++ */ ++ public static final String DISPLAYED_MNEMONIC_INDEX_CHANGED_PROPERTY = "displayedMnemonicIndex"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "horizontalAlignment" property ++ * changes. ++ */ ++ public static final String HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY = "horizontalAlignment"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "horizontalTextPosition" property ++ * changes. ++ */ ++ public static final String HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY = "horizontalTextPosition"; ++ ++ /** Fired in a PropertyChangeEvent when the "icon" property changes. */ ++ public static final String ICON_CHANGED_PROPERTY = "icon"; ++ ++ /** Fired in a PropertyChangeEvent when the "iconTextGap" property changes. */ ++ public static final String ICON_TEXT_GAP_CHANGED_PROPERTY = "iconTextGap"; ++ ++ /** Fired in a PropertyChangeEvent when the "labelFor" property changes. */ ++ public static final String LABEL_FOR_CHANGED_PROPERTY = "labelFor"; ++ ++ /** Fired in a PropertyChangeEvent when the "text" property changes. */ ++ public static final String TEXT_CHANGED_PROPERTY = "text"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "verticalAlignment" property ++ * changes. ++ */ ++ public static final String VERTICAL_ALIGNMENT_CHANGED_PROPERTY = "verticalAlignment"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "verticalTextPosition" property ++ * changes. ++ */ ++ public static final String VERTICAL_TEXT_POSITION_CHANGED_PROPERTY = "verticalTextPosition"; ++ ++ /** ++ * Creates a new horizontally and vertically centered JLabel object with no ++ * text and no icon. ++ */ ++ public JLabel() ++ { ++ this(null, null, CENTER); ++ } ++ ++ /** ++ * Creates a new horizontally and vertically centered JLabel object with no ++ * text and the given icon. ++ * ++ * @param image The icon to use with the label. ++ */ ++ public JLabel(Icon image) ++ { ++ this(null, image, CENTER); ++ } ++ ++ /** ++ * Creates a new vertically centered JLabel object with no text and the ++ * given icon and horizontal alignment. By default, the text is TRAILING ++ * the image. ++ * ++ * @param image The icon to use with the label. ++ * @param horizontalAlignment The horizontal alignment of the label. ++ */ ++ public JLabel(Icon image, int horizontalAlignment) ++ { ++ this(null, image, horizontalAlignment); ++ } ++ ++ /** ++ * Creates a new horizontally and vertically centered JLabel object with no ++ * icon and the given text. ++ * ++ * @param text The text to use with the label. ++ */ ++ public JLabel(String text) ++ { ++ this(text, null, CENTER); ++ } ++ ++ /** ++ * Creates a new vertically centered JLabel object with no icon and the ++ * given text and horizontal alignment. ++ * ++ * @param text The text to use with the label. ++ * @param horizontalAlignment The horizontal alignment of the label. ++ */ ++ public JLabel(String text, int horizontalAlignment) ++ { ++ this(text, null, horizontalAlignment); ++ } ++ ++ /** ++ * Creates a new vertically centered JLabel object with the given text, ++ * icon, and horizontal alignment. ++ * ++ * @param text The text to use with the label. ++ * @param icon The icon to use with the label. ++ * @param horizontalAlignment The horizontal alignment of the label. ++ */ ++ public JLabel(String text, Icon icon, int horizontalAlignment) ++ { ++ this.text = text; ++ this.icon = icon; ++ this.horizontalAlignment = horizontalAlignment; ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the label's UI delegate. ++ * ++ * @return The label's UI delegate. ++ */ ++ public LabelUI getUI() ++ { ++ return (LabelUI) ui; ++ } ++ ++ /** ++ * This method sets the label's UI delegate. ++ * ++ * @param ui The label's UI delegate. ++ */ ++ public void setUI(LabelUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method resets the label's UI delegate to the default UI for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((LabelUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for this label. ++ * ++ * @return The UIClass identifier. "LabelUI" ++ */ ++ public String getUIClassID() ++ { ++ return "LabelUI"; ++ } ++ ++ /** ++ * This method is used primarily for debugging purposes and returns a string ++ * that can be used to represent this label. ++ * ++ * @return A string to represent this label. ++ */ ++ protected String paramString() ++ { ++ return "JLabel"; ++ } ++ ++ /** ++ * This method returns the label text. ++ * ++ * @return The label text. ++ */ ++ public String getText() ++ { ++ return text; ++ } ++ ++ /** ++ * This method changes the "text" property. The given text will be painted ++ * in the label. ++ * ++ * @param newText The label's text. ++ */ ++ public void setText(String newText) ++ { ++ if (text != newText) ++ { ++ String oldText = text; ++ text = newText; ++ firePropertyChange(TEXT_CHANGED_PROPERTY, oldText, newText); ++ ++ if (text != null && text.length() <= displayedMnemonicIndex) ++ setDisplayedMnemonicIndex(text.length() - 1); ++ } ++ } ++ ++ /** ++ * This method returns the active icon. The active icon is painted when the ++ * label is enabled. ++ * ++ * @return The active icon. ++ */ ++ public Icon getIcon() ++ { ++ return icon; ++ } ++ ++ /** ++ * This method changes the "icon" property. This icon (the active icon) will ++ * be the one displayed when the label is enabled. ++ * ++ * @param newIcon The active icon. ++ */ ++ public void setIcon(Icon newIcon) ++ { ++ if (icon != newIcon) ++ { ++ Icon oldIcon = icon; ++ icon = newIcon; ++ firePropertyChange(ICON_CHANGED_PROPERTY, oldIcon, newIcon); ++ } ++ } ++ ++ /** ++ * This method returns the disabled icon. The disabled icon is painted when ++ * the label is disabled. If the disabled icon is null and the active icon ++ * is an ImageIcon, this method returns a grayed version of the icon. The ++ * grayed version of the icon becomes the disabledIcon. ++ * ++ * @return The disabled icon. ++ */ ++ public Icon getDisabledIcon() ++ { ++ if (disabledIcon == null && icon instanceof ImageIcon) ++ disabledIcon = new ImageIcon(GrayFilter.createDisabledImage(((ImageIcon) icon) ++ .getImage())); ++ ++ return disabledIcon; ++ } ++ ++ /** ++ * This method changes the "disabledIcon" property. This icon (the disabled ++ * icon) will be the one displayed when the label is disabled. ++ * ++ * @param newIcon The disabled icon. ++ */ ++ public void setDisabledIcon(Icon newIcon) ++ { ++ if (disabledIcon != newIcon) ++ { ++ Icon oldIcon = disabledIcon; ++ disabledIcon = newIcon; ++ firePropertyChange(DISABLED_ICON_CHANGED_PROPERTY, oldIcon, newIcon); ++ } ++ } ++ ++ /** ++ * This method sets the keycode that will be the label's mnemonic. If the ++ * label is used as a label for another component, the label will give ++ * focus to that component when the mnemonic is activated. ++ * ++ * @param mnemonic The keycode to use for the mnemonic. ++ */ ++ public void setDisplayedMnemonic(int mnemonic) ++ { ++ if (displayedMnemonic != mnemonic) ++ { ++ firePropertyChange(DISPLAYED_MNEMONIC_CHANGED_PROPERTY, ++ displayedMnemonic, mnemonic); ++ displayedMnemonic = mnemonic; ++ ++ if (text != null) ++ setDisplayedMnemonicIndex(text.indexOf(mnemonic)); ++ } ++ } ++ ++ /** ++ * This method sets the character that will be the mnemonic used. If the ++ * label is used as a label for another component, the label will give ++ * focus to that component when the mnemonic is activated. ++ * ++ * @param mnemonic The character to use for the mnemonic. ++ */ ++ public void setDisplayedMnemonic(char mnemonic) ++ { ++ setDisplayedMnemonic((int) mnemonic); ++ } ++ ++ /** ++ * This method returns the keycode that is used for the label's mnemonic. ++ * ++ * @return The keycode that is used for the label's mnemonic. ++ */ ++ public int getDisplayedMnemonic() ++ { ++ return (int) displayedMnemonic; ++ } ++ ++ /** ++ * This method sets which character in the text will be the underlined ++ * character. If the given index is -1, then this indicates that there is ++ * no mnemonic. If the index is less than -1 or if the index is equal to ++ * the length, this method will throw an IllegalArgumentException. ++ * ++ * @param newIndex The index of the character to underline. ++ * ++ * @throws IllegalArgumentException If index less than -1 or index equals ++ * length. ++ */ ++ public void setDisplayedMnemonicIndex(int newIndex) ++ throws IllegalArgumentException ++ { ++ if (newIndex < -1 || (text != null && newIndex >= text.length())) ++ throw new IllegalArgumentException(); ++ ++ if (text == null || text.charAt(newIndex) != displayedMnemonic) ++ newIndex = -1; ++ ++ if (newIndex != displayedMnemonicIndex) ++ { ++ firePropertyChange(DISPLAYED_MNEMONIC_INDEX_CHANGED_PROPERTY, ++ displayedMnemonicIndex, newIndex); ++ displayedMnemonicIndex = newIndex; ++ } ++ } ++ ++ /** ++ * This method returns which character in the text will be the underlined ++ * character. ++ * ++ * @return The index of the character that will be underlined. ++ */ ++ public int getDisplayedMnemonicIndex() ++ { ++ return displayedMnemonicIndex; ++ } ++ ++ /** ++ * This method ensures that the key is valid as a horizontal alignment. ++ * Valid keys are: LEFT, CENTER, RIGHT, LEADING, TRAILING ++ * ++ * @param key The key to check. ++ * @param message The message of the exception to be thrown if the key is ++ * invalid. ++ * ++ * @return The key if it's valid. ++ * ++ * @throws IllegalArgumentException If the key is invalid. ++ */ ++ protected int checkHorizontalKey(int key, String message) ++ { ++ if (key != LEFT && key != CENTER && key != RIGHT && key != LEADING ++ && key != TRAILING) ++ throw new IllegalArgumentException(message); ++ else ++ return key; ++ } ++ ++ /** ++ * This method ensures that the key is valid as a vertical alignment. Valid ++ * keys are: TOP, CENTER, and BOTTOM. ++ * ++ * @param key The key to check. ++ * @param message The message of the exception to be thrown if the key is ++ * invalid. ++ * ++ * @return The key if it's valid. ++ * ++ * @throws IllegalArgumentException If the key is invalid. ++ */ ++ protected int checkVerticalKey(int key, String message) ++ { ++ if (key != TOP && key != BOTTOM && key != CENTER) ++ throw new IllegalArgumentException(message); ++ else ++ return key; ++ } ++ ++ /** ++ * This method returns the gap between the icon and the text. ++ * ++ * @return The gap between the icon and the text. ++ */ ++ public int getIconTextGap() ++ { ++ return iconTextGap; ++ } ++ ++ /** ++ * This method changes the "iconTextGap" property. The iconTextGap ++ * determines how much space there is between the icon and the text. ++ * ++ * @param newGap The gap between the icon and the text. ++ */ ++ public void setIconTextGap(int newGap) ++ { ++ if (iconTextGap != newGap) ++ { ++ firePropertyChange(ICON_TEXT_GAP_CHANGED_PROPERTY, iconTextGap, newGap); ++ iconTextGap = newGap; ++ } ++ } ++ ++ /** ++ * This method returns the vertical alignment of the label. ++ * ++ * @return The vertical alignment of the label. ++ */ ++ public int getVerticalAlignment() ++ { ++ return verticalAlignment; ++ } ++ ++ /** ++ * This method changes the "verticalAlignment" property of the label. The ++ * vertical alignment determines how where the label will be placed ++ * vertically. If the alignment is not valid, it will default to the ++ * center. ++ * ++ * @param alignment The vertical alignment of the label. ++ */ ++ public void setVerticalAlignment(int alignment) ++ { ++ if (alignment != verticalAlignment) ++ { ++ int oldAlignment = verticalAlignment; ++ verticalAlignment = checkVerticalKey(alignment, "verticalAlignment"); ++ firePropertyChange(VERTICAL_ALIGNMENT_CHANGED_PROPERTY, oldAlignment, ++ verticalAlignment); ++ } ++ } ++ ++ /** ++ * This method returns the horziontal alignment of the label. ++ * ++ * @return The horizontal alignment of the label. ++ */ ++ public int getHorizontalAlignment() ++ { ++ return horizontalAlignment; ++ } ++ ++ /** ++ * This method changes the "horizontalAlignment" property. The horizontal ++ * alignment determines where the label will be placed horizontally. ++ * ++ * @param alignment The horizontal alignment of the label. ++ */ ++ public void setHorizontalAlignment(int alignment) ++ { ++ int oldAlignment = horizontalAlignment; ++ horizontalAlignment = checkHorizontalKey(alignment, "horizontalAlignment"); ++ firePropertyChange(HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY, oldAlignment, ++ horizontalAlignment); ++ } ++ ++ /** ++ * This method returns the vertical text position of the label. ++ * ++ * @return The vertical text position of the label. ++ */ ++ public int getVerticalTextPosition() ++ { ++ return verticalTextPosition; ++ } ++ ++ /** ++ * This method changes the "verticalTextPosition" property of the label. The ++ * vertical text position determines where the text will be placed ++ * vertically relative to the icon. ++ * ++ * @param textPosition The vertical text position. ++ */ ++ public void setVerticalTextPosition(int textPosition) ++ { ++ if (textPosition != verticalTextPosition) ++ { ++ int oldPos = verticalTextPosition; ++ verticalTextPosition = checkVerticalKey(textPosition, ++ "verticalTextPosition"); ++ firePropertyChange(VERTICAL_TEXT_POSITION_CHANGED_PROPERTY, oldPos, ++ verticalTextPosition); ++ } ++ } ++ ++ /** ++ * This method returns the horizontal text position of the label. ++ * ++ * @return The horizontal text position. ++ */ ++ public int getHorizontalTextPosition() ++ { ++ return horizontalTextPosition; ++ } ++ ++ /** ++ * This method changes the "horizontalTextPosition" property of the label. ++ * The horizontal text position determines where the text will be placed ++ * horizontally relative to the icon. ++ * ++ * @param textPosition The horizontal text position. ++ */ ++ public void setHorizontalTextPosition(int textPosition) ++ { ++ if (textPosition != horizontalTextPosition) ++ { ++ int oldPos = horizontalTextPosition; ++ horizontalTextPosition = checkHorizontalKey(textPosition, ++ "horizontalTextPosition"); ++ firePropertyChange(HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY, oldPos, ++ horizontalTextPosition); ++ } ++ } ++ ++ /** ++ * This method simply returns false if the current icon image (current icon ++ * will depend on whether the label is enabled) is not equal to the passed ++ * in image. ++ * ++ * @param img The image to check. ++ * @param infoflags The bitwise inclusive OR of ABORT, ALLBITS, ERROR, ++ * FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, and WIDTH ++ * @param x The x position ++ * @param y The y position ++ * @param w The width ++ * @param h The height ++ * ++ * @return Whether the current icon image is equal to the image given. ++ */ ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, ++ int h) ++ { ++ Icon currIcon = isEnabled() ? icon : disabledIcon; ++ ++ // XXX: Is this the correct way to check for image equality? ++ if (currIcon != null && currIcon instanceof ImageIcon) ++ return (((ImageIcon) currIcon).getImage() == img); ++ ++ return false; ++ } ++ ++ /** ++ * This method returns the component that the label gives focus to when the ++ * mnemonic is activated. ++ * ++ * @return The component that gets focus when the label's mnemonic is ++ * activated. ++ */ ++ public Component getLabelFor() ++ { ++ return labelFor; ++ } ++ ++ /** ++ * This method changes the "labelFor" property. The component that the label ++ * is acting as a label for will request focus when the label's mnemonic ++ * is activated. ++ * ++ * @param c The component that gets focus when the label's mnemonic is ++ * activated. ++ */ ++ public void setLabelFor(Component c) ++ { ++ if (c != labelFor) ++ { ++ firePropertyChange(LABEL_FOR_CHANGED_PROPERTY, labelFor, c); ++ labelFor = c; ++ } ++ } ++ ++ /** ++ * This method overrides setFont so that we can call for a repaint after the ++ * font is changed. ++ * ++ * @param f The font for this label. ++ */ ++ public void setFont(Font f) ++ { ++ super.setFont(f); ++ repaint(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } + } +Index: javax/swing/JLayeredPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JLayeredPane.java,v +retrieving revision 1.6 +diff -u -r1.6 JLayeredPane.java +--- javax/swing/JLayeredPane.java 9 Jan 2004 22:52:18 -0000 1.6 ++++ javax/swing/JLayeredPane.java 6 Sep 2004 16:35:56 -0000 +@@ -82,17 +82,18 @@ + *
    An offset into a layer's "logical drawing order". Layer position 0 + * is drawn last. Layer position -1 is a synonym for the first layer + * position (the logical "bottom").
    ++ * + * + *

    Note: the layer numbering order is the reverse of the + * component indexing and position order

    + * + * @author Graydon Hoare + */ +- + public class JLayeredPane extends JComponent implements Accessible + { +- +- public static String LAYER_PROPERTY = "LAYER_PROPERTY"; ++ private static final long serialVersionUID = 5534920399324590459L; ++ ++ public static final String LAYER_PROPERTY = "layeredContainerLayer"; + + public static Integer FRAME_CONTENT_LAYER = new Integer (-30000); + +@@ -105,7 +106,7 @@ + TreeMap layers; // Layer Number (Integer) -> Layer Size (Integer) + Hashtable componentToLayer; // Component -> Layer Number (Integer) + +- JLayeredPane() ++ public JLayeredPane() + { + layers = new TreeMap (); + componentToLayer = new Hashtable (); +@@ -152,7 +153,7 @@ + Map.Entry pair = (Map.Entry) i.next(); + Integer layerNum = (Integer) pair.getKey (); + Integer layerSz = (Integer) pair.getValue (); +- if (layerNum == layer) ++ if (layerNum.intValue() == layer.intValue()) + { + ret[0] = ret[1] - layerSz.intValue (); + return ret; +@@ -313,7 +314,7 @@ + int bot = range[1]; + if (position == -1) + position = (bot - top) - 1; +- int targ = top + position; ++ int targ = Math.min(top + position, bot-1); + int curr = -1; + + Component[] comps = getComponents(); +@@ -330,7 +331,7 @@ + throw new IllegalArgumentException (); + + super.swapComponents (curr, targ); +- validate(); ++ revalidate(); + repaint(); + } + +@@ -493,6 +494,8 @@ + decrLayer (layer); + componentToLayer.remove (c); + super.remove (index); ++ revalidate(); ++ repaint(); + } + + /** +@@ -536,9 +539,10 @@ + int layer, + int position) + { +- componentToLayer.put (c, getObjectForLayer (layer)); ++ remove(c); ++ add(c, getObjectForLayer (layer)); + setPosition(c, position); +- validate(); ++ revalidate(); + repaint(); + } + +@@ -563,13 +567,13 @@ + else + layer = DEFAULT_LAYER; + +- int newIdx = insertIndexForLayer(layer.intValue (), -1); ++ int newIdx = insertIndexForLayer(layer.intValue (), index); + + componentToLayer.put (comp, layer); + incrLayer (layer); + + super.addImpl(comp, null, newIdx); +- validate(); ++ revalidate(); + repaint(); + } + } +Index: javax/swing/JList.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JList.java,v +retrieving revision 1.2 +diff -u -r1.2 JList.java +--- javax/swing/JList.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JList.java 6 Sep 2004 16:35:56 -0000 +@@ -1,4 +1,4 @@ +-/* JList.java -- ++/* JList.java -- + Copyright (C) 2002, 2003 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -35,204 +35,1164 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Color; ++import java.awt.Component; ++import java.awt.ComponentOrientation; + import java.awt.Dimension; ++import java.awt.Point; + import java.awt.Rectangle; + import java.util.Vector; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.swing.event.ListDataEvent; + import javax.swing.event.ListDataListener; ++import javax.swing.event.ListSelectionEvent; + import javax.swing.event.ListSelectionListener; + import javax.swing.plaf.ListUI; + +-public class JList extends JComponent implements Accessible, Scrollable +-{ +- Color select_back, select_fore; +- ListCellRenderer render; +- int visibles = 8; +- +- ListModel model; +- ListSelectionModel sel_model; +- +- public JList() +- { +- init(); +- } +- +- public JList(Object[] listData) +- { +- init(); +- setListData(listData); +- } +- +- +- public JList(Vector listData) +- { +- init(); +- setListData(listData); +- } +- +- +- public JList(ListModel listData) +- { +- init(); +- setModel(listData); +- } +- void init() +- { +- render = new DefaultCellRenderer(); +- +- sel_model = new DefaultListSelectionModel(); +- setModel(new DefaultListModel()); + +- select_back = new Color(0,0,255); +- select_fore = new Color(255,255,255); +- +- updateUI(); +- } +- +- +- public int getVisibleRowCount() +- { return visibles; } +- public void setVisibleRowCount(int visibleRowCount) +- { +- visibles = visibleRowCount; +- invalidate(); +- repaint(); +- } +- +- void addListSelectionListener(ListSelectionListener listener) +- { sel_model.addListSelectionListener(listener); } +- void removeListSelectionListener(ListSelectionListener listener) +- { sel_model.removeListSelectionListener(listener); } +- +- void setSelectionMode(int a) +- { sel_model.setSelectionMode(a); } +- void setSelectedIndex(int a) +- { sel_model.setSelectionInterval(a,a); } +- int getSelectedIndex() +- { return sel_model.getMinSelectionIndex(); } +- Object getSelectedValue() +- { +- int index = getSelectedIndex(); +- if (index == -1) +- return null; +- return getModel().getElementAt(index); +- } +- +- Color getSelectionBackground() +- { return select_back; } +- Color getSelectionForeground() +- { return select_fore; } ++/** ++ *

    This class is a facade over three separate objects: {@link ++ * javax.swing.ListModel}, {@link javax.swing.ListSelectionModel} and ++ * {@link javax.swing.plaf.ListUI}. The facade represents a unified "list" ++ * concept, with independently replacable (possibly client-provided) models ++ * for its contents and its current selection. In addition, each element in ++ * the list is rendered via a strategy class {@link ++ * javax.swing.ListCellRenderer}.

    ++ * ++ *

    Lists have many properties, some of which are stored in this class ++ * while others are delegated to the list's model or selection. The ++ * following properties are available:

    ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Property Stored inBound?
    accessibleContext list no
    anchorSelectionIndex selectionno
    cellRenderer list yes
    dragEnabled list no
    firstVisibleIndex list no
    fixedCellHeight list yes
    fixedCellWidth list yes
    lastVisibleIndex list no
    layoutOrientation list yes
    leadSelectionIndex selectionno
    maxSelectionIndex selectionno
    minSelectionIndex selectionno
    model list yes
    opaque list no
    preferredScrollableViewportSizelist no
    prototypeCellValue list yes
    scrollableTracksViewportHeight list no
    scrollableTracksViewportWidth list no
    selectedIndex selectionno
    selectedIndices selectionno
    selectedValue model no
    selectedValues model no
    selectionBackground list yes
    selectionEmpty selectionno
    selectionForeground list yes
    selectionMode selectionno
    selectionModel list yes
    UI list yes
    UIClassID list no
    valueIsAdjusting list no
    visibleRowCount list no
    ++ * ++ * @author Graydon Hoare (graydon@redhat.com) ++ */ + ++public class JList extends JComponent implements Accessible, Scrollable ++{ ++ private static final long serialVersionUID = 4406629526391098046L; + +- public void setListData(final Object[] listData) ++ /** ++ * Constant value used in "layoutOrientation" property. This value means ++ * that cells are laid out in a single vertical column. This is the default. ++ */ ++ public static final int VERTICAL = 0; ++ ++ /** ++ * Constant value used in "layoutOrientation" property. This value means ++ * that cells are laid out in multiple columns "newspaper style", filling ++ * vertically first, then horizontally. ++ */ ++ public static final int VERTICAL_WRAP = 1; ++ ++ /** ++ * Constant value used in "layoutOrientation" property. This value means ++ * that cells are laid out in multiple columns "newspaper style", ++ * filling horizontally first, then vertically. ++ */ ++ public static final int HORIZONTAL_WRAP = 2; ++ ++ /** Fired in a PropertyChangeEvent when the "cellRenderer" property changes. */ ++ public static final String CELL_RENDERER_PROPERTY_CHANGED = "cellRenderer"; ++ ++ /** Fired in a PropertyChangeEvent when the "fixedCellHeight" property changes. */ ++ public static final String FIXED_CELL_HEIGHT_PROPERTY_CHANGED = "fixedCellHeight"; ++ ++ /** Fired in a PropertyChangeEvent when the "fixedCellWidth" property changes. */ ++ public static final String FIXED_CELL_WIDTH_PROPERTY_CHANGED = "fixedCellWidth"; ++ ++ /** Fired in a PropertyChangeEvent when the "layoutOrientation" property changes. */ ++ public static final String LAYOUT_ORIENTATION_PROPERTY_CHANGED = "layoutOrientation"; ++ ++ /** Fired in a PropertyChangeEvent when the "model" property changes. */ ++ public static final String MODEL_PROPERTY_CHANGED = "model"; ++ ++ /** Fired in a PropertyChangeEvent when the "prototypeCellValue" property changes. */ ++ public static final String PROTOTYPE_CELL_VALUE_PROPERTY_CHANGED = "prototypeCellValue"; ++ ++ /** Fired in a PropertyChangeEvent when the "selectionBackground" property changes. */ ++ public static final String SELECTION_BACKGROUND_PROPERTY_CHANGED = "selectionBackground"; ++ ++ /** Fired in a PropertyChangeEvent when the "selectionForeground" property changes. */ ++ public static final String SELECTION_FOREGROUND_PROPERTY_CHANGED = "selectionForeground"; ++ ++ /** Fired in a PropertyChangeEvent when the "selectionModel" property changes. */ ++ public static final String SELECTION_MODEL_PROPERTY_CHANGED = "selectionModel"; ++ ++ ++ /** ++ * This property indicates whether "drag and drop" functions are enabled ++ * on the list. ++ */ ++ boolean dragEnabled; ++ ++ /** This property provides a strategy for rendering cells in the list. */ ++ ListCellRenderer cellRenderer; ++ ++ /** ++ * This property indicates an fixed width to assign to all cells in the ++ * list. If its value is -1, no width has been ++ * assigned. This value can be set explicitly, or implicitly by setting ++ * the {@link #prototypeCellValue} property. ++ */ ++ int fixedCellWidth; ++ ++ /** ++ * This property indicates an fixed height to assign to all cells in the ++ * list. If its value is -1, no height has been ++ * assigned. This value can be set explicitly, or implicitly by setting ++ * the {@link #prototypeCellValue} property. ++ */ ++ int fixedCellHeight; ++ ++ /** ++ * This property holds the current layout orientation of the list, which ++ * is one of the integer constants {@link #VERTICAL}, {@link ++ * #VERTICAL_WRAP}, or {@link #HORIZONTAL_WRAP}. ++ */ ++ ++ int layoutOrientation; ++ ++ /** This property holds the data elements displayed by the list. */ ++ ListModel model; ++ ++ /** ++ *

    This property holds a reference to a "prototype" data value -- ++ * typically a String -- which is used to calculate the {@link ++ * #fixedCellWidth} and {@link #fixedCellHeight} properties, using the ++ * {@link #cellRenderer} property to acquire a component to render the ++ * prototype.

    ++ * ++ *

    It is important that you not set this value to a ++ * component. It has to be a data value such as the objects you ++ * would find in the list's model. Setting it to a component will have ++ * undefined (and undesirable) affects.

    ++ */ ++ Object prototypeCellValue; ++ ++ /** ++ * This property specifies a foreground color for the selected cells in ++ * the list. When {@link ListCellRenderer.getListCellRendererComponent} ++ * is called with a selected cell object, the component returned will ++ * have its "foreground" set to this color. ++ */ ++ Color selectionBackground; ++ ++ /** ++ * This property specifies a background color for the selected cells in ++ * the list. When {@link ListCellRenderer.getListCellRendererComponent} ++ * is called with a selected cell object, the component returned will ++ * have its "background" property set to this color. ++ */ ++ Color selectionForeground; ++ ++ /** ++ * This property holds a description of which data elements in the {@link ++ * #model} property should be considered "selected", when displaying and ++ * interacting with the list. ++ */ ++ ListSelectionModel selectionModel; ++ ++ ++ /** ++ * This property indicates that the list's selection is currently ++ * "adjusting" -- perhaps due to a user actively dragging the mouse over ++ * multiple list elements -- and is therefore likely to change again in ++ * the near future. A {@link ListSelectionListener} might choose to delay ++ * updating its view of the list's selection until this property is ++ * false, meaning that the adjustment has completed. ++ */ ++ boolean valueIsAdjusting; ++ ++ /** ++ * This property indicates a preference for the number of rows ++ * displayed in the list, and will scale the ++ * {@link #preferredScrollableViewportSize} property accordingly. The actual ++ * number of displayed rows, when the list is placed in a real {@link ++ * Viewport} or other component, may be greater or less than this number. ++ */ ++ int visibleRowCount; ++ ++ ++ ++ /** ++ * Fire a {@link ListSelectionEvent} to all the registered ListSelectionListeners. ++ */ ++ void fireSelectionValueChanged(int firstIndex, int lastIndex, boolean isAdjusting) ++ { ++ ListSelectionEvent evt = new ListSelectionEvent(this, firstIndex, lastIndex, isAdjusting); ++ ListSelectionListener listeners[] = getListSelectionListeners(); ++ for (int i = 0; i < listeners.length; ++i) ++ { ++ listeners[i].valueChanged(evt); ++ } ++ } ++ ++ ++ /** ++ * This private listener propagates {@link ListSelectionEvent} events ++ * from the list's "selectionModel" property to the list's {@link ++ * ListSelectionListener} listeners. It also listens to {@link ++ * ListDataEvent} events from the list's {@link #model} property. If this ++ * class receives either type of event, it triggers repainting of the ++ * list. ++ */ ++ private class ListListener ++ implements ListSelectionListener, ListDataListener ++ { ++ // ListDataListener events ++ public void contentsChanged(ListDataEvent event) + { +- class AL extends AbstractListModel +- { +- public int getSize() { return listData.length; } +- public Object getElementAt(int i) { return listData[i]; } +- }; +- +- setModel (new AL()); ++ JList.this.revalidate(); ++ JList.this.repaint(); + } +- +- public void setListData(final Vector listData) ++ public void intervalAdded(ListDataEvent event) + { +- class AL extends AbstractListModel +- { +- public int getSize() { return listData.size(); } +- public Object getElementAt(int i) { return listData.elementAt(i); } +- }; +- +- setModel (new AL()); ++ JList.this.revalidate(); ++ JList.this.repaint(); + } +- +- +- public ListCellRenderer getCellRenderer() +- { return render; } +- public void setCellRenderer(ListCellRenderer cellRenderer) ++ public void intervalRemoved(ListDataEvent event) + { +- render = cellRenderer; +- invalidate(); +- repaint(); ++ JList.this.revalidate(); ++ JList.this.repaint(); + } +- +- public void setModel(ListModel model) ++ // ListSelectionListener events ++ public void valueChanged(ListSelectionEvent event) + { +- ListDataListener l = new ListDataListener() +- { +- public void intervalAdded(ListDataEvent e) { +- repaint(); +- } +- public void intervalRemoved(ListDataEvent e) { +- repaint(); +- } +- public void contentsChanged(ListDataEvent e) { +- repaint(); +- } +- }; +- +- this.model = model; +- model.addListDataListener(l); ++ JList.this.fireSelectionValueChanged(event.getFirstIndex(), ++ event.getLastIndex(), ++ event.getValueIsAdjusting()); ++ JList.this.repaint(); + } ++ }; + +- public ListModel getModel() +- { return model; } +- +- +- public ListUI getUI() +- { return (ListUI) ui; } +- public void setUI(ListUI ui) +- { super.setUI(ui); } +- +- public void updateUI() +- { +- setUI((ListUI)UIManager.getUI(this)); +- } +- +- public String getUIClassID() +- { +- return "JList"; +- } +- +- +- public AccessibleContext getAccessibleContext() +- { +- return null; +- } +- +- public Dimension getPreferredScrollableViewportSize() +- { ++ /** ++ * Shared ListListener instance, subscribed to both the current {@link ++ * #model} and {@link #selectionModel} properties of the list. ++ */ ++ ListListener listListener; ++ ++ ++ /** ++ * Creates a new JList object. ++ */ ++ public JList() ++ { ++ init(); ++ } ++ ++ /** ++ * Creates a new JList object. ++ * ++ * @param listData Initial data to populate the list with ++ */ ++ public JList(Object[] listData) ++ { ++ init(); ++ setListData(listData); ++ } ++ ++ /** ++ * Creates a new JList object. ++ * ++ * @param listData Initial data to populate the list with ++ */ ++ public JList(Vector listData) ++ { ++ init(); ++ setListData(listData); ++ } ++ ++ /** ++ * Creates a new JList object. ++ * ++ * @param listData Initial data to populate the list with ++ */ ++ public JList(ListModel listData) ++ { ++ init(); ++ setModel(listData); ++ } ++ ++ void init() ++ { ++ dragEnabled = false; ++ fixedCellHeight = -1; ++ fixedCellWidth = -1; ++ layoutOrientation = VERTICAL; ++ opaque = true; ++ valueIsAdjusting = false; ++ visibleRowCount = 8; ++ ++ cellRenderer = new DefaultListCellRenderer(); ++ listListener = new ListListener(); ++ ++ setModel(new DefaultListModel()); ++ setSelectionModel(new DefaultListSelectionModel()); ++ ++ updateUI(); ++ } ++ ++ /** ++ * Gets the value of the {@link #fixedCellHeight} property. This property ++ * may be -1 to indicate that no cell height has been ++ * set. This property is also set implicitly when the ++ * {@link #prototypeCellValue} property is set. ++ * ++ * @return The current value of the property ++ * ++ * @see #fixedCellHeight ++ * @see #setFixedCellHeight ++ * @see #setPrototypeCellValue ++ */ ++ public int getFixedCellHeight() ++ { ++ return fixedCellHeight; ++ } ++ ++ /** ++ * Sets the value of the {@link #fixedCellHeight} property. This property ++ * may be -1 to indicate that no cell height has been ++ * set. This property is also set implicitly when the {@link ++ * #prototypeCellValue} property is set, but setting it explicitly ++ * overrides the height computed from {@link #prototypeCellValue}. ++ * ++ * @see #getFixedCellHeight ++ * @see #getPrototypeCellValue ++ */ ++ public void setFixedCellHeight(int h) ++ { ++ int old = fixedCellHeight; ++ fixedCellHeight = h; ++ firePropertyChange(FIXED_CELL_WIDTH_PROPERTY_CHANGED, old, h); ++ } ++ ++ ++ /** ++ * Gets the value of the {@link #fixedCellWidth} property. This property ++ * may be -1 to indicate that no cell width has been ++ * set. This property is also set implicitly when the {@link ++ * #prototypeCellValue} property is set. ++ * ++ * @return The current value of the property ++ * ++ * @see #setFixedCellWidth ++ * @see #setPrototypeCellValue ++ */ ++ public int getFixedCellWidth() ++ { ++ return fixedCellWidth; ++ } ++ ++ /** ++ * Sets the value of the {@link #fixedCellWidth} property. This property ++ * may be -1 to indicate that no cell width has been ++ * set. This property is also set implicitly when the {@link ++ * #prototypeCellValue} property is set, but setting it explicitly ++ * overrides the width computed from {@link #prototypeCellValue}. ++ * ++ * @see #getFixedCellWidth ++ * @see #getPrototypeCellValue ++ */ ++ public void setFixedCellWidth(int h) ++ { ++ int old = fixedCellHeight; ++ fixedCellHeight = h; ++ firePropertyChange(FIXED_CELL_HEIGHT_PROPERTY_CHANGED, old, h); ++ } ++ ++ ++ /** ++ * Gets the value of the {@link #visibleRowCount} property. ++ * ++ * @return the current value of the property. ++ */ ++ ++ public int getVisibleRowCount() ++ { ++ return visibleRowCount; ++ } ++ ++ /** ++ * Sets the value of the {@link #visibleRowCount} property. ++ * ++ * @param visibleRowCount The new property value ++ */ ++ public void setVisibleRowCount(int vc) ++ { ++ visibleRowCount = vc; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Adds a {@link ListSelectionListener} to the listener list for this ++ * list. The listener will be called back with a {@link ++ * ListSelectionEvent} any time the list's {@link #selectionModel} ++ * property changes. The source of such events will be the JList, ++ * not the selection model. ++ * ++ * @param listener The new listener to add ++ */ ++ public void addListSelectionListener(ListSelectionListener listener) ++ { ++ listenerList.add (ListSelectionListener.class, listener); ++ } ++ ++ /** ++ * Removes a {@link ListSelectionListener} from the listener list for ++ * this list. The listener will no longer be called when the list's ++ * {@link #selectionModel} changes. ++ * ++ * @param listener The listener to remove ++ */ ++ public void removeListSelectionListener(ListSelectionListener listener) ++ { ++ listenerList.remove(ListSelectionListener.class, listener); ++ } ++ ++ /** ++ * Returns an array of all ListSelectionListeners subscribed to this ++ * list. ++ * ++ * @return The current subscribed listeners ++ * ++ * @since 1.4 ++ */ ++ public ListSelectionListener[] getListSelectionListeners() ++ { ++ return (ListSelectionListener[]) getListeners(ListSelectionListener.class); ++ } ++ ++ /** ++ * Sets the list's "selectionMode" property, which simply mirrors the ++ * same property on the list's {@link #selectionModel} property. This ++ * property should be one of the integer constants ++ * SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, ++ * or MULTIPLE_INTERVAL_SELECTION from the {@link ++ * ListSelectionModel} interface. ++ * ++ * @param a The new selection mode ++ */ ++ public void setSelectionMode(int a) ++ { ++ selectionModel.setSelectionMode(a); ++ } ++ ++ /** ++ * Adds the interval [a,a] to the set of selections managed ++ * by this list's {@link #selectionModel} property. Depending on the ++ * selection mode, this may cause existing selections to become invalid, ++ * or may simply expand the set of selections. ++ * ++ * @param a A number in the half-open range [0, x) where ++ * x = getModel.getSize(), indicating the index of an ++ * element in the list to select. ++ * ++ * @see #setSelectionMode ++ * @see #selectionModel ++ */ ++ public void setSelectedIndex(int a) ++ { ++ selectionModel.setSelectionInterval(a, a); ++ } ++ ++ /** ++ * For each element a[i] of the provided array ++ * a, calls {@link #setSelectedIndex} on a[i]. ++ * ++ * @see #setSelectionMode ++ * @see #selectionModel ++ */ ++ public void setSelectedIndices(int [] a) ++ { ++ for (int i = 0; i < a.length; ++i) ++ setSelectedIndex(a[i]); ++ } ++ ++ /** ++ * Returns the minimum index of an element in the list which is currently ++ * selected. ++ * ++ * @return A number in the half-open range [0, x) where ++ * x = getModel.getSize(), indicating the minimum index of ++ * an element in the list for which the element is selected, or ++ * -1 if no elements are selected ++ */ ++ public int getSelectedIndex() ++ { ++ return selectionModel.getMinSelectionIndex(); ++ } ++ ++ /** ++ * Returns true if the model's selection is empty, otherwise ++ * false. ++ * ++ * @return The return value of {@link ListSelectionModel#isSelectionEmpty} ++ */ ++ public boolean isSelectionEmpty() ++ { ++ return selectionModel.isSelectionEmpty(); ++ } ++ ++ /** ++ * Returns the list index of the upper left or upper right corner of the ++ * {@link #visibleRect} property, depending on the {@link ++ * #componentOrientation} property. ++ * ++ * @return The index of the first visible list cell, or -1 ++ * if none is visible. ++ */ ++ public int getFirstVisibleIndex() ++ { ++ ComponentOrientation or = getComponentOrientation(); ++ Rectangle r = getVisibleRect(); ++ if (or == ComponentOrientation.RIGHT_TO_LEFT) ++ r.translate((int) r.getWidth(), 0); ++ return getUI().locationToIndex(this, r.getLocation()); ++ } ++ ++ ++ /** ++ * Returns index of the cell to which specified location is closest to ++ * @param location for which to look for in the list ++ * ++ * @return index of the cell to which specified location is closest to. ++ */ ++ public int locationToIndex(Point location) { ++ return getUI().locationToIndex(this, location); ++ } ++ ++ /** ++ * Returns location of the cell located at the specified index in the list. ++ * @param index of the cell for which location will be determined ++ * ++ * @return location of the cell located at the specified index in the list. ++ */ ++ public Point indexToLocation(int index){ ++ //FIXME: Need to implement. + return null; +- } +- +- public int getScrollableUnitIncrement(Rectangle visibleRect, +- int orientation, +- int direction) +- { +- return 1; +- } +- +- public int getScrollableBlockIncrement(Rectangle visibleRect, +- int orientation, +- int direction) +- { +- return 1; +- } ++ } + +- public boolean getScrollableTracksViewportWidth() +- { +- return false; +- } ++ /** ++ * Returns the list index of the lower right or lower left corner of the ++ * {@link #visibleRect} property, depending on the {@link ++ * #componentOrientation} property. ++ * ++ * @return The index of the first visible list cell, or -1 ++ * if none is visible. ++ */ ++ public int getLastVisibleIndex() ++ { ++ ComponentOrientation or = getComponentOrientation(); ++ Rectangle r = getVisibleRect(); ++ r.translate(0, (int) r.getHeight()); ++ if (or == ComponentOrientation.LEFT_TO_RIGHT) ++ r.translate((int) r.getWidth(), 0); ++ return getUI().locationToIndex(this, r.getLocation()); ++ } ++ ++ /** ++ * Returns the indices of values in the {@link #model} property which are ++ * selected. ++ * ++ * @return An array of model indices, each of which is selected according ++ * to the {@link #selection} property ++ */ ++ public int[] getSelectedIndices() ++ { ++ int lo, hi, n, i, j; ++ if (selectionModel.isSelectionEmpty()) ++ return new int[0]; ++ lo = selectionModel.getMinSelectionIndex(); ++ hi = selectionModel.getMaxSelectionIndex(); ++ n = 0; ++ for (i = lo; i < hi; ++i) ++ if (selectionModel.isSelectedIndex(i)) ++ n++; ++ int [] v = new int[n]; ++ j = 0; ++ for (i = lo; i < hi; ++i) ++ if (selectionModel.isSelectedIndex(i)) ++ v[j++] = i; ++ return v; ++ } ++ ++ /** ++ * Indicates whether the list element at a given index value is ++ * currently selected. ++ * ++ * @param a The index to check ++ * @return true if a is the index of a selected ++ * list element ++ */ ++ public boolean isSelectedIndex(int a) ++ { ++ return selectionModel.isSelectedIndex(a); ++ } ++ ++ /** ++ * Returns the first value in the list's {@link #model} property which is ++ * selected, according to the list's {@link #selectionModel} property. ++ * This is equivalent to calling ++ * getModel()getElementAt(getSelectedIndex()), with a check ++ * for the special index value of -1 which returns null ++ * null. ++ * ++ * @return The first selected element, or null if no element ++ * is selected. ++ * ++ * @see getSelectedValues ++ */ ++ public Object getSelectedValue() ++ { ++ int index = getSelectedIndex(); ++ if (index == -1) ++ return null; ++ return getModel().getElementAt(index); ++ } + +- public boolean getScrollableTracksViewportHeight() +- { +- return false; +- } +- ++ /** ++ * Returns all the values in the list's {@link #model} property which ++ * are selected, according to the list's {@link #selectionModel} property. ++ * ++ * @return An array containing all the selected values ++ * ++ * @see getSelectedValue ++ */ ++ public Object[] getSelectedValues() ++ { ++ int [] idx = getSelectedIndices(); ++ Object [] v = new Object[idx.length]; ++ for (int i = 0; i < idx.length; ++i) ++ v[i] = getModel().getElementAt(i); ++ return v; ++ } ++ ++ /** ++ * Gets the value of the {@link #selectionBackground} property. ++ * ++ * @return The current value of the property ++ */ ++ public Color getSelectionBackground() ++ { ++ return selectionBackground; ++ } ++ ++ /** ++ * Sets the value of the {@link #selectionBackground} property. ++ * ++ * @param c The new value of the property ++ */ ++ public void setSelectionBackground(Color c) ++ { ++ Color old = selectionBackground; ++ selectionBackground = c; ++ firePropertyChange(SELECTION_BACKGROUND_PROPERTY_CHANGED, old, c); ++ repaint(); ++ } ++ ++ /** ++ * Gets the value of the {@link #selectionForeground} property. ++ * ++ * @return The current value of the property ++ */ ++ public Color getSelectionForeground() ++ { ++ return selectionForeground; ++ } ++ ++ /** ++ * Sets the value of the {@link #selectionForeground} property. ++ * ++ * @param c The new value of the property ++ */ ++ public void setSelectionForeground(Color c) ++ { ++ Color old = selectionForeground; ++ selectionForeground = c; ++ firePropertyChange(SELECTION_FOREGROUND_PROPERTY_CHANGED, old, c); ++ } ++ ++ /** ++ * Sets the selection to cover only the specified value, if it ++ * exists in the model. ++ * ++ * @param obj The object to select ++ * @param scroll Whether to scroll the list to make the newly selected ++ * value visible ++ * ++ * @see #ensureIndexIsVisible ++ */ ++ ++ public void setSelectedValue(Object obj, boolean scroll) ++ { ++ for (int i = 0; i < model.getSize(); ++i) ++ { ++ if (model.getElementAt(i).equals(obj)) ++ { ++ setSelectedIndex(i); ++ if (scroll) ++ ensureIndexIsVisible(i); ++ break; ++ } ++ } ++ } ++ ++ /** ++ * Scrolls this list to make the specified cell visible. This ++ * only works if the list is contained within a viewport. ++ * ++ * @param i The list index to make visible ++ * ++ * @see JComponent#scrollRectToVisible ++ */ ++ public void ensureIndexIsVisible(int i) ++ { ++ scrollRectToVisible(getUI().getCellBounds(this, i, i)); ++ } ++ ++ /** ++ * Sets the {@link #model} property of the list to a new anonymous ++ * {@link AbstractListModel} subclass which accesses the provided Object ++ * array directly. ++ * ++ * @param listData The object array to build a new list model on ++ * @see #setModel ++ */ ++ public void setListData(final Object[] listData) ++ { ++ setModel(new AbstractListModel() ++ { ++ public int getSize() ++ { ++ return listData.length; ++ } ++ ++ public Object getElementAt(int i) ++ { ++ return listData[i]; ++ } ++ }); ++ } ++ ++ /** ++ * Sets the {@link #model} property of the list to a new anonymous {@link ++ * AbstractListModel} subclass which accesses the provided vector ++ * directly. ++ * ++ * @param listData The object array to build a new list model on ++ * @see #setModel ++ */ ++ public void setListData(final Vector listData) ++ { ++ setModel(new AbstractListModel() ++ { ++ public int getSize() ++ { ++ return listData.size(); ++ } ++ ++ public Object getElementAt(int i) ++ { ++ return listData.elementAt(i); ++ } ++ }); ++ } ++ ++ /** ++ * Gets the value of the {@link #cellRenderer} property. ++ * ++ * @return The current value of the property ++ */ ++ public ListCellRenderer getCellRenderer() ++ { ++ return cellRenderer; ++ } ++ ++ /** ++ * Sets the value of the {@link #celLRenderer} property. ++ * ++ * @param cellRenderer The new property value ++ */ ++ public void setCellRenderer(ListCellRenderer cr) ++ { ++ ListCellRenderer old = cellRenderer; ++ cellRenderer = cr; ++ firePropertyChange(CELL_RENDERER_PROPERTY_CHANGED, old, cr); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Gets the value of the {@link #model} property. ++ * ++ * @return The current value of the property ++ */ ++ public ListModel getModel() ++ { ++ return model; ++ } ++ ++ /** ++ * Sets the value of the {@link #model} property. The list's {@link ++ * #listListener} is unsubscribed from the existing model, if it exists, ++ * and re-subscribed to the new model. ++ * ++ * @param model The new property value ++ */ ++ public void setModel(ListModel m) ++ { ++ ListModel old = model; ++ if (old != null) ++ old.removeListDataListener(listListener); ++ model = m; ++ if (model != null) ++ model.addListDataListener(listListener); ++ firePropertyChange(MODEL_PROPERTY_CHANGED, old, m); ++ revalidate(); ++ repaint(); ++ } ++ ++ ++ public ListSelectionModel getSelectionModel() ++ { ++ return selectionModel; ++ } ++ ++ /** ++ * Sets the value of the {@link #selectionModel} property. The list's ++ * {@link #listListener} is unsubscribed from the existing selection ++ * model, if it exists, and re-subscribed to the new selection model. ++ * ++ * @param l The new property value ++ */ ++ public void setSelectionModel(ListSelectionModel l) ++ { ++ ListSelectionModel old = selectionModel; ++ if (old != null) ++ old.removeListSelectionListener(listListener); ++ selectionModel = l; ++ if (selectionModel != null) ++ selectionModel.addListSelectionListener(listListener); ++ firePropertyChange(SELECTION_MODEL_PROPERTY_CHANGED, old, l); ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Gets the value of the UI property. ++ * ++ * @return The current property value ++ */ ++ public ListUI getUI() ++ { ++ return (ListUI) ui; ++ } ++ ++ /** ++ * Sets the value of the UI property. ++ * ++ * @param ui The new property value ++ */ ++ public void setUI(ListUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * Calls {@link #setUI} with the {@link ListUI} subclass ++ * returned from calling {@link UIManager#getUI}. ++ */ ++ public void updateUI() ++ { ++ setUI((ListUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * Return the class identifier for the list's UI property. This should ++ * be the constant string "ListUI", and map to an ++ * appropriate UI class in the {@link UIManager}. ++ * ++ * @return The class identifier ++ */ ++ public String getUIClassID() ++ { ++ return "ListUI"; ++ } ++ ++ ++ /** ++ * Returns the current value of the {@link #prototypeCellValue} ++ * property. This property holds a reference to a "prototype" data value ++ * -- typically a String -- which is used to calculate the {@link ++ * #fixedCellWidth} and {@link #fixedCellHeight} properties, using the ++ * {@link #cellRenderer} property to acquire a component to render the ++ * prototype. ++ * ++ * @return The current prototype cell value ++ * @see #setPrototypeCellValue ++ */ ++ public Object getPrototypeCellValue() ++ { ++ return prototypeCellValue; ++ } ++ ++ /** ++ *

    Set the {@link #prototypeCellValue} property. This property holds a ++ * reference to a "prototype" data value -- typically a String -- which ++ * is used to calculate the {@link #fixedCellWidth} and {@link ++ * #fixedCellHeight} properties, using the {@link #cellRenderer} property ++ * to acquire a component to render the prototype.

    ++ * ++ *

    It is important that you not set this value to a ++ * component. It has to be a data value such as the objects you ++ * would find in the list's model. Setting it to a component will have ++ * undefined (and undesirable) affects.

    ++ * ++ * @param obj The new prototype cell value ++ * @see #getPrototypeCellValue ++ */ ++ public void setPrototypeCellValue(Object obj) ++ { ++ Object old = prototypeCellValue; ++ Component comp = getCellRenderer() ++ .getListCellRendererComponent(this, obj, 0, false, false); ++ Dimension d = comp.getPreferredSize(); ++ fixedCellWidth = d.width; ++ fixedCellHeight = d.height; ++ prototypeCellValue = obj; ++ firePropertyChange(PROTOTYPE_CELL_VALUE_PROPERTY_CHANGED, old, obj); ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns a size indicating how much space this list would like to ++ * consume, when contained in a scrollable viewport. This is part of the ++ * {@link Scrollable} interface, which interacts with {@link ++ * ScrollPaneLayout} and {@link Viewport} to define scrollable objects. ++ * ++ * @return The preferred size ++ */ ++ public Dimension getPreferredScrollableViewportSize() ++ { ++ int vis = getVisibleRowCount(); ++ int nrows = getModel() == null ? 0 : getModel().getSize(); ++ // FIXME: this is a somewhat arbitrary default, but.. ? ++ Dimension single = new Dimension(10, 10);; ++ Rectangle bounds = null; ++ ++ if (vis > nrows) ++ { ++ if (fixedCellWidth != -1 && ++ fixedCellHeight != -1) ++ { ++ single = new Dimension(fixedCellWidth, fixedCellHeight); ++ } ++ else if (nrows != 0 && getUI() != null) ++ { ++ Rectangle tmp = getUI().getCellBounds(this, 0, 0); ++ if (tmp != null) ++ single = tmp.getSize(); ++ } ++ } ++ else if (getUI() != null) ++ { ++ return getUI().getCellBounds(this, 0, vis - 1).getSize(); ++ } ++ ++ return new Dimension(single.width, single.height * vis); ++ } ++ ++ /** ++ *

    Return the number of pixels the list must scroll in order to move a ++ * "unit" of the list into the provided visible rectangle. When the ++ * provided direction is positive, the call describes a "downwards" ++ * scroll, which will be exposing a cell at a greater index in ++ * the list than those elements currently showing. Then the provided ++ * direction is negative, the call describes an "upwards" scroll, which ++ * will be exposing a cell at a lesser index in the list than ++ * those elements currently showing.

    ++ * ++ *

    If the provided orientation is HORIZONTAL, the above ++ * comments refer to "rightwards" for positive direction, and "leftwards" ++ * for negative.

    ++ * ++ * ++ * @param visibleRect The rectangle to scroll an element into ++ * @param orientation One of the numeric consants VERTICAL ++ * or HORIZONTAL ++ * @param direction An integer indicating the scroll direction: positive means ++ * forwards (down, right), negative means backwards (up, left) ++ * ++ * @return The scrollable unit increment, in pixels ++ */ ++ public int getScrollableUnitIncrement(Rectangle visibleRect, ++ int orientation, int direction) ++ { ++ ListUI lui = this.getUI(); ++ if (orientation == SwingConstants.VERTICAL) ++ { ++ if (direction > 0) ++ { ++ // Scrolling down ++ Point bottomLeft = new Point(visibleRect.x, ++ visibleRect.y + visibleRect.height); ++ int curIdx = lui.locationToIndex(this, bottomLeft); ++ Rectangle curBounds = lui.getCellBounds(this, curIdx, curIdx); ++ if (curBounds.y + curBounds.height == bottomLeft.y) ++ { ++ // we are at the exact bottom of the current cell, so we ++ // are being asked to scroll to the end of the next one ++ if (curIdx + 1 < model.getSize()) ++ { ++ // there *is* a next item in the list ++ Rectangle nxtBounds = lui.getCellBounds(this, curIdx + 1, curIdx + 1); ++ return nxtBounds.height; ++ } ++ else ++ { ++ // no next item, no advance possible ++ return 0; ++ } ++ } ++ else ++ { ++ // we are part way through an existing cell, so we are being ++ // asked to scroll to the bottom of it ++ return (curBounds.y + curBounds.height) - bottomLeft.y; ++ } ++ } ++ else ++ { ++ // scrolling up ++ Point topLeft = new Point(visibleRect.x, visibleRect.y); ++ int curIdx = lui.locationToIndex(this, topLeft); ++ Rectangle curBounds = lui.getCellBounds(this, curIdx, curIdx); ++ if (curBounds.y == topLeft.y) ++ { ++ // we are at the exact top of the current cell, so we ++ // are being asked to scroll to the top of the previous one ++ if (curIdx > 0) ++ { ++ // there *is* a previous item in the list ++ Rectangle nxtBounds = lui.getCellBounds(this, curIdx - 1, curIdx - 1); ++ return -nxtBounds.height; ++ } ++ else ++ { ++ // no previous item, no advance possible ++ return 0; ++ } ++ } ++ else ++ { ++ // we are part way through an existing cell, so we are being ++ // asked to scroll to the top of it ++ return curBounds.y - topLeft.y; ++ } ++ } ++ } ++ ++ // FIXME: handle horizontal scrolling (also wrapping?) ++ return 1; ++ } ++ ++ /** ++ *

    Return the number of pixels the list must scroll in order to move a ++ * "block" of the list into the provided visible rectangle. When the ++ * provided direction is positive, the call describes a "downwards" ++ * scroll, which will be exposing a cell at a greater index in ++ * the list than those elements currently showing. Then the provided ++ * direction is negative, the call describes an "upwards" scroll, which ++ * will be exposing a cell at a lesser index in the list than ++ * those elements currently showing.

    ++ * ++ *

    If the provided orientation is HORIZONTAL, the above ++ * comments refer to "rightwards" for positive direction, and "leftwards" ++ * for negative.

    ++ * ++ * ++ * @param visibleRect The rectangle to scroll an element into ++ * @param orientation One of the numeric consants VERTICAL ++ * or HORIZONTAL ++ * @param direction An integer indicating the scroll direction: positive means ++ * forwards (down, right), negative means backwards (up, left) ++ * ++ * @return The scrollable unit increment, in pixels ++ */ ++ public int getScrollableBlockIncrement(Rectangle visibleRect, ++ int orientation, int direction) ++ { ++ if (orientation == VERTICAL) ++ return visibleRect.height * direction; ++ else ++ return visibleRect.width * direction; ++ } ++ ++ /** ++ * Gets the value of the {@link #scrollableTracksViewportWidth} property. ++ * ++ * @return true if the viewport is larger (horizontally) ++ * than the list and the list should be expanded to fit the viewport; ++ * false if the viewport is smaller than the list and the ++ * list should scroll (horizontally) within the viewport ++ */ ++ public boolean getScrollableTracksViewportWidth() ++ { ++ return false; ++ } ++ ++ /** ++ * Gets the value of the {@link #scrollableTracksViewportWidth} property. ++ * ++ * @return true if the viewport is larger (vertically) ++ * than the list and the list should be expanded to fit the viewport; ++ * false if the viewport is smaller than the list and the ++ * list should scroll (vertically) within the viewport ++ */ ++ public boolean getScrollableTracksViewportHeight() ++ { ++ return false; ++ } + } +Index: javax/swing/JMenu.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JMenu.java,v +retrieving revision 1.3 +diff -u -r1.3 JMenu.java +--- javax/swing/JMenu.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JMenu.java 6 Sep 2004 16:35:57 -0000 +@@ -1,5 +1,5 @@ + /* JMenu.java -- +- Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,731 +39,853 @@ + + import java.awt.Component; + import java.awt.Point; ++import java.awt.Window; + import java.awt.event.KeyEvent; + import java.awt.event.WindowAdapter; + import java.awt.event.WindowEvent; ++import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; + import java.io.IOException; + import java.io.ObjectOutputStream; + import java.io.Serializable; ++import java.util.EventListener; + import java.util.Hashtable; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + import javax.accessibility.AccessibleSelection; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; + import javax.swing.event.MenuEvent; + import javax.swing.event.MenuListener; +-import javax.swing.event.ChangeListener; ++import javax.swing.plaf.MenuItemUI; ++ + + /** +- * JMenu +- * @author Andrew Selkirk +- * @version 1.0 ++ *

    ++ * This class represents a menu that can be added to a menu bar or ++ * can be a submenu in some other menu. When JMenu is selected it ++ * displays JPopupMenu containing its menu items. ++ *

    ++ * ++ *

    ++ * JMenu's fires MenuEvents when this menu's selection changes. If this menu ++ * is selected, then fireMenuSelectedEvent() is invoked. In case when menu is ++ * deselected or cancelled, then fireMenuDeselectedEvent() or ++ * fireMenuCancelledEvent() is invoked, respectivelly. ++ *

    ++ * + */ +-public class JMenu +- extends JMenuItem +- implements Accessible, MenuElement ++public class JMenu extends JMenuItem implements Accessible, MenuElement + { + static final long serialVersionUID = 4227225638931828014L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJMenu +- */ +- protected class AccessibleJMenu extends AccessibleJMenuItem +- implements AccessibleSelection { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJMenu +- * @param component TODO +- */ +- protected AccessibleJMenu(JMenu component) { +- super(component); +- // TODO +- } // AccessibleJMenu() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleChildrenCount +- * @returns int +- */ +- public int getAccessibleChildrenCount() { +- return 0; // TODO +- } // getAccessibleChildrenCount() +- +- /** +- * getAccessibleChild +- * @param value0 TODO +- * @returns Accessible +- */ +- public Accessible getAccessibleChild(int value0) { +- return null; // TODO +- } // getAccessibleChild() +- +- /** +- * getAccessibleSelection +- * @returns AccessibleSelection +- */ +- public AccessibleSelection getAccessibleSelection() { +- return null; // TODO +- } // getAccessibleSelection() +- +- /** +- * getAccessibleSelection +- * @param value0 TODO +- * @returns Accessible +- */ +- public Accessible getAccessibleSelection(int value0) { +- return null; // TODO +- } // getAccessibleSelection() +- +- /** +- * isAccessibleChildSelected +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean isAccessibleChildSelected(int value0) { +- return false; // TODO +- } // isAccessibleChildSelected() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.MENU; +- } // getAccessibleRole() +- +- /** +- * getAccessibleSelectionCount +- * @returns int +- */ +- public int getAccessibleSelectionCount() { +- return 0; // TODO +- } // getAccessibleSelectionCount() +- +- /** +- * addAccessibleSelection +- * @param value0 TODO +- */ +- public void addAccessibleSelection(int value0) { +- // TODO +- } // addAccessibleSelection() +- +- /** +- * removeAccessibleSelection +- * @param value0 TODO +- */ +- public void removeAccessibleSelection(int value0) { +- // TODO +- } // removeAccessibleSelection() +- +- /** +- * clearAccessibleSelection +- */ +- public void clearAccessibleSelection() { +- // TODO +- } // clearAccessibleSelection() +- +- /** +- * selectAllAccessibleSelection +- */ +- public void selectAllAccessibleSelection() { +- // TODO +- } // selectAllAccessibleSelection() +- +- +- } // AccessibleJMenu +- +- /** +- * WinListener +- */ +- protected class WinListener extends WindowAdapter implements Serializable { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * popupMenu +- */ +- JPopupMenu popupMenu; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor WinListener +- * @param value0 TODO +- * @param value1 TODO +- */ +- public WinListener(JMenu value0, JPopupMenu value1) { +- // TODO +- } // WinListener() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * windowClosing +- * @param value0 TODO +- */ +- public void windowClosing(WindowEvent value0) { +- // TODO +- } // windowClosing() +- +- +- } // WinListener +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "MenuUI"; +- +- /** +- * popupMenu +- */ +- private JPopupMenu popupMenu; +- +- /** +- * menuChangeListener +- */ +- private ChangeListener menuChangeListener; +- +- /** +- * menuEvent +- */ +- private MenuEvent menuEvent; +- +- /** +- * listenerRegistry +- */ +- private static Hashtable listenerRegistry = null; // TODO +- +- /** +- * delay +- */ +- private int delay; +- +- /** +- * TRACE +- */ +- private static final boolean TRACE = false; // TODO +- +- /** +- * VERBOSE +- */ +- private static final boolean VERBOSE = false; // TODO +- +- /** +- * DEBUG +- */ +- private static final boolean DEBUG = false; // TODO +- +- /** +- * popupListener +- */ +- protected JMenu.WinListener popupListener; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JMenu +- */ +- public JMenu() { +- // TODO +- } // JMenu() +- +- /** +- * Constructor JMenu +- * @param text TODO +- */ +- public JMenu(String text) { +- // TODO +- } // JMenu() +- +- /** +- * Constructor JMenu +- * @param action TODO +- */ +- public JMenu(Action action) { +- // TODO +- } // JMenu() +- +- /** +- * Constructor JMenu +- * @param text TODO +- * @param tearoff TODO +- */ +- public JMenu(String text, boolean tearoff) { +- // TODO +- } // JMenu() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * add +- * @param value0 TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(JMenuItem item) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param component TODO +- * @returns Component +- */ +- public Component add(Component component) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param component TODO +- * @param index TODO +- * @returns Component +- */ +- public Component add(Component component, int index) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param text TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(String text) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param action TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(Action action) { +- return null; // TODO +- } // add() +- +- /** +- * remove +- * @param item TODO +- */ +- public void remove(JMenuItem item) { +- // TODO +- } // remove() +- +- /** +- * remove +- * @param index TODO +- */ +- public void remove(int index) { +- // TODO +- } // remove() +- +- /** +- * remove +- * @param component TODO +- */ +- public void remove(Component component) { +- // TODO +- } // remove() +- +- /** +- * removeAll +- */ +- public void removeAll() { +- // TODO +- } // removeAll() +- +- /** +- * insert +- * @param text TODO +- * @param index TODO +- */ +- public void insert(String text, int index) { +- // TODO +- } // insert() +- +- /** +- * insert +- * @param item TODO +- * @param index TODO +- * @returns JMenuItem +- */ +- public JMenuItem insert(JMenuItem item, int index) { +- return null; // TODO +- } // insert() +- +- /** +- * insert +- * @param action TODO +- * @param index TODO +- * @returns JMenuItem +- */ +- public JMenuItem insert(Action action, int index) { +- return null; // TODO +- } // insert() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- //setUI((MenuUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * setModel +- * @param model TODO +- */ +- public void setModel(ButtonModel model) { +- // TODO +- } // setModel() +- +- /** +- * isSelected +- * @returns boolean +- */ +- public boolean isSelected() { +- return false; // TODO +- } // isSelected() +- +- /** +- * setSelected +- * @param selected TODO +- */ +- public void setSelected(boolean selected) { +- // TODO +- } // setSelected() +- +- /** +- * isPopupMenuVisible +- * @returns boolean +- */ +- public boolean isPopupMenuVisible() { +- return false; // TODO +- } // isPopupMenuVisible() +- +- /** +- * setPopupMenuVisible +- * @param popup TODO +- */ +- public void setPopupMenuVisible(boolean popup) { +- // TODO +- } // setPopupMenuVisible() +- +- /** +- * getPopupMenuOrigin +- * @returns Point +- */ +- protected Point getPopupMenuOrigin() { +- return null; // TODO +- } // getPopupMenuOrigin() +- +- /** +- * getDelay +- * @returns int +- */ +- public int getDelay() { +- return 0; // TODO +- } // getDelay() +- +- /** +- * setDelay +- * @param value0 TODO +- */ +- public void setDelay(int delay) { +- // TODO +- } // setDelay() +- +- /** +- * setMenuLocation +- * @param x TODO +- * @param y TODO +- */ +- public void setMenuLocation(int x, int y) { +- // TODO +- } // setMenuLocation() +- +- /** +- * createActionComponent +- * @param action TODO +- * @returns JMenuItem +- */ +- protected JMenuItem createActionComponent(Action action) { +- return null; // TODO +- } // createActionComponent() +- +- /** +- * createActionChangeListener +- * @param item TODO +- * @returns PropertyChangeListener +- */ +- protected PropertyChangeListener createActionChangeListener(JMenuItem item) { +- return null; // TODO +- } // createActionChangeListener() +- +- /** +- * addSeparator +- */ +- public void addSeparator() { +- // TODO +- } // addSeparator() +- +- /** +- * insertSeparator +- * @param index TODO +- */ +- public void insertSeparator(int index) { +- // TODO +- } // insertSeparator() +- +- /** +- * getItem +- * @param index TODO +- * @returns JMenuItem +- */ +- public JMenuItem getItem(int index) { +- return null; // TODO +- } // getItem() +- +- /** +- * getItemCount +- * @returns int +- */ +- public int getItemCount() { +- return 0; // TODO +- } // getItemCount() +- +- /** +- * isTearOff +- * @returns boolean +- */ +- public boolean isTearOff() { +- return false; // TODO +- } // isTearOff() +- +- /** +- * getMenuComponentCount +- * @returns int +- */ +- public int getMenuComponentCount() { +- return 0; // TODO +- } // getMenuComponentCount() +- +- /** +- * getMenuComponent +- * @param index TODO +- * @returns Component +- */ +- public Component getMenuComponent(int index) { +- return null; // TODO +- } // getMenuComponent() +- +- /** +- * getMenuComponents +- * @returns Component[] +- */ +- public Component[] getMenuComponents() { +- return null; // TODO +- } // getMenuComponents() +- +- /** +- * isTopLevelMenu +- * @returns boolean +- */ +- public boolean isTopLevelMenu() { +- return false; // TODO +- } // isTopLevelMenu() +- +- /** +- * isMenuComponent +- * @param component TODO +- * @returns boolean +- */ +- public boolean isMenuComponent(Component component) { +- return false; // TODO +- } // isMenuComponent() +- +- /** +- * getPopupMenu +- * @returns JPopupMenu +- */ +- public JPopupMenu getPopupMenu() { +- return null; // TODO +- } // getPopupMenu() +- +- /** +- * addMenuListener +- * @param listener TODO +- */ +- public void addMenuListener(MenuListener listener) { +- // TODO +- } // addMenuListener() +- +- /** +- * removeMenuListener +- * @param listener TODO +- */ +- public void removeMenuListener(MenuListener listener) { +- // TODO +- } // removeMenuListener() +- +- /** +- * fireMenuSelected +- */ +- protected void fireMenuSelected() { +- // TODO +- } // fireMenuSelected() +- +- /** +- * fireMenuDeselected +- */ +- protected void fireMenuDeselected() { +- // TODO +- } // fireMenuDeselected() +- +- /** +- * fireMenuCanceled +- */ +- protected void fireMenuCanceled() { +- // TODO +- } // fireMenuCanceled() +- +- /** +- * createMenuChangeListener +- * @returns ChangeListener +- */ +- private ChangeListener createMenuChangeListener() { +- return null; // TODO +- } // createMenuChangeListener() +- +- /** +- * createWinListener +- * @param popup TODO +- * @returns JMenu.WinListener +- */ +- protected JMenu.WinListener createWinListener(JPopupMenu popup) { +- return null; // TODO +- } // createWinListener() +- +- /** +- * menuSelectionChanged +- * @param value0 TODO +- */ +- public void menuSelectionChanged(boolean changed) { +- // TODO +- } // menuSelectionChanged() +- +- /** +- * getSubElements +- * @returns MenuElement[] +- */ +- public MenuElement[] getSubElements() { +- return null; // TODO +- } // getSubElements() +- +- /** +- * getComponent +- * @returns Component +- */ +- public Component getComponent() { +- return null; // TODO +- } // getComponent() +- +- /** +- * setAccelerator +- * @param keystroke TODO +- */ +- public void setAccelerator(KeyStroke keystroke) { +- // TODO +- } // setAccelerator() +- +- /** +- * processKeyEvent +- * @param event TODO +- */ +- protected void processKeyEvent(KeyEvent event) { +- // TODO +- } // processKeyEvent() +- +- /** +- * doClick +- * @param time TODO +- */ +- public void doClick(int time) { +- // TODO +- } // doClick() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJMenu(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() ++ /** name for the UI delegate for this menu. */ ++ private static final String uiClassID = "MenuUI"; + ++ /** A Popup menu associated with this menu, which pops up when menu is selected */ ++ private JPopupMenu popupMenu = new JPopupMenu(); + +-} // JMenu ++ /** Whenever menu is selected or deselected the MenuEvent is fired to ++ menu's registered listeners. */ ++ private MenuEvent menuEvent = new MenuEvent(this); ++ ++ /*Amount of time, in milliseconds, that should pass before popupMenu ++ associated with this menu appears or disappers */ ++ private int delay; ++ ++ /* PopupListener */ ++ protected WinListener popupListener; ++ ++ /** Location at which popup menu associated with this menu will be ++ displayed */ ++ private Point menuLocation; ++ ++ /** ++ * Creates a new JMenu object. ++ */ ++ public JMenu() ++ { ++ super(); ++ } ++ ++ /** ++ * Creates a new JMenu with the spicified label ++ * ++ * @param text label for this menu ++ */ ++ public JMenu(String text) ++ { ++ super(text); ++ } ++ ++ /** ++ * Creates a new JMenu object ++ * ++ * @param action Action that is used to create menu item tha will be ++ * added to the menu. ++ */ ++ public JMenu(Action action) ++ { ++ super(action); ++ createActionChangeListener(this); ++ } ++ ++ /** ++ * Creates a new JMenu with specified label and an option ++ * for this menu to be tear-off menu ++ * ++ * @param text label for this menu ++ * @param tearoff true if this menu should be tear-off and false otherwise ++ */ ++ public JMenu(String text, boolean tearoff) ++ { ++ throw new Error("not implemented"); ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * Adds specified menu item to this menu ++ * ++ * @param item Menu item to add to this menu ++ * ++ * @return Menu item that was added ++ */ ++ public JMenuItem add(JMenuItem item) ++ { ++ return popupMenu.add(item); ++ } ++ ++ /** ++ * Adds specified component to this menu. ++ * ++ * @param component Component to add to this menu ++ * ++ * @return Component that was added ++ */ ++ public Component add(Component component) ++ { ++ return popupMenu.add(component); ++ } ++ ++ /** ++ * Adds specified component to this menu at the given index ++ * ++ * @param component Component to add ++ * @param index Position of this menu item in the menu ++ * ++ * @return Component that was added ++ */ ++ public Component add(Component component, int index) ++ { ++ return popupMenu.add(component, index); ++ } ++ ++ /** ++ * Adds JMenuItem constructed with the specified label to this menu ++ * ++ * @param text label for the menu item that will be added ++ * ++ * @return Menu Item that was added to this menu ++ */ ++ public JMenuItem add(String text) ++ { ++ return popupMenu.add(text); ++ } ++ ++ /** ++ * Adds JMenuItem constructed using properties from specified action. ++ * ++ * @param action action to construct the menu item with ++ * ++ * @return Menu Item that was added to this menu ++ */ ++ public JMenuItem add(Action action) ++ { ++ return popupMenu.add(action); ++ } ++ ++ /** ++ * Removes given menu item from this menu. Nothing happens if ++ * this menu doesn't contain specified menu item. ++ * ++ * @param item Menu Item which needs to be removed ++ */ ++ public void remove(JMenuItem item) ++ { ++ popupMenu.remove(item); ++ } ++ ++ /** ++ * Removes component at the specified index from this menu ++ * ++ * @param index Position of the component that needs to be removed in the menu ++ */ ++ public void remove(int index) ++ { ++ popupMenu.remove(index); ++ } ++ ++ /** ++ * Removes given component from this menu. ++ * ++ * @param component Component to remove ++ */ ++ public void remove(Component component) ++ { ++ int index = popupMenu.getComponentIndex(component); ++ popupMenu.remove(index); ++ } ++ ++ /** ++ * Removes all menu items from the menu ++ */ ++ public void removeAll() ++ { ++ popupMenu.removeAll(); ++ } ++ ++ /** ++ * Creates JMenuItem with the specified text and inserts it in the ++ * at the specified index ++ * ++ * @param text label for the new menu item ++ * @param index index at which to insert newly created menu item. ++ */ ++ public void insert(String text, int index) ++ { ++ this.insert(new JMenuItem(text), index); ++ } ++ ++ /** ++ * Creates JMenuItem with the specified text and inserts it in the ++ * at the specified index. IllegalArgumentException is thrown ++ * if index is less than 0 ++ * ++ * @param item menu item to insert ++ * @param index index at which to insert menu item. ++ * @return Menu item that was added to the menu ++ */ ++ public JMenuItem insert(JMenuItem item, int index) ++ { ++ if (index < 0) ++ throw new IllegalArgumentException("index less than zero"); ++ ++ popupMenu.insert(item, index); ++ ++ return item; ++ } ++ ++ /** ++ * Creates JMenuItem with the associated action and inserts it to the menu ++ * at the specified index. IllegalArgumentException is thrown ++ * if index is less than 0 ++ * ++ * @param action Action for the new menu item ++ * @param index index at which to insert newly created menu item. ++ * @return Menu item that was added to the menu ++ */ ++ public JMenuItem insert(Action action, int index) ++ { ++ JMenuItem item = new JMenuItem(action); ++ this.insert(item, index); ++ ++ return item; ++ } ++ ++ /** ++ * This method sets this menuItem's UI to the UIManager's default for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ super.setUI((MenuItemUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menu. ++ * ++ * @return The Look and Feel classID. "MenuUI" ++ */ ++ public String getUIClassID() ++ { ++ return uiClassID; ++ } ++ ++ /** ++ * Sets model for this menu. ++ * ++ * @param model model to set ++ */ ++ public void setModel(ButtonModel model) ++ { ++ super.setModel(model); ++ } ++ ++ /** ++ * Returns true if the menu is selected and false otherwise ++ * ++ * @return true if the menu is selected and false otherwise ++ */ ++ public boolean isSelected() ++ { ++ return super.isArmed(); ++ } ++ ++ /** ++ * Changes this menu selected state if selected is true and false otherwise ++ * This method fires menuEvents to menu's registered listeners. ++ * ++ * @param selected true if the menu should be selected and false otherwise ++ */ ++ public void setSelected(boolean selected) ++ { ++ // if this menu selection is true, then activate this menu and ++ // display popup associated with this menu ++ if (selected) ++ { ++ super.setArmed(true); ++ super.setSelected(true); ++ ++ // FIXME: The popup menu should be shown on the screen after certain ++ // number of seconds pass. The 'delay' property of this menu indicates ++ // this amount of seconds. 'delay' property is 0 by default. ++ if (this.isShowing()) ++ { ++ fireMenuSelected(); ++ ++ int x = 0; ++ int y = 0; ++ ++ if (menuLocation == null) ++ { ++ // Calculate correct position of the popup. Note that location of the popup ++ // passed to show() should be relative to the popup's invoker ++ if (isTopLevelMenu()) ++ y = this.getHeight(); ++ else ++ x = this.getWidth(); ++ ++ getPopupMenu().show(this, x, y); ++ } ++ else ++ getPopupMenu().show(this, menuLocation.x, menuLocation.y); ++ } ++ } ++ ++ else ++ { ++ super.setSelected(false); ++ super.setArmed(false); ++ fireMenuDeselected(); ++ popupMenu.setVisible(false); ++ } ++ } ++ ++ /** ++ * Checks if PopupMenu associated with this menu is visible ++ * ++ * @return true if the popup associated with this menu is currently visible on the screen and ++ * false otherwise. ++ */ ++ public boolean isPopupMenuVisible() ++ { ++ return popupMenu.isVisible(); ++ } ++ ++ /** ++ * Sets popup menu visibility ++ * ++ * @param popup true if popup should be visible and false otherwise ++ */ ++ public void setPopupMenuVisible(boolean popup) ++ { ++ if (getModel().isEnabled()) ++ popupMenu.setVisible(popup); ++ } ++ ++ /** ++ * Returns origin point of the popup menu ++ * ++ * @return Point containing ++ */ ++ protected Point getPopupMenuOrigin() ++ { ++ // if menu in the menu bar ++ if (isTopLevelMenu()) ++ return new Point(0, this.getHeight()); ++ ++ // if submenu ++ return new Point(this.getWidth(), 0); ++ } ++ ++ /** ++ * Returns delay property. ++ * ++ * @return delay property, indicating number of milliseconds before ++ * popup menu associated with the menu appears or disappears after ++ * menu was selected or deselected respectively ++ */ ++ public int getDelay() ++ { ++ return delay; ++ } ++ ++ /** ++ * Sets delay property for this menu. If given time for the delay ++ * property is negative, then IllegalArgumentException is thrown ++ * ++ * @param delay number of milliseconds before ++ * popup menu associated with the menu appears or disappears after ++ * menu was selected or deselected respectively ++ */ ++ public void setDelay(int delay) ++ { ++ if (delay < 0) ++ throw new IllegalArgumentException("delay less than 0"); ++ this.delay = delay; ++ } ++ ++ /** ++ * Sets location at which popup menu should be displayed ++ * The location given is relative to this menu item ++ * ++ * @param x x-coordinate of the menu location ++ * @param y y-coordinate of the menu location ++ */ ++ public void setMenuLocation(int x, int y) ++ { ++ menuLocation = new Point(x, y); ++ } ++ ++ /** ++ * Creates and returns JMenuItem associated with the given action ++ * ++ * @param action Action to use for creation of JMenuItem ++ * ++ * @return JMenuItem that was creted with given action ++ */ ++ protected JMenuItem createActionComponent(Action action) ++ { ++ return new JMenuItem(action); ++ } ++ ++ /** ++ * Creates ActionChangeListener to listen for PropertyChangeEvents occuring ++ * in the action that is associated with this menu ++ * ++ * @param item menu that contains action to listen to ++ * ++ * @return The PropertyChangeListener ++ */ ++ protected PropertyChangeListener createActionChangeListener(JMenuItem item) ++ { ++ return new ActionChangedListener(item); ++ } ++ ++ /** ++ * Adds separator to the end of the menu items in the menu. ++ */ ++ public void addSeparator() ++ { ++ getPopupMenu().addSeparator(); ++ } ++ ++ /** ++ * Inserts separator in the menu at the specified index. ++ * ++ * @param index Index at which separator should be inserted ++ */ ++ public void insertSeparator(int index) ++ { ++ if (index < 0) ++ throw new IllegalArgumentException("index less than 0"); ++ ++ getPopupMenu().insert(new JPopupMenu.Separator(), index); ++ } ++ ++ /** ++ * Returns menu item located at the specified index in the menu ++ * ++ * @param index Index at which to look for the menu item ++ * ++ * @return menu item located at the specified index in the menu ++ */ ++ public JMenuItem getItem(int index) ++ { ++ if (index < 0) ++ throw new IllegalArgumentException("index less than 0"); ++ ++ Component c = popupMenu.getComponentAtIndex(index); ++ ++ if (c instanceof JMenuItem) ++ return (JMenuItem) c; ++ else ++ return null; ++ } ++ ++ /** ++ * Returns number of items in the menu ++ * ++ * @return number of items in the menu ++ */ ++ public int getItemCount() ++ { ++ // returns the number of items on ++ // the menu, including separators. ++ return getComponents().length; ++ } ++ ++ /** ++ * Checks if this menu is a tear-off menu. ++ * ++ * @return true if this menu is a tear-off menu and false otherwise ++ */ ++ public boolean isTearOff() ++ { ++ // NOT YET IMPLEMENTED ++ return false; ++ } ++ ++ /** ++ * Returns number of menu components in this menu ++ * ++ * @return number of menu components in this menu ++ */ ++ public int getMenuComponentCount() ++ { ++ return popupMenu.getComponentCount(); ++ } ++ ++ /** ++ * Returns menu component located at the givent index ++ * in the menu ++ * ++ * @param index index at which to get the menu component in the menu ++ * ++ * @return Menu Component located in the menu at the specified index ++ */ ++ public Component getMenuComponent(int index) ++ { ++ return (Component) popupMenu.getComponentAtIndex(index); ++ } ++ ++ /** ++ * Return components belonging to this menu ++ * ++ * @return components belonging to this menu ++ */ ++ public Component[] getMenuComponents() ++ { ++ return popupMenu.getComponents(); ++ } ++ ++ /** ++ * Checks if this menu is a top level menu. The menu is top ++ * level menu if it is inside the menu bar. While if the menu ++ * inside some other menu, it is considered to be a pull-right menu. ++ * ++ * @return true if this menu is top level menu, and false otherwise ++ */ ++ public boolean isTopLevelMenu() ++ { ++ if (getParent() instanceof JMenuBar) ++ return true; ++ else ++ return false; ++ } ++ ++ /** ++ * Checks if given component exists in this menu. The submenus of ++ * this menu are checked as well ++ * ++ * @param component Component to look for ++ * ++ * @return true if the given component exists in this menu, and false otherwise ++ */ ++ public boolean isMenuComponent(Component component) ++ { ++ return false; ++ } ++ ++ /** ++ * Returns popup menu associated with the menu. ++ * ++ * @return popup menu associated with the menu. ++ */ ++ public JPopupMenu getPopupMenu() ++ { ++ return popupMenu; ++ } ++ ++ /** ++ * Adds MenuListener to the menu ++ * ++ * @param listener MenuListener to add ++ */ ++ public void addMenuListener(MenuListener listener) ++ { ++ listenerList.add(MenuListener.class, listener); ++ } ++ ++ /** ++ * Removes MenuListener from the menu ++ * ++ * @param listener MenuListener to remove ++ */ ++ public void removeMenuListener(MenuListener listener) ++ { ++ listenerList.remove(MenuListener.class, listener); ++ } ++ ++ /** ++ * This method fires MenuEvents to all menu's MenuListeners. In this case ++ * menuSelected() method of MenuListeners is called to indicated that the menu ++ * was selected. ++ */ ++ protected void fireMenuSelected() ++ { ++ EventListener[] ll = listenerList.getListeners(MenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuListener) ll[i]).menuSelected(menuEvent); ++ } ++ ++ /** ++ * This method fires MenuEvents to all menu's MenuListeners. In this case ++ * menuDeselected() method of MenuListeners is called to indicated that the menu ++ * was deselected. ++ */ ++ protected void fireMenuDeselected() ++ { ++ EventListener[] ll = listenerList.getListeners(MenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuListener) ll[i]).menuDeselected(menuEvent); ++ } ++ ++ /** ++ * This method fires MenuEvents to all menu's MenuListeners. In this case ++ * menuSelected() method of MenuListeners is called to indicated that the menu ++ * was cancelled. The menu is cancelled when it's popup menu is close without selection. ++ */ ++ protected void fireMenuCanceled() ++ { ++ EventListener[] ll = listenerList.getListeners(MenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuListener) ll[i]).menuCanceled(menuEvent); ++ } ++ ++ /** ++ * Creates WinListener that listens to the menu;s popup menu. ++ * ++ * @param popup JPopupMenu to listen to ++ * ++ * @return The WinListener ++ */ ++ protected WinListener createWinListener(JPopupMenu popup) ++ { ++ return new WinListener(popup); ++ } ++ ++ /** ++ * Method of the MenuElementInterface. It reacts to the selection ++ * changes in the menu. If this menu was selected, then it ++ * displayes popup menu associated with it and if this menu was ++ * deselected it hides the popup menu. ++ * ++ * @param changed true if the menu was selected and false otherwise ++ */ ++ public void menuSelectionChanged(boolean changed) ++ { ++ // if this menu selection is true, then activate this menu and ++ // display popup associated with this menu ++ setSelected(changed); ++ } ++ ++ /** ++ * Method of MenuElement interface. Returns sub components of ++ * this menu. ++ * ++ * @return array containing popupMenu that is associated with this menu ++ */ ++ public MenuElement[] getSubElements() ++ { ++ return new MenuElement[] { popupMenu }; ++ } ++ ++ /** ++ * @return Returns reference to itself ++ */ ++ public Component getComponent() ++ { ++ return this; ++ } ++ ++ /** ++ * This method is overriden with empty implementation, s.t the ++ * accelerator couldn't be set for the menu. The mnemonic should ++ * be used for the menu instead. ++ * ++ * @param keystroke accelerator for this menu ++ */ ++ public void setAccelerator(KeyStroke keystroke) ++ { ++ throw new Error("setAccelerator() is not defined for JMenu. Use setMnemonic() instead."); ++ } ++ ++ /** ++ * This method process KeyEvent occuring when the menu is visible ++ * ++ * @param event The KeyEvent ++ */ ++ protected void processKeyEvent(KeyEvent event) ++ { ++ } ++ ++ /** ++ * Programatically performs click ++ * ++ * @param time Number of milliseconds for which this menu stays pressed ++ */ ++ public void doClick(int time) ++ { ++ getModel().setArmed(true); ++ getModel().setPressed(true); ++ try ++ { ++ java.lang.Thread.sleep(time); ++ } ++ catch (java.lang.InterruptedException e) ++ { ++ // probably harmless ++ } ++ ++ getModel().setPressed(false); ++ getModel().setArmed(false); ++ popupMenu.show(this, this.getWidth(), 0); ++ } ++ ++ /** ++ * A string that describes this JMenu. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JMenu ++ */ ++ protected String paramString() ++ { ++ return "JMenu"; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJMenu(); ++ ++ return accessibleContext; ++ } ++ ++ protected class AccessibleJMenu extends AccessibleJMenuItem ++ implements AccessibleSelection ++ { ++ protected AccessibleJMenu() ++ { ++ } ++ ++ public int getAccessibleChildrenCount() ++ { ++ return 0; ++ } ++ ++ public Accessible getAccessibleChild(int value0) ++ { ++ return null; ++ } ++ ++ public AccessibleSelection getAccessibleSelection() ++ { ++ return null; ++ } ++ ++ public Accessible getAccessibleSelection(int value0) ++ { ++ return null; ++ } ++ ++ public boolean isAccessibleChildSelected(int value0) ++ { ++ return false; ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.MENU; ++ } ++ ++ public int getAccessibleSelectionCount() ++ { ++ return 0; ++ } ++ ++ public void addAccessibleSelection(int value0) ++ { ++ } ++ ++ public void removeAccessibleSelection(int value0) ++ { ++ } ++ ++ public void clearAccessibleSelection() ++ { ++ } ++ ++ public void selectAllAccessibleSelection() ++ { ++ } ++ } ++ ++ protected class WinListener extends WindowAdapter implements Serializable ++ { ++ JPopupMenu popupMenu; ++ private static final long serialVersionUID = -6415815570638474823L; ++ ++ public WinListener(JPopupMenu popup) ++ { ++ } ++ ++ public void windowClosing(WindowEvent event) ++ { ++ } ++ } ++ ++ /** ++ * This class listens to PropertyChangeEvents occuring in menu's action ++ */ ++ protected class ActionChangedListener implements PropertyChangeListener ++ { ++ /** menu item associated with the action */ ++ private JMenuItem menuItem; ++ ++ /** Creates new ActionChangedListener and adds it to menuItem's action */ ++ public ActionChangedListener(JMenuItem menuItem) ++ { ++ this.menuItem = menuItem; ++ ++ Action a = menuItem.getAction(); ++ if (a != null) ++ a.addPropertyChangeListener(this); ++ } ++ ++ /**This method is invoked when some change occures in menuItem's action*/ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ // FIXME: Need to implement ++ } ++ } ++} +Index: javax/swing/JMenuBar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JMenuBar.java,v +retrieving revision 1.2 +diff -u -r1.2 JMenuBar.java +--- javax/swing/JMenuBar.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JMenuBar.java 6 Sep 2004 16:35:57 -0000 +@@ -1,5 +1,5 @@ + /* JMenuBar.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,17 +35,453 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Insets; ++import java.awt.Point; + import java.awt.event.KeyEvent; + import java.awt.event.MouseEvent; + import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleSelection; ++import javax.accessibility.AccessibleStateSet; ++import javax.accessibility.AccessibleValue; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.MenuDragMouseEvent; ++import javax.swing.event.MenuDragMouseListener; ++import javax.swing.event.MenuKeyEvent; ++import javax.swing.event.MenuKeyListener; ++import javax.swing.plaf.MenuBarUI; ++import javax.swing.plaf.MenuItemUI; ++ + +-public class JMenuBar extends JComponent ++/** ++ *

    ++ * JMenuBar is a container for menu's. For a menu bar to be seen on the ++ * screen, at least one menu should be added to it. Just like adding ++ * components to container, one can use add() to add menu's to the menu bar. ++ * Menu's will be displayed in the menu bar in the order they were added. ++ * The JMenuBar uses selectionModel to keep track of selected menu index. ++ * JMenuBar's selectionModel will fire ChangeEvents to its registered ++ * listeners when the selected index changes. ++ *

    ++ */ ++public class JMenuBar extends JComponent implements Accessible, MenuElement + { +- JMenuBar() +- { +- } ++ /** Fired in a PropertyChangeEvent when the "borderPainted" property changes. */ ++ public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted"; ++ ++ /** Fired in a PropertyChangeEvent when the "model" changes. */ ++ public static final String MODEL_CHANGED_PROPERTY = "model"; ++ ++ /** Fired in a PropertyChangeEvent when the "margin" changes. */ ++ public static final String MARGIN_CHANGED_PROPERTY = "margin"; ++ private static final long serialVersionUID = -8191026883931977036L; ++ ++ /** JMenuBar's model. It keeps track of selected menu's index */ ++ private transient SingleSelectionModel selectionModel; ++ ++ /* borderPainted property indicating if the menuBar's border will be painted*/ ++ private boolean borderPainted; ++ ++ /* margin between menu bar's border and its menues*/ ++ private Insets margin; ++ ++ /** ++ * Creates a new JMenuBar object. ++ */ ++ public JMenuBar() ++ { ++ selectionModel = new DefaultSingleSelectionModel(); ++ borderPainted = true; ++ updateUI(); ++ } ++ ++ /** ++ * Adds menu to the menu bar ++ * ++ * @param c menu to add ++ * ++ * @return reference to the added menu ++ */ ++ public JMenu add(JMenu c) ++ { ++ c.setAlignmentX(Component.LEFT_ALIGNMENT); ++ super.add(c); ++ return c; ++ } ++ ++ /** ++ * This method overrides addNotify() in the Container to register ++ * this menu bar with the current keyboard manager. ++ */ ++ public void addNotify() ++ { ++ // FIXME: Should register this menu bar with the keyboard manager ++ super.addNotify(); ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns reference to this menu bar ++ * ++ * @return reference to this menu bar ++ */ ++ public Component getComponent() ++ { ++ return this; ++ } ++ ++ /** ++ * Returns component at the specified index. ++ * ++ * @param i index of the component to get ++ * ++ * @return component at the specified index. Null is returned if ++ * component at the specified index doesn't exist. ++ * @deprecated Replaced by getComponent(int) ++ */ ++ public Component getComponentAtIndex(int i) ++ { ++ return getComponent(i); ++ } ++ ++ /** ++ * Returns index of the specified component ++ * ++ * @param c Component to search for ++ * ++ * @return index of the specified component. -1 is returned if ++ * specified component doesnt' exist in the menu bar. ++ */ ++ public int getComponentIndex(Component c) ++ { ++ Component[] comps = getComponents(); ++ ++ int index = -1; ++ ++ for (int i = 0; i < comps.length; i++) ++ { ++ if (comps[i].equals(c)) ++ { ++ index = i; ++ break; ++ } ++ } ++ ++ return index; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public JMenu getHelpMenu() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns margin betweeen menu bar's border and its menues ++ * ++ * @return margin between menu bar's border and its menues ++ */ ++ public Insets getMargin() ++ { ++ if (margin == null) ++ return new Insets(0, 0, 0, 0); ++ else ++ return margin; ++ } ++ ++ /** ++ * Return menu at the specified index. If component at the ++ * specified index is not a menu, then null is returned. ++ * ++ * @param index index to look for the menu ++ * ++ * @return menu at specified index, or null if menu doesn't exist ++ * at the specified index. ++ */ ++ public JMenu getMenu(int index) ++ { ++ if (getComponentAtIndex(index) instanceof JMenu) ++ return (JMenu) getComponentAtIndex(index); ++ else ++ return null; ++ } ++ ++ /** ++ * Returns number of menu's in this menu bar ++ * ++ * @return number of menu's in this menu bar ++ */ ++ public int getMenuCount() ++ { ++ return getComponentCount(); ++ } ++ ++ /** ++ * Returns selection model for this menu bar. SelectionModel ++ * keeps track of the selected menu in the menu bar. Whenever ++ * selected property of selectionModel changes, the ChangeEvent ++ * will be fired its ChangeListeners. ++ * ++ * @return selection model for this menu bar. ++ */ ++ public SingleSelectionModel getSelectionModel() ++ { ++ return selectionModel; ++ } ++ ++ /** ++ * Method of MenuElement interface. It returns subcomponents ++ * of the menu bar, which are all the menues that it contains. ++ * ++ * @return MenuElement[] array containing menues in this menu bar ++ */ ++ public MenuElement[] getSubElements() ++ { ++ MenuElement[] subElements = new MenuElement[getComponentCount()]; ++ ++ for (int i = 0; i < getComponentCount(); i++) ++ subElements[i] = (MenuElement) getMenu(i); ++ ++ return subElements; ++ } ++ ++ /** ++ * Set the "UI" property of the menu bar, which is a look and feel class ++ * responsible for handling the menuBar's input events and painting it. ++ * ++ * @return The current "UI" property ++ */ ++ public MenuBarUI getUI() ++ { ++ return (MenuBarUI) ui; ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menu bar. ++ * ++ * @return The Look and Feel classID. "MenuItemUI" ++ */ ++ public String getUIClassID() ++ { ++ return "MenuBarUI"; ++ } ++ ++ /** ++ * Returns true if menu bar paints its border and false otherwise ++ * ++ * @return true if menu bar paints its border and false otherwise ++ */ ++ public boolean isBorderPainted() ++ { ++ return borderPainted; ++ } ++ ++ /** ++ * Returns true if some menu in menu bar is selected. ++ * ++ * @return true if some menu in menu bar is selected and false otherwise ++ */ ++ public boolean isSelected() ++ { ++ return selectionModel.isSelected(); ++ } ++ ++ /** ++ * This method does nothing by default. This method is need for the ++ * MenuElement interface to be implemented. ++ * ++ * @param isIncluded true if menuBar is included in the selection ++ * and false otherwise ++ */ ++ public void menuSelectionChanged(boolean isIncluded) ++ { ++ // Do nothing - needed for implementation of MenuElement interface ++ } ++ ++ /** ++ * Paints border of the menu bar, if its borderPainted property is set to ++ * true. ++ * ++ * @param g The graphics context with which to paint the border ++ */ ++ protected void paintBorder(Graphics g) ++ { ++ if (borderPainted) ++ getBorder().paintBorder(this, g, 0, 0, getSize(null).width, ++ getSize(null).height); ++ } ++ ++ /** ++ * A string that describes this JMenuBar. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JMenuBar ++ */ ++ protected String paramString() ++ { ++ return "JMenuBar"; ++ } ++ ++ /** ++ * Process key events forwarded from MenuSelectionManager. This method ++ * doesn't do anything. It is here to conform to the MenuElement interface. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ * ++ */ ++ public void processKeyEvent(KeyEvent e, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Do nothing - needed for implementation of MenuElement interface ++ } ++ ++ /** ++ * Process mouse events forwarded from MenuSelectionManager. This method ++ * doesn't do anything. It is here to conform to the MenuElement interface. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ * ++ */ ++ public void processMouseEvent(MouseEvent event, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Do nothing - needed for implementation of MenuElement interface ++ } ++ ++ /** ++ * This method overrides removeNotify() in the Container to ++ * unregister this menu bar from the current keyboard manager. ++ */ ++ public void removeNotify() ++ { ++ // Must unregister this menu bar with the current keyboard manager. ++ super.removeNotify(); ++ } ++ ++ /** ++ * Sets painting status of the border. If 'b' is true then menu bar's ++ * border will be painted, and it will not be painted otherwise. ++ * ++ * @param b indicates if menu bar's border should be painted. ++ */ ++ public void setBorderPainted(boolean b) ++ { ++ boolean old = borderPainted; ++ borderPainted = b; ++ if (b != old) ++ { ++ firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, old, b); ++ revalidate(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * Sets help menu for this menu bar ++ * ++ * @param menu help menu ++ */ ++ public void setHelpMenu(JMenu menu) ++ { ++ } ++ ++ /** ++ * Sets the menu bar's "margin" bound property, which represents ++ * distance between the menubar's border and its menus. ++ * icon. When marging property is modified, PropertyChangeEvent will ++ * be fired to menuBar's PropertyChangeListener's. ++ * ++ * @param m distance between the menubar's border and its menus. ++ * ++ */ ++ public void setMargin(Insets m) ++ { ++ if (m.equals(this.margin)) ++ { ++ Insets oldMargin = this.margin; ++ this.margin = m; ++ firePropertyChange(MARGIN_CHANGED_PROPERTY, oldMargin, margin); ++ } ++ ++ this.margin = m; ++ } ++ ++ /** ++ * Changes menu bar's selection to the specified menu. ++ * This method updates selected index of menu bar's selection model, ++ * which results in a model firing change event. ++ * ++ * @param sel menu to select ++ */ ++ public void setSelected(Component sel) ++ { ++ int index = getComponentIndex(sel); ++ selectionModel.setSelectedIndex(index); ++ } ++ ++ /** ++ * Sets menuBar's selection model to the one specified ++ * ++ * @param model SingleSelectionModel that needs to be set for this menu bar ++ */ ++ public void setSelectionModel(SingleSelectionModel model) ++ { ++ selectionModel = model; ++ if (selectionModel != model) ++ { ++ SingleSelectionModel oldModel = selectionModel; ++ ++ selectionModel = model; ++ ++ firePropertyChange(MODEL_CHANGED_PROPERTY, oldModel, ++ this.selectionModel); ++ } ++ } ++ ++ /** ++ * Set the "UI" property of the menu bar, which is a look and feel class ++ * responsible for handling menuBar's input events and painting it. ++ * ++ * @param ui The new "UI" property ++ */ ++ public void setUI(MenuBarUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * Set the "UI" property to a class constructed, via the {@link ++ * UIManager}, from the current look and feel. ++ */ ++ public void updateUI() ++ { ++ MenuBarUI ui = ((MenuBarUI) UIManager.getUI(this)); ++ setUI(ui); ++ invalidate(); ++ } + } +Index: javax/swing/JMenuItem.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JMenuItem.java,v +retrieving revision 1.2 +diff -u -r1.2 JMenuItem.java +--- javax/swing/JMenuItem.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JMenuItem.java 6 Sep 2004 16:35:57 -0000 +@@ -1,5 +1,5 @@ + /* JMenuItem.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,19 +35,22 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Component; ++import java.awt.event.InputEvent; + import java.awt.event.KeyEvent; + import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; + import java.io.IOException; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; ++import java.util.EventListener; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; ++import javax.swing.UIManager; + import javax.swing.event.ChangeEvent; + import javax.swing.event.ChangeListener; + import javax.swing.event.MenuDragMouseEvent; +@@ -56,418 +59,620 @@ + import javax.swing.event.MenuKeyListener; + import javax.swing.plaf.MenuItemUI; + ++ + /** +- * JMenuItem +- * @author Andrew Selkirk +- * @version 1.0 ++ *

    ++ * JMenuItem represents element in the menu. It inherits most of ++ * its functionality from AbstractButton, however its behavior somewhat ++ * varies from it. JMenuItem fire different kinds of events. ++ * PropertyChangeEvents are fired when menuItems properties are modified; ++ * ChangeEvents are fired when menuItem's state changes and actionEvents are ++ * fired when menu item is selected. In addition to this events menuItem also ++ * fire MenuDragMouseEvent and MenuKeyEvents when mouse is dragged over ++ * the menu item or associated key with menu item is invoked respectively. ++ *

    + */ +-public class JMenuItem extends AbstractButton implements Accessible, MenuElement { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJMenuItem +- */ +- protected class AccessibleJMenuItem extends AccessibleAbstractButton +- implements ChangeListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJMenuItem +- * @param component TODO +- */ +- AccessibleJMenuItem(JMenuItem component) { +- super(component); +- // TODO +- } // AccessibleJMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * stateChanged +- * @param event TODO +- */ +- public void stateChanged(ChangeEvent event) { +- // TODO +- } // stateChanged() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.MENU_ITEM; +- } // getAccessibleRole() +- +- +- } // AccessibleJMenuItem +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "MenuItemUI"; +- +- /** +- * accelerator +- */ +- private KeyStroke accelerator; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JMenuItem +- */ +- public JMenuItem() { +- // TODO +- } // JMenuItem() +- +- /** +- * Constructor JMenuItem +- * @param icon TODO +- */ +- public JMenuItem(Icon icon) { +- // TODO +- } // JMenuItem() +- +- /** +- * Constructor JMenuItem +- * @param text TODO +- */ +- public JMenuItem(String text) { +- // TODO +- } // JMenuItem() +- +- /** +- * Constructor JMenuItem +- * @param action TODO +- */ +- public JMenuItem(Action action) { +- // TODO +- } // JMenuItem() +- +- /** +- * Constructor JMenuItem +- * @param text TODO +- * @param icon TODO +- */ +- public JMenuItem(String text, Icon icon) { +- // TODO +- } // JMenuItem() +- +- /** +- * Constructor JMenuItem +- * @param text TODO +- * @param mnemonic TODO +- */ +- public JMenuItem(String text, int mnemonic) { +- // TODO +- } // JMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * readObject +- * @param stream TODO +- * @exception IOException TODO +- * @exception ClassNotFoundException TODO +- */ +- private void readObject(ObjectInputStream stream) +- throws IOException, ClassNotFoundException { +- // TODO +- } // readObject() +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * init +- * @param text TODO +- * @param icon TODO +- */ +- protected void init(String text, Icon icon) { +- // TODO +- } // init() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(MenuItemUI ui) { +- super.setUI(ui); +- // TODO +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((MenuItemUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * isArmed +- * @returns boolean +- */ +- public boolean isArmed() { +- return false; // TODO +- } // isArmed() +- +- /** +- * setArmed +- * @param armed TODO +- */ +- public void setArmed(boolean armed) { +- // TODO +- } // setArmed() +- +- /** +- * setEnabled +- * @param enabled TODO +- */ +- public void setEnabled(boolean enabled) { +- // TODO +- } // setEnabled() +- +- /** +- * getAccelerator +- * @returns KeyStroke +- */ +- public KeyStroke getAccelerator() { +- return null; // TODO +- } // getAccelerator() +- +- /** +- * setAccelerator +- * @param keystroke TODO +- */ +- public void setAccelerator(KeyStroke keystroke) { +- // TODO +- } // setAccelerator() +- +- /** +- * configurePropertiesFromAction +- * @param action TODO +- */ +- protected void configurePropertiesFromAction(Action action) { +- // TODO +- } // configurePropertiesFromAction() +- +- /** +- * createActionPropertyChangeListener +- * @param action TODO +- * @returns PropertyChangeListener +- */ +- protected PropertyChangeListener createActionPropertyChangeListener(Action action) { +- return null; // TODO +- } // createActionPropertyChangeListener() +- +- /** +- * processMouseEvent +- * @param event TODO +- * @param path TODO +- * @param manager TODO +- */ +- public void processMouseEvent(MouseEvent event, MenuElement[] path, +- MenuSelectionManager manager) { +- // TODO +- } // processMouseEvent() +- +- /** +- * processKeyEvent +- * @param event TODO +- * @param path TODO +- * @param manager TODO +- */ +- public void processKeyEvent(KeyEvent event, MenuElement[] path, +- MenuSelectionManager manager) { +- // TODO +- } // processKeyEvent() +- +- /** +- * processMenuDragMouseEvent +- * @param event TODO +- */ +- public void processMenuDragMouseEvent(MenuDragMouseEvent event) { +- // TODO +- } // processMenuDragMouseEvent() +- +- /** +- * processMenuKeyEvent +- * @param event TODO +- */ +- public void processMenuKeyEvent(MenuKeyEvent event) { +- // TODO +- } // processMenuKeyEvent() +- +- /** +- * fireMenuDragMouseEntered +- * @param event TODO +- */ +- protected void fireMenuDragMouseEntered(MenuDragMouseEvent event) { +- // TODO +- } // fireMenuDragMouseEntered() +- +- /** +- * fireMenuDragMouseExited +- * @param event TODO +- */ +- protected void fireMenuDragMouseExited(MenuDragMouseEvent event) { +- // TODO +- } // fireMenuDragMouseExited() +- +- /** +- * fireMenuDragMouseDragged +- * @param event TODO +- */ +- protected void fireMenuDragMouseDragged(MenuDragMouseEvent event) { +- // TODO +- } // fireMenuDragMouseDragged() +- +- /** +- * fireMenuDragMouseReleased +- * @param event TODO +- */ +- protected void fireMenuDragMouseReleased(MenuDragMouseEvent event) { +- // TODO +- } // fireMenuDragMouseReleased() +- +- /** +- * fireMenuKeyPressed +- * @param event TODO +- */ +- protected void fireMenuKeyPressed(MenuKeyEvent event) { +- // TODO +- } // fireMenuKeyPressed() +- +- /** +- * fireMenuKeyReleased +- * @param event TODO +- */ +- protected void fireMenuKeyReleased(MenuKeyEvent event) { +- // TODO +- } // fireMenuKeyReleased() +- +- /** +- * fireMenuKeyTyped +- * @param event TODO +- */ +- protected void fireMenuKeyTyped(MenuKeyEvent event) { +- // TODO +- } // fireMenuKeyTyped() +- +- /** +- * menuSelectionChanged +- * @param changed TODO +- */ +- public void menuSelectionChanged(boolean changed) { +- // TODO +- } // menuSelectionChanged() +- +- /** +- * getSubElements +- * @returns MenuElement[] +- */ +- public MenuElement[] getSubElements() { +- return null; // TODO +- } // getSubElements() +- +- /** +- * getComponent +- * @returns Component +- */ +- public Component getComponent() { +- return null; // TODO +- } // getComponent() +- +- /** +- * addMenuDragMouseListener +- * @param listener TODO +- */ +- public void addMenuDragMouseListener(MenuDragMouseListener listener) { +- // TODO +- } // addMenuDragMouseListener() +- +- /** +- * removeMenuDragMouseListener +- * @param listener TODO +- */ +- public void removeMenuDragMouseListener(MenuDragMouseListener listener) { +- // TODO +- } // removeMenuDragMouseListener() +- +- /** +- * addMenuKeyListener +- * @param listener TODO +- */ +- public void addMenuKeyListener(MenuKeyListener listener) { +- // TODO +- } // addMenuKeyListener() +- +- /** +- * removeMenuKeyListener +- * @param listener TODO +- */ +- public void removeMenuKeyListener(MenuKeyListener listener) { +- // TODO +- } // removeMenuKeyListener() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJMenuItem(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JMenuItem ++public class JMenuItem extends AbstractButton implements Accessible, ++ MenuElement ++{ ++ private static final long serialVersionUID = -1681004643499461044L; ++ ++ /** name for the UI delegate for this menuItem. */ ++ private static final String uiClassID = "MenuItemUI"; ++ ++ /** Combination of keyboard keys that can be used to activate this menu item */ ++ private KeyStroke accelerator; ++ ++ /** ++ * Creates a new JMenuItem object. ++ */ ++ public JMenuItem() ++ { ++ super(null, null); ++ } ++ ++ /** ++ * Creates a new JMenuItem with the given icon. ++ * ++ * @param icon Icon that will be displayed on the menu item ++ */ ++ public JMenuItem(Icon icon) ++ { ++ // FIXME: The requestedFocusEnabled property should ++ // be set to false, when only icon is set for menu item. ++ super(null, icon); ++ } ++ ++ /** ++ * Creates a new JMenuItem with the given label. ++ * ++ * @param text label for the menu item ++ */ ++ public JMenuItem(String text) ++ { ++ super(text, null); ++ } ++ ++ /** ++ * Creates a new JMenuItem associated with the specified action. ++ * ++ * @param action action for this menu item ++ */ ++ public JMenuItem(Action action) ++ { ++ super(null, null); ++ super.setAction(action); ++ } ++ ++ /** ++ * Creates a new JMenuItem with specified text and icon. ++ * Text is displayed to the left of icon by default. ++ * ++ * @param text label for this menu item ++ * @param icon icon that will be displayed on this menu item ++ */ ++ public JMenuItem(String text, Icon icon) ++ { ++ super(text, icon); ++ } ++ ++ /** ++ * Creates a new JMenuItem object. ++ * ++ * @param text label for this menu item ++ * @param mnemonic - Single key that can be used with a ++ * look-and-feel meta key to activate this menu item. However ++ * menu item should be visible on the screen when mnemonic is used. ++ */ ++ public JMenuItem(String text, int mnemonic) ++ { ++ super(text, null); ++ setMnemonic(mnemonic); ++ } ++ ++ private void readObject(ObjectInputStream stream) ++ throws IOException, ClassNotFoundException ++ { ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * Initializes this menu item ++ * ++ * @param text label for this menu item ++ * @param icon icon to be displayed for this menu item ++ */ ++ protected void init(String text, Icon icon) ++ { ++ super.init(text, icon); ++ ++ // Initializes properties for this menu item, that are different ++ // from Abstract button properties. ++ /* NOTE: According to java specifications paint_border should be set to false, ++ since menu item should not have a border. However running few java programs ++ it seems that menu items and menues can have a border. Commenting ++ out statement below for now. */ ++ //borderPainted = false; ++ focusPainted = false; ++ horizontalAlignment = JButton.LEFT; ++ horizontalTextPosition = JButton.LEFT; ++ } ++ ++ /** ++ * Set the "UI" property of the menu item, which is a look and feel class ++ * responsible for handling menuItem's input events and painting it. ++ * ++ * @param ui The new "UI" property ++ */ ++ public void setUI(MenuItemUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets this menuItem's UI to the UIManager's default for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ MenuItemUI mi = ((MenuItemUI) UIManager.getUI(this)); ++ setUI(mi); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menuItem. ++ * ++ * @return The Look and Feel classID. "MenuItemUI" ++ */ ++ public String getUIClassID() ++ { ++ return uiClassID; ++ } ++ ++ /** ++ * Returns true if button's model is armed and false otherwise. The ++ * button model is armed if menu item has focus or it is selected. ++ * ++ * @return $boolean$ true if button's model is armed and false otherwise ++ */ ++ public boolean isArmed() ++ { ++ return getModel().isArmed(); ++ } ++ ++ /** ++ * Sets menuItem's "ARMED" property ++ * ++ * @param armed DOCUMENT ME! ++ */ ++ public void setArmed(boolean armed) ++ { ++ getModel().setArmed(armed); ++ } ++ ++ /** ++ * Enable or disable menu item. When menu item is disabled, ++ * its text and icon are grayed out if they exist. ++ * ++ * @param enabled if true enable menu item, and disable otherwise. ++ */ ++ public void setEnabled(boolean enabled) ++ { ++ super.setEnabled(enabled); ++ } ++ ++ /** ++ * Return accelerator for this menu item. ++ * ++ * @return $KeyStroke$ accelerator for this menu item. ++ */ ++ public KeyStroke getAccelerator() ++ { ++ return accelerator; ++ } ++ ++ /** ++ * Sets accelerator for this menu item. ++ * ++ * @param keystroke accelerator for this menu item. ++ */ ++ public void setAccelerator(KeyStroke keystroke) ++ { ++ this.accelerator = keystroke; ++ } ++ ++ /** ++ * Configures menu items' properties from properties of the specified action. ++ * This method overrides configurePropertiesFromAction from AbstractButton ++ * to also set accelerator property. ++ * ++ * @param action action to configure properties from ++ */ ++ protected void configurePropertiesFromAction(Action action) ++ { ++ super.configurePropertiesFromAction(action); ++ ++ if (! (this instanceof JMenu) && action != null) ++ setAccelerator((KeyStroke) (action.getValue(Action.ACCELERATOR_KEY))); ++ } ++ ++ /** ++ * Creates PropertyChangeListener to listen for the changes in action ++ * properties. ++ * ++ * @param action action to listen to for property changes ++ * ++ * @return $PropertyChangeListener$ Listener that listens to changes in ++ * action properties. ++ */ ++ protected PropertyChangeListener createActionPropertyChangeListener(Action action) ++ { ++ return new PropertyChangeListener() ++ { ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ Action act = (Action) (e.getSource()); ++ configurePropertiesFromAction(act); ++ } ++ }; ++ } ++ ++ /** ++ * Process mouse events forwarded from MenuSelectionManager. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ */ ++ public void processMouseEvent(MouseEvent event, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Fire MenuDragMouseEvents if mouse is being dragged. ++ boolean dragged ++ = (event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0; ++ if (dragged) ++ processMenuDragMouseEvent(createMenuDragMouseEvent(event, path, manager)); ++ ++ switch (event.getID()) ++ { ++ case MouseEvent.MOUSE_CLICKED: ++ break; ++ case MouseEvent.MOUSE_ENTERED: ++ if (isRolloverEnabled()) ++ model.setRollover(true); ++ break; ++ case MouseEvent.MOUSE_EXITED: ++ if (isRolloverEnabled()) ++ model.setRollover(false); ++ ++ // for JMenu last element on the path is its popupMenu. ++ // JMenu shouldn't me disarmed. ++ if (! (path[path.length - 1] instanceof JPopupMenu) && ! dragged) ++ setArmed(false); ++ break; ++ case MouseEvent.MOUSE_PRESSED: ++ if ((event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0) ++ { ++ model.setArmed(true); ++ model.setPressed(true); ++ } ++ break; ++ case MouseEvent.MOUSE_RELEASED: ++ break; ++ case MouseEvent.MOUSE_MOVED: ++ break; ++ case MouseEvent.MOUSE_DRAGGED: ++ break; ++ } ++ } ++ ++ /** ++ * Creates MenuDragMouseEvent. ++ * ++ * @param event MouseEvent that occured while mouse was pressed. ++ * @param path Path the the menu element where the dragging event was ++ * originated ++ * @param manager MenuSelectionManager for the current menu hierarchy. ++ * ++ * @return new MenuDragMouseEvent ++ */ ++ private MenuDragMouseEvent createMenuDragMouseEvent(MouseEvent event, ++ MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ return new MenuDragMouseEvent((Component) event.getSource(), ++ event.getID(), event.getWhen(), ++ event.getModifiers(), event.getX(), ++ event.getY(), event.getClickCount(), ++ event.isPopupTrigger(), path, manager); ++ } ++ ++ /** ++ * Process key events forwarded from MenuSelectionManager. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ */ ++ public void processKeyEvent(KeyEvent event, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Need to implement. ++ } ++ ++ /** ++ * This method fires MenuDragMouseEvents to registered listeners. ++ * Different types of MenuDragMouseEvents are fired depending ++ * on the observed mouse event. ++ * ++ * @param event Mouse ++ */ ++ public void processMenuDragMouseEvent(MenuDragMouseEvent event) ++ { ++ switch (event.getID()) ++ { ++ case MouseEvent.MOUSE_ENTERED: ++ fireMenuDragMouseEntered(event); ++ break; ++ case MouseEvent.MOUSE_EXITED: ++ fireMenuDragMouseExited(event); ++ break; ++ case MouseEvent.MOUSE_DRAGGED: ++ fireMenuDragMouseDragged(event); ++ break; ++ case MouseEvent.MOUSE_RELEASED: ++ fireMenuDragMouseReleased(event); ++ break; ++ } ++ } ++ ++ /** ++ * This method fires MenuKeyEvent to registered listeners. ++ * Different types of MenuKeyEvents are fired depending ++ * on the observed key event. ++ * ++ * @param event DOCUMENT ME! ++ */ ++ public void processMenuKeyEvent(MenuKeyEvent event) ++ { ++ // Need to implement. ++ } ++ ++ /** ++ * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners. ++ * ++ * @param event The event signifying that mouse entered menuItem while it was dragged ++ */ ++ protected void fireMenuDragMouseEntered(MenuDragMouseEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuDragMouseListener) ll[i]).menuDragMouseEntered(event); ++ } ++ ++ /** ++ * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners. ++ * ++ * @param event The event signifying that mouse has exited menu item, while it was dragged ++ */ ++ protected void fireMenuDragMouseExited(MenuDragMouseEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuDragMouseListener) ll[i]).menuDragMouseExited(event); ++ } ++ ++ /** ++ * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners. ++ * ++ * @param event The event signifying that mouse is being dragged over the menuItem ++ */ ++ protected void fireMenuDragMouseDragged(MenuDragMouseEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuDragMouseListener) ll[i]).menuDragMouseDragged(event); ++ } ++ ++ /** ++ * This method fires a MenuDragMouseEvent to all the MenuItem's MouseInputListeners. ++ * ++ * @param event The event signifying that mouse was released while it was dragged over the menuItem ++ */ ++ protected void fireMenuDragMouseReleased(MenuDragMouseEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuDragMouseListener) ll[i]).menuDragMouseReleased(event); ++ } ++ ++ /** ++ * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners. ++ * ++ * @param event The event signifying that key associated with this menu was pressed ++ */ ++ protected void fireMenuKeyPressed(MenuKeyEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuKeyListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuKeyListener) ll[i]).menuKeyPressed(event); ++ } ++ ++ /** ++ * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners. ++ * ++ * @param event The event signifying that key associated with this menu was released ++ */ ++ protected void fireMenuKeyReleased(MenuKeyEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuKeyListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuKeyListener) ll[i]).menuKeyTyped(event); ++ } ++ ++ /** ++ * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners. ++ * ++ * @param event The event signifying that key associated with this menu was typed. ++ * The key is typed when it was pressed and then released ++ */ ++ protected void fireMenuKeyTyped(MenuKeyEvent event) ++ { ++ EventListener[] ll = listenerList.getListeners(MenuKeyListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((MenuKeyListener) ll[i]).menuKeyTyped(event); ++ } ++ ++ /** ++ * Method of the MenuElement interface. ++ * This method is invoked by MenuSelectionManager when selection of ++ * this menu item has changed. If this menu item was selected then ++ * arm it's model, and disarm the model otherwise. The menu item ++ * is considered to be selected, and thus highlighted when its model ++ * is armed. ++ * ++ * @param changed indicates selection status of this menu item. If changed is ++ * true then menu item is selected and deselected otherwise. ++ */ ++ public void menuSelectionChanged(boolean changed) ++ { ++ if (changed) ++ { ++ model.setArmed(true); ++ ++ if (this.getParent() instanceof JPopupMenu) ++ ((JPopupMenu) this.getParent()).setSelected(this); ++ } ++ else ++ { ++ model.setArmed(false); ++ ++ if (this.getParent() instanceof JPopupMenu) ++ ((JPopupMenu) this.getParent()).getSelectionModel().clearSelection(); ++ } ++ } ++ ++ /** ++ * Method of the MenuElement interface. ++ * ++ * @return $MenuElement[]$ Returns array of sub-components for this menu ++ * item. By default menuItem doesn't have any subcomponents and so ++ * empty array is returned instead. ++ */ ++ public MenuElement[] getSubElements() ++ { ++ return new MenuElement[0]; ++ } ++ ++ /** ++ * Returns reference to the component that will paint this menu item. ++ * ++ * @return $Component$ Component that will paint this menu item. ++ * Simply returns reference to this menu item. ++ */ ++ public Component getComponent() ++ { ++ return this; ++ } ++ ++ /** ++ * Adds a MenuDragMouseListener to this menu item. When mouse ++ * is dragged over the menu item the MenuDragMouseEvents will be ++ * fired, and these listeners will be called. ++ * ++ * @param listener The new listener to add ++ */ ++ public void addMenuDragMouseListener(MenuDragMouseListener listener) ++ { ++ listenerList.add(MenuDragMouseListener.class, listener); ++ } ++ ++ /** ++ * Removes a MenuDragMouseListener from the menuItem's listener list. ++ * ++ * @param listener The listener to remove ++ */ ++ public void removeMenuDragMouseListener(MenuDragMouseListener listener) ++ { ++ listenerList.remove(MenuDragMouseListener.class, listener); ++ } ++ ++ /** ++ * Returns all added MenuDragMouseListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public MenuDragMouseListener[] getMenuDragMouseListeners() ++ { ++ return (MenuDragMouseListener[]) listenerList.getListeners(MenuDragMouseListener.class); ++ } ++ ++ /** ++ * Adds an MenuKeyListener to this menu item. This listener will be ++ * invoked when MenuKeyEvents will be fired by this menu item. ++ * ++ * @param listener The new listener to add ++ */ ++ public void addMenuKeyListener(MenuKeyListener listener) ++ { ++ listenerList.add(MenuKeyListener.class, listener); ++ } ++ ++ /** ++ * Removes an MenuKeyListener from the menuItem's listener list. ++ * ++ * @param listener The listener to remove ++ */ ++ public void removeMenuKeyListener(MenuKeyListener listener) ++ { ++ listenerList.remove(MenuKeyListener.class, listener); ++ } ++ ++ /** ++ * Returns all added MenuKeyListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public MenuKeyListener[] getMenuKeyListeners() ++ { ++ return (MenuKeyListener[]) listenerList.getListeners(MenuKeyListener.class); ++ } ++ ++ /** ++ * A string that describes this JMenuItem. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JMenuItem ++ */ ++ protected String paramString() ++ { ++ return "JMenuItem"; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJMenuItem(); ++ ++ return accessibleContext; ++ } ++ ++ protected class AccessibleJMenuItem extends AccessibleAbstractButton ++ implements ChangeListener ++ { ++ private static final long serialVersionUID = 6748924232082076534L; ++ ++ /** ++ * Creates a new AccessibleJMenuItem object. ++ */ ++ AccessibleJMenuItem() ++ { ++ //super(component); ++ } ++ ++ public void stateChanged(ChangeEvent event) ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.MENU_ITEM; ++ } ++ } ++} +Index: javax/swing/JOptionPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JOptionPane.java,v +retrieving revision 1.2 +diff -u -r1.2 JOptionPane.java +--- javax/swing/JOptionPane.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JOptionPane.java 6 Sep 2004 16:35:57 -0000 +@@ -1,5 +1,5 @@ +-/* JOptionPane.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JOptionPane.java ++ Copyright (C) 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,365 +35,1515 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + +-import java.awt.BorderLayout; + import java.awt.Component; + import java.awt.Dialog; ++import java.awt.Dimension; + import java.awt.Frame; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.swing.Icon; ++import javax.swing.JInternalFrame; ++import javax.swing.event.InternalFrameAdapter; ++import javax.swing.event.InternalFrameEvent; + import javax.swing.plaf.OptionPaneUI; + +-public class JOptionPane extends JComponent +-{ +- public static final int DEFAULT_OPTION = 0; +- public static final int YES_NO_OPTION = 1; +- public static final int YES_NO_CANCEL_OPTION = 2; +- public static final int OK_CANCEL_OPTION = 3; +- public static final int YES_OPTION = 4; +- public static final int NO_OPTION = 5; +- public static final int CANCEL_OPTION = 6; +- public static final int OK_OPTION = 7; +- public static final int CLOSED_OPTION = 8; +- +- public static final int ERROR_MESSAGE = 0; +- public static final int INFORMATION_MESSAGE = 1; +- public static final int WARNING_MESSAGE = 2; +- public static final int QUESTION_MESSAGE = 3; +- public static final int PLAIN_MESSAGE = 4; +- +- final static String VALUE_PROPERTY = "value_prop"; +- final static String INPUT_VALUE_PROPERTY = "input_value_prop"; +- +- final static String UNINITIALIZED_VALUE = "uninit"; +- +- // Ronald: shouldnt by public ? +- public Object msg; +- public int mtype; +- public int otype; +- public Icon icon; +- public Object []args; +- public Object init; +- +- public JDialog dialog; +- +- /***************************************************************************** +- * +- * +- * joptionpanels +- * +- * +- ***********************************/ +- +- JOptionPane() +- { +- this("mess"); +- } +- +- JOptionPane(Object m) +- { +- this(m, PLAIN_MESSAGE); +- } +- +- JOptionPane(Object m, +- int mtype) +- { +- this(m, mtype, DEFAULT_OPTION); +- } +- +- JOptionPane(Object m, +- int mtype, +- int otype) +- { +- this(m, mtype, otype, null); +- } +- +- JOptionPane(Object m, +- int mtype, +- int otype, +- Icon icon) +- { +- this(m, mtype, otype, icon, null); +- } + +- JOptionPane(Object m, +- int mtype, +- int otype, +- Icon icon, +- Object []args) +- { +- this(m, mtype, otype, icon, args, null); +- } +- +- JOptionPane(Object msg, +- int mtype, +- int otype, +- Icon icon, +- Object []args, +- Object init) ++/** ++ * This class creates different types of JDialogs and JInternalFrames that can ++ * ask users for input or pass on information. JOptionPane can be used by ++ * calling one of the show static methods or by creating an instance of ++ * JOptionPane and calling createDialog or createInternalFrame. ++ */ ++public class JOptionPane extends JComponent implements Accessible ++{ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJOptionPane extends JComponent.AccessibleJComponent ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 686071432213084821L; ++ ++ /** ++ * Creates a new AccessibleJOptionPane object. ++ */ ++ protected AccessibleJOptionPane() + { +- // this(m, mtype, otype, icon, args, init); +- this.msg = msg; +- this.mtype = mtype; +- this.otype = otype; +- this.icon = icon; +- this.args = args; +- this.init = init; +- +- updateUI(); + } + +- +- /***************************************************************************** +- * +- * +- * ++ /** ++ * DOCUMENT ME! + * +- * +- ***********************************/ +- +- Object val; +- public void setValue(Object v) +- { val = v; } +- public Object getValue() +- { return val; } +- +- public String getUIClassID() +- { return "JOptionPane"; } +- +- +- public void setUI(OptionPaneUI ui) { +- super.setUI(ui); +- } +- +- public OptionPaneUI getUI() { +- return (OptionPaneUI)ui; +- } +- +- public void updateUI() { +- setUI((OptionPaneUI)UIManager.getUI(this)); +- } +- +- +- public AccessibleContext getAccessibleContext() +- { +- return null; +- } +- +- protected String paramString() +- { +- return "JOptionPane"; +- } +- +- public static void showMessageDialog(Component frame, +- String msg, +- String title, +- int bla) +- { +- DoShowOptionDialog(frame, +- msg, +- title, +- bla, +- 0, +- null, +- null, +- null); +- } +- +- public static void showMessageDialog(Component frame, +- String msg, +- String title, +- int bla, +- Icon icon) +- { +- DoShowOptionDialog(frame, +- msg, +- title, +- bla, +- 0, +- icon, +- null, +- null); +- } +- +- public static void showMessageDialog(Component frame, +- String msg) +- { +- showMessageDialog(frame, +- msg, +- null); +- } +- +- +- public static void showMessageDialog(Component frame, +- String msg, +- Icon icon) +- { +- //System.out.println("++++++++++++++++++creating message dialog:"+msg + ", frame="+frame); +- DoShowOptionDialog(frame, +- msg, +- "Message", +- DEFAULT_OPTION, +- PLAIN_MESSAGE, +- icon, +- null, +- null); +- } +- +- public static int showConfirmDialog(JFrame frame, +- String yes, +- String no, +- int bla) +- { +- return 0; +- } +- +- public static String showInputDialog(JFrame frame, +- String msg, +- String title, +- int opt_type, +- int msg_type, +- Icon icon, +- Object[] opts, +- Object init) +- { +- return (String) DoShowOptionDialog(frame, +- msg, +- title, +- opt_type, +- msg_type, +- icon, +- opts, +- init); +- } +- +- public static Object showInputDialog(JFrame frame, +- String msg, +- String title, +- int opt_type, +- Icon icon, +- Object[] opts, +- Object init) ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() + { +- return DoShowOptionDialog(frame, +- msg, +- title, +- opt_type, +- 0, //msg_type, +- icon, +- opts, +- init); ++ return null; + } ++ } + ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 5231143276678566796L; ++ ++ /** The value returned when cancel option is selected. */ ++ public static final int CANCEL_OPTION = 2; ++ ++ /** The value returned when the dialog is closed without a selection. */ ++ public static final int CLOSED_OPTION = -1; ++ ++ /** An option used in confirmation dialog methods. */ ++ public static final int DEFAULT_OPTION = -1; ++ ++ /** The value returned when the no option is selected. */ ++ public static final int NO_OPTION = 1; ++ ++ /** An option used in confirmation dialog methods. */ ++ public static final int OK_CANCEL_OPTION = 2; ++ ++ /** The value returned when the ok option is selected. */ ++ public static final int OK_OPTION = 0; ++ ++ /** An option used in confirmation dialog methods. */ ++ public static final int YES_NO_CANCEL_OPTION = 1; ++ ++ /** An option used in confirmation dialog methods. */ ++ public static final int YES_NO_OPTION = 0; ++ ++ /** The value returned when the yes option is selected. */ ++ public static final int YES_OPTION = 0; ++ ++ /** Identifier for the error message type. */ ++ public static final int ERROR_MESSAGE = 0; ++ ++ /** Identifier for the information message type. */ ++ public static final int INFORMATION_MESSAGE = 1; ++ ++ /** Identifier for the plain message type. */ ++ public static final int PLAIN_MESSAGE = -1; ++ ++ /** Identifier for the question message type. */ ++ public static final int QUESTION_MESSAGE = 3; ++ ++ /** Identifier for the warning message type. */ ++ public static final int WARNING_MESSAGE = 2; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the icon property ++ * changes. ++ */ ++ public static final String ICON_PROPERTY = "icon"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the initialSelectionValue ++ * property changes. ++ */ ++ public static final String INITIAL_SELECTION_VALUE_PROPERTY = "initialSelectionValue"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the initialValue property ++ * changes. ++ */ ++ public static final String INITIAL_VALUE_PROPERTY = "initialValue"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the inputValue property ++ * changes. ++ */ ++ public static final String INPUT_VALUE_PROPERTY = "inputValue"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the message property ++ * changes. ++ */ ++ public static final String MESSAGE_PROPERTY = "message"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the messageType property ++ * changes. ++ */ ++ public static final String MESSAGE_TYPE_PROPERTY = "messageType"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the optionType property ++ * changes. ++ */ ++ public static final String OPTION_TYPE_PROPERTY = "optionType"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the options property ++ * changes. ++ */ ++ public static final String OPTIONS_PROPERTY = "options"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the selectionValues ++ * property changes. ++ */ ++ public static final String SELECTION_VALUES_PROPERTY = "selectionValues"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the value property ++ * changes. ++ */ ++ public static final String VALUE_PROPERTY = "value"; ++ ++ /** ++ * The identifier for the propertyChangeEvent when the wantsInput property ++ * changes. ++ */ ++ public static final String WANTS_INPUT_PROPERTY = "wantsInput"; ++ ++ /** The value returned when the inputValue is uninitialized. */ ++ public static Object UNINITIALIZED_VALUE = "uninitializedValue"; ++ ++ /** The icon displayed in the dialog/internal frame. */ ++ protected Icon icon; ++ ++ /** The initial selected value in the input component. */ ++ protected Object initialSelectionValue; ++ ++ /** The object that is initially selected for options. */ ++ protected Object initialValue; ++ ++ /** The value the user inputs. */ ++ protected Object inputValue = UNINITIALIZED_VALUE; ++ ++ /** The message displayed in the dialog/internal frame. */ ++ protected Object message; ++ ++ /** The type of message displayed. */ ++ protected int messageType = PLAIN_MESSAGE; ++ ++ /** ++ * The options (usually buttons) aligned at the bottom for the user to ++ * select. ++ */ ++ protected Object[] options; ++ ++ /** The type of options to display. */ ++ protected int optionType = DEFAULT_OPTION; ++ ++ /** The input values the user can select. */ ++ protected Object[] selectionValues; ++ ++ /** The value returned by selecting an option. */ ++ protected Object value = UNINITIALIZED_VALUE; ++ ++ /** Whether the Dialog/InternalFrame needs input. */ ++ protected boolean wantsInput; ++ ++ /** The common frame used when no parent is provided. */ ++ private static Frame privFrame = SwingUtilities.getOwnerFrame(); ++ ++ /** ++ * Creates a new JOptionPane object using a message of "JOptionPane ++ * message", using the PLAIN_MESSAGE type and DEFAULT_OPTION. ++ */ ++ public JOptionPane() ++ { ++ this("JOptionPane message", PLAIN_MESSAGE, DEFAULT_OPTION, null, null, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message using the ++ * PLAIN_MESSAGE type and DEFAULT_OPTION. ++ * ++ * @param message The message to display. ++ */ ++ public JOptionPane(Object message) ++ { ++ this(message, PLAIN_MESSAGE, DEFAULT_OPTION, null, null, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message and messageType ++ * and DEFAULT_OPTION. ++ * ++ * @param message The message to display. ++ * @param messageType The type of message. ++ */ ++ public JOptionPane(Object message, int messageType) ++ { ++ this(message, messageType, DEFAULT_OPTION, null, null, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message, messageType and ++ * optionType. ++ * ++ * @param message The message to display. ++ * @param messageType The type of message. ++ * @param optionType The type of options. ++ */ ++ public JOptionPane(Object message, int messageType, int optionType) ++ { ++ this(message, messageType, optionType, null, null, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message, messageType, ++ * optionType and icon. ++ * ++ * @param message The message to display. ++ * @param messageType The type of message. ++ * @param optionType The type of options. ++ * @param icon The icon to display. ++ */ ++ public JOptionPane(Object message, int messageType, int optionType, Icon icon) ++ { ++ this(message, messageType, optionType, icon, null, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message, messageType, ++ * optionType, icon and options. ++ * ++ * @param message The message to display. ++ * @param messageType The type of message. ++ * @param optionType The type of options. ++ * @param icon The icon to display. ++ * @param options The options given. ++ */ ++ public JOptionPane(Object message, int messageType, int optionType, ++ Icon icon, Object[] options) ++ { ++ this(message, messageType, optionType, icon, options, null); ++ } ++ ++ /** ++ * Creates a new JOptionPane object using the given message, messageType, ++ * optionType, icon, options and initialValue. The initialValue will be ++ * focused initially. ++ * ++ * @param message The message to display. ++ * @param messageType The type of message. ++ * @param optionType The type of options. ++ * @param icon The icon to display. ++ * @param options The options given. ++ * @param initialValue The component to focus on initially. ++ * ++ * @throws IllegalArgumentException If the messageType or optionType are not ++ * legal values. ++ */ ++ public JOptionPane(Object message, int messageType, int optionType, ++ Icon icon, Object[] options, Object initialValue) ++ { ++ this.message = message; ++ if (! validMessageType(messageType)) ++ throw new IllegalArgumentException("Message Type not legal value."); ++ this.messageType = messageType; ++ if (! validOptionType(optionType)) ++ throw new IllegalArgumentException("Option Type not legal value."); ++ this.optionType = optionType; ++ this.icon = icon; ++ this.options = options; ++ this.initialValue = initialValue; ++ ++ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); ++ ++ updateUI(); ++ invalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method creates a new JDialog that is either centered around the ++ * parent's frame or centered on the screen (if the parent is null). The ++ * JDialog will not be resizable and will be modal. Once the JDialog is ++ * disposed, the inputValue and value properties will be set by the ++ * optionPane. ++ * ++ * @param parentComponent The parent of the Dialog. ++ * @param title The title in the bar of the JDialog. ++ * ++ * @return A new JDialog based on the JOptionPane configuration. ++ */ ++ public JDialog createDialog(Component parentComponent, String title) ++ { ++ Frame toUse = getFrameForComponent(parentComponent); ++ if (toUse == null) ++ toUse = getRootFrame(); ++ ++ JDialog dialog = new JDialog(toUse, title); ++ inputValue = UNINITIALIZED_VALUE; ++ value = UNINITIALIZED_VALUE; ++ ++ // FIXME: This dialog should be centered on the parent ++ // or at the center of the screen (if the parent is null) ++ // Need getGraphicsConfiguration to return non-null in ++ // order for that to work so we know how large the ++ // screen is. ++ dialog.getContentPane().add(this); ++ dialog.setModal(true); ++ dialog.setResizable(false); ++ dialog.invalidate(); ++ dialog.repaint(); ++ ++ return dialog; ++ } ++ ++ /** ++ * This method creates a new JInternalFrame that is in the JDesktopPane ++ * which contains the parentComponent given. If no suitable JDesktopPane ++ * can be found from the parentComponent given, a RuntimeException will be ++ * thrown. ++ * ++ * @param parentComponent The parent to find a JDesktopPane from. ++ * @param title The title of the JInternalFrame. ++ * ++ * @return A new JInternalFrame based on the JOptionPane configuration. ++ * ++ * @throws RuntimeException If no suitable JDesktopPane is found. ++ */ ++ public JInternalFrame createInternalFrame(Component parentComponent, ++ String title) ++ throws RuntimeException ++ { ++ JDesktopPane toUse = getDesktopPaneForComponent(parentComponent); ++ if (toUse == null) ++ throw new RuntimeException("parentComponent does not have a valid parent"); ++ ++ JInternalFrame frame = new JInternalFrame(title); ++ ++ inputValue = UNINITIALIZED_VALUE; ++ value = UNINITIALIZED_VALUE; ++ ++ frame.setClosable(true); ++ toUse.add(frame); ++ ++ // FIXME: JLayeredPane broken? See bug # 16576 ++ // frame.setLayer(JLayeredPane.MODAL_LAYER); ++ return frame; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJOptionPane(); ++ return accessibleContext; ++ } ++ ++ /** ++ * This method returns the JDesktopPane for the given parentComponent or ++ * null if none can be found. ++ * ++ * @param parentComponent The component to look in. ++ * ++ * @return The JDesktopPane for the given component or null if none can be ++ * found. ++ */ ++ public static JDesktopPane getDesktopPaneForComponent(Component parentComponent) ++ { ++ return (JDesktopPane) SwingUtilities.getAncestorOfClass(JDesktopPane.class, ++ parentComponent); ++ } ++ ++ /** ++ * This method returns the Frame for the given parentComponent or null if ++ * none can be found. ++ * ++ * @param parentComponent The component to look in. ++ * ++ * @return The Frame for the given component or null if none can be found. ++ */ ++ public static Frame getFrameForComponent(Component parentComponent) ++ { ++ return (Frame) SwingUtilities.getAncestorOfClass(Frame.class, ++ parentComponent); ++ } ++ ++ /** ++ * This method returns the icon displayed. ++ * ++ * @return The icon displayed. ++ */ ++ public Icon getIcon() ++ { ++ return icon; ++ } ++ ++ /** ++ * This method returns the value initially selected from the list of values ++ * the user can input. ++ * ++ * @return The initial selection value. ++ */ ++ public Object getInitialSelectionValue() ++ { ++ return initialSelectionValue; ++ } ++ ++ /** ++ * This method returns the value that is focused from the list of options. ++ * ++ * @return The initial value from options. ++ */ ++ public Object getInitialValue() ++ { ++ return initialValue; ++ } ++ ++ /** ++ * This method returns the value that the user input. ++ * ++ * @return The user's input value. ++ */ ++ public Object getInputValue() ++ { ++ return inputValue; ++ } ++ ++ /** ++ * This method returns the maximum characters per line. By default, this is ++ * Integer.MAX_VALUE. ++ * ++ * @return The maximum characters per line. ++ */ ++ public int getMaxCharactersPerLineCount() ++ { ++ return Integer.MAX_VALUE; ++ } ++ ++ /** ++ * This method returns the message displayed. ++ * ++ * @return The message displayed. ++ */ ++ public Object getMessage() ++ { ++ return message; ++ } ++ ++ /** ++ * This method returns the message type. ++ * ++ * @return The message type. ++ */ ++ public int getMessageType() ++ { ++ return messageType; ++ } ++ ++ /** ++ * This method returns the options. ++ * ++ * @return The options. ++ */ ++ public Object[] getOptions() ++ { ++ return options; ++ } ++ ++ /** ++ * This method returns the option type. ++ * ++ * @return The option type. ++ */ ++ public int getOptionType() ++ { ++ return optionType; ++ } ++ ++ /** ++ * This method returns the Frame used by JOptionPane dialog's that have no ++ * parent. ++ * ++ * @return The Frame used by dialogs that have no parent. ++ */ ++ public static Frame getRootFrame() ++ { ++ return privFrame; ++ } ++ ++ /** ++ * This method returns the selection values. ++ * ++ * @return The selection values. ++ */ ++ public Object[] getSelectionValues() ++ { ++ return selectionValues; ++ } ++ ++ /** ++ * This method returns the UI used by the JOptionPane. ++ * ++ * @return The UI used by the JOptionPane. ++ */ ++ public OptionPaneUI getUI() ++ { ++ return (OptionPaneUI) ui; ++ } ++ ++ /** ++ * This method returns an identifier to determine which UI class will act as ++ * the UI. ++ * ++ * @return The UI identifier. ++ */ ++ public String getUIClassID() ++ { ++ return "OptionPaneUI"; ++ } ++ ++ /** ++ * This method returns the value that the user selected out of options. ++ * ++ * @return The value that the user selected out of options. ++ */ ++ public Object getValue() ++ { ++ return value; ++ } ++ ++ /** ++ * This method returns whether this JOptionPane wants input. ++ * ++ * @return Whether this JOptionPane wants input. ++ */ ++ public boolean getWantsInput() ++ { ++ return wantsInput; ++ } ++ ++ /** ++ * This method returns a String that describes this JOptionPane. ++ * ++ * @return A String that describes this JOptionPane. ++ */ ++ protected String paramString() ++ { ++ return "JOptionPane"; ++ } ++ ++ /** ++ * This method requests focus for the initial value. ++ */ ++ public void selectInitialValue() ++ { ++ if (ui != null) ++ ((OptionPaneUI) ui).selectInitialValue(this); ++ } ++ ++ /** ++ * This method changes the icon property. ++ * ++ * @param newIcon The new icon to use. ++ */ ++ public void setIcon(Icon newIcon) ++ { ++ if (icon != newIcon) ++ { ++ Icon old = icon; ++ icon = newIcon; ++ firePropertyChange(ICON_PROPERTY, old, icon); ++ } ++ } ++ ++ /** ++ * This method changes the initial selection property. ++ * ++ * @param newValue The new initial selection. ++ */ ++ public void setInitialSelectionValue(Object newValue) ++ { ++ if (initialSelectionValue != newValue) ++ { ++ Object old = initialSelectionValue; ++ initialSelectionValue = newValue; ++ firePropertyChange(INITIAL_SELECTION_VALUE_PROPERTY, old, ++ initialSelectionValue); ++ } ++ } ++ ++ /** ++ * This method changes the initial value property. ++ * ++ * @param newValue The new initial value. ++ */ ++ public void setInitialValue(Object newValue) ++ { ++ if (initialValue != newValue) ++ { ++ Object old = initialValue; ++ initialValue = newValue; ++ firePropertyChange(INITIAL_VALUE_PROPERTY, old, initialValue); ++ } ++ } ++ ++ /** ++ * This method changes the inputValue property. ++ * ++ * @param newValue The new inputValue. ++ */ ++ public void setInputValue(Object newValue) ++ { ++ if (inputValue != newValue) ++ { ++ Object old = inputValue; ++ inputValue = newValue; ++ firePropertyChange(INPUT_VALUE_PROPERTY, old, inputValue); ++ } ++ } ++ ++ /** ++ * This method changes the message property. ++ * ++ * @param newMessage The new message. ++ */ ++ public void setMessage(Object newMessage) ++ { ++ if (message != newMessage) ++ { ++ Object old = message; ++ message = newMessage; ++ firePropertyChange(MESSAGE_PROPERTY, old, message); ++ } ++ } ++ ++ /** ++ * This method changes the messageType property. ++ * ++ * @param newType The new messageType. ++ * ++ * @throws IllegalArgumentException If the messageType is not valid. ++ */ ++ public void setMessageType(int newType) ++ { ++ if (! validMessageType(newType)) ++ throw new IllegalArgumentException("Message Type not legal value."); ++ if (newType != messageType) ++ { ++ int old = messageType; ++ messageType = newType; ++ firePropertyChange(MESSAGE_TYPE_PROPERTY, old, messageType); ++ } ++ } ++ ++ /** ++ * This method changes the options property. ++ * ++ * @param newOptions The new options. ++ */ ++ public void setOptions(Object[] newOptions) ++ { ++ if (options != newOptions) ++ { ++ Object[] old = options; ++ options = newOptions; ++ firePropertyChange(OPTIONS_PROPERTY, old, options); ++ } ++ } ++ ++ /** ++ * This method changes the optionType property. ++ * ++ * @param newType The new optionType. ++ * ++ * @throws IllegalArgumentException If the optionType is not valid. ++ */ ++ public void setOptionType(int newType) ++ { ++ if (! validOptionType(newType)) ++ throw new IllegalArgumentException("Option Type not legal value."); ++ if (newType != optionType) ++ { ++ int old = optionType; ++ optionType = newType; ++ firePropertyChange(OPTION_TYPE_PROPERTY, old, optionType); ++ } ++ } ++ ++ /** ++ * This method changes the Frame used for JOptionPane dialogs that have no ++ * parent. ++ * ++ * @param newRootFrame The Frame to use for dialogs that have no parent. ++ */ ++ public static void setRootFrame(Frame newRootFrame) ++ { ++ privFrame = newRootFrame; ++ } ++ ++ /** ++ * This method changes the selectionValues property. ++ * ++ * @param newValues The new selectionValues. ++ */ ++ public void setSelectionValues(Object[] newValues) ++ { ++ if (newValues != selectionValues) ++ { ++ if (newValues != null) ++ wantsInput = true; ++ Object[] old = selectionValues; ++ selectionValues = newValues; ++ firePropertyChange(SELECTION_VALUES_PROPERTY, old, selectionValues); ++ } ++ } ++ ++ /** ++ * This method sets the UI used with the JOptionPane. ++ * ++ * @param ui The UI used with the JOptionPane. ++ */ ++ public void setUI(OptionPaneUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets the value has been selected out of options. ++ * ++ * @param newValue The value that has been selected out of options. ++ */ ++ public void setValue(Object newValue) ++ { ++ if (value != newValue) ++ { ++ Object old = value; ++ value = newValue; ++ firePropertyChange(VALUE_PROPERTY, old, value); ++ } ++ } ++ ++ /** ++ * This method changes the wantsInput property. ++ * ++ * @param newValue Whether this JOptionPane requires input. ++ */ ++ public void setWantsInput(boolean newValue) ++ { ++ if (wantsInput != newValue) ++ { ++ boolean old = wantsInput; ++ wantsInput = newValue; ++ firePropertyChange(WANTS_INPUT_PROPERTY, old, wantsInput); ++ } ++ } ++ ++ /** ++ * This method shows a confirmation dialog with the title "Select an Option" ++ * and displays the given message. The parent frame will be the same as the ++ * parent frame of the given parentComponent. This method returns the ++ * option chosen by the user. ++ * ++ * @param parentComponent The parentComponent to find a frame in. ++ * @param message The message to display. ++ * ++ * @return The option that was selected. ++ */ ++ public static int showConfirmDialog(Component parentComponent, Object message) ++ { ++ JOptionPane pane = new JOptionPane(message); ++ JDialog dialog = pane.createDialog(parentComponent, "Select an Option"); ++ ++ dialog.pack(); ++ dialog.show(); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows a confirmation dialog with the given message, ++ * optionType and title. The frame that owns the dialog will be the same ++ * frame that holds the given parentComponent. This method returns the ++ * option that was chosen. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param optionType The optionType. ++ * ++ * @return The option that was chosen. ++ */ ++ public static int showConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType) ++ { ++ JOptionPane pane = new JOptionPane(message, PLAIN_MESSAGE, optionType); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows a confirmation dialog with the given message, title, ++ * messageType and optionType. The frame owner will be the same frame as ++ * the one that holds the given parentComponent. This method returns the ++ * option selected by the user. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param optionType The optionType. ++ * @param messageType The messageType. ++ * ++ * @return The selected option. ++ */ ++ public static int showConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows a confirmation dialog with the given message, title, ++ * optionType, messageType and icon. The frame owner will be the same as ++ * the one that holds the given parentComponent. This method returns the ++ * option selected by the user. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param optionType The optionType. ++ * @param messageType The messsageType. ++ * @param icon The icon displayed. ++ * ++ * @return The selected option. ++ */ ++ public static int showConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType, ++ Icon icon) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType, icon); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method will show a QUESTION_MESSAGE input dialog with the given ++ * message. No selectionValues is set so the Look and Feel will usually ++ * give the user a TextField to fill out. The frame owner will be the same ++ * frame that holds the given parentComponent. This method will return the ++ * value entered by the user. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * ++ * @return The value entered by the user. ++ */ ++ public static String showInputDialog(Component parentComponent, ++ Object message) ++ { ++ JOptionPane pane = new JOptionPane(message, QUESTION_MESSAGE); ++ pane.setWantsInput(true); ++ JDialog dialog = pane.createDialog(parentComponent, null); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method will show a QUESTION_MESSAGE type input dialog with the given ++ * message and initialSelectionValue. Since there is no selectionValues ++ * set, the Look and Feel will usually give a TextField to fill out. The ++ * frame owner will be the same as the one that holds the given ++ * parentComponent. This method will return the value entered by the user. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message to display. ++ * @param initialSelectionValue The initially selected value. ++ * ++ * @return The value the user input. ++ */ ++ public static String showInputDialog(Component parentComponent, ++ Object message, ++ Object initialSelectionValue) ++ { ++ JOptionPane pane = new JOptionPane(message, QUESTION_MESSAGE); ++ pane.setInitialSelectionValue(initialSelectionValue); ++ pane.setWantsInput(true); ++ JDialog dialog = pane.createDialog(parentComponent, null); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method displays a new input dialog with the given message, title and ++ * messageType. Since no selectionValues value is given, the Look and Feel ++ * will usually give the user a TextField to input data to. This method ++ * returns the value the user inputs. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message to display. ++ * @param title The title of the dialog. ++ * @param messageType The messageType. ++ * ++ * @return The value the user input. ++ */ ++ public static String showInputDialog(Component parentComponent, ++ Object message, String title, ++ int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setWantsInput(true); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows an input dialog with the given message, title, ++ * messageType, icon, selectionValues, and initialSelectionValue. This ++ * method returns the value that the user selects. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param messageType The messageType. ++ * @param icon The icon displayed. ++ * @param selectionValues The list of values to select from. ++ * @param initialSelectionValue The initially selected value. ++ * ++ * @return The user selected value. ++ */ ++ public static Object showInputDialog(Component parentComponent, ++ Object message, String title, ++ int messageType, Icon icon, ++ Object[] selectionValues, ++ Object initialSelectionValue) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setWantsInput(true); ++ pane.setIcon(icon); ++ pane.setSelectionValues(selectionValues); ++ pane.setInitialSelectionValue(initialSelectionValue); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows a QUESTION_MESSAGE type input dialog. Since no ++ * selectionValues is set, the Look and Feel will usually give the user a ++ * TextField to input data to. This method returns the value the user ++ * inputs. ++ * ++ * @param message The message to display. ++ * ++ * @return The user selected value. ++ */ ++ public static String showInputDialog(Object message) ++ { ++ JOptionPane pane = new JOptionPane(message, QUESTION_MESSAGE); ++ pane.setWantsInput(true); ++ JDialog dialog = pane.createDialog(null, null); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows a QUESTION_MESSAGE type input dialog. Since no ++ * selectionValues is set, the Look and Feel will usually give the user a ++ * TextField to input data to. The input component will be initialized with ++ * the initialSelectionValue. This method returns the value the user ++ * inputs. ++ * ++ * @param message The message to display. ++ * @param initialSelectionValue The initialSelectionValue. ++ * ++ * @return The user selected value. ++ */ ++ public static String showInputDialog(Object message, ++ Object initialSelectionValue) ++ { ++ JOptionPane pane = new JOptionPane(message, QUESTION_MESSAGE); ++ pane.setWantsInput(true); ++ pane.setInitialSelectionValue(initialSelectionValue); ++ JDialog dialog = pane.createDialog(null, null); ++ dialog.pack(); ++ dialog.show(); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows an internal confirmation dialog with the given message. ++ * The internal frame dialog will be placed in the first JDesktopPane ++ * ancestor of the given parentComponent. This method will return the value ++ * selected. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message to display. ++ * ++ * @return The value selected. ++ */ ++ public static int showInternalConfirmDialog(Component parentComponent, ++ Object message) ++ { ++ JOptionPane pane = new JOptionPane(message); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, null); ++ ++ startModal(frame, pane); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows an internal confirmation dialog with the given message, ++ * optionType and title. The internal frame dialog will be placed in the ++ * first JDesktopPane ancestor of the given parentComponent. This method ++ * will return the selected value. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param optionType The option type. ++ * ++ * @return The selected value. ++ */ ++ public static int showInternalConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType) ++ { ++ JOptionPane pane = new JOptionPane(message, PLAIN_MESSAGE, optionType); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows an internal confirmation dialog with the given message, ++ * title, optionTypes and icon for the given message type. The internal ++ * confirmation dialog will be placed in the first instance of ++ * JDesktopPane ancestor of the given parentComponent. ++ * ++ * @param parentComponent The component to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title of the dialog. ++ * @param optionType The option type. ++ * @param messageType The message type. ++ * ++ * @return The selected value. ++ */ ++ public static int showInternalConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows an internal confirmation dialog with the given message, ++ * title, option type, message type, and icon. The internal frame dialog ++ * will be placed in the first JDesktopPane ancestor that is found in the ++ * given parentComponent. This method returns the selected value. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param optionType The option type. ++ * @param messageType The message type. ++ * @param icon The icon to display. ++ * ++ * @return The selected value. ++ */ ++ public static int showInternalConfirmDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType, ++ Icon icon) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType, icon); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows an internal input dialog with the given message. The ++ * internal frame dialog will be placed in the first JDesktopPane ancestor ++ * of the given parent component. This method returns the value input by ++ * the user. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message to display. ++ * ++ * @return The user selected value. ++ */ ++ public static String showInternalInputDialog(Component parentComponent, ++ Object message) ++ { ++ JOptionPane pane = new JOptionPane(message); ++ pane.setWantsInput(true); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, null); ++ ++ startModal(frame, pane); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows an internal input dialog with the given message, title ++ * and message type. The internal input dialog will be placed in the first ++ * JDesktopPane ancestor found in the given parent component. This method ++ * will return the input value given by the user. ++ * ++ * @param parentComponent The component to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param messageType The message type. ++ * ++ * @return The user input value. ++ */ ++ public static String showInternalInputDialog(Component parentComponent, ++ Object message, String title, ++ int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setWantsInput(true); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows an internal input dialog with the given message, title ++ * message type, icon, selection value list and initial selection value. ++ * The internal frame dialog will be placed in the first JDesktopPane ++ * ancestor found in the given parent component. This method returns the ++ * input value from the user. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param messageType The message type. ++ * @param icon The icon to display. ++ * @param selectionValues The selection value list. ++ * @param initialSelectionValue The initial selection value. ++ * ++ * @return The user input value. ++ */ ++ public static Object showInternalInputDialog(Component parentComponent, ++ Object message, String title, ++ int messageType, Icon icon, ++ Object[] selectionValues, ++ Object initialSelectionValue) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setWantsInput(true); ++ pane.setIcon(icon); ++ pane.setSelectionValues(selectionValues); ++ pane.setInitialSelectionValue(initialSelectionValue); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return (String) pane.getInputValue(); ++ } ++ ++ /** ++ * This method shows an internal message dialog with the given message. The ++ * internal frame dialog will be placed in the first JDesktopPane ancestor ++ * found in the given parent component. ++ * ++ * @param parentComponent The component to find a JDesktopPane in. ++ * @param message The message to display. ++ */ ++ public static void showInternalMessageDialog(Component parentComponent, ++ Object message) ++ { ++ JOptionPane pane = new JOptionPane(message); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, null); ++ ++ startModal(frame, pane); ++ } ++ ++ /** ++ * This method shows an internal message dialog with the given message, ++ * title and message type. The internal message dialog is placed in the ++ * first JDesktopPane ancestor found in the given parent component. ++ * ++ * @param parentComponent The parent component to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param messageType The message type. ++ */ ++ public static void showInternalMessageDialog(Component parentComponent, ++ Object message, String title, ++ int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ } ++ ++ /** ++ * This method shows an internal message dialog with the given message, ++ * title, message type and icon. The internal message dialog is placed in ++ * the first JDesktopPane ancestor found in the given parent component. ++ * ++ * @param parentComponent The component to find a JDesktopPane in. ++ * @param message The message to display. ++ * @param title The title to display. ++ * @param messageType The message type. ++ * @param icon The icon to display. ++ */ ++ public static void showInternalMessageDialog(Component parentComponent, ++ Object message, String title, ++ int messageType, Icon icon) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setIcon(icon); ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ } ++ ++ /** ++ * This method displays an internal option dialog with the given message, ++ * title, option type, message type, icon, option list, and initial option ++ * value. The internal option dialog is placed in the first JDesktopPane ++ * ancestor found in the parent component. This method returns the option ++ * selected. ++ * ++ * @param parentComponent The parent to find a JDesktopPane in. ++ * @param message The message displayed. ++ * @param title The title displayed. ++ * @param optionType The option type. ++ * @param messageType The message type. ++ * @param icon The icon to display. ++ * @param options The array of options. ++ * @param initialValue The initial value selected. ++ * ++ * @return The option that was selected. ++ */ ++ public static int showInternalOptionDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType, ++ Icon icon, Object[] options, ++ Object initialValue) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType, icon, ++ options, initialValue); ++ ++ JInternalFrame frame = pane.createInternalFrame(parentComponent, title); ++ ++ startModal(frame, pane); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method shows an INFORMATION_MESSAGE type message dialog. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ */ ++ public static void showMessageDialog(Component parentComponent, ++ Object message) ++ { ++ JOptionPane pane = new JOptionPane(message, INFORMATION_MESSAGE); ++ JDialog dialog = pane.createDialog(parentComponent, null); ++ dialog.pack(); ++ dialog.show(); ++ } ++ ++ /** ++ * This method shows a message dialog with the given message, title and ++ * messageType. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param messageType The messageType. ++ */ ++ public static void showMessageDialog(Component parentComponent, ++ Object message, String title, ++ int messageType) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ } ++ ++ /** ++ * This method shows a message dialog with the given message, title, ++ * messageType and icon. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param messageType The messageType. ++ * @param icon The icon displayed. ++ */ ++ public static void showMessageDialog(Component parentComponent, ++ Object message, String title, ++ int messageType, Icon icon) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType); ++ pane.setIcon(icon); ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ } ++ ++ /** ++ * This method shows an option dialog with the given message, title, ++ * optionType, messageType, icon, options and initialValue. This method ++ * returns the option that was selected. ++ * ++ * @param parentComponent The component to find a frame in. ++ * @param message The message displayed. ++ * @param title The title of the dialog. ++ * @param optionType The optionType. ++ * @param messageType The messageType. ++ * @param icon The icon displayed. ++ * @param options The options to choose from. ++ * @param initialValue The initial value. ++ * ++ * @return The selected option. ++ */ ++ public static int showOptionDialog(Component parentComponent, ++ Object message, String title, ++ int optionType, int messageType, ++ Icon icon, Object[] options, ++ Object initialValue) ++ { ++ JOptionPane pane = new JOptionPane(message, messageType, optionType, icon, ++ options, initialValue); ++ ++ JDialog dialog = pane.createDialog(parentComponent, title); ++ dialog.pack(); ++ dialog.show(); ++ ++ return ((Integer) pane.getValue()).intValue(); ++ } ++ ++ /** ++ * This method resets the UI to the Look and Feel default. ++ */ ++ public void updateUI() ++ { ++ setUI((OptionPaneUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns true if the key is a valid messageType. ++ * ++ * @param key The key to check. ++ * ++ * @return True if key is valid. ++ */ ++ private boolean validMessageType(int key) ++ { ++ switch (key) ++ { ++ case ERROR_MESSAGE: ++ case INFORMATION_MESSAGE: ++ case PLAIN_MESSAGE: ++ case QUESTION_MESSAGE: ++ case WARNING_MESSAGE: ++ return true; ++ } ++ return false; ++ } ++ ++ /** ++ * This method returns true if the key is a valid optionType. ++ * ++ * @param key The key to check. ++ * ++ * @return True if key is valid. ++ */ ++ private boolean validOptionType(int key) ++ { ++ switch (key) ++ { ++ case DEFAULT_OPTION: ++ case OK_CANCEL_OPTION: ++ case YES_NO_CANCEL_OPTION: ++ case YES_NO_OPTION: ++ return true; ++ } ++ return false; ++ } ++ ++ /** ++ * This helper method makes the JInternalFrame wait until it is notified by ++ * an InternalFrameClosing event. This method also adds the given ++ * JOptionPane to the JInternalFrame and sizes it according to the ++ * JInternalFrame's preferred size. ++ * ++ * @param f The JInternalFrame to make modal. ++ * @param pane The JOptionPane to add to the JInternalFrame. ++ */ ++ private static void startModal(JInternalFrame f, JOptionPane pane) ++ { ++ f.getContentPane().add(pane); ++ f.pack(); ++ f.show(); ++ ++ Dimension pref = f.getPreferredSize(); ++ f.setBounds(0, 0, pref.width, pref.height); ++ ++ synchronized (f) ++ { ++ final JInternalFrame tmp = f; ++ tmp.toFront(); + +- // everybody comes here eventually +- public static int showOptionDialog(Component frame, +- String msg, +- String title, +- int opt_type, +- int msg_type, +- Icon icon, +- Object[] opts, +- Object init) +- { +- Integer a = (Integer) DoShowOptionDialog(frame, +- msg, +- title, +- opt_type, +- msg_type, +- icon, +- opts, +- init); +- if (a == null) +- return -1; +- return a.intValue(); +- } +- +- public static Object DoShowOptionDialog(Component frame, +- String msg, +- String title, +- int opt_type, +- int msg_type, +- Icon icon, +- Object[] opts, +- Object init) +- { +- +- JOptionPane p = new JOptionPane(msg, +- msg_type, +- opt_type, +- icon, +- opts, +- init); +- System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ " + p.msg); +- +- +- JDialog a; +- +- if (frame == null) +- { +- a = new JDialog((Frame)frame, +- title, +- true); +- } +- else if (frame instanceof Dialog) ++ f.addInternalFrameListener(new InternalFrameAdapter() + { +- a = new JDialog((Dialog) frame, +- title, +- true); +- } +- else if (frame instanceof Frame) +- { +- a = new JDialog((Frame) frame, +- title, +- true); +- } +- else +- { +- System.out.println("HUUUUHHH, not a frame or dialog !"); +- +- a = new JDialog((Frame)null, +- title, +- true); +- } +- +- p.dialog = a; +- +- a.getContentPane().setLayout(new BorderLayout()); +- a.getContentPane().add(p, +- BorderLayout.CENTER); +- // package the deal +- a.pack(); +- +- a.setVisible(true); +- +- Object s = p.getValue(); +- +- System.out.println("RESULT FROM DIALOG = " + s); +- +- if (s == null) +- return null; +- +- return s; +- } +- ++ public void internalFrameClosed(InternalFrameEvent e) ++ { ++ synchronized (tmp) ++ { ++ tmp.removeInternalFrameListener(this); ++ tmp.notifyAll(); ++ } ++ } ++ }); ++ try ++ { ++ while (! f.isClosed()) ++ f.wait(); ++ } ++ catch (InterruptedException ignored) ++ { ++ } ++ } ++ } + } +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +Index: javax/swing/JPanel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JPanel.java,v +retrieving revision 1.3 +diff -u -r1.3 JPanel.java +--- javax/swing/JPanel.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JPanel.java 6 Sep 2004 16:35:57 -0000 +@@ -85,7 +85,7 @@ + } + + public String getUIClassID() +- { return "JPanel"; } ++ { return "PanelUI"; } + + + public void setUI(PanelUI ui) { +Index: javax/swing/JPasswordField.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JPasswordField.java,v +retrieving revision 1.3 +diff -u -r1.3 JPasswordField.java +--- javax/swing/JPasswordField.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JPasswordField.java 6 Sep 2004 16:35:57 -0000 +@@ -49,60 +49,36 @@ + * @author Andrew Selkirk + * @version 1.0 + */ +-public class JPasswordField extends JTextField { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJPasswordField +- */ +- protected class AccessibleJPasswordField extends AccessibleJTextField { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJPasswordField +- * @param component TODO +- */ +- protected AccessibleJPasswordField(JPasswordField component) { +- super(component); +- // TODO +- } // AccessibleJPasswordField() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.PASSWORD_TEXT; +- } // getAccessibleRole() +- +- +- } // AccessibleJPasswordField +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++public class JPasswordField extends JTextField ++{ ++ /** ++ * AccessibleJPasswordField ++ */ ++ protected class AccessibleJPasswordField extends AccessibleJTextField ++ { ++ private static final long serialVersionUID = -8477039424200681086L; ++ ++ /** ++ * Constructor AccessibleJPasswordField ++ */ ++ protected AccessibleJPasswordField() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.PASSWORD_TEXT; ++ } ++ } + + /** + * uiClassID + */ +- private static final String uiClassID = "PasswordFIeldUI"; ++ private static final String uiClassID = "PasswordFieldUI"; + + /** + * echoChar. Default is 0 +@@ -254,16 +230,15 @@ + return null; // TODO + } // paramString() + +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJPasswordField(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JPasswordField ++ /** ++ * getAccessibleContext ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJPasswordField(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JPopupMenu.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JPopupMenu.java,v +retrieving revision 1.3 +diff -u -r1.3 JPopupMenu.java +--- javax/swing/JPopupMenu.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JPopupMenu.java 6 Sep 2004 16:35:57 -0000 +@@ -1,4 +1,4 @@ +-/* JPopupMenu.java -- ++/* JPopupMenu.java + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -37,639 +37,1059 @@ + + package javax.swing; + ++import java.awt.BorderLayout; + import java.awt.Component; ++import java.awt.Container; + import java.awt.Dimension; ++import java.awt.Frame; + import java.awt.Graphics; ++import java.awt.GridBagConstraints; ++import java.awt.GridBagLayout; + import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Panel; ++import java.awt.Point; ++import java.awt.Window; + import java.awt.event.KeyEvent; + import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; + import java.io.IOException; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; ++import java.util.EventListener; ++import java.util.Vector; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; ++import javax.swing.event.PopupMenuEvent; + import javax.swing.event.PopupMenuListener; + import javax.swing.plaf.PopupMenuUI; + ++ + /** +- * JPopupMenu +- * @author Andrew Selkirk +- * @version 1.0 ++ * JPopupMenu is a container that is used to display popup menu's menu ++ * items. By default JPopupMenu is a lightweight container, however if it ++ * is the case that JPopupMenu's bounds are outside of main window, then ++ * heawyweight container will be used to display menu items. It is also ++ * possible to change JPopupMenu's default behavior and set JPopupMenu ++ * to always use heavyweight container. ++ * ++ * JPopupMenu can be displayed anywhere; it is a floating free popup menu. ++ * However before JPopupMenu is diplayed, its invoker property should be set. ++ * JPopupMenu's invoker is a component relative to which popup menu is ++ * displayed. ++ * ++ * JPopupMenu fires PopupMenuEvents to its registered listeners. Whenever ++ * JPopupMenu becomes visible on the screen then PopupMenuEvent indicating ++ * that popup menu became visible will be fired. In the case when ++ * JPopupMenu becomes invisible or cancelled without selection, then ++ * popupMenuBecomeInvisible() or popupMenuCancelled() methods of ++ * PopupMenuListeners will be invoked. ++ * ++ * JPopupMenu also fires PropertyChangeEvents when its bound properties ++ * change.In addittion to inheritted bound properties, JPopupMenu has ++ * 'visible' bound property. When JPopupMenu becomes visible/invisible on ++ * the screen it fires PropertyChangeEvents to its registered ++ * PropertyChangeListeners. + */ + public class JPopupMenu extends JComponent implements Accessible, MenuElement + { ++ private static final long serialVersionUID = -8336996630009646009L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Separator +- */ +- public static class Separator extends JSeparator { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor Separator +- */ +- public Separator() { +- // TODO +- } // Separator() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return null; // TODO +- } // getUIClassID() +- +- +- } // Separator +- +- /** +- * AccessibleJPopupMenu +- */ +- protected class AccessibleJPopupMenu extends AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJPopupMenu +- * @param component TODO +- */ +- protected AccessibleJPopupMenu(JPopupMenu component) { +- super(component); +- // TODO +- } // AccessibleJPopupMenu() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.POPUP_MENU; +- } // getAccessibleRole() +- +- +- } // AccessibleJPopupMenu +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "PopupMenuUI"; +- +- /** +- * invoker +- */ +- transient Component invoker; +- +- /** +- * desiredLocationX +- */ +- private int desiredLocationX; +- +- /** +- * desiredLocationY +- */ +- private int desiredLocationY; +- +- /** +- * label +- */ +- private String label; +- +- /** +- * paintBorder +- */ +- private boolean paintBorder; +- +- /** +- * margin +- */ +- private Insets margin; +- +- /** +- * defaultLWPopupEnabledKey +- */ +- private static final Object defaultLWPopupEnabledKey = null; // TODO +- +- /** +- * lightWeightPopupEnabled +- */ +- private boolean lightWeightPopupEnabled; +- +- /** +- * selectionModel +- */ +- private SingleSelectionModel selectionModel; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JPopupMenu +- */ +- public JPopupMenu() { +- // TODO +- } // JPopupMenu() +- +- /** +- * Constructor JPopupMenu +- * @param label TODO +- */ +- public JPopupMenu(String label) { +- // TODO +- } // JPopupMenu() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * readObject +- * @param stream TODO +- * @exception IOException TODO +- * @exception ClassNotFoundException TODO +- */ +- private void readObject(ObjectInputStream stream) +- throws IOException, ClassNotFoundException { +- // TODO +- } // readObject() +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * add +- * @param item TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(JMenuItem item) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param text TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(String text) { +- return null; // TODO +- } // add() +- +- /** +- * add +- * @param action TODO +- * @returns JMenuItem +- */ +- public JMenuItem add(Action action) { +- return null; // TODO +- } // add() +- +- /** +- * remove +- * @param index TODO +- */ +- public void remove(int index) { +- // TODO +- } // remove() +- +- /** +- * insert +- * @param action TODO +- * @param index TODO +- */ +- public void insert(Action action, int index) { +- // TODO +- } // insert() +- +- /** +- * insert +- * @param component TODO +- * @param index TODO +- */ +- public void insert(Component component, int index) { +- // TODO +- } // insert() +- +- /** +- * paintBorder +- * @param graphics TODO +- */ +- protected void paintBorder(Graphics graphics) { +- // TODO +- } // paintBorder() +- +- /** +- * getDefaultLightWeightPopupEnabled +- * @returns boolean +- */ +- public static boolean getDefaultLightWeightPopupEnabled() { +- return false; // TODO +- } // getDefaultLightWeightPopupEnabled() +- +- /** +- * setDefaultLightWeightPopupEnabled +- * @param enabled TODO +- */ +- public static void setDefaultLightWeightPopupEnabled(boolean enabled) { +- // TODO +- } // setDefaultLightWeightPopupEnabled() +- +- /** +- * getUI +- * @returns PopupMenuUI +- */ +- public PopupMenuUI getUI() { +- return (PopupMenuUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(PopupMenuUI ui) { +- super.setUI(ui); +- // TODO +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((PopupMenuUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getSelectionModel +- * @returns SingleSelectionModel +- */ +- public SingleSelectionModel getSelectionModel() { +- return null; // TODO +- } // getSelectionModel() +- +- /** +- * setSelectionModel +- * @param model TODO +- */ +- public void setSelectionModel(SingleSelectionModel model) { +- // TODO +- } // setSelectionModel() +- +- /** +- * createActionComponent +- * @param action TODO +- * @returns JMenuItem +- */ +- protected JMenuItem createActionComponent(Action action) { +- return null; // TODO +- } // createActionComponent() +- +- /** +- * createActionChangeListener +- * @param item TODO +- * @returns PropertyChangeListener +- */ +- protected PropertyChangeListener createActionChangeListener(JMenuItem item) { +- return null; // TODO +- } // createActionChangeListener() +- +- /** +- * isLightWeightPopupEnabled +- * @returns boolean +- */ +- public boolean isLightWeightPopupEnabled() { +- return false; // TODO +- } // isLightWeightPopupEnabled() +- +- /** +- * setLightWeightPopupEnabled +- * @param enabled TODO +- */ +- public void setLightWeightPopupEnabled(boolean enabled) { +- // TODO +- } // setLightWeightPopupEnabled() +- +- /** +- * getLabel +- * @returns String +- */ +- public String getLabel() { +- return null; // TODO +- } // getLabel() +- +- /** +- * setLabel +- * @param label TODO +- */ +- public void setLabel(String label) { +- // TODO +- } // setLabel() +- +- /** +- * addSeparator +- */ +- public void addSeparator() { +- // TODO +- } // addSeparator() +- +- /** +- * addPopupMenuListener +- * @param listener TODO +- */ +- public void addPopupMenuListener(PopupMenuListener listener) { +- // TODO +- } // addPopupMenuListener() +- +- /** +- * removePopupMenuListener +- * @param listener TODO +- */ +- public void removePopupMenuListener(PopupMenuListener listener) { +- // TODO +- } // removePopupMenuListener() +- +- /** +- * firePopupMenuWillBecomeVisible +- */ +- protected void firePopupMenuWillBecomeVisible() { +- // TODO +- } // firePopupMenuWillBecomeVisible() +- +- /** +- * firePopupMenuWillBecomeInvisible +- */ +- protected void firePopupMenuWillBecomeInvisible() { +- // TODO +- } // firePopupMenuWillBecomeInvisible() +- +- /** +- * firePopupMenuCanceled +- */ +- protected void firePopupMenuCanceled() { +- // TODO +- } // firePopupMenuCanceled() +- +- /** +- * pack +- */ +- public void pack() { +- // TODO +- } // pack() +- +- /** +- * isVisible +- * @returns boolean +- */ +- public boolean isVisible() { +- return false; // TODO +- } // isVisible() +- +- /** +- * setVisible +- * @param visible TODO +- */ +- public void setVisible(boolean visible) { +- // TODO +- } // setVisible() +- +- /** +- * setLocation +- * @param x TODO +- * @param y TODO +- */ +- public void setLocation(int x, int y) { +- // TODO +- } // setLocation() +- +- /** +- * isPopupMenu +- * @returns boolean +- */ +- private boolean isPopupMenu() { +- return false; // TODO +- } // isPopupMenu() +- +- /** +- * getInvoker +- * @returns Component +- */ +- public Component getInvoker() { +- return null; // TODO +- } // getInvoker() +- +- /** +- * setInvoker +- * @param component TODO +- */ +- public void setInvoker(Component component) { +- // TODO +- } // setInvoker() +- +- /** +- * show +- * @param component TODO +- * @param x TODO +- * @param y TODO +- */ +- public void show(Component component, int x, int y) { +- // TODO +- } // show() +- +- /** +- * getRootPopupMenu +- * @returns JPopupMenu +- */ +- JPopupMenu getRootPopupMenu() { +- return null; // TODO +- } // getRootPopupMenu() +- +- /** +- * getComponentAtIndex +- * @param index TODO +- * @returns Component +- */ +- public Component getComponentAtIndex(int index) { +- return null; // TODO +- } // getComponentAtIndex() +- +- /** +- * getComponentIndex +- * @param component TODO +- * @returns int +- */ +- public int getComponentIndex(Component component) { +- return 0; // TODO +- } // getComponentIndex() +- +- /** +- * setPopupSize +- * @param size TODO +- */ +- public void setPopupSize(Dimension size) { +- // TODO +- } // setPopupSize() +- +- /** +- * setPopupSize +- * @param x TODO +- * @param y TODO +- */ +- public void setPopupSize(int x, int y) { +- // TODO +- } // setPopupSize() +- +- /** +- * setSelected +- * @param selected TODO +- */ +- public void setSelected(Component selected) { +- // TODO +- } // setSelected() +- +- /** +- * isBorderPainted +- * @returns boolean +- */ +- public boolean isBorderPainted() { +- return false; // TODO +- } // isBorderPainted() +- +- /** +- * setBorderPainted +- * @param painted TODO +- */ +- public void setBorderPainted(boolean painted) { +- // TODO +- } // setBorderPainted() +- +- /** +- * getMargin +- * @returns Insets +- */ +- public Insets getMargin() { +- return null; // TODO +- } // getMargin() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * processMouseEvent +- * @param event TODO +- * @param path TODO +- * @param manager TODO +- */ +- public void processMouseEvent(MouseEvent event, MenuElement[] path, +- MenuSelectionManager manager) { +- // TODO +- } // processMouseEvent() +- +- /** +- * processKeyEvent +- * @param event TODO +- * @param path TODO +- * @param manager TODO +- */ +- public void processKeyEvent(KeyEvent event, MenuElement[] path, +- MenuSelectionManager manager) { +- // TODO +- } // processKeyEvent() +- +- /** +- * menuSelectionChanged +- * @param changed TODO +- */ +- public void menuSelectionChanged(boolean changed) { +- // TODO +- } // menuSelectionChanged() +- +- /** +- * getSubElements +- * @returns MenuElement[] +- */ +- public MenuElement[] getSubElements() { +- return null; // TODO +- } // getSubElements() +- +- /** +- * getComponent +- * @returns Component +- */ +- public Component getComponent() { +- return null; // TODO +- } // getComponent() +- +- /** +- * isPopupTrigger +- * @param event TODO +- * @returns boolean +- */ +- public boolean isPopupTrigger(MouseEvent event) { +- return false; // TODO +- } // isPopupTrigger() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJPopupMenu(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() ++ /** name for the UI delegate for this menuItem. */ ++ private static final String uiClassID = "PopupMenuUI"; + ++ /** Fire a PropertyChangeEvent when the "borderPainted" property changes. */ ++ public static final String LABEL_CHANGED_PROPERTY = "label"; + +-} // JPopupMenu ++ /* indicates if popup's menu border should be painted*/ ++ private boolean borderPainted = true; ++ ++ /** Flag indicating whether lightweight, mediumweight or heavyweight popup ++ is used to display menu items. ++ ++ These are the possible cases: ++ ++ 1. if DefaultLightWeightPopupEnabled true ++ (i) use lightweight container if popup feets inside top-level window ++ (ii) only use heavyweight container (JWindow) if popup doesn't fit. ++ ++ 2. if DefaultLightWeightPopupEnabled false ++ (i) if popup fits, use awt.Panel (mediumWeight) ++ (ii) if popup doesn't fit, use JWindow (heavyWeight) ++ */ ++ private static boolean DefaultLightWeightPopupEnabled = true; ++ ++ /* Component that invokes popup menu. */ ++ transient Component invoker; ++ ++ /* Label for this popup menu. It is not used in most of the look and feel themes. */ ++ private String label; ++ ++ /*Amount of space between menuItem's in JPopupMenu and JPopupMenu's border */ ++ private Insets margin; ++ ++ /** Indicates whether ligthWeight container can be used to display popup ++ menu. This flag is the same as DefaultLightWeightPopupEnabled, but setting ++ this flag can change popup menu after creation of the object */ ++ private boolean lightWeightPopupEnabled; ++ ++ /** SelectionModel that keeps track of menu selection. */ ++ private SingleSelectionModel selectionModel; ++ ++ /* Popup that is used to display JPopupMenu */ ++ private transient Popup popup; ++ ++ /* Location of the popup */ ++ private Point popupLocation; ++ ++ /* Field indicating if popup menu is visible or not */ ++ private boolean visible = false; ++ ++ /* Bound Property indicating visibility of the popup menu*/ ++ public static final String VISIBLE_CHANGED_PROPERTY = "visible"; ++ ++ /** ++ * Creates a new JPopupMenu object. ++ */ ++ public JPopupMenu() ++ { ++ updateUI(); ++ ++ lightWeightPopupEnabled = DefaultLightWeightPopupEnabled; ++ selectionModel = new DefaultSingleSelectionModel(); ++ super.setVisible(false); ++ } ++ ++ /** ++ * Creates a new JPopupMenu with specified label ++ * ++ * @param label Label for popup menu. ++ */ ++ public JPopupMenu(String label) ++ { ++ setLabel(label); ++ } ++ ++ private void readObject(ObjectInputStream stream) ++ throws IOException, ClassNotFoundException ++ { ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * Adds given menu item to the popup menu ++ * ++ * @param item menu item to add to the popup menu ++ * ++ * @return menu item that was added to the popup menu ++ */ ++ public JMenuItem add(JMenuItem item) ++ { ++ this.insert(item, -1); ++ return item; ++ } ++ ++ /** ++ * Constructs menu item with a specified label and adds it to ++ * popup menu ++ * ++ * @param text label for the menu item to be added ++ * ++ * @return constructed menu item that was added to the popup menu ++ */ ++ public JMenuItem add(String text) ++ { ++ JMenuItem item = new JMenuItem(text); ++ return add(item); ++ } ++ ++ /** ++ * Constructs menu item associated with the specified action ++ * and adds it to the popup menu ++ * ++ * @param action Action for the new menu item ++ * ++ * @return menu item that was added to the menu ++ */ ++ public JMenuItem add(Action action) ++ { ++ JMenuItem item = createActionComponent(action); ++ ++ if (action != null) ++ action.addPropertyChangeListener(createActionChangeListener(item)); ++ ++ return add(item); ++ } ++ ++ /** ++ * Revomes component at the given index from the menu. ++ * ++ * @param index index of the component that will be removed in the menu ++ */ ++ public void remove(int index) ++ { ++ super.remove(index); ++ ++ GridBagConstraints constraints = new GridBagConstraints(); ++ constraints.fill = GridBagConstraints.BOTH; ++ constraints.weightx = 100.0; ++ constraints.weighty = 100.0; ++ ++ Component[] items = getComponents(); ++ for (int i = index; i < items.length; i++) ++ { ++ constraints.gridy = i; ++ super.add(items[i], constraints, i); ++ } ++ } ++ ++ /** ++ * Create menu item associated with the given action ++ * and inserts it into the popup menu at the specified index ++ * ++ * @param action Action for the new menu item ++ * @param index index in the popup menu at which to insert new menu item. ++ */ ++ public void insert(Action action, int index) ++ { ++ JMenuItem item = new JMenuItem(action); ++ this.insert(item, index); ++ } ++ ++ /** ++ * Insert given component to the popup menu at the ++ * specified index ++ * ++ * @param component Component to insert ++ * @param index Index at which to insert given component ++ */ ++ public void insert(Component component, int index) ++ { ++ GridBagConstraints constraints = new GridBagConstraints(); ++ constraints.fill = GridBagConstraints.BOTH; ++ constraints.weightx = 100.0; ++ constraints.weighty = 100.0; ++ ++ if (index == -1) ++ index = getComponents().length; ++ ++ constraints.gridy = index; ++ super.add(component, constraints, index); ++ ++ // need to change constraints for the components that were moved by 1 ++ // due to the insertion ++ if (index != -1) ++ { ++ Component[] items = getComponents(); ++ ++ for (int i = index + 1; i < items.length; i++) ++ { ++ constraints.gridy = i; ++ super.add(items[i], constraints, i); ++ } ++ } ++ } ++ ++ /** ++ * Paints popup menu's border if borderPainted is true ++ * ++ * @param graphics graphics context used to paint this popup's menu border. ++ */ ++ protected void borderPainted(Graphics graphics) ++ { ++ if (borderPainted) ++ getBorder().paintBorder(this, graphics, 0, 0, getSize(null).width, ++ getSize(null).height); ++ } ++ ++ /** ++ * Returns flag indicating if newly created JPopupMenu will use ++ * heavyweight or lightweight container to display its menu items ++ * ++ * @return true if JPopupMenu will use lightweight container to display ++ * menu items by default, and false otherwise. ++ */ ++ public static boolean getDefaultLightWeightPopupEnabled() ++ { ++ return DefaultLightWeightPopupEnabled; ++ } ++ ++ /** ++ * Sets whether JPopupMenu should use ligthWeight container to ++ * display it menu items by default ++ * ++ * @param enabled true if JPopupMenu should use lightweight container ++ * for displaying its menu items, and false otherwise. ++ */ ++ public static void setDefaultLightWeightPopupEnabled(boolean enabled) ++ { ++ DefaultLightWeightPopupEnabled = enabled; ++ } ++ ++ /** ++ * This method returns the UI used to display the JPopupMenu. ++ * ++ * @return The UI used to display the JPopupMenu. ++ */ ++ public PopupMenuUI getUI() ++ { ++ return (PopupMenuUI) ui; ++ } ++ ++ /** ++ * Set the "UI" property of the menu item, which is a look and feel class ++ * responsible for handling popupMenu's input events and painting it. ++ * ++ * @param ui The new "UI" property ++ */ ++ public void setUI(PopupMenuUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets this menuItem's UI to the UIManager's default for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((PopupMenuUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menuItem. ++ * ++ * @return The Look and Feel classID. "PopupMenuUI" ++ */ ++ public String getUIClassID() ++ { ++ return "PopupMenuUI"; ++ } ++ ++ /** ++ * Returns selectionModel used by this popup menu to keep ++ * track of the selection. ++ * ++ * @return popup menu's selection model ++ */ ++ public SingleSelectionModel getSelectionModel() ++ { ++ return selectionModel; ++ } ++ ++ /** ++ * Sets selection model for this popup menu ++ * ++ * @param model new selection model of this popup menu ++ */ ++ public void setSelectionModel(SingleSelectionModel model) ++ { ++ if (selectionModel != model) ++ { ++ SingleSelectionModel oldModel = this.selectionModel; ++ } ++ } ++ ++ /** ++ * Creates new menu item associated with a given action. ++ * ++ * @param action Action used to create new menu item ++ * ++ * @return new created menu item associated with a given action. ++ */ ++ protected JMenuItem createActionComponent(Action action) ++ { ++ return new JMenuItem(action); ++ } ++ ++ /** ++ * Creates PropertyChangeListener that listens to PropertyChangeEvents ++ * occuring in the Action associated with given menu item in this popup menu. ++ * ++ * @param item MenuItem ++ * ++ * @return The PropertyChangeListener ++ */ ++ protected PropertyChangeListener createActionChangeListener(JMenuItem item) ++ { ++ return new ActionChangeListener(); ++ } ++ ++ /** ++ * Returns true if this popup menu will display its menu item in ++ * a lightweight container and false otherwise. ++ * ++ * @return true if this popup menu will display its menu items ++ * in a lightweight container and false otherwise. ++ */ ++ public boolean isLightWeightPopupEnabled() ++ { ++ return lightWeightPopupEnabled; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param enabled DOCUMENT ME! ++ */ ++ public void setLightWeightPopupEnabled(boolean enabled) ++ { ++ lightWeightPopupEnabled = enabled; ++ } ++ ++ /** ++ * Returns label for this popup menu ++ * ++ * @return label for this popup menu ++ */ ++ public String getLabel() ++ { ++ return label; ++ } ++ ++ /** ++ * Sets label for this popup menu. This method fires PropertyChangeEvent ++ * when the label property is changed. Please note that most ++ * of the Look & Feel will ignore this property. ++ * ++ * @param label label for this popup menu ++ */ ++ public void setLabel(String label) ++ { ++ if (label != this.label) ++ { ++ String oldLabel = this.label; ++ this.label = label; ++ firePropertyChange(LABEL_CHANGED_PROPERTY, oldLabel, label); ++ } ++ } ++ ++ /** ++ * Adds separator to this popup menu ++ */ ++ public void addSeparator() ++ { ++ // insert separator at the end of the list of menu items ++ this.insert(new Separator(), -1); ++ } ++ ++ /** ++ * Adds popupMenuListener to listen for PopupMenuEvents fired ++ * by the JPopupMenu ++ * ++ * @param listener PopupMenuListener to add to JPopupMenu ++ */ ++ public void addPopupMenuListener(PopupMenuListener listener) ++ { ++ listenerList.add(PopupMenuListener.class, listener); ++ } ++ ++ /** ++ * Removes PopupMenuListener from JPopupMenu's list of listeners ++ * ++ * @param listener PopupMenuListener which needs to be removed ++ */ ++ public void removePopupMenuListener(PopupMenuListener listener) ++ { ++ listenerList.remove(PopupMenuListener.class, listener); ++ } ++ ++ /** ++ * Returns array of PopupMenuListeners that are listening to JPopupMenu ++ * ++ * @return Array of PopupMenuListeners that are listening to JPopupMenu ++ */ ++ public PopupMenuListener[] getPopupMenuListeners() ++ { ++ return ((PopupMenuListener[]) listenerList.getListeners(PopupMenuListener.class)); ++ } ++ ++ /** ++ * This method calls popupMenuWillBecomeVisible() of popup menu's ++ * PopupMenuListeners. This method is invoked just before popup menu ++ * will appear on the screen. ++ */ ++ protected void firePopupMenuWillBecomeVisible() ++ { ++ EventListener[] ll = listenerList.getListeners(PopupMenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((PopupMenuListener) ll[i]).popupMenuWillBecomeVisible(new PopupMenuEvent(this)); ++ } ++ ++ /** ++ * This method calls popupMenuWillBecomeInvisible() of popup ++ * menu's PopupMenuListeners. This method is invoked just before popup ++ * menu will disappear from the screen ++ */ ++ protected void firePopupMenuWillBecomeInvisible() ++ { ++ EventListener[] ll = listenerList.getListeners(PopupMenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((PopupMenuListener) ll[i]).popupMenuWillBecomeInvisible(new PopupMenuEvent(this)); ++ } ++ ++ /** ++ * This method calls popupMenuCanceled() of popup menu's PopupMenuListeners. ++ * This method is invoked just before popup menu is cancelled. This happens ++ * when popup menu is closed without selecting any of its menu items. This ++ * usually happens when the top-level window is resized or moved. ++ */ ++ protected void firePopupMenuCanceled() ++ { ++ EventListener[] ll = listenerList.getListeners(PopupMenuListener.class); ++ ++ for (int i = 0; i < ll.length; i++) ++ ((PopupMenuListener) ll[i]).popupMenuCanceled(new PopupMenuEvent(this)); ++ } ++ ++ /** ++ * This methods sets popup menu's size to its' preferred size. If the ++ * popup menu's size is previously set it will be ignored. ++ */ ++ public void pack() ++ { ++ super.setSize(null); ++ } ++ ++ /** ++ * Return visibility of the popup menu ++ * ++ * @return true if popup menu is visible on the screen and false otherwise. ++ */ ++ public boolean isVisible() ++ { ++ return visible; ++ } ++ ++ /** ++ * Sets visibility property of this popup menu. If the property is ++ * set to true then popup menu will be dispayed and popup menu will ++ * hide itself if visible property is set to false. ++ * ++ * @param visible true if popup menu will become visible and false otherwise. ++ */ ++ public void setVisible(boolean visible) ++ { ++ boolean old = isVisible(); ++ this.visible = visible; ++ if (old != isVisible()) ++ { ++ firePropertyChange(VISIBLE_CHANGED_PROPERTY, old, (boolean) isVisible()); ++ if (visible) ++ { ++ firePopupMenuWillBecomeVisible(); ++ Container rootContainer = (Container) SwingUtilities.getRoot(invoker); ++ ++ boolean fit = true; ++ Dimension size; ++ ++ // Determine the size of the popup menu ++ if (this.getSize().width == 0 && this.getSize().width == 0) ++ size = this.getPreferredSize(); ++ else ++ size = this.getSize(); ++ ++ if ((size.width > (rootContainer.getWidth() - popupLocation.x)) ++ || (size.height > (rootContainer.getHeight() - popupLocation.y))) ++ fit = false; ++ if (lightWeightPopupEnabled && fit) ++ popup = new LightWeightPopup(this); ++ else ++ { ++ if (fit) ++ popup = new MediumWeightPopup(this); ++ else ++ popup = new HeavyWeightPopup(this); ++ } ++ if (popup instanceof LightWeightPopup ++ || popup instanceof MediumWeightPopup) ++ { ++ JLayeredPane layeredPane; ++ layeredPane = SwingUtilities.getRootPane(invoker) ++ .getLayeredPane(); ++ Point p = new Point(popupLocation.x, popupLocation.y); ++ SwingUtilities.convertPointFromScreen(p, layeredPane); ++ popup.show(p.x, p.y, size.width, size.height); ++ } ++ else ++ { ++ // Subtract insets of the top-level container if popup menu's ++ // top-left corner is inside it. ++ Insets insets = rootContainer.getInsets(); ++ popup.show(popupLocation.x - insets.left, ++ popupLocation.y - insets.top, size.width, ++ size.height); ++ } ++ } ++ else ++ { ++ firePopupMenuWillBecomeInvisible(); ++ popup.hide(); ++ } ++ } ++ } ++ ++ /** ++ * Sets location of the popup menu. ++ * ++ * @param x X coordinate of the popup menu's location ++ * @param y Y coordinate of the popup menu's location ++ */ ++ public void setLocation(int x, int y) ++ { ++ if (popupLocation == null) ++ popupLocation = new Point(); ++ ++ popupLocation.x = x; ++ popupLocation.y = y; ++ } ++ ++ /** ++ * Returns popup menu's invoker. ++ * ++ * @return popup menu's invoker ++ */ ++ public Component getInvoker() ++ { ++ return invoker; ++ } ++ ++ /** ++ * Sets popup menu's invoker. ++ * ++ * @param component The new invoker of this popup menu ++ */ ++ public void setInvoker(Component component) ++ { ++ invoker = component; ++ } ++ ++ /** ++ * This method displays JPopupMenu on the screen at the specified ++ * location. Note that x and y coordinates given to this method ++ * should be expressed in terms of the popup menus' invoker. ++ * ++ * @param component Invoker for this popup menu ++ * @param x x-coordinate of the popup menu relative to the specified invoker ++ * @param y y-coordiate of the popup menu relative to the specified invoker ++ */ ++ public void show(Component component, int x, int y) ++ { ++ setInvoker(component); ++ Point p = new Point(x, y); ++ SwingUtilities.convertPointToScreen(p, component); ++ setLocation(p.x, p.y); ++ setVisible(true); ++ } ++ ++ /** ++ * Returns component located at the specified index in the popup menu ++ * ++ * @param index index of the component to return ++ * ++ * @return component located at the specified index in the popup menu ++ * ++ * @deprecated Replaced by getComponent(int) ++ */ ++ public Component getComponentAtIndex(int index) ++ { ++ return getComponent(index); ++ } ++ ++ /** ++ * Returns index of the specified component in the popup menu ++ * ++ * @param component Component to look for ++ * ++ * @return index of the specified component in the popup menu ++ */ ++ public int getComponentIndex(Component component) ++ { ++ Component[] items = getComponents(); ++ ++ for (int i = 0; i < items.length; i++) ++ { ++ if (items[i].equals(component)) ++ return i; ++ } ++ ++ return -1; ++ } ++ ++ /** ++ * Sets size of the popup ++ * ++ * @param size Dimensions representing new size of the popup menu ++ */ ++ public void setPopupSize(Dimension size) ++ { ++ super.setSize(size); ++ } ++ ++ /** ++ * Sets size of the popup menu ++ * ++ * @param width width for the new size ++ * @param height height for the new size ++ */ ++ public void setPopupSize(int width, int height) ++ { ++ super.setSize(width, height); ++ } ++ ++ /** ++ * Selects specified component in this popup menu. ++ * ++ * @param selected component to select ++ */ ++ public void setSelected(Component selected) ++ { ++ int index = getComponentIndex(selected); ++ selectionModel.setSelectedIndex(index); ++ } ++ ++ /** ++ * Checks if this popup menu paints its border. ++ * ++ * @return true if this popup menu paints its border and false otherwise. ++ */ ++ public boolean isBorderPainted() ++ { ++ return borderPainted; ++ } ++ ++ /** ++ * Sets if the border of the popup menu should be ++ * painter or not. ++ * ++ * @param painted true if the border should be painted and false otherwise ++ */ ++ public void setBorderPainted(boolean painted) ++ { ++ borderPainted = painted; ++ } ++ ++ /** ++ * Returns margin for this popup menu. ++ * ++ * @return margin for this popup menu. ++ */ ++ public Insets getMargin() ++ { ++ return margin; ++ } ++ ++ /** ++ * A string that describes this JPopupMenu. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JMenuItem ++ */ ++ protected String paramString() ++ { ++ return "JPopupMenu"; ++ } ++ ++ /** ++ * Process mouse events forwarded from MenuSelectionManager. This method ++ * doesn't do anything. It is here to conform to the MenuElement interface. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ */ ++ public void processMouseEvent(MouseEvent event, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Empty Implementation. This method is needed for the implementation ++ // of MenuElement interface ++ } ++ ++ /** ++ * Process key events forwarded from MenuSelectionManager. This method ++ * doesn't do anything. It is here to conform to the MenuElement interface. ++ * ++ * @param event event forwarded from MenuSelectionManager ++ * @param path path to the menu element from which event was generated ++ * @param manager MenuSelectionManager for the current menu hierarchy ++ * ++ */ ++ public void processKeyEvent(KeyEvent event, MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ // Empty Implementation. This method is needed for the implementation ++ // of MenuElement interface ++ } ++ ++ /** ++ * Method of MenuElement Interface. It is invoked when ++ * popupMenu's selection has changed ++ * ++ * @param changed true if this popupMenu is part of current menu ++ * hierarchy and false otherwise. ++ */ ++ public void menuSelectionChanged(boolean changed) ++ { ++ if (! changed) ++ setVisible(false); ++ } ++ ++ /** ++ * Return subcomonents of this popup menu. ++ * ++ * @return Array containing menuItem's of belonging to this popup menu. ++ */ ++ public MenuElement[] getSubElements() ++ { ++ Component[] items = getComponents(); ++ MenuElement[] subElements = new MenuElement[items.length]; ++ ++ for (int i = 0; i < items.length; i++) ++ subElements[i] = (MenuElement) items[i]; ++ ++ return subElements; ++ } ++ ++ /** ++ * Method of the MenuElement interface. Returns reference to itself. ++ * ++ * @return Returns reference to itself ++ */ ++ public Component getComponent() ++ { ++ return this; ++ } ++ ++ /** ++ * Checks if observing mouse event should trigger popup ++ * menu to show on the screen. ++ * ++ * @param event MouseEvent to check ++ * ++ * @return true if the observing mouse event is popup trigger and false otherwise ++ */ ++ public boolean isPopupTrigger(MouseEvent event) ++ { ++ return ((PopupMenuUI) getUI()).isPopupTrigger(event); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJPopupMenu(); ++ ++ return accessibleContext; ++ } ++ ++ /** ++ * This interface is used to display menu items of the JPopupMenu ++ */ ++ private interface Popup ++ { ++ /** ++ * Displays container on the screen ++ * ++ * @param x x-coordinate of popup menu's location on the screen ++ * @param y y-coordinate of popup menu's location on the screen ++ * @param width width of the container that is used to display menu ++ * item's for popup menu ++ * @param height height of the container that is used to display menu ++ * item's for popup menu ++ */ ++ void show(int x, int y, int width, int height); ++ ++ /** ++ * Hides container used to display popup menu item's from the screen ++ */ ++ void hide(); ++ } ++ ++ /** ++ * This class represents Popup menu that uses light weight container ++ * to display its contents. ++ */ ++ private class LightWeightPopup extends Container implements Popup ++ { ++ /** ++ * Creates a new LightWeightPopup menu ++ * ++ * @param c Container containing menu items ++ */ ++ private Component c; ++ ++ public LightWeightPopup(Container c) ++ { ++ this.c = c; ++ } ++ ++ /** ++ * Displayes lightweight container with menu items to the screen ++ * ++ * @param x x-coordinate of lightweight container on the screen ++ * @param y y-coordinate of lightweight container on the screen ++ * @param width width of the lightweight container ++ * @param height height of the lightweight container ++ */ ++ public void show(int x, int y, int width, int height) ++ { ++ JLayeredPane layeredPane; ++ layeredPane = SwingUtilities.getRootPane(invoker).getLayeredPane(); ++ c.setBounds(x, y, width, height); ++ layeredPane.add(c, JLayeredPane.POPUP_LAYER, 0); ++ } ++ ++ /** ++ * Hides lightweight container from the screen ++ */ ++ public void hide() ++ { ++ // FIXME: Right now the lightweight container is removed from JLayered ++ // pane. It is probably would be better in order to improve performance ++ // to make the container invisible instead of removing it everytime. ++ JLayeredPane layeredPane; ++ layeredPane = SwingUtilities.getRootPane(invoker).getLayeredPane(); ++ int index = layeredPane.getIndexOf(c); ++ layeredPane.remove(index); ++ } ++ } ++ ++ /** ++ * MediumWeightPopup is an AWT Panel with JPopupMenu's menu items. ++ * It is used to display JPopupMenu's menu items on the screen ++ */ ++ private class MediumWeightPopup extends Panel implements Popup ++ { ++ /** ++ * Creates a new MediumWeightPopup object. ++ * ++ * @param c Container with JPopupMenu's menu items ++ */ ++ public MediumWeightPopup(Container c) ++ { ++ this.add(c); ++ } ++ ++ /** ++ * Displays AWT Panel with its components on the screen ++ * ++ * @param x x-coordinate of the upper-left corner of the panel's ++ * @param y y-coordinate of the upper-left corner of the panel's ++ * @param width width of the panel ++ * @param height height of the panel ++ */ ++ public void show(int x, int y, int width, int height) ++ { ++ JLayeredPane layeredPane; ++ layeredPane = SwingUtilities.getRootPane(invoker).getLayeredPane(); ++ layeredPane.add(this, JLayeredPane.POPUP_LAYER, 0); ++ this.setBounds(x, y, width, height); ++ } ++ ++ /** ++ * Hides This panel from the screen ++ */ ++ public void hide() ++ { ++ // FIXME: Right now the lightweight container is removed from JLayered ++ // pane. It is probably would be better in order to improve performance ++ // to make the container invisible instead of removing it everytime. ++ JLayeredPane layeredPane; ++ layeredPane = SwingUtilities.getRootPane(invoker).getLayeredPane(); ++ int index = layeredPane.getIndexOf(this); ++ layeredPane.remove(index); ++ } ++ } ++ ++ /** ++ * HeavyWeightPopup is JWindow that is used to display JPopupMenu menu item's ++ * on the screen ++ */ ++ private class HeavyWeightPopup extends JWindow implements Popup ++ { ++ /** ++ * Creates a new HeavyWeightPopup object. ++ * ++ * @param c Container containing menu items ++ */ ++ public HeavyWeightPopup(Container c) ++ { ++ this.setContentPane(c); ++ } ++ ++ /** ++ * Displays JWindow container JPopupMenu's menu items to the screen ++ * ++ * @param x x-coordinate of JWindow containing menu items ++ * @param y y-coordinate of JWindow containing menu items ++ * @param width width of the JWindow ++ * @param height height of the JWindow ++ */ ++ public void show(int x, int y, int width, int height) ++ { ++ this.setBounds(x, y, width, height); ++ this.show(); ++ } ++ ++ /** ++ * Hides JWindow with menu item's from the screen. ++ */ ++ public void hide() ++ { ++ super.hide(); ++ } ++ } ++ ++ /** ++ * This is the separator that can be used in popup menu. ++ */ ++ public static class Separator extends JSeparator ++ { ++ public Separator() ++ { ++ } ++ ++ public String getUIClassID() ++ { ++ return "PopupMenuSeparatorUI"; ++ } ++ } ++ ++ protected class AccessibleJPopupMenu extends AccessibleJComponent ++ { ++ private static final long serialVersionUID = 7423261328879849768L; ++ ++ protected AccessibleJPopupMenu() ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.POPUP_MENU; ++ } ++ } ++ ++ /* This class resizes popup menu and repaints popup menu appropriately if one ++ of item's action has changed */ ++ protected class ActionChangeListener implements PropertyChangeListener ++ { ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ JPopupMenu.this.revalidate(); ++ JPopupMenu.this.repaint(); ++ } ++ } ++} +Index: javax/swing/JProgressBar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JProgressBar.java,v +retrieving revision 1.3 +diff -u -r1.3 JProgressBar.java +--- javax/swing/JProgressBar.java 9 Jan 2004 10:18:47 -0000 1.3 ++++ javax/swing/JProgressBar.java 6 Sep 2004 16:35:58 -0000 +@@ -38,8 +38,7 @@ + package javax.swing; + + import java.awt.Graphics; +-import java.io.IOException; +-import java.io.ObjectOutputStream; ++ + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; +@@ -49,440 +48,624 @@ + import javax.swing.event.ChangeListener; + import javax.swing.plaf.ProgressBarUI; + ++ + /** +- * JProgressBar +- * @author Andrew Selkirk +- * @version 1.0 ++ *

    ++ * The ProgressBar is a widget that displays in two modes. In ++ * determinate mode, it displays fills a percentage of its bar ++ * based on its current value. In indeterminate mode, it creates ++ * box and bounces it between its bounds. ++ *

    ++ * ++ *

    ++ * JProgressBars have the following properties: ++ *

    ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Property Stored in Bound?
    borderPainted progressBar yes
    changeListeners progressBar no
    indeterminate progressBar yes
    maximum model no
    minimum model no
    model progressBar no
    orientation progressBar yes
    percentComplete progressBar no
    string progressBar yes
    stringPainted progressBar yes
    value model no
    + */ +-public class JProgressBar extends JComponent implements SwingConstants, Accessible ++public class JProgressBar extends JComponent implements SwingConstants, ++ Accessible + { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- +- /** +- * AccessibleJProgressBar +- */ +- protected class AccessibleJProgressBar extends AccessibleJComponent +- implements AccessibleValue { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJProgressBar +- * @param component TODO +- */ +- protected AccessibleJProgressBar(JProgressBar component) { +- super(component); +- // TODO +- } // AccessibleJProgressBar() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.PROGRESS_BAR; +- } // getAccessibleRole() +- +- /** +- * getAccessibleValue +- * @returns AccessibleValue +- */ +- public AccessibleValue getAccessibleValue() { +- return null; // TODO +- } // getAccessibleValue() +- +- /** +- * getCurrentAccessibleValue +- * @returns Number +- */ +- public Number getCurrentAccessibleValue() { +- return null; // TODO +- } // getCurrentAccessibleValue() +- +- /** +- * setCurrentAccessibleValue +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean setCurrentAccessibleValue(Number value0) { +- return false; // TODO +- } // setCurrentAccessibleValue() +- +- /** +- * getMinimumAccessibleValue +- * @returns Number +- */ +- public Number getMinimumAccessibleValue() { +- return null; // TODO +- } // getMinimumAccessibleValue() +- +- /** +- * getMaximumAccessibleValue +- * @returns Number +- */ +- public Number getMaximumAccessibleValue() { +- return null; // TODO +- } // getMaximumAccessibleValue() +- +- +- } // AccessibleJProgressBar +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "ProgressBarUI"; +- +- /** +- * orientation +- */ +- protected int orientation; +- +- /** +- * paintBorder +- */ +- protected boolean paintBorder; +- +- /** +- * model +- */ +- protected BoundedRangeModel model; +- +- /** +- * progressString +- */ +- protected String progressString; +- +- /** +- * paintString +- */ +- protected boolean paintString; +- +- /** +- * changeEvent +- */ +- protected transient ChangeEvent changeEvent; +- +- /** +- * changeListener +- */ +- protected ChangeListener changeListener; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JProgressBar +- */ +- public JProgressBar() { +- // TODO +- } // JProgressBar() +- +- /** +- * Constructor JProgressBar +- * @param orientation TODO +- */ +- public JProgressBar(int orientation) { +- // TODO +- } // JProgressBar() +- +- /** +- * Constructor JProgressBar +- * @param minimum TODO +- * @param maximum TODO +- */ +- public JProgressBar(int minimum, int maximum) { +- // TODO +- } // JProgressBar() +- +- /** +- * Constructor JProgressBar +- * @param minimum TODO +- * @param maximum TODO +- * @param orientation TODO +- */ +- public JProgressBar(int minimum, int maximum, int orientation) { +- // TODO +- } // JProgressBar() +- +- /** +- * Constructor JProgressBar +- * @param model TODO +- */ +- public JProgressBar(BoundedRangeModel model) { +- // TODO +- } // JProgressBar() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getValue +- * @returns int +- */ +- public int getValue() { +- return 0; // TODO +- } // getValue() +- +- /** +- * setValue +- * @param value TODO +- */ +- public void setValue(int value) { +- // TODO +- } // setValue() +- +- /** +- * paintBorder +- * @param graphics TODO +- */ +- protected void paintBorder(Graphics graphics) { +- // TODO +- } // paintBorder() +- +- /** +- * getOrientation +- * @returns int +- */ +- public int getOrientation() { +- return 0; // TODO +- } // getOrientation() +- +- /** +- * setOrientation +- * @param orientation TODO +- */ +- public void setOrientation(int orientation) { +- // TODO +- } // setOrientation() +- +- /** +- * isStringPainted +- * @returns boolean +- */ +- public boolean isStringPainted() { +- return false; // TODO +- } // isStringPainted() +- +- /** +- * setStringPainted +- * @param painted TODO +- */ +- public void setStringPainted(boolean painted) { +- // TODO +- } // setStringPainted() +- +- /** +- * getString +- * @returns String +- */ +- public String getString() { +- return null; // TODO +- } // getString() +- +- /** +- * setString +- * @param string TODO +- */ +- public void setString(String string) { +- // TODO +- } // setString() +- +- /** +- * getPercentComplete +- * @returns double +- */ +- public double getPercentComplete() { +- return 0.0; // TODO +- } // getPercentComplete() +- +- /** +- * isBorderPainted +- * @returns boolean +- */ +- public boolean isBorderPainted() { +- return false; // TODO +- } // isBorderPainted() +- +- /** +- * setBorderPainted +- * @param painted TODO +- */ +- public void setBorderPainted(boolean painted) { +- // TODO +- } // setBorderPainted() +- +- /** +- * getUI +- * @returns ProgressBarUI +- */ +- public ProgressBarUI getUI() { +- return (ProgressBarUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(ProgressBarUI ui) { +- super.setUI(ui); +- // TODO +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((ProgressBarUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * createChangeListener +- * @returns ChangeListener +- */ +- protected ChangeListener createChangeListener() { +- return null; // TODO +- } // createChangeListener() +- +- /** +- * addChangeListener +- * @param listener TODO +- */ +- public void addChangeListener(ChangeListener listener) { +- // TODO +- } // addChangeListener() +- +- /** +- * removeChangeListener +- * @param listener TODO +- */ +- public void removeChangeListener(ChangeListener valulistener) { +- // TODO +- } // removeChangeListener() +- +- /** +- * fireStateChanged +- */ +- protected void fireStateChanged() { +- // TODO +- } // fireStateChanged() +- +- /** +- * getModel +- * @returns BoundedRangeModel +- */ +- public BoundedRangeModel getModel() { +- return null; // TODO +- } // getModel() +- +- /** +- * setModel +- * @param model TODO +- */ +- public void setModel(BoundedRangeModel model) { +- // TODO +- } // setModel() +- +- /** +- * getMinimum +- * @returns int +- */ +- public int getMinimum() { +- return 0; // TODO +- } // getMinimum() +- +- /** +- * setMinimum +- * @param minimum TODO +- */ +- public void setMinimum(int minimum) { +- // TODO +- } // setMinimum() +- +- /** +- * getMaximum +- * @returns int +- */ +- public int getMaximum() { +- return 0; // TODO +- } // getMaximum() +- +- /** +- * setMaximum +- * @param maximum TODO +- */ +- public void setMaximum(int maximum) { +- // TODO +- } // setMaximum() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJProgressBar(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JProgressBar ++ /** ++ * AccessibleJProgressBar ++ */ ++ protected class AccessibleJProgressBar extends AccessibleJComponent ++ implements AccessibleValue ++ { ++ private static final long serialVersionUID = -2938130009392721813L; ++ ++ /** ++ * Constructor AccessibleJProgressBar ++ * ++ * @param component TODO ++ */ ++ protected AccessibleJProgressBar() ++ { ++ } ++ ++ /** ++ * getAccessibleStateSet ++ * ++ * @return AccessibleStateSet ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; ++ } ++ ++ /** ++ * getAccessibleRole ++ * ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.PROGRESS_BAR; ++ } ++ ++ /** ++ * getAccessibleValue ++ * ++ * @return AccessibleValue ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * getCurrentAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * setCurrentAccessibleValue ++ * ++ * @param value0 TODO ++ * ++ * @return boolean ++ */ ++ public boolean setCurrentAccessibleValue(Number value0) ++ { ++ return false; ++ } ++ ++ /** ++ * getMinimumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * getMaximumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ } ++ ++ private static final long serialVersionUID = 1980046021813598781L; ++ ++ /** Fired in a PropertyChangeEvent when the "borderPainted" property changes. */ ++ public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted"; ++ ++ /** Fired in a PropertyChangeEvent when the "orientation" property changes. */ ++ public static final String ORIENTATION_CHANGED_PROPERTY = "orientation"; ++ ++ /** Fired in a PropertyChangeEvent when the "string" property changes. */ ++ public static final String STRING_CHANGED_PROPERTY = "string"; ++ ++ /** Fired in a PropertyChangeEvent when the "stringPainted" property changes. */ ++ public static final String STRING_PAINTED_CHANGED_PROPERTY = "stringPainted"; ++ ++ /** Fired in a PropertyChangeEvent when the "indeterminate" property changes. */ ++ public static final String INDETERMINATE_CHANGED_PROPERTY = "indeterminate"; ++ ++ /** Whether the ProgressBar is determinate. */ ++ private transient boolean indeterminate = false; ++ ++ /** The orientation of the ProgressBar */ ++ protected int orientation = HORIZONTAL; ++ ++ /** Whether borders should be painted. */ ++ protected boolean paintBorder = true; ++ ++ /** The model describing this ProgressBar. */ ++ protected BoundedRangeModel model; ++ ++ /** The string that is displayed by the ProgressBar. */ ++ protected String progressString; ++ ++ /** Whether the string should be painted. */ ++ protected boolean paintString = false; ++ ++ /** The static changeEvent passed to all ChangeListeners. */ ++ protected transient ChangeEvent changeEvent; ++ ++ /** The ChangeListener that listens to the model. */ ++ protected ChangeListener changeListener; ++ ++ /** ++ * Creates a new horizontally oriented JProgressBar object ++ * with a minimum of 0 and a maximum of 100. ++ */ ++ public JProgressBar() ++ { ++ this(0, 100, HORIZONTAL); ++ } ++ ++ /** ++ * Creates a new JProgressBar object with a minimum of 0, ++ * a maximum of 100, and the given orientation. ++ * ++ * @param orientation The orientation of the JProgressBar. ++ */ ++ public JProgressBar(int orientation) ++ { ++ this(0, 100, orientation); ++ } ++ ++ /** ++ * Creates a new horizontally oriented JProgressBar object ++ * with the given minimum and maximum. ++ * ++ * @param minimum The minimum of the JProgressBar. ++ * @param maximum The maximum of the JProgressBar. ++ */ ++ public JProgressBar(int minimum, int maximum) ++ { ++ this(minimum, maximum, HORIZONTAL); ++ } ++ ++ /** ++ * Creates a new JProgressBar object with the given minimum, ++ * maximum, and orientation. ++ * ++ * @param minimum The minimum of the JProgressBar. ++ * @param maximum The maximum of the JProgressBar. ++ * @param orientation The orientation of the JProgressBar. ++ */ ++ public JProgressBar(int minimum, int maximum, int orientation) ++ { ++ model = new DefaultBoundedRangeModel(minimum, 0, minimum, maximum); ++ if (orientation != HORIZONTAL && orientation != VERTICAL) ++ throw new IllegalArgumentException(orientation + " is not a legal orientation"); ++ this.orientation = orientation; ++ changeListener = createChangeListener(); ++ model.addChangeListener(changeListener); ++ updateUI(); ++ } ++ ++ /** ++ * Creates a new horizontally oriented JProgressBar object ++ * with the given model. ++ * ++ * @param model The model to be used with the JProgressBar. ++ */ ++ public JProgressBar(BoundedRangeModel model) ++ { ++ this.model = model; ++ changeListener = createChangeListener(); ++ model.addChangeListener(changeListener); ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the current value of the JProgressBar. ++ * ++ * @return The current value of the JProgressBar. ++ */ ++ public int getValue() ++ { ++ return model.getValue(); ++ } ++ ++ /** ++ * This method sets the value of the JProgressBar. ++ * ++ * @param value The value of the JProgressBar. ++ */ ++ public void setValue(int value) ++ { ++ model.setValue(value); ++ } ++ ++ /** ++ * This method paints the border of the JProgressBar ++ * ++ * @param graphics The graphics object to paint with. ++ */ ++ protected void paintBorder(Graphics graphics) ++ { ++ getBorder().paintBorder(this, graphics, 0, 0, ++ getWidth(), ++ getHeight()); ++ } ++ ++ /** ++ * This method returns the orientation of the JProgressBar. ++ * ++ * @return The orientation of the JProgressBar. ++ */ ++ public int getOrientation() ++ { ++ return orientation; ++ } ++ ++ /** ++ * This method changes the orientation property. The orientation of the ++ * JProgressBar can be either horizontal or vertical. ++ * ++ * @param orientation The orientation of the JProgressBar. ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != VERTICAL && orientation != HORIZONTAL) ++ throw new IllegalArgumentException("orientation must be one of VERTICAL or HORIZONTAL"); ++ if (this.orientation != orientation) ++ { ++ int oldOrientation = this.orientation; ++ this.orientation = orientation; ++ firePropertyChange(ORIENTATION_CHANGED_PROPERTY, oldOrientation, ++ this.orientation); ++ } ++ } ++ ++ /** ++ * This method returns whether the progressString will be painted. ++ * ++ * @return Whether the string is painted. ++ */ ++ public boolean isStringPainted() ++ { ++ return paintString; ++ } ++ ++ /** ++ * This method changes the stringPainted property. ++ * ++ * @param painted Whether the string is painted. ++ */ ++ public void setStringPainted(boolean painted) ++ { ++ if (paintString != painted) ++ { ++ boolean oldPainted = paintString; ++ paintString = painted; ++ firePropertyChange(STRING_PAINTED_CHANGED_PROPERTY, oldPainted, ++ paintString); ++ } ++ } ++ ++ /** ++ * This method returns the string that is painted if the ++ * stringPainted property is set to true. If there is no ++ * string set, it will return a string containing the ++ * JProgressBar's value as a percent. ++ * ++ * @return The string that is painted. ++ */ ++ public String getString() ++ { ++ if (progressString != null) ++ return progressString; ++ else ++ return (int) (getPercentComplete() * 100) + "%"; ++ } ++ ++ /** ++ * This method changes the string property. The string ++ * given will be the one painted. If you want to ++ * revert to the default string given, set the ++ * string to null. ++ * ++ * @param string The string to be painted. ++ */ ++ public void setString(String string) ++ { ++ if (((string == null || progressString == null) && ++ string != progressString) || (string != null && ++ ! string.equals(progressString))) ++ { ++ String oldString = progressString; ++ progressString = string; ++ firePropertyChange(STRING_CHANGED_PROPERTY, oldString, progressString); ++ } ++ } ++ ++ /** ++ * This method returns the percent of the bar ++ * that is "complete". (This is the amount value / (max - min)). ++ * ++ * @return DOCUMENT ME! ++ */ ++ public double getPercentComplete() ++ { ++ if (getMaximum() == getMinimum()) ++ return 1.0; ++ else ++ return (double) (model.getValue() - model.getMinimum()) / (model ++ .getMaximum() ++ - model.getMinimum()); ++ } ++ ++ /** ++ * This method returns whether the border is painted. ++ * ++ * @return Whether the border is painted. ++ */ ++ public boolean isBorderPainted() ++ { ++ return paintBorder; ++ } ++ ++ /** ++ * This method changes the borderPainted property. ++ * ++ * @param painted Whether the border is painted. ++ */ ++ public void setBorderPainted(boolean painted) ++ { ++ if (painted != paintBorder) ++ { ++ boolean oldPainted = paintBorder; ++ paintBorder = painted; ++ firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, oldPainted, ++ paintBorder); ++ } ++ } ++ ++ /** ++ * This method returns the JProgressBar's UI delegate. ++ * ++ * @return This JProgressBar's UI delegate. ++ */ ++ public ProgressBarUI getUI() ++ { ++ return (ProgressBarUI) ui; ++ } ++ ++ /** ++ * This method changes the UI property for this JProgressBar. ++ * ++ * @param ui The new UI delegate. ++ */ ++ public void setUI(ProgressBarUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method reverts the UI delegate for this JProgressBar ++ * to the default for this Look and Feel. ++ */ ++ public void updateUI() ++ { ++ setUI((ProgressBarUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns the identifier to allow the UIManager ++ * to pick the correct class to act as the UI for ++ * this JProgressBar. ++ * ++ * @return The UIClassID: "ProgressBarUI". ++ */ ++ public String getUIClassID() ++ { ++ return "ProgressBarUI"; ++ } ++ ++ /** ++ * This method returns a ChangeListener that gets registered ++ * model. By default, the ChangeListener, propagates the ++ * ChangeEvents to the ChangeListeners of the JProgressBar. ++ * ++ * @return A new ChangeListener. ++ */ ++ protected ChangeListener createChangeListener() ++ { ++ return new ChangeListener() ++ { ++ public void stateChanged(ChangeEvent ce) ++ { ++ fireStateChanged(); ++ } ++ }; ++ } ++ ++ /** ++ * This method adds a ChangeListener to this JProgressBar. ++ * ++ * @param listener The ChangeListener to add to this JProgressBar. ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method removes a ChangeListener from this JProgressBar. ++ * ++ * @param listener The ChangeListener to remove from this JProgressBar. ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method returns an array of all ChangeListeners listening to this ++ * progress bar. ++ * ++ * @return An array of ChangeListeners listening to this progress bar. ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * This method is called when the JProgressBar receives a ChangeEvent ++ * from its model. This simply propagates the event (changing the source ++ * to the JProgressBar) to the JProgressBar's listeners. ++ */ ++ protected void fireStateChanged() ++ { ++ Object[] changeListeners = listenerList.getListenerList(); ++ if (changeEvent == null) ++ changeEvent = new ChangeEvent(this); ++ for (int i = changeListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (changeListeners[i] == ChangeListener.class) ++ ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent); ++ } ++ } ++ ++ /** ++ * This method returns the model used with this JProgressBar. ++ * ++ * @return The model used with this JProgressBar. ++ */ ++ public BoundedRangeModel getModel() ++ { ++ return model; ++ } ++ ++ /** ++ * This method changes the model property for this JProgressBar. ++ * ++ * @param model The model to use with this JProgressBar. ++ */ ++ public void setModel(BoundedRangeModel model) ++ { ++ if (model != this.model) ++ { ++ this.model.removeChangeListener(changeListener); ++ this.model = model; ++ this.model.addChangeListener(changeListener); ++ fireStateChanged(); ++ } ++ } ++ ++ /** ++ * This method returns the minimum value of this JProgressBar. ++ * ++ * @return The minimum value of this JProgressBar. ++ */ ++ public int getMinimum() ++ { ++ return model.getMinimum(); ++ } ++ ++ /** ++ * This method sets the minimum value of this JProgressBar. ++ * ++ * @param minimum The minimum value of this JProgressBar. ++ */ ++ public void setMinimum(int minimum) ++ { ++ model.setMinimum(minimum); ++ } ++ ++ /** ++ * This method returns the maximum value of this JProgressBar. ++ * ++ * @return The maximum value of this JProgressBar. ++ */ ++ public int getMaximum() ++ { ++ return model.getMaximum(); ++ } ++ ++ /** ++ * This method sets the maximum value of this JProgressBar. ++ * ++ * @param maximum The maximum value of this JProgressBar. ++ */ ++ public void setMaximum(int maximum) ++ { ++ model.setMaximum(maximum); ++ } ++ ++ /** ++ * This method returns a string that can be used to ++ * describe this JProgressBar. This method is usually ++ * only used for debugging purposes. ++ * ++ * @return A string that describes this JProgressBar. ++ */ ++ protected String paramString() ++ { ++ return "JProgressBar"; ++ } ++ ++ /** ++ * This method changes the indeterminate property. If the ++ * JProgressBar is determinate, it paints a percentage ++ * of the bar described by its value. If it is indeterminate, ++ * it simply bounces a box between the ends of the bar; the ++ * value of the JProgressBar is ignored. ++ * ++ * @param newValue Whether the JProgressBar is indeterminate. ++ */ ++ public void setIndeterminate(boolean newValue) ++ { ++ if (indeterminate != newValue) ++ { ++ boolean olddeter = indeterminate; ++ indeterminate = newValue; ++ firePropertyChange(INDETERMINATE_CHANGED_PROPERTY, olddeter, ++ indeterminate); ++ } ++ } ++ ++ /** ++ * This method returns whether the JProgressBar is indeterminate. ++ * ++ * @return Whether this JProgressBar is indeterminate. ++ */ ++ public boolean isIndeterminate() ++ { ++ return indeterminate; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJProgressBar(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JRadioButton.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JRadioButton.java,v +retrieving revision 1.2 +diff -u -r1.2 JRadioButton.java +--- javax/swing/JRadioButton.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JRadioButton.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ + /* JRadioButton.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,31 +42,49 @@ + + public class JRadioButton extends JToggleButton + { +- public JRadioButton() +- { +- this(null, null); +- } +- public JRadioButton(Action a) +- { +- this(); +- setAction(a); +- } ++ private static final long serialVersionUID = 7751949583255506856L; + +- public JRadioButton(Icon icon) +- { +- this(null, icon); +- } ++ public JRadioButton() ++ { ++ this(null, null); ++ } ++ ++ public JRadioButton(Action a) ++ { ++ this(); ++ setAction(a); ++ } ++ ++ public JRadioButton(Icon icon) ++ { ++ this(null, icon); ++ } + +- public JRadioButton(String text) +- { +- this(text, null); +- } ++ public JRadioButton(Icon icon, boolean selected) ++ { ++ this(null, icon, selected); ++ } ++ ++ public JRadioButton(String text) ++ { ++ this(text, null); ++ } ++ ++ public JRadioButton(String text, boolean selected) ++ { ++ this(text, null, selected); ++ } + +- public JRadioButton(String text, Icon icon) +- { +- super(text, icon); +- } +- ++ public JRadioButton(String text, Icon icon) ++ { ++ super(text, icon); ++ borderPainted = false; ++ contentAreaFilled = false; ++ } ++ ++ public JRadioButton(String text, Icon icon, boolean selected) ++ { ++ } + + public AccessibleContext getAccessibleContext() + { +@@ -76,8 +94,9 @@ + + public String getUIClassID() + { +- //Returns a string that specifies the name of the L&F class that renders this component. +- return "JRadioButton"; ++ //Returns a string that specifies the name of the Look and Feel ++ //class that renders this component. ++ return "RadioButtonUI"; + } + + protected String paramString() +Index: javax/swing/JRadioButtonMenuItem.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JRadioButtonMenuItem.java,v +retrieving revision 1.3 +diff -u -r1.3 JRadioButtonMenuItem.java +--- javax/swing/JRadioButtonMenuItem.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/JRadioButtonMenuItem.java 6 Sep 2004 16:35:58 -0000 +@@ -42,183 +42,172 @@ + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++ + + /** +- * JRadioButtonMenuItem +- * @author Andrew Selkirk +- * @version 1.0 ++ * This class represents JRadioButtonMenuItem. Its behaviour is very similar ++ * to JRadioButton. Just like JRadioButton, user can check and uncheck this ++ * menu item by clicking on it. JRadioButtonMenuItem uses ToggleButtonModel ++ * to keep track of its selection. If the JRadioButtonMenuItem is included in ++ * the button group, then only one JRadioButtonMenuItem can be selected at ++ * one time. + */ + public class JRadioButtonMenuItem extends JMenuItem implements Accessible + { ++ private static final long serialVersionUID = 8482658191548521743L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJRadioButtonMenuItem +- */ +- protected class AccessibleJRadioButtonMenuItem extends AccessibleJMenuItem { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJRadioButtonMenuItem +- * @param component TODO +- */ +- protected AccessibleJRadioButtonMenuItem(JRadioButtonMenuItem component) { +- super(component); +- // TODO +- } // AccessibleJRadioButtonMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.RADIO_BUTTON; +- } // getAccessibleRole() +- +- +- } // AccessibleJRadioButtonMenuItem +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "RadioButtonMenuItemUI"; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JRadioButtonMenuItem +- */ +- public JRadioButtonMenuItem() { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param icon TODO +- */ +- public JRadioButtonMenuItem(Icon icon) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param text TODO +- */ +- public JRadioButtonMenuItem(String text) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param action TODO +- */ +- public JRadioButtonMenuItem(Action action) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param text TODO +- * @param icon TODO +- */ +- public JRadioButtonMenuItem(String text, Icon icon) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param text TODO +- * @param selected TODO +- */ +- public JRadioButtonMenuItem(String text, boolean selected) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param icon TODO +- * @param selected TODO +- */ +- public JRadioButtonMenuItem(Icon icon, boolean selected) { +- // TODO +- } // JRadioButtonMenuItem() +- +- /** +- * Constructor JRadioButtonMenuItem +- * @param text TODO +- * @param icon TODO +- * @param selected TODO +- */ +- public JRadioButtonMenuItem(String text, Icon icon, boolean selected) { +- // TODO +- } // JRadioButtonMenuItem() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * requestFocus +- */ +- public void requestFocus() { +- // TODO +- } // requestFocus() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJRadioButtonMenuItem(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- ++ /** name for the UI delegate for this radio button menu item. */ ++ private static final String uiClassID = "RadioButtonMenuItemUI"; + +-} // JRadioButtonMenuItem ++ /** ++ * Creates a new JRadioButtonMenuItem object. ++ */ ++ public JRadioButtonMenuItem() ++ { ++ this(null, null); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified icon ++ * ++ * @param icon Icon to be used for this menu item ++ */ ++ public JRadioButtonMenuItem(Icon icon) ++ { ++ this(null, icon); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified label ++ * ++ * @param text Label for this menu item ++ */ ++ public JRadioButtonMenuItem(String text) ++ { ++ this(text, null); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem using specified action ++ * ++ * @param action Action for this menu item ++ */ ++ public JRadioButtonMenuItem(Action action) ++ { ++ this(); ++ setAction(action); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified label and icon ++ * ++ * @param text Label for this menu item ++ * @param icon Icon for this menu item ++ */ ++ public JRadioButtonMenuItem(String text, Icon icon) ++ { ++ this(text, icon, false); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified label ++ * and marked selected if 'selected' is true. ++ * ++ * @param text Text for this menu item ++ * @param selected Selected state of this menu item ++ */ ++ public JRadioButtonMenuItem(String text, boolean selected) ++ { ++ this(text, null, selected); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified icon ++ * and given selected state ++ * ++ * @param icon Icon for this menu item ++ * @param selected Selected state for this menu item ++ */ ++ public JRadioButtonMenuItem(Icon icon, boolean selected) ++ { ++ this(null, icon, selected); ++ } ++ ++ /** ++ * Creates a new JRadioButtonMenuItem with specified label, ++ * icon and selected state. ++ * ++ * @param text Label for this menu item ++ * @param icon Icon to be use for this menu item ++ * @param selected selected state of this menu item ++ */ ++ public JRadioButtonMenuItem(String text, Icon icon, boolean selected) ++ { ++ super(text, icon); ++ setModel(new JToggleButton.ToggleButtonModel()); ++ model.setSelected(selected); ++ } ++ ++ private void writeObject(ObjectOutputStream stream) throws IOException ++ { ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the menuItem. ++ * ++ * @return The Look and Feel classID. "JRadioButtonMenuItemUI" ++ */ ++ public String getUIClassID() ++ { ++ return uiClassID; ++ } ++ ++ /** ++ * This method overrides JComponent.requestFocus with an empty ++ * implementation, since JRadioButtonMenuItems should not ++ * receve focus in general. ++ */ ++ public void requestFocus() ++ { ++ // Should do nothing here ++ } ++ ++ /** ++ * A string that describes this JRadioButtonMenuItem. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JRadioButtonMenuItem ++ */ ++ protected String paramString() ++ { ++ return "JRadioButtonMenuItem"; ++ } ++ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJRadioButtonMenuItem(); ++ ++ return accessibleContext; ++ } ++ ++ protected class AccessibleJRadioButtonMenuItem extends AccessibleJMenuItem ++ { ++ private static final long serialVersionUID = 4381471510145292179L; ++ ++ /** ++ * Creates a new AccessibleJRadioButtonMenuItem object. ++ */ ++ protected AccessibleJRadioButtonMenuItem() ++ { ++ } ++ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.RADIO_BUTTON; ++ } ++ } ++} +Index: javax/swing/JRootPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JRootPane.java,v +retrieving revision 1.3 +diff -u -r1.3 JRootPane.java +--- javax/swing/JRootPane.java 22 Nov 2003 00:03:35 -0000 1.3 ++++ javax/swing/JRootPane.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ + /* JRootPane.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.BorderLayout; +@@ -45,168 +44,498 @@ + import java.awt.LayoutManager; + import java.awt.LayoutManager2; + import java.io.Serializable; +-import javax.accessibility.Accessible; +-import javax.accessibility.AccessibleComponent; ++import javax.accessibility.AccessibleRole; ++import javax.swing.plaf.RootPaneUI; + + /** +- * This class is where JComponents are added to. +- * Unlike awt where you could just say frame.add(), +- * with swing you need to say frame.getRootPane() +- * (which delivers an instance of this class) +- * and add your components to that. +- * +- * It is implemented by several 'layers' (pane() should be read as plane()) +- * each on top of the others +- * where you can add components to. ++ * This class is where JComponents are added to. Unlike awt where you could ++ * just say frame.add(), with swing you need to say frame.getRootPane() ++ * (which delivers an instance of this class) and add your components to ++ * that. It is implemented by several 'layers' (pane() should be read as ++ * plane()) each on top of the others where you can add components to. + * (getContentPane(), getGlassPane(), getLayeredPane()) + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ + public class JRootPane extends JComponent + { +- // The class used to obtain the accessible role for this object. +- static protected class AccessibleJRootPane ++ // The class used to obtain the accessible role for this object. ++ protected static class AccessibleJRootPane ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 1082432482784468088L; ++ ++ /** ++ * Creates a new AccessibleJRootPane object. ++ */ ++ protected AccessibleJRootPane() + { + } +- +- //A custom layout manager +- static protected class RootLayout extends BorderLayout +- { +- public Dimension preferredLayoutSize ( Container c ) +- { +- Dimension p = super.preferredLayoutSize(c); +- System.out.println(" PREF-SIZE from RootLayout = " + p); +- return p; +- } +- } +- +- /***********************************************************/ +- +- +- //The glass pane that overlays the menu bar and content pane, so it can intercept mouse movements and such. +- protected Component glassPane; +- +- //The layered pane that manages the menu bar and content pane. +- protected JLayeredPane layeredPane; +- +- // The menu bar. +- protected JMenuBar menuBar; +- +- protected Container contentPane; +- +- /********************************************************/ +- +- public String getUIClassID() +- { return "JPanel"; } +- +- +- void setJMenuBar(JMenuBar m) +- { menuBar = m; } +- +- JMenuBar getJMenuBar() +- { return menuBar; } +- +- +- public Container getContentPane() +- { +- if (contentPane == null) +- { +- setContentPane(createContentPane()); +- } +- return contentPane; +- } +- +- public void setContentPane(Container p) +- { +- contentPane = p; +- getLayeredPane().add(contentPane, JLayeredPane.FRAME_CONTENT_LAYER); +- } +- +- protected void addImpl(Component comp, +- Object constraints, +- int index) +- { +- super.addImpl(comp, constraints, index); +- //System.out.println("don't do that !"); +- } +- +- public Component getGlassPane() +- { +- if (glassPane == null) +- setGlassPane(createGlassPane()); +- return glassPane; +- } +- +- public void setGlassPane(Component f) +- { +- if (glassPane != null) +- remove(glassPane); +- +- glassPane = f; +- +- glassPane.setVisible(false); +- add(glassPane, 0); +- } + +- public JLayeredPane getLayeredPane() +- { +- if (layeredPane == null) +- setLayeredPane(createLayeredPane()); +- return layeredPane; +- } +- public void setLayeredPane(JLayeredPane f) ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.ROOT_PANE; ++ } ++ } ++ ++ // Custom Layout Manager for JRootPane. It positions contentPane and ++ // menuBar withing its layeredPane. ++ protected class RootLayout implements LayoutManager2, Serializable ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -4100116998559815027L; ++ ++ /** ++ * Creates a new RootLayout object. ++ */ ++ protected RootLayout() + { +- if (layeredPane != null) +- remove(layeredPane); +- +- layeredPane = f; +- add(f, -1); + } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @param comp DOCUMENT ME! ++ * @param constraints DOCUMENT ME! ++ */ ++ public void addLayoutComponent(Component comp, Object constraints) ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param name DOCUMENT ME! ++ * @param comp DOCUMENT ME! ++ */ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param target DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public float getLayoutAlignmentX(Container target) ++ { ++ return target.getAlignmentX(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param target DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public float getLayoutAlignmentY(Container target) ++ { ++ return target.getAlignmentY(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param target DOCUMENT ME! ++ */ ++ public void invalidateLayout(Container target) ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ */ ++ public void layoutContainer(Container c) ++ { ++ Dimension menuBarSize; ++ Dimension containerSize = c.getSize(null); ++ Dimension contentPaneSize = contentPane.getPreferredSize(); ++ ++ /* ++ if size of top-level window wasn't set then just set ++ contentPane and menuBar to its preferred sizes. ++ Otherwise, if the size of top-level window was specified then ++ set menuBar to its preferred size and make content pane ++ to fit into the remaining space ++ ++ ++ +-------------------------------+ ++ | JLayeredPane | ++ | +--------------------------+ | ++ | | menuBar | | ++ | +--------------------------+ | ++ | +--------------------------+ | ++ | |contentPane | | ++ | | | | ++ | | | | ++ | | | | ++ | +--------------------------+ | ++ +-------------------------------+ ++ ++ */ ++ if (containerSize.width == 0 && containerSize.height == 0) ++ { ++ if (menuBar != null) ++ { ++ int maxWidth; ++ menuBarSize = menuBar.getPreferredSize(); ++ maxWidth = Math.max(menuBarSize.width, contentPaneSize.width); ++ menuBar.setBounds(0, 0, maxWidth, menuBarSize.height); ++ glassPane.setBounds(0, menuBarSize.height, maxWidth, ++ contentPaneSize.height); ++ contentPane.setBounds(0, menuBarSize.height, maxWidth, ++ contentPaneSize.height); ++ layeredPane.setSize(maxWidth, ++ menuBarSize.height + contentPaneSize.height); ++ } ++ else ++ { ++ glassPane.setBounds(0, 0, contentPaneSize.width, ++ contentPaneSize.height); ++ contentPane.setBounds(0, 0, contentPaneSize.width, ++ contentPaneSize.height); ++ layeredPane.setSize(contentPaneSize.width, contentPaneSize.height); ++ } ++ } ++ else ++ { ++ if (menuBar != null) ++ { ++ menuBarSize = menuBar.getPreferredSize(); ++ if (menuBarSize.height > containerSize.height) ++ menuBarSize.height = containerSize.height; ++ menuBar.setBounds(0, 0, containerSize.width, menuBarSize.height); ++ int remainingHeight = containerSize.height - menuBarSize.height; ++ glassPane.setBounds(0, menuBarSize.height, containerSize.width, ++ containerSize.height - menuBarSize.height); ++ contentPane.setBounds(0, menuBarSize.height, ++ containerSize.width, ++ (containerSize.height - menuBarSize.height)); ++ } ++ else ++ { ++ glassPane.setBounds(0, 0, containerSize.width, ++ containerSize.height); ++ contentPane.setBounds(0, 0, containerSize.width, ++ containerSize.height); ++ } + +- /********************************************************/ +- +- JRootPane() +- { +- setLayout(createRootLayout()); +- +- getGlassPane(); +- getLayeredPane(); +- getContentPane(); +- +- setDoubleBuffered(true); +- updateUI(); +- } +- +- protected LayoutManager createRootLayout() { +- return new RootLayout(); +- } +- +- JComponent createContentPane() +- { +- JPanel p = new JPanel(); +- p.setName(this.getName()+".contentPane"); +- p.setLayout(new BorderLayout()); +- // p.setVisible(true); +- +- System.out.println("Created ContentPane: " + p); +- return p; +- } +- +- Component createGlassPane() +- { +- JPanel p = new JPanel(); +- p.setName(this.getName()+".glassPane"); +- p.setLayout(new BorderLayout()); +- p.setVisible(false); +- +- System.out.println("created the glasspane: "+p); +- return p; ++ layeredPane.setSize(containerSize.width, containerSize.height); ++ } + } + +- JLayeredPane createLayeredPane() +- { +- JLayeredPane l = new JLayeredPane(); +- return l; +- } ++ /** ++ * DOCUMENT ME! ++ * ++ * @param target DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension maximumLayoutSize(Container target) ++ { ++ return preferredLayoutSize(target); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param target DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension minimumLayoutSize(Container target) ++ { ++ return preferredLayoutSize(target); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension preferredLayoutSize(Container c) ++ { ++ Dimension menuBarSize; ++ Dimension prefSize; ++ ++ Dimension containerSize = c.getSize(); ++ Dimension contentPaneSize = contentPane.getPreferredSize(); ++ ++ if (containerSize.width == 0 && containerSize.height == 0) ++ { ++ if (menuBar != null) ++ { ++ int maxWidth; ++ menuBarSize = menuBar.getPreferredSize(); ++ maxWidth = Math.max(menuBarSize.width, contentPaneSize.width); ++ prefSize = new Dimension(maxWidth, ++ contentPaneSize.height ++ + menuBarSize.height); ++ } ++ else ++ prefSize = contentPaneSize; ++ } ++ else ++ prefSize = c.getSize(); ++ ++ return prefSize; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param comp DOCUMENT ME! ++ */ ++ public void removeLayoutComponent(Component comp) ++ { ++ } ++ } ++ ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 8690748000348575668L; ++ ++ /** DOCUMENT ME! */ ++ protected Component glassPane; ++ ++ /** DOCUMENT ME! */ ++ protected JLayeredPane layeredPane; ++ ++ /** DOCUMENT ME! */ ++ protected JMenuBar menuBar; ++ ++ /** DOCUMENT ME! */ ++ protected Container contentPane; ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param m DOCUMENT ME! ++ */ ++ public void setJMenuBar(JMenuBar m) ++ { ++ menuBar = m; ++ getLayeredPane().add(menuBar, JLayeredPane.FRAME_CONTENT_LAYER); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public JMenuBar getJMenuBar() ++ { ++ return menuBar; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean isValidateRoot() ++ { ++ return true; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Container getContentPane() ++ { ++ if (contentPane == null) ++ setContentPane(createContentPane()); ++ return contentPane; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param p DOCUMENT ME! ++ */ ++ public void setContentPane(Container p) ++ { ++ contentPane = p; ++ getLayeredPane().add(contentPane, JLayeredPane.FRAME_CONTENT_LAYER); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param comp DOCUMENT ME! ++ * @param constraints DOCUMENT ME! ++ * @param index DOCUMENT ME! ++ */ ++ protected void addImpl(Component comp, Object constraints, int index) ++ { ++ super.addImpl(comp, constraints, index); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Component getGlassPane() ++ { ++ if (glassPane == null) ++ setGlassPane(createGlassPane()); ++ return glassPane; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param f DOCUMENT ME! ++ */ ++ public void setGlassPane(Component f) ++ { ++ if (glassPane != null) ++ remove(glassPane); ++ ++ glassPane = f; ++ ++ glassPane.setVisible(false); ++ add(glassPane, 0); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public JLayeredPane getLayeredPane() ++ { ++ if (layeredPane == null) ++ setLayeredPane(createLayeredPane()); ++ return layeredPane; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param f DOCUMENT ME! ++ */ ++ public void setLayeredPane(JLayeredPane f) ++ { ++ if (layeredPane != null) ++ remove(layeredPane); ++ ++ layeredPane = f; ++ add(f, -1); ++ } ++ ++ /** ++ * Creates a new JRootPane object. ++ */ ++ public JRootPane() ++ { ++ setLayout(createRootLayout()); ++ getGlassPane(); ++ getLayeredPane(); ++ getContentPane(); ++ setDoubleBuffered(true); ++ updateUI(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected LayoutManager createRootLayout() ++ { ++ return new RootLayout(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected JComponent createContentPane() ++ { ++ JPanel p = new JPanel(); ++ p.setName(this.getName() + ".contentPane"); ++ p.setLayout(new BorderLayout()); ++ return p; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected Component createGlassPane() ++ { ++ JPanel p = new JPanel(); ++ p.setName(this.getName() + ".glassPane"); ++ p.setLayout(new BorderLayout()); ++ p.setVisible(false); ++ p.setOpaque(false); ++ return p; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected JLayeredPane createLayeredPane() ++ { ++ JLayeredPane l = new JLayeredPane(); ++ l.setLayout(null); ++ return l; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public RootPaneUI getUI() ++ { ++ return (RootPaneUI) ui; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param ui DOCUMENT ME! ++ */ ++ public void setUI(RootPaneUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public void updateUI() ++ { ++ setUI((RootPaneUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public String getUIClassID() ++ { ++ return "RootPaneUI"; ++ } + } +Index: javax/swing/JScrollBar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JScrollBar.java,v +retrieving revision 1.2 +diff -u -r1.2 JScrollBar.java +--- javax/swing/JScrollBar.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JScrollBar.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ +-/* JScrollBar.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JScrollBar.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,13 +35,701 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Adjustable; ++import java.awt.Dimension; ++import java.awt.event.AdjustmentEvent; + import java.awt.event.AdjustmentListener; ++ + import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleStateSet; ++import javax.accessibility.AccessibleValue; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.plaf.ScrollBarUI; + +-public class JScrollBar extends JComponent ++ ++/** ++ * The JScrollBar. Two buttons control how the values that the ++ * scroll bar can take. You can also drag the thumb or click the track ++ * to move the scroll bar. Typically, the JScrollBar is used with ++ * other components to translate the value of the bar to the viewable ++ * contents of the other components. ++ */ ++public class JScrollBar extends JComponent implements Adjustable, Accessible + { ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJScrollBar extends JComponent.AccessibleJComponent ++ implements AccessibleValue ++ { ++ private static final long serialVersionUID = -7758162392045586663L; ++ ++ /** ++ * Creates a new AccessibleJSlider object. ++ * ++ * @param value0 DOCUMENT ME! ++ */ ++ protected AccessibleJScrollBar() ++ { ++ super(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * setCurrentAccessibleValue ++ * ++ * @param value0 TODO ++ * ++ * @return boolean ++ */ ++ public boolean setCurrentAccessibleValue(Number value0) ++ { ++ return false; ++ } ++ ++ /** ++ * getMinimumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * getMaximumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ } ++ ++ private static final long serialVersionUID = -8195169869225066566L; ++ ++ /** Fired in a PropertyChangeEvent when the "blockIncrement" changes. */ ++ public static final String BLOCK_INCREMENT_CHANGED_PROPERTY = "blockIncrement"; ++ ++ /** Fired in a PropertyChangeEvent when the "model" changes. */ ++ public static final String MODEL_CHANGED_PROPERTY = "model"; ++ ++ /** Fired in a PropertyChangeEvent when the "orientation" changes. */ ++ public static final String ORIENTATION_CHANGED_PROPERTY = "orientation"; ++ ++ /** Fired in a PropertyChangeEvent when the "unitIncrement" changes. */ ++ public static final String UNIT_INCREMENT_CHANGED_PROPERTY = "unitIncrement"; ++ ++ /** How much the thumb moves when moving in a block. */ ++ protected int blockIncrement = 10; ++ ++ /** The model that holds the scroll bar's data. */ ++ protected BoundedRangeModel model; ++ ++ /** The orientation of the scroll bar. */ ++ protected int orientation = SwingConstants.VERTICAL; ++ ++ /** How much the thumb moves when moving in a unit. */ ++ protected int unitIncrement = 1; ++ ++ /** The ChangeListener that listens to the model. */ ++ private transient ChangeListener changeListener; ++ ++ /** The ChangeEvent that's fired. */ ++ private transient ChangeEvent changeEvent; ++ ++ /** ++ * Creates a new horizontal JScrollBar object with a minimum ++ * of 0, a maxmium of 100, a value of 0 and an extent of 10. ++ */ ++ public JScrollBar() ++ { ++ this(SwingConstants.VERTICAL, 0, 10, 0, 100); ++ } ++ ++ /** ++ * Creates a new JScrollBar object with a minimum of 0, a ++ * maximum of 100, a value of 0, an extent of 10 and the given ++ * orientation. ++ * ++ * @param orientation The orientation of the JScrollBar. ++ */ ++ public JScrollBar(int orientation) ++ { ++ this(orientation, 0, 10, 0, 100); ++ } ++ ++ /** ++ * Creates a new JScrollBar object with the given orientation, ++ * value, min, max, and extent. ++ * ++ * @param orientation The orientation to use. ++ * @param value The value to use. ++ * @param extent The extent to use. ++ * @param min The minimum value of the scrollbar. ++ * @param max The maximum value of the scrollbar. ++ */ ++ public JScrollBar(int orientation, int value, int extent, int min, int max) ++ { ++ model = new DefaultBoundedRangeModel(value, extent, min, max); ++ if (orientation != SwingConstants.HORIZONTAL ++ && orientation != SwingConstants.VERTICAL) ++ throw new IllegalArgumentException(orientation ++ + " is not a legal orientation"); ++ this.orientation = orientation; ++ changeListener = createChangeListener(); ++ model.addChangeListener(changeListener); ++ updateUI(); ++ } ++ ++ /** ++ * This method sets the UI of this scrollbar to ++ * the given UI. ++ * ++ * @param ui The UI to use with this scrollbar. ++ */ ++ public void setUI(ScrollBarUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method returns the UI that is being used ++ * with this scrollbar. ++ * ++ * @return The scrollbar's current UI. ++ */ ++ public ScrollBarUI getUI() ++ { ++ return (ScrollBarUI) ui; ++ } ++ ++ /** ++ * This method changes the UI to be the ++ * default for the current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((ScrollBarUI) UIManager.getUI(this)); ++ invalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method returns an identifier to ++ * choose the correct UI delegate for the ++ * scrollbar. ++ * ++ * @return The identifer to choose the UI delegate; "ScrollBarUI" ++ */ ++ public String getUIClassID() ++ { ++ return "ScrollBarUI"; ++ } ++ ++ /** ++ * This method returns the orientation of the scrollbar. ++ * ++ * @return The orientation of the scrollbar. ++ */ ++ public int getOrientation() ++ { ++ return orientation; ++ } ++ ++ /** ++ * This method sets the orientation of the scrollbar. ++ * ++ * @param orientation The orientation of the scrollbar. ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != SwingConstants.HORIZONTAL ++ && orientation != SwingConstants.VERTICAL) ++ throw new IllegalArgumentException("orientation must be one of HORIZONTAL or VERTICAL"); ++ if (orientation != this.orientation) ++ { ++ int oldOrientation = this.orientation; ++ this.orientation = orientation; ++ firePropertyChange(ORIENTATION_CHANGED_PROPERTY, oldOrientation, ++ this.orientation); ++ } ++ } ++ ++ /** ++ * This method returns the model being used with ++ * the scrollbar. ++ * ++ * @return The scrollbar's model. ++ */ ++ public BoundedRangeModel getModel() ++ { ++ return model; ++ } ++ ++ /** ++ * This method sets the model to use with ++ * the scrollbar. ++ * ++ * @param newModel The new model to use with the scrollbar. ++ */ ++ public void setModel(BoundedRangeModel newModel) ++ { ++ if (model != newModel) ++ { ++ BoundedRangeModel oldModel = model; ++ model = newModel; ++ oldModel.removeChangeListener(changeListener); ++ model.addChangeListener(changeListener); ++ firePropertyChange(MODEL_CHANGED_PROPERTY, oldModel, model); ++ } ++ } ++ ++ /** ++ * This method returns how much the scrollbar's value ++ * should change for a unit increment depending on the ++ * given direction. ++ * ++ * @param direction The direction to scroll in. ++ * ++ * @return The amount the scrollbar's value will change given the direction. ++ */ ++ public int getUnitIncrement(int direction) ++ { ++ return direction * unitIncrement; ++ } ++ ++ /** ++ * This method sets the unitIncrement property. ++ * ++ * @param unitIncrement The new unitIncrement. ++ */ ++ public void setUnitIncrement(int unitIncrement) ++ { ++ if (unitIncrement != this.unitIncrement) ++ { ++ int oldInc = this.unitIncrement; ++ this.unitIncrement = unitIncrement; ++ firePropertyChange(UNIT_INCREMENT_CHANGED_PROPERTY, oldInc, ++ this.unitIncrement); ++ } ++ } ++ ++ /** ++ * The method returns how much the scrollbar's value ++ * should change for a block increment depending on ++ * the given direction. ++ * ++ * @param direction The direction to scroll in. ++ * ++ * @return The amount the scrollbar's value will change given the direction. ++ */ ++ public int getBlockIncrement(int direction) ++ { ++ return direction * blockIncrement; ++ } ++ ++ /** ++ * This method sets the blockIncrement property. ++ * ++ * @param blockIncrement The new blockIncrement. ++ */ ++ public void setBlockIncrement(int blockIncrement) ++ { ++ if (blockIncrement != this.blockIncrement) ++ { ++ int oldInc = this.blockIncrement; ++ this.blockIncrement = blockIncrement; ++ firePropertyChange(BLOCK_INCREMENT_CHANGED_PROPERTY, oldInc, ++ this.blockIncrement); ++ } ++ } ++ ++ /** ++ * This method returns the unitIncrement. ++ * ++ * @return The unitIncrement. ++ */ ++ public int getUnitIncrement() ++ { ++ return unitIncrement; ++ } ++ ++ /** ++ * This method returns the blockIncrement. ++ * ++ * @return The blockIncrement. ++ */ ++ public int getBlockIncrement() ++ { ++ return blockIncrement; ++ } ++ ++ /** ++ * This method returns the value of the scrollbar. ++ * ++ * @return The value of the scrollbar. ++ */ ++ public int getValue() ++ { ++ return model.getValue(); ++ } ++ ++ /** ++ * This method changes the value of the scrollbar. ++ * ++ * @param value The new value of the scrollbar. ++ */ ++ public void setValue(int value) ++ { ++ if (isEnabled() && value != getValue()) ++ { ++ model.setValue(value); ++ fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, value); ++ } ++ } ++ ++ /** ++ * This method returns the visible amount (AKA extent). ++ * The visible amount can be used by UI delegates to ++ * determine the size of the thumb. ++ * ++ * @return The visible amount (AKA extent). ++ */ ++ public int getVisibleAmount() ++ { ++ return model.getExtent(); ++ } ++ ++ /** ++ * This method sets the visible amount (AKA extent). ++ * ++ * @param extent The visible amount (AKA extent). ++ */ ++ public void setVisibleAmount(int extent) ++ { ++ if (extent != getVisibleAmount()) ++ { ++ model.setExtent(extent); ++ fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, extent); ++ } ++ } ++ ++ /** ++ * This method returns the minimum value of the scrollbar. ++ * ++ * @return The minimum value of the scrollbar. ++ */ ++ public int getMinimum() ++ { ++ return model.getMinimum(); ++ } ++ ++ /** ++ * This method sets the minimum value of the scrollbar. ++ * ++ * @param minimum The minimum value of the scrollbar. ++ */ ++ public void setMinimum(int minimum) ++ { ++ if (minimum != getMinimum()) ++ { ++ model.setMinimum(minimum); ++ fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, minimum); ++ } ++ } ++ ++ /** ++ * This method returns the maximum value of the scrollbar. ++ * ++ * @return The maximum value of the scrollbar. ++ */ ++ public int getMaximum() ++ { ++ return model.getMaximum(); ++ } ++ ++ /** ++ * This method sets the maximum value of the scrollbar. ++ * ++ * @param maximum The maximum value of the scrollbar. ++ */ ++ public void setMaximum(int maximum) ++ { ++ if (maximum != getMaximum()) ++ { ++ model.setMaximum(maximum); ++ fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, maximum); ++ } ++ } ++ ++ /** ++ * This method returns the model's isAjusting value. ++ * ++ * @return The model's isAdjusting value. ++ */ ++ public boolean getValueIsAdjusting() ++ { ++ return model.getValueIsAdjusting(); ++ } ++ ++ /** ++ * This method sets the model's isAdjusting value. ++ * ++ * @param b The new isAdjusting value. ++ */ ++ public void setValueIsAdjusting(boolean b) ++ { ++ model.setValueIsAdjusting(b); ++ } ++ ++ /** ++ * This method sets the value, extent, minimum and ++ * maximum. ++ * ++ * @param newValue The new value. ++ * @param newExtent The new extent. ++ * @param newMin The new minimum. ++ * @param newMax The new maximum. ++ */ ++ public void setValue(int newValue, int newExtent, int newMin, int newMax) ++ { ++ if (!isEnabled()) ++ newValue = model.getValue(); ++ // It seems to be that on any change the value is fired. ++ if (newValue != getValue() || newExtent != getVisibleAmount() || ++ newMin != getMinimum() || newMax != getMaximum()) ++ { ++ model.setRangeProperties(newValue, newExtent, newMin, newMax, ++ model.getValueIsAdjusting()); ++ fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, newValue); ++ } ++ } ++ ++ /** ++ * This method creates a new ChangeListener. ++ * ++ * @return A new ChangeListener. ++ */ ++ private ChangeListener createChangeListener() ++ { ++ return new ChangeListener() ++ { ++ public void stateChanged(ChangeEvent e) ++ { ++ fireStateChanged(); ++ } ++ }; ++ } ++ ++ /** ++ * This method is called whenever the model fires a ChangeEvent. It should ++ * propagate the ChangeEvent to its listeners with a new ChangeEvent that ++ * identifies the scroll bar as the source. ++ */ ++ private void fireStateChanged() ++ { ++ Object[] changeListeners = listenerList.getListenerList(); ++ if (changeEvent == null) ++ changeEvent = new ChangeEvent(this); ++ for (int i = changeListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (changeListeners[i] == ChangeListener.class) ++ ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent); ++ } ++ } ++ ++ /** ++ * This method adds a ChangeListener to the scroll bar. ++ * ++ * @param listener The listener to add. ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method removes a ChangeListener from the scroll bar. ++ * ++ * @param listener The listener to remove. ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method returns an array of all ChangeListeners listening to this ++ * scroll bar. ++ * ++ * @return An array of ChangeListeners listening to this scroll bar. ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * This method adds an AdjustmentListener to the scroll bar. ++ * ++ * @param listener The listener to add. ++ */ ++ public void addAdjustmentListener(AdjustmentListener listener) ++ { ++ listenerList.add(AdjustmentListener.class, listener); ++ } ++ ++ /** ++ * This method removes an AdjustmentListener from the scroll bar. ++ * ++ * @param listener The listener to remove. ++ */ ++ public void removeAdjustmentListener(AdjustmentListener listener) ++ { ++ listenerList.remove(AdjustmentListener.class, listener); ++ } ++ ++ /** ++ * This method returns an arry of all AdjustmentListeners listening to ++ * this scroll bar. ++ * ++ * @return An array of AdjustmentListeners listening to this scroll bar. ++ */ ++ public AdjustmentListener[] getAdjustmentListeners() ++ { ++ return (AdjustmentListener[]) listenerList.getListeners(AdjustmentListener.class); ++ } ++ ++ /** ++ * This method is called to fired AdjustmentEvents to the listeners ++ * of this scroll bar. All AdjustmentEvents that are fired ++ * will have an ID of ADJUSTMENT_VALUE_CHANGED and a type of ++ * TRACK. ++ * ++ * @param id The ID of the adjustment event. ++ * @param type The Type of change. ++ * @param value The new value for the property that was changed.. ++ */ ++ protected void fireAdjustmentValueChanged(int id, int type, int value) ++ { ++ Object[] adjustmentListeners = listenerList.getListenerList(); ++ AdjustmentEvent adjustmentEvent = new AdjustmentEvent(this, ++ AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ++ AdjustmentEvent.TRACK, ++ value); ++ for (int i = adjustmentListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (adjustmentListeners[i] == AdjustmentListener.class) ++ ((AdjustmentListener) adjustmentListeners[i + 1]).adjustmentValueChanged(adjustmentEvent); ++ } ++ } ++ ++ /** ++ * This method returns the minimum size for this scroll bar. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize() ++ { ++ return ui.getMinimumSize(this); ++ } ++ ++ /** ++ * This method returns the maximum size for this scroll bar. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize() ++ { ++ return ui.getMaximumSize(this); ++ } ++ ++ /** ++ * This method overrides the setEnabled in JComponent. ++ * When the scroll bar is disabled, the knob cannot ++ * be moved. ++ * ++ * @param x Whether the scrollbar is enabled. ++ */ ++ public void setEnabled(boolean x) ++ { ++ // nothing special needs to be done here since we ++ // just check the enabled setting before changing the value. ++ super.setEnabled(x); ++ } ++ ++ /** ++ * A string that describes this JScrollBar. Normally only used ++ * for debugging. ++ * ++ * @return A string describing this JScrollBar. ++ */ ++ protected String paramString() ++ { ++ return "JScrollBar"; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJScrollBar(); ++ return accessibleContext; ++ } + } +Index: javax/swing/JScrollPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JScrollPane.java,v +retrieving revision 1.2 +diff -u -r1.2 JScrollPane.java +--- javax/swing/JScrollPane.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JScrollPane.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ + /* JScrollPane.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,96 +39,611 @@ + package javax.swing; + + import java.awt.Component; ++import java.awt.ComponentOrientation; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Point; ++import java.awt.Rectangle; ++ + import javax.accessibility.Accessible; ++import javax.swing.border.Border; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; + import javax.swing.plaf.ScrollPaneUI; ++import javax.swing.plaf.UIResource; + +-public class JScrollPane extends JComponent implements Accessible, ScrollPaneConstants ++/** ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Property Stored in Bound?
    columnHeader scrollPane yes
    columnHeaderView columnHeader no
    componentOrientation scrollPane yes
    horizontalScrollBar scrollPane yes
    horizontalScrollBarPolicy scrollPane yes
    layout scrollPane yes
    rowHeader scrollPane yes
    rowHeaderView rowHeader no
    validateRoot scrollPane no
    verticalScrollBar scrollPane yes
    verticalScrollBarPolicy scrollPane yes
    viewport scrollPane yes
    viewportBorder scrollPane yes
    viewportBorderBounds scrollPane no
    viewportView viewport no
    wheelScrollingEnabled scrollPane yes
    ++ */ ++public class JScrollPane ++ extends JComponent ++ implements Accessible, ScrollPaneConstants + { +- protected JViewport columnHeader; +- protected JViewport rowHeader; +- +- protected Component lowerLeft; +- protected Component lowerRight; +- protected Component upperLeft; +- protected Component upperRight; +- +- protected JScrollBar horizontalScrollBar; +- protected int horizontalScrollBarPolicy; +- protected JScrollBar verticalScrollBar; +- protected int verticalScrollBarPolicy; +- +- protected JViewport viewport; +- +- +- public JScrollPane() +- { +- this(null, 0, 0); +- } ++ private static final long serialVersionUID = 5203525440012340014L; ++ ++ protected JViewport columnHeader; ++ protected JViewport rowHeader; ++ ++ protected Component lowerLeft; ++ protected Component lowerRight; ++ protected Component upperLeft; ++ protected Component upperRight; ++ ++ protected JScrollBar horizontalScrollBar; ++ protected int horizontalScrollBarPolicy; ++ protected JScrollBar verticalScrollBar; ++ protected int verticalScrollBarPolicy; ++ ++ protected JViewport viewport; ++ ++ Border viewportBorder; ++ boolean wheelScrollingEnabled; ++ ChangeListener scrollListener; ++ ++ public static final String COLUMN_HEADER_CHANGED_PROPERTY = "columnHeader"; ++ public static final String COMPONENT_ORIENTATION_CHANGED_PROPERTY = "componentOrientation"; ++ public static final String HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY = "horizontalScrollBar"; ++ public static final String HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY = "horizontalScrollBarPolicy"; ++ public static final String LAYOUT_CHANGED_PROPERTY = "layout"; ++ public static final String ROW_HEADER_CHANGED_PROPERTY = "rowHeader"; ++ public static final String VERTICAL_SCROLLBAR_CHANGED_PROPERTY = "verticalScrollBar"; ++ public static final String VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY = "verticalScrollBarPolicy"; ++ public static final String VIEWPORT_CHANGED_PROPERTY = "viewport"; ++ public static final String VIEWPORT_BORDER_CHANGED_PROPERTY = "viewportBorder"; ++ public static final String WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY = "wheelScrollingEnabled"; ++ ++ public JViewport getColumnHeader() ++ { ++ return columnHeader; ++ } ++ ++ public Component getCorner(String key) { ++ if (getComponentOrientation() ++ == ComponentOrientation.LEFT_TO_RIGHT) ++ { ++ if (key == LOWER_LEADING_CORNER) ++ key = LOWER_LEFT_CORNER; ++ else if (key == LOWER_TRAILING_CORNER) ++ key = LOWER_RIGHT_CORNER; ++ else if (key == UPPER_LEADING_CORNER) ++ key = UPPER_LEFT_CORNER; ++ else if (key == UPPER_TRAILING_CORNER) ++ key = UPPER_RIGHT_CORNER; ++ } ++ else if (getComponentOrientation() ++ == ComponentOrientation.RIGHT_TO_LEFT) ++ { ++ if (key == LOWER_LEADING_CORNER) ++ key = LOWER_RIGHT_CORNER; ++ else if (key == LOWER_TRAILING_CORNER) ++ key = LOWER_LEFT_CORNER; ++ else if (key == UPPER_LEADING_CORNER) ++ key = UPPER_RIGHT_CORNER; ++ else if (key == UPPER_TRAILING_CORNER) ++ key = UPPER_LEFT_CORNER; ++ } ++ ++ if (key == LOWER_RIGHT_CORNER) ++ return lowerRight; ++ else if (key == UPPER_RIGHT_CORNER) ++ return upperRight; ++ else if (key == LOWER_LEFT_CORNER) ++ return lowerLeft; ++ else if (key == UPPER_LEFT_CORNER) ++ return upperLeft; ++ return null; ++ } ++ ++ public JScrollBar getHorizontalScrollBar() ++ { ++ return horizontalScrollBar; ++ } ++ ++ public int getHorizontalScrollBarPolicy() ++ { ++ return horizontalScrollBarPolicy; ++ } ++ ++ public JViewport getRowHeader() ++ { ++ return rowHeader; ++ } ++ ++ public JScrollBar getVerticalScrollBar() ++ { ++ return verticalScrollBar; ++ } ++ ++ public int getVerticalScrollBarPolicy() ++ { ++ return verticalScrollBarPolicy; ++ } ++ ++ public JViewport getViewport() ++ { ++ return viewport; ++ } ++ ++ public Border getViewportBorder() ++ { ++ return viewportBorder; ++ } ++ ++ public Rectangle getViewportBorderBounds() ++ { ++ if (viewportBorder == null) ++ { ++ if (getViewport() == null) ++ return new Rectangle(0,0,0,0); ++ else ++ return getViewport().getBounds(); ++ } ++ else ++ { ++ Insets i = viewportBorder.getBorderInsets(getViewport()); ++ if (getViewport() == null) ++ return new Rectangle(0,0, ++ i.left+i.right, i.top+i.bottom); ++ else ++ { ++ Rectangle b = getViewport().getBounds(); ++ return new Rectangle(b.x - i.left, ++ b.y - i.top, ++ b.width + i.left + i.right, ++ b.height + i.top + i.bottom); ++ } ++ } ++ } ++ ++ public boolean isWheelScrollingEnabled() ++ { ++ return wheelScrollingEnabled; ++ } ++ ++ ++ ++ private void sync() ++ { ++ LayoutManager m = super.getLayout(); ++ if (m != null && m instanceof ScrollPaneLayout) ++ { ++ ScrollPaneLayout sl = (ScrollPaneLayout) m; ++ sl.syncWithScrollPane(this); ++ } ++ } ++ ++ private void removeNonNull(Component c) ++ { ++ if (c != null) ++ remove(c); ++ } ++ ++ private void addNonNull(Component c) ++ { ++ if (c != null) ++ add(c); ++ } ++ ++ public void setComponentOrientation(ComponentOrientation co) ++ { ++ ComponentOrientation old = super.getComponentOrientation(); ++ super.setComponentOrientation(co); ++ firePropertyChange(COMPONENT_ORIENTATION_CHANGED_PROPERTY, old, co); ++ sync(); ++ } ++ ++ public void setColumnHeader(JViewport h) ++ { ++ JViewport old = columnHeader; ++ removeNonNull(old); ++ columnHeader = h; ++ addNonNull(h); ++ firePropertyChange(COLUMN_HEADER_CHANGED_PROPERTY, old, h); ++ sync(); ++ } ++ ++ public void setColumnHeaderView(Component c) ++ { ++ if (columnHeader == null) ++ setColumnHeader(createViewport()); ++ columnHeader.setView(c); ++ sync(); ++ } ++ ++ public void setCorner(String key, Component c) ++ { ++ if (getComponentOrientation() ++ == ComponentOrientation.LEFT_TO_RIGHT) ++ { ++ if (key == LOWER_LEADING_CORNER) ++ key = LOWER_LEFT_CORNER; ++ else if (key == LOWER_TRAILING_CORNER) ++ key = LOWER_RIGHT_CORNER; ++ else if (key == UPPER_LEADING_CORNER) ++ key = UPPER_LEFT_CORNER; ++ else if (key == UPPER_TRAILING_CORNER) ++ key = UPPER_RIGHT_CORNER; ++ } ++ else if (getComponentOrientation() ++ == ComponentOrientation.RIGHT_TO_LEFT) ++ { ++ if (key == LOWER_LEADING_CORNER) ++ key = LOWER_RIGHT_CORNER; ++ else if (key == LOWER_TRAILING_CORNER) ++ key = LOWER_LEFT_CORNER; ++ else if (key == UPPER_LEADING_CORNER) ++ key = UPPER_RIGHT_CORNER; ++ else if (key == UPPER_TRAILING_CORNER) ++ key = UPPER_LEFT_CORNER; ++ } ++ ++ if (key == LOWER_RIGHT_CORNER) ++ { ++ removeNonNull(lowerRight); ++ lowerRight = c; ++ addNonNull(c); ++ } ++ else if (key == UPPER_RIGHT_CORNER) ++ { ++ removeNonNull(upperRight); ++ upperRight = c; ++ addNonNull(c); ++ } ++ else if (key == LOWER_LEFT_CORNER) ++ { ++ removeNonNull(lowerLeft); ++ lowerLeft = c; ++ addNonNull(c); ++ } ++ else if (key == UPPER_LEFT_CORNER) ++ { ++ removeNonNull(upperLeft); ++ upperLeft = c; ++ addNonNull(c); ++ } ++ else ++ throw new IllegalArgumentException("unknown corner " + key); ++ sync(); ++ } ++ ++ public void setHorizontalScrollBar(JScrollBar h) ++ { ++ JScrollBar old = horizontalScrollBar; ++ removeNonNull(old); ++ horizontalScrollBar = h; ++ addNonNull(h); ++ firePropertyChange(HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY, old, h); ++ sync(); ++ ++ if (old != null) ++ { ++ BoundedRangeModel model = old.getModel(); ++ if (model != null) ++ model.removeChangeListener(scrollListener); ++ } ++ if (h != null) ++ { ++ BoundedRangeModel model = h.getModel(); ++ if (model != null) ++ model.addChangeListener(scrollListener); ++ } ++ } ++ ++ public void setHorizontalScrollBarPolicy(int h) ++ { ++ if (h != HORIZONTAL_SCROLLBAR_AS_NEEDED ++ && h != HORIZONTAL_SCROLLBAR_NEVER ++ && h != HORIZONTAL_SCROLLBAR_ALWAYS) ++ throw new IllegalArgumentException("unknown horizontal scrollbar policy"); ++ int old = horizontalScrollBarPolicy; ++ horizontalScrollBarPolicy = h; ++ firePropertyChange(HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY, old, h); ++ sync(); ++ } ++ ++ public void setLayout(LayoutManager l) ++ { ++ LayoutManager old = super.getLayout(); ++ ScrollPaneLayout tmp = (ScrollPaneLayout) l; ++ super.setLayout(l); ++ tmp.syncWithScrollPane(this); ++ firePropertyChange(LAYOUT_CHANGED_PROPERTY, old, l); ++ sync(); ++ } ++ ++ public void setRowHeader(JViewport v) ++ { ++ JViewport old = rowHeader; ++ removeNonNull(old); ++ rowHeader = v; ++ addNonNull(v); ++ firePropertyChange(ROW_HEADER_CHANGED_PROPERTY, old, v); ++ sync(); ++ } ++ ++ public void setRowHeaderView(Component c) ++ { ++ if (rowHeader == null) ++ setRowHeader(createViewport()); ++ rowHeader.setView(c); ++ sync(); ++ } ++ ++ public void setVerticalScrollBar(JScrollBar v) ++ { ++ JScrollBar old = verticalScrollBar; ++ removeNonNull(old); ++ verticalScrollBar = v; ++ addNonNull(v); ++ firePropertyChange(VERTICAL_SCROLLBAR_CHANGED_PROPERTY, old, v); ++ sync(); ++ ++ if (old != null) ++ { ++ BoundedRangeModel model = old.getModel(); ++ if (model != null) ++ model.removeChangeListener(scrollListener); ++ } ++ if (v != null) ++ { ++ BoundedRangeModel model = v.getModel(); ++ if (model != null) ++ model.addChangeListener(scrollListener); ++ } ++ } ++ ++ public void setVerticalScrollBarPolicy(int v) ++ { ++ if (v != VERTICAL_SCROLLBAR_AS_NEEDED ++ && v != VERTICAL_SCROLLBAR_NEVER ++ && v != VERTICAL_SCROLLBAR_ALWAYS) ++ throw new IllegalArgumentException("unknown vertical scrollbar policy"); ++ int old = verticalScrollBarPolicy; ++ verticalScrollBarPolicy = v; ++ firePropertyChange(VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY, old, v); ++ sync(); ++ } ++ ++ public void setWheelScrollingEnabled(boolean b) ++ { ++ boolean old = wheelScrollingEnabled; ++ wheelScrollingEnabled = b; ++ firePropertyChange(WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY, old, b); ++ sync(); ++ } ++ ++ public void setViewport(JViewport v) ++ { ++ JViewport old = viewport; ++ removeNonNull(old); ++ if (old != null) ++ old.removeChangeListener(scrollListener); ++ viewport = v; ++ if (v != null) ++ v.addChangeListener(scrollListener); ++ addNonNull(v); ++ revalidate(); ++ repaint(); ++ firePropertyChange(VIEWPORT_CHANGED_PROPERTY, old, v); ++ sync(); ++ } ++ ++ public void setViewportBorder(Border b) ++ { ++ Border old = viewportBorder; ++ viewportBorder = b; ++ firePropertyChange(VIEWPORT_BORDER_CHANGED_PROPERTY, old, b); ++ sync(); ++ } + +- public JScrollPane(Component view) +- { +- this(view, 0, 0); +- } ++ public void setViewportView(Component view) ++ { ++ if (getViewport() == null) ++ { ++ setViewport(createViewport()); ++ } ++ ++ if (view != null) ++ { ++ getViewport().setView(view); ++ } ++ sync(); ++ } ++ ++ public boolean isValidateRoot() ++ { ++ return true; ++ } ++ ++ ChangeListener createScrollListener() ++ { ++ return new ChangeListener() ++ { ++ ++ public void stateChanged(ChangeEvent event) ++ { ++ JScrollBar vsb = JScrollPane.this.getVerticalScrollBar(); ++ JScrollBar hsb = JScrollPane.this.getHorizontalScrollBar(); ++ JViewport vp = JScrollPane.this.getViewport(); ++ ++ if (vp != null && event.getSource() == vp) ++ { ++ // if the viewport changed, we should update the VSB / HSB ++ // models according to the new vertical and horizontal sizes ++ ++ Rectangle vr = vp.getViewRect(); ++ Dimension vs = vp.getViewSize(); ++ if (vsb != null ++ && (vsb.getMinimum() != 0 ++ || vsb.getMaximum() != vs.height ++ || vsb.getValue() != vr.y ++ || vsb.getVisibleAmount() != vr.height)) ++ vsb.setValue(vr.y, vr.height, 0, vs.height); ++ ++ if (hsb != null ++ && (hsb.getMinimum() != 0 ++ || hsb.getMaximum() != vs.width ++ || hsb.getValue() != vr.width ++ || hsb.getVisibleAmount() != vr.height)) ++ hsb.setValue(vr.x, vr.width, 0, vs.width); ++ } ++ else ++ { ++ // otherwise we got a change update from either the VSB or ++ // HSB model, and we need to update the viewport positions of ++ // both the main viewport and any row or column headers to ++ // match. ++ ++ int xpos = 0; ++ int ypos = 0; ++ ++ if (vsb != null) ++ ypos = vsb.getValue(); ++ ++ if (hsb != null) ++ xpos = hsb.getValue(); ++ ++ Point pt = new Point(xpos, ypos); ++ ++ if (vp != null ++ && vp.getViewPosition() != pt) ++ vp.setViewPosition(pt); ++ ++ pt.x = 0; ++ ++ if (rowHeader != null ++ && rowHeader.getViewPosition() != pt) ++ rowHeader.setViewPosition(pt); ++ ++ pt.x = xpos; ++ pt.y = 0; ++ ++ if (columnHeader != null ++ && columnHeader.getViewPosition() != pt) ++ columnHeader.setViewPosition(pt); ++ ++ } ++ } ++ }; ++ } ++ ++ ++ public JScrollPane() ++ { ++ this(null); ++ } + ++ public JScrollPane(Component view) ++ { ++ this(view, ++ VERTICAL_SCROLLBAR_AS_NEEDED, ++ HORIZONTAL_SCROLLBAR_AS_NEEDED); ++ } ++ ++ public JScrollPane(int vsbPolicy, int hsbPolicy) ++ { ++ this(null, vsbPolicy, hsbPolicy); ++ } ++ ++ public JScrollPane(Component view, int vsbPolicy, int hsbPolicy) ++ { ++ scrollListener = createScrollListener(); ++ setVerticalScrollBarPolicy(vsbPolicy); ++ setVerticalScrollBar(createVerticalScrollBar()); ++ setHorizontalScrollBarPolicy(hsbPolicy); ++ setHorizontalScrollBar(createHorizontalScrollBar()); ++ setViewportView(view); ++ setLayout(new ScrollPaneLayout()); ++ setOpaque(false); ++ updateUI(); ++ } ++ ++ ++ public JScrollBar createHorizontalScrollBar() ++ { ++ return new ScrollBar(SwingConstants.HORIZONTAL); ++ } ++ ++ public JScrollBar createVerticalScrollBar() ++ { ++ return new ScrollBar(SwingConstants.VERTICAL); ++ } + +- public JScrollPane(int vsbPolicy, int hsbPolicy) ++ public JViewport createViewport() ++ { ++ return new JViewport(); ++ } ++ ++ ++ public String getUIClassID() ++ { ++ return "ScrollPaneUI"; ++ } ++ ++ public void updateUI() ++ { ++ ScrollPaneUI b = (ScrollPaneUI)UIManager.getUI(this); ++ setUI(b); ++ } ++ ++ ++ class ScrollBar ++ extends JScrollBar ++ implements UIResource ++ { ++ public ScrollBar(int orientation) + { +- this(null, 0, 0); ++ super(orientation); + } + +- public JScrollPane(Component view, int vsbPolicy, int hsbPolicy) ++ public int getBlockIncrement(int direction) + { +- setViewportView(view); +- setOpaque(true); +- updateUI(); ++ Component view = JScrollPane.this.getViewport().getView(); ++ if (view == null || (! (view instanceof Scrollable))) ++ return super.getBlockIncrement(direction); ++ else ++ { ++ Scrollable s = (Scrollable) view; ++ return s.getScrollableBlockIncrement(JScrollPane.this.getViewport().getViewRect(), ++ this.getOrientation(), ++ direction); ++ } + } + +- public String getUIClassID() ++ public int getUnitIncrement(int direction) + { +- //Returns a string that specifies the name of the L&F class that renders this component. +- return "JScrollPane"; ++ Component view = JScrollPane.this.getViewport().getView(); ++ if (view == null || (! (view instanceof Scrollable))) ++ return super.getUnitIncrement(direction); ++ else ++ { ++ Scrollable s = (Scrollable) view; ++ return s.getScrollableUnitIncrement(JScrollPane.this.getViewport().getViewRect(), ++ this.getOrientation(), ++ direction); ++ } + } + +- public JViewport getViewport() +- { +- return viewport; +- } + +- public JViewport createViewport() +- { +- return new JViewport(); +- } +- +- public void setViewport(JViewport v) +- { +- if (viewport != null) +- remove(viewport); +- +- viewport = v; +- +- add(v); +- +- revalidate(); +- repaint(); +- } +- +- public void updateUI() +- { +- ScrollPaneUI b = (ScrollPaneUI)UIManager.getUI(this); +- setUI(b); +- } +- +- +- public void setViewportView(Component view) +- { +- if (getViewport() == null) +- { +- setViewport(createViewport()); +- } +- +- if (view != null) +- { +- getViewport().setView(view); +- } +- } ++ } ++ + } +Index: javax/swing/JSeparator.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JSeparator.java,v +retrieving revision 1.3 +diff -u -r1.3 JSeparator.java +--- javax/swing/JSeparator.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/JSeparator.java 6 Sep 2004 16:35:58 -0000 +@@ -37,190 +37,172 @@ + + package javax.swing; + +-import java.io.IOException; +-import java.io.ObjectOutputStream; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + import javax.swing.plaf.SeparatorUI; + ++ + /** +- * JSeparator +- * @author Andrew Selkirk +- * @version 1.0 ++ * The JSeparator. It is mostly used to divide/space out ++ * components. + */ +-public class JSeparator extends JComponent +- implements SwingConstants, Accessible ++public class JSeparator extends JComponent implements SwingConstants, ++ Accessible + { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJSeparator +- */ +- protected class AccessibleJSeparator extends AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJSeparator +- * @param component TODO +- */ +- protected AccessibleJSeparator(JSeparator component) { +- super(component); +- // TODO +- } // AccessibleJSeparator() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.SEPARATOR; +- } // getAccessibleRole() +- +- +- } // AccessibleJSeparator +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "SeparatorUI"; +- +- /** +- * orientation +- */ +- private int orientation; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JSeparator +- */ +- public JSeparator() { +- this(HORIZONTAL); +- } // JSeparator() +- +- /** +- * Constructor JSeparator +- * @param value0 TODO +- */ +- public JSeparator(int orientation) { +- this.orientation = orientation; +- // TODO +- } // JSeparator() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getUI +- * @returns SeparatorUI +- */ +- public SeparatorUI getUI() { +- return (SeparatorUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(SeparatorUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((SeparatorUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * getOrientation +- * @returns int +- */ +- public int getOrientation() { +- return orientation; +- } // getOrientation() +- +- /** +- * setOrientation +- * @param orientation TODO +- */ +- public void setOrientation(int orientation) { +- this.orientation = orientation; +- // TODO +- } // setOrientation() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * isFocusTraversable +- * @returns boolean +- */ +- public boolean isFocusTraversable() { +- return false; +- } // isFocusTraversable() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJSeparator(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JSeparator ++ /** ++ * AccessibleJSeparator ++ */ ++ protected class AccessibleJSeparator extends AccessibleJComponent ++ { ++ private static final long serialVersionUID = 916332890553201095L; ++ ++ /** ++ * Constructor AccessibleJSeparator ++ * ++ * @param component TODO ++ */ ++ protected AccessibleJSeparator() ++ { ++ } ++ ++ /** ++ * getAccessibleRole ++ * ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.SEPARATOR; ++ } ++ } ++ ++ private static final long serialVersionUID = 125301223445282357L; ++ ++ /** The orientation of the JSeparator. */ ++ private transient int orientation = HORIZONTAL; ++ ++ /** ++ * Creates a new horizontal JSeparator object. ++ */ ++ public JSeparator() ++ { ++ this(HORIZONTAL); ++ } ++ ++ /** ++ * Creates a new JSeparator object with the given orientation. ++ * ++ * @param orientation The orientation of the JSeparator. ++ */ ++ public JSeparator(int orientation) ++ { ++ if (orientation != HORIZONTAL && orientation != VERTICAL) ++ throw new IllegalArgumentException(orientation ++ + " is not a valid orientation."); ++ this.orientation = orientation; ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the UI delegate being ++ * used with the JSeparator. ++ * ++ * @return SeparatorUI The JSeparator's UI delegate. ++ */ ++ public SeparatorUI getUI() ++ { ++ return (SeparatorUI) ui; ++ } ++ ++ /** ++ * This method sets the UI delegate to use ++ * with the JSeparator. ++ * ++ * @param ui The UI delegate to use. ++ */ ++ public void setUI(SeparatorUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method resets the UI delegate to the ++ * default for the current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((SeparatorUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns the identifier string ++ * that is used to determine the UI delegate ++ * from the current look and feel. ++ * ++ * @return String The identifier string for the UI. ++ */ ++ public String getUIClassID() ++ { ++ return "SeparatorUI"; ++ } ++ ++ /** ++ * This method returns the JSeparator's orientation. ++ * ++ * @return int The JSeparator's orientation. ++ */ ++ public int getOrientation() ++ { ++ return orientation; ++ } ++ ++ /** ++ * This method changes the JSeparator's orientation. ++ * ++ * @param orientation The JSeparator's orientation. ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != HORIZONTAL && orientation != VERTICAL) ++ throw new IllegalArgumentException(orientation ++ + " is not a valid orientation."); ++ this.orientation = orientation; ++ } ++ ++ /** ++ * This method returns a string desribing the JSeparator. ++ * Normally only used in debugging. ++ * ++ * @return String A string describing the JSeparator. ++ */ ++ protected String paramString() ++ { ++ return "JSeparator"; ++ } ++ ++ /** ++ * This method overrides the isFocusTraversable method from ++ * Component to false. JSeparator cannot be focused on. ++ * ++ * @return boolean False. ++ */ ++ public boolean isFocusTraversable() ++ { ++ return false; ++ } ++ ++ /** ++ * getAccessibleContext ++ * ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJSeparator(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JSlider.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JSlider.java,v +retrieving revision 1.3 +diff -u -r1.3 JSlider.java +--- javax/swing/JSlider.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/JSlider.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ + /* JSlider.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,14 +35,16 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + +-import java.io.IOException; +-import java.io.ObjectOutputStream; ++import java.awt.Dimension; ++import java.awt.MenuContainer; ++import java.awt.image.ImageObserver; + import java.io.Serializable; + import java.util.Dictionary; ++import java.util.Enumeration; + import java.util.Hashtable; ++ + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; +@@ -52,650 +54,888 @@ + import javax.swing.event.ChangeListener; + import javax.swing.plaf.SliderUI; + ++ + /** +- * JSlider +- * @author Andrew Selkirk +- * @version 1.0 ++ *

    ++ * The JSlider is a Swing component that allows selection of a value within a ++ * range by adjusting a thumb in a track. The values for the minimum, ++ * maximum, extent and value are stored in a {@link ++ * DefaultBoundedRangeModel}. ++ *

    ++ * ++ *

    ++ * JSliders have the following properties: ++ *

    ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ * ++ *
    Property Stored in Bound?
    extent model no
    inverted slider yes
    labelTable slider yes
    majorTickSpacing slider yes
    maximum model no
    minimum model no
    minorTickSpacing slider yes
    model slider yes
    orientation slider yes
    paintLabels slider yes
    paintTicks slider yes
    snapToTicks slider no
    value model no
    valueIsAdjusting model no
    ++ * ++ *

    ++ * The various behavioral aspects of these properties follows: ++ *

    ++ * ++ *
      ++ *
    • ++ * When non-bound properties stored in the slider change, the slider fires ++ * ChangeEvents to its ChangeListeners. ++ *
    • ++ *
    • ++ * When bound properties stored in the slider change, the slider fires ++ * PropertyChangeEvents to its PropertyChangeListeners ++ *
    • ++ *
    • ++ * If any of the model's properties change, it fires a ChangeEvent to its ++ * ChangeListeners, which include the slider. ++ *
    • ++ *
    • ++ * If the slider receives a ChangeEvent from its model, it will propagate the ++ * ChangeEvent to its ChangeListeners, with the ChangeEvent's "source" ++ * property set to refer to the slider, rather than the model. ++ *
    • ++ *
    + */ +-public class JSlider +- extends JComponent +- implements SwingConstants, Accessible ++public class JSlider extends JComponent implements SwingConstants, Accessible, ++ ImageObserver, ++ MenuContainer, Serializable + { ++ /** DOCUMENT ME! */ + static final long serialVersionUID = -1441275936141218479L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- +- /** +- * AccessibleJSlider +- */ +- protected class AccessibleJSlider extends JComponent.AccessibleJComponent implements AccessibleValue { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJSlider +- * @param value0 TODO +- */ +- protected AccessibleJSlider(JSlider value0) { +- super(value0); +- // TODO +- } // AccessibleJSlider() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return null; // TODO +- } // getAccessibleRole() +- +- /** +- * getAccessibleValue +- * @returns AccessibleValue +- */ +- public AccessibleValue getAccessibleValue() { +- return null; // TODO +- } // getAccessibleValue() +- +- /** +- * getCurrentAccessibleValue +- * @returns Number +- */ +- public Number getCurrentAccessibleValue() { +- return null; // TODO +- } // getCurrentAccessibleValue() +- +- /** +- * setCurrentAccessibleValue +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean setCurrentAccessibleValue(Number value0) { +- return false; // TODO +- } // setCurrentAccessibleValue() +- +- /** +- * getMinimumAccessibleValue +- * @returns Number +- */ +- public Number getMinimumAccessibleValue() { +- return null; // TODO +- } // getMinimumAccessibleValue() +- +- /** +- * getMaximumAccessibleValue +- * @returns Number +- */ +- public Number getMaximumAccessibleValue() { +- return null; // TODO +- } // getMaximumAccessibleValue() +- +- +- } // AccessibleJSlider +- +- /** +- * ModelListener +- */ +- private class ModelListener implements ChangeListener, Serializable { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ModelListener +- * @param value0 TODO +- */ +- private ModelListener(JSlider value0) { +- // TODO +- } // ModelListener() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * stateChanged +- * @param value0 TODO +- */ +- public void stateChanged(ChangeEvent value0) { +- // TODO +- } // stateChanged() +- +- +- } // ModelListener +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "SliderUI"; +- +- /** +- * paintTicks +- */ +- private boolean paintTicks; +- +- /** +- * paintTrack +- */ +- private boolean paintTrack; +- +- /** +- * paintLabels +- */ +- private boolean paintLabels; +- +- /** +- * isInverted +- */ +- private boolean isInverted; +- +- /** +- * sliderModel +- */ +- protected BoundedRangeModel sliderModel; +- +- /** +- * majorTickSpacing +- */ +- protected int majorTickSpacing; +- +- /** +- * minorTickSpacing +- */ +- protected int minorTickSpacing; +- +- /** +- * snapToTicks +- */ +- protected boolean snapToTicks; +- +- /** +- * snapToValue +- */ +- boolean snapToValue; +- +- /** +- * orientation +- */ +- protected int orientation; +- +- /** +- * labelTable +- */ +- private Dictionary labelTable; +- +- /** +- * changeListener +- */ +- protected ChangeListener changeListener; +- +- /** +- * changeEvent +- */ +- protected transient ChangeEvent changeEvent; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JSlider +- */ +- public JSlider() { +- // TODO +- } // JSlider() +- +- /** +- * Constructor JSlider +- * @param value0 TODO +- */ +- public JSlider(int orientation) { +- // TODO +- } // JSlider() +- +- /** +- * Constructor JSlider +- * @param minimum TODO +- * @param maximum TODO +- */ +- public JSlider(int minimum, int maximum) { +- // TODO +- } // JSlider() +- +- /** +- * Constructor JSlider +- * @param minimum TODO +- * @param maximum TODO +- * @param value TODO +- */ +- public JSlider(int minimum, int maximum, int value) { +- // TODO +- } // JSlider() +- +- /** +- * Constructor JSlider +- * @param orientation TODO +- * @param minimum TODO +- * @param maximum TODO +- * @param value TODO +- */ +- public JSlider(int orientation, int minimum, int maximum, int value) { +- // TODO +- } // JSlider() +- +- /** +- * Constructor JSlider +- * @param value0 TODO +- */ +- public JSlider(BoundedRangeModel model) { +- // TODO +- } // JSlider() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * getValue +- * @returns int +- */ +- public int getValue() { +- return 0; // TODO +- } // getValue() +- +- /** +- * setValue +- * @param value0 TODO +- */ +- public void setValue(int value) { +- // TODO +- } // setValue() +- +- /** +- * getUI +- * @returns SliderUI +- */ +- public SliderUI getUI() { +- return (SliderUI) ui; +- } // getUI() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(SliderUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((SliderUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * createChangeListener +- * @returns ChangeListener +- */ +- protected ChangeListener createChangeListener() { +- return null; // TODO +- } // createChangeListener() +- +- /** +- * addChangeListener +- * @param listener TODO +- */ +- public void addChangeListener(ChangeListener listener) { +- // TODO +- } // addChangeListener() +- +- /** +- * removeChangeListener +- * @param listener TODO +- */ +- public void removeChangeListener(ChangeListener listener) { +- // TODO +- } // removeChangeListener() +- +- /** +- * fireStateChanged +- */ +- protected void fireStateChanged() { +- // TODO +- } // fireStateChanged() +- +- /** +- * getModel +- * @returns BoundedRangeModel +- */ +- public BoundedRangeModel getModel() { +- return null; // TODO +- } // getModel() +- +- /** +- * setModel +- * @param model TODO +- */ +- public void setModel(BoundedRangeModel model) { +- // TODO +- } // setModel() +- +- /** +- * getMinimum +- * @returns int +- */ +- public int getMinimum() { +- return 0; // TODO +- } // getMinimum() +- +- /** +- * setMinimum +- * @param minimum TODO +- */ +- public void setMinimum(int minimum) { +- // TODO +- } // setMinimum() +- +- /** +- * getMaximum +- * @returns int +- */ +- public int getMaximum() { +- return 0; // TODO +- } // getMaximum() +- +- /** +- * setMaximum +- * @param maximum TODO +- */ +- public void setMaximum(int maximum) { +- // TODO +- } // setMaximum() +- +- /** +- * getValueIsAdjusting +- * @returns boolean +- */ +- public boolean getValueIsAdjusting() { +- return false; // TODO +- } // getValueIsAdjusting() +- +- /** +- * setValueIsAdjusting +- * @param adjusting TODO +- */ +- public void setValueIsAdjusting(boolean adjusting) { +- // TODO +- } // setValueIsAdjusting() +- +- /** +- * getExtent +- * @returns int +- */ +- public int getExtent() { +- return 0; // TODO +- } // getExtent() +- +- /** +- * setExtent +- * @param vextent TODO +- */ +- public void setExtent(int extent) { +- // TODO +- } // setExtent() +- +- /** +- * getOrientation +- * @returns int +- */ +- public int getOrientation() { +- return 0; // TODO +- } // getOrientation() +- +- /** +- * setOrientation +- * @param orientation TODO +- */ +- public void setOrientation(int orientation) { +- // TODO +- } // setOrientation() +- +- /** +- * getLabelTable +- * @returns Dictionary +- */ +- public Dictionary getLabelTable() { +- return null; // TODO +- } // getLabelTable() +- +- /** +- * setLabelTable +- * @param table TODO +- */ +- public void setLabelTable(Dictionary table) { +- // TODO +- } // setLabelTable() +- +- /** +- * updateLabelUIs +- */ +- protected void updateLabelUIs() { +- // TODO +- } // updateLabelUIs() +- +- /** +- * createStandardLabels +- * @param increment TODO +- * @returns Hashtable +- */ +- public Hashtable createStandardLabels(int increment) { +- return null; // TODO +- } // createStandardLabels() +- +- /** +- * createStandardLabels +- * @param increment TODO +- * @param start TODO +- * @returns Hashtable +- */ +- public Hashtable createStandardLabels(int increment, int start) { +- return null; // TODO +- } // createStandardLabels() +- +- /** +- * getInverted +- * @returns boolean +- */ +- public boolean getInverted() { +- return false; // TODO +- } // getInverted() +- +- /** +- * setInverted +- * @param inverted TODO +- */ +- public void setInverted(boolean inverted) { +- // TODO +- } // setInverted() +- +- /** +- * getMajorTickSpacing +- * @returns int +- */ +- public int getMajorTickSpacing() { +- return 0; // TODO +- } // getMajorTickSpacing() +- +- /** +- * setMajorTickSpacing +- * @param spacing TODO +- */ +- public void setMajorTickSpacing(int spacing) { +- // TODO +- } // setMajorTickSpacing() +- +- /** +- * getMinorTickSpacing +- * @returns int +- */ +- public int getMinorTickSpacing() { +- return 0; // TODO +- } // getMinorTickSpacing() +- +- /** +- * setMinorTickSpacing +- * @param spacing TODO +- */ +- public void setMinorTickSpacing(int spacing) { +- // TODO +- } // setMinorTickSpacing() +- +- /** +- * getSnapToTicks +- * @returns boolean +- */ +- public boolean getSnapToTicks() { +- return false; // TODO +- } // getSnapToTicks() +- +- /** +- * getSnapToValue +- * @returns boolean +- */ +- boolean getSnapToValue() { +- return false; // TODO +- } // getSnapToValue() +- +- /** +- * setSnapToTicks +- * @param snap TODO +- */ +- public void setSnapToTicks(boolean snap) { +- // TODO +- } // setSnapToTicks() +- +- /** +- * getPaintTicks +- * @returns boolean +- */ +- public boolean getPaintTicks() { +- return false; // TODO +- } // getPaintTicks() +- +- /** +- * setPaintTicks +- * @param paint TODO +- */ +- public void setPaintTicks(boolean paint) { +- // TODO +- } // setPaintTicks() +- +- /** +- * getPaintTrack +- * @returns boolean +- */ +- public boolean getPaintTrack() { +- return false; // TODO +- } // getPaintTrack() +- +- /** +- * setPaintTrack +- * @param paint TODO +- */ +- public void setPaintTrack(boolean paint) { +- // TODO +- } // setPaintTrack() +- +- /** +- * getPaintLabels +- * @returns boolean +- */ +- public boolean getPaintLabels() { +- return false; // TODO +- } // getPaintLabels() +- +- /** +- * setPaintLabels +- * @param paint TODO +- */ +- public void setPaintLabels(boolean paint) { +- // TODO +- } // setPaintLabels() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJSlider(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JSlider ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJSlider extends JComponent.AccessibleJComponent ++ implements AccessibleValue ++ { ++ private static final long serialVersionUID = -6301740148041106789L; ++ ++ /** ++ * Creates a new AccessibleJSlider object. ++ * ++ * @param value0 DOCUMENT ME! ++ */ ++ protected AccessibleJSlider() ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * setCurrentAccessibleValue ++ * ++ * @param value0 TODO ++ * ++ * @return boolean ++ */ ++ public boolean setCurrentAccessibleValue(Number value0) ++ { ++ return false; ++ } ++ ++ /** ++ * getMinimumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * getMaximumAccessibleValue ++ * ++ * @return Number ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ } ++ ++ /** Fired in a PropertyChangeEvent when the "inverted" property changes. */ ++ public static final String INVERTED_CHANGED_PROPERTY = "inverted"; ++ ++ /** Fired in a PropertyChangeEvent when the "labelTable" property changes. */ ++ public static final String LABEL_TABLE_CHANGED_PROPERTY = "labelTable"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "majorTickSpacing" property ++ * changes. ++ */ ++ public static final String MAJOR_TICK_SPACING_CHANGED_PROPERTY = "majorTickSpacing"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "minorTickSpacing" property ++ * changes. ++ */ ++ public static final String MINOR_TICK_SPACING_CHANGED_PROPERTY = "minorTickSpacing"; ++ ++ /** Fired in a PropertyChangeEvent when the "model" property changes. */ ++ public static final String MODEL_CHANGED_PROPERTY = "model"; ++ ++ /** Fired in a PropertyChangeEvent when the "orientation" property changes. */ ++ public static final String ORIENTATION_CHANGED_PROPERTY = "orientation"; ++ ++ /** Fired in a PropertyChangeEvent when the "paintLabels" property changes. */ ++ public static final String PAINT_LABELS_CHANGED_PROPERTY = "paintLabels"; ++ ++ /** Fired in a PropertyChangeEvent when the "paintTicks" property changes. */ ++ public static final String PAINT_TICKS_CHANGED_PROPERTY = "paintTicks"; ++ ++ /** Whether or not this slider paints its ticks. */ ++ private transient boolean paintTicks = false; ++ ++ /** Whether or not this slider paints its track. */ ++ private transient boolean paintTrack = true; ++ ++ /** Whether or not this slider paints its labels. */ ++ private transient boolean paintLabels = false; ++ ++ /** ++ * A dictionary of (Integer, Component) pairs where each Component is a ++ * JLabel and the Integer determines where the label will be painted. ++ */ ++ private transient Dictionary labelTable; ++ ++ /** The model used to describe the slider. */ ++ protected BoundedRangeModel sliderModel; ++ ++ /** The space between major ticks. */ ++ protected int majorTickSpacing; ++ ++ /** The space between minor ticks. */ ++ protected int minorTickSpacing; ++ ++ /** Whether the slider snaps its values to ticks. */ ++ protected boolean snapToTicks = true; ++ ++ /** The orientation of the slider. */ ++ protected int orientation = HORIZONTAL; ++ ++ /** Whether the slider is inverted. */ ++ private transient boolean isInverted; ++ ++ /** The ChangeListener that listens to the model. */ ++ protected ChangeListener changeListener; ++ ++ /** The ChangeEvent that is passed to all listeners of this slider. */ ++ protected transient ChangeEvent changeEvent; ++ ++ /** ++ * Creates a new horizontal JSlider object with a minimum of 0, a maximum of ++ * 100, and a value of 50. ++ */ ++ public JSlider() ++ { ++ this(HORIZONTAL, 0, 100, 50); ++ } ++ ++ /** ++ * Creates a new JSlider object with the given orientation and a minimum of ++ * 0, a maximum of 100, and a value of 50. ++ * ++ * @param orientation The orientation of the slider. ++ */ ++ public JSlider(int orientation) ++ { ++ this(orientation, 0, 100, 50); ++ } ++ ++ /** ++ * Creates a new horizontal JSlider object with the given maximum and ++ * minimum and a value that is halfway between the minimum and the ++ * maximum. ++ * ++ * @param minimum The minimum value of the JSlider. ++ * @param maximum The maximum value of the JSlider. ++ */ ++ public JSlider(int minimum, int maximum) ++ { ++ this(HORIZONTAL, minimum, maximum, (maximum + minimum) / 2); ++ } ++ ++ /** ++ * Creates a new horizontal JSlider object with the given minimum, maximum, ++ * and value. ++ * ++ * @param minimum The minimum value of the JSlider. ++ * @param maximum The maximum value of the JSlider. ++ * @param value The initial value of the JSlider. ++ */ ++ public JSlider(int minimum, int maximum, int value) ++ { ++ this(HORIZONTAL, minimum, maximum, value); ++ } ++ ++ /** ++ * Creates a new JSlider object with the given orientation, minimum, ++ * maximum, and value. ++ * ++ * @param orientation The orientation of the JSlider. ++ * @param minimum The minimum value of the JSlider. ++ * @param maximum The maximum value of the JSlider. ++ * @param value The initial value of the JSlider. ++ */ ++ public JSlider(int orientation, int minimum, int maximum, int value) ++ { ++ sliderModel = new DefaultBoundedRangeModel(value, 0, minimum, maximum); ++ if (orientation != HORIZONTAL && orientation != VERTICAL) ++ throw new IllegalArgumentException(orientation + " is not a legal orientation"); ++ this.orientation = orientation; ++ changeListener = createChangeListener(); ++ sliderModel.addChangeListener(changeListener); ++ updateUI(); ++ } ++ ++ /** ++ * Creates a new horizontal JSlider object with the given model. ++ * ++ * @param model The model the slider will be created with. ++ */ ++ public JSlider(BoundedRangeModel model) ++ { ++ if (model == null) ++ sliderModel = new DefaultBoundedRangeModel(50, 0, 0, 100); ++ else ++ sliderModel = model; ++ changeListener = createChangeListener(); ++ sliderModel.addChangeListener(changeListener); ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the current value of the slider. ++ * ++ * @return The value of the slider stored in the model. ++ */ ++ public int getValue() ++ { ++ return sliderModel.getValue(); ++ } ++ ++ /** ++ * This method sets the value of the slider. ++ * ++ * @param value The slider's new value. ++ */ ++ public void setValue(int value) ++ { ++ sliderModel.setValue(value); ++ } ++ ++ /** ++ * This method returns the slider's UI delegate. ++ * ++ * @return The slider's UI delegate. ++ */ ++ public SliderUI getUI() ++ { ++ return (SliderUI) ui; ++ } ++ ++ /** ++ * This method sets the slider's UI delegate. ++ * ++ * @param ui A SliderUI object to use with this slider. ++ */ ++ public void setUI(SliderUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method sets this slider's UI to the UIManager's default for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((SliderUI) UIManager.getUI(this)); ++ invalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for the slider. ++ * ++ * @return The Look and Feel classID. "SliderUI" ++ */ ++ public String getUIClassID() ++ { ++ return "SliderUI"; ++ } ++ ++ /** ++ * Creates a ChangeListener for this Slider. ++ * ++ * @return A new ChangeListener. ++ */ ++ protected ChangeListener createChangeListener() ++ { ++ return new ChangeListener() ++ { ++ public void stateChanged(ChangeEvent ce) ++ { ++ // No need to trigger a repaint since the UI listens to the model ++ // as well. All we need to do is pass on the stateChanged event ++ // to our listeners. ++ fireStateChanged(); ++ } ++ }; ++ } ++ ++ /** ++ * This method registers a listener to this slider. The listener will be ++ * informed of new ChangeEvents. ++ * ++ * @param listener The listener to register. ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method removes a listener from this slider. ++ * ++ * @param listener The listener to remove. ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method is called whenever the model fires a ChangeEvent. It should ++ * propagate the ChangeEvent to its listeners with a new ChangeEvent that ++ * identifies the slider as the source. ++ */ ++ protected void fireStateChanged() ++ { ++ Object[] changeListeners = listenerList.getListenerList(); ++ if (changeEvent == null) ++ changeEvent = new ChangeEvent(this); ++ for (int i = changeListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (changeListeners[i] == ChangeListener.class) ++ ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent); ++ } ++ } ++ ++ /** ++ * This method returns an array of all ChangeListeners listening to this ++ * slider. ++ * ++ * @return An array of ChangeListeners listening to this slider. ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * This method returns the model of the slider. ++ * ++ * @return The slider's model. ++ */ ++ public BoundedRangeModel getModel() ++ { ++ return sliderModel; ++ } ++ ++ /** ++ * This method changes the "model" property. It also needs to unregister ++ * any listeners to the old model and register any listeners to the new ++ * model. ++ * ++ * @param model The model to use with the slider. ++ */ ++ public void setModel(BoundedRangeModel model) ++ { ++ // I didn't do the null pointer check on purpose. ++ // If you try it with Sun's, it'll go ahead and set it to null ++ // and bork the next time it tries to access the model. ++ if (model != sliderModel) ++ { ++ BoundedRangeModel oldModel = sliderModel; ++ sliderModel = model; ++ oldModel.removeChangeListener(changeListener); ++ sliderModel.addChangeListener(changeListener); ++ firePropertyChange(MODEL_CHANGED_PROPERTY, oldModel, sliderModel); ++ } ++ } ++ ++ /** ++ * This method returns the minimum value of the slider. ++ * ++ * @return The minimum value of the slider. ++ */ ++ public int getMinimum() ++ { ++ return sliderModel.getMinimum(); ++ } ++ ++ /** ++ * This method sets the minimum value of the slider. ++ * ++ * @param minimum The minimum value of the slider. ++ */ ++ public void setMinimum(int minimum) ++ { ++ sliderModel.setMinimum(minimum); ++ } ++ ++ /** ++ * This method returns the maximum value of the slider. ++ * ++ * @return The maximum value of the slider. ++ */ ++ public int getMaximum() ++ { ++ return sliderModel.getMaximum(); ++ } ++ ++ /** ++ * This method sets the maximum value of the slider. ++ * ++ * @param maximum The maximum value of the slider. ++ */ ++ public void setMaximum(int maximum) ++ { ++ sliderModel.setMaximum(maximum); ++ } ++ ++ /** ++ * This method returns this slider's isAdjusting value which is true if the ++ * thumb is being dragged. ++ * ++ * @return The slider's isAdjusting value. ++ */ ++ public boolean getValueIsAdjusting() ++ { ++ return sliderModel.getValueIsAdjusting(); ++ } ++ ++ /** ++ * This method sets the isAdjusting value for the slider. ++ * ++ * @param adjusting The slider's isAdjusting value. ++ */ ++ public void setValueIsAdjusting(boolean adjusting) ++ { ++ sliderModel.setValueIsAdjusting(adjusting); ++ } ++ ++ /** ++ * This method returns the extent value for this slider. ++ * ++ * @return The extent value for this slider. ++ */ ++ public int getExtent() ++ { ++ return sliderModel.getExtent(); ++ } ++ ++ /** ++ * This method sets the extent value for this slider. ++ * ++ * @param extent The extent value for this slider. ++ */ ++ public void setExtent(int extent) ++ { ++ sliderModel.setExtent(extent); ++ } ++ ++ /** ++ * This method returns the slider orientation. ++ * ++ * @return The orientation of the slider. ++ */ ++ public int getOrientation() ++ { ++ return orientation; ++ } ++ ++ /** ++ * This method changes the "orientation" property of this slider. If the ++ * orientation is not VERTICAL or HORIZONTAL, this method does nothing. ++ * ++ * @param orientation The orientation of this slider. ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != VERTICAL && orientation != HORIZONTAL) ++ throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL"); ++ if (orientation != this.orientation) ++ { ++ int oldOrientation = this.orientation; ++ this.orientation = orientation; ++ firePropertyChange(ORIENTATION_CHANGED_PROPERTY, oldOrientation, ++ this.orientation); ++ } ++ } ++ ++ /** ++ * This method returns the label table for this slider. ++ * ++ * @return The label table for this slider. ++ */ ++ public Dictionary getLabelTable() ++ { ++ return labelTable; ++ } ++ ++ /** ++ * This method changes the "labelTable" property of this slider. ++ * ++ * @param table The label table for this slider. ++ */ ++ public void setLabelTable(Dictionary table) ++ { ++ if (table != labelTable) ++ { ++ Dictionary oldTable = labelTable; ++ labelTable = table; ++ firePropertyChange(LABEL_TABLE_CHANGED_PROPERTY, oldTable, labelTable); ++ } ++ } ++ ++ /** ++ * This method is called to reset UI delegates for the labels in the ++ * labelTable to a default for the current look and feel. ++ */ ++ protected void updateLabelUIs() ++ { ++ if (labelTable == null) ++ return; ++ for (Enumeration list = labelTable.elements(); list.hasMoreElements();) ++ { ++ JLabel label = (JLabel) list.nextElement(); ++ label.updateUI(); ++ } ++ } ++ ++ /** ++ * Creates a hashtable of (Integer, JLabel) pairs that can be used as a ++ * label table for this slider. The labels will start from the sliders ++ * minimum and increase by the increment. Each label will have a text ++ * string indicating their integer value. ++ * ++ * @param increment The increment to between labels. ++ * ++ * @return A hashtable with the labels and their keys. ++ */ ++ public Hashtable createStandardLabels(int increment) ++ { ++ return createStandardLabels(increment, sliderModel.getMinimum()); ++ } ++ ++ /** ++ * Creates a hashtable of (Integer, JLabel) pairs that can be used as a ++ * label table for this slider. The labels will start from the given start ++ * value and increase by the increment. Each label will have a text string ++ * indicating their integer value. ++ * ++ * @param increment The increment to between labels. ++ * @param start The value to start from. ++ * ++ * @return A hashtable with the labels and their keys. ++ */ ++ public Hashtable createStandardLabels(int increment, int start) ++ { ++ Hashtable table = new Hashtable(); ++ JLabel label; ++ Dimension dim; ++ ++ int max = sliderModel.getMaximum(); ++ ++ for (int i = start; i <= max; i += increment) ++ { ++ label = new JLabel(String.valueOf(i)); ++ label.setVerticalAlignment(CENTER); ++ label.setHorizontalAlignment(CENTER); ++ ++ // Make sure these labels have the width and height ++ // they want. ++ dim = label.getPreferredSize(); ++ label.setBounds(label.getX(), label.getY(), ++ (int) dim.getWidth(), ++ (int) dim.getHeight()); ++ table.put(new Integer(i), label); ++ } ++ return table; ++ } ++ ++ /** ++ * This method returns whether the slider is inverted. Horizontal sliders ++ * that are not inverted will have the minimums on the left. If they are ++ * inverted, the minimums will be on the right. Vertical sliders that are ++ * not inverted will have the minimums at the bottom. If they are inverted, ++ * the minimums will be at the top. ++ * ++ * @return Whether this slider is inverted. ++ */ ++ public boolean getInverted() ++ { ++ return isInverted; ++ } ++ ++ /** ++ * This method changes the "inverted" property for this slider.Horizontal ++ * sliders that are not inverted will have the minimums on the left. If ++ * they are inverted, the minimums will be on the right. Vertical sliders ++ * that are not inverted will have the minimums at the bottom. If they are ++ * inverted, the minimums will be at the top. However, if the slider's ++ * componentOrientation is set to RIGHT_TO_LEFT, then everything gets ++ * reversed again. ++ * ++ * @param inverted Whether the slider should be inverted. ++ */ ++ public void setInverted(boolean inverted) ++ { ++ if (isInverted != inverted) ++ { ++ boolean oldInverted = isInverted; ++ isInverted = inverted; ++ firePropertyChange(INVERTED_CHANGED_PROPERTY, oldInverted, isInverted); ++ } ++ } ++ ++ /** ++ * This method returns the amount of units between each major tick mark. ++ * ++ * @return The amount of units between each major tick mark. ++ */ ++ public int getMajorTickSpacing() ++ { ++ return majorTickSpacing; ++ } ++ ++ /** ++ * This method changes the "majorTickSpacing" property for this slider. The ++ * major tick spacing is the amount of units between each major tick mark. ++ * ++ * @param spacing The amount of units between each major tick mark. ++ */ ++ public void setMajorTickSpacing(int spacing) ++ { ++ if (majorTickSpacing != spacing) ++ { ++ int oldSpacing = majorTickSpacing; ++ majorTickSpacing = spacing; ++ firePropertyChange(MAJOR_TICK_SPACING_CHANGED_PROPERTY, oldSpacing, ++ majorTickSpacing); ++ } ++ } ++ ++ /** ++ * This method returns the amount of units between each minor tick mark. ++ * ++ * @return The amount of units between each minor tick mark. ++ */ ++ public int getMinorTickSpacing() ++ { ++ return minorTickSpacing; ++ } ++ ++ /** ++ * This method changes the "minorTickSpacing" property for this slider. The ++ * minor tick spacing is the amount of units between each minor tick mark. ++ * ++ * @param spacing The amount of units between each minor tick mark. ++ */ ++ public void setMinorTickSpacing(int spacing) ++ { ++ if (minorTickSpacing != spacing) ++ { ++ int oldSpacing = minorTickSpacing; ++ minorTickSpacing = spacing; ++ firePropertyChange(MINOR_TICK_SPACING_CHANGED_PROPERTY, oldSpacing, ++ minorTickSpacing); ++ } ++ } ++ ++ /** ++ * This method returns whether this slider is snapping to ticks. Sliders ++ * that snap to ticks will automatically move the thumb to the nearest tick ++ * mark. ++ * ++ * @return Whether this slider snaps to ticks. ++ */ ++ public boolean getSnapToTicks() ++ { ++ return snapToTicks; ++ } ++ ++ /** ++ * This method sets whether this slider will snap to ticks. Sliders that ++ * snap to ticks will automatically move the thumb to the nearest tick ++ * mark. ++ * ++ * @param snap Whether this slider snaps to ticks. ++ */ ++ public void setSnapToTicks(boolean snap) ++ { ++ if (snap != snapToTicks) ++ { ++ snapToTicks = snap; ++ fireStateChanged(); ++ } ++ } ++ ++ /** ++ * This method returns whether the slider will paint its tick marks. In ++ * addition to setting this property to true, one of minor tick spacing or ++ * major tick spacing must be set to a value greater than 0 in order for ++ * ticks to be painted. ++ * ++ * @return Whether ticks will be painted. ++ */ ++ public boolean getPaintTicks() ++ { ++ return paintTicks; ++ } ++ ++ /** ++ * This method changes the "paintTicks" property for this slider. In ++ * addition to setting this property to true, one of minor tick spacing or ++ * major tick spacing must be set to a value greater than 0 in order for ++ * ticks to be painted. ++ * ++ * @param paint Whether ticks will be painted. ++ */ ++ public void setPaintTicks(boolean paint) ++ { ++ if (paint != paintTicks) ++ { ++ boolean oldPaintTicks = paintTicks; ++ paintTicks = paint; ++ firePropertyChange(PAINT_TICKS_CHANGED_PROPERTY, oldPaintTicks, ++ paintTicks); ++ } ++ } ++ ++ /** ++ * This method returns whether the track will be painted. ++ * ++ * @return Whether the track will be painted. ++ */ ++ public boolean getPaintTrack() ++ { ++ return paintTrack; ++ } ++ ++ /** ++ * This method sets whether the track will be painted. ++ * ++ * @param paint Whether the track will be painted. ++ */ ++ public void setPaintTrack(boolean paint) ++ { ++ paintTrack = paint; ++ } ++ ++ /** ++ * This method returns whether labels will be painted. ++ * ++ * @return Whether labels will be painted. ++ */ ++ public boolean getPaintLabels() ++ { ++ return paintLabels; ++ } ++ ++ /** ++ * This method changes the "paintLabels" property. ++ * ++ * @param paint Whether labels will be painted. ++ */ ++ public void setPaintLabels(boolean paint) ++ { ++ if (paint != paintLabels) ++ { ++ boolean oldPaintLabels = paintLabels; ++ paintLabels = paint; ++ firePropertyChange(PAINT_LABELS_CHANGED_PROPERTY, oldPaintLabels, ++ paintLabels); ++ } ++ } ++ ++ /** ++ * This method is used primarily for debugging purposes and returns a string ++ * that can be used to represent this slider. ++ * ++ * @return A string representing this slider. ++ */ ++ protected String paramString() ++ { ++ return "JSlider"; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJSlider(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JSpinner.java +=================================================================== +RCS file: javax/swing/JSpinner.java +diff -N javax/swing/JSpinner.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/JSpinner.java 6 Sep 2004 16:35:58 -0000 +@@ -0,0 +1,482 @@ ++/* JSpinner.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++import java.awt.BorderLayout; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.LayoutManager; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.text.DecimalFormat; ++import java.text.ParseException; ++import java.util.EventListener; ++import javax.swing.border.EtchedBorder; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.EventListenerList; ++import javax.swing.plaf.SpinnerUI; ++ ++ ++/** ++ * A JSpinner is a component which typically contains a numeric value and a ++ * way to manipulate the value. ++ * ++ * @author Ka-Hing Cheung ++ * @version 1.0 ++ */ ++public class JSpinner extends JComponent ++{ ++ /** ++ * DOCUMENT ME! ++ */ ++ public static class StubEditor extends JLabel implements ChangeListener ++ { ++ /** DOCUMENT ME! */ ++ private JLabel label; ++ ++ /** DOCUMENT ME! */ ++ private JButton up; ++ ++ /** DOCUMENT ME! */ ++ private JButton down; ++ ++ /** DOCUMENT ME! */ ++ private JSpinner spinner; ++ ++ /** ++ * Creates a new StubEditor object. ++ * ++ * @param spinner DOCUMENT ME! ++ */ ++ public StubEditor(JSpinner spinner) ++ { ++ this.spinner = spinner; ++ setBorder(new EtchedBorder()); ++ setHorizontalAlignment(SwingConstants.TRAILING); ++ stateChanged(null); /* fill in the label */ ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param evt DOCUMENT ME! ++ */ ++ public void stateChanged(ChangeEvent evt) ++ { ++ setText(String.valueOf(spinner.getValue())); ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public static class DefaultEditor extends JPanel implements ChangeListener, ++ PropertyChangeListener, ++ LayoutManager ++ { ++ /** ++ * Creates a new DefaultEditor object. ++ * ++ * @param spinner DOCUMENT ME! ++ */ ++ public DefaultEditor(JSpinner spinner) ++ { ++ spinner.addChangeListener(this); ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ */ ++ public void commitEdit() ++ { ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param spinner DOCUMENT ME! ++ */ ++ public void dismiss(JSpinner spinner) ++ { ++ spinner.removeChangeListener(this); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public JFormattedTextField getTextField() ++ { ++ return null; ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ */ ++ public void layoutContainer(Container parent) ++ { ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return null; ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ return null; ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param evt DOCUMENT ME! ++ */ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ } /* TODO */ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param evt DOCUMENT ME! ++ */ ++ public void stateChanged(ChangeEvent evt) ++ { ++ } /* TODO */ ++ /* no-ops */ ++ public void removeLayoutComponent(Component child) ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param name DOCUMENT ME! ++ * @param child DOCUMENT ME! ++ */ ++ public void addLayoutComponent(String name, Component child) ++ { ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public static class NumberEditor extends DefaultEditor ++ { ++ /** ++ * Creates a new NumberEditor object. ++ * ++ * @param spinner DOCUMENT ME! ++ */ ++ public NumberEditor(JSpinner spinner) ++ { ++ super(spinner); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public DecimalFormat getFormat() ++ { ++ return null; ++ } ++ } ++ ++ /** DOCUMENT ME! */ ++ private SpinnerModel model; ++ ++ /** DOCUMENT ME! */ ++ private JComponent editor; ++ ++ /** DOCUMENT ME! */ ++ private EventListenerList listenerList = new EventListenerList(); ++ ++ /** DOCUMENT ME! */ ++ private ChangeListener listener = new ChangeListener() ++ { ++ public void stateChanged(ChangeEvent evt) ++ { ++ fireStateChanged(); ++ } ++ }; ++ ++ /** ++ * Creates a JSpinner with SpinnerNumberModel ++ * ++ * @see javax.swing.SpinnerNumberModel ++ */ ++ public JSpinner() ++ { ++ this(new SpinnerNumberModel()); ++ } ++ ++ /** ++ * Creates a JSpinner with the specific model and sets the default editor ++ * ++ * @param model DOCUMENT ME! ++ */ ++ public JSpinner(SpinnerModel model) ++ { ++ this.model = model; ++ model.addChangeListener(listener); ++ setEditor(createEditor(model)); ++ updateUI(); ++ } ++ ++ /** ++ * If the editor is JSpinner.DefaultEditor, then forwards the ++ * call to it, otherwise do nothing. ++ * ++ * @throws ParseException DOCUMENT ME! ++ */ ++ public void commitEdit() throws ParseException ++ { ++ if (editor instanceof DefaultEditor) ++ ((DefaultEditor) editor).commitEdit(); ++ } ++ ++ /** ++ * Gets the current editor ++ * ++ * @return the current editor ++ * ++ * @see #setEditor ++ */ ++ public JComponent getEditor() ++ { ++ return editor; ++ } ++ ++ /** ++ * Changes the current editor to the new editor. This methods should remove ++ * the old listeners (if any) and adds the new listeners (if any). ++ * ++ * @param editor the new editor ++ * ++ * @throws IllegalArgumentException DOCUMENT ME! ++ * ++ * @see #getEditor ++ */ ++ public void setEditor(JComponent editor) ++ { ++ if (editor == null) ++ throw new IllegalArgumentException("editor may not be null"); ++ ++ if (this.editor instanceof DefaultEditor) ++ ((DefaultEditor) editor).dismiss(this); ++ else if (this.editor instanceof ChangeListener) ++ removeChangeListener((ChangeListener) this.editor); ++ ++ if (editor instanceof ChangeListener) ++ addChangeListener((ChangeListener) editor); ++ ++ this.editor = editor; ++ } ++ ++ /** ++ * Gets the underly model. ++ * ++ * @return the underly model ++ */ ++ public SpinnerModel getModel() ++ { ++ return model; ++ } ++ ++ /** ++ * Gets the next value without changing the current value. ++ * ++ * @return the next value ++ * ++ * @see javax.swing.SpinnerModel#getNextValue ++ */ ++ public Object getNextValue() ++ { ++ return model.getNextValue(); ++ } ++ ++ /** ++ * Gets the previous value without changing the current value. ++ * ++ * @return the previous value ++ * ++ * @see javax.swing.SpinnerModel#getPreviousValue ++ */ ++ public Object getPreviousValue() ++ { ++ return model.getPreviousValue(); ++ } ++ ++ /** ++ * Gets the SpinnerUI that handles this spinner ++ * ++ * @return the SpinnerUI ++ */ ++ public SpinnerUI getUI() ++ { ++ return (SpinnerUI) ui; ++ } ++ ++ /** ++ * Gets the current value of the spinner, according to the underly model, ++ * not the UI. ++ * ++ * @return the current value ++ * ++ * @see javax.swing.SpinnerModel#getValue ++ */ ++ public Object getValue() ++ { ++ return model.getValue(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param value DOCUMENT ME! ++ */ ++ public void setValue(Object value) ++ { ++ model.setValue(value); ++ } ++ ++ /** ++ * This method returns a name to identify which look and feel class will be ++ * the UI delegate for this spinner. ++ * ++ * @return The UIClass identifier. "SpinnerUI" ++ */ ++ public String getUIClassID() ++ { ++ return "SpinnerUI"; ++ } ++ ++ /** ++ * This method resets the spinner's UI delegate to the default UI for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((SpinnerUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * This method sets the spinner's UI delegate. ++ * ++ * @param ui The spinner's UI delegate. ++ */ ++ public void setUI(SpinnerUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * Adds a ChangeListener ++ * ++ * @param listener the listener to add ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Remove a particular listener ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Gets all the ChangeListeners ++ * ++ * @return all the ChangeListeners ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * Fires a ChangeEvent to all the ChangeListeners ++ * added to this JSpinner ++ */ ++ protected void fireStateChanged() ++ { ++ ChangeEvent evt = new ChangeEvent(this); ++ ChangeListener[] listeners = getChangeListeners(); ++ ++ for (int i = 0; i < listeners.length; ++i) ++ listeners[i].stateChanged(evt); ++ } ++ ++ /** ++ * Creates an editor for this JSpinner. Really, it should be a ++ * JSpinner.DefaultEditor, but since that should be ++ * implemented by a JFormattedTextField, and one is not written, I am just ++ * using a dummy one backed by a JLabel. ++ * ++ * @param model DOCUMENT ME! ++ * ++ * @return the default editor ++ */ ++ protected JComponent createEditor(SpinnerModel model) ++ { ++ return new StubEditor(this); ++ } /* TODO */} +Index: javax/swing/JSplitPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JSplitPane.java,v +retrieving revision 1.2 +diff -u -r1.2 JSplitPane.java +--- javax/swing/JSplitPane.java 10 Jan 2004 21:07:43 -0000 1.2 ++++ javax/swing/JSplitPane.java 6 Sep 2004 16:35:58 -0000 +@@ -1,5 +1,5 @@ +-/* JSplitPane.java -- +- Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++/* JSplitPane.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,614 +35,782 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + ++ + package javax.swing; + + import java.awt.Component; + import java.awt.Graphics; +-import java.io.IOException; +-import java.io.ObjectOutputStream; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + import javax.accessibility.AccessibleStateSet; + import javax.accessibility.AccessibleValue; ++import javax.swing.UIManager; + import javax.swing.plaf.SplitPaneUI; + ++ + /** +- * JSplitPane +- * @author Andrew Selkirk +- * @version 1.0 ++ * This class implements JSplitPane. It is used to divide two components. By ++ * dragging the SplitPane's divider, the user can resize the two components. ++ * Note that the divider cannot resize a component to smaller than it's ++ * minimum size. + */ +-public class JSplitPane extends JComponent implements Accessible { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJSplitPane +- */ +- protected class AccessibleJSplitPane extends AccessibleJComponent +- implements AccessibleValue { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJSplitPane +- * @param component TODO +- */ +- protected AccessibleJSplitPane(JSplitPane component) { +- super(component); +- // TODO +- } // AccessibleJSplitPane() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.SPLIT_PANE; +- } // getAccessibleRole() +- +- /** +- * getAccessibleValue +- * @returns AccessibleValue +- */ +- public AccessibleValue getAccessibleValue() { +- return null; // TODO +- } // getAccessibleValue() +- +- /** +- * getCurrentAccessibleValue +- * @returns Number +- */ +- public Number getCurrentAccessibleValue() { +- return null; // TODO +- } // getCurrentAccessibleValue() +- +- /** +- * setCurrentAccessibleValue +- * @param value0 TODO +- * @returns boolean +- */ +- public boolean setCurrentAccessibleValue(Number value0) { +- return false; // TODO +- } // setCurrentAccessibleValue() +- +- /** +- * getMinimumAccessibleValue +- * @returns Number +- */ +- public Number getMinimumAccessibleValue() { +- return null; // TODO +- } // getMinimumAccessibleValue() +- +- /** +- * getMaximumAccessibleValue +- * @returns Number +- */ +- public Number getMaximumAccessibleValue() { +- return null; // TODO +- } // getMaximumAccessibleValue() +- +- +- } // AccessibleJSplitPane +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * uiClassID +- */ +- private static final String uiClassID = "SplitPaneUI"; +- +- /** +- * VERTICAL_SPLIT +- */ +- public static final int VERTICAL_SPLIT = 0; +- +- /** +- * HORIZONTAL_SPLIT +- */ +- public static final int HORIZONTAL_SPLIT = 1; +- +- /** +- * LEFT +- */ +- public static final String LEFT = "left"; +- +- /** +- * RIGHT +- */ +- public static final String RIGHT = "right"; +- +- /** +- * TOP +- */ +- public static final String TOP = "top"; +- +- /** +- * BOTTOM +- */ +- public static final String BOTTOM = "bottom"; +- +- /** +- * DIVIDER +- */ +- public static final String DIVIDER = "divider"; +- +- /** +- * ORIENTATION_PROPERTY +- */ +- public static final String ORIENTATION_PROPERTY = "orientation"; +- +- /** +- * CONTINUOUS_LAYOUT_PROPERTY +- */ +- public static final String CONTINUOUS_LAYOUT_PROPERTY = "continuousLayout"; +- +- /** +- * DIVIDER_SIZE_PROPERTY +- */ +- public static final String DIVIDER_SIZE_PROPERTY = "dividerSize"; +- +- /** +- * ONE_TOUCH_EXPANDABLE_PROPERTY +- */ +- public static final String ONE_TOUCH_EXPANDABLE_PROPERTY = "oneTouchExpandable"; +- +- /** +- * LAST_DIVIDER_LOCATION_PROPERTY +- */ +- public static final String LAST_DIVIDER_LOCATION_PROPERTY = "lastDividerLocation"; +- +- /** +- * DIVIDER_LOCATION_PROPERTY +- */ +- public static final String DIVIDER_LOCATION_PROPERTY = "dividerLocation"; +- +- /** +- * RESIZE_WEIGHT_PROPERTY +- */ +- public static final String RESIZE_WEIGHT_PROPERTY = "resizeWeight"; +- +- /** +- * orientation +- */ +- protected int orientation; +- +- /** +- * continuousLayout +- */ +- protected boolean continuousLayout; +- +- /** +- * leftComponent +- */ +- protected Component leftComponent; +- +- /** +- * rightComponent +- */ +- protected Component rightComponent; +- +- /** +- * dividerSize +- */ +- protected int dividerSize; +- +- /** +- * oneTouchExpandable +- */ +- protected boolean oneTouchExpandable; +- +- /** +- * lastDividerLocation +- */ +- protected int lastDividerLocation; +- +- /** +- * resizeWeight +- */ +- private double resizeWeight; +- +- /** +- * dividerLocation +- */ +- private int dividerLocation; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor JSplitPane +- */ +- public JSplitPane() { +- // TODO +- } // JSplitPane() +- +- /** +- * Constructor JSplitPane +- * @param value0 TODO +- */ +- public JSplitPane(int value0) { +- // TODO +- } // JSplitPane() +- +- /** +- * Constructor JSplitPane +- * @param value0 TODO +- * @param value1 TODO +- */ +- public JSplitPane(int value0, boolean value1) { +- // TODO +- } // JSplitPane() +- +- /** +- * Constructor JSplitPane +- * @param value0 TODO +- * @param value1 TODO +- * @param value2 TODO +- */ +- public JSplitPane(int value0, Component value1, Component value2) { +- // TODO +- } // JSplitPane() +- +- /** +- * Constructor JSplitPane +- * @param value0 TODO +- * @param value1 TODO +- * @param value2 TODO +- * @param value3 TODO +- */ +- public JSplitPane(int value0, boolean value1, Component value2, Component value3) { +- // TODO +- } // JSplitPane() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() +- +- /** +- * remove +- * @param value0 TODO +- */ +- public void remove(Component value0) { +- // TODO +- } // remove() +- +- /** +- * remove +- * @param value0 TODO +- */ +- public void remove(int value0) { +- // TODO +- } // remove() +- +- /** +- * removeAll +- */ +- public void removeAll() { +- // TODO +- } // removeAll() +- +- /** +- * setUI +- * @param ui TODO +- */ +- public void setUI(SplitPaneUI ui) { +- super.setUI(ui); +- } // setUI() +- +- /** +- * getUI +- * @returns SplitPaneUI +- */ +- public SplitPaneUI getUI() { +- return (SplitPaneUI) ui; +- } // getUI() +- +- /** +- * updateUI +- */ +- public void updateUI() { +- setUI((SplitPaneUI) UIManager.get(this)); +- invalidate(); +- } // updateUI() +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; +- } // getUIClassID() +- +- /** +- * setDividerSize +- * @param value0 TODO +- */ +- public void setDividerSize(int value0) { +- // TODO +- } // setDividerSize() +- +- /** +- * getDividerSize +- * @returns int +- */ +- public int getDividerSize() { +- return 0; // TODO +- } // getDividerSize() +- +- /** +- * setLeftComponent +- * @param value0 TODO +- */ +- public void setLeftComponent(Component value0) { +- // TODO +- } // setLeftComponent() +- +- /** +- * getLeftComponent +- * @returns Component +- */ +- public Component getLeftComponent() { +- return null; // TODO +- } // getLeftComponent() +- +- /** +- * setTopComponent +- * @param value0 TODO +- */ +- public void setTopComponent(Component value0) { +- // TODO +- } // setTopComponent() +- +- /** +- * getTopComponent +- * @returns Component +- */ +- public Component getTopComponent() { +- return null; // TODO +- } // getTopComponent() +- +- /** +- * setRightComponent +- * @param value0 TODO +- */ +- public void setRightComponent(Component value0) { +- // TODO +- } // setRightComponent() +- +- /** +- * getRightComponent +- * @returns Component +- */ +- public Component getRightComponent() { +- return null; // TODO +- } // getRightComponent() +- +- /** +- * setBottomComponent +- * @param value0 TODO +- */ +- public void setBottomComponent(Component value0) { +- // TODO +- } // setBottomComponent() +- +- /** +- * getBottomComponent +- * @returns Component +- */ +- public Component getBottomComponent() { +- return null; // TODO +- } // getBottomComponent() +- +- /** +- * setOneTouchExpandable +- * @param value0 TODO +- */ +- public void setOneTouchExpandable(boolean value0) { +- // TODO +- } // setOneTouchExpandable() +- +- /** +- * isOneTouchExpandable +- * @returns boolean +- */ +- public boolean isOneTouchExpandable() { +- return false; // TODO +- } // isOneTouchExpandable() +- +- /** +- * setLastDividerLocation +- * @param value0 TODO +- */ +- public void setLastDividerLocation(int value0) { +- // TODO +- } // setLastDividerLocation() +- +- /** +- * getLastDividerLocation +- * @returns int +- */ +- public int getLastDividerLocation() { +- return 0; // TODO +- } // getLastDividerLocation() +- +- /** +- * setOrientation +- * @param value0 TODO +- */ +- public void setOrientation(int value0) { +- // TODO +- } // setOrientation() +- +- /** +- * getOrientation +- * @returns int +- */ +- public int getOrientation() { +- return 0; // TODO +- } // getOrientation() +- +- /** +- * setContinuousLayout +- * @param value0 TODO +- */ +- public void setContinuousLayout(boolean value0) { +- // TODO +- } // setContinuousLayout() +- +- /** +- * isContinuousLayout +- * @returns boolean +- */ +- public boolean isContinuousLayout() { +- return false; // TODO +- } // isContinuousLayout() +- +- /** +- * setResizeWeight +- * @param value0 TODO +- */ +- public void setResizeWeight(double value0) { +- // TODO +- } // setResizeWeight() +- +- /** +- * getResizeWeight +- * @returns double +- */ +- public double getResizeWeight() { +- return 0.0; // TODO +- } // getResizeWeight() +- +- /** +- * resetToPreferredSizes +- */ +- public void resetToPreferredSizes() { +- // TODO +- } // resetToPreferredSizes() +- +- /** +- * setDividerLocation +- * @param value0 TODO +- */ +- public void setDividerLocation(double value0) { +- // TODO +- } // setDividerLocation() +- +- /** +- * setDividerLocation +- * @param value0 TODO +- */ +- public void setDividerLocation(int value0) { +- // TODO +- } // setDividerLocation() +- +- /** +- * getDividerLocation +- * @returns int +- */ +- public int getDividerLocation() { +- return 0; // TODO +- } // getDividerLocation() +- +- /** +- * getMinimumDividerLocation +- * @returns int +- */ +- public int getMinimumDividerLocation() { +- return 0; // TODO +- } // getMinimumDividerLocation() +- +- /** +- * getMaximumDividerLocation +- * @returns int +- */ +- public int getMaximumDividerLocation() { +- return 0; // TODO +- } // getMaximumDividerLocation() +- +- /** +- * isValidateRoot +- * @returns boolean +- */ +- public boolean isValidateRoot() { +- return false; // TODO +- } // isValidateRoot() +- +- /** +- * addImpl +- * @param value0 TODO +- * @param value1 TODO +- * @param value2 TODO +- */ +- protected void addImpl(Component value0, Object value1, int value2) { +- // TODO +- } // addImpl() +- +- /** +- * paintChildren +- * @param value0 TODO +- */ +- protected void paintChildren(Graphics value0) { +- // TODO +- } // paintChildren() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO +- } // paramString() +- +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJSplitPane(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JSplitPane ++public class JSplitPane extends JComponent implements Accessible ++{ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJSplitPane extends JComponent.AccessibleJComponent ++ implements AccessibleValue ++ { ++ private static final long serialVersionUID = -1788116871416305366L; ++ ++ /** ++ * Creates a new AccessibleJSplitPane object. ++ * ++ * @param value0 DOCUMENT ME! ++ */ ++ protected AccessibleJSplitPane() ++ { ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleValue getAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getCurrentAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param value0 DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean setCurrentAccessibleValue(Number value0) ++ { ++ return false; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMinimumAccessibleValue() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getMaximumAccessibleValue() ++ { ++ return null; ++ } ++ } ++ ++ private static final long serialVersionUID = -5634142046175988380L; ++ ++ /** The constraints string used to add components to the bottom. */ ++ public static final String BOTTOM = "bottom"; ++ ++ /** The property fired when the continuousLayout property changes. */ ++ public static final String CONTINUOUS_LAYOUT_PROPERTY = "continuousLayout"; ++ ++ /** The property fired when the divider property changes. */ ++ public static final String DIVIDER = "divider"; ++ ++ /** The property fired when the divider location property changes. */ ++ public static final String DIVIDER_LOCATION_PROPERTY = "dividerLocation"; ++ ++ /** The property fired when the divider size property changes. */ ++ public static final String DIVIDER_SIZE_PROPERTY = "dividerSize"; ++ ++ /** ++ * The value of the orientation when the components are split horizontally. ++ */ ++ public static final int HORIZONTAL_SPLIT = 1; ++ ++ /** The property fired when the last divider location property changes. */ ++ public static final String LAST_DIVIDER_LOCATION_PROPERTY = "lastDividerLocation"; ++ ++ /** The constraints string used to add components to the left. */ ++ public static final String LEFT = "left"; ++ ++ /** The property fired when the one touch expandable property changes. */ ++ public static final String ONE_TOUCH_EXPANDABLE_PROPERTY = "oneTouchExpandable"; ++ ++ /** The property fired when the orientation property changes. */ ++ public static final String ORIENTATION_PROPERTY = "orientation"; ++ ++ /** The property fired when the resize weight property changes. */ ++ public static final String RESIZE_WEIGHT_PROPERTY = "resizeWeight"; ++ ++ /** The constraints string used to add components to the right. */ ++ public static final String RIGHT = "right"; ++ ++ /** The constraints string used to add components to the top. */ ++ public static final String TOP = "top"; ++ ++ /** The value of the orientation when the components are split vertically. */ ++ public static final int VERTICAL_SPLIT = 0; ++ ++ /** Whether the JSplitPane uses continuous layout. */ ++ protected boolean continuousLayout; ++ ++ /** Whether the JSplitPane uses one touch expandable buttons. */ ++ protected boolean oneTouchExpandable = false; ++ ++ // This is the master dividerSize variable and sets the BasicSplitPaneDivider one accordingly ++ ++ /** The size of the divider. */ ++ protected int dividerSize = 10; ++ ++ /** The last location of the divider given by the UI. */ ++ protected int lastDividerLocation; ++ ++ /** The orientation of the JSplitPane. */ ++ protected int orientation; ++ ++ /** The component on the top or left. */ ++ protected Component leftComponent; ++ ++ /** The component on the right or bottom. */ ++ protected Component rightComponent; ++ ++ /** Determines how extra space should be allocated. */ ++ private transient double resizeWeight; ++ ++ /** ++ * Creates a new JSplitPane object with the given orientation, layout mode, ++ * and left and right components. ++ * ++ * @param newOrientation The orientation to use. ++ * @param newContinuousLayout The layout mode to use. ++ * @param newLeftComponent The left component. ++ * @param newRightComponent The right component. ++ * ++ * @throws IllegalArgumentException DOCUMENT ME! ++ */ ++ public JSplitPane(int newOrientation, boolean newContinuousLayout, ++ Component newLeftComponent, Component newRightComponent) ++ { ++ if (newOrientation != HORIZONTAL_SPLIT && newOrientation != VERTICAL_SPLIT) ++ throw new IllegalArgumentException("orientation is invalid."); ++ orientation = newOrientation; ++ continuousLayout = newContinuousLayout; ++ setLeftComponent(newLeftComponent); ++ setRightComponent(newRightComponent); ++ ++ updateUI(); ++ } ++ ++ /** ++ * Creates a new JSplitPane object using nonContinuousLayout mode, the given ++ * orientation and left and right components. ++ * ++ * @param newOrientation The orientation to use. ++ * @param newLeftComponent The left component. ++ * @param newRightComponent The right component. ++ */ ++ public JSplitPane(int newOrientation, Component newLeftComponent, ++ Component newRightComponent) ++ { ++ this(newOrientation, false, newLeftComponent, newRightComponent); ++ } ++ ++ /** ++ * Creates a new JSplitPane object with the given layout mode and ++ * orientation. ++ * ++ * @param newOrientation The orientation to use. ++ * @param newContinuousLayout The layout mode to use. ++ */ ++ public JSplitPane(int newOrientation, boolean newContinuousLayout) ++ { ++ this(newOrientation, newContinuousLayout, null, null); ++ } ++ ++ /** ++ * Creates a new JSplitPane object using a nonContinuousLayout mode and the ++ * given orientation. ++ * ++ * @param newOrientation The orientation to use. ++ */ ++ public JSplitPane(int newOrientation) ++ { ++ this(newOrientation, false, null, null); ++ } ++ ++ /** ++ * Creates a new JSplitPane object using HORIZONTAL_SPLIT and a ++ * nonContinuousLayout mode. ++ */ ++ public JSplitPane() ++ { ++ this(HORIZONTAL_SPLIT, false, null, null); ++ } ++ ++ /** ++ * This method adds a component to the JSplitPane. The constraints object is ++ * a string that identifies where this component should go. If the ++ * constraints is not a known one, it will throw an ++ * IllegalArgumentException. The valid constraints are LEFT, TOP, RIGHT, ++ * BOTTOM and DIVIDER. ++ * ++ * @param comp The component to add. ++ * @param constraints The constraints string to use. ++ * @param index Where to place to component in the list of components. ++ * ++ * @throws IllegalArgumentException When the constraints is not a known identifier. ++ */ ++ protected void addImpl(Component comp, Object constraints, int index) ++ { ++ int left = 0; ++ int right = 1; ++ int div = 2; ++ int place; ++ if (constraints == null) ++ { ++ if (leftComponent == null) ++ constraints = LEFT; ++ else if (rightComponent == null) ++ constraints = RIGHT; ++ } ++ ++ if (constraints instanceof String) ++ { ++ String placement = (String) constraints; ++ ++ if (placement.equals(BOTTOM) || placement.equals(RIGHT)) ++ { ++ if (rightComponent != null) ++ remove(rightComponent); ++ rightComponent = comp; ++ } ++ else if (placement.equals(LEFT) || placement.equals(TOP)) ++ { ++ if (leftComponent != null) ++ remove(leftComponent); ++ leftComponent = comp; ++ } ++ else if (placement.equals(DIVIDER)) ++ constraints = null; ++ else ++ throw new IllegalArgumentException("Constraints is not a known identifier."); ++ ++ super.addImpl(comp, constraints, index); ++ } ++ invalidate(); ++ layout(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJSplitPane(); ++ ++ return accessibleContext; ++ } ++ ++ /** ++ * This method returns the bottom component. ++ * ++ * @return The bottom component. ++ */ ++ public Component getBottomComponent() ++ { ++ return rightComponent; ++ } ++ ++ /** ++ * This method returns the location of the divider. This method is passed to ++ * the UI. ++ * ++ * @return The location of the divider. ++ */ ++ public int getDividerLocation() ++ { ++ if (ui != null) ++ return ((SplitPaneUI) ui).getDividerLocation(this); ++ else ++ return -1; ++ } ++ ++ /** ++ * This method returns the size of the divider. ++ * ++ * @return The size of the divider. ++ */ ++ public int getDividerSize() ++ { ++ return dividerSize; ++ } ++ ++ /** ++ * This method returns the last divider location. ++ * ++ * @return The last divider location. ++ */ ++ public int getLastDividerLocation() ++ { ++ return lastDividerLocation; ++ } ++ ++ /** ++ * This method returns the left component. ++ * ++ * @return The left component. ++ */ ++ public Component getLeftComponent() ++ { ++ return leftComponent; ++ } ++ ++ /** ++ * This method returns the maximum divider location. This method is passed ++ * to the UI. ++ * ++ * @return DOCUMENT ME! ++ */ ++ public int getMaximumDividerLocation() ++ { ++ if (ui != null) ++ return ((SplitPaneUI) ui).getMaximumDividerLocation(this); ++ else ++ return -1; ++ } ++ ++ /** ++ * This method returns the minimum divider location. This method is passed ++ * to the UI. ++ * ++ * @return The minimum divider location. ++ */ ++ public int getMinimumDividerLocation() ++ { ++ if (ui != null) ++ return ((SplitPaneUI) ui).getMinimumDividerLocation(this); ++ else ++ return -1; ++ } ++ ++ /** ++ * This method returns the orientation that the JSplitPane is using. ++ * ++ * @return The current orientation. ++ */ ++ public int getOrientation() ++ { ++ return orientation; ++ } ++ ++ /** ++ * This method returns the current resize weight. ++ * ++ * @return The current resize weight. ++ */ ++ public double getResizeWeight() ++ { ++ return resizeWeight; ++ } ++ ++ /** ++ * This method returns the right component. ++ * ++ * @return The right component. ++ */ ++ public Component getRightComponent() ++ { ++ return rightComponent; ++ } ++ ++ /** ++ * This method returns the top component. ++ * ++ * @return The top component. ++ */ ++ public Component getTopComponent() ++ { ++ return leftComponent; ++ } ++ ++ /** ++ * This method returns the UI. ++ * ++ * @return The UI. ++ */ ++ public SplitPaneUI getUI() ++ { ++ return (SplitPaneUI) ui; ++ } ++ ++ /** ++ * This method returns true if the JSplitPane is using a continuousLayout. ++ * ++ * @return True if using a continuousLayout. ++ */ ++ public boolean isContinuousLayout() ++ { ++ return continuousLayout; ++ } ++ ++ /** ++ * This method returns true if the divider has one touch expandable buttons. ++ * ++ * @return True if one touch expandable is used. ++ */ ++ public boolean isOneTouchExpandable() ++ { ++ return oneTouchExpandable; ++ } ++ ++ /** ++ * This method returns true. ++ * ++ * @return true. ++ */ ++ public boolean isValidateRoot() ++ { ++ return true; ++ } ++ ++ /** ++ * This method overrides JComponent's paintChildren so the UI can be ++ * messaged when the children have finished painting. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ protected void paintChildren(Graphics g) ++ { ++ super.paintChildren(g); ++ if (ui != null) ++ ((SplitPaneUI) ui).finishedPaintingChildren(this, g); ++ } ++ ++ /** ++ * This method returns a String that describes this JSplitPane. The string ++ * is primarily used for debugging purposes. ++ * ++ * @return A String used for debugging purposes. ++ */ ++ protected String paramString() ++ { ++ return "JSplitPane"; ++ } ++ ++ /** ++ * This method removes the given component from the JSplitPane. ++ * ++ * @param component The Component to remove. ++ */ ++ public void remove(Component component) ++ { ++ if (component == leftComponent) ++ leftComponent = null; ++ else if (component == rightComponent) ++ rightComponent = null; ++ super.remove(component); ++ } ++ ++ /** ++ * This method removes the component at the given index. ++ * ++ * @param index The index of the component to remove. ++ */ ++ public void remove(int index) ++ { ++ Component component = getComponent(index); ++ if (component == leftComponent) ++ leftComponent = null; ++ else if (component == rightComponent) ++ rightComponent = null; ++ super.remove(index); ++ } ++ ++ /** ++ * This method removes all components from the JSplitPane. ++ */ ++ public void removeAll() ++ { ++ leftComponent = null; ++ rightComponent = null; ++ super.removeAll(); ++ } ++ ++ /** ++ * This method resets all children of the JSplitPane to their preferred ++ * sizes. ++ */ ++ public void resetToPreferredSizes() ++ { ++ if (ui != null) ++ ((SplitPaneUI) ui).resetToPreferredSizes(this); ++ } ++ ++ /** ++ * This method sets the bottom component. ++ * ++ * @param comp The Component to be placed at the bottom. ++ */ ++ public void setBottomComponent(Component comp) ++ { ++ if (comp != null) ++ add(comp, BOTTOM); ++ else ++ add(new JButton("right button"), BOTTOM); ++ } ++ ++ /** ++ * This method sets the layout mode for the JSplitPane. ++ * ++ * @param newContinuousLayout Whether the JSplitPane is in continuousLayout ++ * mode. ++ */ ++ public void setContinuousLayout(boolean newContinuousLayout) ++ { ++ if (newContinuousLayout != continuousLayout) ++ { ++ boolean oldValue = continuousLayout; ++ continuousLayout = newContinuousLayout; ++ firePropertyChange(CONTINUOUS_LAYOUT_PROPERTY, oldValue, ++ continuousLayout); ++ } ++ } ++ ++ /** ++ * This method sets the location of the divider. A value of 0 sets the ++ * divider to the farthest left. A value of 1 sets the divider to the ++ * farthest right. ++ * ++ * @param proportionalLocation A double that describes the location of the ++ * divider. ++ * ++ * @throws IllegalArgumentException DOCUMENT ME! ++ */ ++ public void setDividerLocation(double proportionalLocation) ++ { ++ if (proportionalLocation > 1 || proportionalLocation < 0) ++ throw new IllegalArgumentException("proportion has to be between 0 and 1."); ++ ++ int max = (orientation == HORIZONTAL_SPLIT) ? getWidth() : getHeight(); ++ setDividerLocation((int) (proportionalLocation * max)); ++ } ++ ++ /** ++ * This method sets the location of the divider. ++ * ++ * @param location The location of the divider. ++ */ ++ public void setDividerLocation(int location) ++ { ++ if (ui != null && location != getDividerLocation()) ++ { ++ int oldLocation = getDividerLocation(); ++ ((SplitPaneUI) ui).setDividerLocation(this, location); ++ firePropertyChange(DIVIDER_LOCATION_PROPERTY, oldLocation, location); ++ } ++ } ++ ++ /** ++ * This method sets the size of the divider. ++ * ++ * @param newSize The size of the divider. ++ */ ++ public void setDividerSize(int newSize) ++ { ++ if (newSize != dividerSize) ++ { ++ int oldSize = dividerSize; ++ dividerSize = newSize; ++ firePropertyChange(DIVIDER_SIZE_PROPERTY, oldSize, dividerSize); ++ } ++ } ++ ++ // This doesn't appear to do anything when set from user side. ++ // so it probably is only used from the UI side to change the ++ // lastDividerLocation var. ++ ++ /** ++ * This method sets the last location of the divider. ++ * ++ * @param newLastLocation The last location of the divider. ++ */ ++ public void setLastDividerLocation(int newLastLocation) ++ { ++ if (newLastLocation != lastDividerLocation) ++ { ++ int oldValue = lastDividerLocation; ++ lastDividerLocation = newLastLocation; ++ firePropertyChange(LAST_DIVIDER_LOCATION_PROPERTY, oldValue, ++ lastDividerLocation); ++ } ++ } ++ ++ /** ++ * This method sets the left component. ++ * ++ * @param comp The left component. ++ */ ++ public void setLeftComponent(Component comp) ++ { ++ if (comp != null) ++ add(comp, LEFT); ++ else ++ add(new JButton("left button"), LEFT); ++ } ++ ++ /** ++ * This method sets whether the divider has one touch expandable buttons. ++ * The one touch expandable buttons can expand the size of either component ++ * to the maximum allowed size. ++ * ++ * @param newValue Whether the divider will have one touch expandable ++ * buttons. ++ */ ++ public void setOneTouchExpandable(boolean newValue) ++ { ++ if (newValue != oneTouchExpandable) ++ { ++ boolean oldValue = oneTouchExpandable; ++ oneTouchExpandable = newValue; ++ firePropertyChange(ONE_TOUCH_EXPANDABLE_PROPERTY, oldValue, ++ oneTouchExpandable); ++ } ++ } ++ ++ /** ++ * This method sets the orientation of the JSplitPane. ++ * ++ * @param orientation The orientation of the JSplitPane. ++ * ++ * @throws IllegalArgumentException DOCUMENT ME! ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != HORIZONTAL_SPLIT && orientation != VERTICAL_SPLIT) ++ throw new IllegalArgumentException("orientation must be one of VERTICAL_SPLIT, HORIZONTAL_SPLIT"); ++ if (orientation != this.orientation) ++ { ++ int oldOrientation = this.orientation; ++ this.orientation = orientation; ++ firePropertyChange(ORIENTATION_PROPERTY, oldOrientation, ++ this.orientation); ++ } ++ } ++ ++ /** ++ * This method determines how extra space will be distributed among the left ++ * and right components. A value of 0 will allocate all extra space to the ++ * right component. A value of 1 indicates that all extra space will go to ++ * the left component. A value in between 1 and 0 will split the space ++ * accordingly. ++ * ++ * @param value The resize weight. ++ */ ++ public void setResizeWeight(double value) ++ { ++ resizeWeight = value; ++ } ++ ++ /** ++ * This method sets the right component. ++ * ++ * @param comp The right component. ++ */ ++ public void setRightComponent(Component comp) ++ { ++ if (comp != null) ++ add(comp, RIGHT); ++ else ++ add(new JButton("right button"), RIGHT); ++ } ++ ++ /** ++ * This method sets the top component. ++ * ++ * @param comp The top component. ++ */ ++ public void setTopComponent(Component comp) ++ { ++ if (comp != null) ++ add(comp, TOP); ++ else ++ add(new JButton("left button"), TOP); ++ } ++ ++ /** ++ * This method sets the UI used by the JSplitPane. ++ * ++ * @param ui The UI to use. ++ */ ++ public void setUI(SplitPaneUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method resets the UI to the one specified by the current Look and ++ * Feel. ++ */ ++ public void updateUI() ++ { ++ setUI((SplitPaneUI) UIManager.getUI(this)); ++ invalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method returns a string identifier to determine which UI class it ++ * needs. ++ * ++ * @return A string that identifies it's UI class. ++ */ ++ public String getUIClassID() ++ { ++ return "SplitPaneUI"; ++ } ++} +Index: javax/swing/JTabbedPane.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JTabbedPane.java,v +retrieving revision 1.2 +diff -u -r1.2 JTabbedPane.java +--- javax/swing/JTabbedPane.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JTabbedPane.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ +-/* JTabbedPane.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JTabbedPane.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,96 +35,1459 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.event.MouseEvent; ++import java.io.Serializable; + import java.util.Vector; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleSelection; + import javax.swing.event.ChangeEvent; + import javax.swing.event.ChangeListener; + import javax.swing.plaf.TabbedPaneUI; ++import javax.swing.plaf.UIResource; ++ + +-public class JTabbedPane extends JComponent implements Accessible, SwingConstants ++/** ++ *

    ++ * This is a container for components. One component is displayed at a time. ++ * Users can switch between components by clicking on tabs. ++ *

    ++ * ++ *

    ++ * Tabs can be oriented in several ways. They can be above, below, left and ++ * right of the component. Tabs can either wrap around (by creating multiple ++ * rows of tabs) or they can be scrolled (where only a subset of the tabs ++ * can be seen at once). More tabs can be added by calling the ++ * add/addTab/insertTab methods. ++ *

    ++ */ ++public class JTabbedPane extends JComponent implements Serializable, ++ Accessible, ++ SwingConstants + { +- class Tab ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJTabbedPane extends JComponent.AccessibleJComponent ++ implements AccessibleSelection, ChangeListener ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 7610530885966830483L; ++ ++ /** ++ * Creates a new AccessibleJTabbedPane object. ++ */ ++ public AccessibleJTabbedPane() ++ { ++ super(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param e DOCUMENT ME! ++ */ ++ public void stateChanged(ChangeEvent e) + { +- Icon icon; +- String name, descr; +- Component tab; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } + +- Tab(String name, +- Icon icon, +- Component tab, +- String descr) +- { +- this.name = name; +- this.icon = icon; +- this.tab = tab; +- this.descr = descr; +- } ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public int getAccessibleChildrenCount() ++ { ++ return 0; + } +- +- private Vector tabs = new Vector(); + +- public JTabbedPane() ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Accessible getAccessibleChild(int i) + { ++ return null; + } + +- public void addTab(String name, +- Component panel) ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleSelection getAccessibleSelection() + { +- addTab(name, null, panel, null); ++ return null; + } +- public void addTab(String name, +- Icon icon, +- Component panel) ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param p DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Accessible getAccessibleAt(Point p) + { +- addTab(name, icon, panel, null); ++ return null; + } +- public void addTab(String name, +- Icon icon, +- Component panel, +- String descr) ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public int getAccessibleSelectionCount() + { +- tabs.addElement(new Tab(name, icon, panel, descr)); ++ return 0; + } + +- public int getTabCount() ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Accessible getAccessibleSelection(int i) + { +- return tabs.size(); ++ return null; + } +- public Component getComponentAt(int i) ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean isAccessibleChildSelected(int i) + { +- Tab t = (Tab) tabs.elementAt(i); +- return t.tab; ++ return false; + } +- +- public String getUIClassID() +- { return "JTabbedPane"; } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ */ ++ public void addAccessibleSelection(int i) ++ { ++ } + +- public void setUI(TabbedPaneUI ui) { +- super.setUI(ui); ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ */ ++ public void removeAccessibleSelection(int i) ++ { + } +- +- public TabbedPaneUI getUI() { +- return (TabbedPaneUI)ui; ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public void clearAccessibleSelection() ++ { + } +- +- public void updateUI() ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public void selectAllAccessibleSelection() + { +- setUI((TabbedPaneUI)UIManager.getUI(this)); + } +- +- public AccessibleContext getAccessibleContext() ++ } ++ ++ /** ++ * A helper class that listens for changes to the model. ++ */ ++ protected class ModelListener implements ChangeListener, Serializable ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 497359819958114132L; ++ ++ /** ++ * Creates a new ModelListener object. ++ */ ++ protected ModelListener() + { +- return null; + } +- +- protected String paramString() ++ ++ /** ++ * This method is called whenever the model is changed. ++ * ++ * @param e The ChangeEvent that is passed from the model. ++ */ ++ public void stateChanged(ChangeEvent e) + { +- return "JTabbedPane"; ++ // Propagate to our listeners. ++ fireStateChanged(); + } ++ } ++ ++ /** ++ * A private class that holds all the information for each tab. ++ */ ++ private class Page ++ { ++ /** The tooltip string. */ ++ private String tip; ++ ++ /** The component associated with the tab. */ ++ private Component component; ++ ++ /** The active icon associated with the tab. */ ++ private transient Icon icon; ++ ++ /** The disabled icon associated with the tab. */ ++ private transient Icon disabledIcon; ++ ++ /** The tab's enabled status. */ ++ private transient boolean enabled = true; ++ ++ /** The string painted on the tab. */ ++ private transient String title; ++ ++ /** The background color of the tab. */ ++ private transient Color bg; ++ ++ /** The foreground color of the tab. */ ++ private transient Color fg; ++ ++ /** The mnemonic associated with the tab. */ ++ private transient int mnemonicKey; ++ ++ /** The index of the underlined character in the string. */ ++ private transient int underlinedChar = -1; ++ ++ /** ++ * Creates a new data storage for the tab. ++ * ++ * @param title The string displayed on the tab. ++ * @param icon The active icon displayed on the tab. ++ * @param component The component associated with the tab. ++ * @param tip The tooltip associated with the tab. ++ */ ++ protected Page(String title, Icon icon, Component component, String tip) ++ { ++ this.title = title; ++ this.icon = icon; ++ this.component = component; ++ this.tip = tip; ++ } ++ ++ /** ++ * This method returns the component associated with the tab. ++ * ++ * @return The component associated with the tab. ++ */ ++ public Component getComponent() ++ { ++ return component; ++ } ++ ++ /** ++ * This method sets the component associated with the tab. ++ * ++ * @param c The component associated with the tab. ++ */ ++ public void setComponent(Component c) ++ { ++ remove(component); ++ this.component = c; ++ add(c); ++ } ++ ++ /** ++ * This method returns the tooltip string. ++ * ++ * @return The tooltip string. ++ */ ++ public String getTip() ++ { ++ return tip; ++ } ++ ++ /** ++ * This method sets the tooltip string. ++ * ++ * @param tip The tooltip string. ++ */ ++ public void setTip(String tip) ++ { ++ this.tip = tip; ++ } ++ ++ /** ++ * This method returns the background color. ++ * ++ * @return The background color. ++ */ ++ public Color getBackground() ++ { ++ return bg; ++ } ++ ++ /** ++ * This method sets the background color. ++ * ++ * @param background The background color. ++ */ ++ public void setBackground(Color background) ++ { ++ bg = background; ++ } ++ ++ /** ++ * This method returns the foreground color. ++ * ++ * @return The foreground color. ++ */ ++ public Color getForeground() ++ { ++ return fg; ++ } ++ ++ /** ++ * This method sets the foreground color. ++ * ++ * @param foreground The foreground color. ++ */ ++ public void setForeground(Color foreground) ++ { ++ fg = foreground; ++ } ++ ++ /** ++ * This method returns the title associated with the tab. ++ * ++ * @return The title of the tab. ++ */ ++ public String getTitle() ++ { ++ return title; ++ } ++ ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = 1614381073220130939L; ++ ++ /** ++ * This method sets the title of the tab. ++ * ++ * @param text The title of the tab. ++ */ ++ public void setTitle(String text) ++ { ++ title = text; ++ if (title != null && title.length() <= underlinedChar) ++ setDisplayedMnemonicIndex(title.length() - 1); ++ } ++ ++ /** ++ * This method returns the active icon. ++ * ++ * @return The active icon. ++ */ ++ public Icon getIcon() ++ { ++ return icon; ++ } ++ ++ /** ++ * This method sets the active icon. ++ * ++ * @param icon The active icon. ++ */ ++ public void setIcon(Icon icon) ++ { ++ this.icon = icon; ++ } ++ ++ /** ++ * This method returns the disabled icon. ++ * ++ * @return The disabled icon. ++ */ ++ public Icon getDisabledIcon() ++ { ++ if (disabledIcon == null && icon instanceof ImageIcon) ++ setDisabledIcon(icon); ++ return disabledIcon; ++ } ++ ++ /** ++ * This method sets the disabled icon. ++ * ++ * @param disabledIcon The disabled icon. ++ */ ++ public void setDisabledIcon(Icon disabledIcon) ++ { ++ this.disabledIcon = disabledIcon; ++ } ++ ++ /** ++ * This method returns whether the tab is enabled. ++ * ++ * @return Whether the tab is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ return enabled; ++ } ++ ++ /** ++ * This method sets whether the tab is enabled. ++ * ++ * @param enabled Whether this tab is enabled. ++ */ ++ public void setEnabled(boolean enabled) ++ { ++ this.enabled = enabled; ++ } ++ ++ /** ++ * This method returns the mnemonic. ++ * ++ * @return The mnemonic. ++ */ ++ public int getMnemonic() ++ { ++ return (int) mnemonicKey; ++ } ++ ++ /** ++ * This method sets the mnemonic. If the title is set, it will update the ++ * mnemonicIndex. ++ * ++ * @param key The mnemonic. ++ */ ++ public void setMnemonic(int key) ++ { ++ setMnemonic((char) key); ++ } ++ ++ /** ++ * This method sets the mnemonic. If the title is set, it will update the ++ * mnemonicIndex. ++ * ++ * @param aChar The mnemonic. ++ */ ++ public void setMnemonic(char aChar) ++ { ++ mnemonicKey = aChar; ++ if (title != null) ++ setDisplayedMnemonicIndex(title.indexOf(mnemonicKey)); ++ } ++ ++ /** ++ * This method returns the mnemonicIndex. ++ * ++ * @return The mnemonicIndex. ++ */ ++ public int getDisplayedMnemonicIndex() ++ { ++ return underlinedChar; ++ } ++ ++ /** ++ * This method sets the mnemonicIndex. ++ * ++ * @param index The mnemonicIndex. ++ * ++ * @throws IllegalArgumentException If index less than -1 || index greater ++ * or equal to title.length. ++ */ ++ public void setDisplayedMnemonicIndex(int index) ++ throws IllegalArgumentException ++ { ++ if (index < -1 || title != null && index >= title.length()) ++ throw new IllegalArgumentException(); ++ ++ if (title == null || title.charAt(index) != mnemonicKey) ++ index = -1; ++ ++ underlinedChar = index; ++ } ++ } ++ ++ /** Fired in a PropertyChangeEvent when the "model" property changes. */ ++ public static final String MODEL_CHANGED_PROPERTY = "model"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "tabPlacement" property changes. ++ */ ++ public static final String TAB_PLACEMENT_CHANGED_PROPERTY = "tabPlacement"; ++ ++ /** ++ * Fired in a PropertyChangeEvent when the "tabLayoutPolicy" property ++ * changes. ++ */ ++ public static final String TAB_LAYOUT_POLICY_CHANGED_PROPERTY = "tabLayoutPolicy"; ++ ++ /** The changeEvent used to fire changes to listeners. */ ++ protected ChangeEvent changeEvent; ++ ++ /** The listener that listens to the model. */ ++ protected ChangeListener changeListener; ++ ++ /** The model that describes this JTabbedPane. */ ++ protected SingleSelectionModel model; ++ ++ /** Indicates that the TabbedPane is in scrolling mode. */ ++ public static final int SCROLL_TAB_LAYOUT = 1; ++ ++ /** Indicates that the TabbedPane is in wrap mode. */ ++ public static final int WRAP_TAB_LAYOUT = 0; ++ ++ /** The current tabPlacement of the TabbedPane. */ ++ protected int tabPlacement = SwingConstants.TOP; ++ ++ /** The current tabLayoutPolicy of the TabbedPane. */ ++ private transient int layoutPolicy; ++ ++ /** The list of tabs associated with the TabbedPane. */ ++ transient Vector tabs = new Vector(); ++ ++ /** ++ * Creates a new JTabbedPane object with tabs on top and using wrap tab ++ * layout. ++ */ ++ public JTabbedPane() ++ { ++ this(SwingConstants.TOP, WRAP_TAB_LAYOUT); ++ } ++ ++ /** ++ * Creates a new JTabbedPane object using wrap tab layout and the given ++ * tabPlacement. ++ * ++ * @param tabPlacement Where the tabs will be placed. ++ */ ++ public JTabbedPane(int tabPlacement) ++ { ++ this(tabPlacement, WRAP_TAB_LAYOUT); ++ } ++ ++ /** ++ * Creates a new JTabbedPane object with the given tabPlacement and ++ * tabLayoutPolicy. ++ * ++ * @param tabPlacement Where the tabs will be placed. ++ * @param tabLayoutPolicy The way tabs will be placed. ++ * ++ * @throws IllegalArgumentException If tabLayoutPolicy or tabPlacement are ++ * not valid. ++ */ ++ public JTabbedPane(int tabPlacement, int tabLayoutPolicy) ++ { ++ if (tabPlacement != TOP && tabPlacement != BOTTOM && tabPlacement != RIGHT ++ && tabPlacement != LEFT) ++ throw new IllegalArgumentException("tabPlacement is not valid."); ++ if (tabLayoutPolicy != SCROLL_TAB_LAYOUT ++ && tabLayoutPolicy != WRAP_TAB_LAYOUT) ++ throw new IllegalArgumentException("tabLayoutPolicy is not valid."); ++ this.tabPlacement = tabPlacement; ++ layoutPolicy = tabLayoutPolicy; ++ ++ changeEvent = new ChangeEvent(this); ++ changeListener = createChangeListener(); ++ ++ model = new DefaultSingleSelectionModel(); ++ model.addChangeListener(changeListener); ++ ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the UI used to display the JTabbedPane. ++ * ++ * @return The UI used to display the JTabbedPane. ++ */ ++ public TabbedPaneUI getUI() ++ { ++ return (TabbedPaneUI) ui; ++ } ++ ++ /** ++ * This method sets the UI used to display the JTabbedPane. ++ * ++ * @param ui The UI used to display the JTabbedPane. ++ */ ++ public void setUI(TabbedPaneUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method restores the UI to the defaults given by the UIManager. ++ */ ++ public void updateUI() ++ { ++ setUI((TabbedPaneUI) UIManager.getUI(this)); ++ invalidate(); ++ } ++ ++ /** ++ * This method returns a string identifier that is used to determine which ++ * UI will be used with the JTabbedPane. ++ * ++ * @return A string identifier for the UI. ++ */ ++ public String getUIClassID() ++ { ++ return "TabbedPaneUI"; ++ } ++ ++ /** ++ * This method creates a ChangeListener that is used to listen to the model ++ * for events. ++ * ++ * @return A ChangeListener to listen to the model. ++ */ ++ protected ChangeListener createChangeListener() ++ { ++ return new ModelListener(); ++ } ++ ++ /** ++ * This method adds a ChangeListener to the JTabbedPane. ++ * ++ * @param l The ChangeListener to add. ++ */ ++ public void addChangeListener(ChangeListener l) ++ { ++ listenerList.add(ChangeListener.class, l); ++ } ++ ++ /** ++ * This method removes a ChangeListener to the JTabbedPane. ++ * ++ * @param l The ChangeListener to remove. ++ */ ++ public void removeChangeListener(ChangeListener l) ++ { ++ listenerList.remove(ChangeListener.class, l); ++ } ++ ++ /** ++ * This method fires a ChangeEvent to all the JTabbedPane's ChangeListeners. ++ */ ++ protected void fireStateChanged() ++ { ++ Object[] changeListeners = listenerList.getListenerList(); ++ if (changeEvent == null) ++ changeEvent = new ChangeEvent(this); ++ for (int i = changeListeners.length - 2; i >= 0; i -= 2) ++ { ++ if (changeListeners[i] == ChangeListener.class) ++ ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent); ++ } ++ } ++ ++ /** ++ * This method returns all ChangeListeners registered with the JTabbedPane. ++ * ++ * @return The ChangeListeners registered with the JTabbedPane. ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) super.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * This method returns the model used with the JTabbedPane. ++ * ++ * @return The JTabbedPane's model. ++ */ ++ public SingleSelectionModel getModel() ++ { ++ return model; ++ } ++ ++ /** ++ * This method changes the model property of the JTabbedPane. ++ * ++ * @param model The new model to use with the JTabbedPane. ++ */ ++ public void setModel(SingleSelectionModel model) ++ { ++ if (model != this.model) ++ { ++ SingleSelectionModel oldModel = this.model; ++ this.model.removeChangeListener(changeListener); ++ this.model = model; ++ this.model.addChangeListener(changeListener); ++ firePropertyChange(MODEL_CHANGED_PROPERTY, oldModel, this.model); ++ } ++ } ++ ++ /** ++ * This method returns the tabPlacement. ++ * ++ * @return The tabPlacement used with the JTabbedPane. ++ */ ++ public int getTabPlacement() ++ { ++ return tabPlacement; ++ } ++ ++ /** ++ * This method changes the tabPlacement property of the JTabbedPane. ++ * ++ * @param tabPlacement The tabPlacement to use. ++ * ++ * @throws IllegalArgumentException If tabPlacement is not one of TOP, ++ * BOTTOM, LEFT, or RIGHT. ++ */ ++ public void setTabPlacement(int tabPlacement) ++ { ++ if (tabPlacement != TOP && tabPlacement != BOTTOM && tabPlacement != RIGHT ++ && tabPlacement != LEFT) ++ throw new IllegalArgumentException("tabPlacement is not valid."); ++ if (tabPlacement != this.tabPlacement) ++ { ++ int oldPlacement = this.tabPlacement; ++ this.tabPlacement = tabPlacement; ++ firePropertyChange(TAB_PLACEMENT_CHANGED_PROPERTY, oldPlacement, ++ this.tabPlacement); ++ } ++ } ++ ++ /** ++ * This method returns the tabLayoutPolicy. ++ * ++ * @return The tabLayoutPolicy. ++ */ ++ public int getTabLayoutPolicy() ++ { ++ return layoutPolicy; ++ } ++ ++ /** ++ * This method changes the tabLayoutPolicy property of the JTabbedPane. ++ * ++ * @param tabLayoutPolicy The tabLayoutPolicy to use. ++ * ++ * @throws IllegalArgumentException If tabLayoutPolicy is not one of ++ * SCROLL_TAB_LAYOUT or WRAP_TAB_LAYOUT. ++ */ ++ public void setTabLayoutPolicy(int tabLayoutPolicy) ++ { ++ if (tabLayoutPolicy != SCROLL_TAB_LAYOUT ++ && tabLayoutPolicy != WRAP_TAB_LAYOUT) ++ throw new IllegalArgumentException("tabLayoutPolicy is not valid."); ++ if (tabLayoutPolicy != layoutPolicy) ++ { ++ int oldPolicy = layoutPolicy; ++ layoutPolicy = tabLayoutPolicy; ++ firePropertyChange(TAB_LAYOUT_POLICY_CHANGED_PROPERTY, oldPolicy, ++ layoutPolicy); ++ } ++ } ++ ++ /** ++ * This method returns the index of the tab that is currently selected. ++ * ++ * @return The index of the selected tab. ++ */ ++ public int getSelectedIndex() ++ { ++ return model.getSelectedIndex(); ++ } ++ ++ /** ++ * This method checks the index. ++ * ++ * @param index The index to check. ++ * @param start DOCUMENT ME! ++ * @param end DOCUMENT ME! ++ * ++ * @throws IndexOutOfBoundsException DOCUMENT ME! ++ */ ++ private void checkIndex(int index, int start, int end) ++ { ++ if (index < start || index >= end) ++ throw new IndexOutOfBoundsException("Index < " + start + " || Index >= " ++ + end); ++ } ++ ++ /** ++ * This method sets the selected index. This method will hide the old ++ * component and show the new component. ++ * ++ * @param index The index to set it at. ++ */ ++ public void setSelectedIndex(int index) ++ { ++ checkIndex(index, -1, tabs.size()); ++ if (index != getSelectedIndex()) ++ { ++ if (getSelectedIndex() != -1 && getSelectedComponent() != null) ++ getSelectedComponent().hide(); ++ if (index != -1 && getComponentAt(index) != null) ++ getComponentAt(index).show(); ++ model.setSelectedIndex(index); ++ } ++ } ++ ++ /** ++ * This method returns the component at the selected index. ++ * ++ * @return The component at the selected index. ++ */ ++ public Component getSelectedComponent() ++ { ++ return getComponentAt(getSelectedIndex()); ++ } ++ ++ /** ++ * This method sets the component at the selected index. ++ * ++ * @param c The component associated with the selected index. ++ */ ++ public void setSelectedComponent(Component c) ++ { ++ if (c.getParent() == this) ++ setSelectedIndex(indexOfComponent(c)); ++ else ++ setComponentAt(getSelectedIndex(), c); ++ } ++ ++ /** ++ * This method inserts tabs into JTabbedPane. This includes adding the ++ * component to the JTabbedPane and hiding it. ++ * ++ * @param title The title of the tab. ++ * @param icon The tab's icon. ++ * @param component The component associated with the tab. ++ * @param tip The tooltip for the tab. ++ * @param index The index to insert the tab at. ++ */ ++ public void insertTab(String title, Icon icon, Component component, ++ String tip, int index) ++ { ++ Page p = new Page(title, icon, component, tip); ++ tabs.insertElementAt(p, index); ++ ++ // Hide the component so we don't see it. Do it before we parent it ++ // so we don't trigger a repaint. ++ if (component != null) ++ { ++ component.hide(); ++ super.add(component); ++ } ++ ++ if (getSelectedIndex() == -1) ++ setSelectedIndex(0); ++ ++ layout(); ++ repaint(); ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. ++ * ++ * @param title The title of the tab. ++ * @param icon The icon for the tab. ++ * @param component The associated component. ++ * @param tip The associated tooltip. ++ */ ++ public void addTab(String title, Icon icon, Component component, String tip) ++ { ++ insertTab(title, icon, component, tip, tabs.size()); ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. ++ * ++ * @param title The title of the tab. ++ * @param icon The icon for the tab. ++ * @param component The associated component. ++ */ ++ public void addTab(String title, Icon icon, Component component) ++ { ++ insertTab(title, icon, component, null, tabs.size()); ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. ++ * ++ * @param title The title of the tab. ++ * @param component The associated component. ++ */ ++ public void addTab(String title, Component component) ++ { ++ insertTab(title, null, component, null, tabs.size()); ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. The title of the tab is the ++ * Component's name. If the Component is an instance of UIResource, it ++ * doesn't add the tab and instead add the component directly to the ++ * JTabbedPane. ++ * ++ * @param component The associated component. ++ * ++ * @return The Component that was added. ++ */ ++ public Component add(Component component) ++ { ++ if (component instanceof UIResource) ++ super.add(component); ++ else ++ insertTab(component.getName(), null, component, null, tabs.size()); ++ return component; ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. If the Component is an ++ * instance of UIResource, it doesn't add the tab and instead add the ++ * component directly to the JTabbedPane. ++ * ++ * @param title The title of the tab. ++ * @param component The associated component. ++ * ++ * @return The Component that was added. ++ */ ++ public Component add(String title, Component component) ++ { ++ if (component instanceof UIResource) ++ super.add(component); ++ else ++ insertTab(title, null, component, null, tabs.size()); ++ return component; ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. If the Component is an ++ * instance of UIResource, it doesn't add the tab and instead add the ++ * component directly to the JTabbedPane. ++ * ++ * @param component The associated component. ++ * @param index The index to insert the tab at. ++ * ++ * @return The Component that was added. ++ */ ++ public Component add(Component component, int index) ++ { ++ if (component instanceof UIResource) ++ super.add(component); ++ else ++ insertTab(component.getName(), null, component, null, index); ++ return component; ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. If the Component is an ++ * instance of UIResource, it doesn't add the tab and instead add the ++ * component directly to the JTabbedPane. If the constraints object is an ++ * icon, it will be used as the tab's icon. If the constraints object is a ++ * string, we will use it as the title. ++ * ++ * @param component The associated component. ++ * @param constraints The constraints object. ++ */ ++ public void add(Component component, Object constraints) ++ { ++ add(component, constraints, tabs.size()); ++ } ++ ++ /** ++ * This method adds a tab to the JTabbedPane. If the Component is an ++ * instance of UIResource, it doesn't add the tab and instead add the ++ * component directly to the JTabbedPane. If the constraints object is an ++ * icon, it will be used as the tab's icon. If the constraints object is a ++ * string, we will use it as the title. ++ * ++ * @param component The associated component. ++ * @param constraints The constraints object. ++ * @param index The index to insert the tab at. ++ */ ++ public void add(Component component, Object constraints, int index) ++ { ++ if (component instanceof UIResource) ++ super.add(component); ++ else ++ { ++ if (constraints instanceof String) ++ insertTab((String) constraints, null, component, null, index); ++ else ++ insertTab(component.getName(), ++ (constraints instanceof Icon) ? (Icon) constraints : null, ++ component, null, index); ++ } ++ } ++ ++ /** ++ * The tab and it's associated component are removed. After the component ++ * has been removed from the JTabbedPane, it's set visible to ensure that ++ * it can be seen. ++ * ++ * @param index The index of the tab to remove. ++ */ ++ public void removeTabAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ Component c = getComponentAt(index); ++ super.remove(index); ++ c.show(); ++ tabs.remove(index); ++ } ++ ++ /** ++ * This method removes the component from the JTabbedPane. After the ++ * component has been removed from the JTabbedPane, it's set visible to ++ * ensure that it can be seen. ++ * ++ * @param component The Component to remove. ++ */ ++ public void remove(Component component) ++ { ++ // This simply removes the component. ++ int index = indexOfComponent(component); ++ super.remove(component); ++ component.show(); ++ setComponentAt(index, null); ++ } ++ ++ /** ++ * This method removes the tab and component from the JTabbedPane. It simply ++ * calls removeTabAt(int index). ++ * ++ * @param index The index of the tab to remove. ++ */ ++ public void remove(int index) ++ { ++ removeTabAt(index); ++ } ++ ++ /** ++ * This method removes all tabs and associated components from the ++ * JTabbedPane. ++ */ ++ public void removeAll() ++ { ++ for (int i = tabs.size() - 1; i >= 0; i--) ++ removeTabAt(i); ++ } ++ ++ /** ++ * This method returns how many tabs are in the JTabbedPane. ++ * ++ * @return The number of tabs in the JTabbedPane. ++ */ ++ public int getTabCount() ++ { ++ return tabs.size(); ++ } ++ ++ /** ++ * This method returns the number of runs used to paint the JTabbedPane. ++ * ++ * @return The number of runs. ++ */ ++ public int getTabRunCount() ++ { ++ return ((TabbedPaneUI) ui).getTabRunCount(this); ++ } ++ ++ /** ++ * This method returns the tab title given the index. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The title for the tab. ++ */ ++ public String getTitleAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getTitle(); ++ } ++ ++ /** ++ * This method returns the active icon given the index. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The active icon for the tab. ++ */ ++ public Icon getIconAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getIcon(); ++ } ++ ++ /** ++ * This method returns the disabled icon given the index. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The disabled icon for the tab. ++ */ ++ public Icon getDisabledIconAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getDisabledIcon(); ++ } ++ ++ /** ++ * This method returns the tooltip string for the tab. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The tooltip string for the tab. ++ */ ++ public String getToolTipTextAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getTip(); ++ } ++ ++ /** ++ * This method returns the foreground color for the tab. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The foreground color for the tab. ++ */ ++ public Color getForegroundAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getForeground(); ++ } ++ ++ /** ++ * This method returns the background color for the tab. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The background color for the tab. ++ */ ++ public Color getBackgroundAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getBackground(); ++ } ++ ++ /** ++ * This method returns the component associated with the tab. ++ * ++ * @param index The index of the tab. ++ * ++ * @return The component associated with the tab. ++ */ ++ public Component getComponentAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).getComponent(); ++ } ++ ++ /** ++ * This method returns whether this tab is enabled. Disabled tabs cannot be ++ * selected. ++ * ++ * @param index The index of the tab. ++ * ++ * @return Whether the tab is enabled. ++ */ ++ public boolean isEnabledAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((Page) tabs.elementAt(index)).isEnabled(); ++ } ++ ++ /** ++ * This method returns the mnemonic for the tab. ++ * ++ * @param tabIndex The index of the tab. ++ * ++ * @return The mnemonic for the tab. ++ */ ++ public int getMnemonicAt(int tabIndex) ++ { ++ checkIndex(tabIndex, 0, tabs.size()); ++ return ((Page) tabs.elementAt(tabIndex)).getMnemonic(); ++ } ++ ++ /** ++ * This method returns the mnemonic index for the tab. ++ * ++ * @param tabIndex The index of the tab. ++ * ++ * @return The mnemonic index for the tab. ++ */ ++ public int getDisplayedMnemonicIndexAt(int tabIndex) ++ { ++ checkIndex(tabIndex, 0, tabs.size()); ++ return ((Page) tabs.elementAt(tabIndex)).getDisplayedMnemonicIndex(); ++ } ++ ++ /** ++ * This method returns the bounds of the tab given the index. ++ * ++ * @param index The index of the tab. ++ * ++ * @return A rectangle describing the bounds of the tab. ++ */ ++ public Rectangle getBoundsAt(int index) ++ { ++ checkIndex(index, 0, tabs.size()); ++ return ((TabbedPaneUI) ui).getTabBounds(this, index); ++ } ++ ++ /** ++ * This method sets the title of the tab. ++ * ++ * @param index The index of the tab. ++ * @param title The new title. ++ */ ++ public void setTitleAt(int index, String title) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setTitle(title); ++ } ++ ++ /** ++ * This method sets the icon of the tab. ++ * ++ * @param index The index of the tab. ++ * @param icon The new icon. ++ */ ++ public void setIconAt(int index, Icon icon) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setIcon(icon); ++ } ++ ++ /** ++ * This method sets the disabled icon of the tab. ++ * ++ * @param index The index of the tab. ++ * @param disabledIcon The new disabled icon. ++ */ ++ public void setDisabledIconAt(int index, Icon disabledIcon) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setDisabledIcon(disabledIcon); ++ } ++ ++ /** ++ * This method sets the tooltip text of the tab. ++ * ++ * @param index The index of the tab. ++ * @param toolTipText The tooltip text. ++ */ ++ public void setToolTipTextAt(int index, String toolTipText) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setTip(toolTipText); ++ } ++ ++ /** ++ * This method sets the background color of the tab. ++ * ++ * @param index The index of the tab. ++ * @param background The background color of the tab. ++ */ ++ public void setBackgroundAt(int index, Color background) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setBackground(background); ++ } ++ ++ /** ++ * This method sets the foreground color of the tab. ++ * ++ * @param index The index of the tab. ++ * @param foreground The foreground color of the tab. ++ */ ++ public void setForegroundAt(int index, Color foreground) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setForeground(foreground); ++ } ++ ++ /** ++ * This method sets whether the tab is enabled. ++ * ++ * @param index The index of the tab. ++ * @param enabled Whether the tab is enabled. ++ */ ++ public void setEnabledAt(int index, boolean enabled) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setEnabled(enabled); ++ } ++ ++ /** ++ * This method sets the component associated with the tab. ++ * ++ * @param index The index of the tab. ++ * @param component The component associated with the tab. ++ */ ++ public void setComponentAt(int index, Component component) ++ { ++ checkIndex(index, 0, tabs.size()); ++ ((Page) tabs.elementAt(index)).setComponent(component); ++ } ++ ++ /** ++ * This method sets the displayed mnemonic index of the tab. ++ * ++ * @param tabIndex The index of the tab. ++ * @param mnemonicIndex The mnemonic index. ++ */ ++ public void setDisplayedMnemonicIndexAt(int tabIndex, int mnemonicIndex) ++ { ++ checkIndex(tabIndex, 0, tabs.size()); ++ ((Page) tabs.elementAt(tabIndex)).setDisplayedMnemonicIndex(mnemonicIndex); ++ } ++ ++ /** ++ * This method sets the mnemonic for the tab. ++ * ++ * @param tabIndex The index of the tab. ++ * @param mnemonic The mnemonic. ++ */ ++ public void setMnemonicAt(int tabIndex, int mnemonic) ++ { ++ checkIndex(tabIndex, 0, tabs.size()); ++ ((Page) tabs.elementAt(tabIndex)).setMnemonic(mnemonic); ++ } ++ ++ /** ++ * This method finds the index of a tab given the title. ++ * ++ * @param title The title that belongs to a tab. ++ * ++ * @return The index of the tab that has the title or -1 if not found. ++ */ ++ public int indexOfTab(String title) ++ { ++ int index = -1; ++ for (int i = 0; i < tabs.size(); i++) ++ { ++ if (((Page) tabs.elementAt(i)).getTitle().equals(title)) ++ { ++ index = i; ++ break; ++ } ++ } ++ return index; ++ } ++ ++ /** ++ * This method finds the index of a tab given the icon. ++ * ++ * @param icon The icon that belongs to a tab. ++ * ++ * @return The index of the tab that has the icon or -1 if not found. ++ */ ++ public int indexOfTab(Icon icon) ++ { ++ int index = -1; ++ for (int i = 0; i < tabs.size(); i++) ++ { ++ if (((Page) tabs.elementAt(i)).getIcon() == icon) ++ { ++ index = i; ++ break; ++ } ++ } ++ return index; ++ } ++ ++ /** ++ * This method finds the index of a tab given the component. ++ * ++ * @param component A component associated with a tab. ++ * ++ * @return The index of the tab that has this component or -1 if not found. ++ */ ++ public int indexOfComponent(Component component) ++ { ++ int index = -1; ++ for (int i = 0; i < tabs.size(); i++) ++ { ++ if (((Page) tabs.elementAt(i)).getComponent() == component) ++ { ++ index = i; ++ break; ++ } ++ } ++ return index; ++ } ++ ++ /** ++ * This method returns a tab index given an (x,y) location. The origin of ++ * the (x,y) pair will be the JTabbedPane's top left position. The tab ++ * returned will be the one that contains the point. This method is ++ * delegated to the UI. ++ * ++ * @param x The x coordinate of the point. ++ * @param y The y coordinate of the point. ++ * ++ * @return The index of the tab that contains the point. ++ */ ++ public int indexAtLocation(int x, int y) ++ { ++ return ((TabbedPaneUI) ui).tabForCoordinate(this, x, y); ++ } ++ ++ /** ++ * This method returns the tooltip text given a mouse event. ++ * ++ * @param event The mouse event. ++ * ++ * @return The tool tip text that is associated with this mouse event. ++ */ ++ public String getToolTipText(MouseEvent event) ++ { ++ int index = indexAtLocation(event.getX(), event.getY()); ++ return ((Page) tabs.elementAt(index)).getTip(); ++ } ++ ++ /** ++ * This method returns a string representation of this JTabbedPane. It is ++ * mainly used for debugging purposes. ++ * ++ * @return A string representation of this JTabbedPane. ++ */ ++ protected String paramString() ++ { ++ return "JTabbedPane"; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJTabbedPane(); ++ return accessibleContext; ++ } + } +Index: javax/swing/JTable.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JTable.java,v +retrieving revision 1.4 +diff -u -r1.4 JTable.java +--- javax/swing/JTable.java 11 Jun 2003 13:20:39 -0000 1.4 ++++ javax/swing/JTable.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ + /* JTable.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,169 +42,1520 @@ + import java.awt.Component; + import java.awt.Dimension; + import java.awt.Rectangle; +-import java.util.Hashtable; + import java.util.Vector; ++import java.util.Hashtable; ++ + import javax.accessibility.Accessible; +-import javax.swing.event.ChangeEvent; ++import javax.accessibility.AccessibleContext; + import javax.swing.event.CellEditorListener; ++import javax.swing.event.ChangeEvent; + import javax.swing.event.ListSelectionEvent; + import javax.swing.event.ListSelectionListener; + import javax.swing.event.TableColumnModelEvent; + import javax.swing.event.TableColumnModelListener; + import javax.swing.event.TableModelEvent; + import javax.swing.event.TableModelListener; ++import javax.swing.plaf.TableUI; ++import javax.swing.table.DefaultTableColumnModel; ++import javax.swing.table.DefaultTableCellRenderer; ++import javax.swing.table.DefaultTableModel; + import javax.swing.table.JTableHeader; +-import javax.swing.table.TableModel; + import javax.swing.table.TableCellEditor; ++import javax.swing.table.TableCellRenderer; ++import javax.swing.table.TableColumn; + import javax.swing.table.TableColumnModel; ++import javax.swing.table.TableModel; + + public class JTable extends JComponent + implements TableModelListener, Scrollable, TableColumnModelListener, + ListSelectionListener, CellEditorListener, Accessible + { +- public static final int AUTO_RESIZE_ALL_COLUMNS = 4; +- public static final int AUTO_RESIZE_LAST_COLUMN = 3; +- public static final int AUTO_RESIZE_NEXT_COLUMN = 1; ++ private static final long serialVersionUID = 3876025080382781659L; ++ ++ ++ /** ++ * When resizing columns, do not automatically change any columns. In this ++ * case the table should be enclosed in a {@link JScrollPane} in order to ++ * accomodate cases in which the table size exceeds its visible area. ++ */ + public static final int AUTO_RESIZE_OFF = 0; ++ ++ /** ++ * When resizing column i, automatically change only the ++ * single column i+1 to provide or absorb excess space ++ * requirements. ++ */ ++ public static final int AUTO_RESIZE_NEXT_COLUMN = 1; ++ ++ /** ++ * When resizing column i in a table of n ++ * columns, automatically change all columns in the range [i+1, ++ * n), uniformly, to provide or absorb excess space requirements. ++ */ + public static final int AUTO_RESIZE_SUBSEQUENT_COLUMNS = 2; + ++ /** ++ * When resizing column i in a table of n ++ * columns, automatically change all columns in the range [0, ++ * n) (with the exception of column i) uniformly, to provide or ++ * absorb excess space requirements. ++ */ ++ public static final int AUTO_RESIZE_ALL_COLUMNS = 4; ++ ++ /** ++ * When resizing column i in a table of n ++ * columns, automatically change column n-1 (the last column ++ * in the table) to provide or absorb excess space requirements. ++ */ ++ public static final int AUTO_RESIZE_LAST_COLUMN = 3; ++ ++ ++ /** ++ * A table mapping {@link java.lang.Class} objects to ++ * {@link TableCellEditor} objects. This table is consulted by the ++ * ++ */ ++ protected Hashtable defaultEditorsByColumnClass; ++ protected Hashtable defaultRenderersByColumnClass; ++ protected int editingColumn; ++ protected int editingRow; ++ ++ /** ++ * Whether or not the table should automatically compute a matching ++ * {@link TableColumnModel} and assign it to the {@link #columnModel} ++ * property when the {@link #dataModel} property is changed. ++ * ++ * @see #setModel() ++ * @see #createColumnsFromModel() ++ * @see #setColumnModel() ++ * @see #setAutoCreateColumnsFromModel() ++ * @see #getAutoCreateColumnsFromModel() ++ */ ++ protected boolean autoCreateColumnsFromModel; ++ ++ /** ++ * A numeric code specifying the resizing behavior of the table. Must be ++ * one of {@link #AUTO_RESIZE_ALL_COLUMNS} (the default), {@link ++ * #AUTO_RESIZE_LAST_COLUMN}, {@link #AUTO_RESIZE_NEXT_COLUMN}, {@link ++ * #AUTO_RESIZE_SUBSEQUENT_COLUMNS}, or {@link #AUTO_RESIZE_OFF}. ++ * ++ * @see #doLayout() ++ * @see #setAutoResizeMode() ++ * @see #getAutoResizeMode() ++ */ ++ protected int autoResizeMode; ++ ++ /** ++ * The height in pixels of any row of the table. All rows in a table are ++ * of uniform height. This differs from column width, which varies on a ++ * per-column basis, and is stored in the individual columns of the ++ * {@link #columnModel}. ++ * ++ * @see #getRowHeight() ++ * @see #setRowHeight() ++ * @see TableColumn#getWidth() ++ * @see TableColumn#setWidth() ++ */ ++ protected int rowHeight; ++ ++ /** ++ * The height in pixels of the gap left between any two rows of the table. ++ * ++ * @see #setRowMargin() ++ * @see #getRowHeight() ++ * @see #getInterCellSpacing() ++ * @see #setInterCellSpacing() ++ * @see TableColumnModel#getColumnMargin() ++ * @see TableColumnModel#setColumnMargin() ++ */ ++ protected int rowMargin; ++ ++ /** ++ * Whether or not the table should allow row selection. If the table ++ * allows both row and column selection, it is said to allow ++ * "cell selection". Previous versions of the JDK supported cell ++ * selection as an independent concept, but it is now represented solely ++ * in terms of simultaneous row and column selection. ++ * ++ * @see TableColumnModel#columnSelectionAllowed() ++ * @see #setRowSelectionAllowed() ++ * @see #getRowSelectionAllowed() ++ * @see #getCellSelectionEnabled() ++ * @see #setCellSelectionEnabled() ++ */ ++ protected boolean rowSelectionAllowed; ++ ++ /** ++ * @deprecated Use {@link #rowSelectionAllowed}, {@link ++ * #columnSelectionAllowed}, or the combined methods {@link ++ * getCellSelectionEnabled} and {@link setCellSelectionEnabled}. ++ */ ++ protected boolean cellSelectionEnabled; ++ ++ /** ++ * The model for data stored in the table. Confusingly, the published API ++ * requires that this field be called dataModel, despite its ++ * property name. The table listens to its model as a {@link ++ * TableModelListener}. ++ * ++ * @see #tableChanged() ++ * @see TableModel#addTableModelListener() ++ */ ++ protected TableModel dataModel; ++ ++ /** ++ *

    A model of various aspects of the columns of the table, not ++ * including the data stored in them. The {@link TableColumnModel} ++ * is principally concerned with holding a set of {@link TableColumn} ++ * objects, each of which describes the display parameters of a column ++ * and the numeric index of the column from the data model which the ++ * column is presenting.

    ++ * ++ *

    The TableColumnModel also contains a {@link ListSelectionModel} which ++ * indicates which columns are currently selected. This selection model ++ * works in combination with the {@link selectionModel} of the table ++ * itself to specify a table selection: a combination of row and ++ * column selections.

    ++ * ++ *

    Most application programmers do not need to work with this property ++ * at all: setting {@link #autoCreateColumnsFromModel} will construct the ++ * columnModel automatically, and the table acts as a facade for most of ++ * the interesting properties of the columnModel anyways.

    ++ * ++ * @see #setColumnModel() ++ * @see #getColumnModel() ++ */ ++ protected TableColumnModel columnModel; ++ ++ /** ++ * A model of the rows of this table which are currently selected. This ++ * model is used in combination with the column selection model held as a ++ * member of the {@link columnModel} property, to represent the rows and ++ * columns (or both: cells) of the table which are currently selected. ++ * ++ * @see #rowSelectionAllowed ++ * @see #setSelectionModel() ++ * @see #getSelectionModel() ++ * @see TableColumnModel#getSelectionModel() ++ * @see ListSelectionModel#addListSelectionListener() ++ */ ++ protected ListSelectionModel selectionModel; ++ ++ /** ++ * The accessibleContext property. ++ */ ++ protected AccessibleContext accessibleContext; ++ ++ /** ++ * The current cell editor. ++ */ ++ protected TableCellEditor cellEditor; ++ ++ /** ++ * Whether or not drag-and-drop is enabled on this table. ++ * ++ * @see #setDragEnabled() ++ * @see #getDragEnabled() ++ */ ++ protected boolean dragEnabled; ++ ++ /** ++ * The color to paint the grid lines of the table, when either {@link ++ * #showHorizontalLines} or {@link #showVerticalLines} is set. ++ * ++ * @see #setGridColor() ++ * @see #getGridColor() ++ */ ++ protected Color gridColor; ++ ++ /** ++ * The size this table would prefer its viewport assume, if it is ++ * contained in a {@link JScrollPane}. ++ * ++ * @see #setPreferredScrollableViewportSize() ++ * @see #getPreferredScrollableViewportSize() ++ */ ++ protected Dimension preferredScrollableViewportSize; ++ ++ /** ++ * The color to paint the background of selected cells. Fires a property ++ * change event with name {@link #SELECTION_BACKGROUND_CHANGED_PROPERTY} ++ * when its value changes. ++ * ++ * @see #setSelectionBackground() ++ * @see #getSelectionBackground() ++ */ ++ Color selectionBackground; ++ ++ /** ++ * The name carried in property change events when the {@link ++ * #selectionBackground} property changes. ++ */ ++ private static final String SELECTION_BACKGROUND_CHANGED_PROPERTY = "selectionBackground"; ++ ++ /** ++ * The color to paint the foreground of selected cells. Fires a property ++ * change event with name {@link #SELECTION_FOREGROUND_CHANGED_PROPERTY} ++ * when its value changes. ++ * ++ * @see #setSelectionForeground() ++ * @see #getSelectionForeground() ++ */ ++ Color selectionForeground; ++ ++ /** ++ * The name carried in property change events when the ++ * {@link #selectionForeground} property changes. ++ */ ++ private static final String SELECTION_FOREGROUND_CHANGED_PROPERTY = "selectionForeground"; ++ ++ /** ++ * The showHorizontalLines property. ++ */ ++ protected boolean showHorizontalLines; ++ ++ /** ++ * The showVerticalLines property. ++ */ ++ protected boolean showVerticalLines; ++ ++ /** ++ * The tableHeader property. ++ */ ++ protected JTableHeader tableHeader; ++ ++ ++ /** ++ * Creates a new JTable instance. ++ */ + public JTable () + { +- throw new Error ("Not implemented"); ++ this(null, null, null); + } + ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param numRows an int value ++ * @param numColumns an int value ++ */ + public JTable (int numRows, int numColumns) + { +- throw new Error ("Not implemented"); ++ this(new DefaultTableModel(numRows, numColumns)); + } + +- public JTable (Object[][] rowData, Object[] columnNames) ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param data an Object[][] value ++ * @param columnNames an Object[] value ++ */ ++ public JTable(Object[][] data, Object[] columnNames) + { +- throw new Error ("Not implemented"); ++ this(new DefaultTableModel(data, columnNames)); + } + ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param dm a TableModel value ++ */ + public JTable (TableModel dm) + { +- throw new Error ("Not implemented"); ++ this(dm, null, null); + } + ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param dm a TableModel value ++ * @param cm a TableColumnModel value ++ */ + public JTable (TableModel dm, TableColumnModel cm) + { +- throw new Error ("Not implemented"); ++ this(dm, cm, null); + } + ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param dm a TableModel value ++ * @param cm a TableColumnModel value ++ * @param sm a ListSelectionModel value ++ */ + public JTable (TableModel dm, TableColumnModel cm, ListSelectionModel sm) + { +- throw new Error ("Not implemented"); ++ this.dataModel = dm == null ? createDefaultDataModel() : dm; ++ setSelectionModel(sm == null ? createDefaultListSelectionModel() : sm); ++ ++ this.columnModel = cm; ++ this.autoCreateColumnsFromModel = false; ++ if (cm == null) ++ { ++ this.autoCreateColumnsFromModel = true; ++ createColumnsFromModel(); ++ } ++ this.columnModel.addColumnModelListener(this); ++ ++ this.defaultRenderersByColumnClass = new Hashtable(); ++ this.defaultEditorsByColumnClass = new Hashtable(); ++ ++ this.autoResizeMode = AUTO_RESIZE_ALL_COLUMNS; ++ this.rowHeight = 16; ++ this.rowMargin = 1; ++ this.rowSelectionAllowed = true; ++ // this.accessibleContext = new AccessibleJTable(); ++ this.cellEditor = null; ++ this.dragEnabled = false; ++ this.preferredScrollableViewportSize = new Dimension(450,400); ++ this.showHorizontalLines = true; ++ this.showVerticalLines = true; ++ setInterCellSpacing(new Dimension(1,1)); ++ setTableHeader(new JTableHeader(columnModel)); ++ updateUI(); ++ } ++ ++ /** ++ * Creates a new JTable instance. ++ * ++ * @param data a Vector value ++ * @param columnNames a Vector value ++ */ ++ public JTable(Vector data, Vector columnNames) ++ { ++ this(new DefaultTableModel(data, columnNames)); ++ } ++ ++ /** ++ * @deprecated 1.0.2, replaced by new JScrollPane(JTable) ++ */ ++ public static JScrollPane createScrollPaneForTable(JTable table) ++ { ++ return new JScrollPane(table); ++ } ++ ++ protected TableColumnModel createDefaultColumnModel() ++ { ++ return new DefaultTableColumnModel(); ++ } ++ ++ protected TableModel createDefaultDataModel() ++ { ++ return new DefaultTableModel(); + } + +- public JTable (Vector rowData, Vector columnNames) ++ protected ListSelectionModel createDefaultListSelectionModel() + { +- throw new Error ("Not implemented"); ++ return new DefaultListSelectionModel(); + } + ++ private void createColumnsFromModel() ++ { ++ if (dataModel == null) ++ return; ++ ++ TableColumnModel cm = createDefaultColumnModel(); ++ ++ for (int i = 0; i < dataModel.getColumnCount(); ++i) ++ { ++ cm.addColumn(new TableColumn(i)); ++ } ++ this.setColumnModel(cm); ++ } ++ ++ // listener support ++ + public void columnAdded (TableColumnModelEvent event) + { +- throw new Error ("Not implemented"); ++ revalidate(); ++ repaint(); + } + + public void columnMarginChanged (ChangeEvent event) + { +- throw new Error ("Not implemented"); ++ revalidate(); ++ repaint(); + } +- ++ + public void columnMoved (TableColumnModelEvent event) + { +- throw new Error ("Not implemented"); ++ revalidate(); ++ repaint(); + } +- ++ + public void columnRemoved (TableColumnModelEvent event) + { +- throw new Error ("Not implemented"); ++ revalidate(); ++ repaint(); + } + + public void columnSelectionChanged (ListSelectionEvent event) + { +- throw new Error ("Not implemented"); ++ repaint(); + } +- ++ + public void editingCanceled (ChangeEvent event) + { +- throw new Error ("Not implemented"); ++ repaint(); + } + + public void editingStopped (ChangeEvent event) + { +- throw new Error ("Not implemented"); ++ repaint(); + } + +- public TableColumnModel getColumnModel () +- { +- throw new Error ("Not implemented"); +- } +- +- public Dimension getPreferredScrollableViewportSize () ++ public void tableChanged (TableModelEvent event) + { +- throw new Error ("Not implemented"); ++ repaint(); + } + +- public int getScrollableBlockIncrement (Rectangle visibleRect, int orientation, int direction) ++ public void valueChanged (ListSelectionEvent event) + { +- throw new Error ("Not implemented"); ++ repaint(); + } + +- public boolean getScrollableTracksViewportHeight () ++ ++ /** ++ * Calculate the visible rectangle for a particular row and column. The ++ * row and column are specified in visual terms; the column may not match ++ * the {@link #dataModel} column. ++ * ++ * @param row the visible row to get the cell rectangle of ++ * ++ * @param column the visible column to get the cell rectangle of, which may ++ * differ from the {@link #dataModel} column ++ * ++ * @param includeSpacing whether or not to include the cell margins in the ++ * resulting cell. If false, the result will only contain the ++ * inner area of the target cell, not including its margins. ++ * ++ * @return a rectangle enclosing the specified cell ++ */ ++ public Rectangle getCellRect(int row, ++ int column, ++ boolean includeSpacing) ++ { ++ int height = getHeight(); ++ int width = columnModel.getColumn(column).getWidth(); ++ int x_gap = columnModel.getColumnMargin(); ++ int y_gap = rowMargin; ++ ++ column = Math.max(0, Math.min(column, getColumnCount() - 1)); ++ row = Math.max(0, Math.min(row, getRowCount() - 1)); ++ ++ int x = 0; ++ int y = (height + y_gap) * row; ++ ++ for (int i = 0; i < column; ++i) ++ { ++ x += columnModel.getColumn(i).getWidth(); ++ x += x_gap; ++ } ++ ++ if (includeSpacing) ++ return new Rectangle(x, y, width, height); ++ else ++ return new Rectangle(x, y, width - x_gap, height - y_gap); ++ } ++ ++ public void clearSelection() ++ { ++ selectionModel.clearSelection(); ++ } ++ ++ /** ++ * Get the value of the {@link #selectedRow} property by delegation to ++ * the {@link ListSelectionModel#getMinSelectionIndex} method of the ++ * {@link #selectionModel} field. ++ * ++ * @return The current value of the selectedRow property ++ */ ++ public int getSelectedRow () + { +- throw new Error ("Not implemented"); ++ return selectionModel.getMinSelectionIndex(); + } + +- public boolean getScrollableTracksViewportWidth () ++ /** ++ * Get the value of the {@link #selectionModel} property. ++ * ++ * @return The current value of the property ++ */ ++ public ListSelectionModel getSelectionModel() + { +- throw new Error ("Not implemented"); +- } ++ if (! rowSelectionAllowed) ++ return null; + +- public int getScrollableUnitIncrement (Rectangle visibleRect, int orientation, int direction) ++ return selectionModel; ++ } ++ ++ public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) + { +- throw new Error ("Not implemented"); ++ if (orientation == SwingConstants.VERTICAL) ++ return visibleRect.height * direction; ++ else ++ return visibleRect.width * direction; + } + +- public int getSelectedRow () ++ /** ++ * Get the value of the {@link #scrollableTracksViewportHeight} property. ++ * ++ * @return The constant value false ++ */ ++ ++ public boolean getScrollableTracksViewportHeight() + { +- throw new Error ("Not implemented"); ++ return false; + } + +- public ListSelectionModel getSelectionModel () +- { +- throw new Error ("Not implemented"); ++ /** ++ * Get the value of the {@link #scrollableTracksViewportWidth} property. ++ * ++ * @return true unless the {@link autoResizeMode} prperty is ++ * AUTO_RESIZE_OFF ++ */ ++ ++ public boolean getScrollableTracksViewportWidth() ++ { ++ if (autoResizeMode == AUTO_RESIZE_OFF) ++ return false; ++ else ++ return true; ++ } ++ ++ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) ++ { ++ // FIXME: I don't exactly know what sun does here. in both cases they ++ // pick values which do *not* simply expose the next cell in a given ++ // scroll direction. ++ ++ if (orientation == SwingConstants.VERTICAL) ++ return rowHeight; ++ else ++ { ++ int sum = 0; ++ for (int i = 0; i < getColumnCount(); ++i) ++ sum += columnModel.getColumn(0).getWidth(); ++ return getColumnCount() == 0 ? 10 : sum / getColumnCount(); ++ } ++ } ++ ++ ++ public TableCellEditor getCellEditor(int row, int column) ++ { ++ TableCellEditor editor = columnModel.getColumn(column).getCellEditor(); ++ ++ if (editor == null) ++ editor = getDefaultEditor(dataModel.getColumnClass(column)); ++ ++ return editor; ++ } ++ ++ public TableCellEditor getDefaultEditor(Class columnClass) ++ { ++ if (defaultEditorsByColumnClass.containsKey(columnClass)) ++ return (TableCellEditor) defaultEditorsByColumnClass.get(columnClass); ++ else ++ { ++ TableCellEditor r = new DefaultCellEditor(new JTextField()); ++ defaultEditorsByColumnClass.put(columnClass, r); ++ return r; ++ } ++ } ++ ++ ++ ++ public TableCellRenderer getCellRenderer(int row, int column) ++ { ++ TableCellRenderer renderer = ++ columnModel.getColumn(column).getCellRenderer(); ++ ++ if (renderer == null) ++ renderer = getDefaultRenderer(dataModel.getColumnClass(column)); ++ ++ return renderer; ++ } ++ ++ public TableCellRenderer getDefaultRenderer(Class columnClass) ++ { ++ if (defaultRenderersByColumnClass.containsKey(columnClass)) ++ return (TableCellRenderer) defaultRenderersByColumnClass.get(columnClass); ++ else ++ { ++ TableCellRenderer r = new DefaultTableCellRenderer(); ++ defaultRenderersByColumnClass.put(columnClass, r); ++ return r; ++ } ++ } ++ ++ public int convertColumnIndexToModel(int vc) ++ { ++ if (vc < 0) ++ return vc; ++ else if (vc > getColumnCount()) ++ return -1; ++ else ++ return columnModel.getColumn(vc).getModelIndex(); ++ } ++ ++ public int convertColumnIndexToView(int mc) ++ { ++ if (mc < 0) ++ return mc; ++ int ncols = getColumnCount(); ++ for (int vc = 0; vc < ncols; ++vc) ++ { ++ if (columnModel.getColumn(vc).getModelIndex() == mc) ++ return vc; ++ } ++ return -1; ++ } ++ ++ public Component prepareRenderer(TableCellRenderer renderer, ++ int row, ++ int column) ++ { ++ boolean rsa = getRowSelectionAllowed(); ++ boolean csa = getColumnSelectionAllowed(); ++ boolean rs = rsa ? getSelectionModel().isSelectedIndex(row) : false; ++ boolean cs = csa ? columnModel.getSelectionModel().isSelectedIndex(column) : false; ++ boolean isSelected = ((rsa && csa && rs && cs) ++ || (rsa && !csa && rs) ++ || (!rsa && csa && cs)); ++ ++ return renderer.getTableCellRendererComponent(this, ++ dataModel.getValueAt(row, ++ convertColumnIndexToView(column)), ++ isSelected, ++ false, // hasFocus ++ row, column); ++ } ++ ++ ++ /** ++ * Get the value of the {@link #autoCreateColumnsFromModel} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getAutoCreateColumnsFromModel() ++ { ++ return autoCreateColumnsFromModel; ++ } ++ ++ /** ++ * Get the value of the {@link #autoResizeMode} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getAutoResizeMode() ++ { ++ return autoResizeMode; ++ } ++ ++ /** ++ * Get the value of the {@link #rowHeight} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getRowHeight() ++ { ++ return rowHeight; ++ } ++ ++ /** ++ * Get the value of the {@link #rowMargin} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getRowMargin() ++ { ++ return rowMargin; ++ } ++ ++ /** ++ * Get the value of the {@link #rowSelectionAllowed} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getRowSelectionAllowed() ++ { ++ return rowSelectionAllowed; ++ } ++ ++ /** ++ * Get the value of the {@link #cellSelectionEnabled} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getCellSelectionEnabled() ++ { ++ return getColumnSelectionAllowed() && getRowSelectionAllowed(); ++ } ++ ++ /** ++ * Get the value of the {@link #dataModel} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableModel getModel() ++ { ++ return dataModel; ++ } ++ ++ /** ++ * Get the value of the {@link #columnCount} property by ++ * delegation to the @{link #dataModel} field. ++ * ++ * @return The current value of the columnCount property ++ */ ++ public int getColumnCount() ++ { ++ return dataModel.getColumnCount(); ++ } ++ ++ /** ++ * Get the value of the {@link #rowCount} property by ++ * delegation to the @{link #dataModel} field. ++ * ++ * @return The current value of the rowCount property ++ */ ++ public int getRowCount() ++ { ++ return dataModel.getRowCount(); ++ } ++ ++ /** ++ * Get the value of the {@link #columnModel} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableColumnModel getColumnModel() ++ { ++ return columnModel; ++ } ++ ++ /** ++ * Get the value of the {@link #selectedColumn} property by ++ * delegation to the @{link #columnModel} field. ++ * ++ * @return The current value of the selectedColumn property ++ */ ++ public int getSelectedColumn() ++ { ++ return columnModel.getSelectionModel().getMinSelectionIndex(); ++ } ++ ++ private static int countSelections(ListSelectionModel lsm) ++ { ++ int lo = lsm.getMinSelectionIndex(); ++ int hi = lsm.getMaxSelectionIndex(); ++ int sum = 0; ++ if (lo != -1 && hi != -1) ++ { ++ switch (lsm.getSelectionMode()) ++ { ++ case ListSelectionModel.SINGLE_SELECTION: ++ sum = 1; ++ break; ++ ++ case ListSelectionModel.SINGLE_INTERVAL_SELECTION: ++ sum = hi - lo; ++ break; ++ ++ case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: ++ for (int i = lo; i < hi; ++i) ++ if (lsm.isSelectedIndex(i)) ++ ++sum; ++ break; ++ } ++ } ++ return sum; ++ } ++ ++ private static int[] getSelections(ListSelectionModel lsm) ++ { ++ int sz = countSelections(lsm); ++ int [] ret = new int[sz]; ++ ++ int lo = lsm.getMinSelectionIndex(); ++ int hi = lsm.getMaxSelectionIndex(); ++ int j = 0; ++ java.util.ArrayList ls = new java.util.ArrayList(); ++ if (lo != -1 && hi != -1) ++ { ++ switch (lsm.getSelectionMode()) ++ { ++ case ListSelectionModel.SINGLE_SELECTION: ++ ret[0] = lo; ++ break; ++ ++ case ListSelectionModel.SINGLE_INTERVAL_SELECTION: ++ for (int i = lo; i < hi; ++i) ++ ret[j++] = i; ++ break; ++ ++ case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: ++ for (int i = lo; i < hi; ++i) ++ if (lsm.isSelectedIndex(i)) ++ ret[j++] = i; ++ break; ++ } ++ } ++ return ret; ++ } ++ ++ /** ++ * Get the value of the {@link #selectedColumnCount} property by ++ * delegation to the @{link #columnModel} field. ++ * ++ * @return The current value of the selectedColumnCount property ++ */ ++ public int getSelectedColumnCount() ++ { ++ return countSelections(columnModel.getSelectionModel()); ++ } ++ ++ /** ++ * Get the value of the {@link #selectedColumns} property by ++ * delegation to the @{link #columnModel} field. ++ * ++ * @return The current value of the selectedColumns property ++ */ ++ public int[] getSelectedColumns() ++ { ++ return getSelections(columnModel.getSelectionModel()); ++ } ++ ++ /** ++ * Get the value of the {@link #columnSelectionAllowed} property. ++ * ++ * @return The current value of the columnSelectionAllowed property ++ */ ++ public boolean getColumnSelectionAllowed() ++ { ++ return getColumnModel().getColumnSelectionAllowed(); ++ } ++ ++ /** ++ * Get the value of the {@link #selectedRowCount} property by ++ * delegation to the @{link #selectionModel} field. ++ * ++ * @return The current value of the selectedRowCount property ++ */ ++ public int getSelectedRowCount() ++ { ++ return countSelections(selectionModel); ++ } ++ ++ /** ++ * Get the value of the {@link #selectedRows} property by ++ * delegation to the @{link #selectionModel} field. ++ * ++ * @return The current value of the selectedRows property ++ */ ++ public int[] getSelectedRows() ++ { ++ return getSelections(selectionModel); ++ } ++ ++ /** ++ * Get the value of the {@link #accessibleContext} property. ++ * ++ * @return The current value of the property ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return accessibleContext; ++ } ++ ++ /** ++ * Get the value of the {@link #cellEditor} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableCellEditor getCellEditor() ++ { ++ return cellEditor; ++ } ++ ++ /** ++ * Get the value of the {@link #dragEnabled} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getDragEnabled() ++ { ++ return dragEnabled; ++ } ++ ++ /** ++ * Get the value of the {@link #gridColor} property. ++ * ++ * @return The current value of the property ++ */ ++ public Color getGridColor() ++ { ++ return gridColor; ++ } ++ ++ /** ++ * Get the value of the {@link #interCellSpacing} property. ++ * ++ * @return The current value of the property ++ */ ++ public Dimension getInterCellSpacing() ++ { ++ return new Dimension(columnModel.getColumnMargin(), rowMargin); ++ } ++ ++ /** ++ * Get the value of the {@link #preferredScrollableViewportSize} property. ++ * ++ * @return The current value of the property ++ */ ++ public Dimension getPreferredScrollableViewportSize() ++ { ++ return preferredScrollableViewportSize; ++ } ++ ++ /** ++ * Get the value of the {@link #selectionBackground} property. ++ * ++ * @return The current value of the property ++ */ ++ public Color getSelectionBackground() ++ { ++ return selectionBackground; ++ } ++ ++ /** ++ * Get the value of the {@link #selectionForeground} property. ++ * ++ * @return The current value of the property ++ */ ++ public Color getSelectionForeground() ++ { ++ return selectionForeground; ++ } ++ ++ /** ++ * Get the value of the {@link #showHorizontalLines} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getShowHorizontalLines() ++ { ++ return showHorizontalLines; ++ } ++ ++ /** ++ * Get the value of the {@link #showVerticalLines} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getShowVerticalLines() ++ { ++ return showVerticalLines; ++ } ++ ++ /** ++ * Get the value of the {@link #tableHeader} property. ++ * ++ * @return The current value of the property ++ */ ++ public JTableHeader getTableHeader() ++ { ++ return tableHeader; ++ } ++ ++ /** ++ * Set the value of the {@link #autoCreateColumnsFromModel} property. ++ * ++ * @param a The new value of the autoCreateColumnsFromModel property ++ */ ++ public void setAutoCreateColumnsFromModel(boolean a) ++ { ++ autoCreateColumnsFromModel = a; ++ } ++ ++ /** ++ * Set the value of the {@link #autoResizeMode} property. ++ * ++ * @param a The new value of the autoResizeMode property ++ */ ++ public void setAutoResizeMode(int a) ++ { ++ autoResizeMode = a; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #rowHeight} property. ++ * ++ * @param r The new value of the rowHeight property ++ */ ++ public void setRowHeight(int r) ++ { ++ rowHeight = r; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #rowMargin} property. ++ * ++ * @param r The new value of the rowMargin property ++ */ ++ public void setRowMargin(int r) ++ { ++ rowMargin = r; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #rowSelectionAllowed} property. ++ * ++ * @param r The new value of the rowSelectionAllowed property ++ */ ++ public void setRowSelectionAllowed(boolean r) ++ { ++ rowSelectionAllowed = r; ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #cellSelectionEnabled} property. ++ * ++ * @param c The new value of the cellSelectionEnabled property ++ */ ++ public void setCellSelectionEnabled(boolean c) ++ { ++ setColumnSelectionAllowed(c); ++ setRowSelectionAllowed(c); ++ // for backward-compatibility sake: ++ cellSelectionEnabled = true; ++ } ++ ++ /** ++ *

    Set the value of the {@link #dataModel} property.

    ++ * ++ *

    Unregister this as a {@link TableModelListener} from ++ * previous {@link #dataModel} and register it with new parameter ++ * m.

    ++ * ++ * @param m The new value of the model property ++ */ ++ public void setModel(TableModel m) ++ { ++ if (m == null) ++ throw new IllegalArgumentException(); ++ TableModel tmp = dataModel; ++ if (autoCreateColumnsFromModel) ++ createColumnsFromModel(); ++ if (tmp != null) ++ tmp.removeTableModelListener(this); ++ if (m != null) ++ m.addTableModelListener(this); ++ dataModel = m; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ *

    Set the value of the {@link #columnModel} property.

    ++ * ++ *

    Unregister this as a {@link TableColumnModelListener} ++ * from previous {@link #columnModel} and register it with new parameter ++ * c.

    ++ * ++ * @param c The new value of the columnModel property ++ */ ++ public void setColumnModel(TableColumnModel c) ++ { ++ if (c == null) ++ throw new IllegalArgumentException(); ++ TableColumnModel tmp = columnModel; ++ if (tmp != null) ++ tmp.removeColumnModelListener(this); ++ if (c != null) ++ c.addColumnModelListener(this); ++ columnModel = c; ++ if (dataModel != null && columnModel != null) ++ { ++ int ncols = getColumnCount(); ++ for (int i = 0; i < ncols; ++i) ++ columnModel.getColumn(i).setHeaderValue(dataModel.getColumnName(i)); ++ } ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #columnSelectionAllowed} property. ++ * ++ * @param c The new value of the property ++ */ ++ public void setColumnSelectionAllowed(boolean c) ++ { ++ getColumnModel().setColumnSelectionAllowed(c); ++ repaint(); ++ } ++ ++ /** ++ *

    Set the value of the {@link #selectionModel} property.

    ++ * ++ *

    Unregister this as a {@link ListSelectionListener} ++ * from previous {@link #selectionModel} and register it with new ++ * parameter s.

    ++ * ++ * @param s The new value of the selectionModel property ++ */ ++ public void setSelectionModel(ListSelectionModel s) ++ { ++ if (s == null) ++ throw new IllegalArgumentException(); ++ ListSelectionModel tmp = selectionModel; ++ if (tmp != null) ++ tmp.removeListSelectionListener(this); ++ if (s != null) ++ s.addListSelectionListener(this); ++ selectionModel = s; ++ } ++ ++ /** ++ * Set the value of the {@link #selectionMode} property by ++ * delegation to the {@link #selectionModel} field. ++ * ++ * @param s The new value of the property ++ */ ++ public void setSelectionMode(int s) ++ { ++ selectionModel.setSelectionMode(s); ++ repaint(); ++ } ++ ++ /** ++ *

    Set the value of the {@link #cellEditor} property.

    ++ * ++ *

    Unregister this as a {@link CellEditorListener} from ++ * previous {@link #cellEditor} and register it with new parameter ++ * c.

    ++ * ++ * @param c The new value of the cellEditor property ++ */ ++ public void setCellEditor(TableCellEditor c) ++ { ++ TableCellEditor tmp = cellEditor; ++ if (tmp != null) ++ tmp.removeCellEditorListener(this); ++ if (c != null) ++ c.addCellEditorListener(this); ++ cellEditor = c; ++ } ++ ++ /** ++ * Set the value of the {@link #dragEnabled} property. ++ * ++ * @param d The new value of the dragEnabled property ++ */ ++ public void setDragEnabled(boolean d) ++ { ++ dragEnabled = d; ++ } ++ ++ /** ++ * Set the value of the {@link #gridColor} property. ++ * ++ * @param g The new value of the gridColor property ++ */ ++ public void setGridColor(Color g) ++ { ++ gridColor = g; ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #interCellSpacing} property. ++ * ++ * @param i The new value of the interCellSpacing property ++ */ ++ public void setInterCellSpacing(Dimension i) ++ { ++ rowMargin = i.height; ++ columnModel.setColumnMargin(i.width); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #preferredScrollableViewportSize} property. ++ * ++ * @param p The new value of the preferredScrollableViewportSize property ++ */ ++ public void setPreferredScrollableViewportSize(Dimension p) ++ { ++ preferredScrollableViewportSize = p; ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ *

    Set the value of the {@link #selectionBackground} property.

    ++ * ++ *

    Fire a PropertyChangeEvent with name {@link ++ * #SELECTION_BACKGROUND_CHANGED_PROPERTY} to registered listeners, if ++ * selectionBackground changed.

    ++ * ++ * @param s The new value of the selectionBackground property ++ */ ++ public void setSelectionBackground(Color s) ++ { ++ Color tmp = selectionBackground; ++ selectionBackground = s; ++ if (((tmp == null && s != null) ++ || (s == null && tmp != null) ++ || (tmp != null && s != null && !tmp.equals(s)))) ++ firePropertyChange(SELECTION_BACKGROUND_CHANGED_PROPERTY, tmp, s); ++ repaint(); ++ } ++ ++ /** ++ *

    Set the value of the {@link #selectionForeground} property.

    ++ * ++ *

    Fire a PropertyChangeEvent with name {@link ++ * SELECTION_FOREGROUND_CHANGED_PROPERTY} to registered listeners, if ++ * selectionForeground changed.

    ++ * ++ * @param s The new value of the selectionForeground property ++ */ ++ public void setSelectionForeground(Color s) ++ { ++ Color tmp = selectionForeground; ++ selectionForeground = s; ++ if (((tmp == null && s != null) ++ || (s == null && tmp != null) ++ || (tmp != null && s != null && !tmp.equals(s)))) ++ firePropertyChange(SELECTION_FOREGROUND_CHANGED_PROPERTY, tmp, s); ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #showGrid} property. ++ * ++ * @param s The new value of the showGrid property ++ */ ++ public void setShowGrid(boolean s) ++ { ++ setShowVerticalLines(s); ++ setShowHorizontalLines(s); ++ } ++ ++ /** ++ * Set the value of the {@link #showHorizontalLines} property. ++ * ++ * @param s The new value of the showHorizontalLines property ++ */ ++ public void setShowHorizontalLines(boolean s) ++ { ++ showHorizontalLines = s; ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #showVerticalLines} property. ++ * ++ * @param s The new value of the showVerticalLines property ++ */ ++ public void setShowVerticalLines(boolean s) ++ { ++ showVerticalLines = s; ++ repaint(); ++ } ++ ++ /** ++ * Set the value of the {@link #tableHeader} property. ++ * ++ * @param t The new value of the tableHeader property ++ */ ++ public void setTableHeader(JTableHeader t) ++ { ++ if (tableHeader != null) ++ tableHeader.setTable(null); ++ tableHeader = t; ++ if (tableHeader != null) ++ tableHeader.setTable(this); ++ revalidate(); ++ repaint(); ++ } ++ ++ protected void configureEnclosingScrollPane() ++ { ++ JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, this); ++ if (jsp != null && tableHeader != null) ++ { ++ jsp.setColumnHeaderView(tableHeader); ++ } ++ } ++ ++ protected void unconfigureEnclosingScrollPane() ++ { ++ JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, this); ++ if (jsp != null) ++ { ++ jsp.setColumnHeaderView(null); ++ } ++ } ++ ++ ++ public void addNotify() ++ { ++ super.addNotify(); ++ configureEnclosingScrollPane(); ++ } ++ ++ public void removeNotify() ++ { ++ super.addNotify(); ++ unconfigureEnclosingScrollPane(); ++ } ++ ++ ++ /** ++ * Sun javadocs describe an unusual implementation of ++ * doLayout which involves some private interfaces. We try ++ * to implement the same algorithm as is documented, but using the ++ * columnModel directly. We still use a private helper method, but it has ++ * a simpler signature. ++ */ ++ ++ private void distributeSpill(TableColumn[] cols, int spill) ++ { ++ int MIN = 0; ++ int MAX = 0; ++ int PREF = 0; ++ ++ int[] min = new int[cols.length]; ++ int[] max = new int[cols.length]; ++ int[] pref = new int[cols.length]; ++ ++ for (int i = 0; i < cols.length; ++i) ++ { ++ pref[i] = cols[i].getPreferredWidth(); ++ min[i] = cols[i].getMinWidth(); ++ max[i] = cols[i].getMaxWidth(); ++ PREF += pref[i]; ++ MIN += min[i]; ++ MAX += max[i]; ++ } ++ ++ for (int i = 0; i < cols.length; ++i) ++ { ++ int adj = 0; ++ if (spill > 0) ++ adj = (spill * (pref[i] - min[i])) / (PREF - MIN); ++ else ++ adj = (spill * (max[i] - pref[i])) / (MAX - PREF); ++ cols[i].setWidth(pref[i] + adj); ++ } + } +- +- public void tableChanged (TableModelEvent event) ++ ++ public void doLayout() + { +- throw new Error ("Not implemented"); +- } ++ TableColumn resizingColumn = null; + +- public void setModel (TableModel model) ++ int ncols = getColumnCount(); ++ if (ncols < 1) ++ return; ++ ++ int[] pref = new int[ncols]; ++ int prefSum = 0; ++ int rCol = -1; ++ ++ if (tableHeader != null) ++ resizingColumn = tableHeader.getResizingColumn(); ++ ++ for (int i = 0; i < ncols; ++i) ++ { ++ TableColumn col = columnModel.getColumn(i); ++ int p = col.getWidth(); ++ pref[i] = p; ++ prefSum += p; ++ if (resizingColumn == col) ++ rCol = i; ++ } ++ ++ int spill = prefSum - getWidth(); ++ ++ if (resizingColumn != null) ++ { ++ TableColumn col; ++ TableColumn [] cols; ++ ++ switch (getAutoResizeMode()) ++ { ++ case AUTO_RESIZE_LAST_COLUMN: ++ col = columnModel.getColumn(ncols-1); ++ col.setWidth(col.getPreferredWidth() + spill); ++ break; ++ ++ case AUTO_RESIZE_NEXT_COLUMN: ++ col = columnModel.getColumn(ncols-1); ++ col.setWidth(col.getPreferredWidth() + spill); ++ break; ++ ++ case AUTO_RESIZE_ALL_COLUMNS: ++ cols = new TableColumn[ncols]; ++ for (int i = 0; i < ncols; ++i) ++ cols[i] = columnModel.getColumn(i); ++ distributeSpill(cols, spill); ++ break; ++ ++ case AUTO_RESIZE_SUBSEQUENT_COLUMNS: ++ cols = new TableColumn[ncols]; ++ for (int i = rCol; i < ncols; ++i) ++ cols[i] = columnModel.getColumn(i); ++ distributeSpill(cols, spill); ++ break; ++ ++ case AUTO_RESIZE_OFF: ++ default: ++ } ++ } ++ else ++ { ++ TableColumn [] cols = new TableColumn[ncols]; ++ for (int i = 0; i < ncols; ++i) ++ cols[i] = columnModel.getColumn(i); ++ distributeSpill(cols, spill); ++ } ++ } ++ ++ public void sizeColumnsToFit(boolean lastColumnOnly) + { +- throw new Error ("Not implemented"); ++ doLayout(); + } + +- public void setSelectionMode (int selectionMode) ++ public void sizeColumnsToFit(int resizingColumn) + { +- throw new Error ("Not implemented"); ++ doLayout(); + } + +- public void setSelectionModel (ListSelectionModel model) ++ ++ public String getUIClassID() + { +- throw new Error ("Not implemented"); ++ return "TableUI"; + } + +- public void setShowGrid (boolean showGrid) ++ public TableUI getUI() + { +- throw new Error ("Not implemented"); ++ return (TableUI) ui; + } + +- public void valueChanged (ListSelectionEvent event) ++ public void updateUI() + { +- throw new Error ("Not implemented"); ++ setUI((TableUI) UIManager.getUI(this)); ++ revalidate(); ++ repaint(); + } +-} // class JTable ++ ++} +Index: javax/swing/JTextArea.java +=================================================================== +RCS file: javax/swing/JTextArea.java +diff -N javax/swing/JTextArea.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/JTextArea.java 6 Sep 2004 16:35:59 -0000 +@@ -0,0 +1,252 @@ ++/* JTextArea.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++import java.awt.Dimension; ++import javax.swing.text.Document; ++import javax.swing.text.JTextComponent; ++import javax.swing.text.PlainDocument; ++ ++public class JTextArea extends JTextComponent ++{ ++ private static final long serialVersionUID = -6141680179310439825L; ++ ++ private int rows; ++ private int columns; ++ private boolean wrapping; ++ private int tabSize = 8; ++ ++ /** ++ * Creates a new JTextArea object. ++ */ ++ public JTextArea() ++ { ++ this(null, null, 0, 0); ++ } ++ ++ /** ++ * Creates a new JTextArea object. ++ * ++ * @param text the initial text ++ */ ++ public JTextArea(String text) ++ { ++ this(null, text, 0, 0); ++ } ++ ++ /** ++ * Creates a new JTextArea object. ++ * ++ * @param rows the number of rows ++ * @param columns the number of cols ++ * ++ * @exception IllegalArgumentException if rows or columns are negative ++ */ ++ public JTextArea(int rows, int columns) ++ { ++ this(null, null, rows, columns); ++ } ++ ++ /** ++ * Creates a new JTextArea object. ++ * ++ * @param text the initial text ++ * @param rows the number of rows ++ * @param columns the number of cols ++ * ++ * @exception IllegalArgumentException if rows or columns are negative ++ */ ++ public JTextArea(String text, int rows, int columns) ++ { ++ this(null, text, rows, columns); ++ } ++ ++ /** ++ * Creates a new JTextArea object. ++ * ++ * @param the document model to use ++ */ ++ public JTextArea(Document doc) ++ { ++ this(doc, null, 0, 0); ++ } ++ ++ /** ++ * Creates a new JTextArea object. ++ * ++ * @param the document model to use ++ * @param text the initial text ++ * @param rows the number of rows ++ * @param columns the number of cols ++ * ++ * @exception IllegalArgumentException if rows or columns are negative ++ */ ++ public JTextArea(Document doc, String text, int rows, int columns) ++ { ++ setDocument(doc == null ? createDefaultModel() : doc); ++ setText(text); ++ setRows(rows); ++ setColumns(columns); ++ } ++ ++ /** ++ * Appends some text. ++ * ++ * @param toAppend the text to append ++ */ ++ public void append(String toAppend) ++ { ++ setText(getText() + toAppend); ++ } ++ ++ /** ++ * Creates the default document model. ++ * ++ * @return a new default model ++ */ ++ protected Document createDefaultModel() ++ { ++ return new PlainDocument(); ++ } ++ ++ ++ public boolean getScrollableTracksViewportWidth() ++ { ++ return wrapping ? true : super.getScrollableTracksViewportWidth(); ++ } ++ ++ /** ++ * Returns the UI class ID string. ++ * ++ * @return the string "TextAreaUI" ++ */ ++ public String getUIClassID() ++ { ++ return "TextAreaUI"; ++ } ++ ++ /** ++ * Returns the current number of columns. ++ * ++ * @return number of columns ++ */ ++ public int getColumns() ++ { ++ return columns; ++ } ++ ++ /** ++ * Sets the number of rows. ++ * ++ * @param columns number of columns ++ * ++ * @exception IllegalArgumentException if columns is negative ++ */ ++ public void setColumns(int columns) ++ { ++ if (columns < 0) ++ throw new IllegalArgumentException(); ++ ++ this.columns = columns; ++ } ++ ++ /** ++ * Returns the current number of rows. ++ * ++ * @return number of rows ++ */ ++ public int getRows() ++ { ++ return rows; ++ } ++ ++ /** ++ * Sets the number of rows. ++ * ++ * @param columns number of columns ++ * ++ * @exception IllegalArgumentException if rows is negative ++ */ ++ public void setRows(int rows) ++ { ++ if (rows < 0) ++ throw new IllegalArgumentException(); ++ ++ this.rows = rows; ++ } ++ ++ /** ++ * Checks whethet line wrapping is enabled. ++ * ++ * @return true if line wrapping is enabled, false otherwise ++ */ ++ public boolean getLineWrap() ++ { ++ return wrapping; ++ } ++ ++ /** ++ * Enables/disables line wrapping. ++ * ++ * @param wrapping true to enable line wrapping, false otherwise ++ */ ++ public void setLineWrap(boolean flag) ++ { ++ if (wrapping == flag) ++ return; ++ ++ boolean oldValue = wrapping; ++ wrapping = flag; ++ firePropertyChange("lineWrap", oldValue, wrapping); ++ } ++ ++ public int getTabSize() ++ { ++ return tabSize; ++ } ++ ++ public void setTabSize(int newSize) ++ { ++ if (tabSize == newSize) ++ return; ++ ++ int oldValue = tabSize; ++ tabSize = newSize; ++ firePropertyChange("tabSize", oldValue, tabSize); ++ } ++} +Index: javax/swing/JTextField.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JTextField.java,v +retrieving revision 1.2 +diff -u -r1.2 JTextField.java +--- javax/swing/JTextField.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JTextField.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ +-/* JTextField.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JTextField.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,74 +35,241 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; +-import java.util.Vector; + import javax.accessibility.AccessibleStateSet; + import javax.swing.text.Document; + import javax.swing.text.JTextComponent; ++import javax.swing.text.PlainDocument; ++ + +-public class JTextField extends JEditorPane ++public class JTextField extends JTextComponent ++ implements SwingConstants + { ++ /** ++ * AccessibleJTextField ++ */ ++ protected class AccessibleJTextField extends AccessibleJTextComponent ++ { ++ private static final long serialVersionUID = 8255147276740453036L; + +- /** +- * AccessibleJTextField +- */ +- protected class AccessibleJTextField extends AccessibleJTextComponent { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJTextField +- * @param component TODO +- */ +- protected AccessibleJTextField(JTextField component) { +- super(component); +- // TODO +- } // AccessibleJTextField() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() ++ /** ++ * Constructor AccessibleJTextField ++ */ ++ protected AccessibleJTextField() ++ { ++ } + ++ /** ++ * getAccessibleStateSet ++ * @return AccessibleStateSet ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; ++ } ++ } + +- } // AccessibleJTextField ++ private static final long serialVersionUID = 353853209832607592L; + ++ public static final String notifyAction = "notify-field-accept"; ++ ++ private int columns; + +- Vector actions = new Vector(); ++ private int align; + ++ /** ++ * Creates a new instance of JTextField. ++ */ + public JTextField() + { ++ this(null, null, 0); + } + +- public JTextField(int a) +- { +- } ++ /** ++ * Creates a new instance of JTextField. ++ * ++ * @param text the initial text ++ */ ++ public JTextField(String text) ++ { ++ this(null, text, 0); ++ } ++ ++ /** ++ * Creates a new instance of JTextField. ++ * ++ * @param columns the number of columns ++ * ++ * @exception IllegalArgumentException if columns %lt; 0 ++ */ ++ public JTextField(int columns) ++ { ++ this(null, null, columns); ++ } + +- public void addActionListener(ActionListener l) +- { +- actions.addElement(l); +- } ++ /** ++ * Creates a new instance of JTextField. ++ * ++ * @param text the initial text ++ * @param columns the number of columns ++ * ++ * @exception IllegalArgumentException if columns %lt; 0 ++ */ ++ public JTextField(String text, int columns) ++ { ++ this(null, text, columns); ++ } + +- public void removeActionListener(ActionListener l) +- { +- actions.removeElement(l); +- } ++ /** ++ * Creates a new instance of JTextField. ++ * ++ * @param doc the document to use ++ * @param text the initial text ++ * @param columns the number of columns ++ * ++ * @exception IllegalArgumentException if columns %lt; 0 ++ */ ++ public JTextField(Document doc, String text, int columns) ++ { ++ if (columns < 0) ++ throw new IllegalArgumentException(); ++ ++ this.columns = columns; ++ ++ setDocument(doc == null ? createDefaultModel() : doc); + +- public void selectAll() +- { +- } ++ if (text != null) ++ setText(text); ++ } ++ ++ /** ++ * Creates the default model for this text field. ++ * This implementation returns an instance of PlainDocument. ++ * ++ * @return a new instance of the default model ++ */ ++ protected Document createDefaultModel() ++ { ++ return new PlainDocument(); ++ } ++ ++ /** ++ * Returns the class ID for the UI. ++ * ++ * @return "TextFieldUI"; ++ */ ++ public String getUIClassID() ++ { ++ return "TextFieldUI"; ++ } ++ ++ /** ++ * Adds a new listener object to this text field. ++ * ++ * @param listener the listener to add ++ */ ++ public void addActionListener(ActionListener listener) ++ { ++ listenerList.add(ActionListener.class, listener); ++ } ++ ++ /** ++ * Removes a listener object from this text field. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeActionListener(ActionListener listener) ++ { ++ listenerList.remove(ActionListener.class, listener); ++ } ++ ++ /** ++ * Returns all registered ActionListener objects. ++ * ++ * @return an array of listeners ++ * ++ * @since 1.4 ++ */ ++ public ActionListener[] getActionListeners() ++ { ++ return (ActionListener[]) getListeners(ActionListener.class); ++ } ++ ++ /** ++ * Sends an action event to all registered ++ * ActionListener objects. ++ */ ++ protected void fireActionPerformed() ++ { ++ ActionEvent event = new ActionEvent(this, 0, notifyAction); ++ ActionListener[] listeners = getActionListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].actionPerformed(event); ++ } ++ ++ /** ++ * Returns the number of columns of this text field. ++ * ++ * @return the number of columns ++ */ ++ public int getColumns() ++ { ++ return columns; ++ } ++ ++ public void setColumns(int columns) ++ { ++ if (columns < 0) ++ throw new IllegalArgumentException(); ++ ++ this.columns = columns; ++ invalidate(); ++ repaint(); ++ } ++ ++ public int getHorizontalAlignment() ++ { ++ return align; ++ } ++ ++ public void setHorizontalAlignment(int newAlign) ++ { ++ int oldAlign = align; ++ align = newAlign; ++ invalidate(); ++ repaint(); ++ firePropertyChange("horizontalAlignment", oldAlign, newAlign); ++ } ++ ++ public void setFont(Font newFont) ++ { ++ super.setFont(newFont); ++ revalidate(); ++ } ++ ++ public Dimension getPreferredSize() ++ { ++ Dimension size; ++ FontMetrics fm = getFontMetrics(getFont()); ++ int fontHeight = fm.getMaxAscent() + fm.getMaxDescent(); ++ int columnWidth = fm.charWidth('m'); ++ ++ if (columns != 0) ++ { ++ size = new Dimension(columns * columnWidth + 4, fontHeight + 4); ++ } ++ else ++ { ++ size = new Dimension(10, 10); ++ } ++ ++ return size; ++ } + } +Index: javax/swing/JToggleButton.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JToggleButton.java,v +retrieving revision 1.2 +diff -u -r1.2 JToggleButton.java +--- javax/swing/JToggleButton.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JToggleButton.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ + /* JToggleButton.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -44,66 +44,102 @@ + + public class JToggleButton extends AbstractButton implements Accessible + { +- public JToggleButton() +- { +- this(null, null); +- } +- public JToggleButton(Action a) +- { +- this(); +- setAction(a); +- } + +- public JToggleButton(Icon icon) +- { +- this(null, icon); +- } ++ public static class ToggleButtonModel extends DefaultButtonModel ++ { ++ private static final long serialVersionUID = -1589950750899943974L; + +- public JToggleButton(String text) ++ public void setPressed(boolean b) + { +- this(text, null); +- } ++ if (! isEnabled()) ++ return; + +- public JToggleButton(String text, Icon icon) +- { +- this(text, icon, false); +- } +- +- public JToggleButton (String text, Icon icon, boolean selected) +- { +- super(text, icon); +- +- // Create the model +- setModel(new ToggleButtonModel(this)); +- +- model.setSelected(selected); ++ super.setPressed(b); ++ ++ // setPressed(false) == mouse release on us, ++ // if we were armed, we flip the selected state. ++ if (!b && isArmed()) ++ setSelected(! isSelected()); + } ++ } + + ++ private static final long serialVersionUID = -3128248873429850443L; + +- public AccessibleContext getAccessibleContext() +- { +- //Gets the AccessibleContext associated with this JToggleButton. +- return null; +- } ++ public JToggleButton() ++ { ++ this(null, null); ++ } ++ public JToggleButton(Action a) ++ { ++ this(); ++ setAction(a); ++ } ++ ++ public JToggleButton(Icon icon) ++ { ++ this(null, icon); ++ } + +- public String getUIClassID() +- { +- //Returns a string that specifies the name of the L&F class that renders this component. +- return "JToggleButton"; +- } ++ public JToggleButton (Icon icon, boolean selected) ++ { ++ this(null, icon, selected); ++ } + +- protected String paramString() +- { +- return "JToggleButton"; +- } ++ public JToggleButton(String text) ++ { ++ this(text, null); ++ } ++ ++ public JToggleButton(String text, boolean selected) ++ { ++ this(text, null, selected); ++ } ++ ++ public JToggleButton(String text, Icon icon) ++ { ++ this(text, icon, false); ++ } ++ ++ public JToggleButton (String text, Icon icon, boolean selected) ++ { ++ super(text, icon); ++ ++ horizontalAlignment = LEADING; ++ setModel(new ToggleButtonModel()); ++ model.setSelected(selected); ++ } ++ ++ /** ++ * Gets the AccessibleContext associated with this JToggleButton. ++ * ++ * @return the associated context ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } + ++ /** ++ * Returns a string that specifies the name of the Look and Feel ++ * class that renders this component. ++ */ ++ public String getUIClassID() ++ { ++ return "ToggleButtonUI"; ++ } + +- public void updateUI() +- { +- ButtonUI b = (ButtonUI)UIManager.getUI(this); +- setUI(b); +- } ++ protected String paramString() ++ { ++ return "JToggleButton"; ++ } ++ ++ ++ public void updateUI() ++ { ++ ButtonUI b = (ButtonUI)UIManager.getUI(this); ++ setUI(b); ++ } + } + + +Index: javax/swing/JToolBar.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JToolBar.java,v +retrieving revision 1.3 +diff -u -r1.3 JToolBar.java +--- javax/swing/JToolBar.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/JToolBar.java 6 Sep 2004 16:35:59 -0000 +@@ -37,11 +37,13 @@ + + package javax.swing; + +-import java.awt.Dimension; + import java.awt.Component; + import java.awt.Container; ++import java.awt.Dimension; + import java.awt.Graphics; ++import java.awt.GridLayout; + import java.awt.Insets; ++import java.awt.LayoutManager; + import java.beans.PropertyChangeListener; + import java.io.IOException; + import java.io.ObjectOutputStream; +@@ -51,424 +53,735 @@ + import javax.accessibility.AccessibleStateSet; + import javax.swing.plaf.ToolBarUI; + ++ + /** +- * JToolBar +- * @author Andrew Selkirk +- * @version 1.0 ++ * JToolBar is a component that provides a toolbar to Swing programs. Users ++ * can add buttons (or actions that will be represented by JButtons) as well ++ * as other components to the JToolBar. JToolBars can be dragged in and out ++ * of their parent components. If the JToolBar is dragged out of the parent, ++ * then it will be displayed in its own RootPaneContainer. For dragging to ++ * work properly, JToolBars need to be placed in a Container that has a ++ * BorderLayout. That parent Container cannot have components in the NORTH, ++ * EAST, SOUTH, or WEST components (that is not the JToolBar). + */ +-public class JToolBar extends JComponent +- implements SwingConstants, Accessible ++public class JToolBar extends JComponent implements SwingConstants, Accessible + { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * AccessibleJToolBar +- */ +- protected class AccessibleJToolBar extends AccessibleJComponent { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJToolBar +- * @param component TODO +- */ +- protected AccessibleJToolBar(JToolBar component) { +- super(component); +- // TODO +- } // AccessibleJToolBar() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return AccessibleRole.TOOL_BAR; +- } // getAccessibleRole() +- +- +- } // AccessibleJToolBar +- +- /** +- * Separator +- */ +- public static class Separator extends JSeparator { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * separatorSize +- */ +- private Dimension size; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor Separator +- */ +- public Separator() { +- // TODO +- } // Separator() +- +- /** +- * Constructor Separator +- * @param size TODO +- */ +- public Separator(Dimension size) { +- // TODO +- } // Separator() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return null; // TODO ++ /** ++ * AccessibleJToolBar ++ */ ++ protected class AccessibleJToolBar extends AccessibleJComponent ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -5516888265903814215L; ++ ++ /** ++ * Constructor AccessibleJToolBar ++ */ ++ protected AccessibleJToolBar() ++ { ++ } ++ ++ /** ++ * getAccessibleStateSet ++ * ++ * @return AccessibleStateSet ++ */ ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ return null; // TODO ++ } ++ ++ /** ++ * getAccessibleRole ++ * ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return AccessibleRole.TOOL_BAR; ++ } ++ } ++ ++ /** ++ * This is the private JToolBar layout manager. ++ */ ++ private class DefaultToolBarLayout implements LayoutManager ++ { ++ /** ++ * This method is called when a new component is added to the container. ++ * ++ * @param name The name of the component added. ++ * @param comp The component that was added. ++ */ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method is called to lay out the given container to position and ++ * size the child components. ++ * ++ * @param c The container to lay out. ++ * ++ * @throws Error DOCUMENT ME! ++ */ ++ public void layoutContainer(Container c) ++ { ++ if (! (c instanceof JToolBar)) ++ throw new Error("DefaultToolBarLayout can only be used on JToolBars."); ++ Insets insets = getInsets(); ++ Insets margin = getMargin(); ++ int middle; ++ if (margin != null) ++ { ++ insets.left += margin.left; ++ insets.top += margin.top; ++ insets.bottom += margin.bottom; ++ insets.right += margin.right; ++ } ++ Component[] components = c.getComponents(); ++ Dimension tdims = c.getSize(); ++ int start = 0; ++ Dimension pref; ++ ++ if (getOrientation() == SwingUtilities.HORIZONTAL) ++ { ++ start += insets.left; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] != null && components[i].isVisible()) ++ { ++ pref = components[i].getPreferredSize(); ++ if (pref != null) ++ { ++ middle = (tdims.height - pref.height) / 2; ++ components[i].setBounds(start, middle, pref.width, ++ pref.height); ++ start += pref.width; ++ } ++ } ++ } ++ } ++ else ++ { ++ start += insets.top; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] != null && components[i].isVisible()) ++ { ++ pref = components[i].getPreferredSize(); ++ if (pref != null) ++ { ++ middle = (tdims.width - pref.width) / 2; ++ components[i].setBounds(middle, start, pref.width, ++ pref.height); ++ start += pref.height; ++ } ++ } ++ } ++ } ++ } ++ ++ /** ++ * This method returns the minimum size of the given container given the ++ * child components. ++ * ++ * @param parent The container to measure. ++ * ++ * @return The minimum size of the given container. ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return preferredLayoutSize(parent); ++ } ++ ++ /** ++ * This method returns the preferred size of the given container given the ++ * child components. ++ * ++ * @param parent The container to measure. ++ * ++ * @return The preferred size of the given container. ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ int orientation = getOrientation(); ++ Component[] components = getComponents(); ++ ++ int limit = 0; ++ int total = 0; ++ Dimension dims; ++ ++ int w = 0; ++ int h = 0; ++ ++ if (orientation == SwingConstants.HORIZONTAL) ++ { ++ for (int i = 0; i < components.length; i++) ++ { ++ dims = components[i].getPreferredSize(); ++ if (dims != null) ++ { ++ if (dims.height > limit) ++ limit = dims.height; ++ total += dims.width; ++ } ++ } ++ w = total; ++ h = limit; ++ } ++ else ++ { ++ for (int i = 0; i < components.length; i++) ++ { ++ dims = components[i].getPreferredSize(); ++ if (dims != null) ++ { ++ if (dims.width > limit) ++ limit = dims.width; ++ total += dims.height; ++ } ++ } ++ w = limit; ++ h = total; ++ } ++ ++ Insets insets = getInsets(); ++ w += insets.left + insets.right; ++ h += insets.top + insets.bottom; ++ ++ Insets margin = getMargin(); ++ if (margin != null) ++ { ++ w += margin.left + margin.right; ++ h += margin.top + margin.bottom; ++ } ++ ++ return new Dimension(w, h); ++ } ++ ++ /** ++ * This method is called when the given component is removed from the ++ * container. ++ * ++ * @param comp The component removed. ++ */ ++ public void removeLayoutComponent(Component comp) ++ { ++ // Do nothing. ++ } ++ } ++ ++ /** ++ * This is an extension of JSeparator used in toolbars. Unlike JSeparator, ++ * nothing is painted for this Separator, it is only blank space that ++ * separates components. ++ */ ++ public static class Separator extends JSeparator ++ { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -1656745644823105219L; ++ ++ /** ++ * Creates a new Separator object. ++ */ ++ public Separator() ++ { ++ super(); ++ } // Separator() ++ ++ /** ++ * Creates a new Separator object with the given size. ++ * ++ * @param size The size of the separator. ++ */ ++ public Separator(Dimension size) ++ { ++ setPreferredSize(size); ++ } // Separator() ++ ++ /** ++ * This method returns the String ID of the UI class of Separator. ++ * ++ * @return The UI class' String ID. ++ */ ++ public String getUIClassID() ++ { ++ return "ToolBarSeparatorUI"; + } // getUIClassID() + + /** +- * getPreferredSize +- * @returns Dimension +- */ +- public Dimension getPreferredSize() { +- return null; // TODO ++ * This method returns the preferred size of the Separator. ++ * ++ * @return The preferred size of the Separator. ++ */ ++ public Dimension getPreferredSize() ++ { ++ return super.getPreferredSize(); + } // getPreferredSize() + + /** +- * getMaximumSize +- * @returns Dimension +- */ +- public Dimension getMaximumSize() { +- return null; // TODO ++ * This method returns the maximum size of the Separator. ++ * ++ * @return The maximum size of the Separator. ++ */ ++ public Dimension getMaximumSize() ++ { ++ return super.getPreferredSize(); + } // getMaximumSize() + + /** +- * getMinimumSize +- * @returns Dimension +- */ +- public Dimension getMinimumSize() { +- return null; // TODO ++ * This method returns the minimum size of the Separator. ++ * ++ * @return The minimum size of the Separator. ++ */ ++ public Dimension getMinimumSize() ++ { ++ return super.getPreferredSize(); + } // getMinimumSize() + + /** +- * getSeparatorSize +- * @returns Dimension +- */ +- public Dimension getSeparatorSize() { +- return null; // TODO ++ * This method returns the size of the Separator. ++ * ++ * @return The size of the Separator. ++ */ ++ public Dimension getSeparatorSize() ++ { ++ return super.getPreferredSize(); + } // getSeparatorSize() + + /** +- * setSeparatorSize +- * @param size TODO +- */ +- public void setSeparatorSize(Dimension size) { +- // TODO ++ * This method sets the size of the Separator. ++ * ++ * @param size The new size of the Separator. ++ */ ++ public void setSeparatorSize(Dimension size) ++ { ++ setPreferredSize(size); + } // setSeparatorSize() +- +- + } // Separator + ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -1269915519555129643L; ++ ++ /** Whether the JToolBar paints its border. */ ++ private transient boolean paintBorder = true; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++ /** The extra insets around the JToolBar. */ ++ private transient Insets margin; + +- /** +- * uiClassID +- */ +- private static final String uiClassID = "ToolBarUI"; ++ /** Whether the JToolBar can float (and be dragged around). */ ++ private transient boolean floatable = true; + +- /** +- * paintBorder +- */ +- private boolean paintBorder; ++ /** Whether the buttons will have rollover borders. */ ++ private transient boolean rollover; + +- /** +- * margin +- */ +- private Insets margin; ++ /** The orientation of the JToolBar. */ ++ private int orientation = HORIZONTAL; + +- /** +- * floatable +- */ +- private boolean floatable; ++ /** Fired in a PropertyChangeEvent when the orientation property changes. */ ++ public static final String ORIENTATION_CHANGED_PROPERTY = "orientation"; + +- /** +- * orientation +- */ +- private int orientation; ++ /** Fired in a PropertyChangeEvent when the floatable property changes. */ ++ public static final String FLOATABLE_CHANGED_PROPERTY = "floatable"; + ++ /** Fired in a PropertyChangeEvent when the borderPainted property changes. */ ++ public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted"; + +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- ++ /** Fired in a PropertyChangeEvent when the margin property changes. */ ++ public static final String MARGIN_CHANGED_PROPERTY = "margin"; + +- /** +- * Constructor JToolBar +- */ +- public JToolBar() { +- // TODO +- } // JToolBar() ++ /** Fired in a PropertyChangeEvent when the rollover property changes. */ ++ public static final String ROLLOVER_CHANGED_PROPERTY = "rollover"; + + /** +- * Constructor JToolBar +- * @param orientation TODO ++ * This method creates a new JToolBar object with horizontal orientation ++ * and no name. + */ +- public JToolBar(int orientation) { +- // TODO ++ public JToolBar() ++ { ++ this(null, HORIZONTAL); + } // JToolBar() + + /** +- * Constructor JToolBar +- * @param name TODO +- */ +- public JToolBar(String name) { +- // TODO ++ * This method creates a new JToolBar with the given orientation and no ++ * name. ++ * ++ * @param orientation JToolBar orientation (HORIZONTAL or VERTICAL) ++ */ ++ public JToolBar(int orientation) ++ { ++ this(null, orientation); + } // JToolBar() + + /** +- * Constructor JToolBar +- * @param name TODO +- * @param orientation TODO +- */ +- public JToolBar(String name, int orientation) { +- // TODO ++ * This method creates a new JToolBar object with the given name and ++ * horizontal orientation. ++ * ++ * @param name Name assigned to undocked tool bar. ++ */ ++ public JToolBar(String name) ++ { ++ this(name, HORIZONTAL); + } // JToolBar() + +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- + /** +- * writeObject +- * @param stream TODO +- * @exception IOException TODO +- */ +- private void writeObject(ObjectOutputStream stream) throws IOException { +- // TODO +- } // writeObject() ++ * This method creates a new JToolBar object with the given name and ++ * orientation. ++ * ++ * @param name Name assigned to undocked tool bar. ++ * @param orientation JToolBar orientation (HORIZONTAL or VERTICAL) ++ */ ++ public JToolBar(String name, int orientation) ++ { ++ setName(name); ++ setOrientation(orientation); ++ setLayout(new DefaultToolBarLayout()); ++ revalidate(); ++ updateUI(); ++ } // JToolBar() + + /** +- * add +- * @param action TODO +- * @returns JButton +- */ +- public JButton add(Action action) { +- return null; // TODO ++ * This method adds a new JButton that performs the given Action to the ++ * JToolBar. ++ * ++ * @param action The Action to add to the JToolBar. ++ * ++ * @return The JButton that wraps the Action. ++ */ ++ public JButton add(Action action) ++ { ++ JButton b = createActionComponent(action); ++ add(b); ++ return b; + } // add() + + /** +- * paintBorder +- * @param graphics TODO +- */ +- protected void paintBorder(Graphics graphics) { +- // TODO ++ * This method paints the border if the borderPainted property is true. ++ * ++ * @param graphics The graphics object to paint with. ++ */ ++ protected void paintBorder(Graphics graphics) ++ { ++ if (paintBorder && isFloatable()) ++ super.paintBorder(graphics); + } // paintBorder() + + /** +- * getUI +- * @returns ToolBarUI ++ * This method returns the UI class used to paint this JToolBar. ++ * ++ * @return The UI class for this JToolBar. + */ +- public ToolBarUI getUI() { ++ public ToolBarUI getUI() ++ { + return (ToolBarUI) ui; + } // getUI() + + /** +- * setUI +- * @param ui TODO ++ * This method sets the UI used with the JToolBar. ++ * ++ * @param ui The UI used with the JToolBar. + */ +- public void setUI(ToolBarUI ui) { ++ public void setUI(ToolBarUI ui) ++ { + super.setUI(ui); + } // setUI() + + /** +- * updateUI ++ * This method resets the UI used to the Look and Feel defaults. + */ +- public void updateUI() { +- setUI((ToolBarUI) UIManager.get(this)); +- invalidate(); ++ public void updateUI() ++ { ++ setUI((ToolBarUI)UIManager.getUI(this)); ++ revalidate(); ++ repaint(); + } // updateUI() + + /** +- * getUIClassID +- * @returns String +- */ +- public String getUIClassID() { +- return uiClassID; ++ * This method returns the String identifier for the UI class to the used ++ * with the JToolBar. ++ * ++ * @return The String identifier for the UI class. ++ */ ++ public String getUIClassID() ++ { ++ return "ToolBarUI"; + } // getUIClassID() + + /** +- * getComponentIndex +- * @param component TODO +- * @returns int +- */ +- public int getComponentIndex(Component component) { +- return 0; // TODO ++ * This method sets the rollover property for the JToolBar. In rollover ++ * mode, JButtons inside the JToolBar will only display their borders when ++ * the mouse is moving over them. ++ * ++ * @param b The new rollover property. ++ */ ++ public void setRollover(boolean b) ++ { ++ if (b != rollover) ++ { ++ rollover = b; ++ firePropertyChange(ROLLOVER_CHANGED_PROPERTY, ! rollover, rollover); ++ revalidate(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * This method returns the rollover property. ++ * ++ * @return The rollover property. ++ */ ++ public boolean isRollover() ++ { ++ return rollover; ++ } ++ ++ /** ++ * This method returns the index of the given component. ++ * ++ * @param component The component to find. ++ * ++ * @return The index of the given component. ++ */ ++ public int getComponentIndex(Component component) ++ { ++ Component[] components = getComponents(); ++ if (components == null) ++ return -1; ++ ++ for (int i = 0; i < components.length; i++) ++ if (components[i] == component) ++ return i; ++ ++ return -1; + } // getComponentIndex() + + /** +- * getComponentAtIndex +- * @param index TODO +- * @returns Component +- */ +- public Component getComponentAtIndex(int index) { +- return null; // TODO ++ * This method returns the component at the given index. ++ * ++ * @param index The index of the component. ++ * ++ * @return The component at the given index. ++ */ ++ public Component getComponentAtIndex(int index) ++ { ++ return getComponent(index); + } // getComponentAtIndex() + + /** +- * getMargin +- * @returns Insets +- */ +- public Insets getMargin() { +- return null; // TODO ++ * This method returns the margin property. ++ * ++ * @return The margin property. ++ */ ++ public Insets getMargin() ++ { ++ return margin; + } // getMargin() + + /** +- * setMargin +- * @param margin TODO +- */ +- public void setMargin(Insets margin) { +- // TODO ++ * This method sets the margin property. The margin property determines the ++ * extra space between the children components of the JToolBar and the ++ * border. ++ * ++ * @param margin The margin property. ++ */ ++ public void setMargin(Insets margin) ++ { ++ if ((this.margin != null && margin == null) ++ || (this.margin == null && margin != null) ++ || (margin != null && this.margin != null ++ && (margin.left != this.margin.left ++ || margin.right != this.margin.right || margin.top != this.margin.top ++ || margin.bottom != this.margin.bottom))) ++ { ++ Insets oldMargin = this.margin; ++ this.margin = margin; ++ firePropertyChange(MARGIN_CHANGED_PROPERTY, oldMargin, this.margin); ++ revalidate(); ++ repaint(); ++ } + } // setMargin() + + /** +- * isBorderPainted +- * @returns boolean +- */ +- public boolean isBorderPainted() { +- return false; // TODO ++ * This method returns the borderPainted property. ++ * ++ * @return The borderPainted property. ++ */ ++ public boolean isBorderPainted() ++ { ++ return paintBorder; + } // isBorderPainted() + + /** +- * setBorderPainted +- * @param painted TODO +- */ +- public void setBorderPainted(boolean painted) { +- // TODO ++ * This method sets the borderPainted property. If set to false, the border ++ * will not be painted. ++ * ++ * @param painted Whether the border will be painted. ++ */ ++ public void setBorderPainted(boolean painted) ++ { ++ if (painted != paintBorder) ++ { ++ paintBorder = painted; ++ firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, ! paintBorder, ++ paintBorder); ++ repaint(); ++ } + } // setBorderPainted() + + /** +- * isFloatable +- * @returns boolean +- */ +- public boolean isFloatable() { +- return false; // TODO ++ * This method returns the floatable property. ++ * ++ * @return The floatable property. ++ */ ++ public boolean isFloatable() ++ { ++ return floatable; + } // isFloatable() + + /** +- * setFloatable +- * @param floatable TODO +- */ +- public void setFloatable(boolean floatable) { +- // TODO ++ * This method sets the floatable property. If set to false, the JToolBar ++ * cannot be dragged. ++ * ++ * @param floatable Whether the JToolBar can be dragged. ++ */ ++ public void setFloatable(boolean floatable) ++ { ++ if (floatable != this.floatable) ++ { ++ this.floatable = floatable; ++ firePropertyChange(FLOATABLE_CHANGED_PROPERTY, ! floatable, floatable); ++ } + } // setFloatable() + + /** +- * getOrientation +- * @returns int +- */ +- public int getOrientation() { +- return 0; // TODO ++ * This method returns the orientation of the JToolBar. ++ * ++ * @return The orientation of the JToolBar. ++ */ ++ public int getOrientation() ++ { ++ return orientation; + } // getOrientation() + + /** +- * setOrientation +- * @param orientation TODO +- */ +- public void setOrientation(int orientation) { +- // TODO ++ * This method sets the layout manager to be used with the JToolBar. ++ * ++ * @param mgr The Layout Manager used with the JToolBar. ++ */ ++ public void setLayout(LayoutManager mgr) ++ { ++ super.setLayout(mgr); ++ revalidate(); ++ repaint(); ++ } // setLayout() ++ ++ /** ++ * This method sets the orientation property for JToolBar. ++ * ++ * @param orientation The new orientation for JToolBar. ++ * ++ * @throws IllegalArgumentException If the orientation is not HORIZONTAL or ++ * VERTICAL. ++ */ ++ public void setOrientation(int orientation) ++ { ++ if (orientation != HORIZONTAL && orientation != VERTICAL) ++ throw new IllegalArgumentException(orientation ++ + " is not a legal orientation"); ++ if (orientation != this.orientation) ++ { ++ int oldOrientation = this.orientation; ++ this.orientation = orientation; ++ firePropertyChange(ORIENTATION_CHANGED_PROPERTY, oldOrientation, ++ this.orientation); ++ revalidate(); ++ repaint(); ++ } + } // setOrientation() + + /** +- * addSeparator ++ * This method adds a Separator of default size to the JToolBar. + */ +- public void addSeparator() { +- // TODO ++ public void addSeparator() ++ { ++ add(new Separator()); + } // addSeparator() + + /** +- * addSeparator +- * @param size TODO +- */ +- public void addSeparator(Dimension size) { +- // TODO ++ * This method adds a Separator with the given size to the JToolBar. ++ * ++ * @param size The size of the Separator. ++ */ ++ public void addSeparator(Dimension size) ++ { ++ add(new Separator(size)); + } // addSeparator() + + /** +- * createActionComponent +- * @param action TODO +- * @returns JButton +- */ +- protected JButton createActionComponent(Action action) { +- return null; // TODO ++ * This method is used to create JButtons which can be added to the JToolBar ++ * for the given action. ++ * ++ * @param action The action to create a JButton for. ++ * ++ * @return The JButton created from the action. ++ */ ++ protected JButton createActionComponent(Action action) ++ { ++ return new JButton(action); + } // createActionComponent() + + /** +- * createActionChangeListener +- * @param button TODO +- * @returns PropertyChangeListener +- */ +- protected PropertyChangeListener createActionChangeListener(JButton button) { +- return null; // TODO ++ * This method creates a pre-configured PropertyChangeListener which updates ++ * the control as changes are made to the Action. However, this is no ++ * longer the recommended way of adding Actions to Containers. As such, ++ * this method returns null. ++ * ++ * @param button The JButton to configure a PropertyChangeListener for. ++ * ++ * @return null. ++ */ ++ protected PropertyChangeListener createActionChangeListener(JButton button) ++ { ++ // XXX: As specified, this returns null. But seems kind of strange, usually deprecated methods don't just return null, verify! ++ return null; + } // createActionChangeListener() + + /** +- * addImpl +- * @param component TODO +- * @param constraints TODO +- * @param index TODO +- */ +- protected void addImpl(Component component, Object constraints, int index) { +- // TODO +- } // addImpl() +- +- /** +- * paramString +- * @returns String +- */ +- protected String paramString() { +- return null; // TODO ++ * This method overrides Container's addImpl method. If a JButton is added, ++ * it is disabled. ++ * ++ * @param component The Component to add. ++ * @param constraints The Constraints placed on the component. ++ * @param index The index to place the Component at. ++ */ ++ protected void addImpl(Component component, Object constraints, int index) ++ { ++ // XXX: Sun says disable button but test cases show otherwise. ++ super.addImpl(component, constraints, index); ++ } // addImpl() ++ ++ /** ++ * This method returns a String description of the JToolBar. ++ * ++ * @return A String description of the JToolBar. ++ */ ++ protected String paramString() ++ { ++ return "JToolBar"; + } // paramString() + +- /** +- * getAccessibleContext +- * @returns AccessibleContext +- */ +- public AccessibleContext getAccessibleContext() { +- if (accessibleContext == null) { +- accessibleContext = new AccessibleJToolBar(this); +- } // if +- return accessibleContext; +- } // getAccessibleContext() +- +- +-} // JToolBar ++ /** ++ * getAccessibleContext ++ * ++ * @return AccessibleContext ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ if (accessibleContext == null) ++ accessibleContext = new AccessibleJToolBar(); ++ ++ return accessibleContext; ++ } ++} +Index: javax/swing/JToolTip.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JToolTip.java,v +retrieving revision 1.2 +diff -u -r1.2 JToolTip.java +--- javax/swing/JToolTip.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JToolTip.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ +-/* JToolTip.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JToolTip.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,20 +35,160 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.AWTEvent; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; ++import javax.accessibility.AccessibleRole; ++import javax.swing.plaf.ToolTipUI; ++ + ++/** ++ * This class is used to display ToolTips. ToolTips are small floating windows ++ * that display text when the mouse comes to rest over a Component. ToolTips ++ * are set for JComponents using JComponent.setToolTipText(String). ++ */ + public class JToolTip extends JComponent implements Accessible + { +- String text; ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -1138929898906751643L; + +- JToolTip(String text) ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class AccessibleJToolTip extends AccessibleJComponent ++ { ++ /** ++ * Creates a new AccessibleJToolTip object. ++ */ ++ protected AccessibleJToolTip() + { +- this.text = text; + } +-} + ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public String getAccessibleDescription() ++ { ++ return null; ++ } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleRole getAccessibleRole() ++ { ++ return null; ++ } ++ } ++ ++ /** The text to display in the JToolTip. */ ++ String text; ++ ++ /** The JComponent this JToolTip is used for. */ ++ JComponent component; ++ ++ /** ++ * Creates a new JToolTip object. ++ */ ++ public JToolTip() ++ { ++ disableEvents(AWTEvent.MOUSE_EVENT_MASK); ++ updateUI(); ++ } ++ ++ /** ++ * This method returns the text this JToolTip displays. ++ * ++ * @return The text that this JToolTip displays. ++ */ ++ public String getTipText() ++ { ++ return text; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the JComponent this JToolTip displays for. ++ * ++ * @return The JComponent this JToolTip displays for. ++ */ ++ public JComponent getComponent() ++ { ++ return component; ++ } ++ ++ /** ++ * This method returns the UI responsible for displaying this JToolTip. ++ * ++ * @return The UI responsible for displaying this JToolTip. ++ */ ++ public ToolTipUI getUI() ++ { ++ return (ToolTipUI) ui; ++ } ++ ++ /** ++ * This method returns the String identifier for the UI class. ++ * ++ * @return The String identifier for the UI class. ++ */ ++ public String getUIClassID() ++ { ++ return "ToolTipUI"; ++ } ++ ++ /** ++ * This method returns a debugging String describing the JToolTip. ++ * ++ * @return A debugging String describing the JToolTip. ++ */ ++ protected String paramString() ++ { ++ return "JToolTip"; ++ } ++ ++ /** ++ * This method sets the JComponent that the JToolTip displays for. ++ * ++ * @param c The JComponent that the JToolTip displays for. ++ */ ++ public void setComponent(JComponent c) ++ { ++ component = c; ++ } ++ ++ /** ++ * This method sets the text that the JToolTip displays. ++ * ++ * @param tipText The text that the JToolTip displays. ++ */ ++ public void setTipText(String tipText) ++ { ++ text = tipText; ++ } ++ ++ /** ++ * This method resets the UI used to the Look and Feel default. ++ */ ++ public void updateUI() ++ { ++ setUI((ToolTipUI) UIManager.getUI(this)); ++ revalidate(); ++ repaint(); ++ } ++} +Index: javax/swing/JTree.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JTree.java,v +retrieving revision 1.2 +diff -u -r1.2 JTree.java +--- javax/swing/JTree.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JTree.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ +-/* JTree.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JTree.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,92 +35,439 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Dimension; + import java.awt.Rectangle; +-import java.io.Serializable; + import java.util.Hashtable; + import java.util.Vector; + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; +-import javax.swing.event.TreeModelEvent; +-import javax.swing.event.TreeModelListener; ++import javax.swing.event.TreeExpansionEvent; ++import javax.swing.event.TreeExpansionListener; + import javax.swing.event.TreeSelectionEvent; + import javax.swing.event.TreeSelectionListener; ++import javax.swing.event.TreeWillExpandListener; + import javax.swing.plaf.TreeUI; +-import javax.swing.tree.DefaultTreeSelectionModel; +-import javax.swing.tree.TreeCellEditor; ++import javax.swing.tree.ExpandVetoException; + import javax.swing.tree.TreeCellRenderer; + import javax.swing.tree.TreeModel; + import javax.swing.tree.TreeNode; + import javax.swing.tree.TreePath; +-import javax.swing.tree.TreeSelectionModel; +- +-public class JTree extends JComponent implements Scrollable, Accessible +-{ +- JTree() +- { +- updateUI(); +- } +- +- public TreeUI getUI() +- { +- return (TreeUI) ui; +- } +- +- public void setUI(TreeUI ui) +- { +- super.setUI(ui); +- } +- +- public void updateUI() +- { +- setUI((TreeUI)UIManager.getUI(this)); +- } +- +- +- public String getUIClassID() +- { +- return "JTree"; +- } +- +- +- public AccessibleContext getAccessibleContext() +- { +- return null; +- } +- +- public Dimension getPreferredScrollableViewportSize() +- { +- return null; +- } +- +- public int getScrollableUnitIncrement(Rectangle visibleRect, +- int orientation, +- int direction) +- { +- return 1; +- } +- +- public int getScrollableBlockIncrement(Rectangle visibleRect, +- int orientation, +- int direction) +- { +- return 1; +- } +- +- public boolean getScrollableTracksViewportWidth() +- { +- return false; +- } +- +- public boolean getScrollableTracksViewportHeight() +- { +- return false; +- } +-} + + ++public class JTree extends JComponent ++ implements Scrollable, Accessible ++{ ++ private static final long serialVersionUID = 7559816092864483649L; + ++ protected TreeCellRenderer cellRenderer; ++ protected boolean editable; ++ protected boolean rootVisible; ++ protected boolean showsRootHandles; ++ protected TreeModel treeModel; ++ ++ /** ++ * Creates a new JTree object. ++ */ ++ public JTree() ++ { ++ treeModel = createTreeModel(null); ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param value the initial nodes in the tree ++ */ ++ public JTree(Hashtable value) ++ { ++ treeModel = createTreeModel(value); ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param value the initial nodes in the tree ++ */ ++ public JTree(Object[] value) ++ { ++ treeModel = createTreeModel(value); ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param model the model to use ++ */ ++ public JTree(TreeModel model) ++ { ++ treeModel = model; ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param root the root node ++ */ ++ public JTree(TreeNode root) ++ { ++ this(root, false); ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param root the root node ++ * @param asksAllowChildren if false, all nodes without children are leaf nodes. ++ * If true, only nodes that do not allow children are leaf nodes. ++ */ ++ public JTree(TreeNode root, boolean asksAllowChildren) ++ { ++ } ++ ++ /** ++ * Creates a new JTree object. ++ * ++ * @param value the initial nodes in the tree ++ */ ++ public JTree(Vector value) ++ { ++ treeModel = createTreeModel(value); ++ } ++ ++ /** ++ * Creates a new TreeModel object. ++ * ++ * @param value the values stored in the model ++ */ ++ protected static TreeModel createTreeModel(Object value) ++ { ++ // FIXME: Implement this. ++ return null; ++ } ++ ++ /** ++ * Return the UI associated with this JTree object. ++ * ++ * @return the associated TreeUI object ++ */ ++ public TreeUI getUI() ++ { ++ return (TreeUI) ui; ++ } ++ ++ /** ++ * Sets the UI associated with this JTree object. ++ * ++ * @param ui the TreeUI to associate ++ */ ++ public void setUI(TreeUI ui) ++ { ++ super.setUI(ui); ++ } ++ ++ /** ++ * This method resets the UI used to the Look and Feel defaults.. ++ */ ++ public void updateUI() ++ { ++ setUI((TreeUI) UIManager.getUI(this)); ++ } ++ ++ /** ++ * This method returns the String ID of the UI class of Separator. ++ * ++ * @return The UI class' String ID. ++ */ ++ public String getUIClassID() ++ { ++ return "TreeUI"; ++ } ++ ++ /** ++ * Gets the AccessibleContext associated with this JToggleButton. ++ * ++ * @return the associated context ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ /** ++ * Returns the preferred viewport size.. ++ * ++ * @return the preferred size ++ */ ++ public Dimension getPreferredScrollableViewportSize() ++ { ++ return null; ++ } ++ ++ public int getScrollableUnitIncrement(Rectangle visibleRect, ++ int orientation, int direction) ++ { ++ return 1; ++ } ++ ++ public int getScrollableBlockIncrement(Rectangle visibleRect, ++ int orientation, int direction) ++ { ++ return 1; ++ } ++ ++ public boolean getScrollableTracksViewportWidth() ++ { ++ return false; ++ } ++ ++ public boolean getScrollableTracksViewportHeight() ++ { ++ return false; ++ } ++ ++ /** ++ * Adds a TreeExpansionListener object to the tree. ++ * ++ * @param listener the listener to add ++ */ ++ public void addTreeExpansionListener(TreeExpansionListener listener) ++ { ++ listenerList.add(TreeExpansionListener.class, listener); ++ } ++ ++ /** ++ * Removes a TreeExpansionListener object from the tree. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeTreeExpansionListener(TreeExpansionListener listener) ++ { ++ listenerList.remove(TreeExpansionListener.class, listener); ++ } ++ ++ /** ++ * Returns all added TreeExpansionListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public TreeExpansionListener[] getTreeExpansionListeners() ++ { ++ return (TreeExpansionListener[]) getListeners(TreeExpansionListener.class); ++ } ++ ++ /** ++ * Notifies all listeners that the tree was collapsed. ++ * ++ * @param path the path to the node that was collapsed ++ */ ++ public void fireTreeCollapsed(TreePath path) ++ { ++ TreeExpansionEvent event = new TreeExpansionEvent(this, path); ++ TreeExpansionListener[] listeners = getTreeExpansionListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].treeCollapsed(event); ++ } ++ ++ /** ++ * Notifies all listeners that the tree was expanded. ++ * ++ * @param path the path to the node that was expanded ++ */ ++ public void fireTreeExpanded(TreePath path) ++ { ++ TreeExpansionEvent event = new TreeExpansionEvent(this, path); ++ TreeExpansionListener[] listeners = getTreeExpansionListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].treeExpanded(event); ++ } ++ ++ /** ++ * Adds a TreeSelctionListener object to the tree. ++ * ++ * @param listener the listener to add ++ */ ++ public void addTreeSelectionListener(TreeSelectionListener listener) ++ { ++ listenerList.add(TreeSelectionListener.class, listener); ++ } ++ ++ /** ++ * Removes a TreeSelectionListener object from the tree. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeTreeSelectionListener(TreeSelectionListener listener) ++ { ++ listenerList.remove(TreeSelectionListener.class, listener); ++ } ++ ++ /** ++ * Returns all added TreeSelectionListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public TreeSelectionListener[] getTreeSelectionListeners() ++ { ++ return (TreeSelectionListener[]) getListeners(TreeSelectionListener.class); ++ } ++ ++ /** ++ * Notifies all listeners when the selection of the tree changed. ++ * ++ * @param event the event to send ++ */ ++ protected void fireValueChanged(TreeSelectionEvent event) ++ { ++ TreeSelectionListener[] listeners = getTreeSelectionListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].valueChanged(event); ++ } ++ ++ /** ++ * Adds a TreeWillExpandListener object to the tree. ++ * ++ * @param listener the listener to add ++ */ ++ public void addTreeWillExpandListener(TreeWillExpandListener listener) ++ { ++ listenerList.add(TreeWillExpandListener.class, listener); ++ } ++ ++ /** ++ * Removes a TreeWillExpandListener object from the tree. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeTreeWillExpandListener(TreeWillExpandListener listener) ++ { ++ listenerList.remove(TreeWillExpandListener.class, listener); ++ } ++ ++ /** ++ * Returns all added TreeWillExpandListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public TreeWillExpandListener[] getTreeWillExpandListeners() ++ { ++ return (TreeWillExpandListener[]) getListeners(TreeWillExpandListener.class); ++ } ++ ++ /** ++ * Notifies all listeners that the tree will collapse. ++ * ++ * @param path the path to the node that will collapse ++ */ ++ public void fireTreeWillCollapse(TreePath path) ++ throws ExpandVetoException ++ { ++ TreeExpansionEvent event = new TreeExpansionEvent(this, path); ++ TreeWillExpandListener[] listeners = getTreeWillExpandListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].treeWillCollapse(event); ++ } ++ ++ /** ++ * Notifies all listeners that the tree will expand. ++ * ++ * @param path the path to the node that will expand ++ */ ++ public void fireTreeWillExpand(TreePath path) ++ throws ExpandVetoException ++ { ++ TreeExpansionEvent event = new TreeExpansionEvent(this, path); ++ TreeWillExpandListener[] listeners = getTreeWillExpandListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].treeWillExpand(event); ++ } ++ ++ /** ++ * Returns the model of this JTree object. ++ * ++ * @return the associated TreeModel ++ */ ++ public TreeModel getModel() ++ { ++ return treeModel; ++ } ++ ++ /** ++ * Sets the model to use in JTree. ++ * ++ * @param model the TreeModel to use ++ */ ++ public void setModel(TreeModel model) ++ { ++ treeModel = model; ++ } ++ ++ /** ++ * Checks if this JTree object is editable. ++ * ++ * @return true if this tree object is editable, ++ * false otherwise ++ */ ++ public boolean isEditable() ++ { ++ return editable; ++ } ++ ++ /** ++ * Sets the editable property. ++ * ++ * @param flag true to make this tree object editable, ++ * false otherwise ++ */ ++ public void setEditable(boolean flag) ++ { ++ if (editable == flag) ++ return; ++ ++ boolean oldValue = editable; ++ editable = flag; ++ firePropertyChange("editable", oldValue, editable); ++ } ++ ++ /** ++ * Checks if the root element is visible. ++ * ++ * @return true if the root element is visible, ++ * false otherwise ++ */ ++ public boolean isRootVisbile() ++ { ++ return rootVisible; ++ } ++ ++ public void setRootVisible(boolean flag) ++ { ++ rootVisible = flag; ++ } ++ ++ public boolean getShowsRootHandles() ++ { ++ return showsRootHandles; ++ } ++ ++ public void setShowRootHandles(boolean flag) ++ { ++ showsRootHandles = flag; ++ } ++ ++ public TreeCellRenderer getCellRenderer() ++ { ++ return cellRenderer; ++ } ++ ++ public void setCellRenderer(TreeCellRenderer newRenderer) ++ { ++ cellRenderer = newRenderer; ++ } ++} +Index: javax/swing/JViewport.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JViewport.java,v +retrieving revision 1.2 +diff -u -r1.2 JViewport.java +--- javax/swing/JViewport.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/JViewport.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ + /* JViewport.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,104 +39,314 @@ + package javax.swing; + + import java.awt.Component; +-import java.awt.Container; ++import java.awt.Dimension; + import java.awt.Graphics; +-import java.awt.Image; ++import java.awt.Insets; + import java.awt.Point; + import java.awt.Rectangle; ++ + import javax.accessibility.Accessible; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; + import javax.swing.plaf.ViewportUI; + ++ ++/** ++ * ++ *
    ++ *                                                     _
    ++ *   +-------------------------------+    ...........Y1 \
    ++ *   |  view                         |                .  \
    ++ *   |  (this component's child)     |                .   > VY
    ++ *   |                               |                .  / = Y2-Y1
    ++ *   |         +------------------------------+  ....Y2_/
    ++ *   |         | viewport            |        |       .
    ++ *   |         | (this component)    |        |       .
    ++ *   |         |                     |        |       .
    ++ *   |         |                     |        |       .
    ++ *   |         |                     |        |       .
    ++ *   |         |                     |        |       .
    ++ *   |         +------------------------------+  ....Y3
    ++ *   |                               |                .
    ++ *   |         .                     |        .       .
    ++ *   |         .                     |        .       .
    ++ *   +---------.---------------------+    ...........Y4
    ++ *   .         .                     .        .
    ++ *   .         .                     .        .
    ++ *   .         .                     .        .
    ++ *   X1.......X2.....................X3.......X4
    ++ *   \____  ___/
    ++ *        \/
    ++ *        VX = X2-X1
    ++ *
    ++ * ++ *

    A viewport is, like all swing components, located at some position in ++ * the swing component tree; that location is exactly the same as any other ++ * components: the viewport's "bounds".

    ++ * ++ *

    But in terms of drawing its child, the viewport thinks of itself as ++ * covering a particular position of the view's coordinate space. ++ * For example, the {@link javax.JViewPort.getViewPosition} method returns ++ * the position (VX,VY) shown above, which is an position in ++ * "view space", even though this is implemented by positioning ++ * the underlying child at position (-VX,-VY)

    ++ * ++ */ + public class JViewport extends JComponent + { +- Component c; +- +- JViewport() +- { +- setOpaque(true); +- updateUI(); +- } +- +- void setView(Component c) +- { +- if (this.c != null) +- remove(c); +- +- this.c = c; +- +- add(c); +- } +- +- public String getUIClassID() +- { +- return "JViewport"; +- } +- +- public void updateUI() +- { +- ViewportUI vp = (ViewportUI) UIManager.getUI(this); +- setUI(vp); +- } +- +- Container GetHeavy(Container parent) +- { +- if (parent == null) +- return null; +- +- while (isLightweightComponent(parent)) +- { +- Container p = parent.getParent(); +- +- if (p == null) +- { +- System.out.println("GetHeavy FAILED, no heavy weight component found"); +- return parent; +- } +- +- parent = p; +- } +- return parent; +- } ++ private static final long serialVersionUID = -6925142919680527970L; ++ ++ public static final int SIMPLE_SCROLL_MODE = 0; ++ public static final int BLIT_SCROLL_MODE = 1; ++ public static final int BACKINGSTORE_SCROLL_MODE = 2; ++ ++ ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ int scrollMode; ++ ++ protected boolean scrollUnderway; ++ protected boolean isViewSizeSet; ++ ++ /** ++ * The width and height of the Viewport's area in terms of view ++ * coordinates. Typically this will be the same as the width and height ++ * of the viewport's bounds, unless the viewport transforms units of ++ * width and height, which it may do, for example if it magnifies or ++ * rotates its view. ++ * ++ * @see #toViewCoordinates ++ */ ++ Dimension extentSize; ++ ++ /** ++ * The width and height of the view in its own coordinate space. ++ */ ++ ++ Dimension viewSize; ++ ++ Point lastPaintPosition; ++ ++ public JViewport() ++ { ++ setOpaque(true); ++ updateUI(); ++ } ++ ++ public Dimension getExtentSize() ++ { ++ if (extentSize == null) ++ return toViewCoordinates(getSize()); ++ else ++ return extentSize; ++ } ++ ++ public Dimension toViewCoordinates(Dimension size) ++ { ++ return size; ++ } ++ ++ public Point toViewCoordinates(Point p) ++ { ++ Point pos = getViewPosition(); ++ return new Point(p.x + pos.x, ++ p.y + pos.y); ++ } ++ ++ public void setExtentSize(Dimension newSize) ++ { ++ extentSize = newSize; ++ fireStateChanged(); ++ } ++ ++ public Dimension getViewSize() ++ { ++ if (isViewSizeSet) ++ return viewSize; ++ else ++ return getView().getSize(); ++ } ++ ++ ++ public void setViewSize(Dimension newSize) ++ { ++ viewSize = newSize; ++ Component view = getView(); ++ if (view != null) ++ view.setSize(viewSize); ++ isViewSizeSet = true; ++ fireStateChanged(); ++ } ++ ++ /** ++ * Get the viewport's position in view space. Despite confusing name, ++ * this really does return the viewport's (0,0) position in view space, ++ * not the view's position. ++ */ ++ ++ public Point getViewPosition() ++ { ++ Component view = getView(); ++ if (view == null) ++ return new Point(0,0); ++ else ++ { ++ Point p = view.getLocation(); ++ p.x = -p.x; ++ p.y = -p.y; ++ return p; ++ } ++ } ++ ++ public void setViewPosition(Point p) ++ { ++ Component view = getView(); ++ if (view != null) ++ { ++ Point q = new Point(-p.x, -p.y); ++ view.setLocation(q); ++ fireStateChanged(); ++ } ++ } ++ ++ public Rectangle getViewRect() ++ { ++ return new Rectangle(getViewPosition(), ++ getExtentSize()); ++ } ++ ++ public boolean isBackingStoreEnabled() ++ { ++ return scrollMode == BACKINGSTORE_SCROLL_MODE; ++ } ++ ++ public void setBackingStoreEnabled(boolean b) ++ { ++ if (b && scrollMode != BACKINGSTORE_SCROLL_MODE) ++ { ++ scrollMode = BACKINGSTORE_SCROLL_MODE; ++ fireStateChanged(); ++ } ++ } ++ ++ public void setScrollMode(int mode) ++ { ++ scrollMode = mode; ++ fireStateChanged(); ++ } ++ ++ public int getScrollMode() ++ { ++ return scrollMode; ++ } ++ ++ public Component getView() ++ { ++ if (getComponentCount() == 0) ++ return null; ++ ++ return getComponents()[0]; ++ } ++ ++ public void setView(Component v) ++ { ++ while (getComponentCount() > 0) ++ remove(0); ++ if (v != null) ++ { ++ add(v); ++ fireStateChanged(); ++ } ++ } ++ ++ public void revalidate() ++ { ++ fireStateChanged(); ++ super.revalidate(); ++ } ++ ++ public void reshape(int x, int y, int w, int h) ++ { ++ boolean changed = ++ (x != getX()) ++ || (y != getY()) ++ || (w != getWidth()) ++ || (h != getHeight()); ++ super.reshape(x, y, w, h); ++ if (changed) ++ fireStateChanged(); ++ } + ++ public void addImpl(Component comp, Object constraints, int index) ++ { ++ if (getComponentCount() > 0) ++ remove(getComponents()[0]); + +- public void paint(Graphics g) +- { +- paintChildren(g); +- +- System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXX JViewport -----> paint()"); +- +- Container parent = GetHeavy(getParent()); +- +- System.out.println("parent = " + parent + ", " + getParent()); +- +- //parent.paint(); +- +- Graphics wg = parent.getGraphics(); +- +- int x = 0; +- int y = 0; +- int w = getWidth(); +- int h = getHeight(); +- +- Rectangle r = new Rectangle(x, y, w, h); +- +- int ox = 0; +- int oy = 0; +- +- wg.copyArea(r.x, +- r.y, +- r.width, +- r.height, +- ox, +- oy); ++ super.addImpl(comp, constraints, index); ++ } + +- wg.dispose(); +- } ++ public final Insets getInsets() ++ { ++ return new Insets(0,0,0,0); ++ } ++ ++ public final Insets getInsets(Insets insets) ++ { ++ if (insets == null) ++ return getInsets(); ++ insets.top = 0; ++ insets.bottom = 0; ++ insets.left = 0; ++ insets.right = 0; ++ return insets; ++ } ++ ++ public boolean isOptimizedDrawingEnabled() ++ { ++ return false; ++ } ++ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) getListeners(ChangeListener.class); ++ } ++ ++ public void paint(Graphics g) ++ { ++ paintComponent(g); ++ } ++ ++ void fireStateChanged() ++ { ++ ChangeListener[] listeners = getChangeListeners(); ++ for (int i = 0; i < listeners.length; ++i) ++ listeners[i].stateChanged(changeEvent); ++ } ++ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * This method returns the String ID of the UI class of Separator. ++ * ++ * @return The UI class' String ID. ++ */ ++ public String getUIClassID() ++ { ++ return "ViewportUI"; ++ } ++ ++ /** ++ * This method resets the UI used to the Look and Feel defaults.. ++ */ ++ public void updateUI() ++ { ++ setUI((ViewportUI) UIManager.getUI(this)); ++ } + } +- +- +- +- +- +- +- +Index: javax/swing/JWindow.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/JWindow.java,v +retrieving revision 1.3 +diff -u -r1.3 JWindow.java +--- javax/swing/JWindow.java 27 Jun 2003 12:41:52 -0000 1.3 ++++ javax/swing/JWindow.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ + /* JWindow.java -- +- Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -44,11 +44,11 @@ + import java.awt.Dimension; + import java.awt.Frame; + import java.awt.Graphics; +-import java.awt.GraphicsConfiguration; + import java.awt.LayoutManager; + import java.awt.Window; + import java.awt.event.KeyEvent; + import java.awt.event.WindowEvent; ++ + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + +@@ -58,8 +58,10 @@ + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ +-public class JWindow extends Window implements Accessible ++public class JWindow extends Window implements Accessible, RootPaneContainer + { ++ private static final long serialVersionUID = 5420698392125238833L; ++ + public final static int HIDE_ON_CLOSE = 0; + public final static int EXIT_ON_CLOSE = 1; + public final static int DISPOSE_ON_CLOSE = 2; +@@ -79,8 +81,8 @@ + *************/ + + public JWindow() +- { +- this(null); ++ { ++ super(SwingUtilities.getOwnerFrame()); + } + + // huuu ? +@@ -114,30 +116,23 @@ + return d; + } + +- JMenuBar getJMenuBar() +- { return getRootPane().getJMenuBar(); } +- +- void setJMenuBar(JMenuBar menubar) +- { getRootPane().setJMenuBar(menubar); } +- +- + public void setLayout(LayoutManager manager) + { super.setLayout(manager); } + +- void setLayeredPane(JLayeredPane layeredPane) ++ public void setLayeredPane(JLayeredPane layeredPane) + { getRootPane().setLayeredPane(layeredPane); } + +- JLayeredPane getLayeredPane() ++ public JLayeredPane getLayeredPane() + { return getRootPane().getLayeredPane(); } + +- JRootPane getRootPane() ++ public JRootPane getRootPane() + { + if (rootPane == null) + setRootPane(createRootPane()); + return rootPane; + } + +- void setRootPane(JRootPane root) ++ public void setRootPane(JRootPane root) + { + if (rootPane != null) + remove(rootPane); +@@ -146,19 +141,19 @@ + add(rootPane, BorderLayout.CENTER); + } + +- JRootPane createRootPane() ++ public JRootPane createRootPane() + { return new JRootPane(); } + +- Container getContentPane() ++ public Container getContentPane() + { return getRootPane().getContentPane(); } + +- void setContentPane(Container contentPane) ++ public void setContentPane(Container contentPane) + { getRootPane().setContentPane(contentPane); } + +- Component getGlassPane() ++ public Component getGlassPane() + { return getRootPane().getGlassPane(); } + +- void setGlassPane(Component glassPane) ++ public void setGlassPane(Component glassPane) + { getRootPane().setGlassPane(glassPane); } + + +Index: javax/swing/KeyStroke.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/KeyStroke.java,v +retrieving revision 1.3 +diff -u -r1.3 KeyStroke.java +--- javax/swing/KeyStroke.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/KeyStroke.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ + /* KeyStroke.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -41,231 +41,65 @@ + import java.awt.event.KeyEvent; + import java.io.Serializable; + +-/** +- * KeyStroke +- * @author Andrew Selkirk +- * @version 1.0 +- */ +-public class KeyStroke implements Serializable ++public class KeyStroke ++ extends AWTKeyStroke ++ implements Serializable + { + static final long serialVersionUID = -9060180771037902530L; ++ private KeyStroke() { ++ } ++ ++ protected KeyStroke(char keyChar, int keyCode, int modifiers, ++ boolean onKeyRelease) ++ { ++ super(keyChar, keyCode, modifiers, onKeyRelease); ++ } ++ ++ static ++ { ++ AWTKeyStroke.registerSubclass(KeyStroke.class); ++ } ++ ++ public static KeyStroke getKeyStroke(char keyChar) ++ { ++ return (KeyStroke) getAWTKeyStroke(keyChar); ++ } ++ ++ /** ++ * @deprecated Use {@link #getKeyStroke(char)} ++ * ++ * This method, unlike all the other factory methods on this object, ++ * returns a non-cached, non-shared object. New code should not use it. ++ */ ++ public static KeyStroke getKeyStroke(char keyChar, boolean onKeyRelease) ++ { ++ return new KeyStroke(keyChar, KeyEvent.VK_UNDEFINED, 0, onKeyRelease); ++ } ++ ++ public static KeyStroke getKeyStroke(Character keyChar, int modifiers) ++ { ++ return (KeyStroke) getAWTKeyStroke(keyChar, modifiers); ++ } ++ ++ public static KeyStroke getKeyStroke(int keyCode, int modifiers, ++ boolean onKeyRelease) ++ { ++ return (KeyStroke) getAWTKeyStroke(keyCode, modifiers, onKeyRelease); ++ } ++ ++ public static KeyStroke getKeyStroke(int keyCode, int modifiers) ++ { ++ return (KeyStroke) getAWTKeyStroke(keyCode, modifiers); ++ } ++ ++ public static KeyStroke getKeyStroke(String str) ++ { ++ return (KeyStroke) getAWTKeyStroke(str); ++ } ++ ++ public static KeyStroke getKeyStrokeForEvent(KeyEvent event) ++ { ++ return (KeyStroke) getAWTKeyStrokeForEvent(event); ++ } + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * keyChar +- */ +- private char keyChar = 0; +- +- /** +- * keyCode +- */ +- private int keyCode = 0; +- +- /** +- * modifiers +- */ +- private int modifiers = 0; +- +- /** +- * onKeyRelease +- */ +- private boolean onKeyRelease = false; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor KeyStroke +- */ +- private KeyStroke() { +- } // KeyStroke() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * hashCode +- * @returns int +- */ +- public int hashCode() { +- return 0; // TODO +- } // hashCode() +- +- /** +- * equals +- * @param object TODO +- * @returns boolean +- */ +- public boolean equals(Object object) { +- +- // Variables +- KeyStroke key; +- +- if (object instanceof KeyStroke) { +- key = (KeyStroke) object; +- if (key.keyChar == keyChar && +- key.keyCode == keyCode && +- key.modifiers == modifiers && +- key.onKeyRelease == onKeyRelease) { +- return true; +- } // if +- } // if +- return false; +- +- } // equals() +- +- /** +- * toString +- * @returns String +- */ +- public String toString() { +- return null; // TODO +- } // toString() +- +- /** +- * getKeyStroke +- * @param keyChar TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(char keyChar) { +- +- // Variables +- KeyStroke key; +- +- key = new KeyStroke(); +- key.keyChar = keyChar; +- return key; +- +- } // getKeyStroke() +- +- /** +- * getKeyStroke - deprecated +- * @param keyChar TODO +- * @param onKeyRelease TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(char keyChar, boolean onKeyRelease) { +- KeyStroke key = getKeyStroke(keyChar); +- key.onKeyRelease = onKeyRelease; +- return key; +- } // getKeyStroke() +- +- /** +- * getKeyStroke +- * @param keyChar TODO +- * @param modifiers TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(Character keyChar, int modifiers) { +- KeyStroke key = getKeyStroke(keyChar.charValue()); +- key.modifiers = modifiers; +- return key; +- } // getKeyStroke() +- +- /** +- * getKeyStroke +- * @param keyCode TODO +- * @param modifiers TODO +- * @param onKeyRelease TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(int keyCode, int modifiers, +- boolean onKeyRelease) { +- +- // Variables +- KeyStroke key; +- +- key = new KeyStroke(); +- key.keyCode = keyCode; +- key.modifiers = modifiers; +- key.onKeyRelease = onKeyRelease; +- return key; +- +- } // getKeyStroke() +- +- /** +- * getKeyStroke +- * @param keyCode TODO +- * @param modifiers TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(int keyCode, int modifiers) { +- return getKeyStroke(keyCode, modifiers, false); +- } // getKeyStroke() +- +- /** +- * getKeyStroke +- * @param string TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStroke(String string) { +- return null; // TODO +- } // getKeyStroke() +- +- /** +- * getKeyStrokeForEvent +- * @param event TODO +- * @returns KeyStroke +- */ +- public static KeyStroke getKeyStrokeForEvent(KeyEvent event) { +- +- // Variables +- int eventID; +- int eventMod; +- +- // Get Event ID +- eventID = event.getID(); +- eventMod = event.getModifiers(); +- +- // Check for KEY_TYPED event +- if (eventID == KeyEvent.KEY_TYPED) { +- return getKeyStroke(event.getKeyChar(), eventMod); +- +- // KEY_PRESSED or KEY_RELEASED event +- } else { +- return getKeyStroke(event.getKeyCode(), eventMod); +- } // if +- +- } // getKeyStrokeForEvent() +- +- /** +- * getKeyChar +- * @returns char +- */ +- public char getKeyChar() { +- return keyChar; +- } // getKeyChar() +- +- /** +- * getKeyCode +- * @returns int +- */ +- public int getKeyCode() { +- return keyCode; +- } // getKeyCode() +- +- /** +- * getModifiers +- * @returns int +- */ +- public int getModifiers() { +- return modifiers; // TODO +- } // getModifiers() +- +- /** +- * isOnKeyRelease +- * @returns boolean +- */ +- public boolean isOnKeyRelease() { +- return onKeyRelease; +- } // isOnKeyRelease() +- +- +-} // KeyStroke ++} +Index: javax/swing/ListModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ListModel.java,v +retrieving revision 1.2 +diff -u -r1.2 ListModel.java +--- javax/swing/ListModel.java 10 Jan 2004 21:07:43 -0000 1.2 ++++ javax/swing/ListModel.java 6 Sep 2004 16:35:59 -0000 +@@ -1,4 +1,4 @@ +-/* ListModel.java -- ++/* ListModel.java -- + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -36,13 +36,45 @@ + exception statement from your version. */ + + package javax.swing; +- + import javax.swing.event.ListDataListener; + ++/** ++ * This is an interface to general list-like data, typically used as the ++ * model object of a {@link JList} component. ++ * ++ * @author Graydon Hoare (graydon@redhat.com) ++ */ + public interface ListModel +-{ ++{ ++ /** ++ * Return the number of data elements in the list. ++ * ++ * @return The number of data elements in the list ++ */ + int getSize(); ++ ++ /** ++ * Retrieves a data element at a specified index. ++ * ++ * @param index The index of the element to retrieve ++ * ++ * @return The data element at the specified index ++ */ + Object getElementAt(int index); ++ ++ /** ++ * Add a listener object to this model. The listener will be called ++ * any time the set of elements in the model is changed. ++ * ++ * @param l The listener to add ++ */ + void addListDataListener(ListDataListener l); ++ ++ /** ++ * Add a listener object to this model. The listener will no longer be ++ * called when the set of elements in the model is changed. ++ * ++ * @param l The listener to remove ++ */ + void removeListDataListener(ListDataListener l); + } +Index: javax/swing/ListSelectionModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ListSelectionModel.java,v +retrieving revision 1.3 +diff -u -r1.3 ListSelectionModel.java +--- javax/swing/ListSelectionModel.java 12 Oct 2003 13:20:49 -0000 1.3 ++++ javax/swing/ListSelectionModel.java 6 Sep 2004 16:35:59 -0000 +@@ -42,24 +42,41 @@ + + public interface ListSelectionModel + { +- int SINGLE_SELECTION = 0; +- int SINGLE_INTERVAL_SELECTION = 1; +- int MULTIPLE_INTERVAL_SELECTION = 1; +- +- void setSelectionMode(int a); +- int getSelectionMode(); +- +- void clearSelection(); ++ int SINGLE_SELECTION = 0; ++ int SINGLE_INTERVAL_SELECTION = 1; ++ int MULTIPLE_INTERVAL_SELECTION = 2; ++ ++ void setSelectionMode(int a); ++ int getSelectionMode(); ++ ++ void clearSelection(); + +- int getMinSelectionIndex(); +- int getMaxSelectionIndex(); +- boolean isSelectedIndex(int a); ++ int getMinSelectionIndex(); ++ int getMaxSelectionIndex(); + +- void setSelectionInterval(int index0, int index1); ++ boolean isSelectedIndex(int a); + +- ++ boolean isSelectionEmpty(); ++ void setSelectionInterval(int index0, int index1); ++ void addSelectionInterval(int index0, ++ int index1); ++ void removeSelectionInterval(int index0, ++ int index1); ++ void insertIndexInterval(int index, ++ int length, ++ boolean before); ++ void removeIndexInterval(int index0, ++ int index1); ++ ++ int getAnchorSelectionIndex(); ++ void setAnchorSelectionIndex(int index); ++ int getLeadSelectionIndex(); ++ void setLeadSelectionIndex(int index); ++ ++ void setValueIsAdjusting(boolean valueIsAdjusting); ++ boolean getValueIsAdjusting(); + +- void addListSelectionListener(ListSelectionListener listener); +- void removeListSelectionListener(ListSelectionListener listener); ++ void addListSelectionListener(ListSelectionListener listener); ++ void removeListSelectionListener(ListSelectionListener listener); + + } +Index: javax/swing/LookAndFeel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/LookAndFeel.java,v +retrieving revision 1.2 +diff -u -r1.2 LookAndFeel.java +--- javax/swing/LookAndFeel.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/LookAndFeel.java 6 Sep 2004 16:35:59 -0000 +@@ -1,5 +1,5 @@ +-/* LookAndFeel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* LookAndFeel.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,93 +35,162 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Component; ++import java.awt.Toolkit; + import javax.swing.text.JTextComponent; + ++ + public abstract class LookAndFeel + { +- public UIDefaults getDefaults() +- { +- //This method is called once by UIManager.setLookAndFeel to create the look and feel specific defaults table. +- return null; +- } +- +- public abstract String getDescription(); +- public abstract String getID(); +- public abstract String getName(); +- +- public void initialize() +- { +- //UIManager.setLookAndFeel calls this method before the first call (and typically the only call) to getDefaults(). +- } +- +- static void installBorder(JComponent c, String defaultBorderName) +- { +- //Convenience method for installing a component's default Border object on the specified component if either the border is currently null or already an instance of UIResource. +- } +- +- public static void installColors(JComponent c, String defaultBgName, String defaultFgName) +- { +- //Convenience method for initializing a component's foreground and background color properties with values from the current defaults table. +- } +- +- public static void installColorsAndFont(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName) +- { +- //Convenience method for initializing a components foreground background and font properties with values from the current defaults table. +- } +- +- public abstract boolean isNativeLookAndFeel(); +- public abstract boolean isSupportedLookAndFeel(); +- +- public static void loadKeyBindings(InputMap retMap, Object[] keys) +- { +- //Loads the bindings in keys into retMap. +- } +- +- public static ComponentInputMap makeComponentInputMap(JComponent c, Object[] keys) +- { +- // Creates a ComponentInputMap from keys. +- return null; +- } +- +- public static Object makeIcon(Class baseClass, String gifFile) +- { +- //Utility method that creates a UIDefaults.LazyValue that creates an ImageIcon UIResource for the specified gifFile filename. +- return null; +- } +- +- public static InputMap makeInputMap(Object[] keys) +- { +- //Creates a InputMap from keys. +- return null; +- } +- +- public static JTextComponent.KeyBinding[] makeKeyBindings(Object[] keyBindingList) +- { +- // Convenience method for building lists of KeyBindings. +- return null; +- } +- ++ /** ++ * This method is called once by UIManager.setLookAndFeel to create ++ * the look and feel specific defaults table. ++ * ++ * @return the UI defaults ++ */ ++ public UIDefaults getDefaults() ++ { ++ return null; ++ } ++ ++ public abstract String getDescription(); ++ ++ public abstract String getID(); ++ ++ public abstract String getName(); ++ ++ /** ++ * Returns true when the Look and Feel supports window decorations, ++ * false others. This method returns always false and needs to be overwritten ++ * when the derived Look and Feel supports this. ++ * ++ * @return false ++ * ++ * @since 1.4 ++ */ ++ public boolean getSupportsWindowDecorations() ++ { ++ return false; ++ } + +- public String toString() +- { +- //Returns a string that displays and identifies this object's properties. +- return "LookAndFeel"; +- } +- +- public void uninitialize() +- { +- //UIManager.setLookAndFeel calls this method just before we're replaced by a new default look and feel. +- } +- +- +- public static void uninstallBorder(JComponent c) +- { +- //Convenience method for un-installing a component's default border on the specified component if the border is currently an instance of UIResource. +- } +- ++ /** ++ * UIManager.setLookAndFeel calls this method before the first call ++ * (and typically the only call) to getDefaults(). ++ */ ++ public void initialize() ++ { ++ } ++ ++ /** ++ * Convenience method for installing a component's default Border object ++ * on the specified component if either the border is currently null ++ * or already an instance of UIResource. ++ */ ++ public static void installBorder(JComponent c, String defaultBorderName) ++ { ++ } ++ ++ /** ++ * Convenience method for initializing a component's foreground and ++ * background color properties with values from the current defaults table. ++ */ ++ public static void installColors(JComponent c, String defaultBgName, String defaultFgName) ++ { ++ } ++ ++ /** ++ * Convenience method for initializing a components foreground background ++ * and font properties with values from the current defaults table. ++ */ ++ public static void installColorsAndFont(JComponent component, ++ String defaultBgName, ++ String defaultFgName, ++ String defaultFontName) ++ { ++ } ++ ++ public abstract boolean isNativeLookAndFeel(); ++ ++ public abstract boolean isSupportedLookAndFeel(); ++ ++ /** ++ * Loads the bindings in keys into retMap. ++ */ ++ public static void loadKeyBindings(InputMap retMap, Object[] keys) ++ { ++ } ++ ++ /** ++ * Creates a ComponentInputMap from keys. ++ */ ++ public static ComponentInputMap makeComponentInputMap(JComponent c, ++ Object[] keys) ++ { ++ return null; ++ } ++ ++ /** ++ * Utility method that creates a UIDefaults.LazyValue that creates an ++ * ImageIcon UIResource for the specified gifFile filename. ++ */ ++ public static Object makeIcon(Class baseClass, String gifFile) ++ { ++ return null; ++ } ++ ++ /** ++ * Creates a InputMap from keys. ++ */ ++ public static InputMap makeInputMap(Object[] keys) ++ { ++ return null; ++ } ++ ++ /** ++ * Convenience method for building lists of KeyBindings. ++ */ ++ public static JTextComponent.KeyBinding[] makeKeyBindings(Object[] keyBindingList) ++ { ++ return null; ++ } ++ ++ /** ++ * Invoked when the user attempts an invalid operation. The default implement ++ * just beeps. Subclasses that wish to change this need to override this ++ * method. ++ * ++ * @param component the component the error occured in ++ */ ++ public void provideErrorFeedback(Component component) ++ { ++ Toolkit.getDefaultToolkit().beep(); ++ } ++ ++ /** ++ * Returns a string that displays and identifies this object's properties. ++ * ++ * @return the string "LookAndFeel" ++ */ ++ public String toString() ++ { ++ return "LookAndFeel"; ++ } ++ ++ /** ++ * UIManager.setLookAndFeel calls this method just before we're replaced by ++ * a new default look and feel. ++ */ ++ public void uninitialize() ++ { ++ } ++ ++ /** ++ * Convenience method for un-installing a component's default border on the ++ * specified component if the border is currently an instance of UIResource. ++ */ ++ public static void uninstallBorder(JComponent c) ++ { ++ } + } +- +Index: javax/swing/MenuSelectionManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/MenuSelectionManager.java,v +retrieving revision 1.2 +diff -u -r1.2 MenuSelectionManager.java +--- javax/swing/MenuSelectionManager.java 19 Jun 2003 16:30:09 -0000 1.2 ++++ javax/swing/MenuSelectionManager.java 6 Sep 2004 16:36:00 -0000 +@@ -1,5 +1,5 @@ +-/* MenuSelectionManager.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* MenuSelectionManager.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,42 +35,349 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Point; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseEvent; ++import java.util.ArrayList; ++import java.util.Vector; ++import javax.swing.JMenu; ++import javax.swing.JMenuItem; + import javax.swing.event.ChangeEvent; + import javax.swing.event.ChangeListener; + import javax.swing.event.EventListenerList; + ++ ++/** ++ * This class manages current menu selectection. It provides ++ * methods to clear and set current selected menu path. ++ * It also fires StateChange event to its registered ++ * listeners whenever selected path of the current menu hierarchy ++ * changes. ++ * ++ */ + public class MenuSelectionManager + { +- protected ChangeEvent changeEvent; +- +- protected EventListenerList listenerList = new EventListenerList (); ++ /** ChangeEvent fired when selected path changes*/ ++ protected ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ /** List of listeners for this MenuSelectionManager */ ++ protected EventListenerList listenerList = new EventListenerList(); + +- protected void fireStateChanged () ++ /** Default manager for the current menu hierarchy*/ ++ private static final MenuSelectionManager manager = new MenuSelectionManager(); ++ ++ /** Path to the currently selected menu */ ++ private Vector selectedPath = new Vector(); ++ ++ /** ++ * Fires StateChange event to registered listeners ++ */ ++ protected void fireStateChanged() + { +- ChangeListener[] listeners = getChangeListeners (); ++ ChangeListener[] listeners = getChangeListeners(); + + for (int i = 0; i < listeners.length; i++) ++ listeners[i].stateChanged(changeEvent); ++ } ++ ++ /** ++ * Adds ChangeListener to this MenuSelectionManager ++ * ++ * @param listener ChangeListener to add ++ */ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Removes ChangeListener from the list of registered listeners ++ * for this MenuSelectionManager. ++ * ++ * @param listener ChangeListner to remove ++ */ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ /** ++ * Returns list of registered listeners with MenuSelectionManager ++ * ++ * @since 1.4 ++ */ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ /** ++ * Unselects all the menu elements on the selection path ++ */ ++ public void clearSelectedPath() ++ { ++ // Send events from the bottom most item in the menu - hierarchy to the ++ // top most ++ for (int i = selectedPath.size() - 1; i >= 0; i--) ++ ((MenuElement) selectedPath.get(i)).menuSelectionChanged(false); ++ ++ // clear selected path ++ selectedPath.clear(); ++ ++ // notify all listeners that the selected path was changed ++ fireStateChanged(); ++ } ++ ++ /** ++ * This method returns menu element on the selected path that contains ++ * given source point. If no menu element on the selected path contains this ++ * point, then null is returned. ++ * ++ * @param source Component relative to which sourcePoint is given ++ * @param sourcePoint point for which we want to find menu element that contains it ++ * ++ * @return Returns menu element that contains given source point and belongs ++ * to the currently selected path. Null is return if no such menu element found. ++ */ ++ public Component componentForPoint(Component source, Point sourcePoint) ++ { ++ // Convert sourcePoint to screen coordinates. ++ Point sourcePointOnScreen = sourcePoint; ++ SwingUtilities.convertPointToScreen(sourcePointOnScreen, source); ++ ++ Point compPointOnScreen; ++ Component resultComp = null; ++ ++ // For each menu element on the selected path, express its location ++ // in terms of screen coordinates and check if there is any ++ // menu element on the selected path that contains given source point. ++ for (int i = 0; i < selectedPath.size(); i++) + { +- listeners [i].stateChanged (new ChangeEvent (this)); ++ Component comp = ((Component) selectedPath.get(i)); ++ Dimension size = comp.getSize(); ++ ++ // convert location of this menu item to screen coordinates ++ compPointOnScreen = comp.getLocationOnScreen(); ++ ++ if (compPointOnScreen.x <= sourcePointOnScreen.x ++ && sourcePointOnScreen.x < compPointOnScreen.x + size.width ++ && compPointOnScreen.y <= sourcePointOnScreen.y ++ && sourcePointOnScreen.y < compPointOnScreen.y + size.height) ++ { ++ Point p = sourcePointOnScreen; ++ SwingUtilities.convertPointFromScreen(p, comp); ++ resultComp = SwingUtilities.getDeepestComponentAt(comp, p.x, p.y); ++ break; ++ } + } ++ return resultComp; + } + +- public void addChangeListener (ChangeListener listener) ++ /** ++ * Returns shared instance of MenuSelection Manager ++ * ++ * @return default Manager ++ */ ++ public static MenuSelectionManager defaultManager() + { +- listenerList.add (ChangeListener.class, listener); ++ return manager; + } + +- public void removeChangeListener (ChangeListener listener) ++ /** ++ * Returns path representing current menu selection ++ * ++ * @return Current selection path ++ */ ++ public MenuElement[] getSelectedPath() + { +- listenerList.remove (ChangeListener.class, listener); ++ MenuElement[] path = new MenuElement[selectedPath.size()]; ++ ++ for (int i = 0; i < path.length; i++) ++ path[i] = (MenuElement) selectedPath.get(i); ++ ++ return path; + } + +- /** @since 1.4 */ +- public ChangeListener[] getChangeListeners () ++ /** ++ * Returns true if specified component is part of current menu ++ * heirarchy and false otherwise ++ * ++ * @param c Component for which to check ++ * @return True if specified component is part of current menu ++ */ ++ public boolean isComponentPartOfCurrentMenu(Component c) + { +- return (ChangeListener[]) listenerList.getListeners (ChangeListener.class); ++ MenuElement[] subElements; ++ for (int i = 0; i < selectedPath.size(); i++) ++ { ++ subElements = ((MenuElement) selectedPath.get(i)).getSubElements(); ++ for (int j = 0; j < subElements.length; j++) ++ { ++ if ((subElements[j].getComponent()).equals(c)) ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param e DOCUMENT ME! ++ */ ++ public void processKeyEvent(KeyEvent e) ++ { ++ throw new UnsupportedOperationException("not implemented"); ++ } ++ ++ /** ++ * Forwards given mouse event to all of the source subcomponents. ++ * ++ * @param event Mouse event ++ */ ++ public void processMouseEvent(MouseEvent event) ++ { ++ Component source = ((Component) event.getSource()); ++ ++ // In the case of drag event, event.getSource() returns component ++ // where drag event originated. However menu element processing this ++ // event should be the one over which mouse is currently located, ++ // which is not necessary the source of the drag event. ++ Component mouseOverMenuComp; ++ ++ // find over which menu element the mouse is currently located ++ if (event.getID() == MouseEvent.MOUSE_DRAGGED ++ || event.getID() == MouseEvent.MOUSE_RELEASED) ++ mouseOverMenuComp = componentForPoint(source, event.getPoint()); ++ else ++ mouseOverMenuComp = source; ++ ++ // Process this event only if mouse is located over some menu element ++ if (mouseOverMenuComp != null && (mouseOverMenuComp instanceof MenuElement)) ++ { ++ MenuElement[] path = getPath(mouseOverMenuComp); ++ ((MenuElement) mouseOverMenuComp).processMouseEvent(event, path, ++ manager); ++ ++ // FIXME: Java specification says that mouse events should be ++ // forwarded to subcomponents. The code below does it, but ++ // menu's work fine without it. This code is commented for now. ++ ++ /* ++ MenuElement[] subComponents = ((MenuElement) mouseOverMenuComp) ++ .getSubElements(); ++ ++ for (int i = 0; i < subComponents.length; i++) ++ { ++ subComponents[i].processMouseEvent(event, path, manager); ++ } ++ */ ++ } ++ } ++ ++ /** ++ * Sets menu selection to the specified path ++ * ++ * @param path new selection path ++ */ ++ public void setSelectedPath(MenuElement[] path) ++ { ++ if (path == null) ++ { ++ clearSelectedPath(); ++ return; ++ } ++ ++ int i; ++ int minSize = path.length; // size of the smaller path. ++ ++ if (path.length > selectedPath.size()) ++ { ++ minSize = selectedPath.size(); ++ ++ // if new selected path contains more elements then current ++ // selection then first add all elements at ++ // the indexes > selectedPath.size ++ for (i = selectedPath.size(); i < path.length; i++) ++ { ++ selectedPath.add(path[i]); ++ path[i].menuSelectionChanged(true); ++ } ++ } ++ ++ else if (path.length < selectedPath.size()) ++ { ++ // if new selected path contains less elements then current ++ // selection then first remove all elements from the selection ++ // at the indexes > path.length ++ for (i = selectedPath.size() - 1; i >= path.length; i--) ++ { ++ ((MenuElement) selectedPath.get(i)).menuSelectionChanged(false); ++ selectedPath.remove(i); ++ } ++ ++ minSize = path.length; ++ } ++ ++ // Now compare elements in new and current selection path at the ++ // same location and adjust selection until ++ // same menu elements will be encountered at the ++ // same index in both current and new selection path. ++ MenuElement oldSelectedItem; ++ ++ for (i = minSize - 1; i >= 0; i--) ++ { ++ oldSelectedItem = (MenuElement) selectedPath.get(i); ++ ++ if (path[i].equals(oldSelectedItem)) ++ break; ++ ++ oldSelectedItem.menuSelectionChanged(false); ++ path[i].menuSelectionChanged(true); ++ selectedPath.setElementAt(path[i], i); ++ } ++ ++ fireStateChanged(); ++ } ++ ++ /** ++ * Returns path to the specified component ++ * ++ * @param c component for which to find path for ++ * ++ * @return path to the specified component ++ */ ++ private MenuElement[] getPath(Component c) ++ { ++ // FIXME: There is the same method in BasicMenuItemUI. However I ++ // cannot use it here instead of this method, since I cannot assume that ++ // all the menu elements on the selected path are JMenuItem or JMenu. ++ // For now I've just duplicated it here. Please ++ // fix me or delete me if another better approach will be found, and ++ // this method will not be necessary. ++ ArrayList path = new ArrayList(); ++ ++ // if given component is JMenu, we also need to include ++ // it's popup menu in the path ++ if (c instanceof JMenu) ++ path.add(((JMenu) c).getPopupMenu()); ++ while (c instanceof MenuElement) ++ { ++ path.add(0, (MenuElement) c); ++ ++ if (c instanceof JPopupMenu) ++ c = ((JPopupMenu) c).getInvoker(); ++ else ++ c = c.getParent(); ++ } ++ ++ MenuElement[] pathArray = new MenuElement[path.size()]; ++ path.toArray(pathArray); ++ return pathArray; + } +-} // class MenuSelectionManager ++} +Index: javax/swing/MutableComboBoxModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/MutableComboBoxModel.java,v +retrieving revision 1.2 +diff -u -r1.2 MutableComboBoxModel.java +--- javax/swing/MutableComboBoxModel.java 12 Oct 2003 13:20:49 -0000 1.2 ++++ javax/swing/MutableComboBoxModel.java 6 Sep 2004 16:36:00 -0000 +@@ -38,40 +38,46 @@ + package javax.swing; + + /** +- * MutableComboBoxModel +- * @author Andrew Selkirk +- * @version 1.0 ++ * MutableComboBoxModel is interface for data model that keeps track of the ++ * components data and provides methods to insert and remove elements from ++ * it. The Classes implementing this interface should fire appropriate ++ * events indicating the undergoing change in the data model. ++ * ++ * @author Andrew Selkirk ++ * @author Olga Rodimina ++ * @version 1.0 + */ +-public interface MutableComboBoxModel extends ComboBoxModel { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * addElement +- * @param object TODO +- */ +- void addElement(Object object); +- +- /** +- * removeElementAt +- * @param index TODO +- */ +- void removeElementAt(int index); +- +- /** +- * insertElementAt +- * @param object TODO +- * @param index TODO +- */ +- void insertElementAt(Object object, int index); +- +- /** +- * removeElement +- * @param object TODO +- */ +- void removeElement(Object object); +- +- ++public interface MutableComboBoxModel extends ComboBoxModel ++{ ++ /** ++ * This method adds given object to its data model. ++ * ++ * @param object element to add to the data model. ++ */ ++ void addElement(Object object); ++ ++ /** ++ * This method removes elements located at the given index in the data ++ * model. ++ * ++ * @param index index specifying location of the element to remove. ++ */ ++ void removeElementAt(int index); ++ ++ /** ++ * This method inserts givent element to the data model, at the specified ++ * index. ++ * ++ * @param object element to insert ++ * @param index index specifying the position in the data model where the ++ * given element should be inserted. ++ */ ++ void insertElementAt(Object object, int index); ++ ++ /** ++ * This method removes given element from the data model ++ * ++ * @param element to remove. ++ */ ++ void removeElement(Object object); + } // MutableComboBoxModel +Index: javax/swing/Popup.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/Popup.java,v +retrieving revision 1.1 +diff -u -r1.1 Popup.java +--- javax/swing/Popup.java 27 Jun 2003 12:41:52 -0000 1.1 ++++ javax/swing/Popup.java 6 Sep 2004 16:36:00 -0000 +@@ -163,7 +163,7 @@ + + + /** +- * Displays the popup’s JWindow on the screen. ++ * Displays the popup's JWindow on the screen. + * Nothing happens if it is already visible. + */ + public void show() +@@ -173,7 +173,7 @@ + + + /** +- * Removes the popup’s JWindow from the ++ * Removes the popup's JWindow from the + * screen. Nothing happens if it is currently not visible. + */ + public void hide() +Index: javax/swing/RepaintManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/RepaintManager.java,v +retrieving revision 1.2 +diff -u -r1.2 RepaintManager.java +--- javax/swing/RepaintManager.java 11 Jun 2003 13:20:39 -0000 1.2 ++++ javax/swing/RepaintManager.java 6 Sep 2004 16:36:00 -0000 +@@ -35,248 +35,505 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.Component; + import java.awt.Dimension; + import java.awt.Image; + import java.awt.Rectangle; ++import java.util.Enumeration; + import java.util.Hashtable; ++import java.util.HashMap; ++import java.util.Iterator; ++import java.util.Map; + import java.util.Vector; + ++ + /** +- * RepaintManager +- * @author Andrew Selkirk +- * @version 1.0 ++ *

    The repaint manager holds a set of dirty regions, invalid components, ++ * and a double buffer surface. The dirty regions and invalid components ++ * are used to coalesce multiple revalidate() and repaint() calls in the ++ * component tree into larger groups to be refreshed "all at once"; the ++ * double buffer surface is used by root components to paint ++ * themselves.

    ++ * ++ *

    In general, painting is very confusing in swing. see this ++ * document for more details.

    ++ * ++ * @author Graydon Hoare (graydon@redhat.com) + */ +-public class RepaintManager { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * dirtyComponents +- */ +- Hashtable dirtyComponents; +- +- /** +- * tmpDirtyComponents +- */ +- Hashtable tmpDirtyComponents; +- +- /** +- * invalidComponents +- */ +- Vector invalidComponents; +- +- /** +- * doubleBufferingEnabled +- */ +- boolean doubleBufferingEnabled; +- +- /** +- * doubleBuffer +- */ +- Image doubleBuffer; +- +- /** +- * doubleBufferSize +- */ +- Dimension doubleBufferSize; +- +- /** +- * doubleBufferMaxSize +- */ +- private Dimension doubleBufferMaxSize; +- +- /** +- * resetDoubleBuffer +- */ +- private boolean resetDoubleBuffer; +- +- /** +- * repaintManagerKey +- */ +- private static final Object repaintManagerKey = null; // TODO +- +- /** +- * tmp +- */ +- Rectangle tmp; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor RepaintManager +- */ +- public RepaintManager() { +- // TODO +- } // RepaintManager() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * toString +- * @returns String +- */ +- public synchronized String toString() { +- return null; // TODO +- } // toString() +- +- /** +- * currentManager +- * @param component TODO +- * @returns RepaintManager +- */ +- public static RepaintManager currentManager(Component component) { +- return null; // TODO +- } // currentManager() +- +- /** +- * currentManager +- * @param component TODO +- * @returns RepaintManager +- */ +- public static RepaintManager currentManager(JComponent component) { +- return null; // TODO +- } // currentManager() +- +- /** +- * setCurrentManager +- * @param manager TODO +- */ +- public static void setCurrentManager(RepaintManager manager) { +- // TODO +- } // setCurrentManager() +- +- /** +- * addInvalidComponent +- * @param component TODO +- */ +- public synchronized void addInvalidComponent(JComponent component) { +- // TODO +- } // addInvalidComponent() +- +- /** +- * removeInvalidComponent +- * @param component TODO +- */ +- public synchronized void removeInvalidComponent(JComponent component) { +- // TODO +- } // removeInvalidComponent() +- +- /** +- * addDirtyRegion +- * @param component TODO +- * @param x TODO +- * @param y TODO +- * @param w TODO +- * @param h TODO +- */ +- public synchronized void addDirtyRegion(JComponent component, int x, +- int y, int w, int h) { +- // TODO +- } // addDirtyRegion() +- +- /** +- * getDirtyRegion +- * @param component TODO +- * @returns Rectangle +- */ +- public Rectangle getDirtyRegion(JComponent component) { +- return null; // TODO +- } // getDirtyRegion() +- +- /** +- * markCompletelyDirty +- * @param component TODO +- */ +- public void markCompletelyDirty(JComponent component) { +- // TODO +- } // markCompletelyDirty() +- +- /** +- * markCompletelyClean +- * @param component TODO +- */ +- public void markCompletelyClean(JComponent component) { +- // TODO +- } // markCompletelyClean() +- +- /** +- * isCompletelyDirty +- * @param component TODO +- * @returns boolean +- */ +- public boolean isCompletelyDirty(JComponent component) { +- return false; // TODO +- } // isCompletelyDirty() +- +- /** +- * validateInvalidComponents +- */ +- public void validateInvalidComponents() { +- // TODO +- } // validateInvalidComponents() +- +- /** +- * paintDirtyRegions +- */ +- public void paintDirtyRegions() { +- // TODO +- } // paintDirtyRegions() +- +- /** +- * getOffscreenBuffer +- * @param component TODO +- * @param proposedWidth TODO +- * @param proposedHeight TODO +- * @returns Image +- */ +- public Image getOffscreenBuffer(Component component, +- int proposedWidth, int proposedHeight) { +- return null; // TODO +- } // getOffscreenBuffer() +- +- /** +- * getDoubleBufferMaximumSize +- * @returns Dimension +- */ +- public Dimension getDoubleBufferMaximumSize() { +- return null; // TODO +- } // getDoubleBufferMaximumSize() +- +- /** +- * setDoubleBufferMaximumSize +- * @param size TODO +- */ +- public void setDoubleBufferMaximumSize(Dimension size) { +- // TODO +- } // setDoubleBufferMaximumSize() +- +- /** +- * setDoubleBufferingEnabled +- * @param buffer TODO +- */ +- public void setDoubleBufferingEnabled(boolean buffer) { +- // TODO +- } // setDoubleBufferingEnabled() +- +- /** +- * isDoubleBufferingEnabled +- * @returns boolean +- */ +- public boolean isDoubleBufferingEnabled() { +- return false; // TODO +- } // isDoubleBufferingEnabled() +- ++public class RepaintManager ++{ + +-} // RepaintManager ++ /** ++ *

    A helper class which is placed into the system event queue at ++ * various times in order to facilitate repainting and layout. There is ++ * typically only one of these objects active at any time. When the ++ * {@link RepaintManager} is told to queue a repaint, it checks to see if ++ * a {@link RepaintWorker} is "live" in the system event queue, and if ++ * not it inserts one using {@link SwingUtilities.invokeLater}.

    ++ * ++ *

    When the {@link RepaintWorker} comes to the head of the system ++ * event queue, its {@link RepaintWorker#run} method is executed by the ++ * swing paint thread, which revalidates all invalid components and ++ * repaints any damage in the swing scene.

    ++ */ ++ ++ protected class RepaintWorker ++ implements Runnable ++ { ++ boolean live; ++ public RepaintWorker() ++ { ++ live = false; ++ } ++ public synchronized void setLive(boolean b) ++ { ++ live = b; ++ } ++ public synchronized boolean isLive() ++ { ++ return live; ++ } ++ public void run() ++ { ++ RepaintManager rm = RepaintManager.globalManager; ++ setLive(false); ++ rm.validateInvalidComponents(); ++ rm.paintDirtyRegions(); ++ } ++ } ++ ++ ++ /** ++ * A table storing the dirty regions of components. The keys of this ++ * table are components, the values are rectangles. Each component maps ++ * to exactly one rectangle. When more regions are marked as dirty on a ++ * component, they are union'ed with the existing rectangle. ++ * ++ * @see #addDirtyRegion ++ * @see #getDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyClean ++ * @see #markCompletelyDirty ++ */ ++ Hashtable dirtyComponents; ++ ++ /** ++ * A single, shared instance of the helper class. Any methods which mark ++ * components as invalid or dirty eventually activate this instance. It ++ * is added to the event queue if it is not already active, otherwise ++ * reused. ++ * ++ * @see #addDirtyRegion ++ * @see #addInvalidComponent ++ */ ++ RepaintWorker repaintWorker; ++ ++ /** ++ * The set of components which need revalidation, in the "layout" sense. ++ * There is no additional information about "what kind of layout" they ++ * need (as there is with dirty regions), so it is just a vector rather ++ * than a table. ++ * ++ * @see #addInvalidComponent ++ * @see #removeInvalidComponent ++ * @see #validateInvalidComponents ++ */ ++ Vector invalidComponents; ++ ++ /** ++ * Whether or not double buffering is enabled on this repaint ++ * manager. This is merely a hint to clients; the RepaintManager will ++ * always return an offscreen buffer when one is requested. ++ * ++ * @see #getDoubleBufferingEnabled ++ * @see #setDoubleBufferingEnabled ++ */ ++ boolean doubleBufferingEnabled; ++ ++ /** ++ * The current offscreen buffer. This is reused for all requests for ++ * offscreen drawing buffers. It grows as necessary, up to {@link ++ * #doubleBufferMaximumSize}, but there is only one shared instance. ++ * ++ * @see #getOffscreenBuffer ++ * @see #doubleBufferMaximumSize ++ */ ++ Image doubleBuffer; ++ ++ /** ++ * The maximum width and height to allocate as a double buffer. Requests ++ * beyond this size are ignored. ++ * ++ * @see #paintDirtyRegions ++ * @see #getDoubleBufferMaximumSize ++ * @see #setDoubleBufferMaximumSize ++ */ ++ Dimension doubleBufferMaximumSize; ++ ++ ++ /** ++ * The global, shared RepaintManager instance. This is reused for all ++ * components in all windows. ++ * ++ * @see #currentManager ++ * @see #setCurrentManager ++ */ ++ private static RepaintManager globalManager; ++ ++ /** ++ * Create a new RepaintManager object. ++ */ ++ public RepaintManager() ++ { ++ dirtyComponents = new Hashtable(); ++ invalidComponents = new Vector(); ++ repaintWorker = new RepaintWorker(); ++ doubleBufferMaximumSize = new Dimension(2000,2000); ++ doubleBufferingEnabled = true; ++ } ++ ++ /** ++ * Get the value of the shared {@link #globalManager} instance, possibly ++ * returning a special manager associated with the specified ++ * component. The default implementaiton ignores the component parameter. ++ * ++ * @param component A component to look up the manager of ++ * ++ * @return The current repaint manager ++ * ++ * @see #setCurrentManager ++ */ ++ public static RepaintManager currentManager(Component component) ++ { ++ if (globalManager == null) ++ globalManager = new RepaintManager(); ++ return globalManager; ++ } ++ ++ /** ++ * Get the value of the shared {@link #globalManager} instance, possibly ++ * returning a special manager associated with the specified ++ * component. The default implementaiton ignores the component parameter. ++ * ++ * @param component A component to look up the manager of ++ * ++ * @return The current repaint manager ++ * ++ * @see #setCurrentManager ++ */ ++ public static RepaintManager currentManager(JComponent component) ++ { ++ return currentManager((Component)component); ++ } ++ ++ /** ++ * Set the value of the shared {@link #globalManager} instance. ++ * ++ * @param manager The new value of the shared instance ++ * ++ * @see #currentManager ++ */ ++ public static void setCurrentManager(RepaintManager manager) ++ { ++ globalManager = manager; ++ } ++ ++ /** ++ * Add a component to the {@link #invalidComponents} vector. If the ++ * {@link #repaintWorker} class is not active, insert it in the system ++ * event queue. ++ * ++ * @param component The component to add ++ * ++ * @see #removeInvalidComponent ++ */ ++ public synchronized void addInvalidComponent(JComponent component) ++ { ++ Component ancestor = component.getParent(); ++ ++ while (ancestor != null ++ && (! (ancestor instanceof JComponent) ++ || ! ((JComponent) ancestor).isValidateRoot() )) ++ ancestor = ancestor.getParent(); ++ ++ if (ancestor != null ++ && ancestor instanceof JComponent ++ && ((JComponent) ancestor).isValidateRoot()) ++ component = (JComponent) ancestor; ++ ++ if (invalidComponents.contains(component)) ++ return; ++ ++ invalidComponents.add(component); ++ ++ if (! repaintWorker.isLive()) ++ { ++ repaintWorker.setLive(true); ++ SwingUtilities.invokeLater(repaintWorker); ++ } ++ } ++ ++ /** ++ * Remove a component from the {@link #invalidComponents} vector. ++ * ++ * @param component The component to remove ++ * ++ * @see #addInvalidComponent ++ */ ++ public synchronized void removeInvalidComponent(JComponent component) ++ { ++ invalidComponents.removeElement(component); ++ } ++ ++ /** ++ * Add a region to the set of dirty regions for a specified component. ++ * This involves union'ing the new region with any existing dirty region ++ * associated with the component. If the {@link #repaintWorker} class ++ * is not active, insert it in the system event queue. ++ * ++ * @param component The component to add a dirty region for ++ * @param x The left x coordinate of the new dirty region ++ * @param y The top y coordinate of the new dirty region ++ * @param w The width of the new dirty region ++ * @param h The height of the new dirty region ++ * ++ * @see #addDirtyRegion ++ * @see #getDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyClean ++ * @see #markCompletelyDirty ++ */ ++ public synchronized void addDirtyRegion(JComponent component, int x, int y, ++ int w, int h) ++ { ++ Rectangle r = new Rectangle(x, y, w, h); ++ if (dirtyComponents.containsKey(component)) ++ r = r.union((Rectangle)dirtyComponents.get(component)); ++ dirtyComponents.put(component, r); ++ if (! repaintWorker.isLive()) ++ { ++ repaintWorker.setLive(true); ++ SwingUtilities.invokeLater(repaintWorker); ++ } ++ } ++ ++ /** ++ * Get the dirty region associated with a component, or null ++ * if the component has no dirty region. ++ * ++ * @param component The component to get the dirty region of ++ * ++ * @return The dirty region of the component ++ * ++ * @see #dirtyComponents ++ * @see #addDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyClean ++ * @see #markCompletelyDirty ++ */ ++ public Rectangle getDirtyRegion(JComponent component) ++ { ++ return (Rectangle) dirtyComponents.get(component); ++ } ++ ++ /** ++ * Mark a component as dirty over its entire bounds. ++ * ++ * @param component The component to mark as dirty ++ * ++ * @see #dirtyComponents ++ * @see #addDirtyRegion ++ * @see #getDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyClean ++ */ ++ public void markCompletelyDirty(JComponent component) ++ { ++ Rectangle r = component.getBounds(); ++ addDirtyRegion(component, r.x, r.y, r.width, r.height); ++ } ++ ++ /** ++ * Remove all dirty regions for a specified component ++ * ++ * @param component The component to mark as clean ++ * ++ * @see #dirtyComponents ++ * @see #addDirtyRegion ++ * @see #getDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyDirty ++ */ ++ public void markCompletelyClean(JComponent component) ++ { ++ dirtyComponents.remove(component); ++ } ++ ++ /** ++ * Return true if the specified component is completely ++ * contained within its dirty region, otherwise false ++ * ++ * @param component The component to check for complete dirtyness ++ * ++ * @return Whether the component is completely dirty ++ * ++ * @see #dirtyComponents ++ * @see #addDirtyRegion ++ * @see #getDirtyRegion ++ * @see #isCompletelyDirty ++ * @see #markCompletelyClean ++ */ ++ public boolean isCompletelyDirty(JComponent component) ++ { ++ Rectangle dirty = (Rectangle) dirtyComponents.get(component); ++ if (dirty == null) ++ return false; ++ Rectangle r = component.getBounds(); ++ if (r == null) ++ return true; ++ return dirty.contains(r); ++ } ++ ++ /** ++ * Validate all components which have been marked invalid in the {@link ++ * #invalidComponents} vector. ++ */ ++ public void validateInvalidComponents() ++ { ++ for (Enumeration e = invalidComponents.elements(); e.hasMoreElements(); ) ++ { ++ JComponent comp = (JComponent) e.nextElement(); ++ if (! (comp.isVisible() && comp.isShowing())) ++ continue; ++ comp.validate(); ++ } ++ invalidComponents.clear(); ++ } ++ ++ /** ++ * Repaint all regions of all components which have been marked dirty in ++ * the {@link #dirtyComponents} table. ++ */ ++ public void paintDirtyRegions() ++ { ++ // step 1: pull out roots and calculate spanning damage ++ ++ HashMap roots = new HashMap(); ++ for (Enumeration e = dirtyComponents.keys(); e.hasMoreElements(); ) ++ { ++ JComponent comp = (JComponent) e.nextElement(); ++ if (! (comp.isVisible() && comp.isShowing())) ++ continue; ++ Rectangle damaged = getDirtyRegion(comp); ++ if (damaged.width == 0 || damaged.height == 0) ++ continue; ++ JRootPane root = comp.getRootPane(); ++ // If the component has no root, no repainting will occur. ++ if (root == null) ++ continue; ++ Rectangle rootDamage = SwingUtilities.convertRectangle(comp, damaged, root); ++ if (! roots.containsKey(root)) ++ { ++ roots.put(root, rootDamage); ++ } ++ else ++ { ++ roots.put(root, ((Rectangle)roots.get(root)).union(rootDamage)); ++ } ++ } ++ dirtyComponents.clear(); ++ ++ // step 2: paint those roots ++ Iterator i = roots.entrySet().iterator(); ++ while(i.hasNext()) ++ { ++ Map.Entry ent = (Map.Entry) i.next(); ++ JRootPane root = (JRootPane) ent.getKey(); ++ Rectangle rect = (Rectangle) ent.getValue(); ++ root.paintImmediately(rect); ++ } ++ } ++ ++ /** ++ * Get an offscreen buffer for painting a component's image. This image ++ * may be smaller than the proposed dimensions, depending on the value of ++ * the {@link #doubleBufferMaximumSize} property. ++ * ++ * @param component The component to return an offscreen buffer for ++ * @param proposedWidth The proposed width of the offscreen buffer ++ * @param proposedHeight The proposed height of the offscreen buffer ++ * ++ * @return A shared offscreen buffer for painting ++ * ++ * @see #doubleBuffer ++ */ ++ public Image getOffscreenBuffer(Component component, int proposedWidth, ++ int proposedHeight) ++ { ++ if (doubleBuffer == null ++ || (((doubleBuffer.getWidth(null) < proposedWidth) ++ || (doubleBuffer.getHeight(null) < proposedHeight)) ++ && (proposedWidth < doubleBufferMaximumSize.width) ++ && (proposedHeight < doubleBufferMaximumSize.height))) ++ { ++ doubleBuffer = component.createImage(proposedWidth, proposedHeight); ++ } ++ return doubleBuffer; ++ } ++ ++ /** ++ * Get the value of the {@link #doubleBufferMaximumSize} property. ++ * ++ * @return The current value of the property ++ * ++ * @see #setDoubleBufferMaximumSize ++ */ ++ public Dimension getDoubleBufferMaximumSize() ++ { ++ return doubleBufferMaximumSize; ++ } ++ ++ /** ++ * Set the value of the {@link #doubleBufferMaximumSize} property. ++ * ++ * @param size The new value of the property ++ * ++ * @see #getDoubleBufferMaximumSize ++ */ ++ public void setDoubleBufferMaximumSize(Dimension size) ++ { ++ doubleBufferMaximumSize = size; ++ } ++ ++ /** ++ * Set the value of the {@link #doubleBufferingEnabled} property. ++ * ++ * @param buffer The new value of the property ++ * ++ * @see #getDoubleBufferingEnabled ++ */ ++ public void setDoubleBufferingEnabled(boolean buffer) ++ { ++ doubleBufferingEnabled = buffer; ++ } ++ ++ /** ++ * Get the value of the {@link #doubleBufferingEnabled} property. ++ * ++ * @return The current value of the property ++ * ++ * @see #setDoubleBufferingEnabled ++ */ ++ public boolean isDoubleBufferingEnabled() ++ { ++ return doubleBufferingEnabled; ++ } ++ ++ public String toString() ++ { ++ return "RepaintManager"; ++ } ++} +Index: javax/swing/ScrollPaneConstants.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ScrollPaneConstants.java,v +retrieving revision 1.2 +diff -u -r1.2 ScrollPaneConstants.java +--- javax/swing/ScrollPaneConstants.java 12 Oct 2003 13:20:49 -0000 1.2 ++++ javax/swing/ScrollPaneConstants.java 6 Sep 2004 16:36:00 -0000 +@@ -1,5 +1,5 @@ + /* ScrollPaneConstants.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,116 +42,110 @@ + * @author Andrew Selkirk + * @version 1.0 + */ +-public interface ScrollPaneConstants { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * VIEWPORT +- */ +- String VIEWPORT = "VIEWPORT"; +- +- /** +- * VERTICAL_SCROLLBAR +- */ +- String VERTICAL_SCROLLBAR = "VERTICAL_SCROLLBAR"; +- +- /** +- * HORIZONTAL_SCROLLBAR +- */ +- String HORIZONTAL_SCROLLBAR = "HORIZONTAL_SCROLLBAR"; +- +- /** +- * ROW_HEADER +- */ +- String ROW_HEADER = "ROW_HEADER"; +- +- /** +- * COLUMN_HEADER +- */ +- String COLUMN_HEADER = "COLUMN_HEADER"; +- +- /** +- * LOWER_LEFT_CORNER +- */ +- String LOWER_LEFT_CORNER = "LOWER_LEFT_CORNER"; +- +- /** +- * LOWER_RIGHT_CORNER +- */ +- String LOWER_RIGHT_CORNER = "LOWER_RIGHT_CORNER"; +- +- /** +- * UPPER_LEFT_CORNER +- */ +- String UPPER_LEFT_CORNER = "UPPER_LEFT_CORNER"; +- +- /** +- * UPPER_RIGHT_CORNER +- */ +- String UPPER_RIGHT_CORNER = "UPPER_RIGHT_CORNER"; +- +- /** +- * LOWER_LEADING_CORNER +- */ +- String LOWER_LEADING_CORNER = "LOWER_LEADING_CORNER"; +- +- /** +- * LOWER_TRAILING_CORNER +- */ +- String LOWER_TRAILING_CORNER = "LOWER_TRAILING_CORNER"; +- +- /** +- * UPPER_LEADING_CORNER +- */ +- String UPPER_LEADING_CORNER = "UPPER_LEADING_CORNER"; +- +- /** +- * UPPER_TRAILING_CORNER +- */ +- String UPPER_TRAILING_CORNER = "UPPER_TRAILING_CORNER"; +- +- /** +- * VERTICAL_SCROLLBAR_POLICY +- */ +- String VERTICAL_SCROLLBAR_POLICY = "VERTICAL_SCROLLBAR_POLICY"; +- +- /** +- * HORIZONTAL_SCROLLBAR_POLICY +- */ +- String HORIZONTAL_SCROLLBAR_POLICY = "HORIZONTAL_SCROLLBAR_POLICY"; +- +- /** +- * VERTICAL_SCROLLBAR_AS_NEEDED +- */ +- int VERTICAL_SCROLLBAR_AS_NEEDED = 20; +- +- /** +- * VERTICAL_SCROLLBAR_NEVER +- */ +- int VERTICAL_SCROLLBAR_NEVER = 21; +- +- /** +- * VERTICAL_SCROLLBAR_ALWAYS +- */ +- int VERTICAL_SCROLLBAR_ALWAYS = 22; +- +- /** +- * HORIZONTAL_SCROLLBAR_AS_NEEDED +- */ +- int HORIZONTAL_SCROLLBAR_AS_NEEDED = 30; +- +- /** +- * HORIZONTAL_SCROLLBAR_NEVER +- */ +- int HORIZONTAL_SCROLLBAR_NEVER = 31; +- +- /** +- * HORIZONTAL_SCROLLBAR_ALWAYS +- */ +- int HORIZONTAL_SCROLLBAR_ALWAYS = 32; +- +- +-} // ScrollPaneConstants ++public interface ScrollPaneConstants ++{ ++ /** ++ * VIEWPORT ++ */ ++ String VIEWPORT = "VIEWPORT"; ++ ++ /** ++ * VERTICAL_SCROLLBAR ++ */ ++ String VERTICAL_SCROLLBAR = "VERTICAL_SCROLLBAR"; ++ ++ /** ++ * HORIZONTAL_SCROLLBAR ++ */ ++ String HORIZONTAL_SCROLLBAR = "HORIZONTAL_SCROLLBAR"; ++ ++ /** ++ * ROW_HEADER ++ */ ++ String ROW_HEADER = "ROW_HEADER"; ++ ++ /** ++ * COLUMN_HEADER ++ */ ++ String COLUMN_HEADER = "COLUMN_HEADER"; ++ ++ /** ++ * LOWER_LEFT_CORNER ++ */ ++ String LOWER_LEFT_CORNER = "LOWER_LEFT_CORNER"; ++ ++ /** ++ * LOWER_RIGHT_CORNER ++ */ ++ String LOWER_RIGHT_CORNER = "LOWER_RIGHT_CORNER"; ++ ++ /** ++ * UPPER_LEFT_CORNER ++ */ ++ String UPPER_LEFT_CORNER = "UPPER_LEFT_CORNER"; ++ ++ /** ++ * UPPER_RIGHT_CORNER ++ */ ++ String UPPER_RIGHT_CORNER = "UPPER_RIGHT_CORNER"; ++ ++ /** ++ * LOWER_LEADING_CORNER ++ */ ++ String LOWER_LEADING_CORNER = "LOWER_LEADING_CORNER"; ++ ++ /** ++ * LOWER_TRAILING_CORNER ++ */ ++ String LOWER_TRAILING_CORNER = "LOWER_TRAILING_CORNER"; ++ ++ /** ++ * UPPER_LEADING_CORNER ++ */ ++ String UPPER_LEADING_CORNER = "UPPER_LEADING_CORNER"; ++ ++ /** ++ * UPPER_TRAILING_CORNER ++ */ ++ String UPPER_TRAILING_CORNER = "UPPER_TRAILING_CORNER"; ++ ++ /** ++ * VERTICAL_SCROLLBAR_POLICY ++ */ ++ String VERTICAL_SCROLLBAR_POLICY = "VERTICAL_SCROLLBAR_POLICY"; ++ ++ /** ++ * HORIZONTAL_SCROLLBAR_POLICY ++ */ ++ String HORIZONTAL_SCROLLBAR_POLICY = "HORIZONTAL_SCROLLBAR_POLICY"; ++ ++ /** ++ * VERTICAL_SCROLLBAR_AS_NEEDED ++ */ ++ int VERTICAL_SCROLLBAR_AS_NEEDED = 20; ++ ++ /** ++ * VERTICAL_SCROLLBAR_NEVER ++ */ ++ int VERTICAL_SCROLLBAR_NEVER = 21; ++ ++ /** ++ * VERTICAL_SCROLLBAR_ALWAYS ++ */ ++ int VERTICAL_SCROLLBAR_ALWAYS = 22; ++ ++ /** ++ * HORIZONTAL_SCROLLBAR_AS_NEEDED ++ */ ++ int HORIZONTAL_SCROLLBAR_AS_NEEDED = 30; ++ ++ /** ++ * HORIZONTAL_SCROLLBAR_NEVER ++ */ ++ int HORIZONTAL_SCROLLBAR_NEVER = 31; ++ ++ /** ++ * HORIZONTAL_SCROLLBAR_ALWAYS ++ */ ++ int HORIZONTAL_SCROLLBAR_ALWAYS = 32; ++} +Index: javax/swing/ScrollPaneLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ScrollPaneLayout.java,v +retrieving revision 1.3 +diff -u -r1.3 ScrollPaneLayout.java +--- javax/swing/ScrollPaneLayout.java 11 Jun 2003 13:20:39 -0000 1.3 ++++ javax/swing/ScrollPaneLayout.java 6 Sep 2004 16:36:00 -0000 +@@ -1,5 +1,5 @@ + /* ScrollPaneLayout.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -41,9 +41,12 @@ + import java.awt.Component; + import java.awt.Container; + import java.awt.Dimension; ++import java.awt.Insets; + import java.awt.LayoutManager; + import java.awt.Rectangle; ++import java.awt.Point; + import java.io.Serializable; ++import javax.swing.border.Border; + + /** + * ScrollPaneLayout +@@ -55,258 +58,418 @@ + { + static final long serialVersionUID = -4480022884523193743L; + +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * UIResource +- */ +- public static class UIResource extends ScrollPaneLayout +- implements javax.swing.plaf.UIResource { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor UIResource +- */ +- public UIResource() { +- // TODO +- } // UIResource() +- +- +- } // UIResource +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * viewport +- */ +- protected JViewport viewport; +- +- /** +- * vsb +- */ +- protected JScrollBar vsb; +- +- /** +- * hsb +- */ +- protected JScrollBar hsb; +- +- /** +- * rowHead +- */ +- protected JViewport rowHead; +- +- /** +- * colHead +- */ +- protected JViewport colHead; +- +- /** +- * lowerLeft +- */ +- protected Component lowerLeft; +- +- /** +- * lowerRight +- */ +- protected Component lowerRight; +- +- /** +- * upperLeft +- */ +- protected Component upperLeft; +- +- /** +- * upperRight +- */ +- protected Component upperRight; +- +- /** +- * vsbPolicy +- */ +- protected int vsbPolicy; +- +- /** +- * hsbPolicy +- */ +- protected int hsbPolicy; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ScrollPaneLayout +- */ +- public ScrollPaneLayout() { +- // TODO +- } // ScrollPaneLayout() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * syncWithScrollPane +- * @param scrollPane TODO +- */ +- public void syncWithScrollPane(JScrollPane scrollPane) { +- // TODO +- } // syncWithScrollPane() +- +- /** +- * addSingletonComponent +- * @param oldComponent TODO +- * @param newComponent TODO +- * @returns Component +- */ +- protected Component addSingletonComponent(Component oldComponent, +- Component newComponent) { +- return null; // TODO +- } // addSingletonComponent() +- +- /** +- * addLayoutComponent +- * @param string TODO +- * @param component TODO +- */ +- public void addLayoutComponent(String string, Component component) { +- // TODO +- } // addLayoutComponent() +- +- /** +- * removeLayoutComponent +- * @param component TODO +- */ +- public void removeLayoutComponent(Component component) { +- // TODO +- } // removeLayoutComponent() +- +- /** +- * getVerticalScrollBarPolicy +- * @returns int +- */ +- public int getVerticalScrollBarPolicy() { +- return 0; // TODO +- } // getVerticalScrollBarPolicy() +- +- /** +- * setVerticalScrollBarPolicy +- * @param policy TODO +- */ +- public void setVerticalScrollBarPolicy(int policy) { +- // TODO +- } // setVerticalScrollBarPolicy() +- +- /** +- * getHorizontalScrollBarPolicy +- * @returns int +- */ +- public int getHorizontalScrollBarPolicy() { +- return 0; // TODO +- } // getHorizontalScrollBarPolicy() +- +- /** +- * setHorizontalScrollBarPolicy +- * @param policy TODO +- */ +- public void setHorizontalScrollBarPolicy(int policy) { +- // TODO +- } // setHorizontalScrollBarPolicy() +- +- /** +- * getViewport +- * @returns JViewport +- */ +- public JViewport getViewport() { +- return null; // TODO +- } // getViewport() +- +- /** +- * getHorizontalScrollBar +- * @returns JScrollBar +- */ +- public JScrollBar getHorizontalScrollBar() { +- return null; // TODO +- } // getHorizontalScrollBar() +- +- /** +- * getVerticalScrollBar +- * @returns JScrollBar +- */ +- public JScrollBar getVerticalScrollBar() { +- return null; // TODO +- } // getVerticalScrollBar() +- +- /** +- * getRowHeader +- * @returns JViewport +- */ +- public JViewport getRowHeader() { +- return null; // TODO +- } // getRowHeader() +- +- /** +- * getColumnHeader +- * @returns JViewport +- */ +- public JViewport getColumnHeader() { +- return null; // TODO +- } // getColumnHeader() +- +- /** +- * getCorner +- * @param key TODO +- * @returns Component +- */ +- public Component getCorner(String key) { +- return null; // TODO +- } // getCorner() +- +- /** +- * preferredLayoutSize +- * @param parent TODO +- * @returns Dimension +- */ +- public Dimension preferredLayoutSize(Container parent) { +- return null; // TODO +- } // preferredLayoutSize() +- +- /** +- * minimumLayoutSize +- * @param parent TODO +- * @returns Dimension +- */ +- public Dimension minimumLayoutSize(Container parent) { +- return null; // TODO +- } // minimumLayoutSize() +- +- /** +- * layoutContainer +- * @param parent TODO +- */ +- public void layoutContainer(Container parent) { +- // TODO +- } // layoutContainer() +- +- /** +- * getViewportBorderBounds +- * @param value0 TODO +- * @returns Rectangle +- */ +- public Rectangle getViewportBorderBounds(JScrollPane scrollPane) { +- return null; // TODO +- } // getViewportBorderBounds() ++ public static class UIResource extends ScrollPaneLayout ++ implements javax.swing.plaf.UIResource { ++ public UIResource() { ++ } ++ } ++ ++ protected JViewport viewport; ++ protected JScrollBar vsb; ++ protected JScrollBar hsb; ++ protected JViewport rowHead; ++ protected JViewport colHead; ++ protected Component lowerLeft; ++ protected Component lowerRight; ++ protected Component upperLeft; ++ protected Component upperRight; ++ protected int vsbPolicy; ++ protected int hsbPolicy; ++ ++ public ScrollPaneLayout() { ++ ++ } ++ ++ public void syncWithScrollPane(JScrollPane scrollPane) { ++ viewport = scrollPane.getViewport(); ++ rowHead = scrollPane.getRowHeader(); ++ colHead = scrollPane.getColumnHeader(); ++ vsb = scrollPane.getVerticalScrollBar(); ++ hsb = scrollPane.getHorizontalScrollBar(); ++ vsbPolicy = scrollPane.getVerticalScrollBarPolicy(); ++ hsbPolicy = scrollPane.getHorizontalScrollBarPolicy(); ++ lowerLeft = scrollPane.getCorner(LOWER_LEFT_CORNER); ++ lowerRight = scrollPane.getCorner(LOWER_RIGHT_CORNER); ++ upperLeft = scrollPane.getCorner(UPPER_LEFT_CORNER); ++ upperRight = scrollPane.getCorner(UPPER_RIGHT_CORNER); ++ } ++ ++ protected Component addSingletonComponent(Component oldComponent, ++ Component newComponent) { ++ return null; ++ } ++ ++ public void addLayoutComponent(String key, Component component) ++ { ++ if (key == VIEWPORT) ++ viewport = (JViewport) component; ++ else if (key == VERTICAL_SCROLLBAR) ++ vsb = (JScrollBar) component; ++ else if (key == HORIZONTAL_SCROLLBAR) ++ hsb = (JScrollBar) component; ++ else if (key == ROW_HEADER) ++ rowHead = (JViewport) component; ++ else if (key == COLUMN_HEADER) ++ colHead = (JViewport) component; ++ else if (key == LOWER_RIGHT_CORNER) ++ lowerRight = component; ++ else if (key == UPPER_RIGHT_CORNER) ++ upperRight = component; ++ else if (key == LOWER_LEFT_CORNER) ++ lowerLeft = component; ++ else if (key == UPPER_LEFT_CORNER) ++ upperLeft = component; ++ } ++ ++ public void removeLayoutComponent(Component component) { ++ if (component == viewport) ++ viewport = null; ++ else if (component == vsb) ++ vsb = null; ++ else if (component == hsb) ++ hsb = null; ++ else if (component == rowHead) ++ rowHead = null; ++ else if (component == colHead) ++ colHead = null; ++ else if (component == lowerRight) ++ lowerRight = null; ++ else if (component == upperRight) ++ upperRight = null; ++ else if (component == lowerLeft) ++ lowerLeft = null; ++ else if (component == upperLeft) ++ upperLeft = null; ++ } ++ ++ public int getVerticalScrollBarPolicy() ++ { ++ return vsbPolicy; ++ } ++ ++ public void setVerticalScrollBarPolicy(int policy) ++ { ++ vsbPolicy = policy; ++ } ++ ++ public int getHorizontalScrollBarPolicy() ++ { ++ return hsbPolicy; ++ } ++ ++ public void setHorizontalScrollBarPolicy(int policy) ++ { ++ hsbPolicy = policy; ++ } ++ ++ public JViewport getViewport() ++ { ++ return viewport; ++ } ++ ++ public JScrollBar getHorizontalScrollBar() ++ { ++ return hsb; ++ } ++ ++ public JScrollBar getVerticalScrollBar() ++ { ++ return vsb; ++ } ++ ++ public JViewport getRowHeader() ++ { ++ return rowHead; ++ } ++ ++ public JViewport getColumnHeader() ++ { ++ return colHead; ++ } ++ ++ public Component getCorner(String key) ++ { ++ if (key == LOWER_RIGHT_CORNER) ++ return lowerRight; ++ else if (key == UPPER_RIGHT_CORNER) ++ return upperRight; ++ else if (key == LOWER_LEFT_CORNER) ++ return lowerLeft; ++ else if (key == UPPER_LEFT_CORNER) ++ return upperLeft; ++ return null; ++ } ++ ++ private static void maybeSetPreferredSize(JComponent src, Dimension dim) ++ { ++ Dimension tmp = null; ++ if (src != null) ++ tmp = src.getPreferredSize(); ++ if (tmp != null) ++ dim.setSize(tmp); ++ } ++ ++ private static void maybeSetMinimumSize(JComponent src, Dimension dim) ++ { ++ Dimension tmp = null; ++ if (src != null) ++ tmp = src.getMinimumSize(); ++ if (tmp != null) ++ dim.setSize(tmp); ++ } ++ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ if (parent != null && parent instanceof JScrollPane) ++ { ++ JScrollPane sc = (JScrollPane) parent; ++ synchronized (sc.getTreeLock ()) ++ { ++ Dimension insetsSize = new Dimension(0,0); ++ Dimension viewportSize = new Dimension(0,0); ++ Dimension viewportInsetsSize = new Dimension(0,0); ++ Dimension columnHeaderSize = new Dimension(0,0); ++ Dimension rowHeaderSize = new Dimension(0,0); ++ Dimension verticalScrollBarSize = new Dimension(0,0); ++ Dimension horizontalScrollBarSize = new Dimension(0,0); ++ ++ Insets insets = sc.getInsets(); ++ Border viewportBorder = sc.getViewportBorder(); ++ Insets viewportInsets = null; ++ ++ if (viewportBorder != null) ++ { ++ viewportInsets = viewportBorder.getBorderInsets(parent); ++ if (viewportInsets != null) ++ viewportInsetsSize.setSize(viewportInsets.left + viewportInsets.right, ++ viewportInsets.top + viewportInsets.bottom); ++ } ++ ++ if (insets != null) ++ insetsSize.setSize(insets.left + insets.right, ++ insets.top + insets.bottom); ++ ++ if (viewport != null) ++ { ++ Component view = null; ++ Scrollable scr = null; ++ Dimension pref = null; ++ ++ view = viewport.getView(); ++ if (view != null && view instanceof Scrollable) ++ scr = (Scrollable) view; ++ if (scr != null) ++ pref = scr.getPreferredScrollableViewportSize(); ++ if (pref == null) ++ pref = viewport.getPreferredSize(); ++ if (pref != null) ++ viewportSize.setSize(pref); ++ } ++ ++ maybeSetPreferredSize(colHead, columnHeaderSize); ++ maybeSetPreferredSize(rowHead, rowHeaderSize); ++ maybeSetPreferredSize(vsb, verticalScrollBarSize); ++ maybeSetPreferredSize(hsb, horizontalScrollBarSize); ++ ++ return new Dimension(insetsSize.width ++ + viewportSize.width ++ + viewportInsetsSize.width ++ + rowHeaderSize.width ++ + verticalScrollBarSize.width, ++ insetsSize.height ++ + viewportSize.height ++ + viewportInsetsSize.height ++ + columnHeaderSize.height ++ + horizontalScrollBarSize.height); ++ } ++ } ++ else ++ { ++ return new Dimension(0,0); ++ } ++ } ++ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ if (parent instanceof JScrollPane) ++ { ++ JScrollPane sc = (JScrollPane) parent; ++ synchronized (sc.getTreeLock ()) ++ { ++ Dimension insetsSize = new Dimension(0,0); ++ Dimension viewportSize = new Dimension(0,0); ++ Dimension viewportInsetsSize = new Dimension(0,0); ++ Dimension columnHeaderSize = new Dimension(0,0); ++ Dimension rowHeaderSize = new Dimension(0,0); ++ Dimension verticalScrollBarSize = new Dimension(0,0); ++ Dimension horizontalScrollBarSize = new Dimension(0,0); ++ ++ Insets insets = sc.getInsets(); ++ Border viewportBorder = sc.getViewportBorder(); ++ Insets viewportInsets = null; ++ ++ if (viewportBorder != null) ++ { ++ viewportInsets = viewportBorder.getBorderInsets(parent); ++ if (viewportInsets != null) ++ viewportInsetsSize.setSize(viewportInsets.left + viewportInsets.right, ++ viewportInsets.top + viewportInsets.bottom); ++ } ++ ++ if (insets != null) ++ insetsSize.setSize(insets.left + insets.right, ++ insets.top + insets.bottom); ++ ++ maybeSetMinimumSize(viewport, viewportSize); ++ maybeSetMinimumSize(colHead, columnHeaderSize); ++ maybeSetMinimumSize(rowHead, rowHeaderSize); ++ ++ if (vsbPolicy != VERTICAL_SCROLLBAR_NEVER) ++ maybeSetMinimumSize(vsb, verticalScrollBarSize); ++ ++ if (hsbPolicy != HORIZONTAL_SCROLLBAR_NEVER) ++ maybeSetMinimumSize(hsb, horizontalScrollBarSize); ++ ++ return new Dimension(insetsSize.width ++ + viewportSize.width ++ + viewportInsetsSize.width ++ + rowHeaderSize.width ++ + verticalScrollBarSize.width, ++ insetsSize.height ++ + viewportSize.height ++ + viewportInsetsSize.height ++ + columnHeaderSize.height ++ + horizontalScrollBarSize.height); ++ } ++ } ++ else ++ { ++ return new Dimension(0,0); ++ } ++ } ++ ++ /** ++ * ++ * +----+--------------------+----+ y1 ++ * | c1 | column header | c2 | ++ * +----+--------------------+----+ y2 ++ * | r | | v | ++ * | o | | | ++ * | w | | s | ++ * | | | r | ++ * | h | | o | ++ * | e | viewport | l | ++ * | a | | l | ++ * | d | | b | ++ * | e | | a | ++ * | r | | r | ++ * +----+--------------------+----+ y3 ++ * | c3 | h scrollbar | c4 | ++ * +----+--------------------+----+ y4 ++ * x1 x2 x3 x4 ++ * ++ */ ++ public void layoutContainer(Container parent) ++ { ++ if (parent instanceof JScrollPane) ++ { ++ JScrollPane sc = (JScrollPane) parent; ++ synchronized (sc.getTreeLock ()) ++ { ++ JViewport viewport = sc.getViewport(); ++ Dimension viewSize = viewport.getViewSize(); ++ Point viewPos = viewport.getViewPosition(); ++ ++ int x1 = 0, x2 = 0, x3 = 0, x4 = 0; ++ int y1 = 0, y2 = 0, y3 = 0, y4 = 0; ++ ++ Rectangle scrollPaneBounds = SwingUtilities.calculateInnerArea(sc, null); ++ ++ x1 = scrollPaneBounds.x; ++ y1 = scrollPaneBounds.y; ++ x4 = scrollPaneBounds.x + scrollPaneBounds.width; ++ y4 = scrollPaneBounds.y + scrollPaneBounds.height; ++ ++ if (colHead != null) ++ y2 = y1 + colHead.getPreferredSize().height; ++ else ++ y2 = y1; ++ ++ if (rowHead != null) ++ x2 = x1 + rowHead.getPreferredSize().width; ++ else ++ x2 = x1; ++ ++ int vsbPolicy = sc.getVerticalScrollBarPolicy(); ++ int hsbPolicy = sc.getHorizontalScrollBarPolicy(); ++ ++ x3 = x4 - vsb.getPreferredSize().width; ++ y3 = y4 - hsb.getPreferredSize().height; ++ ++ boolean showVsb = ++ (vsb != null) ++ && ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS) ++ || (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED ++ && viewSize.height > (y3 - y2))); ++ ++ boolean showHsb = ++ (hsb != null) ++ && ((hsbPolicy == HORIZONTAL_SCROLLBAR_ALWAYS) ++ || (hsbPolicy == HORIZONTAL_SCROLLBAR_AS_NEEDED ++ && viewSize.width > (x3 - x2))); ++ ++ if (!showVsb) ++ x3 = x4; ++ ++ if (!showHsb) ++ y3 = y4; ++ ++ // now set the layout ++ ++ if (viewport != null) ++ viewport.setBounds(new Rectangle(x2, y2, x3-x2, y3-y2)); ++ ++ if (colHead != null) ++ colHead.setBounds(new Rectangle(x2, y1, x3-x2, y2-y1)); ++ ++ if (rowHead != null) ++ rowHead.setBounds(new Rectangle(x1, y2, x2-x1, y3-y2)); ++ ++ if (showVsb) ++ { ++ vsb.setVisible(true); ++ vsb.setBounds(new Rectangle(x3, y2, x4-x3, y3-y2)); ++ } ++ else if (vsb != null) ++ vsb.setVisible(false); ++ ++ if (showHsb) ++ { ++ hsb.setVisible(true); ++ hsb.setBounds(new Rectangle(x2, y3, x3-x2, y4-y3)); ++ } ++ else if (hsb != null) ++ hsb.setVisible(false); ++ ++ if (upperLeft != null) ++ upperLeft.setBounds(new Rectangle(x1, y1, x2-x1, y2-y1)); ++ ++ if (upperRight != null) ++ upperRight.setBounds(new Rectangle(x3, y1, x4-x3, y2-y1)); ++ ++ if (lowerLeft != null) ++ lowerLeft.setBounds(new Rectangle(x1, y3, x2-x1, y4-y3)); ++ ++ if (lowerRight != null) ++ lowerRight.setBounds(new Rectangle(x3, y3, x4-x3, y4-y3)); ++ ++ } ++ } ++ } ++ ++ public Rectangle getViewportBorderBounds(JScrollPane scrollPane) { ++ return null; ++ } + + +-} // ScrollPaneLayout ++} +Index: javax/swing/SpinnerNumberModel.java +=================================================================== +RCS file: javax/swing/SpinnerNumberModel.java +diff -N javax/swing/SpinnerNumberModel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/SpinnerNumberModel.java 6 Sep 2004 16:36:00 -0000 +@@ -0,0 +1,241 @@ ++/* SpinnerNumberModel.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++/** ++ * SpinnerNumberModel ++ * ++ * @author Ka-Hing Cheung ++ * @version 1.0 ++ */ ++public class SpinnerNumberModel extends AbstractSpinnerModel ++{ ++ /** DOCUMENT ME! */ ++ private Number value; ++ ++ /** DOCUMENT ME! */ ++ private Comparable minimum; ++ ++ /** DOCUMENT ME! */ ++ private Comparable maximum; ++ ++ /** DOCUMENT ME! */ ++ private Number stepSize; ++ ++ /** ++ * Creates a SpinnerNumberModel with initial value 0, step 1, ++ * and no maximum nor minimum. ++ */ ++ public SpinnerNumberModel() ++ { ++ this(new Integer(0), null, null, new Integer(1)); ++ } ++ ++ /** ++ * Creates a SpinnerNumberModel with double precision ++ * ++ * @param value the initial value ++ * @param minimum the minimum value ++ * @param maximum the maximum value ++ * @param stepSize the step size ++ */ ++ public SpinnerNumberModel(double value, double minimum, double maximum, ++ double stepSize) ++ { ++ this(new Double(value), new Double(minimum), new Double(maximum), ++ new Double(stepSize)); ++ } ++ ++ /** ++ * Creates a SpinnerNumberModel with integer precision ++ * ++ * @param value the initial value ++ * @param minimum the minimum value ++ * @param maximum the maximum value ++ * @param stepSize the step size ++ */ ++ public SpinnerNumberModel(int value, int minimum, int maximum, int stepSize) ++ { ++ this(new Integer(value), new Integer(minimum), new Integer(maximum), ++ new Integer(stepSize)); ++ } ++ ++ /** ++ * Creates a SpinnerNumberModel with Numbers and ++ * Comparables. ++ * ++ * @param value the initial value ++ * @param minimum the minimum value, if null there's no minimum ++ * @param maximum the maximum value, if null there's no maximum ++ * @param stepSize the step size ++ * ++ * @throws IllegalArgumentException if minimum <= value <= maximum ++ * does not hold ++ */ ++ public SpinnerNumberModel(Number value, Comparable minimum, ++ Comparable maximum, Number stepSize) ++ { ++ if (stepSize == null) ++ throw new IllegalArgumentException("stepSize may not be null"); ++ if (value == null) ++ throw new IllegalArgumentException("value may not be null"); ++ if (minimum != null) ++ { ++ if (minimum.compareTo(value) > 0) ++ throw new IllegalArgumentException("minimum is not <= value"); ++ } ++ else ++ minimum = new Comparable() ++ { ++ public int compareTo(Object obj) ++ { ++ return -1; ++ } ++ }; ++ ++ ++ if (maximum != null) ++ { ++ if (maximum.compareTo(value) < 0) ++ throw new IllegalArgumentException("maximum is not >= value"); ++ } ++ else ++ maximum = new Comparable() ++ { ++ public int compareTo(Object obj) ++ { ++ return 1; ++ } ++ }; ++ ++ ++ this.value = value; ++ this.stepSize = stepSize; ++ this.minimum = minimum; ++ this.maximum = maximum; ++ } ++ ++ /** ++ * Sets the new value and fire a change event ++ * ++ * @param value the new value ++ * ++ * @throws IllegalArgumentException if minimum <= value <= maximum ++ * does not hold ++ */ ++ public void setValue(Object value) ++ { ++ if (! (value instanceof Number)) ++ throw new IllegalArgumentException("value must be a Number"); ++ ++ this.value = (Number) value; ++ fireStateChanged(); ++ } ++ ++ /** ++ * Gets the current value ++ * ++ * @return the current value ++ */ ++ public Object getValue() ++ { ++ return value; ++ } ++ ++ /** ++ * Gets the next value without changing the current value, or null if the ++ * current value is maximum. ++ * ++ * @return the next value ++ */ ++ public Object getNextValue() ++ { ++ Number num; ++ ++ if (value instanceof Double) ++ num = new Double(value.doubleValue() + stepSize.doubleValue()); ++ else if (value instanceof Float) ++ num = new Double(value.floatValue() + stepSize.floatValue()); ++ else if (value instanceof Long) ++ num = new Long(value.longValue() + stepSize.longValue()); ++ else if (value instanceof Integer) ++ num = new Integer(value.intValue() + stepSize.intValue()); ++ else if (value instanceof Short) ++ num = new Short((short) (value.shortValue() + stepSize.shortValue())); ++ else ++ num = new Byte((byte) (value.byteValue() + stepSize.byteValue())); ++ ++ return maximum.compareTo(num) >= 0 ? num : null; ++ } ++ ++ /** ++ * Gets the previous value without changing the current value, or null if ++ * the current value is minimum. ++ * ++ * @return the previous value ++ */ ++ public Object getPreviousValue() ++ { ++ Number num; ++ ++ if (value instanceof Double) ++ num = new Double(value.doubleValue() - stepSize.doubleValue()); ++ else if (value instanceof Float) ++ num = new Double(value.floatValue() - stepSize.floatValue()); ++ else if (value instanceof Long) ++ num = new Long(value.longValue() - stepSize.longValue()); ++ else if (value instanceof Integer) ++ num = new Integer(value.intValue() - stepSize.intValue()); ++ else if (value instanceof Short) ++ num = new Short((short) (value.shortValue() - stepSize.shortValue())); ++ else ++ num = new Byte((byte) (value.byteValue() - stepSize.byteValue())); ++ ++ return minimum.compareTo(num) <= 0 ? num : null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Number getNumber() ++ { ++ return value; ++ } ++} +Index: javax/swing/Spring.java +=================================================================== +RCS file: javax/swing/Spring.java +diff -N javax/swing/Spring.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/Spring.java 6 Sep 2004 16:36:00 -0000 +@@ -0,0 +1,580 @@ ++/* Spring.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++/** ++ * Calculates the space between component edges, that are layed out by ++ * {@link SpringLayout}. ++ *

    ++ * A Spring defines a minimum, preferred and maximum distance for each edge ++ * (north, east, south, west) of a component. ++ *

    ++ * However, springs are not static, their actual values are computed at ++ * runtime. That means, if a Spring C is defined as the sum of Spring A and ++ * Spring B, then the values (min, pref and max) are not calculated at ++ * creation of Spring C, but instead always when {@link #getValue} is ++ * called. So, when Spring A or Spring B changes, this is reflected in ++ * Spring C. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++public abstract class Spring ++{ ++ ++ /** Indicates a not-set value. **/ ++ public static final int UNSET = -2147483648; ++ ++ /** ++ * Creates a new Spring object. This constructor is used by the static ++ * methods which create Springs. ++ */ ++ protected Spring() ++ { ++ } ++ ++ /** ++ * Creates a Spring which min, pref and max values are all the same. ++ * These kind of Springs are 'struts'. ++ * ++ * @param val the constant for min, pref and max values. ++ * @return a Spring object with constant values for min, pref and max. ++ */ ++ public static Spring constant(int val) ++ { ++ return new SimpleSpring(val, val, val); ++ } ++ ++ /** Creates a Spring which min, pref and max values are constants. ++ * @param min the constant for the minimum value. ++ * @param pref the constant for the preferred value. ++ * @param max the constant for the maximum value. ++ * @return a Spring object with constant values for min, pref and max. ++ */ ++ public static Spring constant(int min, int pref, int max) ++ { ++ return new SimpleSpring(min, pref, max); ++ } ++ ++ /** ++ * Returns the maximum value of the Spring. ++ * ++ * @return the maximum value. ++ */ ++ public abstract int getMaximumValue(); ++ ++ /** ++ * Returns the minimum value of this Spring. ++ * ++ * @return the minimum value. ++ */ ++ public abstract int getMinimumValue(); ++ ++ /** ++ * Return the preferred value of this Spring. ++ * ++ * @return the preferred value. ++ */ ++ public abstract int getPreferredValue(); ++ ++ /** ++ * Return the actual value of this Spring. ++ * ++ * @return the actual value of this Spring. ++ */ ++ public abstract int getValue(); ++ ++ /** ++ * Creates and returns a Spring, which always has the maximum values ++ * min = max(min_s1, min_s2), pref = max(pref_s1, pref_s2), max = ++ * max(max_s1, max_s2). ++ * ++ * @param s1 the first summand of the max Spring. ++ * @param s2 the second summand of the max Spring. ++ * @return a Spring which is max(s1, s2). ++ */ ++ public static Spring max(Spring s1, Spring s2) ++ { ++ return new MaxSpring(s1, s2); ++ } ++ ++ /** ++ * Creates and returns a Spring, which is always the negation of s. ++ * min = -min_s, pref = -pref_s, max = -max_pref. ++ * ++ * @param s the Spring to be negated. ++ * @return the negative of s. ++ */ ++ public static Spring minus(Spring s) ++ { ++ return new MinusSpring(s); ++ } ++ ++ /** ++ * Sets the actual value. If value is out of the (min, max) ++ * bounds, then the value is adjusted, so that is inside these bounds. ++ * ++ * @param value the value to be set. ++ */ ++ public abstract void setValue(int value); ++ ++ /** ++ * Creates and returns a Spring, which is always the sum of s1 and s2. ++ * min_sum = min_s1 + min_s2, pref_sum = pref_s1 + pref_s2, max_sum = ++ * max_s1 + max_s2. ++ * ++ * @param s1 the 1st summand of the sum Spring. ++ * @param s2 the 2nd summand of the sum Spring. ++ * @return a sum which is s1 + s2. ++ */ ++ public static Spring sum(Spring s1, Spring s2) ++ { ++ return new AddSpring(s1, s2); ++ } ++ ++ /** ++ * A simple Spring, that holds constant values for min, pref and max. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++ private static final class SimpleSpring extends Spring ++ { ++ ++ /** The constant value for min. */ ++ private final int min; ++ ++ /** The constant value for pref. */ ++ private final int pref; ++ ++ /** The constant value for max. */ ++ private final int max; ++ ++ /** The actual value of the spring. */ ++ private int value; ++ ++ /** ++ * Creates a new SimpleSpring object. ++ * ++ * @param min the constant minimum value. ++ * @param pref the constant preferred value. ++ * @param max the constant maximum value. ++ */ ++ public SimpleSpring(int newMin, int newPref, int newMax) ++ { ++ min = newMin; ++ pref = newPref; ++ max = newMax; ++ value = Spring.UNSET; ++ } ++ ++ /** ++ * Returns the maximum value of this Spring. ++ * ++ * @return the maximum value. ++ */ ++ public int getMaximumValue() ++ { ++ return max; ++ } ++ ++ /** ++ * Returns the minimum value of this Spring. ++ * ++ * @return the minimum value. ++ */ ++ public int getMinimumValue() ++ { ++ return min; ++ } ++ ++ /** ++ * Returns the preferred value of this Spring. ++ * ++ * @return the preferred value. ++ */ ++ public int getPreferredValue() ++ { ++ return pref; ++ } ++ ++ /** ++ * Return the actual current value of this Spring. ++ * ++ * @return the current value. ++ */ ++ public int getValue() ++ { ++ ++ if (value == Spring.UNSET) ++ { ++ value = pref; ++ } ++ ++ return value; ++ } ++ ++ /** ++ * Sets the current value. ++ * ++ * @param val the value to be set. ++ */ ++ public void setValue(int val) ++ { ++ ++ if (val > max) ++ { ++ value = max; ++ } ++ else if (val < min) ++ { ++ value = min; ++ } ++ else ++ { ++ value = val; ++ } ++ } ++ ++ } ++ ++ ++ /** ++ * A Spring, that is the sum of two other Springs. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++ private static final class AddSpring extends Spring ++ { ++ ++ /** The springs, that are the 'operands' of this Spring. */ ++ private final Spring s1; ++ private final Spring s2; ++ ++ /** The current value for this Spring. */ ++ private int value; ++ ++ /** ++ * Creates a new AddSpring object. ++ * ++ * @param s1 the first operand. ++ * @param s2 the second operand. ++ */ ++ protected AddSpring(Spring s1, Spring s2) ++ { ++ super(); ++ this.s1 = s1; ++ this.s2 = s2; ++ value = Spring.UNSET; ++ } ++ ++ /** ++ * Returns the maximum value of this Spring. ++ * ++ * @return the maximum value. ++ */ ++ public int getMaximumValue() ++ { ++ int max1 = s1.getMaximumValue(); ++ int max2 = s2.getMaximumValue(); ++ return max1 + max2; ++ } ++ ++ /** ++ * Return the minimum value of this Spring. ++ * ++ * @return the minimum value. ++ */ ++ public int getMinimumValue() ++ { ++ int min1 = s1.getMinimumValue(); ++ int min2 = s2.getMinimumValue(); ++ return min1 + min2; ++ } ++ ++ /** ++ * Returns the preferred value of this Spring. ++ * ++ * @return the preferred value. ++ */ ++ public int getPreferredValue() ++ { ++ int pref1 = s1.getPreferredValue(); ++ int pref2 = s2.getPreferredValue(); ++ return pref1 + pref2; ++ } ++ ++ /** ++ * Returns the actual current value of this Spring. ++ * ++ * @return the current value of this Spring. ++ */ ++ public int getValue() ++ { ++ if (value == Spring.UNSET) ++ { ++ int val1 = s1.getValue(); ++ int val2 = s2.getValue(); ++ value = val1 + val2; ++ } ++ return value; ++ } ++ ++ /** ++ * Sets the current value. ++ * ++ * @param val the value to be set. ++ */ ++ public void setValue(int val) ++ { ++ ++ if (val > getMaximumValue()) ++ { ++ value = getMaximumValue(); ++ } ++ else if (val < getMinimumValue()) ++ { ++ value = getMinimumValue(); ++ } ++ else ++ { ++ value = val; ++ } ++ ++ } ++ ++ } ++ ++ ++ /** ++ * A Spring that is calculated as the negation of another Spring. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++ private static final class MinusSpring extends Spring ++ { ++ ++ /** The Spring from which to calculate the negation. */ ++ private final Spring s; ++ ++ /** The current value of this Spring. */ ++ private int value; ++ ++ /** ++ * Creates a new MinusSpring object. ++ * @param s the Spring from which to calculate the negation. ++ */ ++ protected MinusSpring(Spring s) ++ { ++ super(); ++ this.s = s; ++ value = Spring.UNSET; ++ } ++ ++ /** Returns the maximum value of this Spring. ++ * ++ * @return the maximum value. ++ */ ++ public int getMaximumValue() ++ { ++ return -s.getMinimumValue(); ++ } ++ ++ /** ++ * Returns the minimum value of this Spring. ++ * ++ * @return the minimum value. ++ */ ++ public int getMinimumValue() ++ { ++ return -s.getMaximumValue(); ++ } ++ ++ /** ++ * Returns the preferred value of this Spring. ++ * ++ * @return the preferred value. ++ */ ++ public int getPreferredValue() ++ { ++ return -s.getPreferredValue(); ++ } ++ ++ /** ++ * Returns the current value of this Spring. ++ * ++ * @return the current value. ++ */ ++ public int getValue() ++ { ++ if (value == Spring.UNSET) ++ { ++ value = -s.getValue(); ++ } ++ return value; ++ } ++ ++ /** ++ * Sets the current value. ++ * ++ * @param val the value to be set. ++ */ ++ public void setValue(int val) ++ { ++ ++ if (val > getMaximumValue()) ++ { ++ value = getMaximumValue(); ++ } ++ else if (val < getMinimumValue()) ++ { ++ value = getMinimumValue(); ++ } ++ else ++ { ++ value = val; ++ } ++ ++ } ++ ++ } ++ ++ ++ /** ++ * A Spring, that is calculated as the maximum of two Springs. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++ private static final class MaxSpring extends Spring ++ { ++ ++ /** The two other Springs from which to calculate the maximum. */ ++ private final Spring s1; ++ private final Spring s2; ++ ++ /** The current value of this Spring. */ ++ private int value; ++ ++ /** ++ * Creates a new MaxSpring object. ++ * ++ * @param s1 the 1st operand. ++ * @param s2 the 2nd operand. ++ */ ++ protected MaxSpring(Spring s1, Spring s2) ++ { ++ super(); ++ this.s1 = s1; ++ this.s2 = s2; ++ value = Spring.UNSET; ++ } ++ ++ ++ /** ++ * Returns the maximum value of this Spring. ++ * ++ * @return the maximum value. ++ */ ++ public int getMaximumValue() ++ { ++ int max1 = s1.getMaximumValue(); ++ int max2 = s2.getMaximumValue(); ++ return Math.max(max1, max2); ++ } ++ ++ /** ++ * Returns the minimum value of this Spring. ++ * ++ * @return the minimum value. ++ */ ++ public int getMinimumValue() ++ { ++ int min1 = s1.getMinimumValue(); ++ int min2 = s2.getMinimumValue(); ++ return Math.max(min1, min2); ++ } ++ ++ /** ++ * Returns the preferred value of this Spring. ++ * ++ * @return the preferred value. ++ */ ++ public int getPreferredValue() ++ { ++ int pref1 = s1.getPreferredValue(); ++ int pref2 = s2.getPreferredValue(); ++ return Math.max(pref1, pref2); ++ } ++ ++ /** ++ * Returns the actual value of this Spring. ++ * ++ * @return the current value. ++ */ ++ public int getValue() ++ { ++ if (value == Spring.UNSET) ++ { ++ int val1 = s1.getValue(); ++ int val2 = s2.getValue(); ++ value = Math.max(val1, val2); ++ } ++ return value; ++ } ++ ++ /** ++ * Sets the current value. ++ * ++ * @param val the value to be set. ++ */ ++ public void setValue(int val) ++ { ++ ++ if (val > getMaximumValue()) ++ { ++ value = getMaximumValue(); ++ } ++ else if (val < getMinimumValue()) ++ { ++ value = getMinimumValue(); ++ } ++ else ++ { ++ value = val; ++ } ++ } ++ } ++} +Index: javax/swing/SpringLayout.java +=================================================================== +RCS file: javax/swing/SpringLayout.java +diff -N javax/swing/SpringLayout.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/SpringLayout.java 6 Sep 2004 16:36:00 -0000 +@@ -0,0 +1,660 @@ ++/* SpringLayout.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing; ++ ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.LayoutManager2; ++ ++import java.util.HashMap; ++import java.util.Map; ++ ++import javax.swing.Spring; ++ ++/** ++ * A very flexible layout manager. Components are laid out by defining the ++ * relationships between them. The relationships are expressed as ++ * {@link Spring}s. You can attach a Spring for each edge of a component and ++ * link it to an edge of a different component. For example, you can say, ++ * the northern edge of component A should be attached to the southern edge ++ * of component B, and the space between them should be something between ++ * x and y pixels, and preferably z pixels. ++ *

    While quite simple, this layout manager can be used to emulate most other ++ * layout managers, and can also be used to solve some layout problems, which ++ * would be hard to solve with other layout managers.

    ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++public class SpringLayout implements LayoutManager2 ++{ ++ ++ /** The right edge of a component. */ ++ public static final String EAST = "East"; ++ ++ /** The top edge of a component. */ ++ public static final String NORTH = "North"; ++ ++ /** The bottom edge of a component. */ ++ public static final String SOUTH = "South"; ++ ++ /** The left edge of a component. */ ++ public static final String WEST = "West"; ++ ++ /** maps components to their constraints. */ ++ private Map constraintsMap; ++ ++ /** ++ * The constraints that define the relationships between components. ++ * Each Constraints object can hold 4 Springs: one for each edge of the ++ * component. Additionally it can hold Springs for the components width ++ * and the components height. Since the height and width constraints are ++ * dependend on the other constraints, a component can be over-constraint. ++ * In this case (like when all of NORTH, SOUTH and HEIGHT are constraint), ++ * the values are adjusted, so that the mathematics still hold true. ++ * ++ * @author Roman Kennke (roman@ontographics.com) ++ */ ++ public final static class Constraints ++ { ++ ++ // The constraints for each edge, and width and height. ++ /** The Spring for the left edge. */ ++ private Spring x; ++ ++ /** The Spring for the upper edge. */ ++ private Spring y; ++ ++ /** The Spring for the height. */ ++ private Spring height; ++ ++ /** The Spring for the width. */ ++ private Spring width; ++ ++ /** The Spring for the right edge. */ ++ private Spring east; ++ ++ /** The Spring for the bottom edge. */ ++ private Spring south; ++ ++ /** ++ * Creates a new Constraints object. ++ * There is no constraint set. ++ */ ++ public Constraints() ++ { ++ x = y = height = width = east = south = null; ++ } ++ ++ /** ++ * Creates a new Constraints object. ++ * ++ * @param x the constraint for the left edge of the component. ++ * @param y the constraint for the upper edge of the component. ++ */ ++ public Constraints(Spring x, Spring y) ++ { ++ this.x = x; ++ this.y = y; ++ width = height = east = south = null; ++ } ++ ++ /** ++ * Creates a new Constraints object. ++ * ++ * @param x the constraint for the left edge of the component. ++ * @param y the constraint for the upper edge of the component. ++ * @param width the constraint for the width of the component. ++ * @param height the constraint for the height of the component. ++ */ ++ public Constraints(Spring x, Spring y, Spring width, Spring height) ++ { ++ this.x = x; ++ this.y = y; ++ this.width = width; ++ this.height = height; ++ east = south = null; ++ } ++ ++ /** ++ * Returns the constraint for the edge with the edgeName. ++ * This is expected to be one of ++ * {@link #EAST}, {@link #WEST}, {@link NORTH} or {@link SOUTH}. ++ * ++ * @param edgeName the name of the edge. ++ * @return the constraint for the specified edge. ++ */ ++ public Spring getConstraint(String edgeName) ++ { ++ Spring retVal = null; ++ if (edgeName.equals(SpringLayout.NORTH)) ++ retVal = y; ++ else if (edgeName.equals(SpringLayout.WEST)) ++ retVal = x; ++ else if (edgeName.equals(SpringLayout.SOUTH)) ++ { ++ retVal = south; ++ if ((retVal == null) && (y != null) && (height != null)) ++ retVal = Spring.sum(y, height); ++ } ++ else if (edgeName.equals(SpringLayout.EAST)) ++ { ++ retVal = east; ++ if ((retVal == null) && (x != null) && (width != null)) ++ retVal = Spring.sum(x, width); ++ } ++ ++ return retVal; ++ } ++ ++ /** ++ * Returns the constraint for the height of the component. ++ * ++ * @return the height constraint. ++ */ ++ public Spring getHeight() ++ { ++ Spring retVal = height; ++ if ((retVal == null) && (y != null) && (south != null)) ++ { ++ retVal = Spring.sum(south, Spring.minus(y)); ++ } ++ return retVal; ++ } ++ ++ /** ++ * Returns the constraint for the width of the component. ++ * ++ * @return the width constraint. ++ */ ++ public Spring getWidth() ++ { ++ Spring retVal = width; ++ if ((retVal == null) && (x != null) && (east != null)) ++ { ++ retVal = Spring.sum(east, Spring.minus(x)); ++ } ++ return retVal; ++ } ++ ++ /** ++ * Returns the constraint for the left edge of the component. ++ * ++ * @return the left-edge constraint (== WEST). ++ */ ++ public Spring getX() ++ { ++ Spring retVal = x; ++ if ((retVal == null) && (width != null) && (east != null)) ++ { ++ retVal = Spring.sum(east, Spring.minus(width)); ++ } ++ return retVal; ++ } ++ ++ /** ++ * Returns the constraint for the upper edge of the component. ++ * ++ * @return the upper-edge constraint (== NORTH). ++ */ ++ public Spring getY() ++ { ++ Spring retVal = y; ++ if ((retVal == null) && (height != null) && (south != null)) ++ { ++ retVal = Spring.sum(south, Spring.minus(height)); ++ } ++ return retVal; ++ } ++ ++ /** ++ * Sets a constraint for the specified edge. If this leads to an ++ * over-constrained situation, the constraints get adjusted, so that ++ * the mathematics still hold true. ++ * ++ * @param edgeName the name of the edge, one of {@link #EAST}, ++ * {@link #WEST}, {@link NORTH} or {@link SOUTH}. ++ * @param s the constraint to be set. ++ */ ++ public void setConstraint(String edgeName, Spring s) ++ { ++ ++ if (edgeName.equals(SpringLayout.WEST)) ++ { ++ x = s; ++ if ((width != null) && (east != null)) ++ width = Spring.sum(east, Spring.minus(x)); ++ } ++ else if (edgeName.equals(SpringLayout.NORTH)) ++ { ++ y = s; ++ if ((height != null) && (south != null)) ++ height = Spring.sum(south, Spring.minus(y)); ++ } ++ else if (edgeName.equals(SpringLayout.EAST)) ++ { ++ east = s; ++ if ((x != null) && (width != null)) ++ x = Spring.sum(east, Spring.minus(width)); ++ } ++ else if (edgeName.equals(SpringLayout.SOUTH)) ++ { ++ south = s; ++ if ((height != null) && (y != null)) ++ y = Spring.sum(south, Spring.minus(height)); ++ } ++ ++ } ++ ++ /** ++ * Sets the height-constraint. ++ * ++ * @param s the constraint to be set. ++ */ ++ public void setHeight(Spring s) ++ { ++ height = s; ++ if ((south != null) && (y != null)) ++ south = Spring.sum(y, height); ++ ++ } ++ ++ /** ++ * Sets the width-constraint. ++ * ++ * @param s the constraint to be set. ++ */ ++ public void setWidth(Spring s) ++ { ++ width = s; ++ if ((east != null) && (x != null)) ++ east = Spring.sum(x, width); ++ ++ } ++ ++ /** ++ * Sets the WEST-constraint. ++ * ++ * @param s the constraint to be set. ++ */ ++ public void setX(Spring s) ++ { ++ x = s; ++ if ((width != null) && (east != null)) ++ width = Spring.sum(east, Spring.minus(x)); ++ ++ } ++ ++ /** ++ * Sets the NORTH-constraint. ++ * ++ * @param s the constraint to be set. ++ */ ++ public void setY(Spring s) ++ { ++ y = s; ++ if ((height != null) && (south != null)) ++ height = Spring.sum(south, Spring.minus(y)); ++ ++ } ++ } ++ ++ /** ++ * Creates a new SpringLayout. ++ */ ++ public SpringLayout() ++ { ++ ++ constraintsMap = new HashMap(); ++ } ++ ++ /** ++ * Adds a layout component and a constraint object to this layout. ++ * This method is usually only called by a {@java.awt.Container}s add ++ * Method. ++ * ++ * @param component the component to be added. ++ * @param constraint the constraint to be set. ++ */ ++ public void addLayoutComponent(Component component, Object constraint) ++ { ++ constraintsMap.put(component, constraint); ++ } ++ ++ ++ /** ++ * Adds a layout component and a constraint object to this layout. ++ * This method is usually only called by a {@java.awt.Container}s add ++ * Method. This method does nothing, since SpringLayout does not manage ++ * String-indexed components. ++ * ++ * @param component the component to be added. ++ * @param constraint the constraint to be set. ++ */ ++ public void addLayoutComponent(String name, Component c) ++ { ++ // do nothing here. ++ } ++ ++ /** ++ * Returns the constraint of the edge named by edgeName. ++ * ++ * @param c the component from which to get the constraint. ++ * @param edgeName the name of the edge, one of {@link #EAST}, ++ * {@link #WEST}, {@link NORTH} or {@link SOUTH}. ++ * @return the constraint of the edge edgeName of the ++ * component c. ++ */ ++ public Spring getConstraint(String edgeName, Component c) ++ { ++ Constraints constraints = getConstraints(c); ++ return constraints.getConstraint(edgeName); ++ } ++ ++ /** ++ * Returns the {@link Constraints} object associated with the specified ++ * component. ++ * ++ * @param c the component for which to determine the constraint. ++ * @return the {@link Constraints} object associated with the specified ++ * component. ++ */ ++ public SpringLayout.Constraints getConstraints(Component c) ++ { ++ Constraints constraints = (Constraints) constraintsMap.get(c); ++ if (constraints == null) ++ { ++ Container parent = c.getParent(); ++ constraints = new Constraints(); ++ if (parent != null) ++ { ++ constraints.setX ++ (Spring.constant(parent.getInsets().left)); ++ constraints.setY ++ (Spring.constant(parent.getInsets().top)); ++ } ++ else ++ { ++ constraints.setX ++ (Spring.constant(0)); ++ constraints.setY ++ (Spring.constant(0)); ++ ++ } ++ constraints.setWidth ++ (Spring.constant(c.getMinimumSize().width, ++ c.getPreferredSize().width, ++ c.getMaximumSize().width)); ++ constraints.setHeight ++ (Spring.constant(c.getMinimumSize().height, ++ c.getPreferredSize().height, ++ c.getMaximumSize().height)); ++ ++ constraintsMap.put(c, constraints); ++ ++ } ++ ++ return constraints; ++ } ++ ++ /** ++ * Returns the X alignment of the Container p. ++ * ++ * @param p the {@link java.awt.Container} for which to determine the X ++ * alignment. ++ * @return always 0.0 ++ */ ++ public float getLayoutAlignmentX(Container p) ++ { ++ return 0.0F; ++ } ++ ++ /** ++ * Returns the Y alignment of the Container p. ++ * ++ * @param p the {@link java.awt.Container} for which to determine the Y ++ * alignment. ++ * @return always 0.0 ++ */ ++ public float getLayoutAlignmentY(Container p) ++ { ++ return 0.0F; ++ } ++ ++ /** ++ * Recalculate a possibly cached layout. ++ */ ++ public void invalidateLayout(Container p) ++ { ++ // nothing to do here yet ++ } ++ ++ /** ++ * Lays out the container p. ++ * ++ * @param p the container to be laid out. ++ */ ++ public void layoutContainer(Container p) ++ { ++ ++ addLayoutComponent(p, new Constraints(Spring.constant(0), ++ Spring.constant(0))); ++ ++ int offsetX = p.getInsets().left; ++ int offsetY = p.getInsets().right; ++ ++ Component[] components = p.getComponents(); ++ for (int index = 0; index < components.length; index++) ++ { ++ Component c = components[index]; ++ Constraints constraints = getConstraints(c); ++ int x = constraints.getX().getValue(); ++ int y = constraints.getY().getValue(); ++ int width = constraints.getWidth().getValue(); ++ int height = constraints.getHeight().getValue(); ++ ++ c.setLocation(x + offsetX, y + offsetY); ++ c.setSize(width, height); ++ } ++ ++ } ++ ++ /** ++ * Calculates the maximum size of the layed out container. This ++ * respects the maximum sizes of all contained components. ++ * ++ * @param p the container to be laid out. ++ * @return the maximum size of the container. ++ */ ++ public Dimension maximumLayoutSize(Container p) ++ { ++ int maxX = 0; ++ int maxY = 0; ++ ++ int offsetX = p.getInsets().left; ++ int offsetY = p.getInsets().right; ++ ++ Component[] components = p.getComponents(); ++ for (int index = 0; index < components.length; index++) ++ { ++ Component c = components[index]; ++ Constraints constraints = getConstraints(c); ++ int x = constraints.getX().getMaximumValue(); ++ int y = constraints.getY().getMaximumValue(); ++ int width = constraints.getWidth().getMaximumValue(); ++ int height = constraints.getHeight().getMaximumValue(); ++ ++ int rightEdge = offsetX + x + width; ++ if (rightEdge > maxX) ++ maxX = rightEdge; ++ int bottomEdge = offsetY + y + height; ++ if (bottomEdge > maxY) ++ maxY = bottomEdge; ++ } ++ ++ return new Dimension(maxX, maxY); ++ } ++ ++ ++ /** ++ * Calculates the minimum size of the layed out container. This ++ * respects the minimum sizes of all contained components. ++ * ++ * @param p the container to be laid out. ++ * @return the minimum size of the container. ++ */ ++ public Dimension minimumLayoutSize(Container p) ++ { ++ int maxX = 0; ++ int maxY = 0; ++ ++ int offsetX = p.getInsets().left; ++ int offsetY = p.getInsets().right; ++ ++ Component[] components = p.getComponents(); ++ for (int index = 0; index < components.length; index++) ++ { ++ Component c = components[index]; ++ Constraints constraints = getConstraints(c); ++ int x = constraints.getX().getMinimumValue(); ++ int y = constraints.getY().getMinimumValue(); ++ int width = constraints.getWidth().getMinimumValue(); ++ int height = constraints.getHeight().getMinimumValue(); ++ ++ int rightEdge = offsetX + x + width; ++ if (rightEdge > maxX) ++ maxX = rightEdge; ++ int bottomEdge = offsetY + y + height; ++ if (bottomEdge > maxY) ++ maxY = bottomEdge; ++ } ++ ++ return new Dimension(maxX, maxY); ++ } ++ ++ /** ++ * Calculates the preferred size of the layed out container. This ++ * respects the preferred sizes of all contained components. ++ * ++ * @param p the container to be laid out. ++ * @return the preferred size of the container. ++ */ ++ public Dimension preferredLayoutSize(Container p) ++ { ++ int maxX = 0; ++ int maxY = 0; ++ ++ int offsetX = p.getInsets().left; ++ int offsetY = p.getInsets().right; ++ ++ Component[] components = p.getComponents(); ++ for (int index = 0; index < components.length; index++) ++ { ++ Component c = components[index]; ++ Constraints constraints = getConstraints(c); ++ int x = constraints.getX().getPreferredValue(); ++ int y = constraints.getY().getPreferredValue(); ++ int width = constraints.getWidth().getPreferredValue(); ++ int height = constraints.getHeight().getPreferredValue(); ++ ++ int rightEdge = offsetX + x + width; ++ if (rightEdge > maxX) ++ maxX = rightEdge; ++ int bottomEdge = offsetY + y + height; ++ if (bottomEdge > maxY) ++ maxY = bottomEdge; ++ } ++ ++ return new Dimension(maxX, maxY); ++ } ++ ++ /** ++ * Attaches the edge e1 of component c1 to ++ * the edge e2 of component c2 width the ++ * fixed strut pad. ++ * ++ * @param e1 the edge of component 1. ++ * @param c1 the component 1. ++ * @param pad the space between the components in pixels. ++ * @param e2 the edge of component 2. ++ * @param c2 the component 2. ++ */ ++ public void putConstraint(String e1, Component c1, int pad, String e2, ++ Component c2) ++ { ++ Constraints constraints1 = getConstraints(c1); ++ Constraints constraints2 = getConstraints(c2); ++ ++ Spring strut = Spring.constant(pad); ++ Spring otherEdge = constraints2.getConstraint(e2); ++ constraints1.setConstraint(e1, Spring.sum(strut, otherEdge)); ++ ++ } ++ ++ /** ++ * Attaches the edge e1 of component c1 to ++ * the edge e2 of component c2 width the ++ * {@link Spring} s. ++ * ++ * @param e1 the edge of component 1. ++ * @param c1 the component 1. ++ * @param s the space between the components as a {@link Spring} object. ++ * @param e2 the edge of component 2. ++ * @param c2 the component 2. ++ */ ++ public void putConstraint(String e1, Component c1, Spring s, String e2, ++ Component c2) ++ { ++ Constraints constraints1 = getConstraints(c1); ++ Constraints constraints2 = getConstraints(c2); ++ ++ Spring otherEdge = constraints2.getConstraint(e2); ++ constraints1.setConstraint(e1, Spring.sum(s, otherEdge)); ++ ++ } ++ ++ /** ++ * Removes a layout component. ++ * @param c the layout component to remove. ++ */ ++ public void removeLayoutComponent(Component c) ++ { ++ // do nothing here ++ } ++} +Index: javax/swing/SwingConstants.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/SwingConstants.java,v +retrieving revision 1.3 +diff -u -r1.3 SwingConstants.java +--- javax/swing/SwingConstants.java 12 Oct 2003 13:20:49 -0000 1.3 ++++ javax/swing/SwingConstants.java 6 Sep 2004 16:36:00 -0000 +@@ -60,5 +60,15 @@ + + int LEADING = 10; + int TRAILING = 11; ++ ++ /** ++ * @since 1.4 ++ */ ++ int NEXT = 12; ++ ++ /** ++ * @since 1.4 ++ */ ++ int PREVIOUS = 13; + } + +Index: javax/swing/SwingUtilities.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/SwingUtilities.java,v +retrieving revision 1.3 +diff -u -r1.3 SwingUtilities.java +--- javax/swing/SwingUtilities.java 14 Jul 2003 05:33:30 -0000 1.3 ++++ javax/swing/SwingUtilities.java 6 Sep 2004 16:36:01 -0000 +@@ -1,5 +1,5 @@ +-/* SwingUtilities.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* SwingUtilities.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,101 +35,983 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + ++import java.applet.Applet; + import java.awt.Component; ++import java.awt.ComponentOrientation; + import java.awt.Container; +-import java.awt.EventQueue; + import java.awt.Font; + import java.awt.FontMetrics; ++import java.awt.Frame; + import java.awt.Graphics; + import java.awt.Insets; + import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.Shape; + import java.awt.Toolkit; + import java.awt.Window; ++import java.awt.event.ActionEvent; ++import java.awt.event.InputEvent; + import java.awt.event.KeyEvent; + import java.awt.event.MouseEvent; + import java.lang.reflect.InvocationTargetException; +-import javax.accessibility.Accessible; +-import javax.accessibility.AccessibleStateSet; ++import javax.swing.plaf.ActionMapUIResource; ++import javax.swing.plaf.InputMapUIResource; ++ + ++/** ++ * This class contains a number of static utility functions which are ++ * useful when drawing swing components, dispatching events, or calculating ++ * regions which need painting. ++ * ++ * @author Graydon Hoare (graydon@redhat.com) ++ */ + public class SwingUtilities implements SwingConstants + { +- public static FontMetrics getFontMetrics (Font font) ++ /** ++ * This frame should be used as parent for JWindow or JDialog ++ * that doesn't an owner ++ */ ++ private static OwnerFrame ownerFrame; ++ ++ /** ++ * Calculates the portion of the base rectangle which is inside the ++ * insets. ++ * ++ * @param base The rectangle to apply the insets to ++ * @param insets The insets to apply to the base rectangle ++ * @param ret A rectangle to use for storing the return value, or ++ * null ++ * ++ * @return The calculated area inside the base rectangle and its insets, ++ * either stored in ret or a new Rectangle if ret is null ++ * ++ * @see #calculateInnerArea ++ */ ++ public static Rectangle calculateInsetArea(Rectangle base, Insets insets, ++ Rectangle ret) ++ { ++ if (ret == null) ++ ret = new Rectangle(); ++ ret.setBounds(base.x + insets.left, base.y + insets.top, ++ base.width - (insets.left + insets.right), ++ base.height - (insets.top + insets.bottom)); ++ return ret; ++ } ++ ++ /** ++ * Calculates the portion of the component's bounds which is inside the ++ * component's border insets. This area is usually the area a component ++ * should confine its painting to. The coordinates are returned in terms ++ * of the component's coordinate system, where (0,0) is the ++ * upper left corner of the component's bounds. ++ * ++ * @param c The component to measure the bounds of ++ * @param r A Rectangle to store the return value in, or ++ * null ++ * ++ * @return The calculated area inside the component and its border ++ * insets ++ * ++ * @see #calculateInsetArea ++ */ ++ public static Rectangle calculateInnerArea(JComponent c, Rectangle r) ++ { ++ Rectangle b = getLocalBounds(c); ++ return calculateInsetArea(b, c.getInsets(), r); ++ } ++ ++ /** ++ * Calculates the bounds of a component in the component's own coordinate ++ * space. The result has the same height and width as the component's ++ * bounds, but its location is set to (0,0). ++ * ++ * @param aComponent The component to measure ++ * ++ * @return The component's bounds in its local coordinate space ++ */ ++ public static Rectangle getLocalBounds(Component aComponent) ++ { ++ Rectangle bounds = aComponent.getBounds(); ++ return new Rectangle(0, 0, bounds.width, bounds.height); ++ } ++ ++ /** ++ * Returns the font metrics object for a given font. The metrics can be ++ * used to calculate crude bounding boxes and positioning information, ++ * for laying out components with textual elements. ++ * ++ * @param font The font to get metrics for ++ * ++ * @return The font's metrics ++ * ++ * @see java.awt.font.GlyphMetrics ++ */ ++ public static FontMetrics getFontMetrics(Font font) ++ { ++ return Toolkit.getDefaultToolkit().getFontMetrics(font); ++ } ++ ++ /** ++ * If comp is a RootPaneContainer, return its JRootPane. ++ * Otherwise call getAncestorOfClass(JRootPane.class, a). ++ * ++ * @param comp The component to get the JRootPane of ++ * ++ * @return a suitable JRootPane for comp, or null ++ * ++ * @see javax.swing.RootPaneContainer#getRootPane ++ * @see #getAncestorOfClass ++ */ ++ public static JRootPane getRootPane(Component comp) ++ { ++ if (comp instanceof RootPaneContainer) ++ return ((RootPaneContainer)comp).getRootPane(); ++ else ++ return (JRootPane) getAncestorOfClass(JRootPane.class, comp); ++ } ++ ++ /** ++ * Returns the least ancestor of comp which has the ++ * specified name. ++ * ++ * @param name The name to search for ++ * @param comp The component to search the ancestors of ++ * ++ * @return The nearest ancestor of comp with the given ++ * name, or null if no such ancestor exists ++ * ++ * @see java.awt.Component#getName ++ * @see #getAncestorOfClass ++ */ ++ public static Container getAncestorNamed(String name, Component comp) ++ { ++ while (comp != null && (comp.getName() != name)) ++ comp = comp.getParent(); ++ return (Container) comp; ++ } ++ ++ /** ++ * Returns the least ancestor of comp which is an instance ++ * of the specified class. ++ * ++ * @param c The class to search for ++ * @param comp The component to search the ancestors of ++ * ++ * @return The nearest ancestor of comp which is an instance ++ * of the given class, or null if no such ancestor exists ++ * ++ * @see #getAncestorOfClass ++ * @see #windowForComponent ++ */ ++ public static Container getAncestorOfClass(Class c, Component comp) ++ { ++ while (comp != null && (! c.isInstance(comp))) ++ comp = comp.getParent(); ++ return (Container) comp; ++ } ++ ++ /** ++ * Equivalent to calling getAncestorOfClass(Window, comp). ++ * ++ * @param comp The component to search for an ancestor window ++ * ++ * @return An ancestral window, or null if none exists ++ */ ++ public static Window windowForComponent(Component comp) + { +- return Toolkit.getDefaultToolkit ().getFontMetrics (font); ++ return (Window) getAncestorOfClass(Window.class, comp); + } + +- public static JRootPane getRootPane (Component a) ++ /** ++ * Returns the "root" of the component tree containint comp ++ * The root is defined as either the least ancestor of ++ * comp which is a {@link Window}, or the greatest ++ * ancestor of comp which is a {@link Applet} if no {@link ++ * Window} ancestors are found. ++ * ++ * @param comp The component to search for a root ++ * ++ * @return The root of the component's tree, or null ++ */ ++ public static Component getRoot(Component comp) + { +- if (a instanceof JRootPane) +- return (JRootPane) a; +- +- a = a.getParent(); ++ Applet app = null; ++ Window win = null; + +- if (a != null) ++ while (comp != null) + { +- return getRootPane(a); ++ if (win == null && comp instanceof Window) ++ win = (Window) comp; ++ else if (comp instanceof Applet) ++ app = (Applet) comp; ++ comp = comp.getParent(); ++ } ++ ++ if (win != null) ++ return win; ++ else ++ return app; ++ } ++ ++ /** ++ * Return true if a descends from b, in other words if b is an ++ * ancestor of a. ++ * ++ * @param a The child to search the ancestry of ++ * @param b The potential ancestor to search for ++ * ++ * @return true if a is a descendent of b, false otherwise ++ */ ++ public static boolean isDescendingFrom(Component a, Component b) ++ { ++ while (true) ++ { ++ if (a == null || b == null) ++ return false; ++ if (a == b) ++ return true; ++ a = a.getParent(); + } +- +- return null; + } + +- public static void updateComponentTreeUI(JFrame comp) ++ /** ++ * Returns the deepest descendent of parent which is both visible and ++ * contains the point (x,y). Returns parent when either ++ * parent is not a container, or has no children which contain ++ * (x,y). Returns null when either ++ * (x,y) is outside the bounds of parent, or parent is ++ * null. ++ * ++ * @param parent The component to search the descendents of ++ * @param x Horizontal coordinate to search for ++ * @param y Vertical coordinate to search for ++ * ++ * @return A component containing (x,y), or ++ * null ++ * ++ * @see java.awt.Container#findComponentAt ++ */ ++ public static Component getDeepestComponentAt(Component parent, int x, int y) + { ++ if (parent == null || (! parent.contains(x, y))) ++ return null; ++ ++ if (! (parent instanceof Container)) ++ return parent; ++ ++ Container c = (Container) parent; ++ return c.findComponentAt(x, y); + } + ++ /** ++ * Converts a point from a component's local coordinate space to "screen" ++ * coordinates (such as the coordinate space mouse events are delivered ++ * in). This operation is equivalent to translating the point by the ++ * location of the component (which is the origin of its coordinate ++ * space). ++ * ++ * @param p The point to convert ++ * @param c The component which the point is expressed in terms of ++ * ++ * @see convertPointFromScreen ++ */ ++ public static void convertPointToScreen(Point p, Component c) ++ { ++ Point c0 = c.getLocationOnScreen(); ++ p.translate(c0.x, c0.y); ++ } ++ ++ /** ++ * Converts a point from "screen" coordinates (such as the coordinate ++ * space mouse events are delivered in) to a component's local coordinate ++ * space. This operation is equivalent to translating the point by the ++ * negation of the component's location (which is the origin of its ++ * coordinate space). ++ * ++ * @param p The point to convert ++ * @param c The component which the point should be expressed in terms of ++ */ ++ public static void convertPointFromScreen(Point p, Component c) ++ { ++ Point c0 = c.getLocationOnScreen(); ++ p.translate(-c0.x, -c0.y); ++ } ++ ++ /** ++ * Converts a point (x,y) from the coordinate space of one ++ * component to another. This is equivalent to converting the point from ++ * source space to screen space, then back from screen space ++ * to destination space. If exactly one of the two ++ * Components is null, it is taken to refer to the root ++ * ancestor of the other component. If both are null, no ++ * transformation is done. ++ * ++ * @param source The component which the point is expressed in terms of ++ * @param x Horizontal coordinate of point to transform ++ * @param y Vertical coordinate of point to transform ++ * @param destination The component which the return value will be ++ * expressed in terms of ++ * ++ * @return The point (x,y) converted from the coordinate space of the ++ * source component to the coordinate space of the destination component ++ * ++ * @see #convertPointToScreen ++ * @see #convertPointFromScreen ++ * @see #convertRectangle ++ * @see #getRoot ++ */ ++ public static Point convertPoint(Component source, int x, int y, ++ Component destination) ++ { ++ Point pt = new Point(x, y); ++ ++ if (source == null && destination == null) ++ return pt; ++ ++ if (source == null) ++ source = getRoot(destination); ++ ++ if (destination == null) ++ destination = getRoot(source); ++ ++ convertPointToScreen(pt, source); ++ convertPointFromScreen(pt, destination); ++ ++ return pt; ++ } ++ ++ public static Point convertPoint(Component source, Point aPoint, Component destination) ++ { ++ return convertPoint(source, aPoint.x, aPoint.y, destination); ++ } ++ ++ /** ++ * Converts a rectangle from the coordinate space of one component to ++ * another. This is equivalent to converting the rectangle from ++ * source space to screen space, then back from screen space ++ * to destination space. If exactly one of the two ++ * Components is null, it is taken to refer to the root ++ * ancestor of the other component. If both are null, no ++ * transformation is done. ++ * ++ * @param source The component which the rectangle is expressed in terms of ++ * @param rect The rectangle to convert ++ * @param destination The component which the return value will be ++ * expressed in terms of ++ * ++ * @return A new rectangle, equal in size to the input rectangle, but ++ * with its position converted from the coordinate space of the source ++ * component to the coordinate space of the destination component ++ * ++ * @see #convertPointToScreen ++ * @see #convertPointFromScreen ++ * @see #convertPoint ++ * @see #getRoot ++ */ ++ public static Rectangle convertRectangle(Component source, ++ Rectangle rect, ++ Component destination) ++ { ++ Point pt = convertPoint(source, rect.x, rect.y, destination); ++ return new Rectangle(pt.x, pt.y, rect.width, rect.height); ++ } ++ ++ /** ++ * Convert a mouse event which refrers to one component to another. This ++ * includes changing the mouse event's coordinate space, as well as the ++ * source property of the event. If source is ++ * null, it is taken to refer to destination's ++ * root component. If destination is null, the ++ * new event will remain expressed in source's coordinate ++ * system. ++ * ++ * @param source The component the mouse event currently refers to ++ * @param sourceEvent The mouse event to convert ++ * @param destination The component the new mouse event should refer to ++ * ++ * @return A new mouse event expressed in terms of the destination ++ * component's coordinate space, and with the destination component as ++ * its source ++ * ++ * @see #convertPoint ++ */ ++ public static MouseEvent convertMouseEvent(Component source, ++ MouseEvent sourceEvent, ++ Component destination) ++ { ++ Point newpt = convertPoint(source, sourceEvent.getX(), sourceEvent.getY(), ++ destination); ++ ++ return new MouseEvent(destination, sourceEvent.getID(), ++ sourceEvent.getWhen(), sourceEvent.getModifiersEx(), ++ newpt.x, newpt.y, sourceEvent.getClickCount(), ++ sourceEvent.isPopupTrigger(), sourceEvent.getButton()); ++ } ++ ++ /** ++ * Recursively walk the component tree under comp calling ++ * updateUI on each {@link JComponent} found. This causes ++ * the entire tree to re-initialize its UI delegates. ++ * ++ * @param comp The component to walk the children of, calling updateUI ++ */ ++ public static void updateComponentTreeUI(Component comp) ++ { ++ if (comp == null) ++ return; ++ ++ if (comp instanceof Container) ++ { ++ Component[] children = ((Container)comp).getComponents(); ++ for (int i = 0; i < children.length; ++i) ++ updateComponentTreeUI(children[i]); ++ } ++ ++ if (comp instanceof JComponent) ++ ((JComponent)comp).updateUI(); ++ } ++ ++ ++ /** ++ *

    Layout a "compound label" consisting of a text string and an icon ++ * which is to be placed near the rendered text. Once the text and icon ++ * are laid out, the text rectangle and icon rectangle parameters are ++ * altered to store the calculated positions.

    ++ * ++ *

    The size of the text is calculated from the provided font metrics ++ * object. This object should be the metrics of the font you intend to ++ * paint the label with.

    ++ * ++ *

    The position values control where the text is placed relative to ++ * the icon. The horizontal position value should be one of the constants ++ * LEADING, TRAILING, LEFT, ++ * RIGHT or CENTER. The vertical position value ++ * should be one fo the constants TOP, BOTTOM ++ * or CENTER.

    ++ * ++ *

    The text-icon gap value controls the number of pixels between the ++ * icon and the text.

    ++ * ++ *

    The alignment values control where the text and icon are placed, as ++ * a combined unit, within the view rectangle. The horizontal alignment ++ * value should be one of the constants LEADING, ++ * TRAILING, LEFT, RIGHT or ++ * CENTER. The vertical alignment valus should be one of the ++ * constants TOP, BOTTOM or ++ * CENTER.

    ++ * ++ *

    If the LEADING or TRAILING constants are ++ * given for horizontal alignment or horizontal text position, they are ++ * interpreted relative to the provided component's orientation property, ++ * a constant in the {@link java.awt.ComponentOrientation} class. For ++ * example, if the component's orientation is LEFT_TO_RIGHT, ++ * then the LEADING value is a synonym for LEFT ++ * and the TRAILING value is a synonym for ++ * RIGHT

    ++ * ++ *

    If the text and icon are equal to or larger than the view ++ * rectangle, the horizontal and vertical alignment values have no ++ * affect.

    ++ * ++ * @param c A component used for its orientation value ++ * @param fm The font metrics used to measure the text ++ * @param text The text to place in the compound label ++ * @param icon The icon to place next to the text ++ * @param verticalAlignment The vertical alignment of the label relative ++ * to its component ++ * @param horizontalAlignment The horizontal alignment of the label ++ * relative to its component ++ * @param verticalTextPosition The vertical position of the label's text ++ * relative to its icon ++ * @param horizontalTextPosition The horizontal position of the label's ++ * text relative to its icon ++ * @param viewR The view rectangle, specifying the area which layout is ++ * constrained to ++ * @param iconR A rectangle which is modified to hold the laid-out ++ * position of the icon ++ * @param textR A rectangle which is modified to hold the laid-out ++ * position of the text ++ * @param textIconGap The distance between text and icon ++ * ++ * @return The string of characters, possibly truncated with an elipsis, ++ * which is laid out in this label ++ */ ++ + public static String layoutCompoundLabel(JComponent c, + FontMetrics fm, ++ String text, ++ Icon icon, ++ int verticalAlignment, ++ int horizontalAlignment, ++ int verticalTextPosition, ++ int horizontalTextPosition, ++ Rectangle viewR, ++ Rectangle iconR, ++ Rectangle textR, ++ int textIconGap) ++ { ++ ++ // Fix up the orientation-based horizontal positions. ++ ++ if (horizontalTextPosition == LEADING) ++ { ++ if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) ++ horizontalTextPosition = RIGHT; ++ else ++ horizontalTextPosition = LEFT; ++ } ++ else if (horizontalTextPosition == TRAILING) ++ { ++ if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) ++ horizontalTextPosition = LEFT; ++ else ++ horizontalTextPosition = RIGHT; ++ } ++ ++ // Fix up the orientation-based alignments. ++ ++ if (horizontalAlignment == LEADING) ++ { ++ if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) ++ horizontalAlignment = RIGHT; ++ else ++ horizontalAlignment = LEFT; ++ } ++ else if (horizontalAlignment == TRAILING) ++ { ++ if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) ++ horizontalAlignment = LEFT; ++ else ++ horizontalAlignment = RIGHT; ++ } ++ ++ return layoutCompoundLabel(fm, text, icon, ++ verticalAlignment, ++ horizontalAlignment, ++ verticalTextPosition, ++ horizontalTextPosition, ++ viewR, iconR, textR, textIconGap); ++ } ++ ++ /** ++ *

    Layout a "compound label" consisting of a text string and an icon ++ * which is to be placed near the rendered text. Once the text and icon ++ * are laid out, the text rectangle and icon rectangle parameters are ++ * altered to store the calculated positions.

    ++ * ++ *

    The size of the text is calculated from the provided font metrics ++ * object. This object should be the metrics of the font you intend to ++ * paint the label with.

    ++ * ++ *

    The position values control where the text is placed relative to ++ * the icon. The horizontal position value should be one of the constants ++ * LEFT, RIGHT or CENTER. The ++ * vertical position value should be one fo the constants ++ * TOP, BOTTOM or CENTER.

    ++ * ++ *

    The text-icon gap value controls the number of pixels between the ++ * icon and the text.

    ++ * ++ *

    The alignment values control where the text and icon are placed, as ++ * a combined unit, within the view rectangle. The horizontal alignment ++ * value should be one of the constants LEFT, RIGHT or ++ * CENTER. The vertical alignment valus should be one of the ++ * constants TOP, BOTTOM or ++ * CENTER.

    ++ * ++ *

    If the text and icon are equal to or larger than the view ++ * rectangle, the horizontal and vertical alignment values have no ++ * affect.

    ++ * ++ *

    Note that this method does not know how to deal with ++ * horizontal alignments or positions given as LEADING or ++ * TRAILING values. Use the other overloaded variant of this ++ * method if you wish to use such values. ++ * ++ * @param fm The font metrics used to measure the text ++ * @param text The text to place in the compound label ++ * @param icon The icon to place next to the text ++ * @param verticalAlignment The vertical alignment of the label relative ++ * to its component ++ * @param horizontalAlignment The horizontal alignment of the label ++ * relative to its component ++ * @param verticalTextPosition The vertical position of the label's text ++ * relative to its icon ++ * @param horizontalTextPosition The horizontal position of the label's ++ * text relative to its icon ++ * @param viewR The view rectangle, specifying the area which layout is ++ * constrained to ++ * @param iconR A rectangle which is modified to hold the laid-out ++ * position of the icon ++ * @param textR A rectangle which is modified to hold the laid-out ++ * position of the text ++ * @param textIconGap The distance between text and icon ++ * ++ * @return The string of characters, possibly truncated with an elipsis, ++ * which is laid out in this label ++ */ ++ ++ public static String layoutCompoundLabel(FontMetrics fm, + String text, +- Icon i, +- int vert_a, +- int hor_i, +- int vert_text_pos, +- int hor_text_pos, +- Rectangle vr, +- Rectangle ir, +- Rectangle tr, +- int gap) +- { +- // view rect 'vr' already ok, +- // we need to compute ir (icon rect) and tr (text-rect) +- +- int next_x = 0;//vr.x; +- int next_y = 0;//vr.y; +- +- ir.height = ir.width = ir.y = ir.x = 0; +- +- if (i != null) +- { +- ir.x = vr.x; +- ir.y = vr.y; +- ir.width = i.getIconWidth(); +- ir.height = i.getIconWidth(); +- +- +- next_x += gap + i.getIconWidth(); +- next_y += gap + i.getIconHeight(); +- } +- +- tr.x = next_x; +- tr.y = vr.y + (vr.height/2); ++ Icon icon, ++ int verticalAlignment, ++ int horizontalAlignment, ++ int verticalTextPosition, ++ int horizontalTextPosition, ++ Rectangle viewR, ++ Rectangle iconR, ++ Rectangle textR, ++ int textIconGap) ++ { ++ ++ // Work out basic height and width. ++ ++ if (icon == null) ++ { ++ textIconGap = 0; ++ iconR.width = 0; ++ iconR.height = 0; ++ } ++ else ++ { ++ iconR.width = icon.getIconWidth(); ++ iconR.height = icon.getIconHeight(); ++ } ++ if (text == null) ++ { ++ textIconGap = 0; ++ textR.width = 0; ++ textR.height = 0; ++ } ++ else ++ { ++ textR.width = fm.stringWidth(text); ++ textR.height = fm.getHeight(); ++ } ++ ++ // Work out the position of text and icon, assuming the top-left coord ++ // starts at (0,0). We will fix that up momentarily, after these ++ // "position" decisions are made and we look at alignment. ++ ++ switch (horizontalTextPosition) ++ { ++ case LEFT: ++ textR.x = 0; ++ iconR.x = textR.width + textIconGap; ++ break; ++ case RIGHT: ++ iconR.x = 0; ++ textR.x = iconR.width + textIconGap; ++ break; ++ case CENTER: ++ int centerLine = Math.max(textR.width, iconR.width) / 2; ++ textR.x = centerLine - textR.width/2; ++ iconR.x = centerLine - iconR.width/2; ++ break; ++ } ++ ++ switch (verticalTextPosition) ++ { ++ case TOP: ++ textR.y = 0; ++ iconR.y = (horizontalTextPosition == CENTER ++ ? textR.height + textIconGap : 0); ++ break; ++ case BOTTOM: ++ iconR.y = 0; ++ textR.y = (horizontalTextPosition == CENTER ++ ? iconR.height + textIconGap ++ : iconR.height - textR.height); ++ break; ++ case CENTER: ++ int centerLine = Math.max(textR.height, iconR.height) / 2; ++ textR.y = centerLine - textR.height/2; ++ iconR.y = centerLine - iconR.height/2; ++ break; ++ } ++ // The two rectangles are laid out correctly now, but only assuming ++ // that their upper left corner is at (0,0). If we have any alignment other ++ // than TOP and LEFT, we need to adjust them. ++ ++ Rectangle u = textR.union(iconR); ++ int horizontalAdjustment = viewR.x; ++ int verticalAdjustment = viewR.y; ++ switch (verticalAlignment) ++ { ++ case TOP: ++ break; ++ case BOTTOM: ++ verticalAdjustment += (viewR.height - u.height); ++ break; ++ case CENTER: ++ verticalAdjustment += ((viewR.height/2) - (u.height/2)); ++ break; ++ } ++ switch (horizontalAlignment) ++ { ++ case LEFT: ++ break; ++ case RIGHT: ++ horizontalAdjustment += (viewR.width - u.width); ++ break; ++ case CENTER: ++ horizontalAdjustment += ((viewR.width/2) - (u.width/2)); ++ break; ++ } + +- tr.width = fm.stringWidth(text); +- tr.height = fm.getHeight() + fm.getAscent()/2; ++ iconR.x += horizontalAdjustment; ++ iconR.y += verticalAdjustment; ++ ++ textR.x += horizontalAdjustment; ++ textR.y += verticalAdjustment; + + return text; + } + +-} ++ /** ++ * Calls {@link java.awt.EventQueue.invokeLater} with the ++ * specified {@link Runnable}. ++ */ ++ public static void invokeLater(Runnable doRun) ++ { ++ java.awt.EventQueue.invokeLater(doRun); ++ } + ++ /** ++ * Calls {@link java.awt.EventQueue.invokeAndWait} with the ++ * specified {@link Runnable}. ++ */ ++ public static void invokeAndWait(Runnable doRun) ++ throws InterruptedException, ++ InvocationTargetException ++ { ++ java.awt.EventQueue.invokeAndWait(doRun); ++ } + ++ /** ++ * Calls {@link java.awt.EventQueue.isEventDispatchThread}. ++ */ ++ public static boolean isEventDispatchThread() ++ { ++ return java.awt.EventQueue.isDispatchThread(); ++ } ++ ++ /** ++ * This method paints the given component at the given position and size. ++ * The component will be reparented to the container given. ++ * ++ * @param g The Graphics object to draw with. ++ * @param c The Component to draw ++ * @param p The Container to reparent to. ++ * @param x The x coordinate to draw at. ++ * @param y The y coordinate to draw at. ++ * @param w The width of the drawing area. ++ * @param h The height of the drawing area. ++ */ ++ public static void paintComponent(Graphics g, Component c, Container p, ++ int x, int y, int w, int h) ++ { ++ Container parent = c.getParent(); ++ if (parent != null) ++ parent.remove(c); ++ if (p != null) ++ p.add(c); ++ ++ Shape savedClip = g.getClip(); ++ ++ g.setClip(x, y, w, h); ++ g.translate(x, y); + ++ c.paint(g); ++ ++ g.translate(-x, -y); ++ g.setClip(savedClip); ++ } + ++ /** ++ * This method paints the given component in the given rectangle. ++ * The component will be reparented to the container given. ++ * ++ * @param g The Graphics object to draw with. ++ * @param c The Component to draw ++ * @param p The Container to reparent to. ++ * @param r The rectangle that describes the drawing area. ++ */ ++ public static void paintComponent(Graphics g, Component c, ++ Container p, Rectangle r) ++ { ++ paintComponent(g, c, p, r.x, r.y, r.width, r.height); ++ } ++ ++ /** ++ * This method returns the common Frame owner used in JDialogs or ++ * JWindow when no owner is provided. ++ * ++ * @return The common Frame ++ */ ++ static Frame getOwnerFrame() ++ { ++ if (ownerFrame == null) ++ ownerFrame = new OwnerFrame(); ++ return ownerFrame; ++ } + ++ /** ++ * Checks if left mouse button was clicked. ++ * ++ * @param event the event to check ++ * ++ * @return true if left mouse was clicked, false otherwise. ++ */ ++ public static boolean isLeftMouseButton(MouseEvent event) ++ { ++ return ((event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) ++ == InputEvent.BUTTON1_DOWN_MASK); ++ } + ++ /** ++ * Checks if middle mouse button was clicked. ++ * ++ * @param event the event to check ++ * ++ * @return true if middle mouse was clicked, false otherwise. ++ */ ++ public static boolean isMiddleMouseButton(MouseEvent event) ++ { ++ return ((event.getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK) ++ == InputEvent.BUTTON2_DOWN_MASK); ++ } + ++ /** ++ * Checks if right mouse button was clicked. ++ * ++ * @param event the event to check ++ * ++ * @return true if right mouse was clicked, false otherwise. ++ */ ++ public static boolean isRightMouseButton(MouseEvent event) ++ { ++ return ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) ++ == InputEvent.BUTTON3_DOWN_MASK); ++ } ++ ++ /** ++ * This frame should be used when constructing a Window/JDialog without ++ * a parent. In this case, we are forced to use this frame as a window's ++ * parent, because we simply cannot pass null instead of parent to Window ++ * constructor, since doing it will result in NullPointerException. ++ */ ++ private static class OwnerFrame extends Frame ++ { ++ public void setVisible(boolean b) ++ { ++ // Do nothing here. ++ } ++ ++ public boolean isShowing() ++ { ++ return true; ++ } ++ } + ++ public static boolean notifyAction(Action action, ++ KeyStroke ks, ++ KeyEvent event, ++ Object sender, ++ int modifiers) ++ { ++ if (action != null && action.isEnabled()) ++ { ++ String name = (String) action.getValue(Action.ACTION_COMMAND_KEY); ++ if (name == null ++ && event.getKeyChar() != KeyEvent.CHAR_UNDEFINED) ++ name = new String(new char[] {event.getKeyChar()}); ++ action.actionPerformed(new ActionEvent(sender, ++ ActionEvent.ACTION_PERFORMED, ++ name, modifiers)); ++ return true; ++ } ++ return false; ++ } + ++ /** ++ *

    Change the shared, UI-managed {@link ActionMap} for a given ++ * component. ActionMaps are arranged in a hierarchy, in order to ++ * encourage sharing of common actions between components. The hierarchy ++ * unfortunately places UI-managed ActionMaps at the end of the ++ * parent-pointer chain, as illustrated:

    ++ * ++ *
    ++   *  [{@link javax.swing.JComponent#getActionMap()}] 
    ++   *          --> [{@link javax.swing.ActionMap}] 
    ++   *     parent --> [{@link javax.swing.text.KeymapActionMap}] 
    ++   *       parent --> [{@link javax.swing.plaf.ActionMapUIResource}]
    ++   * 
    ++ * ++ *

    Our goal with this method is to replace the first ActionMap along ++ * this chain which is an instance of {@link ActionMapUIResource}, since ++ * these are the ActionMaps which are supposed to be shared between ++ * components.

    ++ * ++ *

    If the provided ActionMap is null, we interpret the ++ * call as a request to remove the UI-managed ActionMap from the ++ * component's ActionMap parent chain.

    ++ */ ++ public static void replaceUIActionMap(JComponent component, ++ ActionMap uiActionMap) ++ { ++ ActionMap child = component.getActionMap(); ++ if (child == null) ++ component.setActionMap(uiActionMap); ++ else ++ { ++ while(child.getParent() != null ++ && !(child.getParent() instanceof ActionMapUIResource)) ++ child = child.getParent(); ++ if (child != null) ++ child.setParent(uiActionMap); ++ } ++ } ++ ++ /** ++ *

    Change the shared, UI-managed {@link InputMap} for a given ++ * component. InputMaps are arranged in a hierarchy, in order to ++ * encourage sharing of common input mappings between components. The ++ * hierarchy unfortunately places UI-managed InputMaps at the ++ * end of the parent-pointer chain, as illustrated:

    ++ * ++ *
    ++   *  [{@link javax.swing.JComponent#getInputMap()}] 
    ++   *          --> [{@link javax.swing.InputMap}] 
    ++   *     parent --> [{@link javax.swing.text.KeymapWrapper}] 
    ++   *       parent --> [{@link javax.swing.plaf.InputMapUIResource}]
    ++   * 
    ++ * ++ *

    Our goal with this method is to replace the first InputMap along ++ * this chain which is an instance of {@link InputMapUIResource}, since ++ * these are the InputMaps which are supposed to be shared between ++ * components.

    ++ * ++ *

    If the provided InputMap is null, we interpret the ++ * call as a request to remove the UI-managed InputMap from the ++ * component's InputMap parent chain.

    ++ */ ++ public static void replaceUIInputMap(JComponent component, ++ int condition, ++ InputMap uiInputMap) ++ { ++ InputMap child = component.getInputMap(condition); ++ if (child == null) ++ component.setInputMap(condition, uiInputMap); ++ else ++ { ++ while(child.getParent() != null ++ && !(child.getParent() instanceof InputMapUIResource)) ++ child = child.getParent(); ++ if (child != null) ++ child.setParent(uiInputMap); ++ } ++ } ++} +Index: javax/swing/Timer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/Timer.java,v +retrieving revision 1.3 +diff -u -r1.3 Timer.java +--- javax/swing/Timer.java 24 Jun 2003 09:48:40 -0000 1.3 ++++ javax/swing/Timer.java 6 Sep 2004 16:36:01 -0000 +@@ -1,5 +1,5 @@ +-/* Timer.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* Timer.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,146 +35,370 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing; + + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.io.Serializable; + import java.util.EventListener; +-import java.util.Vector; + import javax.swing.event.EventListenerList; + ++ ++/** ++ * DOCUMENT ME! ++ */ + public class Timer implements Serializable + { ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -1116180831621385484L; ++ ++ /** DOCUMENT ME! */ + protected EventListenerList listenerList = new EventListenerList(); +- +- int ticks; +- static boolean verbose; ++ ++ // This object manages a "queue" of virtual actionEvents, maintained as a ++ // simple long counter. When the timer expires, a new event is queued, ++ // and a dispatcher object is pushed into the system event queue. When ++ // the system thread runs the dispatcher, it will fire as many ++ // ActionEvents as have been queued, unless the timer is set to ++ // coalescing mode, in which case it will fire only one ActionEvent. ++ ++ /** DOCUMENT ME! */ ++ private long queue; ++ ++ /** DOCUMENT ME! */ ++ private Object queueLock = new Object(); ++ ++ /** DOCUMENT ME! */ ++ private Waker waker; ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ private void queueEvent() ++ { ++ synchronized (queueLock) ++ { ++ queue++; ++ if (queue == 1) ++ SwingUtilities.invokeLater(new Runnable() ++ { ++ public void run() ++ { ++ drainEvents(); ++ } ++ }); ++ ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ private void drainEvents() ++ { ++ synchronized (queueLock) ++ { ++ if (isCoalesce()) ++ { ++ if (queue > 0) ++ fireActionPerformed(); ++ } ++ else ++ { ++ while (queue > 0) ++ { ++ fireActionPerformed(); ++ queue--; ++ } ++ } ++ queue = 0; ++ } ++ } ++ ++ static boolean logTimers; ++ ++ /** DOCUMENT ME! */ ++ boolean coalesce = true; ++ ++ /** DOCUMENT ME! */ ++ boolean repeats = true; ++ ++ /** DOCUMENT ME! */ + boolean running; +- boolean repeat_ticks = true; +- long interval, init_delay; +- +- class Waker extends Thread ++ ++ /** DOCUMENT ME! */ ++ int ticks; ++ ++ /** DOCUMENT ME! */ ++ int delay; ++ ++ /** DOCUMENT ME! */ ++ int initialDelay; ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ private class Waker extends Thread + { ++ /** ++ * DOCUMENT ME! ++ */ + public void run() + { + running = true; +- try { +- sleep(init_delay); +- +- while (running) +- { +- sleep(interval); ++ try ++ { ++ sleep(initialDelay); ++ ++ while (running) ++ { ++ try ++ { ++ sleep(delay); ++ } ++ catch (InterruptedException e) ++ { ++ return; ++ } ++ queueEvent(); + +- if (verbose) +- { ++ if (logTimers) + System.out.println("javax.swing.Timer -> clocktick"); +- } + +- ticks++; +- fireActionPerformed(); +- +- if (! repeat_ticks) +- break; +- } +- running = false; +- } catch (Exception e) { +- System.out.println("swing.Timer::" + e); +- } ++ if (! repeats) ++ break; ++ } ++ running = false; ++ } ++ catch (Exception e) ++ { ++// System.out.println("swing.Timer::" + e); ++ } + } + } + ++ /** ++ * Creates a new Timer object. ++ * ++ * @param d DOCUMENT ME! ++ * @param listener DOCUMENT ME! ++ */ ++ public Timer(int d, ActionListener listener) ++ { ++ delay = d; ++ ++ if (listener != null) ++ addActionListener(listener); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ */ ++ public void setCoalesce(boolean c) ++ { ++ coalesce = c; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean isCoalesce() ++ { ++ return coalesce; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param listener DOCUMENT ME! ++ */ + public void addActionListener(ActionListener listener) + { +- listenerList.add (ActionListener.class, listener); ++ listenerList.add(ActionListener.class, listener); + } +- ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param listener DOCUMENT ME! ++ */ + public void removeActionListener(ActionListener listener) + { +- listenerList.remove (ActionListener.class, listener); ++ listenerList.remove(ActionListener.class, listener); + } + + /** ++ * DOCUMENT ME! ++ * ++ * @param listenerType DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ * + * @since 1.3 + */ +- public EventListener[] getListeners (Class listenerType) ++ public EventListener[] getListeners(Class listenerType) + { +- return listenerList.getListeners (listenerType); ++ return listenerList.getListeners(listenerType); + } +- ++ + /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ * + * @since 1.4 + */ +- public ActionListener[] getActionListeners () ++ public ActionListener[] getActionListeners() + { +- return (ActionListener[]) listenerList.getListeners (ActionListener.class); ++ return (ActionListener[]) listenerList.getListeners(ActionListener.class); + } + +- protected void fireActionPerformed (ActionEvent event) ++ /** ++ * DOCUMENT ME! ++ * ++ * @param event DOCUMENT ME! ++ */ ++ protected void fireActionPerformed(ActionEvent event) + { + ActionListener[] listeners = getActionListeners(); +- ++ + for (int i = 0; i < listeners.length; i++) +- { +- listeners [i].actionPerformed (event); +- } ++ listeners[i].actionPerformed(event); + } + +- void fireActionPerformed () ++ /** ++ * DOCUMENT ME! ++ */ ++ void fireActionPerformed() + { +- fireActionPerformed (new ActionEvent (this, ticks, "Timer")); ++ fireActionPerformed(new ActionEvent(this, ticks++, "Timer")); + } + +- public static void setLogTimers(boolean flag) ++ /** ++ * DOCUMENT ME! ++ * ++ * @param lt DOCUMENT ME! ++ */ ++ public static void setLogTimers(boolean lt) + { +- verbose = flag; ++ logTimers = lt; + } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ + public static boolean getLogTimers() + { +- return verbose; ++ return logTimers; + } +- + +- public void setDelay(int delay) ++ /** ++ * DOCUMENT ME! ++ * ++ * @param d DOCUMENT ME! ++ */ ++ public void setDelay(int d) + { +- interval = delay; ++ delay = d; + } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ + public int getDelay() + { +- return (int)interval; ++ return delay; + } + ++ /** ++ * DOCUMENT ME! ++ * ++ * @param i DOCUMENT ME! ++ */ ++ public void setInitialDelay(int i) ++ { ++ initialDelay = i; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public int getInitialDelay() ++ { ++ return initialDelay; ++ } + +- public void setInitialDelay(int initialDelay) ++ /** ++ * DOCUMENT ME! ++ * ++ * @param r DOCUMENT ME! ++ */ ++ public void setRepeats(boolean r) + { +- init_delay = initialDelay; ++ repeats = r; + } + +- public void setRepeats(boolean flag) ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean isRepeats() + { +- repeat_ticks = flag; ++ return repeats; + } + +- boolean isRunning() ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public boolean isRunning() + { + return running; + } + +- void start() ++ /** ++ * DOCUMENT ME! ++ */ ++ public void start() + { + if (isRunning()) +- { +- System.err.println("attempt to start a running timer"); +- return; +- } +- new Waker().start(); ++ return; ++ waker = new Waker(); ++ waker.start(); + } + +- void stop() ++ /** ++ * DOCUMENT ME! ++ */ ++ public void restart() ++ { ++ stop(); ++ start(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ public void stop() + { + running = false; ++ if (waker != null) ++ waker.interrupt(); ++ synchronized (queueLock) ++ { ++ queue = 0; ++ } + } + } +Index: javax/swing/ToggleButtonModel.java +=================================================================== +RCS file: javax/swing/ToggleButtonModel.java +diff -N javax/swing/ToggleButtonModel.java +--- javax/swing/ToggleButtonModel.java 19 Jun 2003 16:30:09 -0000 1.2 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,60 +0,0 @@ +-/* ToggleButtonModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +- +-package javax.swing; +- +-public class ToggleButtonModel extends DefaultButtonModel +-{ +- ToggleButtonModel(JComponent c) +- { +- super(c); +- } +- +- public void setPressed(boolean b) +- { +- if (! isEnabled()) +- return; +- +- if (! b) +- { +- return; +- } +- +- setSelected(b); +- } +-} +Index: javax/swing/ToolTipManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ToolTipManager.java,v +retrieving revision 1.2 +diff -u -r1.2 ToolTipManager.java +--- javax/swing/ToolTipManager.java 10 Jan 2004 21:07:43 -0000 1.2 ++++ javax/swing/ToolTipManager.java 6 Sep 2004 16:36:01 -0000 +@@ -37,358 +37,608 @@ + + package javax.swing; + ++import java.awt.AWTEvent; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.FlowLayout; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Panel; ++import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.event.*; + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.awt.event.MouseAdapter; + import java.awt.event.MouseEvent; + import java.awt.event.MouseMotionListener; ++import javax.swing.JComponent; ++import javax.swing.Popup; ++import javax.swing.PopupFactory; ++import javax.swing.SwingUtilities; ++import javax.swing.Timer; ++ + + /** +- * ToolTipManager +- * @author Andrew Selkirk +- * @version 1.0 ++ * This class is responsible for the registration of JToolTips to Components ++ * and for displaying them when appropriate. + */ +-public class ToolTipManager extends MouseAdapter implements MouseMotionListener { +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * stillInsideTimerAction +- */ +- protected class stillInsideTimerAction implements ActionListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor stillInsideTimerAction +- * @param manager TODO +- */ +- protected stillInsideTimerAction(ToolTipManager manager) { +- // TODO +- } // stillInsideTimerAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * actionPerformed +- * @param event TODO +- */ +- public void actionPerformed(ActionEvent event) { +- // TODO +- } // actionPerformed() +- +- +- } // stillInsideTimerAction +- +- /** +- * outsideTimerAction +- */ +- protected class outsideTimerAction implements ActionListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor outsideTimerAction +- * @param manager TODO +- */ +- protected outsideTimerAction(ToolTipManager manager) { +- // TODO +- } // outsideTimerAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * actionPerformed +- * @param value0 TODO +- */ +- public void actionPerformed(ActionEvent event) { +- // TODO +- } // actionPerformed() +- +- +- } // outsideTimerAction +- +- /** +- * insideTimerAction +- */ +- protected class insideTimerAction implements ActionListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor insideTimerAction +- * @param manager TODO +- */ +- protected insideTimerAction(ToolTipManager manager) { +- // TODO +- } // insideTimerAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * actionPerformed +- * @param event TODO +- */ +- public void actionPerformed(ActionEvent event) { +- // TODO +- } // actionPerformed() +- +- +- } // insideTimerAction +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * enterTimer +- */ +- Timer enterTimer; +- +- /** +- * exitTimer +- */ +- Timer exitTimer; +- +- /** +- * insideTimer +- */ +- Timer insideTimer; +- +- /** +- * toolTipText +- */ +- String toolTipText; +- +- /** +- * mouseEvent +- */ +- MouseEvent mouseEvent; +- +- /** +- * showImmediately +- */ +- boolean showImmediately; +- +- /** +- * tip +- */ +- JToolTip tip; +- +- /** +- * enabled +- */ +- boolean enabled; +- +- /** +- * timerEnter +- */ +- private long timerEnter; +- +- /** +- * lightWeightPopupEnabled +- */ +- protected boolean lightWeightPopupEnabled; +- +- /** +- * heavyWeightPopupEnabled +- */ +- protected boolean heavyWeightPopupEnabled; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ToolTipManager +- */ +- ToolTipManager() { +- // TODO +- } // ToolTipManager() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * sharedInstance +- * @returns ToolTipManager +- */ +- public static ToolTipManager sharedInstance() { +- return null; // TODO +- } // sharedInstance() +- +- /** +- * setEnabled +- * @param enabled TODO +- */ +- public void setEnabled(boolean enabled) { +- // TODO +- } // setEnabled() +- +- /** +- * isEnabled +- * @returns boolean +- */ +- public boolean isEnabled() { +- return false; // TODO +- } // isEnabled() +- +- /** +- * isLightWeightPopupEnabled +- * @returns boolean +- */ +- public boolean isLightWeightPopupEnabled() { +- return false; // TODO +- } // isLightWeightPopupEnabled() +- +- /** +- * setLightWeightPopupEnabled +- * @param enabled TODO +- */ +- public void setLightWeightPopupEnabled(boolean enabled) { +- // TODO +- } // setLightWeightPopupEnabled() +- +- /** +- * getInitialDelay +- * @returns int +- */ +- public int getInitialDelay() { +- return 0; // TODO +- } // getInitialDelay() +- +- /** +- * setInitialDelay +- * @param delay TODO +- */ +- public void setInitialDelay(int delay) { +- // TODO +- } // setInitialDelay() +- +- /** +- * getDismissDelay +- * @returns int +- */ +- public int getDismissDelay() { +- return 0; // TODO +- } // getDismissDelay() +- +- /** +- * setDismissDelay +- * @param delay TODO +- */ +- public void setDismissDelay(int delay) { +- // TODO +- } // setDismissDelay() +- +- /** +- * getReshowDelay +- * @returns int +- */ +- public int getReshowDelay() { +- return 0; // TODO +- } // getReshowDelay() +- +- /** +- * setReshowDelay +- * @param delay TODO +- */ +- public void setReshowDelay(int delay) { +- // TODO +- } // setReshowDelay() +- +- /** +- * registerComponent +- * @param component TODO +- */ +- public void registerComponent(JComponent component) { +- // TODO +- } // registerComponent() +- +- /** +- * unregisterComponent +- * @param component TODO +- */ +- public void unregisterComponent(JComponent component) { +- // TODO +- } // unregisterComponent() +- +- /** +- * mouseEntered +- * @param event TODO +- */ +- public void mouseEntered(MouseEvent event) { +- // TODO +- } // mouseEntered() +- +- /** +- * mouseExited +- * @param event TODO +- */ +- public void mouseExited(MouseEvent event) { +- // TODO +- } // mouseExited() +- +- /** +- * mousePressed +- * @param event TODO +- */ +- public void mousePressed(MouseEvent event) { +- // TODO +- } // mousePressed() +- +- /** +- * mouseDragged +- * @param event TODO +- */ +- public void mouseDragged(MouseEvent event) { +- // TODO +- } // mouseDragged() +- +- /** +- * mouseMoved +- * @param event TODO +- */ +- public void mouseMoved(MouseEvent event) { +- // TODO +- } // mouseMoved() +- +- +-} // ToolTipManager ++public class ToolTipManager extends MouseAdapter implements MouseMotionListener ++{ ++ /** ++ * This ActionListener is associated with the Timer that listens to whether ++ * the JToolTip can be hidden after four seconds. ++ */ ++ protected class stillInsideTimerAction implements ActionListener ++ { ++ /** ++ * This method creates a new stillInsideTimerAction object. ++ */ ++ protected stillInsideTimerAction() ++ { ++ } ++ ++ /** ++ * This method hides the JToolTip when the Timer has finished. ++ * ++ * @param event The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent event) ++ { ++ hideTip(); ++ } ++ } ++ ++ /** ++ * This Actionlistener is associated with the Timer that listens to whether ++ * the mouse cursor has re-entered the JComponent in time for an immediate ++ * redisplay of the JToolTip. ++ */ ++ protected class outsideTimerAction implements ActionListener ++ { ++ /** ++ * This method creates a new outsideTimerAction object. ++ */ ++ protected outsideTimerAction() ++ { ++ } ++ ++ /** ++ * This method is called when the Timer that listens to whether the mouse ++ * cursor has re-entered the JComponent has run out. ++ * ++ * @param event The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ /** ++ * This ActionListener is associated with the Timer that listens to whether ++ * it is time for the JToolTip to be displayed after the mouse has entered ++ * the JComponent. ++ */ ++ protected class insideTimerAction implements ActionListener ++ { ++ /** ++ * This method creates a new insideTimerAction object. ++ */ ++ protected insideTimerAction() ++ { ++ } ++ ++ /** ++ * This method displays the JToolTip when the Mouse has been still for the ++ * delay. ++ * ++ * @param event The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent event) ++ { ++ showTip(); ++ if (insideTimer != null) ++ insideTimer.start(); ++ } ++ } ++ ++ /** ++ * The Timer that determines whether the Mouse has been still long enough ++ * for the JToolTip to be displayed. ++ */ ++ Timer enterTimer; ++ ++ /** ++ * The Timer that determines whether the Mouse has re-entered the JComponent ++ * quickly enough for the JToolTip to be displayed immediately. ++ */ ++ Timer exitTimer; ++ ++ /** ++ * The Timer that determines whether the JToolTip has been displayed long ++ * enough for it to be hidden. ++ */ ++ Timer insideTimer; ++ ++ /** A global enabled setting for the ToolTipManager. */ ++ private transient boolean enabled = true; ++ ++ /** lightWeightPopupEnabled */ ++ protected boolean lightWeightPopupEnabled = true; ++ ++ /** heavyWeightPopupEnabled */ ++ protected boolean heavyWeightPopupEnabled = false; ++ ++ /** The shared instance of the ToolTipManager. */ ++ private static ToolTipManager shared; ++ ++ /** The current component the tooltip is being displayed for. */ ++ private static Component currentComponent; ++ ++ /** The current tooltip. */ ++ private static JToolTip currentTip; ++ ++ /** The last known position of the mouse cursor. */ ++ private static Point currentPoint; ++ ++ /** ++ * The panel that holds the tooltip when the tooltip is displayed fully ++ * inside the current container. ++ */ ++ private static Container containerPanel; ++ ++ /** ++ * The window used when the tooltip doesn't fit inside the current ++ * container. ++ */ ++ private static JWindow tooltipWindow; ++ ++ /** ++ * Creates a new ToolTipManager and sets up the timers. ++ */ ++ ToolTipManager() ++ { ++ enterTimer = new Timer(750, new insideTimerAction()); ++ enterTimer.setRepeats(false); ++ ++ insideTimer = new Timer(4000, new stillInsideTimerAction()); ++ insideTimer.setRepeats(false); ++ ++ exitTimer = new Timer(500, new outsideTimerAction()); ++ exitTimer.setRepeats(false); ++ } ++ ++ /** ++ * This method returns the shared instance of ToolTipManager used by all ++ * JComponents. ++ * ++ * @return The shared instance of ToolTipManager. ++ */ ++ public static ToolTipManager sharedInstance() ++ { ++ if (shared == null) ++ shared = new ToolTipManager(); ++ ++ return shared; ++ } ++ ++ /** ++ * This method sets whether ToolTips are enabled or disabled for all ++ * JComponents. ++ * ++ * @param enabled Whether ToolTips are enabled or disabled for all ++ * JComponents. ++ */ ++ public void setEnabled(boolean enabled) ++ { ++ if (! enabled) ++ { ++ enterTimer.stop(); ++ exitTimer.stop(); ++ insideTimer.stop(); ++ } ++ ++ this.enabled = enabled; ++ } ++ ++ /** ++ * This method returns whether ToolTips are enabled. ++ * ++ * @return Whether ToolTips are enabled. ++ */ ++ public boolean isEnabled() ++ { ++ return enabled; ++ } ++ ++ /** ++ * This method returns whether LightweightToolTips are enabled. ++ * ++ * @return Whether LighweightToolTips are enabled. ++ */ ++ public boolean isLightWeightPopupEnabled() ++ { ++ return lightWeightPopupEnabled; ++ } ++ ++ /** ++ * This method sets whether LightweightToolTips are enabled. If you mix ++ * Lightweight and Heavyweight components, you must set this to false to ++ * ensure that the ToolTips popup above all other components. ++ * ++ * @param enabled Whether LightweightToolTips will be enabled. ++ */ ++ public void setLightWeightPopupEnabled(boolean enabled) ++ { ++ lightWeightPopupEnabled = enabled; ++ heavyWeightPopupEnabled = ! enabled; ++ } ++ ++ /** ++ * This method returns the initial delay before the ToolTip is shown when ++ * the mouse enters a Component. ++ * ++ * @return The initial delay before the ToolTip is shown. ++ */ ++ public int getInitialDelay() ++ { ++ return enterTimer.getDelay(); ++ } ++ ++ /** ++ * This method sets the initial delay before the ToolTip is shown when the ++ * mouse enters a Component. ++ * ++ * @param delay The initial delay before the ToolTip is shown. ++ */ ++ public void setInitialDelay(int delay) ++ { ++ enterTimer.setDelay(delay); ++ } ++ ++ /** ++ * This method returns the time the ToolTip will be shown before being ++ * hidden. ++ * ++ * @return The time the ToolTip will be shown before being hidden. ++ */ ++ public int getDismissDelay() ++ { ++ return insideTimer.getDelay(); ++ } ++ ++ /** ++ * This method sets the time the ToolTip will be shown before being hidden. ++ * ++ * @param delay The time the ToolTip will be shown before being hidden. ++ */ ++ public void setDismissDelay(int delay) ++ { ++ insideTimer.setDelay(delay); ++ } ++ ++ /** ++ * This method returns the amount of delay where if the mouse re-enters a ++ * Component, the tooltip will be shown immediately. ++ * ++ * @return The reshow delay. ++ */ ++ public int getReshowDelay() ++ { ++ return exitTimer.getDelay(); ++ } ++ ++ /** ++ * This method sets the amount of delay where if the mouse re-enters a ++ * Component, the tooltip will be shown immediately. ++ * ++ * @param delay The reshow delay. ++ */ ++ public void setReshowDelay(int delay) ++ { ++ exitTimer.setDelay(delay); ++ } ++ ++ /** ++ * This method registers a JComponent with the ToolTipManager. ++ * ++ * @param component The JComponent to register with the ToolTipManager. ++ */ ++ public void registerComponent(JComponent component) ++ { ++ component.addMouseListener(this); ++ component.addMouseMotionListener(this); ++ } ++ ++ /** ++ * This method unregisters a JComponent with the ToolTipManager. ++ * ++ * @param component The JComponent to unregister with the ToolTipManager. ++ */ ++ public void unregisterComponent(JComponent component) ++ { ++ component.removeMouseMotionListener(this); ++ component.removeMouseListener(this); ++ } ++ ++ /** ++ * This method is called whenever the mouse enters a JComponent registered ++ * with the ToolTipManager. When the mouse enters within the period of time ++ * specified by the reshow delay, the tooltip will be displayed ++ * immediately. Otherwise, it must wait for the initial delay before ++ * displaying the tooltip. ++ * ++ * @param event The MouseEvent. ++ */ ++ public void mouseEntered(MouseEvent event) ++ { ++ if (currentComponent != null ++ && getContentPaneDeepestComponent(event) == currentComponent) ++ return; ++ currentPoint = event.getPoint(); ++ currentComponent = (Component) event.getSource(); ++ ++ if (exitTimer.isRunning()) ++ { ++ exitTimer.stop(); ++ showTip(); ++ insideTimer.start(); ++ return; ++ } ++ ++ // This should always be stopped unless we have just fake-exited. ++ if (! enterTimer.isRunning()) ++ enterTimer.start(); ++ } ++ ++ /** ++ * This method is called when the mouse exits a JComponent registered with ++ * the ToolTipManager. When the mouse exits, the tooltip should be hidden ++ * immediately. ++ * ++ * @param event The MouseEvent. ++ */ ++ public void mouseExited(MouseEvent event) ++ { ++ if (getContentPaneDeepestComponent(event) == currentComponent) ++ return; ++ ++ currentPoint = event.getPoint(); ++ currentComponent = null; ++ hideTip(); ++ ++ if (! enterTimer.isRunning() && insideTimer.isRunning()) ++ exitTimer.start(); ++ if (enterTimer.isRunning()) ++ enterTimer.stop(); ++ if (insideTimer.isRunning()) ++ insideTimer.stop(); ++ } ++ ++ /** ++ * This method is called when the mouse is pressed on a JComponent ++ * registered with the ToolTipManager. When the mouse is pressed, the ++ * tooltip (if it is shown) must be hidden immediately. ++ * ++ * @param event The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent event) ++ { ++ currentPoint = event.getPoint(); ++ if (enterTimer.isRunning()) ++ enterTimer.restart(); ++ else if (insideTimer.isRunning()) ++ { ++ insideTimer.stop(); ++ hideTip(); ++ } ++ currentComponent.invalidate(); ++ currentComponent.validate(); ++ currentComponent.repaint(); ++ } ++ ++ /** ++ * This method is called when the mouse is dragged in a JComponent ++ * registered with the ToolTipManager. ++ * ++ * @param event The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent event) ++ { ++ currentPoint = event.getPoint(); ++ if (enterTimer.isRunning()) ++ enterTimer.restart(); ++ } ++ ++ /** ++ * This method is called when the mouse is moved in a JComponent registered ++ * with the ToolTipManager. ++ * ++ * @param event The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent event) ++ { ++ currentPoint = event.getPoint(); ++ if (currentTip != null) ++ currentTip.setTipText(((JComponent) currentComponent).getToolTipText(event)); ++ if (enterTimer.isRunning()) ++ enterTimer.restart(); ++ } ++ ++ /** ++ * This method displays the ToolTip. It can figure out the method needed to ++ * show it as well (whether to display it in heavyweight/lightweight panel ++ * or a window.) ++ */ ++ private void showTip() ++ { ++ if (! enabled) ++ return; ++ ++ if (currentTip == null ++ || currentTip.getComponent() != currentComponent ++ && currentComponent instanceof JComponent) ++ currentTip = ((JComponent) currentComponent).createToolTip(); ++ Point p = currentPoint; ++ Dimension dims = currentTip.getPreferredSize(); ++ if (canToolTipFit(currentTip)) ++ { ++ JLayeredPane pane = ((JRootPane) SwingUtilities.getAncestorOfClass(JRootPane.class, ++ currentComponent)) ++ .getLayeredPane(); ++ ++ // This should never happen, but just in case. ++ if (pane == null) ++ return; ++ ++ if (containerPanel != null) ++ hideTip(); ++ if (isLightWeightPopupEnabled()) ++ { ++ containerPanel = new Panel(); ++ JRootPane root = new JRootPane(); ++ root.getContentPane().add(currentTip); ++ containerPanel.add(root); ++ } ++ else ++ { ++ containerPanel = new JPanel(); ++ containerPanel.add(currentTip); ++ } ++ LayoutManager lm = containerPanel.getLayout(); ++ if (lm instanceof FlowLayout) ++ { ++ FlowLayout fm = (FlowLayout) lm; ++ fm.setVgap(0); ++ fm.setHgap(0); ++ } ++ ++ p = getGoodPoint(p, pane, currentTip, dims); ++ ++ pane.add(containerPanel); ++ containerPanel.setBounds(p.x, p.y, dims.width, dims.height); ++ currentTip.setBounds(0, 0, dims.width, dims.height); ++ ++ pane.revalidate(); ++ pane.repaint(); ++ } ++ else ++ { ++ SwingUtilities.convertPointToScreen(p, currentComponent); ++ tooltipWindow = new JWindow(); ++ tooltipWindow.getContentPane().add(currentTip); ++ tooltipWindow.setFocusable(false); ++ tooltipWindow.pack(); ++ tooltipWindow.setBounds(p.x, p.y, dims.width, dims.height); ++ tooltipWindow.show(); ++ } ++ currentTip.setVisible(true); ++ } ++ ++ /** ++ * This method hides the ToolTip. ++ */ ++ private void hideTip() ++ { ++ if (currentTip == null || ! currentTip.isVisible() || ! enabled) ++ return; ++ currentTip.setVisible(false); ++ if (containerPanel != null) ++ { ++ Container parent = containerPanel.getParent(); ++ if (parent == null) ++ return; ++ parent.remove(containerPanel); ++ parent.invalidate(); ++ parent.validate(); ++ parent.repaint(); ++ ++ parent = currentTip.getParent(); ++ if (parent == null) ++ return; ++ parent.remove(currentTip); ++ ++ containerPanel = null; ++ } ++ if (tooltipWindow != null) ++ { ++ tooltipWindow.hide(); ++ tooltipWindow.dispose(); ++ tooltipWindow = null; ++ } ++ } ++ ++ /** ++ * This method returns a point in the LayeredPane where the ToolTip can be ++ * shown. The point returned (if the ToolTip is to be displayed at the ++ * preferred dimensions) will always place the ToolTip inside the ++ * currentComponent if possible. ++ * ++ * @param p The last known good point for the mouse. ++ * @param c The JLayeredPane in the first RootPaneContainer up from the ++ * currentComponent. ++ * @param tip The ToolTip to display. ++ * @param dims The ToolTip preferred dimensions (can be null). ++ * ++ * @return A good point to place the ToolTip. ++ */ ++ private Point getGoodPoint(Point p, JLayeredPane c, JToolTip tip, ++ Dimension dims) ++ { ++ if (dims == null) ++ dims = tip.getPreferredSize(); ++ Rectangle bounds = currentComponent.getBounds(); ++ if (p.x + dims.width > bounds.width) ++ p.x = bounds.width - dims.width; ++ if (p.y + dims.height > bounds.height) ++ p.y = bounds.height - dims.height; ++ ++ p = SwingUtilities.convertPoint(currentComponent, p, c); ++ return p; ++ } ++ ++ /** ++ * This method returns the deepest component in the content pane for the ++ * first RootPaneContainer up from the currentComponent. This method is ++ * used in conjunction with one of the mouseXXX methods. ++ * ++ * @param e The MouseEvent. ++ * ++ * @return The deepest component in the content pane. ++ */ ++ private Component getContentPaneDeepestComponent(MouseEvent e) ++ { ++ Component source = (Component) e.getSource(); ++ Container parent = (Container) SwingUtilities.getAncestorOfClass(JRootPane.class, ++ currentComponent); ++ if (parent == null) ++ return null; ++ parent = ((JRootPane) parent).getContentPane(); ++ Point p = e.getPoint(); ++ p = SwingUtilities.convertPoint(source, p, parent); ++ Component target = SwingUtilities.getDeepestComponentAt(parent, p.x, p.y); ++ return target; ++ } ++ ++ /** ++ * This method returns whether the ToolTip can fit in the first ++ * RootPaneContainer up from the currentComponent. ++ * ++ * @param tip The ToolTip. ++ * ++ * @return Whether the ToolTip can fit. ++ */ ++ private boolean canToolTipFit(JToolTip tip) ++ { ++ JRootPane root = (JRootPane) SwingUtilities.getAncestorOfClass(JRootPane.class, ++ currentComponent); ++ if (root == null) ++ return false; ++ Dimension pref = tip.getPreferredSize(); ++ Dimension rootSize = root.getSize(); ++ if (rootSize.width > pref.width && rootSize.height > pref.height) ++ return true; ++ return false; ++ } ++} +Index: javax/swing/TransferHandler.java +=================================================================== +RCS file: javax/swing/TransferHandler.java +diff -N javax/swing/TransferHandler.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/TransferHandler.java 6 Sep 2004 16:36:01 -0000 +@@ -0,0 +1,55 @@ ++/* TransferHandler.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing; ++ ++import java.io.Serializable; ++ ++public class TransferHandler implements Serializable ++{ ++ private static final long serialVersionUID = -7908749299918704233L; ++ ++ public static final int NONE = 0; ++ public static final int COPY = 1; ++ public static final int MOVE = 2; ++ public static final int COPY_OR_MOVE = 3; ++ ++ protected TransferHandler() ++ { ++ // Do nothing here. ++ } ++} +Index: javax/swing/UIDefaults.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/UIDefaults.java,v +retrieving revision 1.6 +diff -u -r1.6 UIDefaults.java +--- javax/swing/UIDefaults.java 27 Nov 2003 09:04:01 -0000 1.6 ++++ javax/swing/UIDefaults.java 6 Sep 2004 16:36:01 -0000 +@@ -1,5 +1,5 @@ + /* UIDefaults.java -- database for all settings and interface bindings. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -43,39 +43,36 @@ + import java.awt.Insets; + import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; ++import java.beans.PropertyChangeSupport; + import java.lang.reflect.Method; +-import java.lang.reflect.Constructor; + import java.util.Hashtable; +-import java.util.Iterator; +-import java.util.List; +-import java.util.ListIterator; + import java.util.LinkedList; ++import java.util.ListIterator; + import java.util.Locale; +-import java.util.Set; +-import java.util.HashSet; + import java.util.MissingResourceException; + import java.util.ResourceBundle; ++import java.util.Set; ++ + import javax.swing.border.Border; + import javax.swing.plaf.ComponentUI; + + /** + * UIDefaults is a database where all settings and interface bindings are + * stored into. An PLAF implementation fills one of these (see for example +- * plaf/basic/BasicDefaults.java) with "JButton" -> new BasicButtonUI(). ++ * plaf/basic/BasicLookAndFeel.java) with "ButtonUI" -> new BasicButtonUI(). + * + * @author Ronald Veldema (rveldema@cs.vu.nl) + */ + public class UIDefaults extends Hashtable + { ++ private LinkedList bundles; ++ private Locale defaultLocale; ++ private PropertyChangeSupport propertyChangeSupport; + +- LinkedList bundles; +- Set listeners; +- Locale defaultLocale; +- +- interface ActiveValue ++ public interface ActiveValue + { + Object createValue(UIDefaults table); +- } // interface ActiveValue ++ } + + public static class LazyInputMap implements LazyValue + { +@@ -94,12 +91,12 @@ + } + return im; + } +- } // class LazyInputMap ++ } + +- interface LazyValue ++ public interface LazyValue + { + Object createValue(UIDefaults table); +- } // interface LazyValue ++ } + + public static class ProxyLazyValue implements LazyValue + { +@@ -210,28 +207,24 @@ + { + return inner.createValue (table); + } +- } // class ProxyLazyValue ++ } + + private static final long serialVersionUID = 7341222528856548117L; + + public UIDefaults() + { + bundles = new LinkedList (); +- listeners = new HashSet (); + defaultLocale = Locale.getDefault (); ++ propertyChangeSupport = new PropertyChangeSupport(this); + } + + public UIDefaults(Object[] entries) + { +- bundles = new LinkedList (); +- listeners = new HashSet (); +- defaultLocale = Locale.getDefault (); ++ this(); + + for (int i = 0; (2*i+1) < entries.length; ++i) +- { + put (entries[2*i], entries[2*i+1]); + } +- } + + public Object get(Object key) + { +@@ -369,13 +362,13 @@ + return o instanceof String ? (String) o : null; + } + +- int getInt(Object key) ++ public int getInt(Object key) + { + Object o = get(key); + return o instanceof Integer ? ((Integer) o).intValue() : 0; + } + +- int getInt(Object key, Locale l) ++ public int getInt(Object key, Locale l) + { + Object o = get(key, l); + return o instanceof Integer ? ((Integer) o).intValue() : 0; +@@ -473,7 +466,6 @@ + getUIError ("InvocationTargetException ("+ ite.getTargetException() + +") calling createUI(...) on " + cls.toString ()); + return null; +- + } + catch (Exception e) + { +@@ -482,43 +474,38 @@ + } + } + +- void addPropertyChangeListener(PropertyChangeListener listener) ++ public void addPropertyChangeListener(PropertyChangeListener listener) + { +- listeners.add (listener); ++ propertyChangeSupport.addPropertyChangeListener(listener); + } + + void removePropertyChangeListener(PropertyChangeListener listener) + { +- listeners.remove (listener); ++ propertyChangeSupport.removePropertyChangeListener(listener); + } + + public PropertyChangeListener[] getPropertyChangeListeners() + { +- return (PropertyChangeListener[]) listeners.toArray (); ++ return propertyChangeSupport.getPropertyChangeListeners(); + } + +- protected void firePropertyChange(String property, Object o, Object n) ++ protected void firePropertyChange(String property, ++ Object oldValue, Object newValue) + { +- Iterator i = listeners.iterator (); +- PropertyChangeEvent pce = new PropertyChangeEvent (this, property, o, n); +- while (i.hasNext ()) +- { +- PropertyChangeListener pcl = (PropertyChangeListener) i.next (); +- pcl.propertyChange (pce); +- } ++ propertyChangeSupport.firePropertyChange(property, oldValue, newValue); + } + +- void addResourceBundle(String name) ++ public void addResourceBundle(String name) + { + bundles.addFirst (name); + } + +- void removeResourceBundle(String name) ++ public void removeResourceBundle(String name) + { + bundles.remove (name); + } + +- void setDefaultLocale(Locale loc) ++ public void setDefaultLocale(Locale loc) + { + defaultLocale = loc; + } +@@ -527,4 +514,4 @@ + { + return defaultLocale; + } +-} // class UIDefaults ++} +Index: javax/swing/UIManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/UIManager.java,v +retrieving revision 1.6 +diff -u -r1.6 UIManager.java +--- javax/swing/UIManager.java 27 Nov 2003 08:53:42 -0000 1.6 ++++ javax/swing/UIManager.java 6 Sep 2004 16:36:01 -0000 +@@ -1,5 +1,5 @@ + /* UIManager.java -- +- Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -54,15 +54,22 @@ + { + String name, clazz; + +- LookAndFeelInfo(String name, +- String clazz) ++ public LookAndFeelInfo(String name, ++ String clazz) + { + this.name = name; + this.clazz = clazz; + } + +- String getName() { return name; } +- String getClassName() { return clazz; } ++ public String getName() ++ { ++ return name; ++ } ++ ++ public String getClassName() ++ { ++ return clazz; ++ } + } + + private static final long serialVersionUID = -5547433830339189365L; +@@ -80,18 +87,31 @@ + // Do nothing here. + } + ++ /** ++ * Add a PropertyChangeListener to the listener list. ++ * ++ * @param listener the listener to add ++ */ + public static void addPropertyChangeListener (PropertyChangeListener listener) + { + // FIXME + } + ++ /** ++ * Remove a PropertyChangeListener from the listener list. ++ * ++ * @param listener the listener to remove ++ */ + public static void removePropertyChangeListener (PropertyChangeListener listener) +- // Remove a PropertyChangeListener from the listener list. + { + // FIXME + } + + /** ++ * Returns an array of all added PropertyChangeListener objects. ++ * ++ * @return an array of listeners ++ * + * @since 1.4 + */ + public static PropertyChangeListener[] getPropertyChangeListeners () +@@ -100,9 +120,11 @@ + throw new Error ("Not implemented"); + } + ++ /** ++ * Add a LookAndFeel to the list of auxiliary look and feels. ++ */ + public static void addAuxiliaryLookAndFeel (LookAndFeel l) + { +- // Add a LookAndFeel to the list of auxiliary look and feels. + if (aux_installed == null) + { + aux_installed = new LookAndFeel[1]; +@@ -178,8 +200,7 @@ + */ + public static Dimension getDimension(Object key) + { +- System.out.println("UIManager.getDim"); +- return new Dimension(200,100); ++ return (Dimension) getLookAndFeel().getDefaults().get(key); + } + + /** +@@ -188,21 +209,25 @@ + * + * @param key an Object that specifies the font. Typically, + * this is a String such as +- * "TitledBorder.font". ++ * TitledBorder.font. + */ + public static Font getFont(Object key) + { + return (Font) getLookAndFeel().getDefaults().get(key); + } + ++ /** ++ * Returns an Icon from the defaults table. ++ */ + public static Icon getIcon(Object key) +- // Returns an Icon from the defaults table. + { + return (Icon) getLookAndFeel().getDefaults().get(key); + } + ++ /** ++ * Returns an Insets object from the defaults table. ++ */ + public static Insets getInsets(Object key) +- // Returns an Insets object from the defaults table. + { + return (Insets) getLookAndFeel().getDefaults().getInsets(key); + } +@@ -234,49 +259,71 @@ + return getLookAndFeel().getDefaults(); + } + ++ /** ++ * Returns a string from the defaults table. ++ */ + public static String getString(Object key) +- // Returns a string from the defaults table. + { + return (String) getLookAndFeel().getDefaults().get(key); + } + ++ /** ++ * Returns the name of the LookAndFeel class that implements the ++ * native systems look and feel if there is one, otherwise the name ++ * of the default cross platform LookAndFeel class. ++ */ + public static String getSystemLookAndFeelClassName() +- // Returns the name of the LookAndFeel class that implements the native systems look and feel if there is one, otherwise the name of the default cross platform LookAndFeel class. + { + return getCrossPlatformLookAndFeelClassName(); + } + ++ /** ++ * Returns the Look and Feel object that renders the target component. ++ */ + public static ComponentUI getUI(JComponent target) +- // Returns the L&F object that renders the target component. + { +- ComponentUI ui = getDefaults().getUI(target); +- //System.out.println("GET-UI-> " + ui + ", for " + target); +- return ui; ++ return getDefaults().getUI(target); + } + ++ /** ++ * Creates a new look and feel and adds it to the current array. ++ */ + public static void installLookAndFeel(String name, String className) +- // Creates a new look and feel and adds it to the current array. + { + } + ++ /** ++ * Adds the specified look and feel to the current array and then calls ++ * setInstalledLookAndFeels(javax.swing.UIManager.LookAndFeelInfo[]). ++ */ + public static void installLookAndFeel(LookAndFeelInfo info) +- // Adds the specified look and feel to the current array and then calls setInstalledLookAndFeels(javax.swing.UIManager.LookAndFeelInfo[]). + { + } + ++ /** ++ * Stores an object in the defaults table. ++ */ + public static Object put(Object key, Object value) +- // Stores an object in the defaults table. + { + return getLookAndFeel().getDefaults().put(key,value); + } + ++ /** ++ * Replaces the current array of installed LookAndFeelInfos. ++ */ + public static void setInstalledLookAndFeels(UIManager.LookAndFeelInfo[] infos) +- // Replaces the current array of installed LookAndFeelInfos. + { + } + ++ /** ++ * Set the current default look. ++ */ + public static void setLookAndFeel(LookAndFeel newLookAndFeel) ++ throws UnsupportedLookAndFeelException + { ++ if (! newLookAndFeel.isSupportedLookAndFeel()) ++ throw new UnsupportedLookAndFeelException(newLookAndFeel.getName()); ++ + if (look_and_feel != null) + look_and_feel.uninitialize(); + +@@ -288,11 +335,13 @@ + //repaint(); + } + ++ /** ++ * Set the current default look and feel using a class name. ++ */ + public static void setLookAndFeel (String className) + throws ClassNotFoundException, InstantiationException, IllegalAccessException, + UnsupportedLookAndFeelException + { +- // Set the current default look and feel using a class name. + Class c = Class.forName(className); + LookAndFeel a = (LookAndFeel) c.newInstance(); // throws class-cast-exception + setLookAndFeel(a); +Index: javax/swing/ViewportLayout.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/ViewportLayout.java,v +retrieving revision 1.3 +diff -u -r1.3 ViewportLayout.java +--- javax/swing/ViewportLayout.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/ViewportLayout.java 6 Sep 2004 16:36:01 -0000 +@@ -41,75 +41,118 @@ + import java.awt.Container; + import java.awt.Dimension; + import java.awt.LayoutManager; ++import java.awt.Point; ++import java.awt.Rectangle; + import java.io.Serializable; + + /** + * ViewportLayout + * @author Andrew Selkirk +- * @version 1.0 ++ * @author Graydon Hoare + */ + public class ViewportLayout implements LayoutManager, Serializable + { + static final long serialVersionUID = -788225906076097229L; + +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ViewportLayout +- */ +- public ViewportLayout() { +- // TODO +- } // ViewportLayout() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * addLayoutComponent +- * @param name TODO +- * @param c TODO +- */ +- public void addLayoutComponent(String name, Component c) { +- // TODO +- } // addLayoutComponent() +- +- /** +- * removeLayoutComponent +- * @param c TODO +- */ +- public void removeLayoutComponent(Component c) { +- // TODO +- } // removeLayoutComponent() +- +- /** +- * preferredLayoutSize +- * @param parent TODO +- * @returns Dimension +- */ +- public Dimension preferredLayoutSize(Container parent) { +- return null; // TODO +- } // preferredLayoutSize() +- +- /** +- * minimumLayoutSize +- * @param parent TODO +- * @returns Dimension +- */ +- public Dimension minimumLayoutSize(Container parent) { +- return null; // TODO +- } // minimumLayoutSize() +- +- /** +- * layoutContainer +- * @param parent TODO +- */ +- public void layoutContainer(Container parent) { +- // TODO +- } // layoutContainer() +- +- +-} // ViewportLayout ++ public ViewportLayout() ++ { ++ } ++ public void addLayoutComponent(String name, Component c) ++ { ++ } ++ public void removeLayoutComponent(Component c) ++ { ++ } ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ JViewport vp = (JViewport)parent; ++ Component view = vp.getView(); ++ return view.getPreferredSize(); ++ } ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ JViewport vp = (JViewport)parent; ++ Component view = vp.getView(); ++ return view.getMinimumSize(); ++ } ++ ++ /** ++ * Layout the view and viewport to respect the following rules. These are ++ * not precisely the rules described in sun's javadocs, but they are the ++ * rules which sun's swing implementation follows, if you watch its ++ * behavior: ++ * ++ *
      ++ * ++ *
    1. If the port is larger than the view's minimum size, put the port ++ * at view position (0,0) and make the view's size equal to ++ * the port's.
    2. ++ * ++ *
    3. If the port is smaller than the view, leave the view at its ++ * minimum size. also, do not move the port, unless the port ++ * extends into space past the edge of the view. If so, move the ++ * port up or to the left, in view space, by the amount of empty space ++ * (keep the lower and right edges lined up)
    4. ++ * ++ *
    ++ * ++ * @see JViewport#getViewSize ++ * @see JViewport#setViewSize ++ * @see JViewport#getViewPosition ++ * @see JViewport#setViewPosition ++ */ ++ ++ public void layoutContainer(Container parent) ++ { ++ // The way to interpret this function is basically to ignore the names ++ // of methods it calls, and focus on the variable names here. getViewRect ++ // doesn't, for example, return the view; it returns the port bounds in ++ // view space. Likwise setViewPosition doesn't reposition the view; it ++ // positions the port, in view coordinates. ++ ++ JViewport port = (JViewport) parent; ++ Component view = port.getView(); ++ ++ // These dimensions and positions are in *view space*. Do not mix ++ // variables in here from port space (eg. parent.getBounds()). This ++ // function should be entirely in view space, because the methods on ++ // the viewport require inputs in view space. ++ ++ Rectangle portBounds = port.getViewRect(); ++ Dimension viewPref = view.getPreferredSize(); ++ Dimension viewMinimum = view.getMinimumSize(); ++ Point portLowerRight = new Point(portBounds.x + portBounds.width, ++ portBounds.y + portBounds.height); ++ ++ // vertical implementation of the above rules ++ if (portBounds.height >= viewMinimum.height) ++ { ++ portBounds.y = 0; ++ viewPref.height = portBounds.height; ++ } ++ else ++ { ++ viewPref.height = viewMinimum.height; ++ int overextension = portLowerRight.y - viewPref.height; ++ if (overextension > 0) ++ portBounds.y -= overextension; ++ } ++ ++ // horizontal implementation of the above rules ++ if (portBounds.width >= viewMinimum.width) ++ { ++ portBounds.x = 0; ++ viewPref.width = portBounds.width; ++ } ++ else ++ { ++ viewPref.width = viewMinimum.width; ++ int overextension = portLowerRight.x - viewPref.width; ++ if (overextension > 0) ++ portBounds.x -= overextension; ++ } ++ ++ port.setViewPosition(portBounds.getLocation()); ++ port.setViewSize(viewPref); ++ } ++} +Index: javax/swing/border/TitledBorder.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/border/TitledBorder.java,v +retrieving revision 1.4 +diff -u -r1.4 TitledBorder.java +--- javax/swing/border/TitledBorder.java 19 Jun 2003 10:48:45 -0000 1.4 ++++ javax/swing/border/TitledBorder.java 6 Sep 2004 16:36:01 -0000 +@@ -1,5 +1,5 @@ + /* TitledBorder.java -- +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,8 +45,8 @@ + import java.awt.FontMetrics; + import java.awt.Graphics; + import java.awt.Insets; +-import java.awt.Rectangle; + import java.awt.Shape; ++ + import javax.swing.UIManager; + + +@@ -252,7 +252,7 @@ + * The border underneath the title. If this value is + * null, the border will be retrieved from the {@link + * javax.swing.UIManager}’s defaults table using the key +- * "TitledBorder.border". ++ * TitledBorder.border. + */ + protected Border border; + +@@ -279,7 +279,7 @@ + * The font for displaying the title text. If this value is + * null, the font will be retrieved from the {@link + * javax.swing.UIManager}’s defaults table using the key +- * "TitledBorder.font". ++ * TitledBorder.font. + */ + protected Font titleFont; + +@@ -288,7 +288,7 @@ + * The color for displaying the title text. If this value is + * null, the color will be retrieved from the {@link + * javax.swing.UIManager}’s defaults table using the key +- * "TitledBorder.titleColor". ++ * TitledBorder.titleColor. + */ + protected Color titleColor; + +@@ -717,11 +717,11 @@ + * Retrieves the border underneath the title. If no border has been + * set, or if it has been set tonull, the current + * {@link javax.swing.LookAndFeel} will be asked for a border +- * using the key "TitledBorder.border". ++ * using the key TitledBorder.border. + * + * @return a border, or null if the current LookAndFeel + * does not provide a border for the key +- * "TitledBorder.border". ++ * TitledBorder.border. + * + * @see javax.swing.UIManager#getBorder(Object) + */ +@@ -766,11 +766,11 @@ + * Retrieves the font for displaying the title text. If no font has + * been set, or if it has been set tonull, the current + * {@link javax.swing.LookAndFeel} will be asked for a font +- * using the key "TitledBorder.font". ++ * using the key TitledBorder.font. + * + * @return a font, or null if the current LookAndFeel + * does not provide a font for the key +- * "TitledBorder.font". ++ * TitledBorder.font. + * + * @see javax.swing.UIManager#getFont(Object) + */ +@@ -787,11 +787,11 @@ + * Retrieves the color for displaying the title text. If no color has + * been set, or if it has been set tonull, the current + * {@link javax.swing.LookAndFeel} will be asked for a color +- * using the key "TitledBorder.titleColor". ++ * using the key TitledBorder.titleColor. + * + * @return a color, or null if the current LookAndFeel + * does not provide a color for the key +- * "TitledBorder.titleColor". ++ * TitledBorder.titleColor. + * + * @see javax.swing.UIManager#getColor(Object) + */ +@@ -1088,7 +1088,7 @@ + + + /** +- * The border that constitues the "interior" border ++ * The border that constitues the interior border + * underneath the title text. + */ + Border border; +Index: javax/swing/colorchooser/AbstractColorChooserPanel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/colorchooser/AbstractColorChooserPanel.java,v +retrieving revision 1.2 +diff -u -r1.2 AbstractColorChooserPanel.java +--- javax/swing/colorchooser/AbstractColorChooserPanel.java 11 Jun 2003 13:20:40 -0000 1.2 ++++ javax/swing/colorchooser/AbstractColorChooserPanel.java 6 Sep 2004 16:36:02 -0000 +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.colorchooser; + + import java.awt.Color; +@@ -44,106 +43,119 @@ + import javax.swing.JColorChooser; + import javax.swing.JPanel; + ++ + /** + * AbstractColorChooserPanel +- * @author Andrew Selkirk +- * @version 1.0 ++ * ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public abstract class AbstractColorChooserPanel extends JPanel { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * chooser +- */ +- private JColorChooser chooser; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AbstractColorChooserPanel +- */ +- public AbstractColorChooserPanel() { +- // TODO +- } // AbstractColorChooserPanel() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getDisplayName +- * @returns String +- */ +- public abstract String getDisplayName(); +- +- /** +- * updateChooser +- */ +- public abstract void updateChooser(); +- +- /** +- * buildChooser +- */ +- protected abstract void buildChooser(); +- +- /** +- * getSmallDisplayIcon +- * @returns Icon +- */ +- public abstract Icon getSmallDisplayIcon(); +- +- /** +- * getLargeDisplayIcon +- * @returns Icon +- */ +- public abstract Icon getLargeDisplayIcon(); +- +- /** +- * installChooserPanel +- * @param chooser TODO +- */ +- public void installChooserPanel(JColorChooser chooser) { +- // TODO +- } // installChooserPanel() +- +- /** +- * uninstallChooserPanel +- * @param chooser TODO +- */ +- public void uninstallChooserPanel(JColorChooser chooser) { +- // TODO +- } // uninstallChooserPanel() +- +- /** +- * getColorSelectionModel +- * @returns ColorSelectionModel +- */ +- public ColorSelectionModel getColorSelectionModel() { +- return null; // TODO +- } // getColorSelectionModel() +- +- /** +- * getColorFromModel +- * @returns Color +- */ +- protected Color getColorFromModel() { +- return null; // TODO +- } // getColorFromModel() +- +- /** +- * paint +- * @param graphics TODO +- */ +- public void paint(Graphics graphics) { +- // TODO +- } // paint() +- +- ++public abstract class AbstractColorChooserPanel extends JPanel ++{ ++ /** DOCUMENT ME! */ ++ private static final long serialVersionUID = -977469671210173863L; ++ ++ /** The chooser associated with this panel. */ ++ private JColorChooser chooser; ++ ++ /** ++ * This is the constructor for the AbstractColorChooserPanel. ++ */ ++ public AbstractColorChooserPanel() ++ { ++ } // AbstractColorChooserPanel() ++ ++ /** ++ * This method returns the name displayed in the tab for this chooser panel. ++ * ++ * @return The name displayed in the JTabbedPane's tabs. ++ */ ++ public abstract String getDisplayName(); ++ ++ /** ++ * This method updates the chooser panel when the JColorChooser's color has ++ * changed. ++ */ ++ public abstract void updateChooser(); ++ ++ /** ++ * This method constructs and does any initialization necessary for the ++ * chooser panel. ++ */ ++ protected abstract void buildChooser(); ++ ++ /** ++ * This method sets the small icon used in the JTabbedPane for this chooser ++ * panel. ++ * ++ * @return The small icon used in the JTabbedPane. ++ */ ++ public abstract Icon getSmallDisplayIcon(); ++ ++ /** ++ * This method sets the large icon useed in the jTabbedPane for this chooser ++ * panel. ++ * ++ * @return The large icon. ++ */ ++ public abstract Icon getLargeDisplayIcon(); ++ ++ /** ++ * This method installs the chooser panel for the given JColorChooser. ++ * ++ * @param chooser The JColorChooser that will have this panel installed. ++ */ ++ public void installChooserPanel(JColorChooser chooser) ++ { ++ this.chooser = chooser; ++ buildChooser(); ++ } // installChooserPanel() ++ ++ /** ++ * This method removes the chooser panel from the given JColorChooser and ++ * does any necessary clean up for the chooser panel. ++ * ++ * @param chooser The JColorChooser that is having this panel removed. ++ */ ++ public void uninstallChooserPanel(JColorChooser chooser) ++ { ++ this.chooser = null; ++ } // uninstallChooserPanel() ++ ++ /** ++ * This method returns the ColorSelectionModel for the JColorChooser ++ * associated with this chooser panel. ++ * ++ * @return The ColorSelectionModel for the JColorChooser associated with ++ * this chooser panel. ++ */ ++ public ColorSelectionModel getColorSelectionModel() ++ { ++ if (chooser != null) ++ return chooser.getSelectionModel(); ++ return null; ++ } // getColorSelectionModel() ++ ++ /** ++ * This method returns the current color stored in the model for this ++ * chooser panel. ++ * ++ * @return The current color. ++ */ ++ protected Color getColorFromModel() ++ { ++ if (chooser != null) ++ return chooser.getColor(); ++ return null; ++ } // getColorFromModel() ++ ++ /** ++ * This method paints the chooser panel. ++ * ++ * @param graphics The Graphics object to paint with. ++ */ ++ public void paint(Graphics graphics) ++ { ++ super.paint(graphics); ++ } // paint() + } // AbstractColorChooserPanel +Index: javax/swing/colorchooser/ColorChooserComponentFactory.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/colorchooser/ColorChooserComponentFactory.java,v +retrieving revision 1.2 +diff -u -r1.2 ColorChooserComponentFactory.java +--- javax/swing/colorchooser/ColorChooserComponentFactory.java 11 Jun 2003 13:20:40 -0000 1.2 ++++ javax/swing/colorchooser/ColorChooserComponentFactory.java 6 Sep 2004 16:36:02 -0000 +@@ -35,49 +35,51 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.colorchooser; + + import javax.swing.JComponent; + ++ + /** + * ColorChooserComponentFactory +- * @author Andrew Selkirk +- * @version 1.0 ++ * ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public class ColorChooserComponentFactory { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor ColorChooserComponentFactory +- */ +- private ColorChooserComponentFactory() { +- // TODO +- } // ColorChooserComponentFactory() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getDefaultChooserPanels +- * @returns AbstractColorChooserPanel[] +- */ +- public static AbstractColorChooserPanel[] getDefaultChooserPanels() { +- return null; // TODO +- } // getDefaultChooserPanels() +- +- /** +- * getPreviewPanel +- * @returns JComponent +- */ +- public static JComponent getPreviewPanel() { +- return null; // TODO +- } // getPreviewPanel() +- +- ++public class ColorChooserComponentFactory ++{ ++ /** ++ * Constructor ColorChooserComponentFactory ++ */ ++ private ColorChooserComponentFactory() ++ { ++ } // ColorChooserComponentFactory() ++ ++ /** ++ * This method returns the three default chooser panels to be used in ++ * JColorChooser. ++ * ++ * @return The default chooser panels. ++ */ ++ public static AbstractColorChooserPanel[] getDefaultChooserPanels() ++ { ++ AbstractColorChooserPanel[] values = ++ { ++ new DefaultSwatchChooserPanel(), ++ new DefaultHSBChooserPanel(), ++ new DefaultRGBChooserPanel() ++ }; ++ return values; ++ } ++ ++ /** ++ * This method returns the default preview panel to be used with ++ * JColorChoosers. ++ * ++ * @return The default preview panel. ++ */ ++ public static JComponent getPreviewPanel() ++ { ++ return new DefaultPreviewPanel(); ++ } // getPreviewPanel() + } // ColorChooserComponentFactory +Index: javax/swing/colorchooser/DefaultColorSelectionModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/colorchooser/DefaultColorSelectionModel.java,v +retrieving revision 1.4 +diff -u -r1.4 DefaultColorSelectionModel.java +--- javax/swing/colorchooser/DefaultColorSelectionModel.java 14 Jul 2003 05:33:30 -0000 1.4 ++++ javax/swing/colorchooser/DefaultColorSelectionModel.java 6 Sep 2004 16:36:02 -0000 +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.colorchooser; + + import java.awt.Color; +@@ -44,43 +43,55 @@ + import javax.swing.event.ChangeListener; + import javax.swing.event.EventListenerList; + ++ + /** +- * DefaultColorSelectionModel +- * @author Andrew Selkirk +- * @version 1.0 ++ * This is the default implementation of the ColorSelectionModel interface ++ * that JColorChoosers use. ++ * ++ * @author Andrew Selkirk ++ * @version 1.0 + */ +-public class DefaultColorSelectionModel +- implements ColorSelectionModel, Serializable ++public class DefaultColorSelectionModel implements ColorSelectionModel, ++ Serializable + { ++ /** DOCUMENT ME! */ + private static final long serialVersionUID = -8117143602864778804L; + ++ /** The currently selected color. */ + private Color selectedColor; + +- protected transient ChangeEvent changeEvent = new ChangeEvent (this); +- protected EventListenerList listenerList = new EventListenerList (); ++ /** The ChangeEvent fired to all ChangeListeners. */ ++ protected transient ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ /** The list of listeners. */ ++ protected EventListenerList listenerList = new EventListenerList(); + + /** +- * Creates a new color selection model. ++ * Creates a new color selection model with the default white color. + */ + public DefaultColorSelectionModel() + { +- this (Color.white); ++ this(Color.white); + } + + /** + * Creates a new color selection model with a given selected color. +- * +- * @param color The selected color. ++ * ++ * @param color The initial color. ++ * ++ * @throws Error If the color is null. + */ +- public DefaultColorSelectionModel (Color color) ++ public DefaultColorSelectionModel(Color color) + { + super(); ++ if (color == null) ++ throw new Error("ColorSelectionModel cannot be set to have null color."); + this.selectedColor = color; + } + + /** + * Returns the selected color. +- * ++ * + * @return The selected color. + */ + public Color getSelectedColor() +@@ -89,31 +100,41 @@ + } + + /** ++ * This method sets the color. ++ * + * @param color The color to set. ++ * ++ * @throws Error If the color is set. + */ +- public void setSelectedColor (Color color) ++ public void setSelectedColor(Color color) + { +- this.selectedColor = color; ++ if (color == null) ++ throw new Error("ColorSelectionModel cannot be set to have null color."); ++ if (color != selectedColor) ++ { ++ this.selectedColor = color; ++ fireStateChanged(); ++ } + } + + /** + * Adds a listener to this model. +- * ++ * + * @param listener The listener to add. + */ +- public void addChangeListener (ChangeListener listener) ++ public void addChangeListener(ChangeListener listener) + { +- listenerList.add (ChangeListener.class, listener); ++ listenerList.add(ChangeListener.class, listener); + } + + /** + * Removes a listener from this model. +- * ++ * + * @param listener The listener to remove. + */ +- public void removeChangeListener (ChangeListener listener) ++ public void removeChangeListener(ChangeListener listener) + { +- listenerList.remove (ChangeListener.class, listener); ++ listenerList.remove(ChangeListener.class, listener); + } + + /** +@@ -123,19 +144,19 @@ + */ + public ChangeListener[] getChangeListeners() + { +- return (ChangeListener[]) listenerList.getListeners (ChangeListener.class); ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); + } + + /** + * Calls all the stateChanged() method of all added +- * ChangeListener objects with changeEvent +- * as argument. ++ * ChangeListener objects with changeEvent as ++ * argument. + */ + protected void fireStateChanged() + { + ChangeListener[] listeners = getChangeListeners(); + + for (int i = 0; i < listeners.length; i++) +- listeners [i].stateChanged (changeEvent); ++ listeners[i].stateChanged(changeEvent); + } + } +Index: javax/swing/colorchooser/DefaultHSBChooserPanel.java +=================================================================== +RCS file: javax/swing/colorchooser/DefaultHSBChooserPanel.java +diff -N javax/swing/colorchooser/DefaultHSBChooserPanel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/colorchooser/DefaultHSBChooserPanel.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,860 @@ ++/* DefaultHSBChooserPanel.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.colorchooser; ++ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.ComponentOrientation; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.GridLayout; ++import java.awt.Image; ++import java.awt.LayoutManager; ++import java.awt.Point; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseMotionListener; ++import java.awt.image.MemoryImageSource; ++import javax.swing.AbstractButton; ++import javax.swing.ButtonGroup; ++import javax.swing.Icon; ++import javax.swing.JColorChooser; ++import javax.swing.JLabel; ++import javax.swing.JPanel; ++import javax.swing.JRadioButton; ++import javax.swing.JSlider; ++import javax.swing.JSpinner; ++import javax.swing.SpinnerNumberModel; ++import javax.swing.SwingConstants; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++ ++ ++/** ++ * This is the Default HSB Panel displayed in the JColorChooser. ++ */ ++class DefaultHSBChooserPanel extends AbstractColorChooserPanel ++{ ++ /** The gradient image displayed. */ ++ private transient Image gradientImage; ++ ++ /** The Panel that holds the gradient image. */ ++ private transient JPanel gradientPanel; ++ ++ /** The track gradient image. */ ++ private transient Image trackImage; ++ ++ /** The panel that holds the track. */ ++ private transient JPanel trackPanel; ++ ++ /** The slider for the locked HSB value. */ ++ private transient JSlider slider; ++ ++ /** The RadioButton that controls the Hue. */ ++ private transient JRadioButton hRadio; ++ ++ /** The RadioButton that controls the Saturation. */ ++ private transient JRadioButton sRadio; ++ ++ /** The RadioButton that controls the Brightness. */ ++ private transient JRadioButton bRadio; ++ ++ /** The JSpinner that controls the Hue. */ ++ private transient JSpinner hSpinner; ++ ++ /** The JSpinner that controls the Saturation. */ ++ private transient JSpinner sSpinner; ++ ++ /** The JSpinner that controls the Brightness. */ ++ private transient JSpinner bSpinner; ++ ++ /** The default width of the gradient image. */ ++ private static final int imgWidth = 200; ++ ++ /** The default height of the gradient image. */ ++ private static final int imgHeight = 200; ++ ++ /** The default width of the track gradient. */ ++ private static final int trackWidth = 30; ++ ++ /** The JLabel for Red. */ ++ private static final JLabel R = new JLabel("R"); ++ ++ /** The JLabel for Green. */ ++ private static final JLabel G = new JLabel("G"); ++ ++ /** The JLabel for Blue. */ ++ private static final JLabel B = new JLabel("B"); ++ ++ // FIXME: Should be textfields. ++ ++ /** The JLabel that displays the value of Red. */ ++ private transient JLabel rFull; ++ ++ /** The JLabel that displays the value of Green. */ ++ private transient JLabel gFull; ++ ++ /** The JLabel that displays the value of Blue. */ ++ private transient JLabel bFull; ++ ++ /** The point that is displayed in the gradient image. */ ++ private transient Point gradientPoint = new Point(); ++ ++ /** ++ * This indicates that the change to the slider or point is triggered ++ * internally. ++ */ ++ private transient boolean internalChange = false; ++ ++ /** This indicates that the change to the spinner is triggered internally. */ ++ private transient boolean spinnerTrigger = false; ++ ++ /** This int identifies which spinner is currently locked. */ ++ private transient int locked = -1; ++ ++ /** This value indicates that the Hue spinner is locked. */ ++ static final int HLOCKED = 0; ++ ++ /** This value indicates that the Saturation spinner is locked. */ ++ static final int SLOCKED = 1; ++ ++ /** This value indicates that the Brightness spinner is locked. */ ++ static final int BLOCKED = 2; ++ ++ /** ++ * This method indicates that the mouse event is in the process of being ++ * handled. ++ */ ++ private transient boolean handlingMouse; ++ ++ /** ++ * This helper class handles mouse events on the gradient image. ++ */ ++ class MainGradientMouseListener extends MouseAdapter ++ implements MouseMotionListener ++ { ++ /** ++ * This method is called when the mouse is pressed over the gradient ++ * image. The JColorChooser is then updated with new HSB values. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ gradientPoint = e.getPoint(); ++ update(e.getPoint()); ++ } ++ ++ /** ++ * This method is called when the mouse is dragged over the gradient ++ * image. The JColorChooser is then updated with the new HSB values. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ Point p = e.getPoint(); ++ if (p.x < 0 || p.y < 0 || p.y > imgHeight || p.x > imgWidth) ++ return; ++ ++ gradientPoint = p; ++ update(p); ++ } ++ ++ /** ++ * This method is called when the mouse is moved over the gradient image. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method updates the JColorChooser with the new values. ++ * ++ * @param p The Point where the MouseEvent occurred. ++ */ ++ private void update(Point p) ++ { ++ handlingMouse = true; ++ if (hSpinner.isEnabled()) ++ updateH(p); ++ else if (sSpinner.isEnabled()) ++ updateS(p); ++ else ++ updateB(p); ++ handlingMouse = false; ++ } ++ ++ /** ++ * This method updates the SB values if Hue is locked. ++ * ++ * @param p The point where the MouseEvent occurred. ++ */ ++ private void updateH(Point p) ++ { ++ float s = (imgWidth - p.x * 1f) / imgWidth; ++ float b = (imgHeight - p.y * 1f) / imgHeight; ++ ++ // Avoid two changes to the model by changing internalChange to true. ++ internalChange = true; ++ sSpinner.setValue(new Integer((int) (s * 100))); ++ internalChange = false; ++ bSpinner.setValue(new Integer((int) (b * 100))); ++ ++ revalidate(); ++ } ++ ++ /** ++ * This method updates the HB values if Saturation is locked. ++ * ++ * @param p The point where the MouseEvent occurred. ++ */ ++ private void updateS(Point p) ++ { ++ float h = p.x * 1f / imgWidth; ++ float b = (imgHeight - p.y * 1f) / imgHeight; ++ ++ internalChange = true; ++ hSpinner.setValue(new Integer((int) (h * 365))); ++ internalChange = false; ++ bSpinner.setValue(new Integer((int) (b * 100))); ++ ++ revalidate(); ++ } ++ ++ /** ++ * This method updates the HS values if Brightness is locked. ++ * ++ * @param p The point where the MouseEvent occurred. ++ */ ++ private void updateB(Point p) ++ { ++ float h = p.x * 1f / imgWidth; ++ float s = (imgHeight - p.y * 1f) / imgHeight; ++ ++ internalChange = true; ++ hSpinner.setValue(new Integer((int) (h * 365))); ++ internalChange = false; ++ sSpinner.setValue(new Integer((int) (s * 100))); ++ ++ revalidate(); ++ } ++ } ++ ++ /** ++ * This method listens for slider value changes. ++ */ ++ class SliderChangeListener implements ChangeListener ++ { ++ /** ++ * This method is called when the slider value changes. It should change ++ * the color of the JColorChooser. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ if (internalChange) ++ return; ++ ++ Integer value = new Integer(slider.getValue()); ++ ++ switch (locked) ++ { ++ case HLOCKED: ++ hSpinner.setValue(value); ++ break; ++ case SLOCKED: ++ sSpinner.setValue(value); ++ break; ++ case BLOCKED: ++ bSpinner.setValue(value); ++ break; ++ } ++ } ++ } ++ ++ /** ++ * This helper class determines the active JSpinner. ++ */ ++ class RadioStateListener implements ChangeListener ++ { ++ /** ++ * This method is called when there is a new JRadioButton that was ++ * selected. As a result, it should activate the associated JSpinner. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ JSpinner change; ++ if (e.getSource() == hRadio) ++ { ++ locked = HLOCKED; ++ change = hSpinner; ++ } ++ else if (e.getSource() == sRadio) ++ { ++ locked = SLOCKED; ++ change = sSpinner; ++ } ++ else ++ { ++ locked = BLOCKED; ++ change = bSpinner; ++ } ++ ++ change.setEnabled(((AbstractButton) e.getSource()).isSelected()); ++ updateSlider(); ++ updateTrack(); ++ updateImage(); ++ repaint(); ++ } ++ } ++ ++ /** ++ * This class listens to the JSpinners for changes. ++ */ ++ class ImageScrollListener implements ChangeListener ++ { ++ /** ++ * This method is called whenever one of the JSpinner values change. The ++ * JColorChooser should be updated with the new HSB values. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ if (internalChange) ++ return; ++ ++ float h = ((Number) hSpinner.getValue()).intValue() / 360f; ++ float s = ((Number) sSpinner.getValue()).intValue() / 100f; ++ float b = ((Number) bSpinner.getValue()).intValue() / 100f; ++ ++ spinnerTrigger = true; ++ getColorSelectionModel().setSelectedColor(new Color(Color.HSBtoRGB(h, s, ++ b))); ++ spinnerTrigger = false; ++ ++ if (! handlingMouse) ++ { ++ updateImage(); ++ updateTrack(); ++ } ++ repaint(); ++ } ++ } ++ ++ /** ++ * Creates a new DefaultHSBChooserPanel object. ++ */ ++ DefaultHSBChooserPanel() ++ { ++ super(); ++ } ++ ++ /** ++ * This method returns the name displayed by the JColorChooser tab that ++ * holds this panel. ++ * ++ * @return The name displayed in the JColorChooser tab. ++ */ ++ public String getDisplayName() ++ { ++ return "HSB"; ++ } ++ ++ /** ++ * This method updates the various components inside the HSBPanel (the ++ * JSpinners, the JSlider, and the gradient image point) with updated ++ * values when the JColorChooser color value changes. ++ */ ++ public void updateChooser() ++ { ++ Color c = getColorSelectionModel().getSelectedColor(); ++ ++ float[] hsbVals = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), ++ null); ++ ++ internalChange = true; ++ ++ // spinnerTrigger, internalChange, and handlingMouse are used because of the ++ // we don't want things like: change spinner -> update chooser -> change spinner ++ // That's because the value from before and after the update can differ ++ // slightly because of the conversion. ++ // FIXME: Think of better way to deal with this. ++ if (! spinnerTrigger) ++ { ++ hSpinner.setValue(new Integer((int) (hsbVals[0] * 360))); ++ sSpinner.setValue(new Integer((int) (hsbVals[1] * 100))); ++ bSpinner.setValue(new Integer((int) (hsbVals[2] * 100))); ++ } ++ ++ switch (locked) ++ { ++ case HLOCKED: ++ if (slider != null) ++ slider.setValue(((Number) hSpinner.getValue()).intValue()); ++ if (! handlingMouse) ++ { ++ gradientPoint.x = (int) ((1 - hsbVals[1]) * imgWidth); ++ gradientPoint.y = (int) ((1 - hsbVals[2]) * imgHeight); ++ } ++ break; ++ case SLOCKED: ++ if (slider != null) ++ slider.setValue(((Number) sSpinner.getValue()).intValue()); ++ if (! handlingMouse) ++ { ++ gradientPoint.x = (int) (hsbVals[0] * imgWidth); ++ gradientPoint.y = (int) ((1 - hsbVals[2]) * imgHeight); ++ } ++ break; ++ case BLOCKED: ++ if (slider != null) ++ slider.setValue(((Number) bSpinner.getValue()).intValue()); ++ if (! handlingMouse) ++ { ++ gradientPoint.x = (int) (hsbVals[0] * imgWidth); ++ gradientPoint.y = (int) ((1 - hsbVals[1]) * imgHeight); ++ } ++ break; ++ } ++ internalChange = false; ++ ++ updateImage(); ++ updateTrack(); ++ updateTextFields(); ++ } ++ ++ /** ++ * This method builds the DefaultHSBChooserPanel. ++ */ ++ protected void buildChooser() ++ { ++ setLayout(new BorderLayout()); ++ ++ add(buildRightPanel(), BorderLayout.EAST); ++ ++ JPanel container = new JPanel(); ++ container.setLayout(new BorderLayout()); ++ ++ gradientPanel = new JPanel() ++ { ++ public Dimension getPreferredSize() ++ { ++ return new Dimension(imgWidth, imgHeight); ++ } ++ ++ public void paint(Graphics g) ++ { ++ if (gradientImage != null) ++ g.drawImage(gradientImage, 0, 0, this); ++ ++ Color saved = g.getColor(); ++ g.setColor(Color.WHITE); ++ g.drawOval(gradientPoint.x - 3, gradientPoint.y - 3, 6, 6); ++ g.setColor(saved); ++ } ++ }; ++ ++ MouseAdapter ml = new MainGradientMouseListener(); ++ gradientPanel.addMouseListener(ml); ++ gradientPanel.addMouseMotionListener((MouseMotionListener) ml); ++ ++ trackPanel = new JPanel() ++ { ++ public Dimension getPreferredSize() ++ { ++ return new Dimension(trackWidth, imgHeight); ++ } ++ ++ public void paint(Graphics g) ++ { ++ if (trackImage != null) ++ g.drawImage(trackImage, 0, 0, this); ++ } ++ }; ++ ++ slider = new JSlider(); ++ slider.setPaintTrack(false); ++ slider.setPaintTicks(false); ++ ++ slider.setOrientation(SwingConstants.VERTICAL); ++ ++ updateSlider(); ++ ++ container.add(gradientPanel, BorderLayout.WEST); ++ container.add(slider, BorderLayout.CENTER); ++ container.add(trackPanel, BorderLayout.EAST); ++ ++ add(container, BorderLayout.WEST); ++ slider.addChangeListener(new SliderChangeListener()); ++ repaint(); ++ } ++ ++ /** ++ * This method uninstalls the DefaultHSBPanel. ++ * ++ * @param chooser The JColorChooser to remove this panel from. ++ */ ++ public void uninstallChooserPanel(JColorChooser chooser) ++ { ++ trackImage = null; ++ gradientImage = null; ++ gradientPanel = null; ++ slider = null; ++ ++ hSpinner = null; ++ sSpinner = null; ++ bSpinner = null; ++ ++ hRadio = null; ++ sRadio = null; ++ bRadio = null; ++ ++ removeAll(); ++ super.uninstallChooserPanel(chooser); ++ } ++ ++ /** ++ * This helper method creates the right side panel (the panel with the ++ * Spinners and TextFields). ++ * ++ * @return The right side panel. ++ */ ++ private Container buildRightPanel() ++ { ++ JPanel container = new JPanel(); ++ container.setLayout(new GridLayout(6, 2)); ++ ++ hRadio = new JRadioButton("H"); ++ sRadio = new JRadioButton("S"); ++ bRadio = new JRadioButton("B"); ++ ++ ButtonGroup group = new ButtonGroup(); ++ group.add(hRadio); ++ group.add(sRadio); ++ group.add(bRadio); ++ ++ hSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 359, 1)); ++ sSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 100, 1)); ++ bSpinner = new JSpinner(new SpinnerNumberModel(100, 0, 100, 1)); ++ ++ hSpinner.setEnabled(false); ++ sSpinner.setEnabled(false); ++ bSpinner.setEnabled(false); ++ ++ ChangeListener cl = new RadioStateListener(); ++ ChangeListener scroll = new ImageScrollListener(); ++ ++ hRadio.addChangeListener(cl); ++ sRadio.addChangeListener(cl); ++ bRadio.addChangeListener(cl); ++ ++ hSpinner.addChangeListener(scroll); ++ sSpinner.addChangeListener(scroll); ++ bSpinner.addChangeListener(scroll); ++ ++ hRadio.setSelected(true); ++ ++ container.add(hRadio); ++ container.add(hSpinner); ++ ++ container.add(sRadio); ++ container.add(sSpinner); ++ ++ container.add(bRadio); ++ container.add(bSpinner); ++ ++ rFull = new JLabel("red full"); ++ gFull = new JLabel("green full"); ++ bFull = new JLabel("blue full"); ++ ++ container.add(R); ++ container.add(rFull); ++ ++ container.add(G); ++ container.add(gFull); ++ ++ container.add(B); ++ container.add(bFull); ++ ++ return container; ++ } ++ ++ /** ++ * This method returns the small display icon. ++ * ++ * @return The small display icon. ++ */ ++ public Icon getSmallDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the large display icon. ++ * ++ * @return The large display icon. ++ */ ++ public Icon getLargeDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method paints the chooser panel. ++ * ++ * @param g The graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ super.paint(g); ++ } ++ ++ /** ++ * This method updates the gradient image with a new one taking the Hue ++ * value as the constant. ++ */ ++ private void updateHLockImage() ++ { ++ int index = 0; ++ int[] pix = new int[imgWidth * imgHeight]; ++ float hValue = ((Number) hSpinner.getValue()).intValue() / 360f; ++ ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < imgWidth; i++) ++ pix[index++] = Color.HSBtoRGB(hValue, (imgWidth - i * 1f) / imgWidth, ++ (imgHeight - j * 1f) / imgHeight) ++ | (255 << 24); ++ ++ gradientImage = createImage(new MemoryImageSource(imgWidth, imgHeight, ++ pix, 0, imgWidth)); ++ } ++ ++ /** ++ * This method updates the gradient image with a new one taking the ++ * Brightness value as the constant. ++ */ ++ private void updateBLockImage() ++ { ++ int[] pix = new int[imgWidth * imgHeight]; ++ float bValue = ((Number) bSpinner.getValue()).intValue() / 100f; ++ ++ int index = 0; ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < imgWidth; i++) ++ pix[index++] = Color.HSBtoRGB(i * 1f / imgWidth, ++ (imgHeight - j * 1f) / imgHeight, bValue) ++ | (255 << 24); ++ ++ gradientImage = createImage(new MemoryImageSource(imgWidth, imgHeight, ++ pix, 0, imgWidth)); ++ } ++ ++ /** ++ * This method updates the gradient image with a new one taking the ++ * Saturation value as the constant. ++ */ ++ private void updateSLockImage() ++ { ++ int[] pix = new int[imgWidth * imgHeight]; ++ float sValue = ((Number) sSpinner.getValue()).intValue() / 100f; ++ ++ int index = 0; ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < imgWidth; i++) ++ pix[index++] = Color.HSBtoRGB(i * 1f / imgWidth, sValue, ++ (imgHeight - j * 1f) / imgHeight) ++ | (255 << 24); ++ gradientImage = createImage(new MemoryImageSource(imgWidth, imgHeight, ++ pix, 0, imgWidth)); ++ } ++ ++ /** ++ * This method calls the appropriate method to update the gradient image ++ * depending on which HSB value is constant. ++ */ ++ private void updateImage() ++ { ++ switch (locked) ++ { ++ case HLOCKED: ++ updateHLockImage(); ++ break; ++ case SLOCKED: ++ updateSLockImage(); ++ break; ++ case BLOCKED: ++ updateBLockImage(); ++ break; ++ } ++ } ++ ++ /** ++ * This method updates the TextFields with the correct RGB values. ++ */ ++ private void updateTextFields() ++ { ++ int c = getColorSelectionModel().getSelectedColor().getRGB(); ++ ++ rFull.setText("" + (c >> 16 & 0xff)); ++ gFull.setText("" + (c >> 8 & 0xff)); ++ bFull.setText("" + (c & 0xff)); ++ ++ repaint(); ++ } ++ ++ /** ++ * This method updates the slider in response to making a different HSB ++ * property the constant. ++ */ ++ private void updateSlider() ++ { ++ if (slider == null) ++ return; ++ ++ slider.setMinimum(0); ++ if (locked == HLOCKED) ++ { ++ slider.setMaximum(359); ++ ; ++ slider.setValue(((Number) hSpinner.getValue()).intValue()); ++ slider.setInverted(true); ++ } ++ else ++ { ++ slider.setMaximum(100); ++ slider.setInverted(false); ++ if (sRadio.isSelected()) ++ slider.setValue(((Number) sSpinner.getValue()).intValue()); ++ else ++ slider.setValue(((Number) bSpinner.getValue()).intValue()); ++ } ++ repaint(); ++ } ++ ++ /** ++ * This method updates the track gradient image depending on which HSB ++ * property is constant. ++ */ ++ private void updateTrack() ++ { ++ switch (locked) ++ { ++ case HLOCKED: ++ updateHTrack(); ++ break; ++ case SLOCKED: ++ updateSTrack(); ++ break; ++ case BLOCKED: ++ updateBTrack(); ++ break; ++ } ++ } ++ ++ /** ++ * This method updates the track gradient image if the Hue value is allowed ++ * to change (according to the JRadioButtons). ++ */ ++ private void updateHTrack() ++ { ++ int trackIndex = 0; ++ int[] trackPix = new int[trackWidth * imgHeight]; ++ ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < trackWidth; i++) ++ trackPix[trackIndex++] = Color.HSBtoRGB(j * 1f / imgHeight, 1f, 1f) ++ | (255 << 24); ++ ++ trackImage = createImage(new MemoryImageSource(trackWidth, imgHeight, ++ trackPix, 0, trackWidth)); ++ } ++ ++ /** ++ * This method updates the track gradient image if the Saturation value is ++ * allowed to change (according to the JRadioButtons). ++ */ ++ private void updateSTrack() ++ { ++ int[] trackPix = new int[trackWidth * imgHeight]; ++ ++ float hValue = ((Number) hSpinner.getValue()).intValue() / 360f; ++ float bValue = ((Number) bSpinner.getValue()).intValue() / 100f; ++ ++ int trackIndex = 0; ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < trackWidth; i++) ++ trackPix[trackIndex++] = Color.HSBtoRGB(hValue, ++ (imgHeight - j * 1f) / imgHeight, ++ bValue) | (255 << 24); ++ ++ trackImage = createImage(new MemoryImageSource(trackWidth, imgHeight, ++ trackPix, 0, trackWidth)); ++ } ++ ++ /** ++ * This method updates the track gradient image if the Brightness value is ++ * allowed to change (according to the JRadioButtons). ++ */ ++ private void updateBTrack() ++ { ++ int[] trackPix = new int[trackWidth * imgHeight]; ++ ++ float hValue = ((Number) hSpinner.getValue()).intValue() / 360f; ++ float sValue = ((Number) sSpinner.getValue()).intValue() / 100f; ++ ++ int trackIndex = 0; ++ for (int j = 0; j < imgHeight; j++) ++ for (int i = 0; i < trackWidth; i++) ++ trackPix[trackIndex++] = Color.HSBtoRGB(hValue, sValue, ++ (imgHeight - j * 1f) / imgHeight) ++ | (255 << 24); ++ ++ trackImage = createImage(new MemoryImageSource(trackWidth, imgHeight, ++ trackPix, 0, trackWidth)); ++ } ++} +Index: javax/swing/colorchooser/DefaultPreviewPanel.java +=================================================================== +RCS file: javax/swing/colorchooser/DefaultPreviewPanel.java +diff -N javax/swing/colorchooser/DefaultPreviewPanel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/colorchooser/DefaultPreviewPanel.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,317 @@ ++/* DefaultPreviewPanel.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.colorchooser; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import javax.swing.JColorChooser; ++import javax.swing.JPanel; ++import javax.swing.SwingUtilities; ++import javax.swing.border.Border; ++ ++ ++/** ++ * This is the default preview panel for the JColorChooser. The default ++ * preview panel is responsible for displaying the currently selected color ++ * of the JColorChooser. ++ */ ++class DefaultPreviewPanel extends JPanel ++{ ++ /** ++ * This is the border around the preview panel. ++ */ ++ class PreviewBorder implements Border ++ { ++ /** This is the value of the top, bottom, top, and right inset. */ ++ private static final int edge = 20; ++ ++ /** ++ * This is the distance from the top left corner of the border to the ++ * text. ++ */ ++ private static final int lead = 5; ++ ++ /** This is the horizontal gap between the text and the border. */ ++ private static final int gap = 3; ++ ++ /** ++ * This method returns the border insets for the given Component. ++ * ++ * @param c The Component to retrieve insets for. ++ * ++ * @return The insets for the given Component. ++ */ ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(edge, edge, edge, edge); ++ } ++ ++ /** ++ * This method returns whether the border is responsible for painting its ++ * own background. ++ * ++ * @return Whether the border is responsible for painting its own ++ * background. ++ */ ++ public boolean isBorderOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * This method paints the border for the given component with the graphics ++ * object using the given properties. ++ * ++ * @param c The Component to paint the border for. ++ * @param g The Graphics object to paint with. ++ * @param x The x location to paint at. ++ * @param y The y location to paint at. ++ * @param width The width of the component. ++ * @param height The height of the component. ++ */ ++ public void paintBorder(Component c, Graphics g, int x, int y, int width, ++ int height) ++ { ++ Color saved = g.getColor(); ++ FontMetrics fm = g.getFontMetrics(); ++ ++ g.setColor(Color.BLACK); ++ g.drawLine(x + edge / 2, y + edge / 2, x + edge / 2, ++ y + height - edge / 2); ++ g.drawLine(x + edge / 2, y + height - edge / 2, x + width - edge / 2, ++ y + height - edge / 2); ++ g.drawLine(x + width - edge / 2, y + edge / 2, x + width - edge / 2, ++ y + height - edge / 2); ++ g.drawLine(x + edge / 2, y + edge / 2, x + edge / 2 + lead, y + edge / 2); ++ ++ int strwidth = fm.stringWidth("Preview"); ++ ++ g.drawString("Preview", x + edge / 2 + lead + gap, ++ y + edge / 2 + fm.getAscent() / 2); ++ ++ g.drawLine(x + lead + edge / 2 + strwidth + gap * 2, y + edge / 2, ++ x + width - edge / 2, y + edge / 2); ++ ++ g.setColor(saved); ++ } ++ } ++ ++ /** A standard large gap size. */ ++ private static int largeGap = 6; ++ ++ /** A standard small gap size. */ ++ private static int smallGap = 2; ++ ++ /** The size of each side of the square. */ ++ private static int squareSize = 36; ++ ++ /** This padding between the text and the edge of its box. */ ++ private static int textPadding = 4; ++ ++ /** The width of the right most rectangles. */ ++ private static int rightSideRectWidth = 60; ++ ++ /** The sample text. */ ++ private static String sample = "Sample Text Sample Text"; ++ ++ /** ++ * Creates a new DefaultPreviewPanel object. ++ */ ++ DefaultPreviewPanel() ++ { ++ super(); ++ setBorder(new PreviewBorder()); ++ } ++ ++ /** ++ * This method paints the default preview panel with the given Graphics ++ * object. ++ * ++ * @param g The Graphics object. ++ */ ++ public void paint(Graphics g) ++ { ++ super.paint(g); ++ Color currentColor = null; ++ JColorChooser chooser = (JColorChooser) SwingUtilities.getAncestorOfClass(JColorChooser.class, ++ this); ++ if (chooser != null) ++ currentColor = chooser.getColor(); ++ ++ Color saved = g.getColor(); ++ Insets insets = getInsets(); ++ ++ int down = insets.top + squareSize + largeGap; ++ int currX = insets.left; ++ ++ paintSquare(g, currX, insets.top, Color.WHITE, currentColor, Color.WHITE, ++ -1, -1, -1); ++ paintSquare(g, currX, down, currentColor, null, null, -1, -1, -1); ++ ++ currX += squareSize + largeGap; ++ ++ paintSquare(g, currX, insets.top, Color.BLACK, currentColor, Color.WHITE, ++ -1, -1, -1); ++ paintSquare(g, currX, down, Color.WHITE, currentColor, null, -1, -1, -1); ++ ++ currX += squareSize + largeGap; ++ ++ paintSquare(g, currX, insets.top, Color.WHITE, currentColor, Color.BLACK, ++ -1, -1, -1); ++ paintSquare(g, currX, down, Color.BLACK, currentColor, null, -1, -1, -1); ++ ++ FontMetrics fm = g.getFontMetrics(); ++ int strWidth = fm.stringWidth(sample); ++ int strHeight = fm.getHeight(); ++ ++ currX += squareSize + largeGap; ++ ++ int boxWidth = 2 * textPadding + strWidth; ++ int boxHeight = 2 * textPadding + strHeight; ++ ++ int first = insets.top + textPadding; ++ int second = insets.top + boxHeight + smallGap; ++ int third = insets.top + 2 * (boxHeight + smallGap); ++ ++ g.setColor(Color.WHITE); ++ g.fillRect(currX, third, boxWidth, boxHeight); ++ ++ g.setColor(currentColor); ++ g.drawString(sample, currX + textPadding, ++ first + textPadding + fm.getAscent()); ++ ++ g.fillRect(currX, second, boxWidth, boxHeight); ++ ++ g.drawString(sample, currX + textPadding, ++ third + textPadding + fm.getAscent()); ++ ++ g.setColor(Color.BLACK); ++ g.drawString(sample, currX + textPadding, ++ second + textPadding + fm.getAscent()); ++ ++ currX += boxWidth + largeGap; ++ ++ g.setColor(Color.WHITE); ++ g.fillRect(currX, insets.top, rightSideRectWidth, squareSize ++ + largeGap / 2); ++ ++ g.setColor(currentColor); ++ g.fillRect(currX, insets.top + squareSize + largeGap / 2, ++ rightSideRectWidth, squareSize + largeGap / 2); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method creates and paints a square. The square has two smaller ++ * squares inside of it. Each of the three squares has their sizes ++ * determined by the size arguments. If the size is not given (by passing ++ * in -1), then the size is determined automatically. ++ * ++ * @param g The Graphics object to paint with. ++ * @param x The x location to paint at. ++ * @param y The y location to paint at. ++ * @param first The color of the first square. ++ * @param second The color of the second square. ++ * @param third The color of the third square. ++ * @param firstSize The size of the first square. ++ * @param secondSize The size of the second square. ++ * @param thirdSize The size of the third square. ++ */ ++ private void paintSquare(Graphics g, int x, int y, Color first, ++ Color second, Color third, int firstSize, ++ int secondSize, int thirdSize) ++ { ++ Color saved = g.getColor(); ++ if (firstSize == -1) ++ firstSize = squareSize; ++ if (secondSize == -1) ++ secondSize = squareSize * 2 / 3; ++ if (thirdSize == -1) ++ thirdSize = squareSize / 3; ++ int secondOffset = (firstSize - secondSize) / 2; ++ int thirdOffset = (firstSize - thirdSize) / 2; ++ ++ if (first == null) ++ return; ++ g.setColor(first); ++ g.fillRect(x, y, firstSize, firstSize); ++ if (second == null) ++ return; ++ g.setColor(second); ++ g.fillRect(x + secondOffset, y + secondOffset, secondSize, secondSize); ++ if (third == null) ++ return; ++ g.setColor(third); ++ g.fillRect(x + thirdOffset, y + thirdOffset, thirdSize, thirdSize); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method returns the preferred size of the default preview panel. ++ * ++ * @return The preferred size of the default preview panel. ++ */ ++ public Dimension getPreferredSize() ++ { ++ Graphics g = getGraphics(); ++ FontMetrics fm = g.getFontMetrics(); ++ g.dispose(); ++ ++ int strWidth = fm.stringWidth(sample); ++ int strHeight = fm.getHeight(); ++ ++ int h1 = (strHeight + 2 * textPadding) * 3 + 2 * smallGap; ++ int h2 = 2 * squareSize + largeGap; ++ ++ int height = Math.max(h1, h2); ++ ++ int width = 3 * (squareSize + largeGap) + strWidth + 2 * textPadding ++ + largeGap + rightSideRectWidth; ++ ++ Insets insets = getInsets(); ++ ++ return new Dimension(width + insets.right + insets.left, ++ height + insets.top + insets.bottom); ++ } ++} +Index: javax/swing/colorchooser/DefaultRGBChooserPanel.java +=================================================================== +RCS file: javax/swing/colorchooser/DefaultRGBChooserPanel.java +diff -N javax/swing/colorchooser/DefaultRGBChooserPanel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/colorchooser/DefaultRGBChooserPanel.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,377 @@ ++/* DefaultRGHChooserPanel.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.colorchooser; ++ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.FlowLayout; ++import java.awt.Graphics; ++import java.awt.GridBagConstraints; ++import java.awt.GridBagLayout; ++import javax.swing.Icon; ++import javax.swing.JColorChooser; ++import javax.swing.JLabel; ++import javax.swing.JPanel; ++import javax.swing.JSlider; ++import javax.swing.JSpinner; ++import javax.swing.SpinnerNumberModel; ++import javax.swing.SwingConstants; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++ ++ ++/** ++ * This is the default RGB panel for the JColorChooser. The color is selected ++ * using three sliders that represent the RGB values. ++ */ ++public class DefaultRGBChooserPanel extends AbstractColorChooserPanel ++{ ++ /** ++ * This class handles the slider value changes for all three sliders. ++ */ ++ class SliderHandler implements ChangeListener ++ { ++ /** ++ * This method is called whenever any of the slider values change. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ if (internalChange) ++ return; ++ int color = R.getValue() << 16 | G.getValue() << 8 | B.getValue(); ++ ++ getColorSelectionModel().setSelectedColor(new Color(color)); ++ } ++ } ++ ++ /** ++ * This class handles the Spinner values changing. ++ */ ++ class SpinnerHandler implements ChangeListener ++ { ++ /** ++ * This method is called whenever any of the JSpinners change values. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ if (internalChange) ++ return; ++ int red = ((Number) RSpinner.getValue()).intValue(); ++ int green = ((Number) GSpinner.getValue()).intValue(); ++ int blue = ((Number) BSpinner.getValue()).intValue(); ++ ++ int color = red << 16 | green << 8 | blue; ++ ++ getColorSelectionModel().setSelectedColor(new Color(color)); ++ } ++ } ++ ++ /** ++ * Whether the color change was initiated from the slider or spinner rather ++ * than externally. ++ */ ++ private transient boolean internalChange = false; ++ ++ /** The ChangeListener for the sliders. */ ++ private transient ChangeListener colorChanger; ++ ++ /** The ChangeListener for the spinners. */ ++ private transient ChangeListener spinnerHandler; ++ ++ /** The slider that handles the red values. */ ++ private transient JSlider R; ++ ++ /** The slider that handles the green values. */ ++ private transient JSlider G; ++ ++ /** The slider that handles the blue values. */ ++ private transient JSlider B; ++ ++ /** The label for the red slider. */ ++ private transient JLabel RLabel; ++ ++ /** The label for the green slider. */ ++ private transient JLabel GLabel; ++ ++ /** The label for the blue slider. */ ++ private transient JLabel BLabel; ++ ++ /** The spinner that handles the red values. */ ++ private transient JSpinner RSpinner; ++ ++ /** The spinner that handles the green values. */ ++ private transient JSpinner GSpinner; ++ ++ /** The spinner that handles the blue values. */ ++ private transient JSpinner BSpinner; ++ ++ /** ++ * Creates a new DefaultRGBChooserPanel object. ++ */ ++ public DefaultRGBChooserPanel() ++ { ++ super(); ++ } ++ ++ /** ++ * This method returns the name displayed in the JTabbedPane. ++ * ++ * @return The name displayed in the JTabbedPane. ++ */ ++ public String getDisplayName() ++ { ++ return "RGB"; ++ } ++ ++ /** ++ * This method updates the chooser panel with the new color chosen in the ++ * JColorChooser. ++ */ ++ public void updateChooser() ++ { ++ Color c = getColorFromModel(); ++ int rgb = c.getRGB(); ++ ++ int red = rgb >> 16 & 0xff; ++ int green = rgb >> 8 & 0xff; ++ int blue = rgb & 0xff; ++ ++ internalChange = true; ++ ++ if (R != null) ++ R.setValue(red); ++ if (RSpinner != null) ++ RSpinner.setValue(new Integer(red)); ++ if (G != null) ++ G.setValue(green); ++ if (GSpinner != null) ++ GSpinner.setValue(new Integer(green)); ++ if (B != null) ++ B.setValue(blue); ++ if (BSpinner != null) ++ BSpinner.setValue(new Integer(blue)); ++ ++ internalChange = false; ++ ++ revalidate(); ++ repaint(); ++ } ++ ++ /** ++ * This method builds the chooser panel. ++ */ ++ protected void buildChooser() ++ { ++ setLayout(new GridBagLayout()); ++ ++ RLabel = new JLabel("Red"); ++ RLabel.setDisplayedMnemonic('d'); ++ GLabel = new JLabel("Green"); ++ GLabel.setDisplayedMnemonic('n'); ++ BLabel = new JLabel("Blue"); ++ BLabel.setDisplayedMnemonic('B'); ++ ++ R = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 255); ++ G = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 255); ++ B = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 255); ++ ++ R.setPaintTicks(true); ++ R.setSnapToTicks(false); ++ G.setPaintTicks(true); ++ G.setSnapToTicks(false); ++ B.setPaintTicks(true); ++ B.setSnapToTicks(false); ++ ++ R.setLabelTable(R.createStandardLabels(85)); ++ R.setPaintLabels(true); ++ G.setLabelTable(G.createStandardLabels(85)); ++ G.setPaintLabels(true); ++ B.setLabelTable(B.createStandardLabels(85)); ++ B.setPaintLabels(true); ++ ++ R.setMajorTickSpacing(85); ++ G.setMajorTickSpacing(85); ++ B.setMajorTickSpacing(85); ++ ++ R.setMinorTickSpacing(17); ++ G.setMinorTickSpacing(17); ++ B.setMinorTickSpacing(17); ++ ++ RSpinner = new JSpinner(new SpinnerNumberModel(R.getValue(), ++ R.getMinimum(), ++ R.getMaximum(), 1)); ++ GSpinner = new JSpinner(new SpinnerNumberModel(G.getValue(), ++ G.getMinimum(), ++ G.getMaximum(), 1)); ++ BSpinner = new JSpinner(new SpinnerNumberModel(B.getValue(), ++ B.getMinimum(), ++ B.getMaximum(), 1)); ++ ++ RLabel.setLabelFor(R); ++ GLabel.setLabelFor(G); ++ BLabel.setLabelFor(B); ++ ++ GridBagConstraints bag = new GridBagConstraints(); ++ bag.fill = GridBagConstraints.VERTICAL; ++ ++ bag.gridx = 0; ++ bag.gridy = 0; ++ add(RLabel, bag); ++ ++ bag.gridx = 1; ++ add(R, bag); ++ ++ bag.gridx = 2; ++ add(RSpinner, bag); ++ ++ bag.gridx = 0; ++ bag.gridy = 1; ++ add(GLabel, bag); ++ ++ bag.gridx = 1; ++ add(G, bag); ++ ++ bag.gridx = 2; ++ add(GSpinner, bag); ++ ++ bag.gridx = 0; ++ bag.gridy = 2; ++ add(BLabel, bag); ++ ++ bag.gridx = 1; ++ add(B, bag); ++ ++ bag.gridx = 2; ++ add(BSpinner, bag); ++ ++ installListeners(); ++ } ++ ++ /** ++ * This method uninstalls the chooser panel from the JColorChooser. ++ * ++ * @param chooser The JColorChooser to remove this chooser panel from. ++ */ ++ public void uninstallChooserPanel(JColorChooser chooser) ++ { ++ uninstallListeners(); ++ removeAll(); ++ ++ R = null; ++ G = null; ++ B = null; ++ ++ RSpinner = null; ++ GSpinner = null; ++ BSpinner = null; ++ ++ super.uninstallChooserPanel(chooser); ++ } ++ ++ /** ++ * This method uninstalls any listeners that were added by the chooser ++ * panel. ++ */ ++ private void uninstallListeners() ++ { ++ R.removeChangeListener(colorChanger); ++ G.removeChangeListener(colorChanger); ++ B.removeChangeListener(colorChanger); ++ ++ colorChanger = null; ++ ++ RSpinner.removeChangeListener(spinnerHandler); ++ GSpinner.removeChangeListener(spinnerHandler); ++ BSpinner.removeChangeListener(spinnerHandler); ++ ++ spinnerHandler = null; ++ } ++ ++ /** ++ * This method installs any listeners that the chooser panel needs to ++ * operate. ++ */ ++ private void installListeners() ++ { ++ colorChanger = new SliderHandler(); ++ ++ R.addChangeListener(colorChanger); ++ G.addChangeListener(colorChanger); ++ B.addChangeListener(colorChanger); ++ ++ spinnerHandler = new SpinnerHandler(); ++ ++ RSpinner.addChangeListener(spinnerHandler); ++ GSpinner.addChangeListener(spinnerHandler); ++ BSpinner.addChangeListener(spinnerHandler); ++ } ++ ++ /** ++ * This method returns the small display icon. ++ * ++ * @return The small display icon. ++ */ ++ public Icon getSmallDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the large display icon. ++ * ++ * @return The large display icon. ++ */ ++ public Icon getLargeDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method paints the default RGB chooser panel. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ super.paint(g); ++ } ++} +Index: javax/swing/colorchooser/DefaultSwatchChooserPanel.java +=================================================================== +RCS file: javax/swing/colorchooser/DefaultSwatchChooserPanel.java +diff -N javax/swing/colorchooser/DefaultSwatchChooserPanel.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/colorchooser/DefaultSwatchChooserPanel.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,891 @@ ++/* DefaultSwatchChooserPanel.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.colorchooser; ++ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import javax.swing.Icon; ++import javax.swing.JColorChooser; ++import javax.swing.JLabel; ++import javax.swing.JPanel; ++ ++ ++/** ++ * This class is the DefaultSwatchChooserPanel. This chooser panel displays a ++ * set of colors that can be picked. Recently picked items will go into a ++ * side panel so the user can see the history of the chosen colors. ++ */ ++class DefaultSwatchChooserPanel extends AbstractColorChooserPanel ++{ ++ /** The main panel that holds the set of choosable colors. */ ++ MainSwatchPanel mainPalette; ++ ++ /** A panel that holds the recent colors. */ ++ RecentSwatchPanel recentPalette; ++ ++ /** The mouse handlers for the panels. */ ++ MouseListener mouseHandler; ++ ++ /** ++ * This the base class for all swatch panels. Swatch panels are panels that ++ * hold a set of blocks where colors are displayed. ++ */ ++ abstract static class SwatchPanel extends JPanel ++ { ++ /** The width of each block. */ ++ protected int cellWidth = 10; ++ ++ /** The height of each block. */ ++ protected int cellHeight = 10; ++ ++ /** The gap between blocks. */ ++ protected int gap = 1; ++ ++ /** The number of rows in the swatch panel. */ ++ protected int numRows; ++ ++ /** The number of columns in the swatch panel. */ ++ protected int numCols; ++ ++ /** ++ * Creates a new SwatchPanel object. ++ */ ++ SwatchPanel() ++ { ++ super(); ++ setBackground(Color.WHITE); ++ } ++ ++ /** ++ * This method returns the preferred size of the swatch panel based on the ++ * number of rows and columns and the size of each cell. ++ * ++ * @return The preferred size of the swatch panel. ++ */ ++ public Dimension getPreferredSize() ++ { ++ int height = numRows * cellHeight + (numRows - 1) * gap; ++ int width = numCols * cellWidth + (numCols - 1) * gap; ++ Insets insets = getInsets(); ++ ++ return new Dimension(width + insets.left + insets.right, ++ height + insets.top + insets.bottom); ++ } ++ ++ /** ++ * This method returns the color for the given position. ++ * ++ * @param x The x coordinate of the position. ++ * @param y The y coordinate of the position. ++ * ++ * @return The color at the given position. ++ */ ++ public abstract Color getColorForPosition(int x, int y); ++ ++ /** ++ * This method initializes the colors for the swatch panel. ++ */ ++ protected abstract void initializeColors(); ++ } ++ ++ /** ++ * This is the main swatch panel. This panel sits in the middle and allows a ++ * set of colors to be picked which will move to the recent swatch panel. ++ */ ++ static class MainSwatchPanel extends SwatchPanel ++ { ++ /** The color describing (204, 255, 255) */ ++ public static final Color C204255255 = new Color(204, 204, 255); ++ ++ /** The color describing (255, 204, 204) */ ++ public static final Color C255204204 = new Color(255, 204, 204); ++ ++ /** The color describing (204, 255, 204) */ ++ public static final Color C204255204 = new Color(204, 255, 204); ++ ++ /** The color describing (204, 204, 204) */ ++ public static final Color C204204204 = new Color(204, 204, 204); ++ ++ /** The color (153, 153, 255). */ ++ public static final Color C153153255 = new Color(153, 153, 255); ++ ++ /** The color (51, 51, 255). */ ++ public static final Color C051051255 = new Color(51, 51, 255); ++ ++ /** The color (153, 0, 153). */ ++ public static final Color C153000153 = new Color(153, 0, 153); ++ ++ /** The color (0, 51, 51). */ ++ public static final Color C000051051 = new Color(0, 51, 51); ++ ++ /** The color (51, 0, 51). */ ++ public static final Color C051000051 = new Color(51, 0, 51); ++ ++ /** The color (51, 51, 0). */ ++ public static final Color C051051000 = new Color(51, 51, 0); ++ ++ /** The color (102, 102, 0). */ ++ public static final Color C102102000 = new Color(102, 102, 0); ++ ++ /** The color (153, 255, 153). */ ++ public static final Color C153255153 = new Color(153, 255, 153); ++ ++ /** The color (102, 255, 102). */ ++ public static final Color C102255102 = new Color(102, 255, 102); ++ ++ /** The color (0, 102, 102). */ ++ public static final Color C000102102 = new Color(0, 102, 102); ++ ++ /** The color (102, 0, 102). */ ++ public static final Color C102000102 = new Color(102, 0, 102); ++ ++ /** The color (0, 153, 153). */ ++ public static final Color C000153153 = new Color(0, 153, 153); ++ ++ /** The color (153, 153, 0). */ ++ public static final Color C153153000 = new Color(153, 153, 0); ++ ++ /** The color (204, 204, 0). */ ++ public static final Color C204204000 = new Color(204, 204, 0); ++ ++ /** The color (204, 0, 204). */ ++ public static final Color C204000204 = new Color(204, 0, 204); ++ ++ /** The color (0, 204, 204). */ ++ public static final Color C000204204 = new Color(0, 204, 204); ++ ++ /** The color (51, 255, 51). */ ++ public static final Color C051255051 = new Color(51, 255, 51); ++ ++ /** The color (255, 51, 51). */ ++ public static final Color C255051051 = new Color(255, 51, 51); ++ ++ /** The color (255, 102, 102). */ ++ public static final Color C255102102 = new Color(255, 102, 102); ++ ++ /** The color (102, 102, 255). */ ++ public static final Color C102102255 = new Color(102, 102, 255); ++ ++ /** The color (255, 153, 153). */ ++ public static final Color C255153153 = new Color(255, 153, 153); ++ static Color[] colors = ++ { ++ // Row 1 ++ Color.WHITE, new Color(204, 255, 255), C204255255, C204255255, C204255255, ++ C204255255, C204255255, C204255255, C204255255, ++ C204255255, C204255255, new Color(255, 204, 255), ++ C255204204, C255204204, C255204204, C255204204, ++ C255204204, C255204204, C255204204, C255204204, ++ C255204204, new Color(255, 255, 204), C204255204, ++ C204255204, C204255204, C204255204, C204255204, ++ C204255204, C204255204, C204255204, C204255204, ++ ++ // Row 2 ++ C204204204, new Color(153, 255, 255), new Color(153, 204, 255), C153153255, ++ C153153255, C153153255, C153153255, C153153255, ++ C153153255, C153153255, new Color(204, 153, 255), ++ new Color(255, 153, 255), ++ new Color(255, 153, 204), C255153153, C255153153, ++ C255153153, C255153153, C255153153, C255153153, ++ C255153153, new Color(255, 204, 153), ++ new Color(255, 255, 153), ++ new Color(204, 255, 153), C153255153, C153255153, ++ C153255153, C153255153, C153255153, C153255153, ++ C153255153, new Color(153, 255, 204), ++ ++ // Row 3 ++ C204204204, new Color(102, 255, 255), new Color(102, 204, 255), ++ new Color(102, 153, 255), C102102255, C102102255, ++ C102102255, C102102255, C102102255, ++ new Color(153, 102, 255), ++ new Color(204, 102, 255), ++ new Color(255, 102, 255), ++ new Color(255, 102, 204), ++ new Color(255, 102, 153), C255102102, C255102102, ++ C255102102, C255102102, C255102102, ++ new Color(255, 153, 102), ++ new Color(255, 204, 102), ++ new Color(255, 255, 102), ++ new Color(204, 255, 102), ++ new Color(153, 255, 102), C102255102, C102255102, ++ C102255102, C102255102, C102255102, ++ new Color(102, 255, 153), ++ new Color(102, 255, 204), ++ ++ // Row 4 ++ new Color(153, 153, 153), new Color(51, 255, 255), new Color(51, 204, 255), ++ new Color(51, 153, 255), new Color(51, 102, 255), ++ C051051255, C051051255, C051051255, ++ new Color(102, 51, 255), new Color(153, 51, 255), ++ new Color(204, 51, 255), new Color(255, 51, 255), ++ new Color(255, 51, 204), new Color(255, 51, 153), ++ new Color(255, 51, 102), C255051051, C255051051, ++ C255051051, new Color(255, 102, 51), ++ new Color(255, 153, 51), new Color(255, 204, 51), ++ new Color(255, 255, 51), new Color(204, 255, 51), ++ new Color(153, 255, 51), new Color(102, 255, 51), ++ C051255051, C051255051, C051255051, ++ new Color(51, 255, 102), new Color(51, 255, 153), ++ new Color(51, 255, 204), ++ ++ // Row 5 ++ new Color(153, 153, 153), new Color(0, 255, 255), new Color(0, 204, 255), ++ new Color(0, 153, 255), new Color(0, 102, 255), ++ new Color(0, 51, 255), new Color(0, 0, 255), ++ new Color(51, 0, 255), new Color(102, 0, 255), ++ new Color(153, 0, 255), new Color(204, 0, 255), ++ new Color(255, 0, 255), new Color(255, 0, 204), ++ new Color(255, 0, 153), new Color(255, 0, 102), ++ new Color(255, 0, 51), new Color(255, 0, 0), ++ new Color(255, 51, 0), new Color(255, 102, 0), ++ new Color(255, 153, 0), new Color(255, 204, 0), ++ new Color(255, 255, 0), new Color(204, 255, 0), ++ new Color(153, 255, 0), new Color(102, 255, 0), ++ new Color(51, 255, 0), new Color(0, 255, 0), ++ new Color(0, 255, 51), new Color(0, 255, 102), ++ new Color(0, 255, 153), new Color(0, 255, 204), ++ ++ // Row 6 ++ new Color(102, 102, 102), C000204204, C000204204, new Color(0, 153, 204), ++ new Color(0, 102, 204), new Color(0, 51, 204), ++ new Color(0, 0, 204), new Color(51, 0, 204), ++ new Color(102, 0, 204), new Color(153, 0, 204), ++ C204000204, C204000204, C204000204, ++ new Color(204, 0, 153), new Color(204, 0, 102), ++ new Color(204, 0, 51), new Color(204, 0, 0), ++ new Color(204, 51, 0), new Color(204, 102, 0), ++ new Color(204, 153, 0), C204204000, C204204000, ++ C204204000, new Color(153, 204, 0), ++ new Color(102, 204, 0), new Color(51, 204, 0), ++ new Color(0, 204, 0), new Color(0, 204, 51), ++ new Color(0, 204, 102), new Color(0, 204, 153), ++ new Color(0, 204, 204), ++ ++ // Row 7 ++ new Color(102, 102, 102), C000153153, C000153153, C000153153, ++ new Color(0, 102, 153), new Color(0, 51, 153), ++ new Color(0, 0, 153), new Color(51, 0, 153), ++ new Color(102, 0, 153), C153000153, C153000153, ++ C153000153, C153000153, C153000153, ++ new Color(153, 0, 102), new Color(153, 0, 51), ++ new Color(153, 0, 0), new Color(153, 51, 0), ++ new Color(153, 102, 0), C153153000, C153153000, ++ C153153000, C153153000, C153153000, ++ new Color(102, 153, 0), new Color(51, 153, 0), ++ new Color(0, 153, 0), new Color(0, 153, 51), ++ new Color(0, 153, 102), C000153153, C000153153, ++ ++ // Row 8 ++ new Color(51, 51, 51), C000102102, C000102102, C000102102, C000102102, ++ new Color(0, 51, 102), new Color(0, 0, 102), ++ new Color(51, 0, 102), C102000102, C102000102, ++ C102000102, C102000102, C102000102, C102000102, ++ C102000102, new Color(102, 0, 51), ++ new Color(102, 0, 0), new Color(102, 51, 0), ++ C102102000, C102102000, C102102000, C102102000, ++ C102102000, C102102000, C102102000, ++ new Color(51, 102, 0), new Color(0, 102, 0), ++ new Color(0, 102, 51), C000102102, C000102102, ++ C000102102, ++ ++ // Row 9. ++ Color.BLACK, C000051051, C000051051, C000051051, C000051051, C000051051, ++ new Color(0, 0, 51), C051000051, C051000051, ++ C051000051, C051000051, C051000051, C051000051, ++ C051000051, C051000051, C051000051, ++ new Color(51, 0, 0), C051051000, C051051000, ++ C051051000, C051051000, C051051000, C051051000, ++ C051051000, C051051000, new Color(0, 51, 0), ++ C000051051, C000051051, C000051051, C000051051, ++ new Color(51, 51, 51) ++ }; ++ ++ /** ++ * Creates a new MainSwatchPanel object. ++ */ ++ MainSwatchPanel() ++ { ++ super(); ++ numCols = 31; ++ numRows = 9; ++ initializeColors(); ++ revalidate(); ++ } ++ ++ /** ++ * This method returns the color for the given position. ++ * ++ * @param x The x location for the position. ++ * @param y The y location for the position. ++ * ++ * @return The color for the given position. ++ */ ++ public Color getColorForPosition(int x, int y) ++ { ++ if (x % (cellWidth + gap) > cellWidth ++ || y % (cellHeight + gap) > cellHeight) ++ // position is located in gap. ++ return null; ++ ++ int row = y / (cellHeight + gap); ++ int col = x / (cellWidth + gap); ++ return colors[row * numCols + col]; ++ } ++ ++ /** ++ * This method initializes the colors for the main swatch panel. ++ */ ++ protected void initializeColors() ++ { ++ // Unnecessary ++ } ++ ++ /** ++ * This method paints the main graphics panel with the given Graphics ++ * object. ++ * ++ * @param graphics The Graphics object to paint with. ++ */ ++ public void paint(Graphics graphics) ++ { ++ int index = 0; ++ Insets insets = getInsets(); ++ int currX = insets.left; ++ int currY = insets.top; ++ Color saved = graphics.getColor(); ++ ++ for (int i = 0; i < numRows; i++) ++ { ++ for (int j = 0; j < numCols; j++) ++ { ++ graphics.setColor(colors[index++]); ++ graphics.fill3DRect(currX, currY, cellWidth, cellHeight, true); ++ currX += gap + cellWidth; ++ } ++ currX = insets.left; ++ currY += gap + cellHeight; ++ } ++ graphics.setColor(saved); ++ } ++ ++ /** ++ * This method returns the tooltip text for the given MouseEvent. ++ * ++ * @param e The MouseEvent to find tooltip text for. ++ * ++ * @return The tooltip text. ++ */ ++ public String getToolTipText(MouseEvent e) ++ { ++ Color c = getColorForPosition(e.getX(), e.getY()); ++ if (c == null) ++ return null; ++ return (c.getRed() + "," + c.getGreen() + "," + c.getBlue()); ++ } ++ } ++ ++ /** ++ * This class is the recent swatch panel. It holds recently selected colors. ++ */ ++ public static class RecentSwatchPanel extends SwatchPanel ++ { ++ /** The array for storing recently stored colors. */ ++ Color[] colors; ++ ++ /** The default color. */ ++ public static final Color defaultColor = Color.GRAY; ++ ++ /** The index of the array that is the start. */ ++ int start = 0; ++ ++ /** ++ * Creates a new RecentSwatchPanel object. ++ */ ++ RecentSwatchPanel() ++ { ++ super(); ++ numCols = 5; ++ numRows = 7; ++ initializeColors(); ++ revalidate(); ++ } ++ ++ /** ++ * This method returns the color for the given position. ++ * ++ * @param x The x coordinate of the position. ++ * @param y The y coordinate of the position. ++ * ++ * @return The color for the given position. ++ */ ++ public Color getColorForPosition(int x, int y) ++ { ++ if (x % (cellWidth + gap) > cellWidth ++ || y % (cellHeight + gap) > cellHeight) ++ // position is located in gap. ++ return null; ++ ++ int row = y / (cellHeight + gap); ++ int col = x / (cellWidth + gap); ++ ++ return colors[getIndexForCell(row, col)]; ++ } ++ ++ /** ++ * This method initializes the colors for the recent swatch panel. ++ */ ++ protected void initializeColors() ++ { ++ colors = new Color[numRows * numCols]; ++ for (int i = 0; i < colors.length; i++) ++ colors[i] = defaultColor; ++ } ++ ++ /** ++ * This method returns the array index for the given row and column. ++ * ++ * @param row The row. ++ * @param col The column. ++ * ++ * @return The array index for the given row and column. ++ */ ++ private int getIndexForCell(int row, int col) ++ { ++ return ((row * numCols) + col + start) % (numRows * numCols); ++ } ++ ++ /** ++ * This method adds the given color to the beginning of the swatch panel. ++ * ++ * @param c The color to add. ++ */ ++ private void addColorToQueue(Color c) ++ { ++ if (--start == -1) ++ start = numRows * numCols - 1; ++ ++ colors[start] = c; ++ } ++ ++ /** ++ * This method paints the panel with the given Graphics object. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ Color saved = g.getColor(); ++ Insets insets = getInsets(); ++ int currX = insets.left; ++ int currY = insets.top; ++ ++ for (int i = 0; i < numRows; i++) ++ { ++ for (int j = 0; j < numCols; j++) ++ { ++ g.setColor(colors[getIndexForCell(i, j)]); ++ g.fill3DRect(currX, currY, cellWidth, cellHeight, true); ++ currX += cellWidth + gap; ++ } ++ currX = insets.left; ++ currY += cellWidth + gap; ++ } ++ } ++ ++ /** ++ * This method returns the tooltip text for the given MouseEvent. ++ * ++ * @param e The MouseEvent. ++ * ++ * @return The tooltip text. ++ */ ++ public String getToolTipText(MouseEvent e) ++ { ++ Color c = getColorForPosition(e.getX(), e.getY()); ++ if (c == null) ++ return null; ++ return c.getRed() + "," + c.getGreen() + "," + c.getBlue(); ++ } ++ } ++ ++ /** ++ * This class handles mouse events for the two swatch panels. ++ */ ++ class MouseHandler extends MouseAdapter ++ { ++ /** ++ * This method is called whenever the mouse is pressed. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ SwatchPanel panel = (SwatchPanel) e.getSource(); ++ Color c = panel.getColorForPosition(e.getX(), e.getY()); ++ recentPalette.addColorToQueue(c); ++ DefaultSwatchChooserPanel.this.getColorSelectionModel().setSelectedColor(c); ++ DefaultSwatchChooserPanel.this.repaint(); ++ } ++ } ++ ++ /** ++ * This is the layout manager for the main panel. ++ */ ++ static class MainPanelLayout implements LayoutManager ++ { ++ /** ++ * This method is called when a new component is added to the container. ++ * ++ * @param name The name of the component. ++ * @param comp The added component. ++ */ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ } ++ ++ /** ++ * This method is called to set the size and position of the child ++ * components for the given container. ++ * ++ * @param parent The container to lay out. ++ */ ++ public void layoutContainer(Container parent) ++ { ++ Component[] comps = parent.getComponents(); ++ Insets insets = parent.getInsets(); ++ Dimension[] pref = new Dimension[comps.length]; ++ ++ int xpos = 0; ++ int ypos = 0; ++ int maxHeight = 0; ++ int totalWidth = 0; ++ ++ for (int i = 0; i < comps.length; i++) ++ { ++ pref[i] = comps[i].getPreferredSize(); ++ if (pref[i] == null) ++ return; ++ maxHeight = Math.max(maxHeight, pref[i].height); ++ totalWidth += pref[i].width; ++ } ++ ++ ypos = (parent.getSize().height - maxHeight) / 2 + insets.top; ++ xpos = insets.left + (parent.getSize().width - totalWidth) / 2; ++ ++ for (int i = 0; i < comps.length; i++) ++ { ++ if (pref[i] == null) ++ continue; ++ comps[i].setBounds(xpos, ypos, pref[i].width, pref[i].height); ++ xpos += pref[i].width; ++ } ++ } ++ ++ /** ++ * This method is called when a component is removed from the container. ++ * ++ * @param comp The component that was removed. ++ */ ++ public void removeLayoutComponent(Component comp) ++ { ++ } ++ ++ /** ++ * This methods calculates the minimum layout size for the container. ++ * ++ * @param parent The container. ++ * ++ * @return The minimum layout size. ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return preferredLayoutSize(parent); ++ } ++ ++ /** ++ * This method returns the preferred layout size for the given container. ++ * ++ * @param parent The container. ++ * ++ * @return The preferred layout size. ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ int xmax = 0; ++ int ymax = 0; ++ ++ Component[] comps = parent.getComponents(); ++ Dimension pref; ++ ++ for (int i = 0; i < comps.length; i++) ++ { ++ pref = comps[i].getPreferredSize(); ++ if (pref == null) ++ continue; ++ xmax += pref.width; ++ ymax = Math.max(ymax, pref.height); ++ } ++ ++ Insets insets = parent.getInsets(); ++ ++ return new Dimension(insets.left + insets.right + xmax, ++ insets.top + insets.bottom + ymax); ++ } ++ } ++ ++ /** ++ * This is the layout manager for the recent swatch panel. ++ */ ++ static class RecentPanelLayout implements LayoutManager ++ { ++ /** ++ * This method is called when a component is added to the container. ++ * ++ * @param name The name of the component. ++ * @param comp The added component. ++ */ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ // Nothing needs to be done. ++ } ++ ++ /** ++ * This method sets the size and position of the child components of the ++ * given container. ++ * ++ * @param parent The container to lay out. ++ */ ++ public void layoutContainer(Container parent) ++ { ++ Component[] comps = parent.getComponents(); ++ Dimension parentSize = parent.getSize(); ++ Insets insets = parent.getInsets(); ++ int currY = insets.top; ++ Dimension pref; ++ ++ for (int i = 0; i < comps.length; i++) ++ { ++ pref = comps[i].getPreferredSize(); ++ if (pref == null) ++ continue; ++ comps[i].setBounds(insets.left, currY, pref.width, pref.height); ++ currY += pref.height; ++ } ++ } ++ ++ /** ++ * This method calculates the minimum layout size for the given container. ++ * ++ * @param parent The container. ++ * ++ * @return The minimum layout size. ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return preferredLayoutSize(parent); ++ } ++ ++ /** ++ * This method calculates the preferred layout size for the given ++ * container. ++ * ++ * @param parent The container. ++ * ++ * @return The preferred layout size. ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ int width = 0; ++ int height = 0; ++ Insets insets = parent.getInsets(); ++ Component[] comps = parent.getComponents(); ++ Dimension pref; ++ for (int i = 0; i < comps.length; i++) ++ { ++ pref = comps[i].getPreferredSize(); ++ if (pref != null) ++ { ++ width = Math.max(width, pref.width); ++ height += pref.height; ++ } ++ } ++ ++ return new Dimension(width + insets.left + insets.right, ++ height + insets.top + insets.bottom); ++ } ++ ++ /** ++ * This method is called whenever a component is removed from the ++ * container. ++ * ++ * @param comp The removed component. ++ */ ++ public void removeLayoutComponent(Component comp) ++ { ++ // Nothing needs to be done. ++ } ++ } ++ ++ /** ++ * Creates a new DefaultSwatchChooserPanel object. ++ */ ++ DefaultSwatchChooserPanel() ++ { ++ super(); ++ } ++ ++ /** ++ * This method updates the chooser panel with the new value from the ++ * JColorChooser. ++ */ ++ public void updateChooser() ++ { ++ } ++ ++ /** ++ * This method builds the chooser panel. ++ */ ++ protected void buildChooser() ++ { ++ // The structure of the swatch panel is: ++ // One large panel (minus the insets). ++ // Inside that panel, there are two panels, one holds the palette. ++ // The other holds the label and the recent colors palette. ++ // The two palettes are two custom swatch panels. ++ setLayout(new MainPanelLayout()); ++ ++ JPanel mainPaletteHolder = new JPanel(); ++ JPanel recentPaletteHolder = new JPanel(); ++ ++ mainPalette = new MainSwatchPanel(); ++ recentPalette = new RecentSwatchPanel(); ++ JLabel label = new JLabel("Recent:"); ++ ++ mouseHandler = new MouseHandler(); ++ mainPalette.addMouseListener(mouseHandler); ++ recentPalette.addMouseListener(mouseHandler); ++ ++ mainPaletteHolder.setLayout(new BorderLayout()); ++ mainPaletteHolder.add(mainPalette, BorderLayout.CENTER); ++ ++ recentPaletteHolder.setLayout(new RecentPanelLayout()); ++ recentPaletteHolder.add(label); ++ recentPaletteHolder.add(recentPalette); ++ ++ JPanel main = new JPanel(); ++ main.add(mainPaletteHolder); ++ main.add(recentPaletteHolder); ++ ++ this.add(main); ++ } ++ ++ /** ++ * This method removes the chooser panel from the JColorChooser. ++ * ++ * @param chooser The JColorChooser this panel is being removed from. ++ */ ++ public void uninstallChooserPanel(JColorChooser chooser) ++ { ++ recentPalette = null; ++ mainPalette = null; ++ ++ removeAll(); ++ super.uninstallChooserPanel(chooser); ++ } ++ ++ /** ++ * This method returns the JTabbedPane displayed name. ++ * ++ * @return The name displayed in the JTabbedPane. ++ */ ++ public String getDisplayName() ++ { ++ return "Swatches"; ++ } ++ ++ /** ++ * This method returns the small display icon. ++ * ++ * @return The small display icon. ++ */ ++ public Icon getSmallDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the large display icon. ++ * ++ * @return The large display icon. ++ */ ++ public Icon getLargeDisplayIcon() ++ { ++ return null; ++ } ++ ++ /** ++ * This method paints the chooser panel with the given Graphics object. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ super.paint(g); ++ } ++ ++ /** ++ * This method returns the tooltip text for the given MouseEvent. ++ * ++ * @param e The MouseEvent. ++ * ++ * @return The tooltip text. ++ */ ++ public String getToolTipText(MouseEvent e) ++ { ++ return null; ++ } ++} +Index: javax/swing/event/DocumentEvent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/event/DocumentEvent.java,v +retrieving revision 1.3 +diff -u -r1.3 DocumentEvent.java +--- javax/swing/event/DocumentEvent.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/event/DocumentEvent.java 6 Sep 2004 16:36:02 -0000 +@@ -87,68 +87,49 @@ + + } // ElementChange + +- /** +- * EventType +- */ +- class EventType { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * INSERT +- */ +- EventType INSERT = new EventType("INSERT"); // TODO +- +- /** +- * REMOVE +- */ +- EventType REMOVE = new EventType("REMOVE"); // TODO +- +- /** +- * CHANGE +- */ +- EventType CHANGE = new EventType("CHANGE"); // TODO +- +- /** +- * typeString +- */ +- private String type; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor EventType +- * @param type TODO +- */ +- private EventType(String type) { +- this.type = type; +- } // EventType() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * toString +- * @returns String +- */ +- public String toString() { +- return type; // TODO +- } // toString() +- +- +- } // EventType +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ /** ++ * EventType ++ */ ++ class EventType ++ { ++ /** ++ * INSERT ++ */ ++ public static final EventType INSERT = new EventType("INSERT"); // TODO ++ ++ /** ++ * REMOVE ++ */ ++ public static final EventType REMOVE = new EventType("REMOVE"); // TODO ++ ++ /** ++ * CHANGE ++ */ ++ public static final EventType CHANGE = new EventType("CHANGE"); // TODO ++ ++ /** ++ * typeString ++ */ ++ private String type; ++ ++ /** ++ * Constructor EventType ++ * @param type TODO ++ */ ++ private EventType(String type) ++ { ++ this.type = type; ++ } ++ ++ /** ++ * toString ++ * @returns String ++ */ ++ public String toString() ++ { ++ return type; ++ } ++ } + + /** + * getType +Index: javax/swing/event/SwingPropertyChangeSupport.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/event/SwingPropertyChangeSupport.java,v +retrieving revision 1.3 +diff -u -r1.3 SwingPropertyChangeSupport.java +--- javax/swing/event/SwingPropertyChangeSupport.java 10 Jan 2004 21:07:43 -0000 1.3 ++++ javax/swing/event/SwingPropertyChangeSupport.java 6 Sep 2004 16:36:02 -0000 +@@ -210,8 +210,9 @@ + PropertyChangeListener listener; + + // Check Values if they are equal +- if (event.getOldValue() == null || event.getNewValue() == null || +- event.getOldValue().equals(event.getNewValue()) == true) { ++ if (event.getOldValue() == null && event.getNewValue() == null || ++ (event.getOldValue() != null && event.getNewValue() != null && ++ event.getOldValue().equals(event.getNewValue()))) { + return; + } // if + +Index: javax/swing/event/UndoableEditListener.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/event/UndoableEditListener.java,v +retrieving revision 1.2 +diff -u -r1.2 UndoableEditListener.java +--- javax/swing/event/UndoableEditListener.java 12 Oct 2003 13:25:59 -0000 1.2 ++++ javax/swing/event/UndoableEditListener.java 6 Sep 2004 16:36:02 -0000 +@@ -1,5 +1,5 @@ + /* UndoableEditListener.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,21 +37,20 @@ + + package javax.swing.event; + +-// Imports + import java.util.EventListener; + ++ + /** + * UndoableEditListener public interface + * @author Andrew Selkirk + * @author Ronald Veldema + */ +-public interface UndoableEditListener extends EventListener { +- +- /** +- * Undoable edit has happened +- * @param event Undoable Edit Event +- */ +- void undoableEditHappened(UndoableEditEvent event); +- +- +-} // UndoableEditListener ++public interface UndoableEditListener extends EventListener ++{ ++ /** ++ * Undoable edit has happened ++ * ++ * @param event Undoable Edit Event ++ */ ++ void undoableEditHappened(UndoableEditEvent event); ++} +Index: javax/swing/filechooser/FileSystemView.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/filechooser/FileSystemView.java,v +retrieving revision 1.2 +diff -u -r1.2 FileSystemView.java +--- javax/swing/filechooser/FileSystemView.java 11 Jun 2003 13:20:40 -0000 1.2 ++++ javax/swing/filechooser/FileSystemView.java 6 Sep 2004 16:36:02 -0000 +@@ -1,5 +1,5 @@ + /* FileSystemView.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -40,7 +40,6 @@ + + import java.io.File; + import java.io.IOException; +-import javax.swing.Icon; + + /** + * FileSystemView +Index: javax/swing/plaf/BorderUIResource.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/BorderUIResource.java,v +retrieving revision 1.8 +diff -u -r1.8 BorderUIResource.java +--- javax/swing/plaf/BorderUIResource.java 1 Aug 2003 20:10:21 -0000 1.8 ++++ javax/swing/plaf/BorderUIResource.java 6 Sep 2004 16:36:02 -0000 +@@ -270,6 +270,8 @@ + extends BevelBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = -1275542891108351642L; ++ + /** + * Constructs a BevelBorderUIResource whose colors will be derived + * from the background of the enclosed component. The background +@@ -279,7 +281,7 @@ + * + *

    [An illustration showing raised and lowered BevelBorders] ++ * alt="[An illustration showing raised and lowered BevelBorders]" />

    + * + * @param bevelType the desired appearance of the border. The value + * must be either {@link javax.swing.border.BevelBorder#RAISED} +@@ -300,7 +302,7 @@ + * + *

    [An illustration showing BevelBorders that were
+-     * constructed with this method] ++ * constructed with this method]" />

    + * + * @param bevelType the desired appearance of the border. The value + * must be either {@link javax.swing.border.BevelBorder#RAISED} +@@ -340,7 +342,7 @@ + * + *

    [An illustration showing BevelBorders that
+-     * were constructed with this method] ++ * were constructed with this method]" />

    + * + * @param bevelType the desired appearance of the border. The value + * must be either {@link javax.swing.border.BevelBorder#RAISED} +@@ -399,6 +401,8 @@ + extends CompoundBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = 7550017084975167341L; ++ + /** + * Constructs a CompoundBorderUIResource with the specified inside + * and outside borders. +@@ -432,7 +436,7 @@ + * + *

    [An illustration of EmptyBorder] ++ * alt="[An illustration of EmptyBorder]" />

    + * + * @author Brian Jones (cbj@gnu.org) + * @author Sascha Brawer (brawer@dandelis.ch) +@@ -441,6 +445,8 @@ + extends EmptyBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = -4914187529340071708L; ++ + /** + * Constructs an empty border given the number of pixels required + * on each side. +@@ -487,7 +493,7 @@ + * + *

    [An illustration of the two EtchedBorder
+-   * variants] ++ * variants]" />

    + * + * @author Brian Jones (cbj@gnu.org) + * @author Sascha Brawer (brawer@dandelis.ch) +@@ -496,6 +502,8 @@ + extends EtchedBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = -8186391754165296656L; ++ + /** + * Constructs an EtchedBorderUIResource that appears lowered into + * the surface. The colors will be derived from the background +@@ -514,7 +522,7 @@ + * + *

    [An illustration of the two
+-     * EtchedBorder variants] ++ * EtchedBorder variants]" />

    + * + * @param etchType the desired appearance of the border. The value + * must be either {@link javax.swing.border.EtchedBorder#RAISED} +@@ -555,7 +563,7 @@ + * + *

    [An illustration that shows which pixels get
+-     * painted in what color] ++ * painted in what color]" />

    + * + * @param etchType the desired appearance of the border. The value + * must be either {@link javax.swing.border.EtchedBorder#RAISED} +@@ -588,7 +596,7 @@ + * such as the borders provided by this class. + * + *

    [An illustration of two LineBorders] />
++   * height=

    + * + * @author Brian Jones (cbj@gnu.org) + * @author Sascha Brawer (brawer@dandelis.ch) +@@ -597,6 +605,8 @@ + extends LineBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = -6171232338180172310L; ++ + /** + * Constructs a LineBorderUIResource given its color. The border + * will be one pixel thick and have plain corners. +@@ -643,7 +653,7 @@ + * such as the borders provided by this class. + * + *

    [An illustration of two MatteBorders] />
++   * height=

    + * + * @author Brian Jones (cbj@gnu.org) + * @author Sascha Brawer (brawer@dandelis.ch) +@@ -652,13 +662,15 @@ + extends MatteBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = -8107923147541851122L; ++ + /** + * Constructs a MatteBorderUIResource given the width on each side + * and a fill color. + * + *

    [A picture of a MatteBorder made by this
+-     * constructor] ++ * constructor]" />

    + * + * @param top the width of the border at its top edge. + * @param left the width of the border at its left edge. +@@ -680,7 +692,7 @@ + * + *

    [A picture of a MatteBorder made by this
+-     * constructor] ++ * constructor]" />

    + * + * @param top the width of the border at its top edge. + * @param left the width of the border at its left edge. +@@ -704,7 +716,7 @@ + * + *

    [A picture of a MatteBorder made by this
+-     * constructor] ++ * constructor]" />

    + * + * @param tileIcon an icon for tiling the border area. + */ +@@ -731,6 +743,8 @@ + extends TitledBorder + implements UIResource, Serializable + { ++ private static final long serialVersionUID = 7667113547406407427L; ++ + /** + * Constructs a TitledBorderUIResource given the text of its title. + * +Index: javax/swing/plaf/ComponentUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/ComponentUI.java,v +retrieving revision 1.5 +diff -u -r1.5 ComponentUI.java +--- javax/swing/plaf/ComponentUI.java 1 Aug 2003 20:10:21 -0000 1.5 ++++ javax/swing/plaf/ComponentUI.java 6 Sep 2004 16:36:02 -0000 +@@ -52,7 +52,7 @@ + * + *

    [UML diagram illustrating the architecture for pluggable
+- * look and feels] ++ * look and feels]" />

    + * + *

    Components such as {@link javax.swing.JSlider} do not directly + * implement operations related to the look and feel of the user +@@ -68,14 +68,14 @@ + * services. Soon before the end of its lifecycle, the + * ComponentUI will receive an {@link #uninstallUI} + * message, at which time the ComponentUI is expected to +- * undo any changes. ++ * undo any changes.

    + * + *

    Note that the ui of a JComponent + * changes whenever the user switches between look and feels. For + * example, the ui property of a JSlider + * could change from an instance of MetalSliderUI to an + * instance of FooSliderUI. This switch can happen at any +- * time, but it will always be performed from inside the Swing thread. ++ * time, but it will always be performed from inside the Swing thread.

    + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ +@@ -96,26 +96,24 @@ + * The delegate object then receives an installUI + * message. + * +- *

    This method should perform the following tasks: +- * +- *

    • Set visual properties such as borders, fonts, colors, or +- * icons. However, no change should be performed for those +- * properties whose values have been directly set by the client +- * application. To allow the distinction, LookAndFeels are expected +- * to use values that implement the {@link UIResource} marker +- * interface, such as {@link BorderUIResource} or {@link +- * ColorUIResource}.
    • ++ *

      This method should perform the following tasks:

      + * ++ *
        ++ *
      • Set visual properties such as borders, fonts, colors, or ++ * icons. However, no change should be performed for those ++ * properties whose values have been directly set by the client ++ * application. To allow the distinction, LookAndFeels are expected ++ * to use values that implement the {@link UIResource} marker ++ * interface, such as {@link BorderUIResource} or {@link ++ * ColorUIResource}.
      • + *
      • If necessary, install a {@link java.awt.LayoutManager}.
      • +- * + *
      • Embed custom sub-components. For instance, the UI delegate +- * for a {@link javax.swing.JSplitPane} might install a special +- * component for the divider.
      • +- * ++ * for a {@link javax.swing.JSplitPane} might install a special ++ * component for the divider. + *
      • Register event listeners.
      • +- * + *
      • Set up properties related to keyborad navigation, such as +- * mnemonics or focus traversal policies.
      ++ * mnemonics or focus traversal policies. ++ *
    + * + * @param c the component for which this delegate will provide + * services. +Index: javax/swing/plaf/basic/BasicArrowButton.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicArrowButton.java +diff -N javax/swing/plaf/basic/BasicArrowButton.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicArrowButton.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,384 @@ ++/* BasicArrowButton.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.Graphics; ++import java.awt.Polygon; ++import java.awt.Rectangle; ++import javax.swing.border.Border; ++import javax.swing.Icon; ++import javax.swing.JButton; ++import javax.swing.SwingConstants; ++ ++ ++/** ++ * This class draws simple arrow buttons for the Basic Look and Feel. ++ */ ++public class BasicArrowButton extends JButton implements SwingConstants ++{ ++ /** ++ * A private helper class that draws icons. ++ */ ++ private class arrowIcon implements Icon ++ { ++ /** The polygon that describes the icon. */ ++ private Polygon arrow; ++ ++ /** The size of the icon. */ ++ private int size = 10; ++ ++ /** ++ * Creates a new arrowIcon object using the given arrow polygon. ++ * ++ * @param arrow The polygon that describes the arrow. ++ */ ++ public arrowIcon(Polygon arrow) ++ { ++ this.arrow = arrow; ++ } ++ ++ /** ++ * Returns the height of the icon. ++ * ++ * @return The height of the icon. ++ */ ++ public int getIconHeight() ++ { ++ return size; ++ } ++ ++ /** ++ * Returns the width of the icon. ++ * ++ * @return The width of the icon. ++ */ ++ public int getIconWidth() ++ { ++ return size; ++ } ++ ++ /** ++ * Sets the size of the icon. ++ * ++ * @param size The size of the icon. ++ */ ++ public void setSize(int size) ++ { ++ this.size = size; ++ } ++ ++ /** ++ * Sets the arrow polygon. ++ * ++ * @param arrow The arrow polygon. ++ */ ++ public void setArrow(Polygon arrow) ++ { ++ this.arrow = arrow; ++ } ++ ++ /** ++ * Paints the icon. ++ * ++ * @param c The Component to paint for. ++ * @param g The Graphics object to draw with. ++ * @param x The X coordinate to draw at. ++ * @param y The Y coordinate to draw at. ++ */ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ Color arrowColor; ++ if (c.isEnabled()) ++ arrowColor = darkShadow; ++ else ++ arrowColor = shadow; ++ ++ paintIconImpl(g, x, y, arrowColor); ++ } ++ ++ /** ++ * This method does the actual painting work. ++ * ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate to paint at. ++ * @param y The y coordinate to paint at. ++ * @param arrowColor The color to paint the arrow with. ++ */ ++ public void paintIconImpl(Graphics g, int x, int y, Color arrowColor) ++ { ++ g.translate(x, y); ++ ++ Color saved = g.getColor(); ++ ++ g.setColor(arrowColor); ++ ++ g.fillPolygon(arrow); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ } ++ ++ /** The direction to point in. */ ++ protected int direction; ++ ++ /** The color the arrow is painted in if disabled and the bottom and ++ * right edges of the button. */ ++ private transient Color shadow = Color.gray; ++ ++ /** The color the arrow is painted in if enabled and the bottom and ++ * right edges of the button. */ ++ private transient Color darkShadow = Color.BLACK; ++ ++ /** The top and left edges of the button. */ ++ private transient Color highlight = Color.BLACK; ++ ++ /** The border around the ArrowButton. */ ++ private transient Border tmpBorder = new Border() ++ { ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(0, 0, 0, 0); ++ } ++ ++ public boolean isBorderOpaque() ++ { ++ return false; ++ } ++ ++ public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) ++ { ++ Rectangle bounds = getBounds(); ++ ++ Color saved = g.getColor(); ++ g.setColor(highlight); ++ ++ g.drawLine(bounds.x, bounds.y, bounds.x, bounds.y + bounds.height); ++ g.drawLine(bounds.x, bounds.y, bounds.x + bounds.width, bounds.y); ++ ++ g.setColor(shadow); ++ ++ g.drawLine(bounds.x + 1, bounds.y + bounds.height - 1, ++ bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); ++ g.drawLine(bounds.x + bounds.width - 1, bounds.y + 1, ++ bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); ++ ++ g.setColor(darkShadow); ++ ++ g.drawLine(bounds.x, bounds.y + bounds.height, bounds.x + bounds.width, ++ bounds.y + bounds.height); ++ g.drawLine(bounds.x + bounds.width, bounds.y, bounds.x + bounds.width, ++ bounds.y + bounds.height); ++ ++ g.setColor(saved); ++ } ++ }; ++ ++ /** ++ * Creates a new BasicArrowButton object. ++ * ++ * @param direction The direction the arrow points in. ++ */ ++ public BasicArrowButton(int direction) ++ { ++ super(); ++ setDirection(direction); ++ setBorder(tmpBorder); ++ } ++ ++ /** ++ * Creates a new BasicArrowButton object with the given colors and ++ * direction. ++ * ++ * @param direction The direction to point in. ++ * @param background The background color. ++ * @param shadow The shadow color. ++ * @param darkShadow The dark shadow color. ++ * @param highlight The highlight color. ++ */ ++ public BasicArrowButton(int direction, Color background, Color shadow, ++ Color darkShadow, Color highlight) ++ { ++ this(direction); ++ setBackground(background); ++ this.shadow = shadow; ++ this.darkShadow = darkShadow; ++ this.highlight = highlight; ++ } ++ ++ /** ++ * This method returns the direction of the arrow. ++ * ++ * @return The direction of the arrow. ++ */ ++ public int getDirection() ++ { ++ return direction; ++ } ++ ++ /** ++ * This method changes the direction of the arrow. ++ * ++ * @param dir The new direction of the arrow. ++ */ ++ public void setDirection(int dir) ++ { ++ Polygon arrow = getArrow(dir, 10); ++ if (getIcon() == null) ++ setIcon(new arrowIcon(arrow)); ++ else ++ ((arrowIcon) getIcon()).setArrow(arrow); ++ this.direction = dir; ++ } ++ ++ /** ++ * This method paints the arrow button. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ super.paint(g); ++ } ++ ++ /** ++ * This method returns the preferred size of the arrow button. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize() ++ { ++ return new Dimension(getIcon().getIconWidth(), getIcon().getIconHeight()); ++ } ++ ++ /** ++ * This method returns the minimum size of the arrow button. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize() ++ { ++ return getPreferredSize(); ++ } ++ ++ /** ++ * This method returns the maximum size of the arrow button. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize() ++ { ++ return getPreferredSize(); ++ } ++ ++ /** ++ * The method paints a triangle with the given size and direction at ++ * the given x and y coordinates. ++ * ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate to paint at. ++ * @param y The y coordinate to paint at. ++ * @param size The size of the icon. ++ * @param direction The direction of the icon. ++ * @param isEnabled Whether it is enabled. ++ */ ++ public void paintTriangle(Graphics g, int x, int y, int size, int direction, ++ boolean isEnabled) ++ { ++ Polygon arrow = getArrow(direction, size); ++ arrowIcon arrowI = new arrowIcon(arrow); ++ arrowI.setSize(size); ++ ++ Color arrowColor; ++ if (isEnabled()) ++ arrowColor = darkShadow; ++ else ++ arrowColor = shadow; ++ ++ arrowI.paintIconImpl(g, x, y, arrowColor); ++ } ++ ++ /** ++ * This is a private helper that creates polygons for a given size ++ * and direction. ++ * ++ * @param direction The direction of the arrow. ++ * @param size The size of the arrow. ++ * ++ * @return A new arrow polygon. ++ */ ++ private Polygon getArrow(int direction, int size) ++ { ++ Polygon arrow; ++ double dsize = (double) size; ++ ++ int one = (int) (dsize * 1 / 10); ++ int two = (int) (dsize * 2 / 10); ++ int five = (int) (dsize * 5 / 10); ++ int eight = (int) (dsize * 8 / 10); ++ ++ switch (direction) ++ { ++ case NORTH: ++ arrow = new Polygon(new int[] { eight, five, one }, ++ new int[] { eight, one, eight }, 3); ++ break; ++ case SOUTH: ++ arrow = new Polygon(new int[] { eight, five, two }, ++ new int[] { two, eight, two }, 3); ++ break; ++ case EAST: ++ case RIGHT: ++ arrow = new Polygon(new int[] { two, eight, two }, ++ new int[] { two, five, eight }, 3); ++ break; ++ case WEST: ++ case LEFT: ++ arrow = new Polygon(new int[] { eight, two, eight }, ++ new int[] { two, five, eight }, 3); ++ break; ++ default: ++ throw new IllegalArgumentException("Invalid direction given."); ++ } ++ return arrow; ++ } ++} +Index: javax/swing/plaf/basic/BasicButtonListener.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicButtonListener.java +diff -N javax/swing/plaf/basic/BasicButtonListener.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicButtonListener.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,222 @@ ++/* BasicButtonListener.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.event.ActionEvent; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.InputEvent; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import java.awt.event.MouseMotionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++ ++import javax.swing.AbstractAction; ++import javax.swing.AbstractButton; ++import javax.swing.ButtonModel; ++import javax.swing.JComponent; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++ ++public class BasicButtonListener ++ implements MouseListener, MouseMotionListener, FocusListener, ++ ChangeListener, PropertyChangeListener ++{ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ } ++ protected void checkOpacity(AbstractButton b) ++ { ++ } ++ public void focusGained(FocusEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ if (button.isFocusPainted()) ++ button.repaint(); ++ } ++ } ++ ++ public void focusLost(FocusEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ model.setArmed(false); ++ ++ if (button.isFocusPainted()) ++ button.repaint(); ++ } ++ } ++ public void installKeyboardActions(JComponent c) ++ { ++ c.getActionMap().put("pressed", ++ new AbstractAction() ++ { ++ public void actionPerformed(ActionEvent e) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ // It is important that these transitions happen in this order. ++ model.setArmed(true); ++ model.setPressed(true); ++ } ++ }); ++ ++ c.getActionMap().put("released", ++ new AbstractAction() ++ { ++ public void actionPerformed(ActionEvent e) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ // It is important that these transitions happen in this order. ++ model.setPressed(false); ++ model.setArmed(false); ++ } ++ }); ++ } ++ public void uninstallKeyboardActions(JComponent c) ++ { ++ c.getActionMap().put("pressed", null); ++ c.getActionMap().put("released", null); ++ } ++ public void stateChanged(ChangeEvent e) ++ { ++ } ++ public void mouseMoved(MouseEvent e) ++ { ++ } ++ public void mouseDragged(MouseEvent e) ++ { ++ } ++ public void mouseClicked(MouseEvent e) ++ { ++ } ++ ++ /** ++ * Accept a mouse press event and arm the button. ++ * ++ * @param e The mouse press event to accept ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0) ++ { ++ // It is important that these transitions happen in this order. ++ model.setArmed(true); ++ model.setPressed(true); ++ } ++ } ++ } ++ ++ ++ /** ++ * Accept a mouse release event and set the button's ++ * "pressed" property to true, if the model ++ * is armed. If the model is not armed, ignore the event. ++ * ++ * @param e The mouse release event to accept ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0) ++ { ++ // It is important that these transitions happen in this order. ++ model.setPressed(false); ++ model.setArmed(false); ++ } ++ } ++ } ++ ++ ++ /** ++ * Accept a mouse enter event and set the button's "rollover" property to ++ * true, if the button's "rolloverEnabled" property is ++ * true. If the button is currently armed and the mouse ++ * button is not held down, this enter event will also disarm the model. ++ * ++ * @param e The mouse enter event to accept ++ */ ++ public void mouseEntered(MouseEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ if (button.isRolloverEnabled()) ++ model.setRollover(true); ++ ++ if (model.isPressed() ++ && (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0) ++ model.setArmed(true); ++ else ++ model.setArmed(false); ++ } ++ } ++ ++ /** ++ * Accept a mouse exit event and set the button's model's "rollover" ++ * property to false, if it's "rolloverEnabled" property is ++ * true. Also disarm the button. ++ * ++ * @param e The mouse exit event to accept ++ */ ++ public void mouseExited(MouseEvent e) ++ { ++ if (e.getSource() instanceof AbstractButton) ++ { ++ AbstractButton button = (AbstractButton) e.getSource(); ++ ButtonModel model = button.getModel(); ++ if (button.isRolloverEnabled()) ++ model.setRollover(false); ++ model.setArmed(false); ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicButtonUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicButtonUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicButtonUI.java +--- javax/swing/plaf/basic/BasicButtonUI.java 10 Jan 2004 21:59:30 -0000 1.4 ++++ javax/swing/plaf/basic/BasicButtonUI.java 6 Sep 2004 16:36:02 -0000 +@@ -35,182 +35,379 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + ++import java.awt.BasicStroke; + import java.awt.Color; + import java.awt.Dimension; + import java.awt.Font; + import java.awt.FontMetrics; + import java.awt.Graphics; +-import java.awt.Insets; ++import java.awt.Graphics2D; + import java.awt.Rectangle; ++import java.awt.Stroke; ++ + import javax.swing.AbstractButton; ++import javax.swing.ButtonModel; ++import javax.swing.Icon; ++import javax.swing.InputMap; + import javax.swing.JComponent; + import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ButtonUI; + import javax.swing.plaf.ComponentUI; + + public class BasicButtonUI extends ButtonUI + { +- int gap = 3; +- // int y_text_space = 2, x_text_space + 5; +- +- Color textColor, disabledTextColor; +- Color pressedBackgroundColor; +- Color normalBackgroundColor; +- +- +- public static ComponentUI createUI(final JComponent c) +- { +- return new BasicButtonUI(); +- } +- +- +- public void installUI(final JComponent c) +- { +- super.installUI(c); +- +- textColor = new Color(0,0,0); +- disabledTextColor = new Color(130, 130, 130); +- pressedBackgroundColor = new Color(150,150,150); +- pressedBackgroundColor = new Color(150,150,150); +- normalBackgroundColor = new Color(192,192,192); +- } ++ /** ++ * A constant used to pad out elements in the button's layout and ++ * preferred size calculations. ++ */ ++ protected int defaultTextIconGap = 4; ++ ++ /** ++ * A constant added to the defaultTextIconGap to adjust the text ++ * within this particular button. ++ */ ++ protected int defaultTextShiftOffset = 0; ++ ++ private int textShiftOffset; ++ ++ private Color focusColor; ++ ++ /** ++ * Factory method to create an instance of BasicButtonUI for a given ++ * {@link JComponent}, which should be an {@link AbstractButton}. ++ * ++ * @param c The component to create a UI got ++ * ++ * @return A new UI capable of drawing the component ++ */ ++ public static ComponentUI createUI(final JComponent c) ++ { ++ return new BasicButtonUI(); ++ } ++ ++ public int getDefaultTextIconGap(AbstractButton b) ++ { ++ return defaultTextIconGap; ++ } ++ ++ protected void clearTextShiftOffset() ++ { ++ textShiftOffset = 0; ++ } ++ ++ protected int getTextShiftOffset() ++ { ++ return textShiftOffset; ++ } ++ ++ protected void setTextShiftOffset() ++ { ++ textShiftOffset = defaultTextShiftOffset; ++ } ++ ++ protected void installDefaults(AbstractButton b) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ focusColor = defaults.getColor("Button.focus"); ++ b.setForeground(defaults.getColor("Button.foreground")); ++ b.setBackground(defaults.getColor("Button.background")); ++ b.setMargin(defaults.getInsets("Button.margin")); ++ b.setBorder(defaults.getBorder("Button.border")); ++ b.setIconTextGap(defaults.getInt("Button.textIconGap")); ++ b.setInputMap(JComponent.WHEN_FOCUSED, ++ (InputMap) defaults.get("Button.focusInputMap")); ++ b.setOpaque(true); ++ } ++ ++ protected void uninstallDefaults(AbstractButton b) ++ { ++ b.setForeground(null); ++ b.setBackground(null); ++ b.setBorder(null); ++ b.setIconTextGap(defaultTextIconGap); ++ b.setMargin(null); ++ } ++ ++ protected BasicButtonListener listener; ++ ++ protected BasicButtonListener createButtonListener(AbstractButton b) ++ { ++ return new BasicButtonListener(); ++ } ++ ++ public void installListeners(AbstractButton b) ++ { ++ listener = createButtonListener(b); ++ b.addChangeListener(listener); ++ b.addPropertyChangeListener(listener); ++ b.addFocusListener(listener); ++ b.addMouseListener(listener); ++ b.addMouseMotionListener(listener); ++ } ++ ++ public void uninstallListeners(AbstractButton b) ++ { ++ b.removeChangeListener(listener); ++ b.removePropertyChangeListener(listener); ++ b.removeFocusListener(listener); ++ b.removeMouseListener(listener); ++ b.removeMouseMotionListener(listener); ++ } ++ ++ protected void installKeyboardActions(AbstractButton b) ++ { ++ listener.installKeyboardActions(b); ++ } ++ ++ protected void uninstallKeyboardActions(AbstractButton b) ++ { ++ listener.uninstallKeyboardActions(b); ++ } ++ ++ /** ++ * Install the BasicButtonUI as the UI for a particular component. ++ * This means registering all the UI's listeners with the component, ++ * and setting any properties of the button which are particular to ++ * this look and feel. ++ * ++ * @param c The component to install the UI into ++ */ ++ public void installUI(final JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof AbstractButton) ++ { ++ AbstractButton b = (AbstractButton) c; ++ installDefaults(b); ++ installListeners(b); ++ installKeyboardActions(b); ++ } ++ } ++ ++ /** ++ * Calculate the preferred size of this component, by delegating to ++ * {@link BasicGraphicsUtils.getPreferredButtonSize}. ++ * ++ * @param c The component to measure ++ * ++ * @return The preferred dimensions of the component ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ AbstractButton b = (AbstractButton)c; ++ Dimension d = ++ BasicGraphicsUtils.getPreferredButtonSize ++ (b, defaultTextIconGap + defaultTextShiftOffset); ++ return d; ++ } ++ ++ static private Icon currentIcon(AbstractButton b) ++ { ++ Icon i = b.getIcon(); ++ ButtonModel model = b.getModel(); ++ ++ if (model.isPressed() && b.getPressedIcon() != null) ++ i = b.getPressedIcon(); ++ ++ else if (model.isRollover()) ++ { ++ if (b.isSelected() && b.getRolloverSelectedIcon() != null) ++ i = b.getRolloverSelectedIcon(); ++ else if (b.getRolloverIcon() != null) ++ i = b.getRolloverIcon(); ++ } ++ ++ else if (b.isSelected()) ++ { ++ if (b.isEnabled() && b.getSelectedIcon() != null) ++ i = b.getSelectedIcon(); ++ else if (b.getDisabledSelectedIcon() != null) ++ i = b.getDisabledSelectedIcon(); ++ } ++ ++ else if (! b.isEnabled() && b.getDisabledIcon() != null) ++ i = b.getDisabledIcon(); ++ ++ return i; ++ } ++ ++ /** ++ * Paint the component, which is an {@link AbstractButton}, according to ++ * its current state. ++ * ++ * @param g The graphics context to paint with ++ * @param c The component to paint the state of ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ AbstractButton b = (AbstractButton) c; ++ ++ Rectangle tr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle vr = new Rectangle(); ++ Rectangle br = new Rectangle(); ++ ++ Font f = c.getFont(); ++ ++ g.setFont(f); ++ ++ SwingUtilities.calculateInnerArea(b, br); ++ SwingUtilities.calculateInsetArea(br, b.getMargin(), vr); ++ String text = SwingUtilities.layoutCompoundLabel(c, g.getFontMetrics(f), ++ b.getText(), ++ currentIcon(b), ++ b.getVerticalAlignment(), ++ b.getHorizontalAlignment(), ++ b.getVerticalTextPosition(), ++ b.getHorizontalTextPosition(), ++ vr, ir, tr, ++ b.getIconTextGap() ++ + defaultTextShiftOffset); + +- +- public Dimension getPreferredSize(JComponent c) +- { +- AbstractButton b = (AbstractButton)c; +- Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap); +- // System.out.println("^^^^^^^^^^^^^^^^^^^^^^ BASIC-PREF="+d + ",T="+b.text); +- return d; +- } +- +- +- public void paint(Graphics g, JComponent c) +- { +- AbstractButton b = (AbstractButton) c; +- +- Rectangle tr = new Rectangle(); +- Rectangle ir = new Rectangle(); +- Rectangle vr = new Rectangle(); +- +- Font f = c.getFont(); +- +- g.setFont(f); +- +- FontMetrics fm = g.getFontMetrics(f); +- +- Insets i = c.getInsets(); +- +- vr.x = i.left; +- vr.y = i.top; +- vr.width = b.getWidth() - (i.right + vr.x); +- vr.height = b.getHeight() - (i.bottom + vr.y); +- +- //System.out.println(" VIEW-RECT-BUTTON="+vr+", insets="+i+", FONTM="+fm); ++ if ((b.getModel().isArmed() && b.getModel().isPressed()) ++ || b.isSelected()) ++ paintButtonPressed(g, b); ++ else ++ paintButtonNormal(g, br, c); + +- String text = SwingUtilities.layoutCompoundLabel(c, +- fm, +- b.getText(), +- b.getIcon(), +- b.getVerticalAlignment(), +- b.getHorizontalAlignment(), +- b.getVerticalTextPosition(), +- b.getHorizontalTextPosition(), +- vr, +- ir, +- tr, +- gap); +- +- if (b.getModel().isPressed() || +- b.getModel().isSelected()) +- { +- //System.out.println("paint pressed"); +- paintButtonPressed(g, c); +- } +- else +- { +- //System.out.println("paint normal"); +- paintButtonNormal(g, c); +- } +- +- paintIcon(g, c, ir); +- paintText(g, c, tr, b.getText()); +- paintFocus(g, c, vr, tr, ir); +- } +- +- +- protected void paintFocus(Graphics g, +- JComponent c, +- Rectangle vr, +- Rectangle tr, +- Rectangle ir) +- { +- } +- +- protected void paintIcon(Graphics g, +- JComponent c, +- Rectangle iconRect) +- { +- AbstractButton b = (AbstractButton) c; +- if (b.getIcon() != null) +- { +- int x = iconRect.x; +- int y = iconRect.y; +- +- System.out.println("WE HAVE AN ICON: " + b.getIcon()); +- +- b.getIcon().paintIcon(c, g, x, y); +- } +- else +- { +- //System.out.println("NO ICON FOR BUTTON:" + b.text); +- } +- } +- +- protected void paintButtonPressed(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(pressedBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } ++ paintIcon(g, c, ir); ++ if (text != null) ++ paintText(g, b, tr, text); ++ paintFocus(g, b, vr, tr, ir); ++ } ++ ++ /** ++ * Paint any focus decoration this {@link JComponent} might have. The ++ * component, which in this case will be an {@link AbstractButton}, ++ * should only have focus decoration painted if it has the focus, and its ++ * "focusPainted" property is true. ++ * ++ * @param g Graphics context to paint with ++ * @param b Button to paint the focus of ++ * @param vr Visible rectangle, the area in which to paint ++ * @param tr Text rectangle, contained in visible rectangle ++ * @param ir Icon rectangle, contained in visible rectangle ++ * ++ * @see AbstractButton.isFocusPainted() ++ * @see JComponent.hasFocus() ++ */ ++ protected void paintFocus(Graphics g, AbstractButton b, Rectangle vr, ++ Rectangle tr, Rectangle ir) ++ { ++ if (b.hasFocus() && b.isFocusPainted()) ++ { ++ Color saved_color = g.getColor(); ++ g.setColor(focusColor); ++ Rectangle focusRect = ir.union(tr); ++ g.drawRect(focusRect.x, focusRect.y, ++ focusRect.width, focusRect.height); ++ g.setColor(saved_color); ++ } ++ } ++ ++ /** ++ * Paint the icon for this component. Depending on the state of the ++ * component and the availability of the button's various icon ++ * properties, this might mean painting one of several different icons. ++ * ++ * @param g Graphics context to paint with ++ * @param c Component to paint the icon of ++ * @param iconRect Rectangle in which the icon should be painted ++ */ ++ protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) ++ { ++ AbstractButton b = (AbstractButton) c; ++ Icon i = currentIcon(b); ++ ++ if (i != null) ++ i.paintIcon(c, g, iconRect.x, iconRect.y); ++ } ++ ++ /** ++ * Paints the background area of an {@link AbstractButton} in the pressed ++ * state. This means filling the supplied area with the {@link ++ * pressedBackgroundColor}. ++ * ++ * @param g The graphics context to paint with ++ * @param b The button to paint the state of ++ */ ++ protected void paintButtonPressed(Graphics g, AbstractButton b) ++ { ++ if (b.isContentAreaFilled()) ++ { ++ Rectangle area = new Rectangle(); ++ SwingUtilities.calculateInnerArea(b, area); ++ g.setColor(b.getBackground().darker()); ++ g.fillRect(area.x, area.y, area.width, area.height); ++ } ++ } + +- protected void paintButtonNormal(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(normalBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } ++ /** ++ * Paints the background area of an {@link AbstractButton} in the normal, ++ * non-pressed state. This means filling the supplied area with the ++ * {@link normalBackgroundColor}. ++ * ++ * @param g The graphics context to paint with ++ * @param area The area in which to paint ++ * @param b The component to paint the state of ++ */ ++ private void paintButtonNormal(Graphics g, Rectangle area, JComponent b) ++ { ++ if (((AbstractButton)b).isContentAreaFilled() && b.isOpaque()) ++ { ++ g.setColor(b.getBackground()); ++ g.fillRect(area.x, area.y, area.width, area.height); ++ } ++ } + +- protected void paintText(Graphics g, +- JComponent c, +- Rectangle textRect, +- String text) +- { +- Font f = c.getFont(); +- +- g.setFont(f); +- +- FontMetrics fm = g.getFontMetrics(f); +- +- g.setColor(c.isEnabled() ? textColor : disabledTextColor); +- +- BasicGraphicsUtils.drawString(g, +- text, +- 0, +- textRect.x, +- textRect.y + fm.getAscent()/2); +- } ++ /** ++ * Paints the "text" property of an {@link AbstractButton}, using the ++ * {@link textColor} color. ++ * ++ * @param g The graphics context to paint with ++ * @param c The component to paint the state of ++ * @param textRect The area in which to paint the text ++ * @param text The text to paint ++ */ ++ protected void paintText(Graphics g, JComponent c, Rectangle textRect, ++ String text) ++ { ++ paintText(g, (AbstractButton) c, textRect, text); ++ } ++ ++ /** ++ * Paints the "text" property of an {@link AbstractButton}, using the ++ * {@link textColor} color. ++ * ++ * @param g The graphics context to paint with ++ * @param b The button to paint the state of ++ * @param textRect The area in which to paint the text ++ * @param text The text to paint ++ * ++ * @since 1.4 ++ */ ++ protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, ++ String text) ++ { ++ Font f = b.getFont(); ++ g.setFont(f); ++ FontMetrics fm = g.getFontMetrics(f); ++ ++ if (b.isEnabled()) ++ { ++ g.setColor(b.getForeground()); ++ g.drawString(text, textRect.x, textRect.y + fm.getAscent()); ++ } ++ else ++ { ++ g.setColor(b.getBackground().brighter()); ++ g.drawString(text, textRect.x, textRect.y + fm.getAscent()); ++ g.setColor(b.getBackground().darker()); ++ g.drawString(text, textRect.x + 1, textRect.y + fm.getAscent() + 1); ++ } ++ } + } +- +- +- +- +Index: javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java +diff -N javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java 6 Sep 2004 16:36:02 -0000 +@@ -0,0 +1,103 @@ ++/* BasicCheckBoxMenuItemUI.java ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.event.MouseEvent; ++import javax.swing.JComponent; ++import javax.swing.JMenuItem; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++ ++ ++/** ++ * DOCUMENT ME! ++ */ ++public class BasicCheckBoxMenuItemUI extends BasicMenuItemUI ++{ ++ /** ++ * Factory method to create a BasicCheckBoxMenuItemUI for the given {@link ++ * JComponent}, which should be a JCheckBoxMenuItem ++ * ++ * @param c The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicCheckBoxMenuItemUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(final JComponent c) ++ { ++ return new BasicCheckBoxMenuItemUI(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return $returnType$ DOCUMENT ME! ++ */ ++ protected String getPropertyPrefix() ++ { ++ return null; ++ } ++ ++ /** ++ * This method installs the defaults that are defined in the Basic look and ++ * feel for this JRadioButtonMenuItem ++ */ ++ protected void installDefaults() ++ { ++ super.installDefaults(); ++ ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ checkIcon = defaults.getIcon("CheckBoxMenuItem.checkIcon"); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param item DOCUMENT ME! ++ * @param e DOCUMENT ME! ++ * @param path DOCUMENT ME! ++ * @param manager DOCUMENT ME! ++ */ ++ public void processMouseEvent(JMenuItem item, MouseEvent e, ++ MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ } ++} +Index: javax/swing/plaf/basic/BasicCheckBoxUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicCheckBoxUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicCheckBoxUI.java +--- javax/swing/plaf/basic/BasicCheckBoxUI.java 10 Jan 2004 21:59:30 -0000 1.4 ++++ javax/swing/plaf/basic/BasicCheckBoxUI.java 6 Sep 2004 16:36:02 -0000 +@@ -38,82 +38,28 @@ + + package javax.swing.plaf.basic; + +-import java.awt.Component; +-import java.awt.Dimension; +-import java.awt.Graphics; +-import java.awt.Rectangle; +-import javax.swing.AbstractButton; ++import javax.swing.Icon; + import javax.swing.JComponent; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + + public class BasicCheckBoxUI extends BasicRadioButtonUI + { +- public static ComponentUI createUI(final JComponent c) { +- return new BasicCheckBoxUI(); +- } +- +- +- public void installUI(final JComponent c) { +- super.installUI(c); +- } +- +- public Dimension getPreferredSize(JComponent c) +- { +- AbstractButton b = (AbstractButton)c; +- Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap); +- //System.out.println("^^^^^^^^^^^^^^^^^^^^^^ BASIC-PREF="+d + ",T="+b.text); +- return d; +- } +- +- protected void paintFocus(Graphics g, +- JComponent c, +- Rectangle vr, +- Rectangle tr, +- Rectangle ir) +- { +- } +- +- protected void paintIcon(Graphics g, +- JComponent c, +- Rectangle iconRect) +- { +- } +- +- protected void paintButtonPressed(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(pressedBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } +- +- protected void paintButtonNormal(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(normalBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } +- protected void paintText(Graphics g, +- JComponent c, +- Rectangle textRect, +- String text) +- { +- // AbstractButton b = (AbstractButton) c; +- +- // System.out.println("drawing string: " + text + ", at:" + textRect); +- +- g.setColor(textColor); +- BasicGraphicsUtils.drawString(g, +- text, +- 0, +- textRect.x, +- textRect.y); +- } ++ ++ public static ComponentUI createUI(final JComponent c) { ++ return new BasicCheckBoxUI(); ++ } ++ ++ public Icon getDefaultIcon() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ return defaults.getIcon("CheckBox.icon"); ++ } ++ ++ public void installUI(final JComponent c) { ++ super.installUI(c); ++ } + } + + +Index: javax/swing/plaf/basic/BasicColorChooserUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicColorChooserUI.java +diff -N javax/swing/plaf/basic/BasicColorChooserUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicColorChooserUI.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,338 @@ ++/* BasicColorChooserUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.BorderLayout; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Rectangle; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.JColorChooser; ++import javax.swing.JComponent; ++import javax.swing.JPanel; ++import javax.swing.JTabbedPane; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.colorchooser.AbstractColorChooserPanel; ++import javax.swing.colorchooser.ColorChooserComponentFactory; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.plaf.ColorChooserUI; ++import javax.swing.plaf.ComponentUI; ++ ++ ++/** ++ * This is the UI Class for the JColorChooser in the Basic Look and Feel. ++ */ ++public class BasicColorChooserUI extends ColorChooserUI ++{ ++ /** ++ * This helper class handles property changes from the JColorChooser. ++ */ ++ public class PropertyHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called when any of the properties of the JColorChooser ++ * change. ++ * ++ * @param e The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName() == JColorChooser.CHOOSER_PANELS_PROPERTY) ++ makeTabs(chooser.getChooserPanels()); ++ else if (e.getPropertyName() == JColorChooser.PREVIEW_PANEL_PROPERTY) ++ updatePreviewPanel(chooser.getPreviewPanel()); ++ else if (e.getPropertyName() == JColorChooser.SELECTION_MODEL_PROPERTY) ++ ((AbstractColorChooserPanel) pane.getSelectedComponent()) ++ .updateChooser(); ++ ++ chooser.repaint(); ++ } ++ } ++ ++ /** ++ * This is a helper class that listens to the Model of the JColorChooser for ++ * color change events so it can update the preview panel. ++ */ ++ private class PreviewListener implements ChangeListener ++ { ++ /** ++ * This method is called whenever the JColorChooser's color changes. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ if (pane != null) ++ { ++ AbstractColorChooserPanel panel = (AbstractColorChooserPanel) pane ++ .getSelectedComponent(); ++ if (panel != null) ++ panel.updateChooser(); ++ } ++ chooser.repaint(); ++ } ++ } ++ ++ /** ++ * This helper class listens to the JTabbedPane that is used for tab ++ * changes. ++ */ ++ private class TabPaneListener implements ChangeListener ++ { ++ /** ++ * This method is called whenever a different tab is selected in the ++ * JTabbedPane. ++ * ++ * @param e The ChangeEvent. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ // Need to do this because we don't update all the tabs when they're not ++ // visible, so they are not informed of new colors when they're hidden. ++ AbstractColorChooserPanel comp = (AbstractColorChooserPanel) pane ++ .getSelectedComponent(); ++ comp.updateChooser(); ++ } ++ } ++ ++ /** An array of default choosers to use in the JColorChooser. */ ++ protected AbstractColorChooserPanel[] defaultChoosers; ++ ++ /** The listener for the preview panel. */ ++ protected ChangeListener previewListener; ++ ++ /** The PropertyChangeListener for the JColorChooser. */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** The JColorChooser. */ ++ private JColorChooser chooser; ++ ++ /** The JTabbedPane that is used. */ ++ private JTabbedPane pane; ++ ++ /** The Container that holds the preview panel. */ ++ private Container prevContainer; ++ ++ /** ++ * Creates a new BasicColorChooserUI object. ++ */ ++ public BasicColorChooserUI() ++ { ++ super(); ++ } ++ ++ /** ++ * This method creates a new UI Component for the given JComponent. ++ * ++ * @param c The JComponent to create an UI for. ++ * ++ * @return A new BasicColorChooserUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicColorChooserUI(); ++ } ++ ++ /** ++ * This method creates the default chooser panels for the JColorChooser. ++ * ++ * @return The default chooser panels. ++ */ ++ protected AbstractColorChooserPanel[] createDefaultChoosers() ++ { ++ return ColorChooserComponentFactory.getDefaultChooserPanels(); ++ } ++ ++ /** ++ * This method installs the UI Component for the given JComponent. ++ * ++ * @param c The JComponent to install this UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ if (c instanceof JColorChooser) ++ { ++ chooser = (JColorChooser) c; ++ chooser.setLayout(new BorderLayout()); ++ ++ // Do this first, so we avoid doing work for property change events. ++ defaultChoosers = createDefaultChoosers(); ++ chooser.setChooserPanels(defaultChoosers); ++ pane = new JTabbedPane(); ++ ++ pane.addChangeListener(new ChangeListener() ++ { ++ public void stateChanged(ChangeEvent e) ++ { ++ pane.repaint(); ++ } ++ }); ++ ++ makeTabs(defaultChoosers); ++ ++ chooser.add(pane, BorderLayout.NORTH); ++ ++ installPreviewPanel(); ++ ++ installDefaults(); ++ installListeners(); ++ } ++ } ++ ++ /** ++ * This method adds tabs to the JTabbedPane for the chooserPanels defined in ++ * the JColorChooser. ++ * ++ * @param panels The Panels that need tabs to be made for them. ++ */ ++ private void makeTabs(AbstractColorChooserPanel[] panels) ++ { ++ pane.removeAll(); ++ for (int i = 0; i < panels.length; i++) ++ pane.addTab(panels[i].getDisplayName(), panels[i].getSmallDisplayIcon(), ++ panels[i]); ++ } ++ ++ /** ++ * This method uninstalls this UI for the given JComponent. ++ * ++ * @param c The JComponent that will have this UI removed. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(); ++ uninstallDefaults(); ++ ++ pane = null; ++ chooser = null; ++ } ++ ++ /** ++ * This method installs the preview panel for the JColorChooser. ++ */ ++ protected void installPreviewPanel() ++ { ++ updatePreviewPanel(ColorChooserComponentFactory.getPreviewPanel()); ++ } ++ ++ /** ++ * This is a helper method that swaps the existing preview panel with the ++ * given panel. ++ * ++ * @param preview The new preview panel. ++ */ ++ private void updatePreviewPanel(JComponent preview) ++ { ++ if (prevContainer == null) ++ { ++ prevContainer = new JPanel(); ++ prevContainer.setLayout(new BorderLayout()); ++ chooser.add(prevContainer, BorderLayout.CENTER); ++ } ++ prevContainer.removeAll(); ++ prevContainer.add(preview, BorderLayout.CENTER); ++ } ++ ++ /** ++ * This method installs the default properties given by the Basic Look and ++ * Feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ chooser.setFont(defaults.getFont("ColorChooser.font")); ++ chooser.setForeground(defaults.getColor("ColorChooser.foreground")); ++ chooser.setBackground(defaults.getColor("ColorChooser.background")); ++ } ++ ++ /** ++ * This method uninstalls the default properties given by the Basic Look and ++ * Feel. ++ */ ++ protected void uninstallDefaults() ++ { ++ chooser.setBackground(null); ++ chooser.setForeground(null); ++ chooser.setFont(null); ++ } ++ ++ /** ++ * This method installs any listeners required for this UI to function. ++ */ ++ protected void installListeners() ++ { ++ propertyChangeListener = createPropertyChangeListener(); ++ previewListener = new PreviewListener(); ++ ++ chooser.addPropertyChangeListener(propertyChangeListener); ++ chooser.getSelectionModel().addChangeListener(previewListener); ++ ++ pane.addChangeListener(new TabPaneListener()); ++ } ++ ++ /** ++ * This method creates the PropertyChangeListener used for listening to the ++ * JColorChooser. ++ * ++ * @return A PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyHandler(); ++ } ++ ++ /** ++ * This method uninstalls any listeners that were previously installed by ++ * the UI. ++ */ ++ protected void uninstallListeners() ++ { ++ chooser.removePropertyChangeListener(propertyChangeListener); ++ chooser.getSelectionModel().removeChangeListener(previewListener); ++ ++ previewListener = null; ++ propertyChangeListener = null; ++ } ++} +Index: javax/swing/plaf/basic/BasicComboBoxEditor.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicComboBoxEditor.java +diff -N javax/swing/plaf/basic/BasicComboBoxEditor.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicComboBoxEditor.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,170 @@ ++/* BasicComboBoxEditor.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Component; ++import java.awt.event.ActionListener; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import javax.swing.ComboBoxEditor; ++import javax.swing.JTextField; ++import javax.swing.border.EmptyBorder; ++import javax.swing.plaf.UIResource; ++ ++ ++/** ++ * This is a component that is responsible for displaying/editting selected ++ * item in comboBox. By default, the JTextField is returned as ++ * BasicComboBoxEditor. ++ * ++ * @author Olga Rodimina ++ */ ++public class BasicComboBoxEditor extends Object implements ComboBoxEditor, ++ FocusListener ++{ ++ protected JTextField editor; ++ ++ /** ++ * Creates a new BasicComboBoxEditor object. ++ */ ++ public BasicComboBoxEditor() ++ { ++ editor = new JTextField(); ++ editor.setBorder(new EmptyBorder(1, 1, 1, 1)); ++ } ++ ++ /** ++ * This method returns textfield that will be used by the combo box to ++ * display/edit currently selected item in the combo box. ++ * ++ * @return textfield that will be used by the combo box to display/edit ++ * currently selected item ++ */ ++ public Component getEditorComponent() ++ { ++ return editor; ++ } ++ ++ /** ++ * Sets item that should be editted when any editting operation is performed ++ * by the user. The value is always equal to the currently selected value ++ * in the combo box. Thus whenever a different value is selected from the ++ * combo box list then this method should be called to change editting ++ * item to the new selected item. ++ * ++ * @param selectedItem item that is currently selected in the combo box ++ */ ++ public void setItem(Object item) ++ { ++ editor.setText(item.toString()); ++ } ++ ++ /** ++ * This method returns item that is currently editable. ++ * ++ * @return item in the combo box that is currently editable ++ */ ++ public Object getItem() ++ { ++ return editor.getText(); ++ } ++ ++ public void selectAll() ++ { ++ editor.selectAll(); ++ } ++ ++ /** ++ * This method is called when textfield gains focus. This will enable ++ * editing of the selected item. ++ * ++ * @param e the FocusEvent describing change in focus. ++ */ ++ public void focusGained(FocusEvent e) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method is called when textfield loses focus. If during this time any ++ * editting operation was performed by the user, then it will be cancelled ++ * and selected item will not be changed. ++ * ++ * @param e the FocusEvent describing change in focus ++ */ ++ public void focusLost(FocusEvent e) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method adds actionListener to the editor. If the user will edit ++ * currently selected item in the textfield and pressEnter, then action ++ * will be performed. The actionPerformed of this ActionListener should ++ * change the selected item of the comboBox to the newly editted selected ++ * item. ++ * ++ * @param l the ActionListener responsible for changing selected item of the ++ * combo box when it is editted by the user. ++ */ ++ public void addActionListener(ActionListener l) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method removes actionListener from the textfield. ++ * ++ * @param l the ActionListener to remove from the textfield. ++ */ ++ public void removeActionListener(ActionListener l) ++ { ++ // FIXME: Need to implement ++ } ++ ++ public static class UIResource extends BasicComboBoxEditor ++ implements javax.swing.plaf.UIResource ++ { ++ /** ++ * Creates a new UIResource object. ++ */ ++ public UIResource() ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicComboBoxRenderer.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicComboBoxRenderer.java +diff -N javax/swing/plaf/basic/BasicComboBoxRenderer.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicComboBoxRenderer.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,143 @@ ++/* BasicComboBoxRenderer.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.io.Serializable; ++import javax.swing.JLabel; ++import javax.swing.JList; ++import javax.swing.ListCellRenderer; ++import javax.swing.SwingConstants; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.border.Border; ++import javax.swing.border.EmptyBorder; ++import javax.swing.plaf.UIResource; ++ ++ ++/** ++ * This class is renderer for the combo box. ++ * ++ * @author Olga Rodimina ++ */ ++public class BasicComboBoxRenderer extends JLabel implements ListCellRenderer, ++ Serializable ++{ ++ /** ++ * This border is used whenever renderer doesn't have a focus. ++ */ ++ protected static Border noFocusBorder = new EmptyBorder(0, 0, 0, 0); ++ ++ /** ++ * Creates a new BasicComboBoxRenderer object. ++ */ ++ public BasicComboBoxRenderer() ++ { ++ setHorizontalAlignment(SwingConstants.LEFT); ++ } ++ ++ /** ++ * Returns preferredSize of the renderer ++ * ++ * @return preferredSize of the renderer ++ */ ++ public Dimension getPreferredSize() ++ { ++ return super.getPreferredSize(); ++ } ++ ++ /** ++ * getListCellRendererComponent ++ * ++ * @param list List of items for which to the background and foreground ++ * colors ++ * @param value object that should be rendered in the cell ++ * @param index index of the cell in the list of items. ++ * @param isSelected draw cell highlighted if isSelected is true ++ * @param cellHasFocus draw focus rectangle around cell if the cell has ++ * focus ++ * ++ * @return Component that will be used to draw the desired cell. ++ */ ++ public Component getListCellRendererComponent(JList list, Object value, ++ int index, boolean isSelected, ++ boolean cellHasFocus) ++ { ++ String s = value.toString(); ++ setText(s); ++ setOpaque(true); ++ ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ if (isSelected) ++ { ++ setBackground(list.getSelectionBackground()); ++ setForeground(list.getSelectionForeground()); ++ } ++ else ++ { ++ setBackground(list.getBackground()); ++ setForeground(list.getForeground()); ++ } ++ ++ setEnabled(list.isEnabled()); ++ setFont(list.getFont()); ++ ++ // Use focusCellHighlightBorder when renderer has focus and ++ // noFocusBorder otherwise ++ if (cellHasFocus) ++ setBorder(UIManager.getBorder("List.focusCellHighlightBorder")); ++ else ++ setBorder(noFocusBorder); ++ ++ return this; ++ } ++ ++ public static class UIResource extends BasicComboBoxRenderer ++ implements javax.swing.plaf.UIResource ++ { ++ /** ++ * Creates a new UIResource object. ++ */ ++ public UIResource() ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicComboBoxUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicComboBoxUI.java +diff -N javax/swing/plaf/basic/BasicComboBoxUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicComboBoxUI.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,1227 @@ ++/* BasicComboBoxUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Rectangle; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.ItemEvent; ++import java.awt.event.ItemListener; ++import java.awt.event.KeyAdapter; ++import java.awt.event.KeyEvent; ++import java.awt.event.KeyListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import java.awt.event.MouseMotionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.util.EventListener; ++import javax.accessibility.Accessible; ++import javax.swing.CellRendererPane; ++import javax.swing.ComboBoxEditor; ++import javax.swing.ComboBoxModel; ++import javax.swing.JButton; ++import javax.swing.JComboBox; ++import javax.swing.JComponent; ++import javax.swing.JLabel; ++import javax.swing.JList; ++import javax.swing.ListCellRenderer; ++import javax.swing.SwingConstants; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ListDataEvent; ++import javax.swing.event.ListDataListener; ++import javax.swing.event.PopupMenuEvent; ++import javax.swing.event.PopupMenuListener; ++import javax.swing.plaf.ComboBoxUI; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.basic.BasicComboPopup; ++import javax.swing.plaf.basic.BasicGraphicsUtils; ++ ++ ++/** ++ * UI Delegate for JComboBox ++ * ++ * @author Olga Rodimina ++ */ ++public class BasicComboBoxUI extends ComboBoxUI ++{ ++ /** ++ * This arrow button that is displayed in the rigth side of JComboBox. This ++ * button is used to hide and show combo box's list of items ++ */ ++ protected JButton arrowButton; ++ ++ /** ++ * The combo box for which this UI delegate is for ++ */ ++ protected JComboBox comboBox; ++ ++ /** ++ * Component that is responsible for displaying/editting selected item of ++ * the combo box. By default JTextField is used as an editor for the ++ * JComboBox ++ */ ++ protected Component editor; ++ ++ /** ++ * Listener listening to focus events occuring in the JComboBox ++ */ ++ protected FocusListener focusListener; ++ ++ /** ++ * tells whether JComboBox currently has focus ++ */ ++ protected boolean hasFocus; ++ ++ /** ++ * Listener listening to item events fired by the JComboBox ++ */ ++ protected ItemListener itemListener; ++ ++ /** ++ * KeyListener listening to key events that occur while JComboBox has focus ++ */ ++ protected KeyListener keyListener; ++ ++ /** ++ * MouseListener listening to mouse events occuring in the combo box ++ */ ++ private MouseListener mouseListener; ++ ++ /** ++ * List used when rendering selected item of the combo box. The selection ++ * and foreground colors for combo box renderer are configured from this ++ * list ++ */ ++ protected JList listBox; ++ ++ /** ++ * ListDataListener listening to JComboBox model ++ */ ++ protected ListDataListener listDataListener; ++ ++ /** ++ * Popup list containing combo box's menu items ++ */ ++ protected ComboPopup popup; ++ protected KeyListener popupKeyListener; ++ protected MouseListener popupMouseListener; ++ protected MouseMotionListener popupMouseMotionListener; ++ ++ /** ++ * Listener listening to changes in the bound properties of JComboBox ++ */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** ++ * Colors that are used to render selected item in the combo box. ++ */ ++ private Color shadow; ++ private Color darkShadow; ++ private Color highlight; ++ private Color lightHighlight; ++ ++ /* Size of the largest item in the comboBox */ ++ private Dimension largestItemSize; ++ ++ // It seems that JComboBox doesn't have a border set explicitely. So we just ++ // paint the border everytime combo box is displayed. ++ ++ /* border insets for this JComboBox*/ ++ private static final Insets borderInsets = new Insets(2, 2, 2, 2); ++ ++ // Width of the arrow button ++ private static int arrowButtonWidth = 15; ++ ++ // FIXME: This fields aren't used anywhere at this moment. ++ protected Dimension cachedMinimumSize; ++ protected CellRendererPane currentValuePane; ++ protected boolean isMinimumSizeDirty; ++ ++ /** ++ * Creates a new BasicComboBoxUI object. ++ */ ++ public BasicComboBoxUI() ++ { ++ } ++ ++ /** ++ * Factory method to create a BasicComboBoxUI for the given {@link ++ * JComponent}, which should be a {@link JComboBox}. ++ * ++ * @param c The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicComboBoxUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicComboBoxUI(); ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install a UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ ++ if (c instanceof JComboBox) ++ { ++ comboBox = (JComboBox) c; ++ comboBox.setOpaque(true); ++ comboBox.setLayout(createLayoutManager()); ++ installDefaults(); ++ installComponents(); ++ installListeners(); ++ installKeyboardActions(); ++ } ++ } ++ ++ /** ++ * This method uninstalls the UI. ++ * ++ * @param c The JComponent that is having this UI removed. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallComponents(); ++ uninstallDefaults(); ++ comboBox = null; ++ } ++ ++ /** ++ * This method installs the defaults that are defined in the Basic look and ++ * feel for this {@link JComboBox}. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ comboBox.setBackground(defaults.getColor("ComboBox.background")); ++ comboBox.setFont(defaults.getFont("ComboBox.font")); ++ comboBox.setForeground(defaults.getColor("ComboBox.foreground")); ++ ++ // Set default color that should be used to to render selected item ++ // of the combo box. ++ shadow = defaults.getColor("Button.shadow"); ++ darkShadow = defaults.getColor("Button.darkShadow"); ++ lightHighlight = defaults.getColor("Button.light"); ++ highlight = defaults.getColor("Button.highlight"); ++ } ++ ++ /** ++ * This method creates and installs the listeners for this UI. ++ */ ++ protected void installListeners() ++ { ++ // install combo box's listeners ++ propertyChangeListener = createPropertyChangeListener(); ++ comboBox.addPropertyChangeListener(propertyChangeListener); ++ ++ focusListener = createFocusListener(); ++ comboBox.addFocusListener(focusListener); ++ ++ itemListener = createItemListener(); ++ comboBox.addItemListener(itemListener); ++ ++ keyListener = createKeyListener(); ++ comboBox.addKeyListener(keyListener); ++ ++ mouseListener = createMouseListener(); ++ comboBox.addMouseListener(mouseListener); ++ ++ // install listeners that listen to combo box model ++ listDataListener = createListDataListener(); ++ comboBox.getModel().addListDataListener(listDataListener); ++ ++ configureArrowButton(); ++ } ++ ++ /** ++ * This method uninstalls the defaults and sets any objects created during ++ * install to null ++ */ ++ protected void uninstallDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ comboBox.setBackground(null); ++ comboBox.setFont(null); ++ comboBox.setForeground(null); ++ ++ shadow = null; ++ darkShadow = null; ++ lightHighlight = null; ++ highlight = null; ++ } ++ ++ /** ++ * Detaches all the listeners we attached in {@link #installListeners}. ++ */ ++ protected void uninstallListeners() ++ { ++ comboBox.removePropertyChangeListener(propertyChangeListener); ++ propertyChangeListener = null; ++ ++ comboBox.removeFocusListener(focusListener); ++ focusListener = null; ++ ++ comboBox.removeItemListener(itemListener); ++ itemListener = null; ++ ++ comboBox.removeKeyListener(keyListener); ++ keyListener = null; ++ ++ comboBox.removeMouseListener(mouseListener); ++ mouseListener = null; ++ ++ comboBox.getModel().removeListDataListener(listDataListener); ++ listDataListener = null; ++ ++ unconfigureArrowButton(); ++ } ++ ++ /** ++ * This method creates popup that will contain list of combo box's items ++ * ++ * @return popup containing list of combo box's items ++ */ ++ protected ComboPopup createPopup() ++ { ++ return new BasicComboPopup(comboBox); ++ } ++ ++ /** ++ * Creates KeyListener to listen to key events. ++ * ++ * @return KeyListener that listens to key events. ++ */ ++ protected KeyListener createKeyListener() ++ { ++ return new KeyHandler(); ++ } ++ ++ /** ++ * This method create MouseListener that will listen to mouse event occuring ++ * in combo box. ++ * ++ * @return the MouseListener ++ */ ++ private MouseListener createMouseListener() ++ { ++ return new MouseHandler(); ++ } ++ ++ /** ++ * This method create FocusListener that will listen to changes in this ++ * JComboBox's focus. ++ * ++ * @return theFocusListener ++ */ ++ protected FocusListener createFocusListener() ++ { ++ return new FocusHandler(); ++ } ++ ++ /** ++ * This method create ListDataListener to listen to ComboBox's data model ++ * ++ * @return ListDataListener ++ */ ++ protected ListDataListener createListDataListener() ++ { ++ return new ListDataHandler(); ++ } ++ ++ /** ++ * This method creates ItemListener that will listen to to the changes in ++ * the JComboBox's selection. ++ * ++ * @return the ItemListener ++ */ ++ protected ItemListener createItemListener() ++ { ++ return new ItemHandler(); ++ } ++ ++ /** ++ * This method creates PropertyChangeListener to listen to the changes in ++ * the JComboBox's bound properties. ++ * ++ * @return the PropertyChangeListener ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method returns layout manager for the combo box. ++ * ++ * @return layout manager for the combo box ++ */ ++ protected LayoutManager createLayoutManager() ++ { ++ return new ComboBoxLayoutManager(); ++ } ++ ++ /** ++ * This method creates component that will be responsible for rendering the ++ * selected component in the combo box. ++ * ++ * @return render for the combo box ++ */ ++ protected ListCellRenderer createRenderer() ++ { ++ return new BasicComboBoxRenderer(); ++ } ++ ++ /** ++ * Creates component that will be responsible for displaying/editting ++ * selected item in the combo box. This editor is used only when combo box ++ * is editable. ++ * ++ * @return component that will be responsible for displaying/editting ++ * selected item in the combo box. ++ */ ++ protected ComboBoxEditor createEditor() ++ { ++ return new BasicComboBoxEditor(); ++ } ++ ++ /** ++ * This method installs components for this JComboBox. ArrowButton, main ++ * part of combo box (upper part) and popup list of items are created and ++ * configured here. ++ */ ++ protected void installComponents() ++ { ++ // create and install arrow button ++ arrowButton = createArrowButton(); ++ ++ comboBox.add(arrowButton); ++ ++ // Set list that will be used by BasicComboBoxRender ++ // in order to determine the right colors when rendering ++ listBox = new JList(); ++ ++ Color background = arrowButton.getBackground(); ++ listBox.setBackground(background); ++ listBox.setSelectionBackground(background.darker()); ++ ++ Color foreground = arrowButton.getForeground(); ++ listBox.setForeground(foreground); ++ listBox.setSelectionForeground(foreground); ++ ++ // set editor and renderer for the combo box. Editor is used ++ // only if combo box becomes editable, otherwise renderer is used ++ // to paint the selected item; combobox is not editable by default. ++ comboBox.setRenderer(createRenderer()); ++ ++ comboBox.setEditor(createEditor()); ++ editor = comboBox.getEditor().getEditorComponent(); ++ ++ // create drop down list of items ++ popup = createPopup(); ++ ++ comboBox.revalidate(); ++ } ++ ++ /** ++ * This method uninstalls components from this JComboBox ++ */ ++ protected void uninstallComponents() ++ { ++ // uninstall arrow button ++ unconfigureArrowButton(); ++ comboBox.remove(arrowButton); ++ arrowButton = null; ++ ++ listBox = null; ++ popup = null; ++ ++ comboBox.setRenderer(null); ++ ++ comboBox.setEditor(null); ++ editor = null; ++ } ++ ++ /** ++ * This method adds editor to the combo box ++ */ ++ public void addEditor() ++ { ++ comboBox.add(editor); ++ } ++ ++ /** ++ * This method removes editor from the combo box ++ */ ++ public void removeEditor() ++ { ++ comboBox.remove(editor); ++ } ++ ++ /** ++ * This method configures editor for this combo box. ++ */ ++ protected void configureEditor() ++ { ++ // FIXME: Need to implement. Set font and add listeners. ++ } ++ ++ /** ++ * This method removes all the listeners for the editor. ++ */ ++ protected void unconfigureEditor() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method adds listeners to the arrow button part of the combo box. ++ */ ++ public void configureArrowButton() ++ { ++ arrowButton.addMouseListener(mouseListener); ++ } ++ ++ /** ++ * This method removes listeners from the arrow button part of the combo ++ * box. ++ */ ++ public void unconfigureArrowButton() ++ { ++ arrowButton.removeMouseListener(mouseListener); ++ } ++ ++ /** ++ * This method create arrow button for this JComboBox. Arrow button is ++ * responsible for displaying / hiding drop down list of items when it is ++ * clicked. ++ * ++ * @return JButton arrow button for this JComboBox. ++ */ ++ protected JButton createArrowButton() ++ { ++ return new BasicArrowButton(BasicArrowButton.SOUTH); ++ } ++ ++ /** ++ * This method checks if popup part of the combo box is visible on the ++ * screen ++ * ++ * @param c The JComboBox to check ++ * ++ * @return true if popup part of the JComboBox is visible and false ++ * otherwise. ++ */ ++ public boolean isPopupVisible(JComboBox c) ++ { ++ return popup.isVisible(); ++ } ++ ++ /** ++ * Displays/Hides JComboBox's list of items on the screen. ++ * ++ * @param c The combo box, for which list of items should be ++ * displayed/hidden ++ * @param v true if show popup part of the jcomboBox and false to hide. ++ */ ++ public void setPopupVisible(JComboBox c, boolean v) ++ { ++ if (v) ++ popup.show(); ++ else ++ popup.hide(); ++ } ++ ++ /** ++ * JComboBox is focus traversable if it is editable and not otherwise. ++ * ++ * @param c combo box for which to check whether it is focus traversable ++ * ++ * @return true if focus tranversable and false otherwise ++ */ ++ public boolean isFocusTraversable(JComboBox c) ++ { ++ if (comboBox.isEditable()) ++ return true; ++ ++ return false; ++ } ++ ++ /** ++ * Paints given menu item using specified graphics context ++ * ++ * @param g The graphics context used to paint this combo box ++ * @param c comboBox which needs to be painted. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ if (c instanceof JComboBox) ++ { ++ JComboBox cb = (JComboBox) c; ++ ++ paintBorder(g, comboBox.getBounds(), hasFocus); ++ ++ Rectangle rect = rectangleForCurrentValue(); ++ paintCurrentValueBackground(g, rect, hasFocus); ++ paintCurrentValue(g, rect, hasFocus); ++ } ++ } ++ ++ private void paintBorder(Graphics g, Rectangle bounds, boolean hasFocus) ++ { ++ int x = 0; ++ int y = 0; ++ int width = bounds.width; ++ int height = bounds.height; ++ ++ Color oldColor = g.getColor(); ++ ++ if (! arrowButton.getModel().isPressed()) ++ BasicGraphicsUtils.drawEtchedRect(g, x, y, width, height, Color.gray, ++ Color.white, Color.gray, Color.white); ++ else ++ { ++ g.setColor(darkShadow); ++ g.drawRect(x, y, width, height); ++ g.setColor(shadow); ++ g.drawRect(x + 1, y + 1, width - 3, height - 3); ++ } ++ g.setColor(oldColor); ++ } ++ ++ /** ++ * Returns preferred size for the given menu item. ++ * ++ * @param c comboBox for which to get preferred size ++ * ++ * @return $Dimension$ preferred size for the given combo box ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ // return null to indicate that combo box's layout will determin its ++ // preferred size ++ return null; ++ } ++ ++ /** ++ * This method returns the minimum size for this {@link JComboBox} for this ++ * look and feel. ++ * ++ * @param c The {@link JComponent} to find the minimum size for. ++ * ++ * @return The dimensions of the minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the maximum size for this {@link JComboBox} for this ++ * look and feel. ++ * ++ * @param c The {@link JComponent} to find the maximum size for ++ * ++ * @return The dimensions of the minimum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ public int getAccessibleChildrenCount(JComponent c) ++ { ++ // FIXME: Need to implement ++ return 0; ++ } ++ ++ public Accessible getAccessibleChild(JComponent c, int i) ++ { ++ // FIXME: Need to implement ++ return null; ++ } ++ ++ /** ++ * Returns true if the specified key is a navigation key and false otherwise ++ * ++ * @param keyCode a key for which to check whether it is navigation key or ++ * not. ++ * ++ * @return true if the specified key is a navigation key and false otherwis ++ */ ++ protected boolean isNavigationKey(int keyCode) ++ { ++ return false; ++ } ++ ++ /** ++ * This method selects next possible item relative to the current selection ++ * to be next selected item in the combo box. ++ */ ++ protected void selectNextPossibleValue() ++ { ++ int index = comboBox.getSelectedIndex(); ++ if (index != comboBox.getItemCount() - 1) ++ comboBox.setSelectedIndex(index + 1); ++ } ++ ++ /** ++ * This method selects previous item relative to current selection to be ++ * next selected item. ++ */ ++ protected void selectPreviousPossibleValue() ++ { ++ int index = comboBox.getSelectedIndex(); ++ if (index != 0) ++ comboBox.setSelectedIndex(index - 1); ++ } ++ ++ /** ++ * This method displays combo box popup if the popup is not currently shown ++ * on the screen and hides it if it is currently shown ++ */ ++ protected void toggleOpenClose() ++ { ++ setPopupVisible(comboBox, ! isPopupVisible(comboBox)); ++ } ++ ++ /** ++ * This method returns bounds in which comboBox's selected Item will be ++ * displayed ++ * ++ * @return rectangle bounds in which comboBox's selected Item will be ++ * displayed ++ */ ++ protected Rectangle rectangleForCurrentValue() ++ { ++ Rectangle cbBounds = comboBox.getBounds(); ++ ++ // Subtract width or the arrow button and border insets ++ Rectangle rectForCurrentValue = new Rectangle(cbBounds.x ++ + borderInsets.left, ++ cbBounds.y ++ + borderInsets.top, ++ cbBounds.width ++ - arrowButtonWidth ++ - borderInsets.left ++ - borderInsets.right, ++ cbBounds.height ++ - borderInsets.top ++ - borderInsets.bottom); ++ ++ return rectForCurrentValue; ++ } ++ ++ /** ++ * This method returns insets of the current border. ++ * ++ * @return Insets representing space between combo box and its border ++ */ ++ protected Insets getInsets() ++ { ++ return new Insets(0, 0, 0, 0); ++ } ++ ++ /** ++ * This method paints currently selected value in the main part of the combo ++ * box (part without popup). ++ * ++ * @param g graphics context ++ * @param bounds Rectangle representing the size of the area in which ++ * selected item should be drawn ++ * @param hasFocus true if combo box has focus and false otherwise ++ */ ++ public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus) ++ { ++ if (! comboBox.isEditable()) ++ { ++ Object currentValue = comboBox.getSelectedItem(); ++ boolean isPressed = arrowButton.getModel().isPressed(); ++ if (currentValue != null) ++ { ++ Component comp = comboBox.getRenderer() ++ .getListCellRendererComponent(listBox, ++ currentValue, ++ -1, ++ isPressed, ++ isPressed); ++ if (! comboBox.isEnabled()) ++ comp.setEnabled(false); ++ ++ g.translate(borderInsets.left, borderInsets.top); ++ comp.setBounds(0, 0, bounds.width, bounds.height); ++ comp.paint(g); ++ g.translate(-borderInsets.left, -borderInsets.top); ++ } ++ comboBox.revalidate(); ++ } ++ else ++ comboBox.getEditor().setItem(comboBox.getSelectedItem()); ++ } ++ ++ /** ++ * This method paints background of part of the combo box, where currently ++ * selected value is displayed. If the combo box has focus this method ++ * should also paint focus rectangle around the combo box. ++ * ++ * @param g graphics context ++ * @param bounds Rectangle representing the size of the largest item in the ++ * comboBox ++ * @param hasFocus true if combo box has fox and false otherwise ++ */ ++ public void paintCurrentValueBackground(Graphics g, Rectangle bounds, ++ boolean hasFocus) ++ { ++ // background is painted by renderer, so it seems that nothing ++ // should be done here. ++ } ++ ++ /** ++ * Returns default size for the combo box that doesn't contain any elements ++ * in it ++ * ++ * @return Default size of the combo box with no elements in it. ++ */ ++ protected Dimension getDefaultSize() ++ { ++ return new Dimension(6, 17); ++ } ++ ++ /** ++ * Returns size of the largest item in the combo box. This size will be the ++ * size of the combo box, not including the arrowButton. ++ * ++ * @return dimensions of the largest item in the combo box. ++ */ ++ protected Dimension getLargestItemSize() ++ { ++ ComboBoxModel model = comboBox.getModel(); ++ int numItems = model.getSize(); ++ ++ // if combo box doesn't have any items then simply ++ // return its default size ++ if (numItems == 0) ++ { ++ largestItemSize = getDefaultSize(); ++ return largestItemSize; ++ } ++ ++ Dimension size = new Dimension(0, 0); ++ ++ // ComboBox's display size should be equal to the ++ // size of the largest item in the combo box. ++ ListCellRenderer renderer = comboBox.getRenderer(); ++ ++ for (int i = 0; i < numItems; i++) ++ { ++ Object item = model.getElementAt(i); ++ String s = item.toString(); ++ Component comp = renderer.getListCellRendererComponent(listBox, item, ++ -1, false, false); ++ ++ if (comp.getPreferredSize().getWidth() > size.getWidth()) ++ size = comp.getPreferredSize(); ++ } ++ ++ largestItemSize = size; ++ return largestItemSize; ++ } ++ ++ /** ++ * This method installs the keyboard actions for the JComboBox as specified ++ * by the look and feel. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Need to implement. ++ } ++ ++ /** ++ * This method uninstalls the keyboard actions for the JComboBox there were ++ * installed by in {@link #installListeners}. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Need to implement. ++ } ++ ++ /** ++ * This class is Layout Manager for this combo box. ++ */ ++ public class ComboBoxLayoutManager extends Object implements LayoutManager ++ { ++ /** ++ * Creates a new ComboBoxLayoutManager object. ++ */ ++ public ComboBoxLayoutManager() ++ { ++ } ++ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ // Do nothing ++ } ++ ++ public void removeLayoutComponent(Component comp) ++ { ++ // Do nothing ++ } ++ ++ /** ++ * Returns preferred layout size of the JComboBox. ++ * ++ * @param parent Container for which preferred size should be calculated ++ * ++ * @return preferred size for the given container ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ Dimension d = new Dimension(0, 0); ++ ++ if (largestItemSize == null) ++ largestItemSize = getLargestItemSize(); ++ ++ // add size for the area that will display selected item ++ d.width += largestItemSize.getWidth(); ++ d.height += largestItemSize.getHeight(); ++ ++ // add size of the arrow button ++ d.width += arrowButtonWidth; ++ ++ // add width and height of the border ++ d.width += borderInsets.left + borderInsets.right; ++ d.height += borderInsets.left + borderInsets.right; ++ ++ // Add combo box's insets ++ Insets insets = parent.getInsets(); ++ d.width += insets.left + insets.right; ++ d.width += insets.left + insets.right; ++ ++ return d; ++ } ++ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return preferredLayoutSize(parent); ++ } ++ ++ /** ++ * This method layouts out the components in the container. It puts arrow ++ * button right end part of the comboBox. If the comboBox is editable ++ * then editor is placed to the left of arrow button, starting from the ++ * beginning. ++ * ++ * @param parent Container that should be layed out. ++ */ ++ public void layoutContainer(Container parent) ++ { ++ // Position editor component to the left of arrow button if combo box is ++ // editable ++ int editorWidth = comboBox.getBounds().width - arrowButtonWidth - 2; ++ ++ if (comboBox.isEditable()) ++ editor.setBounds(borderInsets.left, borderInsets.top, editorWidth, ++ comboBox.getBounds().height - borderInsets.left ++ - borderInsets.top); ++ ++ arrowButton.setBounds(editorWidth, 2, arrowButtonWidth, ++ comboBox.getBounds().height - 4); ++ comboBox.revalidate(); ++ } ++ } ++ ++ /** ++ * This class handles focus changes occuring in the combo box. This class is ++ * responsible for repainting combo box whenever focus is gained or lost ++ * and also for hiding popup list of items whenever combo box loses its ++ * focus. ++ */ ++ public class FocusHandler extends Object implements FocusListener ++ { ++ /** ++ * Creates a new FocusHandler object. ++ */ ++ public FocusHandler() ++ { ++ } ++ ++ /** ++ * This mehtod is invoked when combo box gains focus. It repaints main ++ * part of combo box accordingally. ++ * ++ * @param e the FocusEvent ++ */ ++ public void focusGained(FocusEvent e) ++ { ++ hasFocus = true; ++ comboBox.repaint(); ++ } ++ ++ /** ++ * This method is invoked when combo box loses focus It repaint main part ++ * of combo box accordingally and hides popup list of items. ++ * ++ * @param e the FocusEvent ++ */ ++ public void focusLost(FocusEvent e) ++ { ++ hasFocus = false; ++ comboBox.repaint(); ++ popup.hide(); ++ } ++ } ++ ++ /** ++ * This class handles ItemEvent fired by the JComboBox when its selected ++ * item changes. ++ */ ++ public class ItemHandler extends Object implements ItemListener ++ { ++ /** ++ * Creates a new ItemHandler object. ++ */ ++ public ItemHandler() ++ { ++ } ++ ++ /** ++ * This method is invoked when selected item becomes deselected or when ++ * new item becomes selected. ++ * ++ * @param e the ItemEvent representing item's state change. ++ */ ++ public void itemStateChanged(ItemEvent e) ++ { ++ comboBox.repaint(); ++ } ++ } ++ ++ /** ++ * KeyHandler handles key events occuring while JComboBox has focus. ++ */ ++ public class KeyHandler extends KeyAdapter ++ { ++ public KeyHandler() ++ { ++ } ++ ++ /* ++ * This method is invoked whenever key is pressed while JComboBox is in ++ * focus. ++ */ ++ public void keyPressed(KeyEvent e) ++ { ++ // FIXME: This method calls JComboBox.selectWithKeyChar if the key that was ++ // pressed is not a navigation key. ++ } ++ } ++ ++ /** ++ * This class handles to the changes occuring in the JComboBox's data model ++ */ ++ public class ListDataHandler extends Object implements ListDataListener ++ { ++ /** ++ * Creates a new ListDataHandler object. ++ */ ++ public ListDataHandler() ++ { ++ } ++ ++ /** ++ * This method is invoked content's of JComboBox's data model are changed ++ * ++ * @param e ListDataEvent describing the change. ++ */ ++ public void contentsChanged(ListDataEvent e) ++ { ++ // if the item is selected or deselected ++ } ++ ++ /** ++ * This method is invoked when items were added to the JComboBox's data ++ * model. ++ * ++ * @param e ListDataEvent describing the change. ++ */ ++ public void intervalAdded(ListDataEvent e) ++ { ++ // must determine if the size of the combo box should change ++ int start = e.getIndex0(); ++ int end = e.getIndex1(); ++ ++ ComboBoxModel model = comboBox.getModel(); ++ ListCellRenderer renderer = comboBox.getRenderer(); ++ ++ if (largestItemSize == null) ++ largestItemSize = new Dimension(0, 0); ++ ++ for (int i = start - 1; i < end; i++) ++ { ++ Object item = model.getElementAt(i); ++ Component comp = renderer.getListCellRendererComponent(new JList(), ++ item, -1, ++ false, false); ++ if (comp.getPreferredSize().getWidth() > largestItemSize.getWidth()) ++ largestItemSize = comp.getPreferredSize(); ++ } ++ } ++ ++ /** ++ * This method is invoked when items were removed from the JComboBox's ++ * data model. ++ * ++ * @param e ListDataEvent describing the change. ++ */ ++ public void intervalRemoved(ListDataEvent e) ++ { ++ // must determine if the size of the combo box should change ++ // FIXME: need to implement ++ } ++ } ++ ++ /** ++ * This class handles PropertyChangeEvents fired by JComboBox. ++ */ ++ public class PropertyChangeHandler extends Object ++ implements PropertyChangeListener ++ { ++ public PropertyChangeHandler() ++ { ++ } ++ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JComboBox.ENABLED_CHANGED_PROPERTY)) ++ { ++ // disable arrow button ++ arrowButton.setEnabled(comboBox.isEnabled()); ++ ++ if (comboBox.isEditable()) ++ comboBox.getEditor().getEditorComponent().setEnabled(comboBox ++ .isEnabled()); ++ } ++ else if (e.getPropertyName().equals(JComboBox.EDITABLE_CHANGED_PROPERTY)) ++ { ++ if (comboBox.isEditable()) ++ { ++ configureEditor(); ++ addEditor(); ++ } ++ else ++ { ++ unconfigureEditor(); ++ removeEditor(); ++ } ++ ++ comboBox.revalidate(); ++ comboBox.repaint(); ++ } ++ ++ // FIXME: Need to handle changes in other bound properties. ++ } ++ } ++ ++ /** ++ * MouseHandler listens to mouse events occuring in the combo box. This ++ * class is responsible for repainting this JComboBox whenever the mouse is ++ * being pressed or released over it. ++ */ ++ private class MouseHandler extends MouseAdapter ++ { ++ /** ++ * This method is invoked when mouse is pressed over the combo box. It ++ * repaints the combo box accordinglly ++ * ++ * @param e the MouseEvent ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ if (comboBox.isEnabled()) ++ { ++ if (e.getSource() instanceof JComboBox) ++ { ++ arrowButton.getModel().setPressed(true); ++ arrowButton.getModel().setArmed(true); ++ } ++ ++ comboBox.repaint(); ++ ++ if (e.getSource() instanceof BasicArrowButton) ++ toggleOpenClose(); ++ } ++ } ++ ++ /** ++ * This method is invoked when mouse is released over the combo box. It ++ * repaints the combo box accordinglly ++ * ++ * @param e the MouseEvent ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ if (comboBox.isEnabled()) ++ { ++ if (e.getSource() instanceof JComboBox) ++ { ++ arrowButton.getModel().setPressed(false); ++ arrowButton.getModel().setArmed(false); ++ } ++ ++ comboBox.repaint(); ++ } ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicComboPopup.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicComboPopup.java +diff -N javax/swing/plaf/basic/BasicComboPopup.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicComboPopup.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,933 @@ ++/* BasicComboPopup.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Rectangle; ++import java.awt.event.ItemEvent; ++import java.awt.event.ItemListener; ++import java.awt.event.KeyAdapter; ++import java.awt.event.KeyEvent; ++import java.awt.event.KeyListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import java.awt.event.MouseMotionAdapter; ++import java.awt.event.MouseMotionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.ComboBoxModel; ++import javax.swing.JComboBox; ++import javax.swing.JComponent; ++import javax.swing.JLabel; ++import javax.swing.JList; ++import javax.swing.JPopupMenu; ++import javax.swing.JScrollPane; ++import javax.swing.ListCellRenderer; ++import javax.swing.ListSelectionModel; ++import javax.swing.SwingConstants; ++import javax.swing.Timer; ++import javax.swing.event.ListDataEvent; ++import javax.swing.event.ListDataListener; ++import javax.swing.event.ListSelectionEvent; ++import javax.swing.event.ListSelectionListener; ++import javax.swing.event.PopupMenuEvent; ++import javax.swing.event.PopupMenuListener; ++ ++ ++/** ++ * UI Delegate for ComboPopup ++ * ++ * @author Olga Rodimina ++ */ ++public class BasicComboPopup extends JPopupMenu implements ComboPopup ++{ ++ protected Timer autoscrollTimer; ++ ++ /** ++ * ComboBox associated with this popup ++ */ ++ protected JComboBox comboBox; ++ ++ /* ++ * FIXME: Document fields below ++ */ ++ protected boolean hasEntered; ++ protected boolean isAutoScrolling; ++ ++ /** ++ * ItemListener listening to the selection changes in the combo box ++ */ ++ protected ItemListener itemListener; ++ ++ /** ++ * This listener is not used ++ */ ++ protected KeyListener keyListener; ++ ++ /** ++ * JList which is used to display item is the combo box ++ */ ++ protected JList list; ++ ++ /** ++ * This listener is not used ++ */ ++ protected ListDataListener listDataListener; ++ ++ /** ++ * MouseListener listening to mouse events occuring in the combo box's ++ * list. ++ */ ++ protected MouseListener listMouseListener; ++ ++ /** ++ * MouseMotionListener listening to mouse motion events occuring in the ++ * combo box's list ++ */ ++ protected MouseMotionListener listMouseMotionListener; ++ ++ /** ++ * This listener is not used ++ */ ++ protected ListSelectionListener listSelectionListener; ++ ++ /** ++ * MouseListener listening to mouse events occuring in the combo box ++ */ ++ protected MouseListener mouseListener; ++ ++ /** ++ * MouseMotionListener listening to mouse motion events occuring in the ++ * combo box ++ */ ++ protected MouseMotionListener mouseMotionListener; ++ ++ /** ++ * PropertyChangeListener listening to changes occuring in the bound ++ * properties of the combo box ++ */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /* ++ * FIXME: Document fields below ++ */ ++ protected static int SCROLL_DOWN = 1; ++ protected static int SCROLL_UP = 0; ++ protected int scrollDirection; ++ ++ /** ++ * JScrollPane that contains list portion of the combo box ++ */ ++ protected JScrollPane scroller; ++ ++ /** ++ * This field is not used ++ */ ++ protected boolean valueIsAdjusting; ++ ++ /** ++ * Creates a new BasicComboPopup object. ++ * ++ * @param comboBox the combo box with which this popup should be associated ++ */ ++ public BasicComboPopup(JComboBox comboBox) ++ { ++ this.comboBox = comboBox; ++ installComboBoxListeners(); ++ ++ // initialize list that will be used to display elements of the combo box ++ this.list = createList(); ++ ((JLabel) list.getCellRenderer()).setHorizontalAlignment(SwingConstants.LEFT); ++ configureList(); ++ ++ // initialize scroller. Add list to the scroller. ++ scroller = createScroller(); ++ configureScroller(); ++ ++ // add scroller with list inside of it to JPopupMenu ++ super.add(scroller); ++ ++ setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled()); ++ } ++ ++ /** ++ * This method displays drow down list of combo box items on the screen. ++ */ ++ public void show() ++ { ++ Rectangle cbBounds = comboBox.getBounds(); ++ ++ // popup should have same width as the comboBox and should be hight anough ++ // to display number of rows equal to 'maximumRowCount' property ++ int popupHeight = getPopupHeightForRowCount(comboBox.getMaximumRowCount()) ++ + 4; ++ ++ super.setPopupSize(cbBounds.width, popupHeight); ++ ++ // location specified is relative to comboBox ++ super.show(comboBox, 0, cbBounds.height); ++ } ++ ++ /** ++ * This method hides drop down list of items ++ */ ++ public void hide() ++ { ++ super.setVisible(false); ++ } ++ ++ /** ++ * Return list cointaining JComboBox's items ++ * ++ * @return list cointaining JComboBox's items ++ */ ++ public JList getList() ++ { ++ return list; ++ } ++ ++ /** ++ * Returns MouseListener that is listening to mouse events occuring in the ++ * combo box. ++ * ++ * @return MouseListener ++ */ ++ public MouseListener getMouseListener() ++ { ++ return mouseListener; ++ } ++ ++ /** ++ * Returns MouseMotionListener that is listening to mouse motion events ++ * occuring in the combo box. ++ * ++ * @return MouseMotionListener ++ */ ++ public MouseMotionListener getMouseMotionListener() ++ { ++ return mouseMotionListener; ++ } ++ ++ /** ++ * Returns KeyListener listening to key events occuring in the combo box. ++ * This method returns null because KeyHandler is not longer used. ++ * ++ * @return KeyListener ++ */ ++ public KeyListener getKeyListener() ++ { ++ return keyListener; ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. ++ */ ++ public void uninstallingUI() ++ { ++ uninstallComboBoxModelListeners(comboBox.getModel()); ++ ++ uninstallListeners(); ++ uninstallKeyboardActions(); ++ } ++ ++ /** ++ * This method uninstalls listeners that were listening to changes occuring ++ * in the comb box's data model ++ * ++ * @param model data model for the combo box from which to uninstall ++ * listeners ++ */ ++ protected void uninstallComboBoxModelListeners(ComboBoxModel model) ++ { ++ model.removeListDataListener(listDataListener); ++ } ++ ++ /** ++ * This method uninstalls keyboard actions installed by the UI. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method fires PopupMenuEvent indicating that combo box's popup list ++ * of items will become visible ++ */ ++ protected void firePopupMenuWillBecomeVisible() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method fires PopupMenuEvent indicating that combo box's popup list ++ * of items will become invisible. ++ */ ++ protected void firePopupMenuWillBecomeInvisible() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method fires PopupMenuEvent indicating that combo box's popup list ++ * of items was closed without selection. ++ */ ++ protected void firePopupMenuCanceled() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * Creates MouseListener to listen to mouse events occuring in the combo ++ * box. Note that this listener doesn't listen to mouse events occuring in ++ * the popup portion of the combo box, it only listens to main combo box ++ * part. ++ * ++ * @return new MouseMotionListener that listens to mouse events occuring in ++ * the combo box ++ */ ++ protected MouseListener createMouseListener() ++ { ++ return new InvocationMouseHandler(); ++ } ++ ++ /** ++ * Create Mouse listener that listens to mouse dragging events occuring in ++ * the combo box. This listener is responsible for changing the selection ++ * in the combo box list to the component over which mouse is being ++ * currently dragged ++ * ++ * @return new MouseMotionListener that listens to mouse dragging events ++ * occuring in the combo box ++ */ ++ protected MouseMotionListener createMouseMotionListener() ++ { ++ return new InvocationMouseMotionHandler(); ++ } ++ ++ /** ++ * KeyListener created in this method is not used anymore. ++ * ++ * @return KeyListener that does nothing ++ */ ++ protected KeyListener createKeyListener() ++ { ++ return new InvocationKeyHandler(); ++ } ++ ++ /** ++ * ListSelectionListener created in this method is not used anymore ++ * ++ * @return ListSelectionListener that does nothing ++ */ ++ protected ListSelectionListener createListSelectionListener() ++ { ++ return new ListSelectionHandler(); ++ } ++ ++ /** ++ * Creates ListDataListener. This method returns null, because ++ * ListDataHandler class is obsolete and is no longer used. ++ * ++ * @return null ++ */ ++ protected ListDataListener createListDataListener() ++ { ++ return null; ++ } ++ ++ /** ++ * This method creates ListMouseListener to listen to mouse events occuring ++ * in the combo box's item list. ++ * ++ * @return MouseListener to listen to mouse events occuring in the combo ++ * box's items list. ++ */ ++ protected MouseListener createListMouseListener() ++ { ++ return new ListMouseHandler(); ++ } ++ ++ /** ++ * Creates ListMouseMotionlistener to listen to mouse motion events occuring ++ * in the combo box's list. This listener is responsible for highlighting ++ * items in the list when mouse is moved over them. ++ * ++ * @return MouseMotionListener that handles mouse motion events occuring in ++ * the list of the combo box. ++ */ ++ protected MouseMotionListener createListMouseMotionListener() ++ { ++ return new ListMouseMotionHandler(); ++ } ++ ++ /** ++ * Creates PropertyChangeListener to handle changes in the JComboBox's bound ++ * properties. ++ * ++ * @return PropertyChangeListener to handle changes in the JComboBox's bound ++ * properties. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * Creates new ItemListener that will listen to ItemEvents occuring in the ++ * combo box. ++ * ++ * @return ItemListener to listen to ItemEvents occuring in the combo box. ++ */ ++ protected ItemListener createItemListener() ++ { ++ return new ItemHandler(); ++ } ++ ++ /** ++ * Creates JList that will be used to display items in the combo box. ++ * ++ * @return JList that will be used to display items in the combo box. ++ */ ++ protected JList createList() ++ { ++ JList l = new JList(comboBox.getModel()); ++ l.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); ++ return l; ++ } ++ ++ /** ++ * This method configures the list of comboBox's items by setting default ++ * properties and installing listeners. ++ */ ++ protected void configureList() ++ { ++ list.setModel(comboBox.getModel()); ++ ++ if (comboBox.getItemCount() < comboBox.getMaximumRowCount()) ++ list.setVisibleRowCount(comboBox.getItemCount()); ++ else ++ list.setVisibleRowCount(comboBox.getMaximumRowCount()); ++ installListListeners(); ++ } ++ ++ /** ++ * This method installs list listeners. ++ */ ++ protected void installListListeners() ++ { ++ // mouse listener listening to mouse events occuring in the ++ // combo box's list of items. ++ listMouseListener = createListMouseListener(); ++ list.addMouseListener(listMouseListener); ++ ++ // mouse listener listening to mouse motion events occuring in the ++ // combo box's list of items ++ listMouseMotionListener = createListMouseMotionListener(); ++ list.addMouseMotionListener(listMouseMotionListener); ++ ++ listSelectionListener = createListSelectionListener(); ++ list.addListSelectionListener(listSelectionListener); ++ } ++ ++ /** ++ * This method creates scroll pane that will contain the list of comboBox's ++ * items inside of it. ++ * ++ * @return JScrollPane ++ */ ++ protected JScrollPane createScroller() ++ { ++ return new JScrollPane(); ++ } ++ ++ /** ++ * This method configures scroll pane to contain list of comboBox's items ++ */ ++ protected void configureScroller() ++ { ++ scroller.getViewport().setView(list); ++ scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); ++ } ++ ++ /** ++ * This method configures popup menu that will be used to display Scrollpane ++ * with list of items inside of it. ++ */ ++ protected void configurePopup() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /* ++ * This method installs listeners that will listen to changes occuring ++ * in the combo box. ++ */ ++ protected void installComboBoxListeners() ++ { ++ // mouse listener that listens to mouse event in combo box ++ mouseListener = createMouseListener(); ++ comboBox.addMouseListener(mouseListener); ++ ++ // mouse listener that listens to mouse dragging events in the combo box ++ mouseMotionListener = createMouseMotionListener(); ++ comboBox.addMouseMotionListener(mouseMotionListener); ++ ++ // item listener listenening to selection events in the combo box ++ itemListener = createItemListener(); ++ comboBox.addItemListener(itemListener); ++ ++ propertyChangeListener = createPropertyChangeListener(); ++ comboBox.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * This method installs listeners that will listen to changes occuring in ++ * the comb box's data model ++ * ++ * @param model data model for the combo box for which to install listeners ++ */ ++ protected void installComboBoxModelListeners(ComboBoxModel model) ++ { ++ // list data listener to listen for ListDataEvents in combo box. ++ // This listener is now obsolete and nothing is done here ++ listDataListener = createListDataListener(); ++ comboBox.getModel().addListDataListener(listDataListener); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method always returns false to indicate that items in the combo box ++ * list are not focus traversable. ++ * ++ * @return false ++ */ ++ public boolean isFocusTraversable() ++ { ++ return false; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param direction DOCUMENT ME! ++ */ ++ protected void startAutoScrolling(int direction) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void stopAutoScrolling() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void autoScrollUp() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void autoScrollDown() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method helps to delegate focus to the right component in the ++ * JComboBox. If the comboBox is editable then focus is sent to ++ * ComboBoxEditor, otherwise it is delegated to JComboBox. ++ * ++ * @param e MouseEvent ++ */ ++ protected void delegateFocus(MouseEvent e) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method displays combo box popup if the popup is not currently shown ++ * on the screen and hides it if it is currently visible ++ */ ++ protected void togglePopup() ++ { ++ if (BasicComboPopup.this.isVisible()) ++ hide(); ++ else ++ show(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param e DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected MouseEvent convertMouseEvent(MouseEvent e) ++ { ++ return null; ++ } ++ ++ /** ++ * Returns required height of the popup such that number of items visible in ++ * it are equal to the maximum row count. By default ++ * comboBox.maximumRowCount=8 ++ * ++ * @param maxRowCount number of maximum visible rows in the combo box's ++ * popup list of items ++ * ++ * @return height of the popup required to fit number of items equal to ++ * JComboBox.maximumRowCount. ++ */ ++ protected int getPopupHeightForRowCount(int maxRowCount) ++ { ++ int totalHeight = 0; ++ ListCellRenderer rend = list.getCellRenderer(); ++ ++ if (comboBox.getItemCount() < maxRowCount) ++ maxRowCount = comboBox.getItemCount(); ++ ++ for (int i = 0; i < maxRowCount; i++) ++ { ++ Component comp = rend.getListCellRendererComponent(list, ++ list.getModel() ++ .getElementAt(i), ++ -1, false, false); ++ Dimension dim = comp.getPreferredSize(); ++ totalHeight += dim.height; ++ } ++ ++ return totalHeight; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param px DOCUMENT ME! ++ * @param py DOCUMENT ME! ++ * @param pw DOCUMENT ME! ++ * @param ph DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected Rectangle computePopupBounds(int px, int py, int pw, int ph) ++ { ++ return new Rectangle(px, py, pw, ph); ++ } ++ ++ /** ++ * This method changes the selection in the list to the item over which the ++ * mouse is currently located. ++ * ++ * @param anEvent MouseEvent ++ * @param shouldScroll DOCUMENT ME! ++ */ ++ protected void updateListBoxSelectionForEvent(MouseEvent anEvent, ++ boolean shouldScroll) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * InvocationMouseHandler is a listener that listens to mouse events ++ * occuring in the combo box. Note that this listener doesn't listen to ++ * mouse events occuring in the popup portion of the combo box, it only ++ * listens to main combo box part(area that displays selected item). This ++ * listener is responsible for showing and hiding popup portion of the ++ * combo box. ++ */ ++ protected class InvocationMouseHandler extends MouseAdapter ++ { ++ /** ++ * Creates a new InvocationMouseHandler object. ++ */ ++ protected InvocationMouseHandler() ++ { ++ } ++ ++ /** ++ * This method is invoked whenever mouse is being pressed over the main ++ * part of the combo box. This method will show popup if the popup is ++ * not shown on the screen right now, and it will hide popup otherwise. ++ * ++ * @param e MouseEvent that should be handled ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ if (comboBox.isEnabled()) ++ togglePopup(); ++ } ++ ++ /** ++ * This method is invoked whenever mouse is released ++ * ++ * @param e MouseEvent that should be handled ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ // FIXME: should handle dragging events here, if ++ // mouse was dragged and released over the list of combobox's items, ++ // then item over which it was released should be selected. ++ } ++ } ++ ++ /** ++ * InvocationMouseMotionListener is a mouse listener that listens to mouse ++ * dragging events occuring in the combo box. ++ */ ++ protected class InvocationMouseMotionHandler extends MouseMotionAdapter ++ { ++ /** ++ * Creates a new InvocationMouseMotionHandler object. ++ */ ++ protected InvocationMouseMotionHandler() ++ { ++ } ++ ++ public void mouseDragged(MouseEvent e) ++ { ++ } ++ } ++ ++ /** ++ * ItemHandler is an item listener that listens to selection event occuring ++ * in the combo box. FIXME: should specify here what it does when item is ++ * selected or deselected in the combo box list. ++ */ ++ protected class ItemHandler extends Object implements ItemListener ++ { ++ /** ++ * Creates a new ItemHandler object. ++ */ ++ protected ItemHandler() ++ { ++ } ++ ++ /** ++ * This method responds to the selection events occuring in the combo box. ++ * ++ * @param e ItemEvent specifying the combo box's selection ++ */ ++ public void itemStateChanged(ItemEvent e) ++ { ++ } ++ } ++ ++ /** ++ * ListMouseHandler is a listener that listens to mouse events occuring in ++ * the combo box's list of items. This class is responsible for hiding ++ * popup portion of the combo box if the mouse is released inside the combo ++ * box's list. ++ */ ++ protected class ListMouseHandler extends MouseAdapter ++ { ++ protected ListMouseHandler() ++ { ++ } ++ ++ public void mousePressed(MouseEvent e) ++ { ++ } ++ ++ public void mouseReleased(MouseEvent anEvent) ++ { ++ int index = list.locationToIndex(anEvent.getPoint()); ++ comboBox.setSelectedIndex(index); ++ hide(); ++ } ++ } ++ ++ /** ++ * ListMouseMotionHandler listens to mouse motion events occuring in the ++ * combo box's list. This class is responsible for highlighting items in ++ * the list when mouse is moved over them ++ */ ++ protected class ListMouseMotionHandler extends MouseMotionAdapter ++ { ++ protected ListMouseMotionHandler() ++ { ++ } ++ ++ public void mouseMoved(MouseEvent anEvent) ++ { ++ // FIXME: Need to implement ++ // NOTE: the change isn't reflected in data model of the combo box. ++ // The items are only highlited, but not selected ++ } ++ } ++ ++ /** ++ * This class listens to changes occuring in the bound properties of the ++ * combo box ++ */ ++ protected class PropertyChangeHandler extends Object ++ implements PropertyChangeListener ++ { ++ protected PropertyChangeHandler() ++ { ++ } ++ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JComboBox.RENDERER_CHANGED_PROPERTY)) ++ { ++ list.setCellRenderer((ListCellRenderer) e.getNewValue()); ++ revalidate(); ++ repaint(); ++ } ++ } ++ } ++ ++ // ------ private helper methods -------------------- ++ ++ /** ++ * This method uninstalls listeners installed by the UI ++ */ ++ private void uninstallListeners() ++ { ++ uninstallListListeners(); ++ uninstallComboBoxListeners(); ++ uninstallComboBoxModelListeners(comboBox.getModel()); ++ } ++ ++ /** ++ * This method uninstalls Listeners registered with combo boxes list of ++ * items ++ */ ++ private void uninstallListListeners() ++ { ++ list.removeMouseListener(listMouseListener); ++ listMouseListener = null; ++ ++ list.removeMouseMotionListener(listMouseMotionListener); ++ listMouseMotionListener = null; ++ } ++ ++ /** ++ * This method uninstalls listeners listening to combo box associated with ++ * this popup menu ++ */ ++ private void uninstallComboBoxListeners() ++ { ++ comboBox.removeMouseListener(mouseListener); ++ mouseListener = null; ++ ++ comboBox.removeMouseMotionListener(mouseMotionListener); ++ mouseMotionListener = null; ++ ++ comboBox.removeItemListener(itemListener); ++ itemListener = null; ++ ++ comboBox.removePropertyChangeListener(propertyChangeListener); ++ propertyChangeListener = null; ++ } ++ ++ // -------------------------------------------------------------------- ++ // The following classes are here only for backwards API compatibility ++ // They aren't used. ++ // -------------------------------------------------------------------- ++ ++ /** ++ * This class is not used any more. ++ */ ++ public class ListDataHandler extends Object implements ListDataListener ++ { ++ public ListDataHandler() ++ { ++ } ++ ++ public void contentsChanged(ListDataEvent e) ++ { ++ } ++ ++ public void intervalAdded(ListDataEvent e) ++ { ++ } ++ ++ public void intervalRemoved(ListDataEvent e) ++ { ++ } ++ } ++ ++ /** ++ * This class is not used anymore ++ */ ++ protected class ListSelectionHandler extends Object ++ implements ListSelectionListener ++ { ++ protected ListSelectionHandler() ++ { ++ } ++ ++ public void valueChanged(ListSelectionEvent e) ++ { ++ } ++ } ++ ++ /** ++ * This class is not used anymore ++ */ ++ public class InvocationKeyHandler extends KeyAdapter ++ { ++ public InvocationKeyHandler() ++ { ++ } ++ ++ public void keyReleased(KeyEvent e) ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicDefaults.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicDefaults.java +diff -N javax/swing/plaf/basic/BasicDefaults.java +--- javax/swing/plaf/basic/BasicDefaults.java 27 Nov 2003 09:09:13 -0000 1.6 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,126 +0,0 @@ +-/* BasicDefaults.java +- Copyright (C) 2002 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +- +-package javax.swing.plaf.basic; +- +-import java.awt.Color; +-import java.awt.Component; +-import java.awt.Graphics; +-import java.awt.Insets; +-import javax.swing.UIDefaults; +-import javax.swing.border.MatteBorder; +- +-class BasicBorder extends MatteBorder +-{ +- static Color BtnPointClr = new Color( 180, 180, 180); +- +- BasicBorder() +- { +- super(5,5,5,5, Color.black); +- } +- +- public void paintBorder(Component c, +- Graphics g, +- int x, +- int y, +- int width, +- int height) +- { +- // System.out.println("PAINT-------------------------------------------BORDER"); +- +- if (g != null) +- { +- g.setColor( BtnPointClr); +- g.draw3DRect( 0, 0, width-1, height-1, true); +- } +- } +- } +- +-class PanelBorder extends MatteBorder +-{ +- PanelBorder() +- { +- super(5,5,5,5, Color.black); +- } +- +- public void paintBorder(Component c, +- Graphics g, +- int x, +- int y, +- int width, +- int height) +- { +- // System.out.println("PAINT-------------------------------------------BORDER"); +- super.paintBorder(c, g, x, y, width, height); +- } +- } +- +-public class BasicDefaults extends UIDefaults +-{ +- public BasicDefaults() +- { +- // System.out.println("BasicDefaults !!!!!!!!!!!!!!!!!!!!!!!!!"); +- put("JButton", "javax.swing.plaf.basic.BasicButtonUI"); +- put("JLabel", "javax.swing.plaf.basic.BasicLabelUI"); +- +- put("JPanel", "javax.swing.plaf.basic.BasicPanelUI"); +- put("JCheckBox", "javax.swing.plaf.basic.BasicCheckBoxUI"); +- put("JRadioButton", "javax.swing.plaf.basic.BasicRadioButtonUI"); +- put("JToggleButton", "javax.swing.plaf.basic.BasicToggleButtonUI"); +- put("JOptionPane", "javax.swing.plaf.basic.BasicOptionPaneUI"); +- put("JList", "javax.swing.plaf.basic.BasicListUI"); +- put("JTree", "javax.swing.plaf.basic.BasicTreeUI"); +- put("JTextComponent", "javax.swing.plaf.basic.BasicTextUI"); +- put("JTabbedPane", "javax.swing.plaf.basic.BasicTabbedPaneUI"); +- put("JScrollPane", "javax.swing.plaf.basic.BasicScrollPaneUI"); +- put("JViewport", "javax.swing.plaf.basic.BasicViewportUI"); +- +- put("JButton.border", "javax.swing.plaf.basic.BasicBorder"); +- put("JPanel.border", "javax.swing.plaf.basic.PanelBorder"); +- +- put("JToggleButton.border", "javax.swing.plaf.basic.PanelBorder"); +- put("JCheckBox.border", "javax.swing.plaf.basic.PanelBorder"); +- put("JRadioButton.border", "javax.swing.plaf.basic.PanelBorder"); +- +- put("AbstractUndoableEdit.undoText", "Undo"); +- put("AbstractUndoableEdit.redoText", "Redo"); +- } +- +-} +- +- +Index: javax/swing/plaf/basic/BasicDesktopIconUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicDesktopIconUI.java +diff -N javax/swing/plaf/basic/BasicDesktopIconUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicDesktopIconUI.java 6 Sep 2004 16:36:03 -0000 +@@ -0,0 +1,589 @@ ++/* BasicDesktopIconUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.beans.PropertyVetoException; ++import javax.swing.Icon; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JDesktopPane; ++import javax.swing.JInternalFrame; ++import javax.swing.JInternalFrame.JDesktopIcon; ++import javax.swing.SwingConstants; ++import javax.swing.border.Border; ++import javax.swing.event.MouseInputAdapter; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.DesktopIconUI; ++import javax.swing.plaf.DesktopPaneUI; ++ ++ ++/** ++ * This class acts as the UI delegate for JDesktopIcons for the Basic look and feel. ++ */ ++public class BasicDesktopIconUI extends DesktopIconUI ++{ ++ /** ++ * This helper class handles mouse events that occur on the JDesktopIcon. ++ */ ++ public class MouseInputHandler extends MouseInputAdapter ++ { ++ /** The x offset from the MouseEvent coordinates to the top left corner. */ ++ private transient int xOffset; ++ ++ /** The y offset fromt he MouseEvent coordinates to the top left corner. */ ++ private transient int yOffset; ++ ++ /** A cached value of the JDesktopPane that parents this JDesktopIcon. */ ++ private transient JDesktopPane pane; ++ ++ /** ++ * This method is called when the mouse is dragged in the JDesktopIcon. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ Rectangle b = desktopIcon.getBounds(); ++ ++ moveAndRepaint(desktopIcon, b.x + e.getX() - xOffset, ++ b.y + e.getY() - yOffset, b.width, b.height); ++ } ++ ++ /** ++ * This method is called when the mouse is moved in the JDesktopIcon. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ // Nothing to do. ++ } ++ ++ /** ++ * This method is called when the mouse is pressed in the JDesktopIcon. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ xOffset = e.getX(); ++ yOffset = e.getY(); ++ pane = frame.getDesktopPane(); ++ if (pane != null) ++ pane.getDesktopManager().beginDraggingFrame(desktopIcon); ++ } ++ ++ /** ++ * This method is called when the mouse is released in the JDesktopIcon. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ if (pane != null) ++ pane.getDesktopManager().endDraggingFrame(desktopIcon); ++ xOffset = 0; ++ yOffset = 0; ++ } ++ ++ /** ++ * This method moves and repaints the JDesktopIcon to the given bounds. ++ * ++ * @param f The JComponent to move and repaint. ++ * @param newX The new x coordinate. ++ * @param newY The new y coordinate. ++ * @param newWidth The new width. ++ * @param newHeight The new height. ++ */ ++ public void moveAndRepaint(JComponent f, int newX, int newY, int newWidth, ++ int newHeight) ++ { ++ if (pane != null) ++ pane.getDesktopManager().dragFrame(f, newX, newY); ++ else ++ desktopIcon.setBounds(newX, newY, newWidth, newHeight); ++ } ++ } ++ ++ /** ++ * This class acts as the border for the JDesktopIcon. ++ */ ++ private class DesktopIconBorder implements Border ++ { ++ /** The left inset value. */ ++ int left = 10; ++ ++ /** The top inset value. */ ++ int top = 4; ++ ++ /** The right inset value. */ ++ int right = top; ++ ++ /** The bottom inset value. */ ++ int bottom = top; ++ ++ /** ++ * This method returns the insets of the border. ++ * ++ * @param c The Component to find border insets for. ++ * ++ * @return The border insets. ++ */ ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(top, left, bottom, right); ++ } ++ ++ /** ++ * This method returns whether the border is opaque. ++ * ++ * @return Whether the border is opaque. ++ */ ++ public boolean isBorderOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * This method paints the border. ++ * ++ * @param c The Component the border is in. ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate of the Component. ++ * @param y The y coordinate of the Component. ++ * @param width The width of the Component. ++ * @param height The height of the Component. ++ */ ++ public void paintBorder(Component c, Graphics g, int x, int y, int width, ++ int height) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ ++ g.setColor(Color.LIGHT_GRAY); ++ ++ g.fillRect(0, 0, left, height); ++ g.fillRect(0, 0, width, top); ++ g.fillRect(0, height - bottom, width, bottom); ++ g.fillRect(width - right, 0, right, height); ++ ++ g.setColor(Color.BLACK); ++ g.drawRect(0, 0, width - 1, height - 1); ++ ++ int fHeight = height / 4; ++ int hLeft = left / 2; ++ ++ g.setColor(Color.BLACK); ++ g.fillRect(hLeft, fHeight, 2, 2); ++ g.fillRect(hLeft, fHeight * 2, 2, 2); ++ g.fillRect(hLeft, fHeight * 3, 2, 2); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ } ++ ++ /** The static width and height of the iconSize. */ ++ private static final int iconSize = 16; ++ ++ /** ++ * This class represents the default frame icon when none ++ * is supplied by the JInternalFrame. ++ */ ++ static class InternalFrameDefaultMenuIcon implements Icon ++ { ++ /** ++ * This returns the icon height. ++ * ++ * @return The icon height. ++ */ ++ public int getIconHeight() ++ { ++ return iconSize; ++ } ++ ++ /** ++ * This returns the icon width. ++ * ++ * @return The icon width. ++ */ ++ public int getIconWidth() ++ { ++ return iconSize; ++ } ++ ++ /** ++ * This method paints the icon. ++ * ++ * @param c The Component this icon belongs to. ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate to paint at. ++ * @param y The y coordinate to paint at. ++ */ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ ++ g.setColor(Color.BLUE); ++ g.fillRect(0, 0, iconSize, (int) ((double) iconSize / 3) + 1); ++ ++ g.setColor(Color.WHITE); ++ g.fillRect(0, (int) ((double) iconSize / 3), iconSize, iconSize * 5 / 6); ++ ++ g.setColor(Color.GRAY); ++ g.drawRect(0, 0, iconSize, iconSize); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ } ++ ++ /** The default JDesktopIcon width. */ ++ private static final int iconWidth = 160; ++ ++ /** The default JDesktopIcon height */ ++ private static final int iconHeight = 35; ++ ++ /** The JDesktopIcon this UI delegate represents. */ ++ protected JDesktopIcon desktopIcon; ++ ++ /** The JInternalFrame associated with the JDesktopIcon. */ ++ protected JInternalFrame frame; ++ ++ /** The MouseListener responsible for reacting to MouseEvents on the JDesktopIcon. */ ++ private transient MouseInputListener mouseHandler; ++ ++ /** The Button in the JDesktopIcon responsible for deiconifying it. */ ++ private transient BoundButton button; ++ ++ /** The PropertyChangeListener listening to the JDesktopIcon. */ ++ private transient PropertyChangeListener propertyHandler; ++ ++ /** The default icon used when no frame icon is given by the JInternalFrame. */ ++ static Icon defaultIcon = new InternalFrameDefaultMenuIcon(); ++ ++ /** ++ * This is a helper class that is used in JDesktopIcon and gives the Button a predetermined size. ++ */ ++ private class BoundButton extends JButton ++ { ++ /** ++ * Creates a new BoundButton object. ++ * ++ * @param title The title of the button. ++ */ ++ public BoundButton(String title) ++ { ++ super(title); ++ } ++ ++ /** ++ * This method returns a standard size (based on the defaults of the JDesktopIcon) and the insets. ++ * ++ * @return The preferred size of the JDesktopIcon. ++ */ ++ public Dimension getPreferredSize() ++ { ++ Insets insets = desktopIcon.getInsets(); ++ return new Dimension(iconWidth - insets.left - insets.right, ++ iconHeight - insets.top - insets.bottom); ++ } ++ ++ /** ++ * This method returns the minimum size of the button. ++ * ++ * @return The minimum size of the button. ++ */ ++ public Dimension getMinimumSize() ++ { ++ return getPreferredSize(); ++ } ++ ++ /** ++ * This method returns the maximum size of the button. ++ * ++ * @return The maximum size of the button. ++ */ ++ public Dimension getMaximumSize() ++ { ++ return getPreferredSize(); ++ } ++ } ++ ++ /** ++ * Creates a new BasicDesktopIconUI object. ++ */ ++ public BasicDesktopIconUI() ++ { ++ } ++ ++ /** ++ * This method creates a new BasicDesktopIconUI for the given JComponent. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A new BasicDesktopIconUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicDesktopIconUI(); ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install this UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ if (c instanceof JDesktopIcon) ++ { ++ desktopIcon = (JDesktopIcon) c; ++ desktopIcon.setLayout(new BorderLayout()); ++ frame = desktopIcon.getInternalFrame(); ++ ++ installDefaults(); ++ installComponents(); ++ installListeners(); ++ ++ desktopIcon.setOpaque(true); ++ } ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. ++ * ++ * @param c The JComponent to uninstall this UI for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ desktopIcon.setOpaque(false); ++ ++ uninstallListeners(); ++ uninstallComponents(); ++ uninstallDefaults(); ++ ++ frame = null; ++ desktopIcon.setLayout(null); ++ desktopIcon = null; ++ } ++ ++ /** ++ * This method installs the necessary sub components for the JDesktopIcon. ++ */ ++ protected void installComponents() ++ { ++ // Try to create a button based on what the frame's ++ // state is currently ++ button = new BoundButton(frame.getTitle()); ++ button.setHorizontalAlignment(SwingConstants.LEFT); ++ button.setHorizontalTextPosition(SwingConstants.TRAILING); ++ ++ Icon use = frame.getFrameIcon(); ++ if (use == null) ++ use = defaultIcon; ++ button.setIcon(use); ++ ++ desktopIcon.add(button, SwingConstants.CENTER); ++ } ++ ++ /** ++ * This method uninstalls the sub components for the JDesktopIcon. ++ */ ++ protected void uninstallComponents() ++ { ++ desktopIcon.remove(button); ++ ++ button = null; ++ } ++ ++ /** ++ * This method installs the listeners needed by this UI. ++ */ ++ protected void installListeners() ++ { ++ mouseHandler = createMouseInputListener(); ++ ++ desktopIcon.addMouseMotionListener(mouseHandler); ++ desktopIcon.addMouseListener(mouseHandler); ++ ++ propertyHandler = new PropertyChangeListener() ++ { ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JInternalFrame.TITLE_PROPERTY)) ++ button.setText(desktopIcon.getInternalFrame().getTitle()); ++ else if (e.getPropertyName().equals(JInternalFrame.FRAME_ICON_PROPERTY)) ++ { ++ Icon use = desktopIcon.getInternalFrame().getFrameIcon(); ++ if (use == null) ++ use = defaultIcon; ++ button.setIcon(use); ++ } ++ desktopIcon.revalidate(); ++ desktopIcon.repaint(); ++ } ++ }; ++ frame.addPropertyChangeListener(propertyHandler); ++ ++ button.addActionListener(new ActionListener() ++ { ++ public void actionPerformed(ActionEvent e) ++ { ++ deiconize(); ++ } ++ }); ++ } ++ ++ /** ++ * This method uninstalls the listeners needed by the UI. ++ */ ++ protected void uninstallListeners() ++ { ++ // button is nulled so no need to remove it. ++ ++ frame.removePropertyChangeListener(propertyHandler); ++ propertyHandler = null; ++ ++ desktopIcon.removeMouseMotionListener(mouseHandler); ++ desktopIcon.removeMouseListener(mouseHandler); ++ } ++ ++ /** ++ * This method installs the defaults for the JDesktopIcon. ++ */ ++ protected void installDefaults() ++ { ++ // FIXME: Move border to defaults. ++ desktopIcon.setBorder(new DesktopIconBorder()); ++ } ++ ++ /** ++ * This method uninstalls the defaults for the JDesktopIcon. ++ */ ++ protected void uninstallDefaults() ++ { ++ desktopIcon.setBorder(null); ++ } ++ ++ /** ++ * This method creates a new MouseInputListener for the JDesktopIcon. ++ * ++ * @return A new MouseInputListener. ++ */ ++ protected MouseInputListener createMouseInputListener() ++ { ++ return new MouseInputHandler(); ++ } ++ ++ /** ++ * This method returns the preferred size for the given JComponent. ++ * ++ * @param c The JComponent to find a preferred size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return new Dimension(iconWidth, iconHeight); ++ } ++ ++ /** ++ * This method returns the minimum size for the given JComponent. ++ * ++ * @param c The JComponent to find a minimum size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the maximum size for the given JComponent. ++ * ++ * @param c The JComponent to find a maximum size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the insets of the given JComponent. ++ * ++ * @param c The JComponent to find insets for. ++ * ++ * @return The insets of the given JComponent. ++ */ ++ public Insets getInsets(JComponent c) ++ { ++ return c.getInsets(); ++ } ++ ++ /** ++ * This method deiconizes the JInternalFrame associated with the JDesktopIcon. ++ */ ++ public void deiconize() ++ { ++ try ++ { ++ frame.setIcon(false); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicDesktopPaneUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicDesktopPaneUI.java +diff -N javax/swing/plaf/basic/BasicDesktopPaneUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicDesktopPaneUI.java 6 Sep 2004 16:36:04 -0000 +@@ -0,0 +1,459 @@ ++/* BasicDesktopPaneUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.event.ActionEvent; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyVetoException; ++import javax.swing.AbstractAction; ++import javax.swing.DefaultDesktopManager; ++import javax.swing.DesktopManager; ++import javax.swing.JComponent; ++import javax.swing.JDesktopPane; ++import javax.swing.JInternalFrame; ++import javax.swing.JInternalFrame.JDesktopIcon; ++import javax.swing.KeyStroke; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.MouseInputAdapter; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.DesktopIconUI; ++import javax.swing.plaf.DesktopPaneUI; ++ ++ ++/** ++ * This class is the UI delegate for JDesktopPane for the Basic look and feel. ++ */ ++public class BasicDesktopPaneUI extends DesktopPaneUI ++{ ++ /** ++ * This helper class is used to handle key events that cause JInternalFrames ++ * to be closed. ++ */ ++ protected class CloseAction extends AbstractAction ++ { ++ /** ++ * This method is called when the action is performed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (desktop.getSelectedFrame() != null) ++ { ++ try ++ { ++ desktop.getSelectedFrame().setClosed(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ ++ /** ++ * This method returns whether the action is enabled. ++ * ++ * @return Whether the action is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ if (desktop.getSelectedFrame() != null) ++ return desktop.getSelectedFrame().isClosable(); ++ return false; ++ } ++ } ++ ++ /** ++ * This helper class is used to handle key events that cause JInternalFrames ++ * to be maximized. ++ */ ++ protected class MaximizeAction extends AbstractAction ++ { ++ /** ++ * This method is called when the action is performed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (desktop.getSelectedFrame() != null) ++ { ++ try ++ { ++ desktop.getSelectedFrame().setMaximum(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ ++ /** ++ * This method returns whether the action is enabled. ++ * ++ * @return Whether the action is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ if (desktop.getSelectedFrame() != null) ++ return desktop.getSelectedFrame().isMaximizable(); ++ return false; ++ } ++ } ++ ++ /** ++ * This helper class is used to handle key events that cause JInternalFrames ++ * to be minimized. ++ */ ++ protected class MinimizeAction extends AbstractAction ++ { ++ /** ++ * This method is called when the action is performed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (desktop.getSelectedFrame() != null) ++ { ++ try ++ { ++ desktop.getSelectedFrame().setIcon(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ ++ /** ++ * This method returns whether the action is enabled. ++ * ++ * @return Whether the action is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ if (desktop.getSelectedFrame() != null) ++ return desktop.getSelectedFrame().isIconifiable(); ++ return false; ++ } ++ } ++ ++ /** ++ * This helper class is used to handle key events that pass the SELECTED ++ * property to the next JInternalFrame in the JDesktopPane's list of ++ * children. ++ */ ++ protected class NavigateAction extends AbstractAction ++ { ++ /** ++ * This method is called when the action is performed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ // This is supposed to set the next selected frame. ++ JInternalFrame[] frames = desktop.getAllFrames(); ++ if (frames.length == 0) ++ return; ++ ++ JInternalFrame sFrame = frames[0]; ++ if (desktop.getSelectedFrame() != null) ++ sFrame = desktop.getSelectedFrame(); ++ ++ int i = 0; ++ for (; i < frames.length; i++) ++ if (frames[i] == sFrame) ++ break; ++ ++ // FIXME: Navigate actions go reverse too. ++ if (i == frames.length) ++ i = 0; ++ ++ desktop.setSelectedFrame(frames[i]); ++ } ++ ++ /** ++ * This method returns whether the action is enabled. ++ * ++ * @return Whether this action is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ // Always true. ++ return true; ++ } ++ } ++ ++ /** ++ * This helper class is used to restore the JInternalFrame to its original ++ * size before maximizing or iconifying. ++ */ ++ protected class OpenAction extends AbstractAction ++ { ++ /** ++ * This method is called when the action is performed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ JInternalFrame frame = desktop.getSelectedFrame(); ++ if (frame != null) ++ { ++ try ++ { ++ if (frame.isIcon()) ++ frame.setIcon(false); ++ else if (frame.isMaximum()) ++ frame.setMaximum(false); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ ++ /** ++ * This method returns whether the action is enabled. ++ * ++ * @return Whether this action is enabled. ++ */ ++ public boolean isEnabled() ++ { ++ // JInternalFrames are always restorable. ++ return true; ++ } ++ } ++ ++ /** The KeyStroke associated with closing JInternalFrames. */ ++ protected KeyStroke closeKey; ++ ++ /** The KeyStroke associated with maximizing JInternalFrames. */ ++ protected KeyStroke maximizeKey; ++ ++ /** The KeyStroke associated with minimizing JInternalFrames. */ ++ protected KeyStroke minimizeKey; ++ ++ /** ++ * The KeyStroke associated with navigating (forward?) through ++ * JInternalFrames. ++ */ ++ protected KeyStroke navigateKey; ++ ++ /** ++ * The KeyStroke associated with navigating (backward?) through ++ * JInternalFrames. ++ */ ++ protected KeyStroke navigateKey2; ++ ++ /** The default desktop manager used with JDesktopPane. */ ++ protected DesktopManager desktopManager; ++ ++ /** The JDesktopPane this UI is used with. */ ++ protected JDesktopPane desktop; ++ ++ /** ++ * Creates a new BasicDesktopPaneUI object. ++ */ ++ public BasicDesktopPaneUI() ++ { ++ } ++ ++ /** ++ * This method creates a BasicDesktopPaneUI for the given JComponent. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A new BasicDesktopPaneUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicDesktopPaneUI(); ++ } ++ ++ /** ++ * This method returns the maximum size for the given JComponent. ++ * ++ * @param c The JComponent to find a maximum size for. ++ * ++ * @return The maximum size for the given JComponent. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the minimum size for the given JComponent. ++ * ++ * @param c The JComponent to find a minimum size for. ++ * ++ * @return The minimum size for the given JComponent. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size for the given JComponent. ++ * ++ * @param c The JComponent to find a preferred size for. ++ * ++ * @return The preferred size for the given JComponent. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ // return null because JDesktopPanes don't have preferred sizes. ++ return null; ++ } ++ ++ /** ++ * This method installs the defaults for the JDesktopPane provided by the ++ * current look and feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ desktop.setBackground(defaults.getColor("Desktop.background")); ++ } ++ ++ /** ++ * This method installs the desktop manager for the JDesktopPane. ++ */ ++ protected void installDesktopManager() ++ { ++ desktopManager = new DefaultDesktopManager(); ++ desktop.setDesktopManager(desktopManager); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the JDesktopPane. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: create actions and keystrokes. ++ registerKeyboardAction(); ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install this UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ if (c instanceof JDesktopPane) ++ { ++ desktop = (JDesktopPane) c; ++ ++ installDefaults(); ++ installDesktopManager(); ++ installKeyboardActions(); ++ } ++ } ++ ++ /** ++ * This method registers the actions to the appropriate Action and Input ++ * maps. ++ */ ++ protected void registerKeyboardAction() ++ { ++ // FIXME: Do the binding. ++ // XXX: the gtk windows tend to intercept a lot of the ++ // key events for themselves. must figure a way past that ++ // before binding ++ } ++ ++ /** ++ * This method reverses the work done by the installDefaults method. ++ */ ++ protected void uninstallDefaults() ++ { ++ desktop.setBackground(null); ++ } ++ ++ /** ++ * This method reverses the work done by the installDesktopManager method. ++ */ ++ protected void uninstallDesktopManager() ++ { ++ desktopManager = null; ++ desktop.setDesktopManager(null); ++ } ++ ++ /** ++ * This method reverses the work done by the installKeyboardActions method. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ unregisterKeyboardActions(); ++ // FIXME: null the actions and keystrokes. ++ } ++ ++ /** ++ * This method reverses the work done by the registerKeyboardActions method. ++ */ ++ protected void unregisterKeyboardActions() ++ { ++ // FIXME: unmap the keystrokes ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. It should reverse ++ * all the work done by the installUI method. ++ * ++ * @param c The JComponent to uninstall this UI for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallDesktopManager(); ++ uninstallDefaults(); ++ ++ desktop = null; ++ } ++} +Index: javax/swing/plaf/basic/BasicFormattedTextFieldUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicFormattedTextFieldUI.java +diff -N javax/swing/plaf/basic/BasicFormattedTextFieldUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicFormattedTextFieldUI.java 6 Sep 2004 16:36:04 -0000 +@@ -0,0 +1,62 @@ ++/* BasicFormattedTextFieldUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.plaf.basic; ++ ++import javax.swing.JComponent; ++import javax.swing.plaf.ComponentUI; ++ ++/** ++ * @since 1.4 ++ */ ++public class BasicFormattedTextFieldUI extends BasicTextFieldUI ++{ ++ public BasicFormattedTextFieldUI() ++ { ++ } ++ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicFormattedTextFieldUI(); ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return "FormattedTextField"; ++ } ++} +\ No newline at end of file +Index: javax/swing/plaf/basic/BasicGraphicsUtils.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicGraphicsUtils.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicGraphicsUtils.java +--- javax/swing/plaf/basic/BasicGraphicsUtils.java 1 Aug 2003 20:10:22 -0000 1.4 ++++ javax/swing/plaf/basic/BasicGraphicsUtils.java 6 Sep 2004 16:36:04 -0000 +@@ -45,11 +45,9 @@ + import java.awt.Graphics2D; + import java.awt.Insets; + import java.awt.Rectangle; +- + import java.awt.font.FontRenderContext; + import java.awt.font.LineMetrics; + import java.awt.font.TextLayout; +- + import java.awt.geom.Rectangle2D; + + import javax.swing.AbstractButton; +@@ -595,11 +593,9 @@ + Rectangle iconRect = new Rectangle(); + Rectangle textRect = new Rectangle(); + Insets insets = b.getInsets(); ++ Insets margin = b.getMargin(); + +- /* For determining the ideal size, do not assume a size restriction. */ +- viewRect = new Rectangle(0, 0, +- /* width */ Integer.MAX_VALUE, +- /* height */ Integer.MAX_VALUE); ++ viewRect = new Rectangle(); + + /* java.awt.Toolkit.getFontMetrics is deprecated. However, it + * seems not obvious how to get to the correct FontMetrics object +@@ -613,14 +609,13 @@ + b.getToolkit().getFontMetrics(b.getFont()), // see comment above + b.getText(), + b.getIcon(), +- b.getVerticalAlignment(), ++ b.getVerticalAlignment(), + b.getHorizontalAlignment(), + b.getVerticalTextPosition(), + b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, + textIconGap); + +- + /* +------------------------+ +------------------------+ + * | | | | + * | ICON | | CONTENTCONTENTCONTENT | +@@ -628,9 +623,14 @@ + * | TEXTTEXTTEXT | | CONTENTCONTENTCONTENT | + * +------------------------+ +------------------------+ + */ ++ + contentRect = textRect.union(iconRect); + +- return new Dimension(insets.left + contentRect.width + insets.right, +- insets.top + contentRect.height + insets.bottom); ++ return new Dimension(insets.left + margin.left ++ + contentRect.width ++ + insets.right + margin.right, ++ insets.top + margin.top ++ + contentRect.height ++ + insets.bottom + margin.bottom); + } + } +Index: javax/swing/plaf/basic/BasicIconFactory.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicIconFactory.java,v +retrieving revision 1.2 +diff -u -r1.2 BasicIconFactory.java +--- javax/swing/plaf/basic/BasicIconFactory.java 10 May 2003 08:14:36 -0000 1.2 ++++ javax/swing/plaf/basic/BasicIconFactory.java 6 Sep 2004 16:36:04 -0000 +@@ -39,7 +39,14 @@ + package javax.swing.plaf.basic; + + import java.io.Serializable; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Graphics; ++import java.awt.Polygon; ++import javax.swing.AbstractButton; + import javax.swing.Icon; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + /** + * STUBBED + */ +@@ -47,39 +54,183 @@ + { + static final long serialVersionUID = 5605588811185324383L; + ++ static private class DummyIcon ++ implements Icon ++ { ++ public int getIconHeight() { return 10; } ++ public int getIconWidth() { return 10; } ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ Color save = g.getColor(); ++ g.setColor(c.getForeground()); ++ g.drawRect(x, y, 10, 10); ++ g.setColor(save); ++ } ++ } ++ ++ + public BasicIconFactory() + { + } + public static Icon getMenuItemCheckIcon() + { +- return null; ++ return new DummyIcon(); + } + public static Icon getMenuItemArrowIcon() + { +- return null; ++ return new DummyIcon(); + } + public static Icon getMenuArrowIcon() + { +- return null; ++ return new Icon() ++ { ++ public int getIconHeight() ++ { ++ return 12; ++ } ++ ++ public int getIconWidth() ++ { ++ return 12; ++ } ++ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ ++ Color saved = g.getColor(); ++ ++ g.setColor(Color.BLACK); ++ ++ g.fillPolygon(new Polygon(new int[] { 3, 9, 3 }, ++ new int[] { 2, 6, 10 }, ++ 3)); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ }; + } ++ + public static Icon getCheckBoxIcon() + { +- return null; ++ return new Icon() ++ { ++ public int getIconHeight() ++ { ++ return 10; ++ } ++ public int getIconWidth() ++ { ++ return 10; ++ } ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ if (c instanceof AbstractButton) ++ { ++ UIDefaults defaults; ++ defaults = UIManager.getLookAndFeelDefaults(); ++ Color hi = defaults.getColor("CheckBox.highlight"); ++ Color low = defaults.getColor("CheckBox.darkShadow"); ++ Color sel = defaults.getColor("CheckBox.foreground"); ++ Color dim = defaults.getColor("CheckBox.shadow"); ++ Polygon check = new Polygon(new int[] {x+3, x+3, x+8}, ++ new int[] {y+5, y+9, y+3}, 3); ++ AbstractButton b = (AbstractButton) c; ++ Color saved = g.getColor(); ++ if (b.isEnabled()) ++ { ++ g.setColor(low); ++ g.drawRect(x, y, 10, 10); ++ g.setColor(hi); ++ g.drawRect(x+1, y+1, 10, 10); ++ if (b.isSelected()) ++ { ++ g.setColor(sel); ++ if (b.isSelected()) ++ { ++ g.drawLine(x+3, y+5, x+3, y+8); ++ g.drawLine(x+4, y+5, x+4, y+8); ++ g.drawLine(x+3, y+8, x+8, y+3); ++ g.drawLine(x+4, y+8, x+8, y+3); ++ } ++ } ++ } ++ else ++ { ++ g.setColor(hi); ++ g.drawRect(x, y, 10, 10); ++ if (b.isSelected()) ++ { ++ g.drawLine(x+3, y+5, x+3, y+9); ++ g.drawLine(x+3, y+9, x+8, y+3); ++ } ++ } ++ g.setColor(saved); ++ } ++ } ++ }; + } ++ + public static Icon getRadioButtonIcon() + { +- return null; ++ return new Icon() ++ { ++ public int getIconHeight() ++ { ++ return 12; ++ } ++ public int getIconWidth() ++ { ++ return 12; ++ } ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ UIDefaults defaults; ++ defaults = UIManager.getLookAndFeelDefaults(); ++ Color hi = defaults.getColor("RadioButton.highlight"); ++ Color low = defaults.getColor("RadioButton.darkShadow"); ++ Color sel = defaults.getColor("RadioButton.foreground"); ++ Color dim = defaults.getColor("RadioButton.shadow"); ++ ++ if (c instanceof AbstractButton) ++ { ++ AbstractButton b = (AbstractButton) c; ++ Color saved = g.getColor(); ++ if (b.isEnabled()) ++ { ++ g.setColor(low); ++ g.drawOval(x, y, 12, 12); ++ g.setColor(hi); ++ g.drawOval(x+1, y+1, 12, 12); ++ if (b.isSelected()) ++ { ++ g.setColor(sel); ++ g.fillOval(x+4, y+4, 6, 6); ++ } ++ } ++ else ++ { ++ g.setColor(hi); ++ g.drawOval(x, y, 12, 12); ++ if (b.isSelected()) ++ g.fillOval(x+4, y+4, 6, 6); ++ } ++ g.setColor(saved); ++ } ++ } ++ }; + } + public static Icon getCheckBoxMenuItemIcon() + { +- return null; ++ return getCheckBoxIcon(); + } + public static Icon getRadioButtonMenuItemIcon() + { +- return null; ++ return getRadioButtonIcon(); + } + public static Icon createEmptyFrameIcon() + { +- return null; ++ return new DummyIcon(); + } + } // class BasicIconFactory +Index: javax/swing/plaf/basic/BasicInternalFrameTitlePane.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicInternalFrameTitlePane.java +diff -N javax/swing/plaf/basic/BasicInternalFrameTitlePane.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicInternalFrameTitlePane.java 6 Sep 2004 16:36:04 -0000 +@@ -0,0 +1,1004 @@ ++/* BasicInternalFrameTitlePane.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Polygon; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.KeyEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.beans.PropertyVetoException; ++import javax.swing.AbstractAction; ++import javax.swing.Action; ++import javax.swing.Icon; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JInternalFrame; ++import javax.swing.JLabel; ++import javax.swing.JMenu; ++import javax.swing.JMenuBar; ++import javax.swing.JMenuItem; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.event.InternalFrameEvent; ++import javax.swing.UIManager; ++import javax.swing.UIDefaults; ++ ++ ++/** ++ * This class acts as a titlebar for JInternalFrames. ++ */ ++public class BasicInternalFrameTitlePane extends JComponent ++{ ++ /** ++ * The Action responsible for closing the JInternalFrame. ++ */ ++ protected class CloseAction extends AbstractAction ++ { ++ /** ++ * This method is called when something closes the JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (frame.isClosable()) ++ { ++ try ++ { ++ frame.setClosed(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ } ++ ++ /** ++ * This Action is responsible for iconifying the JInternalFrame. ++ */ ++ protected class IconifyAction extends AbstractAction ++ { ++ /** ++ * This method is called when the user wants to iconify the ++ * JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (frame.isIconifiable() && ! frame.isIcon()) ++ { ++ try ++ { ++ frame.setIcon(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ } ++ ++ /** ++ * This Action is responsible for maximizing the JInternalFrame. ++ */ ++ protected class MaximizeAction extends AbstractAction ++ { ++ /** ++ * This method is called when the user wants to maximize the ++ * JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ try ++ { ++ if (frame.isMaximizable() && ! frame.isMaximum()) ++ frame.setMaximum(true); ++ else if (frame.isMaximum()) ++ frame.setMaximum(false); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ ++ /** ++ * This Action is responsible for dragging the JInternalFrame. ++ */ ++ protected class MoveAction extends AbstractAction ++ { ++ /** ++ * This method is called when the user wants to drag the JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ // FIXME: Implement keyboard driven? move actions. ++ } ++ } ++ ++ /** ++ * This Action is responsible for restoring the JInternalFrame. Restoring ++ * the JInternalFrame is the same as setting the maximum property to false. ++ */ ++ protected class RestoreAction extends AbstractAction ++ { ++ /** ++ * This method is called when the user wants to restore the ++ * JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (frame.isMaximum()) ++ { ++ try ++ { ++ frame.setMaximum(false); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ } ++ ++ /** ++ * This action is responsible for sizing the JInternalFrame. ++ */ ++ protected class SizeAction extends AbstractAction ++ { ++ /** ++ * This method is called when the user wants to resize the JInternalFrame. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ // FIXME: Not sure how size actions should be handled. ++ } ++ } ++ ++ /** ++ * This class is responsible for handling property change events from the ++ * JInternalFrame and adjusting the Title Pane as necessary. ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called when a PropertyChangeEvent is received by the ++ * Title Pane. ++ * ++ * @param evt The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ // The title and frameIcon are taken care of during painting time. ++ // The only other thing this will care about are the "is----izable" ++ // properties. So we call enable actions to properly handle the ++ // buttons and menu items for us. ++ enableActions(); ++ } ++ } ++ ++ /** ++ * This class acts as the MenuBar for the TitlePane. Clicking on the Frame ++ * Icon in the top left corner will activate it. ++ */ ++ protected class SystemMenuBar extends JMenuBar ++ { ++ /** ++ * This method returns true if it can receive focus. ++ * ++ * @return True if this Component can receive focus. ++ */ ++ public boolean isFocusTransversable() ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns true if this Component is expected to paint all of ++ * itself. ++ * ++ * @return True if this Component is expect to paint all of itself. ++ */ ++ public boolean isOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * This method paints this Component. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ Icon frameIcon = frame.getFrameIcon(); ++ if (frameIcon == null) ++ frameIcon = BasicDesktopIconUI.defaultIcon; ++ frameIcon.paintIcon(this, g, 0, 0); ++ } ++ ++ /** ++ * This method requests that focus be given to this Component. ++ */ ++ public void requestFocus() ++ { ++ super.requestFocus(); ++ } ++ } ++ ++ /** ++ * This class acts as the Layout Manager for the TitlePane. ++ */ ++ protected class TitlePaneLayout implements LayoutManager ++ { ++ /** ++ * This method is called when adding a Component to the Container. ++ * ++ * @param name The name to reference the added Component by. ++ * @param c The Component to add. ++ */ ++ public void addLayoutComponent(String name, Component c) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method is called to lay out the children of the Title Pane. ++ * ++ * @param c The Container to lay out. ++ */ ++ public void layoutContainer(Container c) ++ { ++ enableActions(); ++ ++ Insets insets = c.getInsets(); ++ int width = c.getBounds().width - insets.left - insets.right; ++ int height = c.getBounds().height - insets.top - insets.bottom; ++ ++ // MenuBar is always present and located at the top left corner. ++ Dimension menupref = menuBar.getPreferredSize(); ++ menuBar.setBounds(insets.left, insets.top, menupref.width, height); ++ ++ int loc = width + insets.left; ++ ++ Insets i = closeButton.getInsets(); ++ Dimension prefs = new Dimension(iconSize + i.left + i.right, ++ iconSize + i.top + i.bottom); ++ int top = insets.top + (height - prefs.height) / 2; ++ if (closeAction.isEnabled()) ++ { ++ loc -= prefs.width; ++ closeButton.setVisible(true); ++ closeButton.setBounds(loc, top, prefs.width, prefs.height); ++ } ++ else ++ closeButton.setVisible(false); ++ ++ if (maximizeAction.isEnabled()) ++ { ++ loc -= prefs.width; ++ maxButton.setVisible(true); ++ maxButton.setBounds(loc, top, prefs.width, prefs.height); ++ } ++ else ++ maxButton.setVisible(false); ++ ++ if (iconifyAction.isEnabled()) ++ { ++ loc -= prefs.width; ++ iconButton.setVisible(true); ++ iconButton.setBounds(loc, top, prefs.width, prefs.height); ++ } ++ else ++ iconButton.setVisible(false); ++ ++ if (title != null) ++ title.setBounds(insets.left + menupref.width, insets.top, ++ loc - menupref.width - insets.left, height); ++ } ++ ++ /** ++ * This method returns the minimum size of the given Container given the ++ * children that it has. ++ * ++ * @param c The Container to get a minimum size for. ++ * ++ * @return The minimum size of the Container. ++ */ ++ public Dimension minimumLayoutSize(Container c) ++ { ++ return preferredLayoutSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size of the given Container taking ++ * into account the children that it has. ++ * ++ * @param c The Container to lay out. ++ * ++ * @return The preferred size of the Container. ++ */ ++ public Dimension preferredLayoutSize(Container c) ++ { ++ Insets frameInsets = frame.getInsets(); ++ ++ // Height is the max of the preferredHeights of all components ++ // inside the pane ++ int height = 0; ++ int width = 0; ++ Dimension d; ++ ++ Component[] components = BasicInternalFrameTitlePane.this.getComponents(); ++ for (int i = 0; i < components.length; i++) ++ { ++ d = components[i].getPreferredSize(); ++ height = Math.max(height, d.height); ++ width += d.width; ++ } ++ ++ Insets insets = BasicInternalFrameTitlePane.this.getInsets(); ++ height += insets.top + insets.bottom; ++ ++ return new Dimension(width, height); ++ } ++ ++ /** ++ * This method is called when removing a Component from the Container. ++ * ++ * @param c The Component to remove. ++ */ ++ public void removeLayoutComponent(Component c) ++ { ++ } ++ } ++ ++ /** ++ * This helper class is used to create the minimize, maximize and close ++ * buttons in the top right corner of the Title Pane. These buttons are ++ * special since they cannot be given focus and have no border. ++ */ ++ private class PaneButton extends JButton ++ { ++ /** ++ * Creates a new PaneButton object with the given Action. ++ * ++ * @param a The Action that the button uses. ++ */ ++ public PaneButton(Action a) ++ { ++ super(a); ++ setMargin(new Insets(0, 0, 0, 0)); ++ setBorder(null); ++ } ++ ++ /** ++ * This method returns true if the Component can be focused. ++ * ++ * @return false. ++ */ ++ public boolean isFocusable() ++ { ++ // These buttons cannot be given focus. ++ return false; ++ } ++ } ++ ++ /** The action command for the Close action. */ ++ protected static String CLOSE_CMD = "Close"; ++ ++ /** The action command for the Minimize action. */ ++ protected static String ICONIFY_CMD = "Minimize"; ++ ++ /** The action command for the Maximize action. */ ++ protected static String MAXIMIZE_CMD = "Maximize"; ++ ++ /** The action command for the Move action. */ ++ protected static String MOVE_CMD = "Move"; ++ ++ /** The action command for the Restore action. */ ++ protected static String RESTORE_CMD = "Restore"; ++ ++ /** The action command for the Size action. */ ++ protected static String SIZE_CMD = "Size"; ++ ++ /** The action associated with closing the JInternalFrame. */ ++ protected Action closeAction; ++ ++ /** The action associated with iconifying the JInternalFrame. */ ++ protected Action iconifyAction; ++ ++ /** The action associated with maximizing the JInternalFrame. */ ++ protected Action maximizeAction; ++ ++ /** The action associated with moving the JInternalFrame. */ ++ protected Action moveAction; ++ ++ /** The action associated with restoring the JInternalFrame. */ ++ protected Action restoreAction; ++ ++ /** The action associated with resizing the JInternalFrame. */ ++ protected Action sizeAction; ++ ++ /** The button that closes the JInternalFrame. */ ++ protected JButton closeButton; ++ ++ /** The button that iconifies the JInternalFrame. */ ++ protected JButton iconButton; ++ ++ /** The button that maximizes the JInternalFrame. */ ++ protected JButton maxButton; ++ ++ /** Active background color. */ ++ protected Color activeBGColor; ++ ++ /** Active foreground color. */ ++ protected Color activeFGColor; ++ ++ /** Inactive background color. */ ++ protected Color inactiveBGColor; ++ ++ /** Inactive foreground color. */ ++ protected Color inactiveFGColor; ++ ++ // FIXME: These icons need to be moved to MetalIconFactory. ++ ++ /** The size of the icons in the buttons. */ ++ private static final int iconSize = 16; ++ ++ /** The icon displayed in the close button. */ ++ protected Icon closeIcon = new Icon() ++ { ++ public int getIconHeight() ++ { ++ return iconSize; ++ } ++ ++ public int getIconWidth() ++ { ++ return iconSize; ++ } ++ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ int four = iconSize / 4; ++ int six = iconSize * 6 / 16; ++ int ten = iconSize * 10 / 16; ++ int twelve = iconSize * 12 / 16; ++ ++ Polygon a = new Polygon(new int[] { four, six, ten, twelve }, ++ new int[] { six, four, twelve, ten }, 4); ++ Polygon b = new Polygon(new int[] { four, six, ten, twelve }, ++ new int[] { ten, twelve, four, six }, 4); ++ ++ g.fillPolygon(a); ++ g.fillPolygon(b); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ }; ++ ++ // FIXME: Create new icon. ++ ++ /** The icon displayed in the restore button. */ ++ protected Icon minIcon; ++ ++ /** The icon displayed in the maximize button. */ ++ protected Icon maxIcon = new Icon() ++ { ++ public int getIconHeight() ++ { ++ return iconSize; ++ } ++ ++ public int getIconWidth() ++ { ++ return iconSize; ++ } ++ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ int four = iconSize / 4; ++ int two = four / 2; ++ int six = iconSize * 6 / 16; ++ int eight = four * 2; ++ ++ g.fillRect(four, four, eight, two); ++ g.drawRect(four, six, eight, six); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ }; ++ ++ /** The icon displayed in the iconify button. */ ++ protected Icon iconIcon = new Icon() ++ { ++ public int getIconHeight() ++ { ++ return iconSize; ++ } ++ ++ public int getIconWidth() ++ { ++ return iconSize; ++ } ++ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.fillRect(iconSize / 4, iconSize * 10 / 16, iconSize / 2, iconSize / 8); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ }; ++ ++ /** The JInternalFrame that this TitlePane is used in. */ ++ protected JInternalFrame frame; ++ ++ /** The JMenuBar that is located at the top left of the Title Pane. */ ++ protected JMenuBar menuBar; ++ ++ /** The JMenu inside the menuBar. */ ++ protected JMenu windowMenu; ++ ++ /** ++ * The text color of the TitlePane when the JInternalFrame is not selected. ++ */ ++ protected Color notSelectedTextColor; ++ ++ /** ++ * The background color of the TitlePane when the JInternalFrame is not ++ * selected. ++ */ ++ protected Color notSelectedTitleColor; ++ ++ /** The text color of the titlePane when the JInternalFrame is selected. */ ++ protected Color selectedTextColor; ++ ++ /** ++ * The background color of the TitlePane when the JInternalFrame is ++ * selected. ++ */ ++ protected Color selectedTitleColor; ++ ++ /** The Property Change listener that listens to the JInternalFrame. */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** ++ * The label used to display the title. This label is not added to the ++ * TitlePane. ++ */ ++ private transient JLabel title; ++ ++ /** ++ * Creates a new BasicInternalFrameTitlePane object that is used in the ++ * given JInternalFrame. ++ * ++ * @param f The JInternalFrame this BasicInternalFrameTitlePane will be used ++ * in. ++ */ ++ public BasicInternalFrameTitlePane(JInternalFrame f) ++ { ++ frame = f; ++ setLayout(createLayout()); ++ title = new JLabel(); ++ title.setHorizontalAlignment(SwingConstants.LEFT); ++ title.setHorizontalTextPosition(SwingConstants.LEFT); ++ title.setOpaque(false); ++ setOpaque(true); ++ ++ setBackground(Color.LIGHT_GRAY); ++ ++ installTitlePane(); ++ } ++ ++ /** ++ * This method installs the TitlePane onto the JInternalFrameTitlePane. It ++ * also creates any children components that need to be created and adds ++ * listeners to the appropriate components. ++ */ ++ protected void installTitlePane() ++ { ++ installDefaults(); ++ installListeners(); ++ createActions(); ++ ++ assembleSystemMenu(); ++ ++ createButtons(); ++ setButtonIcons(); ++ addSubComponents(); ++ enableActions(); ++ } ++ ++ /** ++ * This method adds the sub components to the TitlePane. ++ */ ++ protected void addSubComponents() ++ { ++ add(menuBar); ++ ++ add(closeButton); ++ add(iconButton); ++ add(maxButton); ++ } ++ ++ /** ++ * This method creates the actions that are used to manipulate the ++ * JInternalFrame. ++ */ ++ protected void createActions() ++ { ++ closeAction = new CloseAction(); ++ closeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, CLOSE_CMD); ++ ++ iconifyAction = new IconifyAction(); ++ iconifyAction.putValue(AbstractAction.ACTION_COMMAND_KEY, ICONIFY_CMD); ++ ++ maximizeAction = new MaximizeAction(); ++ maximizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MAXIMIZE_CMD); ++ ++ sizeAction = new SizeAction(); ++ sizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, SIZE_CMD); ++ ++ restoreAction = new RestoreAction(); ++ restoreAction.putValue(AbstractAction.ACTION_COMMAND_KEY, RESTORE_CMD); ++ ++ moveAction = new MoveAction(); ++ moveAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MOVE_CMD); ++ } ++ ++ /** ++ * This method is used to install the listeners. ++ */ ++ protected void installListeners() ++ { ++ propertyChangeListener = new PropertyChangeHandler(); ++ frame.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * This method is used to uninstall the listeners. ++ */ ++ protected void uninstallListeners() ++ { ++ frame.removePropertyChangeListener(propertyChangeListener); ++ propertyChangeListener = null; ++ } ++ ++ /** ++ * This method installs the defaults determined by the look and feel. ++ */ ++ protected void installDefaults() ++ { ++ // FIXME: move icons to defaults. ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ setFont(defaults.getFont("InternalFrame.titleFont")); ++ activeFGColor = defaults.getColor("InternalFrame.activeTitleForeground"); ++ activeBGColor = defaults.getColor("InternalFrame.activeTitleBackground"); ++ inactiveFGColor = defaults.getColor("InternalFrame.inactiveTitleForeground"); ++ inactiveBGColor = defaults.getColor("InternalFrame.inactiveTitleBackground"); ++ } ++ ++ /** ++ * This method uninstalls the defaults. ++ */ ++ protected void uninstallDefaults() ++ { ++ setFont(null); ++ activeFGColor = null; ++ activeBGColor = null; ++ inactiveFGColor = null; ++ inactiveBGColor = null; ++ } ++ ++ /** ++ * This method creates the buttons used in the TitlePane. ++ */ ++ protected void createButtons() ++ { ++ closeButton = new PaneButton(closeAction); ++ closeButton.setOpaque(false); ++ ++ iconButton = new PaneButton(iconifyAction); ++ iconButton.setOpaque(false); ++ ++ maxButton = new PaneButton(maximizeAction); ++ maxButton.setOpaque(false); ++ } ++ ++ /** ++ * This method sets the icons in the buttons. ++ */ ++ protected void setButtonIcons() ++ { ++ closeButton.setIcon(closeIcon); ++ iconButton.setIcon(iconIcon); ++ maxButton.setIcon(maxIcon); ++ } ++ ++ /** ++ * This method creates the MenuBar used in the TitlePane. ++ */ ++ protected void assembleSystemMenu() ++ { ++ menuBar = createSystemMenuBar(); ++ windowMenu = createSystemMenu(); ++ ++ menuBar.add(windowMenu); ++ ++ addSystemMenuItems(windowMenu); ++ enableActions(); ++ } ++ ++ /** ++ * This method adds the MenuItems to the given JMenu. ++ * ++ * @param systemMenu The JMenu to add MenuItems to. ++ */ ++ protected void addSystemMenuItems(JMenu systemMenu) ++ { ++ JMenuItem tmp; ++ ++ tmp = new JMenuItem(RESTORE_CMD); ++ tmp.addActionListener(restoreAction); ++ tmp.setMnemonic(KeyEvent.VK_R); ++ systemMenu.add(tmp); ++ ++ tmp = new JMenuItem(MOVE_CMD); ++ tmp.addActionListener(moveAction); ++ tmp.setMnemonic(KeyEvent.VK_M); ++ systemMenu.add(tmp); ++ ++ tmp = new JMenuItem(SIZE_CMD); ++ tmp.addActionListener(sizeAction); ++ tmp.setMnemonic(KeyEvent.VK_S); ++ systemMenu.add(tmp); ++ ++ tmp = new JMenuItem(ICONIFY_CMD); ++ tmp.addActionListener(iconifyAction); ++ tmp.setMnemonic(KeyEvent.VK_N); ++ systemMenu.add(tmp); ++ ++ tmp = new JMenuItem(MAXIMIZE_CMD); ++ tmp.addActionListener(maximizeAction); ++ tmp.setMnemonic(KeyEvent.VK_X); ++ systemMenu.add(tmp); ++ ++ systemMenu.addSeparator(); ++ ++ tmp = new JMenuItem(CLOSE_CMD); ++ tmp.addActionListener(closeAction); ++ tmp.setMnemonic(KeyEvent.VK_C); ++ systemMenu.add(tmp); ++ } ++ ++ /** ++ * This method creates a new JMenubar. ++ * ++ * @return A new JMenuBar. ++ */ ++ protected JMenuBar createSystemMenuBar() ++ { ++ if (menuBar == null) ++ menuBar = new SystemMenuBar(); ++ menuBar.removeAll(); ++ return menuBar; ++ } ++ ++ /** ++ * This method creates a new JMenu. ++ * ++ * @return A new JMenu. ++ */ ++ protected JMenu createSystemMenu() ++ { ++ if (windowMenu == null) ++ windowMenu = new JMenu(); ++ windowMenu.removeAll(); ++ return windowMenu; ++ } ++ ++ /** ++ * This method programmatically shows the JMenu. ++ */ ++ protected void showSystemMenu() ++ { ++ // FIXME: Untested as KeyEvents are not hooked up. ++ menuBar.getMenu(1).getPopupMenu().show(); ++ } ++ ++ /** ++ * This method paints the TitlePane. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paintComponent(Graphics g) ++ { ++ paintTitleBackground(g); ++ Font f = g.getFont(); ++ FontMetrics fm = g.getFontMetrics(f); ++ if (frame.getTitle() != null && title != null) ++ { ++ Color saved = g.getColor(); ++ if (frame.isSelected()) ++ g.setColor(activeFGColor); ++ else ++ g.setColor(inactiveFGColor); ++ title.setText(getTitle(frame.getTitle(), fm, title.getBounds().width)); ++ SwingUtilities.paintComponent(g, title, null, title.getBounds()); ++ g.setColor(saved); ++ } ++ } ++ ++ /** ++ * This method paints the TitlePane's background. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ protected void paintTitleBackground(Graphics g) ++ { ++ Color saved = g.getColor(); ++ Dimension dims = getSize(); ++ ++ Color bg = getBackground(); ++ if (frame.isSelected()) ++ bg = activeBGColor; ++ else ++ bg = inactiveBGColor; ++ g.setColor(bg); ++ g.fillRect(0, 0, dims.width, dims.height); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method returns the title string based on the available width and the ++ * font metrics. ++ * ++ * @param text The desired title. ++ * @param fm The FontMetrics of the font used. ++ * @param availableWidth The available width. ++ * ++ * @return The allowable string. ++ */ ++ protected String getTitle(String text, FontMetrics fm, int availableWidth) ++ { ++ Rectangle vr = new Rectangle(0, 0, availableWidth, fm.getHeight()); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ String value = SwingUtilities.layoutCompoundLabel(this, fm, text, null, ++ SwingConstants.CENTER, ++ SwingConstants.LEFT, ++ SwingConstants.CENTER, ++ SwingConstants.LEFT, vr, ++ ir, tr, 0); ++ return value; ++ } ++ ++ /** ++ * This method fires something similar to a WINDOW_CLOSING event. ++ * ++ * @param frame The JInternalFrame that is being closed. ++ */ ++ protected void postClosingEvent(JInternalFrame frame) ++ { ++ // FIXME: Implement postClosingEvent when I figure out what ++ // it's supposed to do. ++ // It says that this fires an WINDOW_CLOSING like event. ++ // So the closest thing is some kind of InternalFrameEvent. ++ // But none is fired. ++ // Can't see it called or anything. ++ } ++ ++ /** ++ * This method enables the actions for the TitlePane given the frame's ++ * properties. ++ */ ++ protected void enableActions() ++ { ++ closeAction.setEnabled(frame.isClosable()); ++ ++ iconifyAction.setEnabled(frame.isIconifiable()); ++ // The maximize action is responsible for restoring it ++ // as well, if clicked from the button ++ maximizeAction.setEnabled(frame.isMaximizable()); ++ ++ // The restoring action is only active when selected ++ // from the menu. ++ restoreAction.setEnabled(frame.isMaximum()); ++ ++ sizeAction.setEnabled(frame.isResizable()); ++ ++ // FIXME: Tie MoveAction enabled status to a variable. ++ moveAction.setEnabled(false); ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener. ++ * ++ * @return A new PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method creates a new LayoutManager for the TitlePane. ++ * ++ * @return A new LayoutManager. ++ */ ++ protected LayoutManager createLayout() ++ { ++ return new TitlePaneLayout(); ++ } ++} +Index: javax/swing/plaf/basic/BasicInternalFrameUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicInternalFrameUI.java +diff -N javax/swing/plaf/basic/BasicInternalFrameUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicInternalFrameUI.java 6 Sep 2004 16:36:04 -0000 +@@ -0,0 +1,1656 @@ ++/* BasicInternalFrameUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.AWTEvent; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.ComponentEvent; ++import java.awt.event.ComponentListener; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.AbstractAction; ++import javax.swing.Action; ++import javax.swing.DefaultDesktopManager; ++import javax.swing.DesktopManager; ++import javax.swing.Icon; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JDesktopPane; ++import javax.swing.JInternalFrame; ++import javax.swing.JLabel; ++import javax.swing.KeyStroke; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.border.AbstractBorder; ++import javax.swing.event.InternalFrameEvent; ++import javax.swing.event.InternalFrameListener; ++import javax.swing.event.MouseInputAdapter; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.InternalFrameUI; ++import javax.swing.plaf.UIResource; ++ ++ ++/** ++ * This is the UI delegate for the Basic look and feel for JInternalFrames. ++ */ ++public class BasicInternalFrameUI extends InternalFrameUI ++{ ++ /** ++ * This is a helper class that listens to the JInternalFrame for ++ * InternalFrameEvents. ++ */ ++ protected class BasicInternalFrameListener implements InternalFrameListener ++ { ++ /** ++ * This method is called when the JInternalFrame is activated. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameActivated(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is closed. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameClosed(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is closing. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameClosing(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is deactivated. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameDeactivated(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is deiconified. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameDeiconified(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is iconified. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameIconified(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method is called when the JInternalFrame is opened. ++ * ++ * @param e The InternalFrameEvent. ++ */ ++ public void internalFrameOpened(InternalFrameEvent e) ++ { ++ // FIXME: Implement. ++ } ++ } ++ ++ /** ++ * This helper class listens to the edges of the JInternalFrame and the ++ * TitlePane for mouse events. It is responsible for dragging and resizing ++ * the JInternalFrame in response to the MouseEvents. ++ */ ++ protected class BorderListener extends MouseInputAdapter ++ implements SwingConstants ++ { ++ /** FIXME: Use for something. */ ++ protected int RESIZE_NONE; ++ ++ /** The x offset from the top left corner of the JInternalFrame. */ ++ private transient int xOffset = 0; ++ ++ /** The y offset from the top left corner of the JInternalFrame. */ ++ private transient int yOffset = 0; ++ ++ /** The direction that the resize is occuring in. */ ++ private transient int direction = -1; ++ ++ /** Cache rectangle that can be reused. */ ++ private transient Rectangle cacheRect = new Rectangle(); ++ ++ /** ++ * This method is called when the mouse is clicked. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseClicked(MouseEvent e) ++ { ++ // There is nothing to do when the mouse is clicked ++ // on the border. ++ } ++ ++ /** ++ * This method is called when the mouse is dragged. This method is ++ * responsible for resizing or dragging the JInternalFrame. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ // If the frame is maximized, there is nothing that ++ // can be dragged around. ++ if (frame.isMaximum()) ++ return; ++ DesktopManager dm = getDesktopManager(); ++ Rectangle b = frame.getBounds(); ++ Dimension min = frame.getMinimumSize(); ++ if (min == null) ++ min = new Dimension(0, 0); ++ Insets insets = frame.getInsets(); ++ int x = e.getX(); ++ int y = e.getY(); ++ if (e.getSource() == frame && frame.isResizable()) ++ { ++ switch (direction) ++ { ++ case NORTH: ++ cacheRect.setBounds(b.x, ++ Math.min(b.y + y, b.y + b.height ++ - min.height), b.width, b.height ++ - y); ++ break; ++ case NORTH_EAST: ++ cacheRect.setBounds(b.x, ++ Math.min(b.y + y, b.y + b.height ++ - min.height), x, b.height - y); ++ break; ++ case EAST: ++ cacheRect.setBounds(b.x, b.y, x, b.height); ++ break; ++ case SOUTH_EAST: ++ cacheRect.setBounds(b.x, b.y, x, y); ++ break; ++ case SOUTH: ++ cacheRect.setBounds(b.x, b.y, b.width, y); ++ break; ++ case SOUTH_WEST: ++ cacheRect.setBounds(Math.min(b.x + x, b.x + b.width - min.width), ++ b.y, b.width - x, y); ++ break; ++ case WEST: ++ cacheRect.setBounds(Math.min(b.x + x, b.x + b.width - min.width), ++ b.y, b.width - x, b.height); ++ break; ++ case NORTH_WEST: ++ cacheRect.setBounds(Math.min(b.x + x, b.x + b.width - min.width), ++ Math.min(b.y + y, b.y + b.height ++ - min.height), b.width - x, ++ b.height - y); ++ break; ++ } ++ dm.resizeFrame(frame, cacheRect.x, cacheRect.y, ++ Math.max(min.width, cacheRect.width), ++ Math.max(min.height, cacheRect.height)); ++ } ++ else if (e.getSource() == titlePane) ++ { ++ Rectangle fBounds = frame.getBounds(); ++ ++ dm.dragFrame(frame, e.getX() - xOffset + b.x, ++ e.getY() - yOffset + b.y); ++ } ++ } ++ ++ /** ++ * This method is called when the mouse exits the JInternalFrame. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseExited(MouseEvent e) ++ { ++ // There is nothing to do when the mouse exits ++ // the border area. ++ } ++ ++ /** ++ * This method is called when the mouse is moved inside the ++ * JInternalFrame. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ // There is nothing to do when the mouse moves ++ // over the border area. ++ } ++ ++ /** ++ * This method is called when the mouse is pressed. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ activateFrame(frame); ++ DesktopManager dm = getDesktopManager(); ++ int x = e.getX(); ++ int y = e.getY(); ++ Insets insets = frame.getInsets(); ++ ++ if (e.getSource() == frame && frame.isResizable()) ++ { ++ direction = sectionOfClick(x, y); ++ dm.beginResizingFrame(frame, direction); ++ } ++ else if (e.getSource() == titlePane) ++ { ++ Rectangle tBounds = titlePane.getBounds(); ++ ++ xOffset = e.getX() - tBounds.x + insets.left; ++ yOffset = e.getY() - tBounds.y + insets.top; ++ ++ dm.beginDraggingFrame(frame); ++ } ++ } ++ ++ /** ++ * This method is called when the mouse is released. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ DesktopManager dm = getDesktopManager(); ++ xOffset = 0; ++ yOffset = 0; ++ if (e.getSource() == frame && frame.isResizable()) ++ dm.endResizingFrame(frame); ++ else if (e.getSource() == titlePane) ++ dm.endDraggingFrame(frame); ++ } ++ ++ /** ++ * This method determines the direction of the resize based on the ++ * coordinates and the size of the JInternalFrame. ++ * ++ * @param x The x coordinate of the MouseEvent. ++ * @param y The y coordinate of the MouseEvent. ++ * ++ * @return The direction of the resize (a SwingConstant direction). ++ */ ++ private int sectionOfClick(int x, int y) ++ { ++ Insets insets = frame.getInsets(); ++ Rectangle b = frame.getBounds(); ++ if (x < insets.left && y < insets.top) ++ return NORTH_WEST; ++ else if (x > b.width - insets.right && y < insets.top) ++ return NORTH_EAST; ++ else if (x > b.width - insets.right && y > b.height - insets.bottom) ++ return SOUTH_EAST; ++ else if (x < insets.left && y > b.height - insets.bottom) ++ return SOUTH_WEST; ++ else if (y < insets.top) ++ return NORTH; ++ else if (x < insets.left) ++ return WEST; ++ else if (y > b.height - insets.bottom) ++ return SOUTH; ++ else if (x > b.width - insets.right) ++ return EAST; ++ ++ return -1; ++ } ++ } ++ ++ /** ++ * This helper class listens to the JDesktopPane that parents this ++ * JInternalFrame and listens for resize events and resizes the ++ * JInternalFrame appropriately. ++ */ ++ protected class ComponentHandler implements ComponentListener ++ { ++ /** ++ * This method is called when the JDesktopPane is hidden. ++ * ++ * @param e The ComponentEvent fired. ++ */ ++ public void componentHidden(ComponentEvent e) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method is called when the JDesktopPane is moved. ++ * ++ * @param e The ComponentEvent fired. ++ */ ++ public void componentMoved(ComponentEvent e) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method is called when the JDesktopPane is resized. ++ * ++ * @param e The ComponentEvent fired. ++ */ ++ public void componentResized(ComponentEvent e) ++ { ++ if (frame.isMaximum()) ++ { ++ JDesktopPane pane = (JDesktopPane) e.getSource(); ++ Insets insets = pane.getInsets(); ++ Rectangle bounds = pane.getBounds(); ++ ++ frame.setBounds(bounds.x + insets.left, bounds.y + insets.top, ++ bounds.width - insets.left - insets.right, ++ bounds.height - insets.top - insets.bottom); ++ frame.revalidate(); ++ frame.repaint(); ++ } ++ ++ // Sun also resizes the icons. but it doesn't seem to do anything. ++ } ++ ++ /** ++ * This method is called when the JDesktopPane is shown. ++ * ++ * @param e The ComponentEvent fired. ++ */ ++ public void componentShown(ComponentEvent e) ++ { ++ // Do nothing. ++ } ++ } ++ ++ /** ++ * This helper class acts as the LayoutManager for JInternalFrames. ++ */ ++ public class InternalFrameLayout implements LayoutManager ++ { ++ /** ++ * This method is called when the given Component is added to the ++ * JInternalFrame. ++ * ++ * @param name The name of the Component. ++ * @param c The Component added. ++ */ ++ public void addLayoutComponent(String name, Component c) ++ { ++ } ++ ++ /** ++ * This method is used to set the bounds of the children of the ++ * JInternalFrame. ++ * ++ * @param c The Container to lay out. ++ */ ++ public void layoutContainer(Container c) ++ { ++ Dimension dims = frame.getSize(); ++ Insets insets = frame.getInsets(); ++ ++ dims.width -= insets.left + insets.right; ++ dims.height -= insets.top + insets.bottom; ++ ++ frame.getRootPane().getGlassPane().setBounds(0, 0, dims.width, ++ dims.height); ++ int nh = 0; ++ int sh = 0; ++ int ew = 0; ++ int ww = 0; ++ ++ if (northPane != null) ++ { ++ Dimension nDims = northPane.getPreferredSize(); ++ nh = Math.min(nDims.height, dims.height); ++ ++ northPane.setBounds(insets.left, insets.top, dims.width, nh); ++ } ++ ++ if (southPane != null) ++ { ++ Dimension sDims = southPane.getPreferredSize(); ++ sh = Math.min(sDims.height, dims.height - nh); ++ ++ southPane.setBounds(insets.left, insets.top + dims.height - sh, ++ dims.width, sh); ++ } ++ ++ int remHeight = dims.height - sh - nh; ++ ++ if (westPane != null) ++ { ++ Dimension wDims = westPane.getPreferredSize(); ++ ww = Math.min(dims.width, wDims.width); ++ ++ westPane.setBounds(insets.left, insets.top + nh, ww, remHeight); ++ } ++ ++ if (eastPane != null) ++ { ++ Dimension eDims = eastPane.getPreferredSize(); ++ ew = Math.min(eDims.width, dims.width - ww); ++ ++ eastPane.setBounds(insets.left + dims.width - ew, insets.top + nh, ++ ew, remHeight); ++ } ++ ++ int remWidth = dims.width - ww - ew; ++ ++ frame.getRootPane().setBounds(insets.left + ww, insets.top + nh, ++ remWidth, remHeight); ++ } ++ ++ /** ++ * This method returns the minimum layout size. ++ * ++ * @param c The Container to find a minimum layout size for. ++ * ++ * @return The minimum dimensions for the JInternalFrame. ++ */ ++ public Dimension minimumLayoutSize(Container c) ++ { ++ return getSize(c, true); ++ } ++ ++ /** ++ * This method returns the maximum layout size. ++ * ++ * @param c The Container to find a maximum layout size for. ++ * ++ * @return The maximum dimensions for the JInternalFrame. ++ */ ++ public Dimension maximumLayoutSize(Container c) ++ { ++ return preferredLayoutSize(c); ++ } ++ ++ /** ++ * Th8is method returns the preferred layout size. ++ * ++ * @param c The Container to find a preferred layout size for. ++ * ++ * @return The preferred dimensions for the JInternalFrame. ++ */ ++ public Dimension preferredLayoutSize(Container c) ++ { ++ return getSize(c, false); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ * @param min DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ private Dimension getSize(Container c, boolean min) ++ { ++ Insets insets = frame.getInsets(); ++ ++ Dimension contentDims = frame.getContentPane().getPreferredSize(); ++ if (min) ++ contentDims.width = contentDims.height = 0; ++ int nWidth = 0; ++ int nHeight = 0; ++ int sWidth = 0; ++ int sHeight = 0; ++ int eWidth = 0; ++ int eHeight = 0; ++ int wWidth = 0; ++ int wHeight = 0; ++ Dimension dims; ++ ++ if (northPane != null) ++ { ++ dims = northPane.getPreferredSize(); ++ if (dims != null) ++ { ++ nWidth = dims.width; ++ nHeight = dims.height; ++ } ++ } ++ ++ if (southPane != null) ++ { ++ dims = southPane.getPreferredSize(); ++ if (dims != null) ++ { ++ sWidth = dims.width; ++ sHeight = dims.height; ++ } ++ } ++ ++ if (eastPane != null) ++ { ++ dims = eastPane.getPreferredSize(); ++ if (dims != null) ++ { ++ sWidth = dims.width; ++ sHeight = dims.height; ++ } ++ } ++ ++ if (westPane != null) ++ { ++ dims = westPane.getPreferredSize(); ++ if (dims != null) ++ { ++ wWidth = dims.width; ++ wHeight = dims.height; ++ } ++ } ++ ++ int width = Math.max(sWidth, nWidth); ++ width = Math.max(width, contentDims.width + eWidth + wWidth); ++ ++ int height = Math.max(eHeight, wHeight); ++ height = Math.max(height, contentDims.height); ++ height += nHeight + sHeight; ++ ++ width += insets.left + insets.right; ++ height += insets.top + insets.bottom; ++ ++ return new Dimension(width, height); ++ } ++ ++ /** ++ * This method is called when a Component is removed from the ++ * JInternalFrame. ++ * ++ * @param c The Component that was removed. ++ */ ++ public void removeLayoutComponent(Component c) ++ { ++ } ++ } ++ ++ /** ++ * This helper class is used to listen to the JDesktopPane's glassPane for ++ * MouseEvents. The JInternalFrame can then be selected if a click is ++ * detected on its children. ++ */ ++ protected class GlassPaneDispatcher implements MouseInputListener ++ { ++ /** The MouseEvent target. */ ++ private transient Component mouseEventTarget; ++ ++ /** The component pressed. */ ++ private transient Component pressedComponent; ++ ++ /** The last component entered. */ ++ private transient Component lastComponentEntered; ++ ++ /** The number of presses. */ ++ private transient int pressCount; ++ ++ /** ++ * This method is called when the mouse enters the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseEntered(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse is clicked on the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseClicked(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse is dragged in the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse exits the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseExited(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse is moved in the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse is pressed in the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ activateFrame(frame); ++ handleEvent(e); ++ } ++ ++ /** ++ * This method is called when the mouse is released in the glass pane. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ handleEvent(e); ++ } ++ ++ /** ++ * This method acquires a candidate component to dispatch the MouseEvent ++ * to. ++ * ++ * @param me The MouseEvent to acquire a component for. ++ */ ++ private void acquireComponentForMouseEvent(MouseEvent me) ++ { ++ int x = me.getX(); ++ int y = me.getY(); ++ ++ // Find the candidate which should receive this event. ++ Component parent = frame.getContentPane(); ++ if (parent == null) ++ return; ++ Component candidate = null; ++ Point p = me.getPoint(); ++ while (candidate == null && parent != null) ++ { ++ candidate = SwingUtilities.getDeepestComponentAt(parent, p.x, p.y); ++ if (candidate == null) ++ { ++ p = SwingUtilities.convertPoint(parent, p.x, p.y, ++ parent.getParent()); ++ parent = parent.getParent(); ++ } ++ } ++ ++ // If the only candidate we found was the native container itself, ++ // don't dispatch any event at all. We only care about the lightweight ++ // children here. ++ if (candidate == frame.getContentPane()) ++ candidate = null; ++ ++ // If our candidate is new, inform the old target we're leaving. ++ if (lastComponentEntered != null && lastComponentEntered.isShowing() ++ && lastComponentEntered != candidate) ++ { ++ Point tp = SwingUtilities.convertPoint(frame.getContentPane(), x, y, ++ lastComponentEntered); ++ MouseEvent exited = new MouseEvent(lastComponentEntered, ++ MouseEvent.MOUSE_EXITED, ++ me.getWhen(), me.getModifiersEx(), ++ tp.x, tp.y, me.getClickCount(), ++ me.isPopupTrigger(), ++ me.getButton()); ++ lastComponentEntered.dispatchEvent(exited); ++ lastComponentEntered = null; ++ } ++ ++ // If we have a candidate, maybe enter it. ++ if (candidate != null) ++ { ++ mouseEventTarget = candidate; ++ if (candidate.isLightweight() && candidate.isShowing() ++ && candidate != frame.getContentPane() ++ && candidate != lastComponentEntered) ++ { ++ lastComponentEntered = mouseEventTarget; ++ Point cp = SwingUtilities.convertPoint(frame.getContentPane(), ++ x, y, lastComponentEntered); ++ MouseEvent entered = new MouseEvent(lastComponentEntered, ++ MouseEvent.MOUSE_ENTERED, ++ me.getWhen(), ++ me.getModifiersEx(), cp.x, ++ cp.y, me.getClickCount(), ++ me.isPopupTrigger(), ++ me.getButton()); ++ lastComponentEntered.dispatchEvent(entered); ++ } ++ } ++ ++ if (me.getID() == MouseEvent.MOUSE_RELEASED ++ || me.getID() == MouseEvent.MOUSE_PRESSED && pressCount > 0 ++ || me.getID() == MouseEvent.MOUSE_DRAGGED) ++ // If any of the following events occur while a button is held down, ++ // they should be dispatched to the same component to which the ++ // original MOUSE_PRESSED event was dispatched: ++ // - MOUSE_RELEASED ++ // - MOUSE_PRESSED: another button pressed while the first is held down ++ // - MOUSE_DRAGGED ++ mouseEventTarget = pressedComponent; ++ else if (me.getID() == MouseEvent.MOUSE_CLICKED) ++ { ++ // Don't dispatch CLICKED events whose target is not the same as the ++ // target for the original PRESSED event. ++ if (candidate != pressedComponent) ++ mouseEventTarget = null; ++ else if (pressCount == 0) ++ pressedComponent = null; ++ } ++ } ++ ++ /** ++ * This is a helper method that dispatches the GlassPane MouseEvents to ++ * the proper component. ++ * ++ * @param e The AWTEvent to be dispatched. Usually an instance of ++ * MouseEvent. ++ */ ++ private void handleEvent(AWTEvent e) ++ { ++ if (e instanceof MouseEvent) ++ { ++ MouseEvent me = SwingUtilities.convertMouseEvent(frame.getRootPane() ++ .getGlassPane(), ++ (MouseEvent) e, ++ frame.getRootPane() ++ .getGlassPane()); ++ ++ acquireComponentForMouseEvent(me); ++ ++ // Avoid dispatching ENTERED and EXITED events twice. ++ if (mouseEventTarget != null && mouseEventTarget.isShowing() ++ && e.getID() != MouseEvent.MOUSE_ENTERED ++ && e.getID() != MouseEvent.MOUSE_EXITED) ++ { ++ MouseEvent newEvt = SwingUtilities.convertMouseEvent(frame ++ .getContentPane(), ++ me, ++ mouseEventTarget); ++ mouseEventTarget.dispatchEvent(newEvt); ++ ++ switch (e.getID()) ++ { ++ case MouseEvent.MOUSE_PRESSED: ++ if (pressCount++ == 0) ++ pressedComponent = mouseEventTarget; ++ break; ++ case MouseEvent.MOUSE_RELEASED: ++ // Clear our memory of the original PRESSED event, only if ++ // we're not expecting a CLICKED event after this. If ++ // there is a CLICKED event after this, it will do clean up. ++ if (--pressCount == 0 ++ && mouseEventTarget != pressedComponent) ++ pressedComponent = null; ++ break; ++ } ++ } ++ } ++ } ++ } ++ ++ /** ++ * This helper class listens for PropertyChangeEvents from the ++ * JInternalFrame. ++ */ ++ public class InternalFramePropertyChangeListener ++ implements PropertyChangeListener ++ { ++ /** ++ * This method is called when one of the JInternalFrame's properties ++ * change. ++ * ++ * @param evt The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ if (evt.getPropertyName().equals(JInternalFrame.IS_MAXIMUM_PROPERTY)) ++ { ++ if (frame.isMaximum()) ++ maximizeFrame(frame); ++ else ++ minimizeFrame(frame); ++ } ++ else if (evt.getPropertyName().equals(JInternalFrame.IS_CLOSED_PROPERTY)) ++ closeFrame(frame); ++ else if (evt.getPropertyName().equals(JInternalFrame.IS_ICON_PROPERTY)) ++ { ++ if (frame.isIcon()) ++ iconifyFrame(frame); ++ else ++ deiconifyFrame(frame); ++ } ++ else if (evt.getPropertyName().equals(JInternalFrame.IS_SELECTED_PROPERTY)) ++ { ++ if (frame.isSelected()) ++ activateFrame(frame); ++ else ++ getDesktopManager().deactivateFrame(frame); ++ } ++ else if (evt.getPropertyName().equals(JInternalFrame.ROOT_PANE_PROPERTY) ++ || evt.getPropertyName().equals(JInternalFrame.GLASS_PANE_PROPERTY)) ++ { ++ Component old = (Component) evt.getOldValue(); ++ old.removeMouseListener(glassPaneDispatcher); ++ old.removeMouseMotionListener(glassPaneDispatcher); ++ ++ Component newPane = (Component) evt.getNewValue(); ++ newPane.addMouseListener(glassPaneDispatcher); ++ newPane.addMouseMotionListener(glassPaneDispatcher); ++ ++ frame.revalidate(); ++ } ++ /* FIXME: need to add ancestor properties to JComponents. ++ else if (evt.getPropertyName().equals(JComponent.ANCESTOR_PROPERTY)) ++ { ++ if (desktopPane != null) ++ desktopPane.removeComponentListener(componentListener); ++ desktopPane = frame.getDesktopPane(); ++ if (desktopPane != null) ++ desktopPane.addComponentListener(componentListener); ++ } ++ */ ++ } ++ } ++ ++ /** ++ * This helper class is the border for the JInternalFrame. ++ */ ++ private class InternalFrameBorder extends AbstractBorder ++ implements UIResource ++ { ++ /** The width of the border. */ ++ private static final int bSize = 5; ++ ++ /** The size of the corners. */ ++ private static final int offset = 10; ++ ++ /** ++ * This method returns whether the border is opaque. ++ * ++ * @return Whether the border is opaque. ++ */ ++ public boolean isBorderOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns the insets of the border. ++ * ++ * @param c The Component to find border insets for. ++ * ++ * @return The border insets. ++ */ ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(bSize, bSize, bSize, bSize); ++ } ++ ++ /** ++ * This method paints the border. ++ * ++ * @param c The Component that owns the border. ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate to paint at. ++ * @param y The y coordinate to paint at. ++ * @param width The width of the Component. ++ * @param height The height of the Component. ++ */ ++ public void paintBorder(Component c, Graphics g, int x, int y, int width, ++ int height) ++ { ++ g.translate(x, y); ++ Color saved = g.getColor(); ++ Rectangle b = frame.getBounds(); ++ ++ Color d = c.getBackground(); ++ g.setColor(d); ++ g.fillRect(0, 0, bSize, b.height); ++ g.fillRect(0, 0, b.width, bSize); ++ g.fillRect(0, b.height - bSize, b.width, bSize); ++ g.fillRect(b.width - bSize, 0, bSize, b.height); ++ ++ int x1 = 0; ++ int x2 = bSize; ++ int x3 = b.width - bSize; ++ int x4 = b.width; ++ ++ int y1 = 0; ++ int y2 = bSize; ++ int y3 = b.height - bSize; ++ int y4 = b.height; ++ ++ g.setColor(Color.GRAY); ++ g.fillRect(0, 0, bSize, y4); ++ g.fillRect(0, 0, x4, bSize); ++ g.fillRect(0, y3, b.width, bSize); ++ g.fillRect(x3, 0, bSize, b.height); ++ ++ g.fill3DRect(0, offset, bSize, b.height - 2 * offset, false); ++ g.fill3DRect(offset, 0, b.width - 2 * offset, bSize, false); ++ g.fill3DRect(offset, b.height - bSize, b.width - 2 * offset, bSize, false); ++ g.fill3DRect(b.width - bSize, offset, bSize, b.height - 2 * offset, false); ++ ++ g.translate(-x, -y); ++ g.setColor(saved); ++ } ++ } ++ ++ /** ++ * The MouseListener that is responsible for dragging and resizing the ++ * JInternalFrame in response to MouseEvents. ++ */ ++ protected MouseInputAdapter borderListener; ++ ++ /** ++ * The ComponentListener that is responsible for resizing the JInternalFrame ++ * in response to ComponentEvents from the JDesktopPane. ++ */ ++ protected ComponentListener componentListener; ++ ++ /** ++ * The MouseListener that is responsible for activating the JInternalFrame ++ * when the mouse press activates one of its descendents. ++ */ ++ protected MouseInputListener glassPaneDispatcher; ++ ++ /** ++ * The PropertyChangeListener that is responsible for listening to ++ * PropertyChangeEvents from the JInternalFrame. ++ */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** The InternalFrameListener that listens to the JInternalFrame. */ ++ private transient BasicInternalFrameListener internalFrameListener; ++ ++ /** The JComponent placed at the east region of the JInternalFrame. */ ++ protected JComponent eastPane; ++ ++ /** The JComponent placed at the north region of the JInternalFrame. */ ++ protected JComponent northPane; ++ ++ /** The JComponent placed at the south region of the JInternalFrame. */ ++ protected JComponent southPane; ++ ++ /** The JComponent placed at the west region of the JInternalFrame. */ ++ protected JComponent westPane; ++ ++ /** The Keystroke bound to open the menu. */ ++ protected KeyStroke openMenuKey; ++ ++ /** The TitlePane displayed at the top of the JInternalFrame. */ ++ protected BasicInternalFrameTitlePane titlePane; ++ ++ /** The JInternalFrame this UI is responsible for. */ ++ protected JInternalFrame frame; ++ ++ /** The LayoutManager used in the JInternalFrame. */ ++ protected LayoutManager internalFrameLayout; ++ ++ /** The JDesktopPane that is the parent of the JInternalFrame. */ ++ private transient JDesktopPane desktopPane; ++ ++ /** ++ * Creates a new BasicInternalFrameUI object. ++ * ++ * @param b The JInternalFrame this UI will represent. ++ */ ++ public BasicInternalFrameUI(JInternalFrame b) ++ { ++ } ++ ++ /** ++ * This method will create a new BasicInternalFrameUI for the given ++ * JComponent. ++ * ++ * @param b The JComponent to create a BasicInternalFrameUI for. ++ * ++ * @return A new BasicInternalFrameUI. ++ */ ++ public static ComponentUI createUI(JComponent b) ++ { ++ return new BasicInternalFrameUI((JInternalFrame) b); ++ } ++ ++ /** ++ * This method installs a UI for the JInternalFrame. ++ * ++ * @param c The JComponent to install this UI on. ++ */ ++ public void installUI(JComponent c) ++ { ++ if (c instanceof JInternalFrame) ++ { ++ frame = (JInternalFrame) c; ++ ++ internalFrameLayout = createLayoutManager(); ++ frame.setLayout(internalFrameLayout); ++ ++ ((JComponent) frame.getRootPane().getGlassPane()).setOpaque(false); ++ frame.getRootPane().getGlassPane().setVisible(true); ++ ++ installDefaults(); ++ installListeners(); ++ installComponents(); ++ installKeyboardActions(); ++ ++ frame.setOpaque(true); ++ titlePane.setOpaque(true); ++ frame.invalidate(); ++ } ++ } ++ ++ /** ++ * This method reverses the work done by installUI. ++ * ++ * @param c The JComponent to uninstall this UI for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallComponents(); ++ uninstallListeners(); ++ uninstallDefaults(); ++ ++ frame.setLayout(null); ++ ((JComponent) frame.getRootPane().getGlassPane()).setOpaque(true); ++ frame.getRootPane().getGlassPane().setVisible(false); ++ ++ frame = null; ++ } ++ ++ /** ++ * This method installs the defaults specified by the look and feel. ++ */ ++ protected void installDefaults() ++ { ++ // FIXME: Move border to MetalBorders ++ frame.setBorder(new InternalFrameBorder()); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the JInternalFrame. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method installs the Components for the JInternalFrame. ++ */ ++ protected void installComponents() ++ { ++ setNorthPane(createNorthPane(frame)); ++ setSouthPane(createSouthPane(frame)); ++ setEastPane(createEastPane(frame)); ++ setWestPane(createWestPane(frame)); ++ } ++ ++ /** ++ * This method installs the listeners for the JInternalFrame. ++ */ ++ protected void installListeners() ++ { ++ glassPaneDispatcher = createGlassPaneDispatcher(); ++ createInternalFrameListener(); ++ borderListener = createBorderListener(frame); ++ componentListener = createComponentListener(); ++ propertyChangeListener = createPropertyChangeListener(); ++ ++ frame.addMouseListener(borderListener); ++ frame.addMouseMotionListener(borderListener); ++ frame.addInternalFrameListener(internalFrameListener); ++ frame.addPropertyChangeListener(propertyChangeListener); ++ ++ frame.getRootPane().getGlassPane().addMouseListener(glassPaneDispatcher); ++ frame.getRootPane().getGlassPane().addMouseMotionListener(glassPaneDispatcher); ++ } ++ ++ /** ++ * This method uninstalls the defaults for the JInternalFrame. ++ */ ++ protected void uninstallDefaults() ++ { ++ frame.setBorder(null); ++ } ++ ++ /** ++ * This method uninstalls the Components for the JInternalFrame. ++ */ ++ protected void uninstallComponents() ++ { ++ setNorthPane(null); ++ setSouthPane(null); ++ setEastPane(null); ++ setWestPane(null); ++ } ++ ++ /** ++ * This method uninstalls the listeners for the JInternalFrame. ++ */ ++ protected void uninstallListeners() ++ { ++ if (desktopPane != null) ++ desktopPane.removeComponentListener(componentListener); ++ ++ frame.getRootPane().getGlassPane().removeMouseMotionListener(glassPaneDispatcher); ++ frame.getRootPane().getGlassPane().removeMouseListener(glassPaneDispatcher); ++ ++ frame.removePropertyChangeListener(propertyChangeListener); ++ frame.removeInternalFrameListener(internalFrameListener); ++ frame.removeMouseMotionListener(borderListener); ++ frame.removeMouseListener(borderListener); ++ ++ propertyChangeListener = null; ++ componentListener = null; ++ borderListener = null; ++ internalFrameListener = null; ++ glassPaneDispatcher = null; ++ } ++ ++ /** ++ * This method uninstalls the keyboard actions for the JInternalFrame. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method creates a new LayoutManager for the JInternalFrame. ++ * ++ * @return A new LayoutManager for the JInternalFrame. ++ */ ++ protected LayoutManager createLayoutManager() ++ { ++ return new InternalFrameLayout(); ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener for the JInternalFrame. ++ * ++ * @return A new PropertyChangeListener for the JInternalFrame. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new InternalFramePropertyChangeListener(); ++ } ++ ++ /** ++ * This method returns the preferred size of the given JComponent. ++ * ++ * @param x The JComponent to find a preferred size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent x) ++ { ++ return internalFrameLayout.preferredLayoutSize(x); ++ } ++ ++ /** ++ * This method returns the minimum size of the given JComponent. ++ * ++ * @param x The JComponent to find a minimum size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent x) ++ { ++ return internalFrameLayout.minimumLayoutSize(x); ++ } ++ ++ /** ++ * This method returns the maximum size of the given JComponent. ++ * ++ * @param x The JComponent to find a maximum size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent x) ++ { ++ return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); ++ } ++ ++ /** ++ * This method replaces the currentPane with the newPane. When replacing it ++ * also removes the MouseHandlers for the old pane and installs them on ++ * the new pane. ++ * ++ * @param currentPane The old pane to remove. ++ * @param newPane The new pane to install. ++ */ ++ protected void replacePane(JComponent currentPane, JComponent newPane) ++ { ++ if (currentPane != null) ++ { ++ deinstallMouseHandlers(currentPane); ++ frame.remove(currentPane); ++ } ++ ++ if (newPane != null) ++ { ++ installMouseHandlers(newPane); ++ frame.add(newPane); ++ } ++ } ++ ++ /** ++ * This method removes the necessary MouseListeners from the given ++ * JComponent. ++ * ++ * @param c The JComponent to remove MouseListeners from. ++ */ ++ protected void deinstallMouseHandlers(JComponent c) ++ { ++ c.removeMouseListener(borderListener); ++ c.removeMouseMotionListener(borderListener); ++ } ++ ++ /** ++ * This method installs the necessary MouseListeners from the given ++ * JComponent. ++ * ++ * @param c The JComponent to install MouseListeners on. ++ */ ++ protected void installMouseHandlers(JComponent c) ++ { ++ c.addMouseListener(borderListener); ++ c.addMouseMotionListener(borderListener); ++ } ++ ++ /** ++ * This method creates the north pane used in the JInternalFrame. ++ * ++ * @param w The JInternalFrame to create a north pane for. ++ * ++ * @return The north pane. ++ */ ++ protected JComponent createNorthPane(JInternalFrame w) ++ { ++ titlePane = new BasicInternalFrameTitlePane(w); ++ return titlePane; ++ } ++ ++ /** ++ * This method creates the west pane used in the JInternalFrame. ++ * ++ * @param w The JInternalFrame to create a west pane for. ++ * ++ * @return The west pane. ++ */ ++ protected JComponent createWestPane(JInternalFrame w) ++ { ++ return null; ++ } ++ ++ /** ++ * This method creates the south pane used in the JInternalFrame. ++ * ++ * @param w The JInternalFrame to create a south pane for. ++ * ++ * @return The south pane. ++ */ ++ protected JComponent createSouthPane(JInternalFrame w) ++ { ++ return null; ++ } ++ ++ /** ++ * This method creates the east pane used in the JInternalFrame. ++ * ++ * @param w The JInternalFrame to create an east pane for. ++ * ++ * @return The east pane. ++ */ ++ protected JComponent createEastPane(JInternalFrame w) ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns a new BorderListener for the given JInternalFrame. ++ * ++ * @param w The JIntenalFrame to create a BorderListener for. ++ * ++ * @return A new BorderListener. ++ */ ++ protected MouseInputAdapter createBorderListener(JInternalFrame w) ++ { ++ return new BorderListener(); ++ } ++ ++ /** ++ * This method creates a new InternalFrameListener for the JInternalFrame. ++ */ ++ protected void createInternalFrameListener() ++ { ++ internalFrameListener = new BasicInternalFrameListener(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ protected final boolean isKeyBindingRegistered() ++ { ++ // FIXME: Implement. ++ return false; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param b DOCUMENT ME! ++ */ ++ protected final void setKeyBindingRegistered(boolean b) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public final boolean isKeyBindingActive() ++ { ++ // FIXME: Implement. ++ return false; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param b DOCUMENT ME! ++ */ ++ protected final void setKeyBindingActive(boolean b) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void setupMenuOpenKey() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected void setupMenuCloseKey() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method returns the north pane. ++ * ++ * @return The north pane. ++ */ ++ public JComponent getNorthPane() ++ { ++ return northPane; ++ } ++ ++ /** ++ * This method sets the north pane to be the given JComponent. ++ * ++ * @param c The new north pane. ++ */ ++ public void setNorthPane(JComponent c) ++ { ++ replacePane(northPane, c); ++ northPane = c; ++ } ++ ++ /** ++ * This method returns the south pane. ++ * ++ * @return The south pane. ++ */ ++ public JComponent getSouthPane() ++ { ++ return southPane; ++ } ++ ++ /** ++ * This method sets the south pane to be the given JComponent. ++ * ++ * @param c The new south pane. ++ */ ++ public void setSouthPane(JComponent c) ++ { ++ replacePane(southPane, c); ++ southPane = c; ++ } ++ ++ /** ++ * This method sets the east pane to be the given JComponent. ++ * ++ * @param c The new east pane. ++ */ ++ public void setEastPane(JComponent c) ++ { ++ replacePane(eastPane, c); ++ eastPane = c; ++ } ++ ++ /** ++ * This method returns the east pane. ++ * ++ * @return The east pane. ++ */ ++ public JComponent getEastPane() ++ { ++ return eastPane; ++ } ++ ++ /** ++ * This method sets the west pane to be the given JComponent. ++ * ++ * @param c The new west pane. ++ */ ++ public void setWestPane(JComponent c) ++ { ++ replacePane(westPane, c); ++ westPane = c; ++ } ++ ++ /** ++ * This method returns the west pane. ++ * ++ * @return The west pane. ++ */ ++ public JComponent getWestPane() ++ { ++ return westPane; ++ } ++ ++ /** ++ * This method returns the DesktopManager to use with the JInternalFrame. ++ * ++ * @return The DesktopManager to use with the JInternalFrame. ++ */ ++ protected DesktopManager getDesktopManager() ++ { ++ DesktopManager value = frame.getDesktopPane().getDesktopManager(); ++ if (value == null) ++ value = createDesktopManager(); ++ return value; ++ } ++ ++ /** ++ * This method returns a default DesktopManager that can be used with this ++ * JInternalFrame. ++ * ++ * @return A default DesktopManager that can be used with this ++ * JInternalFrame. ++ */ ++ protected DesktopManager createDesktopManager() ++ { ++ return new DefaultDesktopManager(); ++ } ++ ++ /** ++ * This is a convenience method that closes the JInternalFrame. ++ * ++ * @param f The JInternalFrame to close. ++ */ ++ protected void closeFrame(JInternalFrame f) ++ { ++ getDesktopManager().closeFrame(f); ++ } ++ ++ /** ++ * This is a convenience method that maximizes the JInternalFrame. ++ * ++ * @param f The JInternalFrame to maximize. ++ */ ++ protected void maximizeFrame(JInternalFrame f) ++ { ++ getDesktopManager().maximizeFrame(f); ++ } ++ ++ /** ++ * This is a convenience method that minimizes the JInternalFrame. ++ * ++ * @param f The JInternalFrame to minimize. ++ */ ++ protected void minimizeFrame(JInternalFrame f) ++ { ++ getDesktopManager().minimizeFrame(f); ++ } ++ ++ /** ++ * This is a convenience method that iconifies the JInternalFrame. ++ * ++ * @param f The JInternalFrame to iconify. ++ */ ++ protected void iconifyFrame(JInternalFrame f) ++ { ++ getDesktopManager().iconifyFrame(f); ++ } ++ ++ /** ++ * This is a convenience method that deiconifies the JInternalFrame. ++ * ++ * @param f The JInternalFrame to deiconify. ++ */ ++ protected void deiconifyFrame(JInternalFrame f) ++ { ++ getDesktopManager().deiconifyFrame(f); ++ } ++ ++ /** ++ * This is a convenience method that activates the JInternalFrame. ++ * ++ * @param f The JInternalFrame to activate. ++ */ ++ protected void activateFrame(JInternalFrame f) ++ { ++ getDesktopManager().activateFrame(f); ++ } ++ ++ /** ++ * This method returns a new ComponentListener for the JDesktopPane. ++ * ++ * @return A new ComponentListener. ++ */ ++ protected ComponentListener createComponentListener() ++ { ++ return new ComponentHandler(); ++ } ++ ++ /** ++ * This method returns a new GlassPaneDispatcher. ++ * ++ * @return A new GlassPaneDispatcher. ++ */ ++ protected MouseInputListener createGlassPaneDispatcher() ++ { ++ return new GlassPaneDispatcher(); ++ } ++} +Index: javax/swing/plaf/basic/BasicLabelUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicLabelUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicLabelUI.java +--- javax/swing/plaf/basic/BasicLabelUI.java 13 Jul 2003 15:29:11 -0000 1.4 ++++ javax/swing/plaf/basic/BasicLabelUI.java 6 Sep 2004 16:36:04 -0000 +@@ -1,5 +1,5 @@ + /* BasicLabelUI.java +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + + import java.awt.Color; +@@ -47,156 +46,382 @@ + import java.awt.Rectangle; + import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; ++ ++import javax.swing.Icon; + import javax.swing.JComponent; + import javax.swing.JLabel; + import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.LabelUI; + +-public class BasicLabelUI extends LabelUI +- implements PropertyChangeListener ++ ++/** ++ * This is the Basic Look and Feel class for the JLabel. One BasicLabelUI ++ * object is used to paint all JLabels that utilize the Basic Look and Feel. ++ */ ++public class BasicLabelUI extends LabelUI implements PropertyChangeListener + { +- int gap = 3; +- Color foreground; ++ /** The labelUI that is shared by all labels. */ ++ protected static BasicLabelUI labelUI; + +- +- public static ComponentUI createUI(final JComponent c) { +- return new BasicLabelUI(); +- } +- +- +- public void installUI(final JComponent c) { +- super.installUI(c); +- +- foreground = new Color(0,0,250); +- } +- ++ /** ++ * Creates a new BasicLabelUI object. ++ */ ++ public BasicLabelUI() ++ { ++ super(); ++ } + +- public Dimension getPreferredSize(JComponent c) +- { +- JLabel b = (JLabel)c; +- /* +- We cannot use this method because it is not part of the +- official Swing API. +- +- Dimension d = BasicGraphicsUtils.getPreferredSize(b, +- gap, +- b.getText(), +- b.getIcon(), +- b.getVerticalAlignment(), +- b.getHorizontalAlignment(), +- b.getHorizontalTextPosition(), +- b.getVerticalTextPosition()); +- System.out.println("JLABEL->^^^^^^^^^^^^^^^^^^^^^^ BASIC-PREF="+d + ",T="+b.getText()); +- */ +- return new Dimension(100, 30); +- } ++ /** ++ * Creates and returns a UI for the label. Since one UI is shared by all ++ * labels, this means creating only if necessary and returning the shared ++ * UI. ++ * ++ * @param c The {@link JComponent} that a UI is being created for. ++ * ++ * @return A label UI for the Basic Look and Feel. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ if (labelUI == null) ++ labelUI = new BasicLabelUI(); ++ return labelUI; ++ } ++ ++ /** ++ * Returns the preferred size of this component as calculated by the ++ * {@link layoutCL} method. ++ * ++ * @param c This {@link JComponent} to get a preferred size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ JLabel lab = (JLabel)c; ++ Rectangle vr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ Insets insets = lab.getInsets(); ++ FontMetrics fm = lab.getToolkit().getFontMetrics(lab.getFont()); ++ layoutCL(lab, fm, lab.getText(), lab.getIcon(), vr, ir, tr); ++ Rectangle cr = tr.union(ir); ++ return new Dimension(insets.left + cr.width + insets.right, ++ insets.top + cr.height + insets.bottom); + ++ } + +- public void paint(Graphics g, JComponent c) +- { +- JLabel b = (JLabel) c; +- +- Rectangle tr = new Rectangle(); +- Rectangle ir = new Rectangle(); +- Rectangle vr = new Rectangle(); +- +- Font f = c.getFont(); +- +- g.setFont(f); +- +- FontMetrics fm = g.getFontMetrics(f); +- +- Insets i = c.getInsets(); +- +- Rectangle bound = c.getBounds(); +- +- System.out.println("BOUND=" + bound + ", insets = " + i + ", " + b.getText()); +- +- if (bound == null) +- { +- vr.x = i.left; +- vr.y = i.top; +- vr.width = b.getWidth() - (i.right + i.left); +- vr.height = b.getHeight() - (i.bottom + i.top); +- } +- else +- { +- vr.x = bound.x + i.left; +- vr.y = bound.y + i.top; +- vr.width = bound.width - (i.right + i.left); +- vr.height = bound.height - (i.bottom + i.top); +- } +- +- System.out.println(" VIEW-RECT-JLABEL="+vr+", insets="+i+", FONTM="+fm); +- +- String text = SwingUtilities.layoutCompoundLabel(c, +- fm, +- b.getText(), +- b.getIcon(), +- b.getVerticalAlignment(), +- b.getHorizontalAlignment(), +- b.getVerticalTextPosition(), +- b.getHorizontalTextPosition(), +- vr, +- ir, +- tr, +- gap); +- +- paintIcon(g, c, ir); +- paintText(g, c, tr, b.getText()); +- paintFocus(g, c, vr, tr, ir); +- } ++ /** ++ * This method returns the minimum size of the {@link JComponent} given. If ++ * this method returns null, then it is up to the Layout Manager to give ++ * this component a minimum size. ++ * ++ * @param c The {@link JComponent} to get a minimum size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } + ++ /** ++ * This method returns the maximum size of the {@link JComponent} given. If ++ * this method returns null, then it is up to the Layout Manager to give ++ * this component a maximum size. ++ * ++ * @param c The {@link JComponent} to get a maximum size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } + +- protected void paintFocus(Graphics g, +- JComponent c, +- Rectangle vr, +- Rectangle tr, +- Rectangle ir) +- { +- } ++ /** ++ * The method that paints the label according to its current state. ++ * ++ * @param g The {@link Graphics} object to paint with. ++ * @param c The {@link JComponent} to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ JLabel b = (JLabel) c; + +- protected void paintIcon(Graphics g, +- JComponent c, +- Rectangle iconRect) +- { +- JLabel b = (JLabel) c; +- if (b.getIcon() != null) +- { +- int x = iconRect.x; +- int y = iconRect.y; +- +- System.out.println("WE HAVE AN ICON: " + b.getIcon()); +- +- b.getIcon().paintIcon(c, g, x, y); +- } +- else +- { +- //System.out.println("NO ICON FOR BUTTON:" + b.text); +- } +- } ++ Font saved_font = g.getFont(); ++ ++ Rectangle tr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle vr = new Rectangle(); ++ ++ Font f = c.getFont(); ++ ++ g.setFont(f); ++ FontMetrics fm = g.getFontMetrics(f); + ++ vr = SwingUtilities.calculateInnerArea(c, vr); ++ ++ if (vr.width < 0) ++ vr.width = 0; ++ if (vr.height < 0) ++ vr.height = 0; ++ ++ Icon icon = (b.isEnabled()) ? b.getIcon() : b.getDisabledIcon(); ++ ++ String text = layoutCL(b, fm, b.getText(), icon, vr, ir, tr); + +- protected void paintText(Graphics g, +- JComponent c, +- Rectangle textRect, +- String text) ++ if (icon != null) ++ icon.paintIcon(b, g, ir.x, ir.y); ++ if (text != null && ! text.equals("")) + { +- // AbstractLabel b = (AbstractLabel) c; +- +- System.out.println("JLabel: drawing string: " + text + ", at:" + textRect); +- +- g.setColor(foreground); +- //g.setBackColor(new Color(190,190,190)); +- +- g.drawLine(0,0,100,100); +- +- BasicGraphicsUtils.drawString(g, text, 0, 0 /*textRect.x*/, 0 /*textRect.y*/); ++ if (b.isEnabled()) ++ paintEnabledText(b, g, text, tr.x, tr.y + fm.getAscent()); ++ else ++ paintDisabledText(b, g, text, tr.x, tr.y + fm.getAscent()); + } ++ g.setFont(saved_font); ++ } ++ ++ /** ++ * This method is simply calls SwingUtilities's layoutCompoundLabel. ++ * ++ * @param label The label to lay out. ++ * @param fontMetrics The FontMetrics for the font used. ++ * @param text The text to paint. ++ * @param icon The icon to draw. ++ * @param viewR The entire viewable rectangle. ++ * @param iconR The icon bounds rectangle. ++ * @param textR The text bounds rectangle. ++ * ++ * @return A possibly clipped version of the text. ++ */ ++ protected String layoutCL(JLabel label, FontMetrics fontMetrics, ++ String text, Icon icon, Rectangle viewR, ++ Rectangle iconR, Rectangle textR) ++ { ++ return SwingUtilities.layoutCompoundLabel(label, fontMetrics, text, icon, ++ label.getVerticalAlignment(), ++ label.getHorizontalAlignment(), ++ label.getVerticalTextPosition(), ++ label.getHorizontalTextPosition(), ++ viewR, iconR, textR, ++ label.getIconTextGap()); ++ } ++ ++ /** ++ * Paints the text if the label is disabled. By default, this paints the ++ * clipped text returned by layoutCompoundLabel using the ++ * background.brighter() color. It also paints the same text using the ++ * background.darker() color one pixel to the right and one pixel down. ++ * ++ * @param l The {@link JLabel} being painted. ++ * @param g The {@link Graphics} object to paint with. ++ * @param s The String to paint. ++ * @param textX The x coordinate of the start of the baseline. ++ * @param textY The y coordinate of the start of the baseline. ++ */ ++ protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, ++ int textY) ++ { ++ Color saved_color = g.getColor(); ++ ++ g.setColor(l.getBackground().brighter()); ++ ++ int mnemIndex = l.getDisplayedMnemonicIndex(); ++ ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemIndex, textX, ++ textY); ++ else ++ g.drawString(s, textX, textY); ++ ++ g.setColor(l.getBackground().darker()); ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemIndex, textX + 1, ++ textY + 1); ++ else ++ g.drawString(s, textX + 1, textY + 1); ++ ++ g.setColor(saved_color); ++ } ++ ++ /** ++ * Paints the text if the label is enabled. The text is painted using the ++ * foreground color. ++ * ++ * @param l The {@link JLabel} being painted. ++ * @param g The {@link Graphics} object to paint with. ++ * @param s The String to paint. ++ * @param textX The x coordinate of the start of the baseline. ++ * @param textY The y coordinate of the start of the baseline. ++ */ ++ protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, ++ int textY) ++ { ++ Color saved_color = g.getColor(); ++ g.setColor(l.getForeground()); ++ ++ int mnemIndex = l.getDisplayedMnemonicIndex(); ++ ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemIndex, textX, ++ textY); ++ else ++ g.drawString(s, textX, textY); ++ ++ g.setColor(saved_color); ++ } ++ ++ /** ++ * This method installs the UI for the given {@link JComponent}. This ++ * method will install the component, defaults, listeners, and keyboard ++ * actions. ++ * ++ * @param c The {@link JComponent} that this UI is being installed on. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof JLabel) ++ { ++ JLabel l = (JLabel) c; ++ ++ installComponents(l); ++ installDefaults(l); ++ installListeners(l); ++ installKeyboardActions(l); ++ } ++ } ++ ++ /** ++ * This method uninstalls the UI for the given {@link JComponent}. This ++ * method will uninstall the component, defaults, listeners, and keyboard ++ * actions. ++ * ++ * @param c The {@link JComponent} that this UI is being installed on. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ super.uninstallUI(c); ++ if (c instanceof JLabel) ++ { ++ JLabel l = (JLabel) c; ++ ++ uninstallKeyboardActions(l); ++ uninstallListeners(l); ++ uninstallDefaults(l); ++ uninstallComponents(l); ++ } ++ } ++ ++ /** ++ * This method installs the components for this {@link JLabel}. ++ * ++ * @param c The {@link JLabel} to install components for. ++ */ ++ protected void installComponents(JLabel c) ++ { ++ //FIXME: fix javadoc + implement. ++ } ++ ++ /** ++ * This method uninstalls the components for this {@link JLabel}. ++ * ++ * @param c The {@link JLabel} to uninstall components for. ++ */ ++ protected void uninstallComponents(JLabel c) ++ { ++ //FIXME: fix javadoc + implement. ++ } ++ ++ /** ++ * This method installs the defaults that are defined in the Basic look and ++ * feel for this {@link JLabel}. ++ * ++ * @param c The {@link JLabel} to install defaults for. ++ */ ++ protected void installDefaults(JLabel c) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ c.setForeground(defaults.getColor("Label.foreground")); ++ c.setBackground(defaults.getColor("Label.background")); ++ c.setFont(defaults.getFont("Label.font")); ++ c.setBorder(defaults.getBorder("Label.border")); ++ c.setOpaque(true); ++ //XXX: There are properties we don't use called disabledForeground ++ //and disabledShadow. ++ } ++ ++ /** ++ * This method uninstalls the defaults that are defined in the Basic look ++ * and feel for this {@link JLabel}. ++ * ++ * @param c The {@link JLabel} to uninstall defaults for. ++ */ ++ protected void uninstallDefaults(JLabel c) ++ { ++ c.setForeground(null); ++ c.setBackground(null); ++ c.setFont(null); ++ c.setBorder(null); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the given {@link JLabel}. ++ * ++ * @param l The {@link JLabel} to install keyboard actions for. ++ */ ++ protected void installKeyboardActions(JLabel l) ++ { ++ //FIXME: implement. ++ } ++ ++ /** ++ * This method uninstalls the keyboard actions for the given {@link JLabel}. ++ * ++ * @param l The {@link JLabel} to uninstall keyboard actions for. ++ */ ++ protected void uninstallKeyboardActions(JLabel l) ++ { ++ //FIXME: implement. ++ } ++ ++ /** ++ * This method installs the listeners for the given {@link JLabel}. The UI ++ * delegate only listens to the label. ++ * ++ * @param c The {@link JLabel} to install listeners for. ++ */ ++ protected void installListeners(JLabel c) ++ { ++ c.addPropertyChangeListener(this); ++ } ++ ++ /** ++ * This method uninstalls the listeners for the given {@link JLabel}. The UI ++ * delegate only listens to the label. ++ * ++ * @param c The {@link JLabel} to uninstall listeners for. ++ */ ++ protected void uninstallListeners(JLabel c) ++ { ++ c.removePropertyChangeListener(this); ++ } + +- public void propertyChange (PropertyChangeEvent event) ++ /** ++ * This method is called whenever any JLabel's that use this UI has one of ++ * their properties change. ++ * ++ * @param e The {@link PropertyChangeEvent} that describes the change. ++ */ ++ public void propertyChange(PropertyChangeEvent e) + { +- throw new Error ("Not implemented"); ++ JLabel c = (JLabel) e.getSource(); ++ c.revalidate(); ++ c.repaint(); + } + } +Index: javax/swing/plaf/basic/BasicListUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicListUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicListUI.java +--- javax/swing/plaf/basic/BasicListUI.java 10 Jan 2004 21:59:30 -0000 1.4 ++++ javax/swing/plaf/basic/BasicListUI.java 6 Sep 2004 16:36:04 -0000 +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + + import java.awt.Color; +@@ -44,141 +43,659 @@ + import java.awt.Graphics; + import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; + import javax.swing.JComponent; + import javax.swing.JList; + import javax.swing.ListCellRenderer; ++import javax.swing.ListModel; ++import javax.swing.ListSelectionModel; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ListDataEvent; ++import javax.swing.event.ListDataListener; ++import javax.swing.event.ListSelectionEvent; ++import javax.swing.event.ListSelectionListener; ++import javax.swing.event.MouseInputListener; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.ListUI; + ++ ++/** ++ * The Basic Look and Feel UI delegate for the ++ * JList. ++ */ + public class BasicListUI extends ListUI + { +- int gap_between_cells; +- Color textColor, disabledTextColor, pressedBackgroundColor, normalBackgroundColor; +- ++ /** ++ * A helper class which listens for {@link FocusEvents} ++ * from the JList. ++ */ ++ class FocusHandler implements FocusListener ++ { ++ /** ++ * Called when the JList acquires focus. ++ * ++ * @param e The FocusEvent representing focus acquisition ++ */ ++ public void focusGained(FocusEvent e) ++ { ++ repaintCellFocus(); ++ } + +- public static ComponentUI createUI(final JComponent c) ++ /** ++ * Called when the JList loses focus. ++ * ++ * @param e The FocusEvent representing focus loss ++ */ ++ public void focusLost(FocusEvent e) + { +- return new BasicButtonUI(); ++ repaintCellFocus(); + } + +- +- public void installUI(final JComponent c) ++ /** ++ * Helper method to repaint the focused cell's ++ * lost or acquired focus state. ++ */ ++ void repaintCellFocus() + { +- super.installUI(c); ++ } ++ } + +- textColor = new Color(0,0,0); +- disabledTextColor = new Color(130, 130, 130); +- pressedBackgroundColor = new Color(150,150,150); +- normalBackgroundColor = new Color(192,192,192); ++ /** ++ * A helper class which listens for {@link ListDataEvent}s generated by ++ * the {@link JList}'s {@link ListModel}. ++ * ++ * @see javax.swing.JList#model ++ */ ++ class ListDataHandler implements ListDataListener ++ { ++ /** ++ * Called when a general change has happened in the model which cannot ++ * be represented in terms of a simple addition or deletion. ++ * ++ * @param e The event representing the change ++ */ ++ public void contentsChanged(ListDataEvent e) ++ { ++ BasicListUI.this.damageLayout(); + } + +- public Dimension getPreferredSize(JComponent c) ++ /** ++ * Called when an interval of objects has been added to the model. ++ * ++ * @param e The event representing the addition ++ */ ++ public void intervalAdded(ListDataEvent e) + { +- JList l = (JList) c; ++ BasicListUI.this.damageLayout(); ++ } + +- System.out.println("XXXXXXXXXXXXXXXxx getPreferredSize------------> " + l); ++ /** ++ * Called when an inteval of objects has been removed from the model. ++ * ++ * @param e The event representing the removal ++ */ ++ public void intervalRemoved(ListDataEvent e) ++ { ++ BasicListUI.this.damageLayout(); ++ } ++ } + +- +- int rows = l.getVisibleRowCount(); ++ /** ++ * A helper class which listens for {@link ListSelectionEvent}s ++ * from the {@link JList}'s {@link ListSelectionModel}. ++ */ ++ class ListSelectionHandler implements ListSelectionListener ++ { ++ /** ++ * Called when the list selection changes. ++ * ++ * @param e The event representing the change ++ */ ++ public void valueChanged(ListSelectionEvent e) ++ { ++ } ++ } + +- ListCellRenderer render = l.getCellRenderer(); +- +- int width = 200; +- int height = rows * 16; +- +- if (l.getModel().getSize() == 0) +- { +- return new Dimension(width, height); +- } ++ /** ++ * A helper class which listens for {@link MouseEvent}s ++ * from the {@link JList}. ++ */ ++ class MouseInputHandler implements MouseInputListener ++ { ++ /** ++ * Called when a mouse button press/release cycle completes ++ * on the {@link JList} ++ * ++ * @param event The event representing the mouse click ++ */ ++ public void mouseClicked(MouseEvent event) ++ { ++ } + +- System.out.println("BASIC_LIST_UI ====-> " + l.getModel().getElementAt(0)); ++ /** ++ * Called when a mouse button is pressed down on the ++ * {@link JList}. ++ * ++ * @param event The event representing the mouse press ++ */ ++ public void mousePressed(MouseEvent event) ++ { ++ int row = BasicListUI.this.convertYToRow(event.getY()); ++ if (row == -1) ++ return; + +- Component elt = render.getListCellRendererComponent(l, +- l.getModel().getElementAt(0), +- 0, +- false, +- false); +- Dimension a = elt.getPreferredSize(); +- if (a == null) +- { +- return new Dimension(width, height); +- } ++ BasicListUI.this.list.setSelectedIndex(row); ++ } + +- return new Dimension(a.width, +- a.height * rows); ++ /** ++ * Called when a mouse button is released on ++ * the {@link JList} ++ * ++ * @param event The event representing the mouse press ++ */ ++ public void mouseReleased(MouseEvent event) ++ { + } + +- public void paintBackground(Graphics g, +- JComponent c) ++ /** ++ * Called when the mouse pointer enters the area bounded ++ * by the {@link JList} ++ * ++ * @param event The event representing the mouse entry ++ */ ++ public void mouseEntered(MouseEvent event) + { +- Dimension size = getPreferredSize(c); ++ } + +- g.setColor(normalBackgroundColor); +- g.fillRect(0,0,size.width, size.height); ++ /** ++ * Called when the mouse pointer leaves the area bounded ++ * by the {@link JList} ++ * ++ * @param event The event representing the mouse exit ++ */ ++ public void mouseExited(MouseEvent event) ++ { + } + +- public void paint(Graphics g, +- JComponent c) +- { +- JList l = (JList) c; ++ /** ++ * Called when the mouse pointer moves over the area bounded ++ * by the {@link JList} while a button is held down. ++ * ++ * @param event The event representing the mouse drag ++ */ ++ public void mouseDragged(MouseEvent event) ++ { ++ } ++ ++ /** ++ * Called when the mouse pointer moves over the area bounded ++ * by the {@link JList}. ++ * ++ * @param event The event representing the mouse move ++ */ ++ public void mouseMoved(MouseEvent event) ++ { ++ } ++ } + +- int rows = l.getVisibleRowCount(); ++ /** ++ * Helper class which listens to {@link PropertyChangeEvent}s ++ * from the {@link JList}. ++ */ ++ class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * Called when the {@link JList} changes one of its bound properties. ++ * ++ * @param e The event representing the property change ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getSource() == BasicListUI.this.list) ++ { ++ if (e.getOldValue() != null && e.getOldValue() instanceof ListModel) ++ ((ListModel) e.getOldValue()).removeListDataListener(BasicListUI.this.listDataListener); ++ ++ if (e.getNewValue() != null && e.getNewValue() instanceof ListModel) ++ ((ListModel) e.getNewValue()).addListDataListener(BasicListUI.this.listDataListener); ++ } ++ BasicListUI.this.damageLayout(); ++ } ++ } + +- ListCellRenderer render = l.getCellRenderer(); ++ /** ++ * Creates a new BasicListUI for the component. ++ * ++ * @param c The component to create a UI for ++ * ++ * @return A new UI ++ */ ++ public static ComponentUI createUI(final JComponent c) ++ { ++ return new BasicListUI(); ++ } + +- System.out.println("RENDER-JLIST: " + rows + ", " + l.getModel().getSize()); ++ /** The current focus listener. */ ++ FocusHandler focusListener; + +- paintBackground(g, c); ++ /** The data listener listening to the model. */ ++ ListDataHandler listDataListener; + +- if (l.getModel().getSize() == 0) +- return; ++ /** The selection listener listening to the selection model. */ ++ ListSelectionHandler listSelectionListener; + +- // use element 0 to figure out how big we are: +- Component elt = render.getListCellRendererComponent(l, +- l.getModel().getElementAt(0), +- 0, +- false, +- false); +- Dimension dim = elt.getPreferredSize(); +- +- Rectangle a = new Rectangle(0, +- 0, +- dim.width, +- dim.height); ++ /** The mouse listener listening to the list. */ ++ MouseInputHandler mouseInputListener; ++ ++ /** The property change listener listening to the list. */ ++ PropertyChangeHandler propertyChangeListener; ++ ++ /** Saved reference to the list this UI was created for. */ ++ JList list; ++ ++ /** The height of a single cell in the list. */ ++ int cellHeight; ++ ++ /** The width of a single cell in the list. */ ++ int cellWidth; ++ ++ /** ++ * An array of varying heights of cells in the list, in cases where each ++ * cell might have a different height. ++ */ ++ int[] cellHeights; ++ ++ /** ++ * A simple counter. When nonzero, indicates that the UI class is out of ++ * date with respect to the underlying list, and must recalculate the ++ * list layout before painting or performing size calculations. ++ */ ++ int updateLayoutStateNeeded; ++ ++ /** ++ * Calculate the height of a particular row. If there is a fixed {@link ++ * #cellHeight}, return it; otherwise return the specific row height ++ * requested from the {@link #cellHeights} array. If the requested row ++ * is invalid, return -1. ++ * ++ * @param row The row to get the height of ++ * ++ * @return The height, in pixels, of the specified row ++ */ ++ int getRowHeight(int row) ++ { ++ if (row < 0 || row >= cellHeights.length) ++ return -1; ++ else if (cellHeight != -1) ++ return cellHeight; ++ else ++ return cellHeights[row]; ++ } + +- for (int i=0;i(0,0)
    . ++ * ++ * @param l Ignored; calculates over this.list ++ * @param index1 The first row to include in the bounds ++ * @param index2 The last row to incude in the bounds ++ * ++ * @return A rectangle encompassing the range of rows between ++ * index1 and index2 inclusive ++ */ ++ public Rectangle getCellBounds(JList l, int index1, int index2) ++ { ++ maybeUpdateLayoutState(); + +- Component comp = render.getListCellRendererComponent(l, +- l.getModel().getElementAt(i), +- i, +- is_sel, +- has_focus); ++ if (l != list || cellWidth == -1) ++ return null; + +- //System.out.println("AAAAA=> " + a + ", " + comp + ", index = " + i); ++ int lo = Math.min(index1, index2); ++ int hi = Math.max(index1, index2); ++ Rectangle lobounds = new Rectangle(0, convertRowToY(lo), cellWidth, ++ getRowHeight(lo)); ++ Rectangle hibounds = new Rectangle(0, convertRowToY(hi), cellWidth, ++ getRowHeight(hi)); + +- comp.setBounds(a); ++ return lobounds.union(hibounds); ++ } + +- comp.paint(g); ++ /** ++ * Calculate the Y coordinate of the upper edge of a particular row, ++ * considering the Y coordinate 0 to occur at the top of the ++ * list. ++ * ++ * @param row The row to calculate the Y coordinate of ++ * ++ * @return The Y coordinate of the specified row, or -1 if ++ * the specified row number is invalid ++ */ ++ int convertRowToY(int row) ++ { ++ int y = 0; ++ for (int i = 0; i < row; ++i) ++ { ++ int h = getRowHeight(i); ++ if (h == -1) ++ return -1; ++ y += h; ++ } ++ return y; ++ } + +- a.y += dim.height + gap_between_cells; +- } +- } ++ /** ++ * Calculate the row number containing a particular Y coordinate, ++ * considering the Y coodrinate 0 to occur at the top of the ++ * list. ++ * ++ * @param y0 The Y coordinate to calculate the row number for ++ * ++ * @return The row number containing the specified Y value, or -1 ++ * if the specified Y coordinate is invalid ++ */ ++ int convertYToRow(int y0) ++ { ++ for (int row = 0; row < cellHeights.length; ++row) ++ { ++ int h = getRowHeight(row); ++ ++ if (y0 < h) ++ return row; ++ y0 -= h; ++ } ++ return -1; ++ } + +- public int locationToIndex(JList list, Point location) ++ /** ++ * Recomputes the {@link #cellHeights}, {@link #cellHeight}, and {@link ++ * #cellWidth} properties by examining the variouis properties of the ++ * {@link JList}. ++ */ ++ void updateLayoutState() + { +- throw new Error ("Not implemented"); ++ int nrows = list.getModel().getSize(); ++ cellHeight = -1; ++ cellWidth = -1; ++ if (cellHeights == null || cellHeights.length != nrows) ++ cellHeights = new int[nrows]; ++ if (list.getFixedCellHeight() == -1 || list.getFixedCellWidth() == -1) ++ { ++ ListCellRenderer rend = list.getCellRenderer(); ++ for (int i = 0; i < nrows; ++i) ++ { ++ Component flyweight = rend.getListCellRendererComponent(list, ++ list.getModel() ++ .getElementAt(i), ++ 0, false, ++ false); ++ Dimension dim = flyweight.getPreferredSize(); ++ cellHeights[i] = dim.height; ++ cellWidth = Math.max(cellWidth, dim.width); ++ } ++ } ++ else ++ { ++ cellHeight = list.getFixedCellHeight(); ++ cellWidth = list.getFixedCellWidth(); ++ } + } + +- public Point indexToLocation(JList list, int index) ++ /** ++ * Marks the current layout as damaged and requests revalidation from the ++ * JList. ++ * ++ * @see #updateLayoutStateNeeded ++ */ ++ void damageLayout() ++ { ++ updateLayoutStateNeeded = 1; ++ list.revalidate(); ++ } ++ ++ /** ++ * Calls {@link #updateLayoutState} if {@link #updateLayoutStateNeeded} ++ * is nonzero, then resets {@link #updateLayoutStateNeeded} to zero. ++ */ ++ void maybeUpdateLayoutState() + { +- throw new Error ("Not implemented"); ++ if (updateLayoutStateNeeded != 0) ++ { ++ updateLayoutState(); ++ updateLayoutStateNeeded = 0; ++ } + } + +- public Rectangle getCellBounds(JList list, int index1, int index2) ++ /** ++ * Creates a new BasicListUI object. ++ */ ++ public BasicListUI() ++ { ++ focusListener = new FocusHandler(); ++ listDataListener = new ListDataHandler(); ++ listSelectionListener = new ListSelectionHandler(); ++ mouseInputListener = new MouseInputHandler(); ++ propertyChangeListener = new PropertyChangeHandler(); ++ updateLayoutStateNeeded = 1; ++ } ++ ++ /** ++ * Installs various default settings (mostly colors) from the {@link ++ * UIDefaults} into the {@link JList} ++ * ++ * @see #uninstallDefaults ++ */ ++ void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ list.setForeground(defaults.getColor("List.foreground")); ++ list.setBackground(defaults.getColor("List.background")); ++ list.setSelectionForeground(defaults.getColor("List.selectionForeground")); ++ list.setSelectionBackground(defaults.getColor("List.selectionBackground")); ++ list.setOpaque(true); ++ } ++ ++ /** ++ * Resets to null those defaults which were installed in ++ * {@link #installDefaults} ++ */ ++ void uninstallDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ list.setForeground(null); ++ list.setBackground(null); ++ list.setSelectionForeground(null); ++ list.setSelectionBackground(null); ++ } ++ ++ /** ++ * Attaches all the listeners we have in the UI class to the {@link ++ * JList}, its model and its selection model. ++ * ++ * @see #uninstallListeners ++ */ ++ void installListeners() ++ { ++ list.addFocusListener(focusListener); ++ list.getModel().addListDataListener(listDataListener); ++ list.addListSelectionListener(listSelectionListener); ++ list.addMouseListener(mouseInputListener); ++ list.addMouseMotionListener(mouseInputListener); ++ list.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Detaches all the listeners we attached in {@link #installListeners}. ++ */ ++ void uninstallListeners() ++ { ++ list.removeFocusListener(focusListener); ++ list.getModel().removeListDataListener(listDataListener); ++ list.removeListSelectionListener(listSelectionListener); ++ list.removeMouseListener(mouseInputListener); ++ list.removeMouseMotionListener(mouseInputListener); ++ list.removePropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Installs keyboard actions for this UI in the {@link JList}. ++ */ ++ void installKeyboardActions() ++ { ++ } ++ ++ /** ++ * Uninstalls keyboard actions for this UI in the {@link JList}. ++ */ ++ void uninstallKeyboardActions() ++ { ++ } ++ ++ /** ++ * Installs the various aspects of the UI in the {@link JList}. In ++ * particular, calls {@link #installDefaults}, {@link #installListeners} ++ * and {@link #installKeyboardActions}. Also saves a reference to the ++ * provided component, cast to a {@link JList}. ++ * ++ * @param c The {@link JList} to install the UI into ++ */ ++ public void installUI(final JComponent c) ++ { ++ super.installUI(c); ++ list = (JList) c; ++ installDefaults(); ++ installListeners(); ++ installKeyboardActions(); ++ maybeUpdateLayoutState(); ++ } ++ ++ /** ++ * Uninstalls all the aspects of the UI which were installed in {@link ++ * #installUI}. When finished uninstalling, drops the saved reference to ++ * the {@link JList}. ++ * ++ * @param c Ignored; the UI is uninstalled from the {@link JList} ++ * reference saved during the call to {@link #installUI} ++ */ ++ public void uninstallUI(final JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallDefaults(); ++ list = null; ++ } ++ ++ /** ++ * Gets the maximum size this list can assume. ++ * ++ * @param c The component to measure the size of ++ * ++ * @return A new Dimension representing the component's maximum size ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); ++ } ++ ++ /** ++ * Gets the size this list would prefer to assume. This is calculated by ++ * calling {@link #getCellBounds} over the entire list. ++ * ++ * @param c Ignored; uses the saved {@link JList} reference ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ if (list.getModel().getSize() == 0) ++ return new Dimension(0, 0); ++ Rectangle bounds = getCellBounds(list, 0, list.getModel().getSize() - 1); ++ return bounds.getSize(); ++ } ++ ++ /** ++ * Paints the packground of the list using the background color ++ * of the specified component. ++ * ++ * @param g The graphics context to paint in ++ * @param c The component to paint the background of ++ */ ++ public void paintBackground(Graphics g, JComponent c) ++ { ++ Dimension size = getPreferredSize(c); ++ Color save = g.getColor(); ++ g.setColor(c.getBackground()); ++ g.fillRect(0, 0, size.width, size.height); ++ g.setColor(save); ++ } ++ ++ /** ++ * Paints a single cell in the list. ++ * ++ * @param g The graphics context to paint in ++ * @param row The row number to paint ++ * @param bounds The bounds of the cell to paint, assuming a coordinate ++ * system beginning at (0,0) in the upper left corner of the ++ * list ++ * @param rend A cell renderer to paint with ++ * @param data The data to provide to the cell renderer ++ * @param sel A selection model to provide to the cell renderer ++ * @param lead The lead selection index of the list ++ */ ++ void paintCell(Graphics g, int row, Rectangle bounds, ListCellRenderer rend, ++ ListModel data, ListSelectionModel sel, int lead) ++ { ++ boolean is_sel = list.isSelectedIndex(row); ++ boolean has_focus = false; ++ Component comp = rend.getListCellRendererComponent(list, ++ data.getElementAt(row), ++ 0, is_sel, has_focus); ++ g.translate(bounds.x, bounds.y); ++ comp.setBounds(new Rectangle(0, 0, bounds.width, bounds.height)); ++ comp.paint(g); ++ g.translate(-bounds.x, -bounds.y); ++ } ++ ++ /** ++ * Paints the list by calling {@link #paintBackground} and then repeatedly ++ * calling {@link #paintCell} for each visible cell in the list. ++ * ++ * @param g The graphics context to paint with ++ * @param c Ignored; uses the saved {@link JList} reference ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ int nrows = list.getModel().getSize(); ++ if (nrows == 0) ++ return; ++ ++ maybeUpdateLayoutState(); ++ ListCellRenderer render = list.getCellRenderer(); ++ ListModel model = list.getModel(); ++ ListSelectionModel sel = list.getSelectionModel(); ++ int lead = sel.getLeadSelectionIndex(); ++ Rectangle clip = g.getClipBounds(); ++ paintBackground(g, list); ++ ++ for (int row = 0; row < nrows; ++row) ++ { ++ Rectangle bounds = getCellBounds(list, row, row); ++ if (bounds.intersects(clip)) ++ paintCell(g, row, bounds, render, model, sel, lead); ++ } ++ } ++ ++ public int locationToIndex(JList list, Point location) ++ { ++ return convertYToRow(location.y); ++ } ++ ++ public Point indexToLocation(JList list, int index) + { +- throw new Error ("Not implemented"); ++ return new Point(0, convertRowToY(index)); + } + } +Index: javax/swing/plaf/basic/BasicLookAndFeel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicLookAndFeel.java,v +retrieving revision 1.3 +diff -u -r1.3 BasicLookAndFeel.java +--- javax/swing/plaf/basic/BasicLookAndFeel.java 13 Jul 2003 15:29:11 -0000 1.3 ++++ javax/swing/plaf/basic/BasicLookAndFeel.java 6 Sep 2004 16:36:05 -0000 +@@ -1,5 +1,5 @@ + /* BasicLookAndFeel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -41,6 +41,7 @@ + import java.awt.Color; + import java.awt.Dimension; + import java.awt.Font; ++import java.awt.event.InputEvent; + import java.awt.event.KeyEvent; + import java.io.Serializable; + import java.util.Enumeration; +@@ -110,6 +111,7 @@ + "DesktopIconUI", "javax.swing.plaf.basic.BasicDesktopIconUI", + "DesktopPaneUI", "javax.swing.plaf.basic.BasicDesktopPaneUI", + "EditorPaneUI", "javax.swing.plaf.basic.BasicEditorPaneUI", ++ "FormattedTextFieldUI", "javax.swing.plaf.basic.BasicFormattedTextFieldUI", + "InternalFrameUI", "javax.swing.plaf.basic.BasicInternalFrameUI", + "LabelUI", "javax.swing.plaf.basic.BasicLabelUI", + "ListUI", "javax.swing.plaf.basic.BasicListUI", +@@ -130,6 +132,7 @@ + "SeparatorUI", "javax.swing.plaf.basic.BasicSeparatorUI", + "SliderUI", "javax.swing.plaf.basic.BasicSliderUI", + "SplitPaneUI", "javax.swing.plaf.basic.BasicSplitPaneUI", ++ "SpinnerUI", "javax.swing.plaf.basic.BasicSpinnerUI", + "StandardDialogUI", "javax.swing.plaf.basic.BasicStandardDialogUI", + "TabbedPaneUI", "javax.swing.plaf.basic.BasicTabbedPaneUI", + "TableHeaderUI", "javax.swing.plaf.basic.BasicTableHeaderUI", +@@ -205,15 +208,15 @@ + private void loadResourceBundle(UIDefaults defaults) + { + ResourceBundle bundle; +- Enumeration enum; ++ Enumeration e; + String key; + String value; + bundle = ResourceBundle.getBundle("resources/basic"); + // Process Resources +- enum = bundle.getKeys(); +- while (enum.hasMoreElements()) ++ e = bundle.getKeys(); ++ while (e.hasMoreElements()) + { +- key = (String) enum.nextElement(); ++ key = (String) e.nextElement(); + value = bundle.getString(key); + defaults.put(key, value); + } +@@ -226,30 +229,49 @@ + protected void initComponentDefaults(UIDefaults defaults) + { + Object[] uiDefaults; ++ ++ // The default Look and Feel happens to use these three purple shades ++ // extensively. ++ Color lightPurple = new Color(0xCC, 0xCC, 0xFF); ++ Color midPurple = new Color(0x99, 0x99, 0xCC); ++ Color darkPurple = new Color(0x66, 0x66, 0x99); ++ + uiDefaults = new Object[] { ++ ++ "AbstractUndoableEdit.undoText", "Undo", ++ "AbstractUndoableEdit.redoText", "Redo", ++ + "Button.background", new ColorUIResource(Color.lightGray), +- "Button.border", new BorderUIResource.CompoundBorderUIResource(null, +- null), ++ "Button.border", BorderUIResource.getEtchedBorderUIResource(), ++ "Button.darkShadow", new ColorUIResource(Color.darkGray), + "Button.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "SPACE", "pressed", + "released SPACE", "released" + }), ++ "Button.focus", midPurple, + "Button.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "Button.foreground", new ColorUIResource(Color.black), ++ "Button.highlight", new ColorUIResource(Color.white), ++ "Button.light", new ColorUIResource(Color.lightGray.brighter()), + "Button.margin", new InsetsUIResource(2, 14, 2, 14), ++ "Button.shadow", new ColorUIResource(Color.gray), + "Button.textIconGap", new Integer(4), + "Button.textShiftOffset", new Integer(0), + "CheckBox.background", new ColorUIResource(Color.lightGray), + "CheckBox.border", new BorderUIResource.CompoundBorderUIResource(null, + null), ++ "CheckBox.darkShadow", new ColorUIResource(Color.darkGray), + "CheckBox.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "SPACE", "pressed", + "released SPACE", "released" + }), + "CheckBox.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "CheckBox.foreground", new ColorUIResource(Color.black), ++ "CheckBox.highlight", new ColorUIResource(Color.white), + "CheckBox.icon", BasicIconFactory.getCheckBoxIcon(), ++ "CheckBox.light", new ColorUIResource(Color.lightGray.brighter()), + "CheckBox.margin",new InsetsUIResource(2, 2, 2, 2), ++ "CheckBox.shadow", new ColorUIResource(Color.gray), + "CheckBox.textIconGap", new Integer(4), + "CheckBox.textShiftOffset", new Integer(0), + "CheckBoxMenuItem.acceleratorFont", new FontUIResource("Dialog", +@@ -264,8 +286,8 @@ + "CheckBoxMenuItem.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "CheckBoxMenuItem.foreground", new ColorUIResource(Color.black), + "CheckBoxMenuItem.margin", new InsetsUIResource(2, 2, 2, 2), +- "CheckBoxMenuItem.selectionBackground", new ColorUIResource(0, 0, 128), +- "CheckBoxMenuItem.selectionForeground", new ColorUIResource(Color.white), ++ "CheckBoxMenuItem.selectionBackground", new ColorUIResource(lightPurple), ++ "CheckBoxMenuItem.selectionForeground", new ColorUIResource(Color.black), + "ColorChooser.background", new ColorUIResource(Color.lightGray), + "ColorChooser.cancelText", "Cancel", + "ColorChooser.font", new FontUIResource("Dialog", Font.PLAIN, 12), +@@ -305,8 +327,8 @@ + "ComboBox.disabledForeground", new ColorUIResource(Color.gray), + "ComboBox.font", new FontUIResource("SansSerif", Font.PLAIN, 12), + "ComboBox.foreground", new ColorUIResource(Color.black), +- "ComboBox.selectionBackground", new ColorUIResource(0, 0, 128), +- "ComboBox.selectionForeground", new ColorUIResource(Color.white), ++ "ComboBox.selectionBackground", new ColorUIResource(lightPurple), ++ "ComboBox.selectionForeground", new ColorUIResource(Color.black), + "Desktop.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { + "KP_LEFT", "left", + "KP_RIGHT", "right", +@@ -328,7 +350,7 @@ + "ctrl F10", "maximize", + "ctrl alt shift F6","selectPreviousFrame" + }), +- "Desktop.background", new ColorUIResource(0, 92, 92), ++ "Desktop.background", new ColorUIResource(175, 163, 236), + "DesktopIcon.border", new BorderUIResource.CompoundBorderUIResource(null, + null), + "EditorPane.background", new ColorUIResource(Color.white), +@@ -401,16 +423,16 @@ + "FocusManagerClassName", "TODO", + "FormView.resetButtonText", "Reset", + "FormView.submitButtonText", "Submit Query", +- "InternalFrame.activeTitleBackground", new ColorUIResource(0, 0, 128), +- "InternalFrame.activeTitleForeground", new ColorUIResource(Color.white), ++ "InternalFrame.activeTitleBackground", new ColorUIResource(162, 167, 241), ++ "InternalFrame.activeTitleForeground", new ColorUIResource(Color.black), + "InternalFrame.border", new BorderUIResource.CompoundBorderUIResource(null, + null), + "InternalFrame.closeIcon", BasicIconFactory.createEmptyFrameIcon(), + // XXX Don't use gif + "InternalFrame.icon", new IconUIResource(new ImageIcon("icons/JavaCup.gif")), + "InternalFrame.iconifyIcon", BasicIconFactory.createEmptyFrameIcon(), +- "InternalFrame.inactiveTitleBackground", new ColorUIResource(Color.gray), +- "InternalFrame.inactiveTitleForeground", new ColorUIResource(Color.lightGray), ++ "InternalFrame.inactiveTitleBackground", new ColorUIResource(Color.lightGray), ++ "InternalFrame.inactiveTitleForeground", new ColorUIResource(Color.black), + "InternalFrame.maximizeIcon", BasicIconFactory.createEmptyFrameIcon(), + "InternalFrame.minimizeIcon", BasicIconFactory.createEmptyFrameIcon(), + "InternalFrame.titleFont", new FontUIResource("Dialog", Font.PLAIN, 12), +@@ -423,6 +445,9 @@ + "Label.disabledForeground", new ColorUIResource(Color.white), + "Label.disabledShadow", new ColorUIResource(Color.gray), + "Label.font", new FontUIResource("Dialog", Font.PLAIN, 12), ++ "Label.foreground", new ColorUIResource(Color.black), ++ "List.background", new ColorUIResource(Color.white), ++ "List.border", new BasicBorders.MarginBorder(), + "List.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "PAGE_UP", "scrollUp", + "ctrl \\", "clearSelection", +@@ -444,8 +469,8 @@ + "KP_DOWN", "selectNextRow" + }), + "List.foreground", new ColorUIResource(Color.black), +- "List.selectionBackground", new ColorUIResource(0, 0, 128), +- "List.selectionForeground", new ColorUIResource(Color.white), ++ "List.selectionBackground", new ColorUIResource(0xCC, 0xCC, 0xFF), ++ "List.selectionForeground", new ColorUIResource(Color.black), + "Menu.acceleratorFont", new FontUIResource("Dialog", Font.PLAIN, 12), + "Menu.acceleratorForeground", new ColorUIResource(Color.black), + "Menu.acceleratorSelectionForeground", new ColorUIResource(Color.white), +@@ -471,8 +496,8 @@ + "ENTER", "return", + "SPACE", "return" + }, +- "Menutext.selectionBackground", new ColorUIResource(0, 0, 128), +- "Menu.selectionForeground", new ColorUIResource(Color.white), ++ "Menu.selectionBackground", new ColorUIResource(lightPurple), ++ "Menu.selectionForeground", new ColorUIResource(Color.black), + "MenuBar.background", new ColorUIResource(Color.lightGray), + "MenuBar.border", new BasicBorders.MenuBarBorder(null, null), + "MenuBar.font", new FontUIResource("Dialog", Font.PLAIN, 12), +@@ -480,7 +505,7 @@ + "MenuBar.windowBindings", new Object[] { + "F10", "takeFocus" + }, +- "MenuItem.acceleratorDelimiter", "+", ++ "MenuItem.acceleratorDelimiter", "-", + "MenuItem.acceleratorFont", new FontUIResource("Dialog", Font.PLAIN, 12), + "MenuItem.acceleratorForeground", new ColorUIResource(Color.black), + "MenuItem.acceleratorSelectionForeground", new ColorUIResource(Color.white), +@@ -492,8 +517,8 @@ + "MenuItem.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "MenuItem.foreground", new ColorUIResource(Color.black), + "MenuItem.margin", new InsetsUIResource(2, 2, 2, 2), +- "MenuItem.selectionBackground", new ColorUIResource(0, 0, 128), +- "MenuItem.selectionForeground", new ColorUIResource(Color.white), ++ "MenuItem.selectionBackground", new ColorUIResource(lightPurple), ++ "MenuItem.selectionForeground", new ColorUIResource(Color.black), + "OptionPane.background", new ColorUIResource(Color.lightGray), + "OptionPane.border", new BorderUIResource.EmptyBorderUIResource(0, 0, 0, 0), + "OptionPane.buttonAreaBorder", new BorderUIResource.EmptyBorderUIResource(0, 0, 0, 0), +@@ -533,31 +558,37 @@ + 0), + "notify-field-accept")}, + "PasswordField.margin", new InsetsUIResource(0, 0, 0, 0), +- "PasswordField.selectionBackground", new ColorUIResource(0, 0, 128), +- "PasswordField.selectionForeground", new ColorUIResource(Color.white), ++ "PasswordField.selectionBackground", new ColorUIResource(lightPurple), ++ "PasswordField.selectionForeground", new ColorUIResource(Color.black), + "PopupMenu.background", new ColorUIResource(Color.lightGray), + "PopupMenu.border", new BorderUIResource.BevelBorderUIResource(0), + "PopupMenu.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "PopupMenu.foreground", new ColorUIResource(Color.black), + "ProgressBar.background", new ColorUIResource(Color.lightGray), +- "ProgressBar.border", new BorderUIResource.LineBorderUIResource(null), ++ "ProgressBar.border", new BorderUIResource.LineBorderUIResource(Color.darkGray), + "ProgressBar.cellLength", new Integer(1), + "ProgressBar.cellSpacing", new Integer(0), + "ProgressBar.font", new FontUIResource("Dialog", Font.PLAIN, 12), +- "ProgressBar.foreground", new ColorUIResource(0, 0, 128), +- "ProgressBar.selectionBackground", new ColorUIResource(0, 0, 128), ++ "ProgressBar.foreground", new ColorUIResource(midPurple), ++ "ProgressBar.selectionBackground", new ColorUIResource(lightPurple), + "ProgressBar.selectionForeground", new ColorUIResource(Color.lightGray), ++ "ProgressBar.repaintInterval", new Integer(250), ++ "ProgressBar.cycleTime", new Integer(6000), + "RadioButton.background", new ColorUIResource(Color.lightGray), + "RadioButton.border", new BorderUIResource.CompoundBorderUIResource(null, + null), ++ "RadioButton.darkShadow", new ColorUIResource(Color.darkGray), + "RadioButton.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "SPACE", "pressed", + "released SPACE", "released" + }), + "RadioButton.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "RadioButton.foreground", new ColorUIResource(Color.black), ++ "RadioButton.highlight", new ColorUIResource(Color.white), + "RadioButton.icon", BasicIconFactory.getRadioButtonIcon(), ++ "RadioButton.light", new ColorUIResource(Color.lightGray.brighter()), + "RadioButton.margin", new InsetsUIResource(2, 2, 2, 2), ++ "RadioButton.shadow", new ColorUIResource(Color.gray), + "RadioButton.textIconGap", new Integer(4), + "RadioButton.textShiftOffset", new Integer(0), + "RadioButtonMenuItem.acceleratorFont", new FontUIResource("Dialog", +@@ -572,8 +603,8 @@ + "RadioButtonMenuItem.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "RadioButtonMenuItem.foreground", new ColorUIResource(Color.black), + "RadioButtonMenuItem.margin", new InsetsUIResource(2, 2, 2, 2), +- "RadioButtonMenuItem.selectionBackground", new ColorUIResource(0, 0, 128), +- "RadioButtonMenuItem.selectionForeground", new ColorUIResource(Color.white), ++ "RadioButtonMenuItem.selectionBackground", new ColorUIResource(lightPurple), ++ "RadioButtonMenuItem.selectionForeground", new ColorUIResource(Color.black), + "RootPane.defaultButtonWindowKeyBindings", new Object[] { + "ENTER", "press", + "released ENTER", "release", +@@ -648,6 +679,9 @@ + "Slider.foreground", new ColorUIResource(Color.lightGray), + "Slider.highlight", new ColorUIResource(Color.white), + "Slider.shadow", new ColorUIResource(Color.gray), ++ "Slider.thumbHeight", new Integer(20), ++ "Slider.thumbWidth", new Integer(10), ++ "Slider.tickHeight", new Integer(12), + "SplitPane.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { + "F6", "toggleFocus", + "F8", "startResize", +@@ -664,7 +698,7 @@ + }), + "SplitPane.background", new ColorUIResource(Color.lightGray), + "SplitPane.border", new BasicBorders.SplitPaneBorder(null, null), +- "SplitPane.dividerSize", new Integer(7), ++ "SplitPane.dividerSize", new Integer(10), + "SplitPane.highlight", new ColorUIResource(Color.white), + "SplitPane.shadow", new ColorUIResource(Color.gray), + "TabbedPane.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { +@@ -673,9 +707,9 @@ + "ctrl UP", "requestFocus", + "ctrl KP_UP", "requestFocus" + }), +- "TabbedPane.background", new ColorUIResource(Color.lightGray), ++ "TabbedPane.background", new ColorUIResource(Color.LIGHT_GRAY), + "TabbedPane.contentBorderInsets", new InsetsUIResource(2, 2, 3, 3), +- "TabbedPane.darkShadow", new ColorUIResource(Color.black), ++ "TabbedPane.darkShadow", new ColorUIResource(Color.darkGray), + "TabbedPane.focus", new ColorUIResource(Color.black), + "TabbedPane.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "LEFT", "navigateLeft", +@@ -695,8 +729,10 @@ + "TabbedPane.lightHighlight", new ColorUIResource(Color.white), + "TabbedPane.selectedTabPadInsets", new InsetsUIResource(2, 2, 2, 1), + "TabbedPane.shadow", new ColorUIResource(Color.gray), +- "TabbedPane.tabAreaInsets", new InsetsUIResource(3, 2, 0, 2), +- "TabbedPane.tabInsets", new InsetsUIResource(0, 4, 1, 4), ++ "TabbedPane.tabbedPaneTabAreaInsets", new InsetsUIResource(3, 2, 1, 2), ++ "TabbedPane.tabbedPaneTabInsets", new InsetsUIResource(1, 4, 1, 4), ++ "TabbedPane.tabbedPaneContentBorderInsets", new InsetsUIResource(3, 2, 1, 2), ++ "TabbedPane.tabbedPaneTabPadInsets", new InsetsUIResource(1, 1, 1, 1), + "TabbedPane.tabRunOverlay", new Integer(2), + "TabbedPane.textIconGap", new Integer(4), + "Table.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { +@@ -742,13 +778,13 @@ + "Table.background", new ColorUIResource(Color.white), + "Table.focusCellBackground", new ColorUIResource(Color.white), + "Table.focusCellForeground", new ColorUIResource(Color.black), +- "Table.focusCellHighlightBorder", new BorderUIResource.LineBorderUIResource(null), ++ "Table.focusCellHighlightBorder", new BorderUIResource.LineBorderUIResource(Color.white), + "Table.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "Table.foreground", new ColorUIResource(Color.black), + "Table.gridColor", new ColorUIResource(Color.gray), + "Table.scrollPaneBorder", new BorderUIResource.BevelBorderUIResource(0), +- "Table.selectionBackground", new ColorUIResource(0, 0, 128), +- "Table.selectionForeground", new ColorUIResource(Color.white), ++ "Table.selectionBackground", new ColorUIResource(lightPurple), ++ "Table.selectionForeground", new ColorUIResource(Color.black), + "TableHeader.background", new ColorUIResource(Color.lightGray), + "TableHeader.cellBorder", new BorderUIResource.BevelBorderUIResource(0), + "TableHeader.font", new FontUIResource("Dialog", Font.PLAIN, 12), +@@ -775,8 +811,8 @@ + 0), "insert-tab") + }, + "TextArea.margin", new InsetsUIResource(0, 0, 0, 0), +- "TextArea.selectionBackground", new ColorUIResource(0, 0, 128), +- "TextArea.selectionForeground", new ColorUIResource(Color.white), ++ "TextArea.selectionBackground", new ColorUIResource(lightPurple), ++ "TextArea.selectionForeground", new ColorUIResource(Color.black), + "TextField.background", new ColorUIResource(Color.white), + "TextField.border", new BasicBorders.FieldBorder(null, null, null, null), + "TextField.caretBlinkRate", new Integer(500), +@@ -787,10 +823,17 @@ + "TextField.keyBindings", new JTextComponent.KeyBinding[] { + new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, + 0), +- "notify-field-accept")}, ++ "notify-field-accept"), ++ new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ++ InputEvent.SHIFT_DOWN_MASK), ++ "selection-backward"), ++ new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ++ InputEvent.SHIFT_DOWN_MASK), ++ "selection-forward"), ++ }, + "TextField.margin", new InsetsUIResource(0, 0, 0, 0), +- "TextField.selectionBackground", new ColorUIResource(0, 0, 128), +- "TextField.selectionForeground", new ColorUIResource(Color.white), ++ "TextField.selectionBackground", new ColorUIResource(lightPurple), ++ "TextField.selectionForeground", new ColorUIResource(Color.black), + "TextPane.background", new ColorUIResource(Color.white), + "TextPane.border", new BasicBorders.MarginBorder(), + "TextPane.caretBlinkRate", new Integer(500), +@@ -842,14 +885,14 @@ + "ToolBar.background", new ColorUIResource(Color.lightGray), + "ToolBar.border", new BorderUIResource.EtchedBorderUIResource(), + "ToolBar.dockingBackground", new ColorUIResource(Color.lightGray), +- "ToolBar.dockingForeground", new ColorUIResource(Color.red), ++ "ToolBar.dockingForeground", new ColorUIResource(11, 30, 143), + "ToolBar.floatingBackground", new ColorUIResource(Color.lightGray), +- "ToolBar.floatingForeground", new ColorUIResource(Color.darkGray), ++ "ToolBar.floatingForeground", new ColorUIResource(113, 171, 212), + "ToolBar.font", new FontUIResource("Dialog", Font.PLAIN, 12), + "ToolBar.foreground", new ColorUIResource(Color.black), +- "ToolBar.separatorSize", new DimensionUIResource(10, 10), +- "ToolTip.background", new ColorUIResource(Color.white), +- "ToolTip.border", new BorderUIResource.LineBorderUIResource(null), ++ "ToolBar.separatorSize", new DimensionUIResource(20, 20), ++ "ToolTip.background", new ColorUIResource(122, 178, 241), ++ "ToolTip.border", new BorderUIResource.LineBorderUIResource(Color.lightGray), + "ToolTip.font", new FontUIResource("SansSerif", Font.PLAIN, 12), + "ToolTip.foreground", new ColorUIResource(Color.black), + "Tree.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { +@@ -860,7 +903,7 @@ + // XXX Don't use gif + "Tree.closedIcon", new IconUIResource(new ImageIcon("icons/TreeClosed.gif")), + "Tree.drawsFocusBorderAroundIcon", Boolean.FALSE, +- "Tree.editorBorder", new BorderUIResource.LineBorderUIResource(null), ++ "Tree.editorBorder", new BorderUIResource.LineBorderUIResource(Color.lightGray), + "Tree.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { + "shift PAGE_DOWN", "scrollDownExtendSelection", + "PAGE_DOWN", "scrollDownChangeSelection", +@@ -916,9 +959,9 @@ + "Tree.rightChildIndent", new Integer(13), + "Tree.rowHeight", new Integer(16), + "Tree.scrollsOnExpand", Boolean.TRUE, +- "Tree.selectionBackground", new ColorUIResource(0, 0, 128), ++ "Tree.selectionBackground", new ColorUIResource(lightPurple), + "Tree.selectionBorderColor", new ColorUIResource(Color.black), +- "Tree.selectionForeground", new ColorUIResource(Color.white), ++ "Tree.selectionForeground", new ColorUIResource(Color.black), + "Tree.textBackground", new ColorUIResource(Color.lightGray), + "Tree.textForeground", new ColorUIResource(Color.black), + "Viewport.background", new ColorUIResource(Color.lightGray), +Index: javax/swing/plaf/basic/BasicMenuBarUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicMenuBarUI.java +diff -N javax/swing/plaf/basic/BasicMenuBarUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicMenuBarUI.java 6 Sep 2004 16:36:05 -0000 +@@ -0,0 +1,323 @@ ++/* BasicMenuBarUI.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Dimension; ++import java.awt.GridLayout; ++import java.awt.Insets; ++import java.awt.event.ContainerEvent; ++import java.awt.event.ContainerListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.BoxLayout; ++import javax.swing.ButtonModel; ++import javax.swing.Icon; ++import javax.swing.JCheckBoxMenuItem; ++import javax.swing.JComponent; ++import javax.swing.JMenu; ++import javax.swing.JMenuBar; ++import javax.swing.JMenuItem; ++import javax.swing.JPopupMenu; ++import javax.swing.JRadioButtonMenuItem; ++import javax.swing.KeyStroke; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.MenuDragMouseEvent; ++import javax.swing.event.MenuDragMouseListener; ++import javax.swing.event.MenuEvent; ++import javax.swing.event.MenuKeyEvent; ++import javax.swing.event.MenuKeyListener; ++import javax.swing.event.MenuListener; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.MenuBarUI; ++import javax.swing.plaf.MenuItemUI; ++ ++ ++/** ++ * UI Delegate for JMenuBar. ++ */ ++public class BasicMenuBarUI extends MenuBarUI ++{ ++ protected ChangeListener changeListener; ++ ++ /*ContainerListener that listens to the ContainerEvents fired from menu bar*/ ++ protected ContainerListener containerListener; ++ ++ /*Property change listeners that listener to PropertyChangeEvent from menu bar*/ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /* menu bar for which this UI delegate is for*/ ++ protected JMenuBar menuBar; ++ ++ /** ++ * Creates a new BasicMenuBarUI object. ++ */ ++ public BasicMenuBarUI() ++ { ++ changeListener = createChangeListener(); ++ containerListener = createContainerListener(); ++ propertyChangeListener = new PropertyChangeHandler(); ++ } ++ ++ /** ++ * Creates ChangeListener ++ * ++ * @return The ChangeListener ++ */ ++ protected ChangeListener createChangeListener() ++ { ++ return new ChangeHandler(); ++ } ++ ++ /** ++ * Creates ContainerListener() to listen for ContainerEvents ++ * fired by JMenuBar. ++ * ++ * @return The ContainerListener ++ */ ++ protected ContainerListener createContainerListener() ++ { ++ return new ContainerHandler(); ++ } ++ ++ /** ++ * Factory method to create a BasicMenuBarUI for the given {@link ++ * JComponent}, which should be a {@link JMenuBar}. ++ * ++ * @param b The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicMenuBarUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicMenuBarUI(); ++ } ++ ++ /** ++ * Returns maximum size for the specified menu bar ++ * ++ * @param c component for which to get maximum size ++ * ++ * @return Maximum size for the specified menu bar ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ // let layout manager calculate its size ++ return null; ++ } ++ ++ /** ++ * Returns maximum allowed size of JMenuBar. ++ * ++ * @param c menuBar for which to return maximum size ++ * ++ * @return Maximum size of the give menu bar. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ // let layout manager calculate its size ++ return null; ++ } ++ ++ /** ++ * Returns preferred size of JMenuBar. ++ * ++ * @param c menuBar for which to return preferred size ++ * ++ * @return Preferred size of the give menu bar. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ // let layout manager calculate its size ++ return null; ++ } ++ ++ /** ++ * Initializes any default properties that this UI has from the defaults for ++ * the Basic look and feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ menuBar.setBackground(defaults.getColor("MenuBar.background")); ++ menuBar.setBorder(defaults.getBorder("MenuBar.border")); ++ menuBar.setFont(defaults.getFont("MenuBar.font")); ++ menuBar.setForeground(defaults.getColor("MenuBar.foreground")); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the JMenuBar. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: implement ++ } ++ ++ /** ++ * This method installs the listeners needed for this UI to function. ++ */ ++ protected void installListeners() ++ { ++ menuBar.addContainerListener(containerListener); ++ menuBar.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Installs and initializes all fields for this UI delegate. Any properties ++ * of the UI that need to be initialized and/or set to defaults will be ++ * done now. It will also install any listeners necessary. ++ * ++ * @param c The {@link JComponent} that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ menuBar = (JMenuBar) c; ++ menuBar.setLayout(new BoxLayout(menuBar, BoxLayout.X_AXIS)); ++ installDefaults(); ++ installListeners(); ++ installKeyboardActions(); ++ } ++ ++ /** ++ * This method uninstalls the defaults and nulls any objects created during ++ * install. ++ */ ++ protected void uninstallDefaults() ++ { ++ menuBar.setBackground(null); ++ menuBar.setBorder(null); ++ menuBar.setFont(null); ++ menuBar.setForeground(null); ++ } ++ ++ /** ++ * This method reverses the work done in installKeyboardActions. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * Unregisters all the listeners that this UI delegate was using. ++ */ ++ protected void uninstallListeners() ++ { ++ menuBar.removeContainerListener(containerListener); ++ menuBar.removePropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Performs the opposite of installUI. Any properties or resources that need ++ * to be cleaned up will be done now. It will also uninstall any listeners ++ * it has. In addition, any properties of this UI will be nulled. ++ * ++ * @param c The {@link JComponent} that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallDefaults(); ++ uninstallListeners(); ++ uninstallKeyboardActions(); ++ menuBar = null; ++ } ++ ++ protected class ChangeHandler implements ChangeListener ++ { ++ public void stateChanged(ChangeEvent event) ++ { ++ } ++ } ++ ++ /** ++ * This class handles ContainerEvents fired by JMenuBar. It revalidates ++ * and repaints menu bar whenever menu is added or removed from it. ++ */ ++ protected class ContainerHandler implements ContainerListener ++ { ++ /** ++ * This method is called whenever menu is added to the menu bar ++ * ++ * @param e The ContainerEvent. ++ */ ++ public void componentAdded(ContainerEvent e) ++ { ++ menuBar.revalidate(); ++ menuBar.repaint(); ++ } ++ ++ /** ++ * This method is called whenever menu is removed from the menu bar. ++ * ++ * @param e The ContainerEvent. ++ */ ++ public void componentRemoved(ContainerEvent e) ++ { ++ menuBar.revalidate(); ++ menuBar.repaint(); ++ } ++ } ++ ++ /** ++ * This class handles PropertyChangeEvents fired from the JMenuBar ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called whenever one of the properties of the MenuBar ++ * changes. ++ * ++ * @param e The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JMenuBar.BORDER_PAINTED_CHANGED_PROPERTY)) ++ menuBar.repaint(); ++ if (e.getPropertyName().equals(JMenuBar.MARGIN_CHANGED_PROPERTY)) ++ menuBar.repaint(); ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicMenuItemUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicMenuItemUI.java +diff -N javax/swing/plaf/basic/BasicMenuItemUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicMenuItemUI.java 6 Sep 2004 16:36:05 -0000 +@@ -0,0 +1,1009 @@ ++/* BasicMenuItemUI.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import java.awt.Stroke; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.util.ArrayList; ++import java.util.Vector; ++import javax.swing.AbstractButton; ++import javax.swing.ButtonModel; ++import javax.swing.Icon; ++import javax.swing.JCheckBoxMenuItem; ++import javax.swing.JComponent; ++import javax.swing.JMenu; ++import javax.swing.JMenuItem; ++import javax.swing.JPopupMenu; ++import javax.swing.JRadioButtonMenuItem; ++import javax.swing.KeyStroke; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.MenuDragMouseEvent; ++import javax.swing.event.MenuDragMouseListener; ++import javax.swing.event.MenuKeyEvent; ++import javax.swing.event.MenuKeyListener; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.MenuItemUI; ++ ++ ++/** ++ * UI Delegate for JMenuItem. ++ */ ++public class BasicMenuItemUI extends MenuItemUI ++{ ++ /** ++ * Font to be used when displaying menu item's accelerator. ++ */ ++ protected Font acceleratorFont; ++ ++ /** ++ * Color to be used when displaying menu item's accelerator. ++ */ ++ protected Color acceleratorForeground; ++ ++ /** ++ * Color to be used when displaying menu item's accelerator when menu item is ++ * selected. ++ */ ++ protected Color acceleratorSelectionForeground; ++ ++ /** ++ * Icon that is displayed after the text to indicated that this menu contains ++ * submenu. ++ */ ++ protected Icon arrowIcon; ++ ++ /** ++ * Icon that is displayed before the text. This icon is only used in ++ * JCheckBoxMenuItem or JRadioBoxMenuItem. ++ */ ++ protected Icon checkIcon; ++ ++ /** ++ * Number of spaces between icon and text. ++ */ ++ protected int defaultTextIconGap = 4; ++ ++ /** ++ * Color of the text when menu item is disabled ++ */ ++ protected Color disabledForeground; ++ ++ /** ++ * The menu Drag mouse listener listening to the menu item. ++ */ ++ protected MenuDragMouseListener menuDragMouseListener; ++ ++ /** ++ * The menu item itself ++ */ ++ protected JMenuItem menuItem; ++ ++ /** ++ * Menu Key listener listening to the menu item. ++ */ ++ protected MenuKeyListener menuKeyListener; ++ ++ /** ++ * mouse input listener listening to menu item. ++ */ ++ protected MouseInputListener mouseInputListener; ++ ++ /** ++ * Indicates if border should be painted ++ */ ++ protected boolean oldBorderPainted; ++ ++ /** ++ * Color of text that is used when menu item is selected ++ */ ++ protected Color selectionBackground; ++ ++ /** ++ * Color of the text that is used when menu item is selected. ++ */ ++ protected Color selectionForeground; ++ ++ /** ++ * String that separates description of the modifiers and the key ++ */ ++ private String acceleratorDelimiter; ++ ++ /** ++ * PropertyChangeListener to listen for property changes in the menu item ++ */ ++ private PropertyChangeListener propertyChangeListener; ++ ++ /** ++ * Number of spaces between accelerator and menu item's label. ++ */ ++ private int defaultAcceleratorLabelGap = 4; ++ ++ /** ++ * Creates a new BasicMenuItemUI object. ++ */ ++ public BasicMenuItemUI() ++ { ++ mouseInputListener = createMouseInputListener(menuItem); ++ menuDragMouseListener = createMenuDragMouseListener(menuItem); ++ menuKeyListener = createMenuKeyListener(menuItem); ++ propertyChangeListener = new PropertyChangeHandler(); ++ } ++ ++ /** ++ * Create MenuDragMouseListener to listen for mouse dragged events. ++ * ++ * @param c menu item to listen to ++ * ++ * @return The MenuDragMouseListener ++ */ ++ protected MenuDragMouseListener createMenuDragMouseListener(JComponent c) ++ { ++ return new MenuDragMouseHandler(); ++ } ++ ++ /** ++ * Creates MenuKeyListener to listen to key events occuring when menu item ++ * is visible on the screen. ++ * ++ * @param c menu item to listen to ++ * ++ * @return The MenuKeyListener ++ */ ++ protected MenuKeyListener createMenuKeyListener(JComponent c) ++ { ++ return new MenuKeyHandler(); ++ } ++ ++ /** ++ * Handles mouse input events occuring for this menu item ++ * ++ * @param c menu item to listen to ++ * ++ * @return The MouseInputListener ++ */ ++ protected MouseInputListener createMouseInputListener(JComponent c) ++ { ++ return new MouseInputHandler(); ++ } ++ ++ /** ++ * Factory method to create a BasicMenuItemUI for the given {@link ++ * JComponent}, which should be a {@link JMenuItem}. ++ * ++ * @param c The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicMenuItemUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicMenuItemUI(); ++ } ++ ++ /** ++ * Programatically clicks menu item. ++ * ++ * @param msm MenuSelectionManager for the menu hierarchy ++ */ ++ protected void doClick(MenuSelectionManager msm) ++ { ++ menuItem.doClick(); ++ msm.clearSelectedPath(); ++ } ++ ++ /** ++ * Returns maximum size for the specified menu item ++ * ++ * @param c component for which to get maximum size ++ * ++ * @return Maximum size for the specified menu item. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * Returns minimum size for the specified menu item ++ * ++ * @param c component for which to get minimum size ++ * ++ * @return Minimum size for the specified menu item. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * Returns path to this menu item. ++ * ++ * @return $MenuElement[]$ Returns array of menu elements ++ * that constitute a path to this menu item. ++ */ ++ public MenuElement[] getPath() ++ { ++ ArrayList path = new ArrayList(); ++ ++ // Path to menu should also include its popup menu. ++ if (menuItem instanceof JMenu) ++ path.add(((JMenu) menuItem).getPopupMenu()); ++ ++ Component c = menuItem; ++ while (c instanceof MenuElement) ++ { ++ path.add(0, (MenuElement) c); ++ ++ if (c instanceof JPopupMenu) ++ c = ((JPopupMenu) c).getInvoker(); ++ else ++ c = c.getParent(); ++ } ++ ++ MenuElement[] pathArray = new MenuElement[path.size()]; ++ path.toArray(pathArray); ++ return pathArray; ++ } ++ ++ /** ++ * Returns preferred size for the given menu item. ++ * ++ * @param c menu item for which to get preferred size ++ * @param checkIcon chech icon displayed in the given menu item ++ * @param arrowIcon arrow icon displayed in the given menu item ++ * @param defaultTextIconGap space between icon and text in the given menuItem ++ * ++ * @return $Dimension$ preferred size for the given menu item ++ */ ++ protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, ++ Icon arrowIcon, ++ int defaultTextIconGap) ++ { ++ JMenuItem m = (JMenuItem) c; ++ Dimension d = BasicGraphicsUtils.getPreferredButtonSize(m, ++ defaultTextIconGap); ++ ++ // if menu item has accelerator then take accelerator's size into account ++ // when calculating preferred size. ++ KeyStroke accelerator = m.getAccelerator(); ++ Rectangle rect; ++ ++ if (accelerator != null) ++ { ++ rect = getAcceleratorRect(accelerator, ++ m.getToolkit().getFontMetrics(acceleratorFont)); ++ ++ // add width of accelerator's text ++ d.width = d.width + rect.width + defaultAcceleratorLabelGap; ++ ++ // adjust the heigth of the preferred size if necessary ++ if (d.height < rect.height) ++ d.height = rect.height; ++ } ++ ++ if (checkIcon != null) ++ { ++ d.width = d.width + checkIcon.getIconWidth() + defaultTextIconGap; ++ ++ if (checkIcon.getIconHeight() > d.height) ++ d.height = checkIcon.getIconHeight(); ++ } ++ ++ if (arrowIcon != null && (c instanceof JMenu)) ++ { ++ d.width = d.width + arrowIcon.getIconWidth() + defaultTextIconGap; ++ ++ if (arrowIcon.getIconHeight() > d.height) ++ d.height = arrowIcon.getIconHeight(); ++ } ++ ++ return d; ++ } ++ ++ /** ++ * Returns preferred size of the given component ++ * ++ * @param c component for which to return preferred size ++ * ++ * @return $Dimension$ preferred size for the given component ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return getPreferredMenuItemSize(c, checkIcon, arrowIcon, defaultTextIconGap); ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return null; ++ } ++ ++ /** ++ * This method installs the components for this {@link JMenuItem}. ++ * ++ * @param menuItem The {@link JMenuItem} to install components for. ++ */ ++ protected void installComponents(JMenuItem menuItem) ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method installs the defaults that are defined in the Basic look and ++ * feel for this {@link JMenuItem}. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ menuItem.setBackground(defaults.getColor("MenuItem.background")); ++ menuItem.setBorder(defaults.getBorder("MenuItem.border")); ++ menuItem.setFont(defaults.getFont("MenuItem.font")); ++ menuItem.setForeground(defaults.getColor("MenuItem.foreground")); ++ menuItem.setMargin(defaults.getInsets("MenuItem.margin")); ++ menuItem.setOpaque(true); ++ acceleratorFont = defaults.getFont("MenuItem.acceleratorFont"); ++ acceleratorForeground = defaults.getColor("MenuItem.acceleratorForeground"); ++ acceleratorSelectionForeground = defaults.getColor("MenuItem.acceleratorSelectionForeground"); ++ selectionBackground = defaults.getColor("MenuItem.selectionBackground"); ++ selectionForeground = defaults.getColor("MenuItem.selectionForeground"); ++ acceleratorDelimiter = defaults.getString("MenuItem.acceleratorDelimiter"); ++ } ++ ++ /** ++ * This method installs the keyboard actions for this {@link JMenuItem}. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method installs the listeners for the {@link JMenuItem}. ++ */ ++ protected void installListeners() ++ { ++ menuItem.addMouseListener(mouseInputListener); ++ menuItem.addMouseMotionListener(mouseInputListener); ++ menuItem.addMenuDragMouseListener(menuDragMouseListener); ++ menuItem.addMenuKeyListener(menuKeyListener); ++ menuItem.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Installs and initializes all fields for this UI delegate. Any properties ++ * of the UI that need to be initialized and/or set to defaults will be ++ * done now. It will also install any listeners necessary. ++ * ++ * @param c The {@link JComponent} that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ menuItem = (JMenuItem) c; ++ installDefaults(); ++ installComponents(menuItem); ++ installListeners(); ++ } ++ ++ /** ++ * Paints given menu item using specified graphics context ++ * ++ * @param g The graphics context used to paint this menu item ++ * @param c Menu Item to paint ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ paintMenuItem(g, c, checkIcon, arrowIcon, c.getBackground(), ++ c.getForeground(), defaultTextIconGap); ++ } ++ ++ /** ++ * Paints background of the menu item ++ * ++ * @param g The graphics context used to paint this menu item ++ * @param menuItem menu item to paint ++ * @param bgColor Background color to use when painting menu item ++ */ ++ protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) ++ { ++ Dimension size = getPreferredSize(menuItem); ++ Color foreground = g.getColor(); ++ g.setColor(bgColor); ++ g.drawRect(0, 0, size.width, size.height); ++ g.setColor(foreground); ++ } ++ ++ /** ++ * Paints specified menu item ++ * ++ * @param g The graphics context used to paint this menu item ++ * @param c menu item to paint ++ * @param checkIcon check icon to use when painting menu item ++ * @param arrowIcon arrow icon to use when painting menu item ++ * @param background Background color of the menu item ++ * @param foreground Foreground color of the menu item ++ * @param defaultTextIconGap space to use between icon and ++ * text when painting menu item ++ */ ++ protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, ++ Icon arrowIcon, Color background, ++ Color foreground, int defaultTextIconGap) ++ { ++ JMenuItem m = (JMenuItem) c; ++ Rectangle tr = new Rectangle(); // text rectangle ++ Rectangle ir = new Rectangle(); // icon rectangle ++ Rectangle vr = new Rectangle(); // view rectangle ++ Rectangle br = new Rectangle(); // border rectangle ++ Rectangle ar = new Rectangle(); // accelerator rectangle ++ Rectangle cr = new Rectangle(); // checkIcon rectangle ++ ++ int vertAlign = m.getVerticalAlignment(); ++ int horAlign = m.getHorizontalAlignment(); ++ int vertTextPos = m.getVerticalTextPosition(); ++ int horTextPos = m.getHorizontalTextPosition(); ++ ++ Font f = m.getFont(); ++ g.setFont(f); ++ FontMetrics fm = g.getFontMetrics(f); ++ SwingUtilities.calculateInnerArea(m, br); ++ SwingUtilities.calculateInsetArea(br, m.getInsets(), vr); ++ paintBackground(g, m, m.getBackground()); ++ ++ /* MenuItems insets are equal to menuItems margin, space between text and ++ menuItems border. We need to paint insets region as well. */ ++ Insets insets = m.getInsets(); ++ br.x -= insets.left; ++ br.y -= insets.top; ++ br.width += insets.right + insets.left; ++ br.height += insets.top + insets.bottom; ++ ++ /* Menu item is considered to be highlighted when it is selected. ++ It is considered to be selected if menu item is inside some menu ++ and is armed or if it is both armed and pressed */ ++ if (m.getModel().isArmed() ++ && (m.getParent() instanceof MenuElement || m.getModel().isPressed())) ++ { ++ if (m.isContentAreaFilled()) ++ { ++ g.setColor(selectionBackground); ++ g.fillRect(br.x, br.y, br.width, br.height); ++ } ++ } ++ else ++ { ++ if (m.isContentAreaFilled()) ++ { ++ g.setColor(m.getBackground()); ++ g.fillRect(br.x, br.y, br.width, br.height); ++ } ++ } ++ ++ // If this menu item is a JCheckBoxMenuItem then paint check icon ++ if (checkIcon != null) ++ { ++ SwingUtilities.layoutCompoundLabel(m, fm, null, checkIcon, vertAlign, ++ horAlign, vertTextPos, horTextPos, ++ vr, cr, tr, defaultTextIconGap); ++ checkIcon.paintIcon(m, g, cr.x, cr.y); ++ ++ // We need to calculate position of the menu text and position of ++ // user menu icon if there exists one relative to the check icon. ++ // So we need to adjust view rectangle s.t. its starting point is at ++ // checkIcon.width + defaultTextIconGap. ++ vr.x = cr.x + cr.width + defaultTextIconGap; ++ } ++ ++ // if this is a submenu, then paint arrow icon to indicate it. ++ if (arrowIcon != null && (c instanceof JMenu)) ++ { ++ if (! ((JMenu) c).isTopLevelMenu()) ++ { ++ int width = arrowIcon.getIconWidth(); ++ int height = arrowIcon.getIconHeight(); ++ ++ arrowIcon.paintIcon(m, g, vr.width - width + defaultTextIconGap, ++ vr.y + 2); ++ } ++ } ++ ++ // paint icon ++ // FIXME: should paint different icon at different button state's. ++ // i.e disabled icon when button is disabled.. etc. ++ Icon i = m.getIcon(); ++ if (i != null) ++ { ++ i.paintIcon(c, g, vr.x, vr.y); ++ ++ // Adjust view rectangle, s.t text would be drawn after menu item's icon. ++ vr.x += i.getIconWidth() + defaultTextIconGap; ++ } ++ ++ // paint text and user menu icon if it exists ++ SwingUtilities.layoutCompoundLabel(c, fm, m.getText(), m.getIcon(), ++ vertAlign, horAlign, vertTextPos, ++ horTextPos, vr, ir, tr, ++ defaultTextIconGap); ++ ++ paintText(g, m, tr, m.getText()); ++ ++ // paint accelerator ++ String acceleratorText = ""; ++ ++ if (m.getAccelerator() != null) ++ { ++ acceleratorText = getAcceleratorText(m.getAccelerator()); ++ fm = g.getFontMetrics(acceleratorFont); ++ ar.width = fm.stringWidth(acceleratorText); ++ ar.x = br.width - ar.width; ++ vr.x = br.width - ar.width; ++ ++ SwingUtilities.layoutCompoundLabel(m, fm, acceleratorText, null, ++ vertAlign, horAlign, vertTextPos, ++ horTextPos, vr, ir, ar, ++ defaultTextIconGap); ++ ++ paintAccelerator(g, m, ar, acceleratorText); ++ } ++ } ++ ++ /** ++ * Paints label for the given menu item ++ * ++ * @param g The graphics context used to paint this menu item ++ * @param menuItem menu item for which to draw its label ++ * @param textRect rectangle specifiying position of the text relative to ++ * the given menu item ++ * @param text label of the menu item ++ */ ++ protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, ++ String text) ++ { ++ Font f = menuItem.getFont(); ++ g.setFont(f); ++ FontMetrics fm = g.getFontMetrics(f); ++ ++ if (text != null && ! text.equals("")) ++ { ++ if (menuItem.isEnabled()) ++ g.setColor(menuItem.getForeground()); ++ else ++ // FIXME: should fix this to use 'disabledForeground', but its ++ // default value in BasicLookAndFeel is null. ++ g.setColor(Color.gray); ++ ++ int mnemonicIndex = menuItem.getDisplayedMnemonicIndex(); ++ ++ if (mnemonicIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, text, mnemonicIndex, ++ textRect.x, ++ textRect.y ++ + fm.getAscent()); ++ else ++ BasicGraphicsUtils.drawString(g, text, 0, textRect.x, ++ textRect.y + fm.getAscent()); ++ } ++ } ++ ++ /** ++ * This method uninstalls the components for this {@link JMenuItem}. ++ * ++ * @param menuItem The {@link JMenuItem} to uninstall components for. ++ */ ++ protected void uninstallComponents(JMenuItem menuItem) ++ { ++ // FIXME: need to implement ++ } ++ ++ /** ++ * This method uninstalls the defaults and sets any objects created during ++ * install to null ++ */ ++ protected void uninstallDefaults() ++ { ++ menuItem.setForeground(null); ++ menuItem.setBackground(null); ++ menuItem.setBorder(null); ++ menuItem.setMargin(null); ++ menuItem.setBackground(null); ++ menuItem.setBorder(null); ++ menuItem.setFont(null); ++ menuItem.setForeground(null); ++ menuItem.setMargin(null); ++ acceleratorFont = null; ++ acceleratorForeground = null; ++ acceleratorSelectionForeground = null; ++ arrowIcon = null; ++ selectionBackground = null; ++ selectionForeground = null; ++ acceleratorDelimiter = null; ++ } ++ ++ /** ++ * Uninstalls any keyboard actions. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: need to implement ++ } ++ ++ /** ++ * Unregisters all the listeners that this UI delegate was using. ++ */ ++ protected void uninstallListeners() ++ { ++ menuItem.removeMouseListener(mouseInputListener); ++ menuItem.removeMenuDragMouseListener(menuDragMouseListener); ++ menuItem.removeMenuKeyListener(menuKeyListener); ++ menuItem.removePropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * Performs the opposite of installUI. Any properties or resources that need ++ * to be cleaned up will be done now. It will also uninstall any listeners ++ * it has. In addition, any properties of this UI will be nulled. ++ * ++ * @param c The {@link JComponent} that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(); ++ uninstallDefaults(); ++ uninstallComponents(menuItem); ++ menuItem = null; ++ } ++ ++ /** ++ * This method calls paint. ++ * ++ * @param g The graphics context used to paint this menu item ++ * @param c The menu item to paint ++ */ ++ public void update(Graphics g, JComponent c) ++ { ++ paint(g, c); ++ } ++ ++ /** ++ * Return text representation of the specified accelerator ++ * ++ * @param accelerator Accelerator for which to return string representation ++ * ++ * @return $String$ Text representation of the given accelerator ++ */ ++ private String getAcceleratorText(KeyStroke accelerator) ++ { ++ // convert keystroke into string format ++ String modifiersText = ""; ++ int modifiers = accelerator.getModifiers(); ++ char keyChar = accelerator.getKeyChar(); ++ int keyCode = accelerator.getKeyCode(); ++ ++ if (modifiers != 0) ++ modifiersText = KeyEvent.getKeyModifiersText(modifiers) ++ + acceleratorDelimiter; ++ ++ if (keyCode == KeyEvent.VK_UNDEFINED) ++ return modifiersText + keyChar; ++ else ++ return modifiersText + KeyEvent.getKeyText(keyCode); ++ } ++ ++ /** ++ * Calculates and return rectange in which accelerator should be displayed ++ * ++ * @param accelerator accelerator for which to return the display rectangle ++ * @param fm The font metrics used to measure the text ++ * ++ * @return $Rectangle$ reactangle which will be used to display accelerator ++ */ ++ private Rectangle getAcceleratorRect(KeyStroke accelerator, FontMetrics fm) ++ { ++ int width = fm.stringWidth(getAcceleratorText(accelerator)); ++ int height = fm.getHeight(); ++ return new Rectangle(0, 0, width, height); ++ } ++ ++ /** ++ * Paints accelerator inside menu item ++ * ++ * @param g The graphics context used to paint the border ++ * @param menuItem Menu item for which to draw accelerator ++ * @param acceleratorRect rectangle representing position ++ * of the accelerator relative to the menu item ++ * @param acceleratorText accelerator's text ++ */ ++ private void paintAccelerator(Graphics g, JMenuItem menuItem, ++ Rectangle acceleratorRect, ++ String acceleratorText) ++ { ++ g.setFont(acceleratorFont); ++ FontMetrics fm = g.getFontMetrics(acceleratorFont); ++ ++ if (menuItem.isEnabled()) ++ g.setColor(acceleratorForeground); ++ else ++ // FIXME: should fix this to use 'disabledForeground', but its ++ // default value in BasicLookAndFeel is null. ++ g.setColor(Color.gray); ++ ++ BasicGraphicsUtils.drawString(g, acceleratorText, 0, acceleratorRect.x, ++ acceleratorRect.y + fm.getAscent()); ++ } ++ ++ /** ++ * This class handles mouse events occuring inside the menu item. ++ * Most of the events are forwarded for processing to MenuSelectionManager ++ * of the current menu hierarchy. ++ * ++ */ ++ protected class MouseInputHandler implements MouseInputListener ++ { ++ /** ++ * Creates a new MouseInputHandler object. ++ */ ++ protected MouseInputHandler() ++ { ++ } ++ ++ /** ++ * This method is called when mouse is clicked on the menu item. ++ * It forwards this event to MenuSelectionManager. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseClicked(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ /** ++ * This method is called when mouse is dragged inside the menu item. ++ * It forwards this event to MenuSelectionManager. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ /** ++ * This method is called when mouse enters menu item. ++ * When this happens menu item is considered to be selected and selection path ++ * in MenuSelectionManager is set. This event is also forwarded to MenuSelection ++ * Manager for further processing. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseEntered(MouseEvent e) ++ { ++ Component source = (Component) e.getSource(); ++ if (source.getParent() instanceof MenuElement) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(getPath()); ++ manager.processMouseEvent(e); ++ } ++ } ++ ++ /** ++ * This method is called when mouse exits menu item. The event is ++ * forwarded to MenuSelectionManager for processing. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseExited(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ /** ++ * This method is called when mouse is inside the menu item. ++ * This event is forwarder to MenuSelectionManager for further processing. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ /** ++ * This method is called when mouse is pressed. This event is forwarded to ++ * MenuSelectionManager for further processing. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ /** ++ * This method is called when mouse is released. If the mouse is released ++ * inside this menuItem, then this menu item is considered to be chosen and ++ * the menu hierarchy should be closed. ++ * ++ * @param e A {@link MouseEvent}. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ Rectangle size = menuItem.getBounds(); ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ if (e.getX() > 0 && e.getX() < size.width && e.getY() > 0 ++ && e.getY() < size.height) ++ { ++ manager.clearSelectedPath(); ++ menuItem.doClick(); ++ } ++ ++ else ++ manager.processMouseEvent(e); ++ } ++ } ++ ++ /** ++ * This class handles mouse dragged events. ++ */ ++ protected class MenuDragMouseHandler implements MenuDragMouseListener ++ { ++ /** ++ * Tbis method is invoked when mouse is dragged over the menu item. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseDragged(MenuDragMouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(e.getPath()); ++ } ++ ++ /** ++ * Tbis method is invoked when mouse enters the menu item while it is ++ * being dragged. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseEntered(MenuDragMouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(e.getPath()); ++ } ++ ++ /** ++ * Tbis method is invoked when mouse exits the menu item while ++ * it is being dragged ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseExited(MenuDragMouseEvent e) ++ { ++ } ++ ++ /** ++ * Tbis method is invoked when mouse was dragged and released ++ * inside the menu item. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseReleased(MenuDragMouseEvent e) ++ { ++ MenuElement[] path = e.getPath(); ++ ++ if (path[path.length - 1] instanceof JMenuItem) ++ ((JMenuItem) path[path.length - 1]).doClick(); ++ ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ } ++ ++ /** ++ * This class handles key events occuring when menu item is visible on the ++ * screen. ++ */ ++ protected class MenuKeyHandler implements MenuKeyListener ++ { ++ /** ++ * This method is invoked when key has been pressed ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyPressed(MenuKeyEvent e) ++ { ++ } ++ ++ /** ++ * This method is invoked when key has been pressed ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyReleased(MenuKeyEvent e) ++ { ++ } ++ ++ /** ++ * This method is invoked when key has been typed ++ * It handles the mnemonic key for the menu item. ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyTyped(MenuKeyEvent e) ++ { ++ } ++ } ++ ++ /** ++ * Helper class that listens for changes to the properties of the {@link ++ * JMenuItem}. ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called when one of the menu item's properties change. ++ * ++ * @param evt A {@link PropertyChangeEvent}. ++ */ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ menuItem.revalidate(); ++ menuItem.repaint(); ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicMenuUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicMenuUI.java +diff -N javax/swing/plaf/basic/BasicMenuUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicMenuUI.java 6 Sep 2004 16:36:05 -0000 +@@ -0,0 +1,528 @@ ++/* BasicMenuUI.java ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.event.FocusAdapter; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.JComponent; ++import javax.swing.JMenu; ++import javax.swing.JMenuBar; ++import javax.swing.JMenuItem; ++import javax.swing.JPopupMenu; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.MenuDragMouseEvent; ++import javax.swing.event.MenuDragMouseListener; ++import javax.swing.event.MenuEvent; ++import javax.swing.event.MenuKeyEvent; ++import javax.swing.event.MenuKeyListener; ++import javax.swing.event.MenuListener; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.MenuItemUI; ++ ++ ++/** ++ * UI Delegate for JMenu ++ */ ++public class BasicMenuUI extends BasicMenuItemUI ++{ ++ protected ChangeListener changeListener; ++ ++ /* MenuListener listens to MenuEvents fired by JMenu */ ++ protected MenuListener menuListener; ++ ++ /* PropertyChangeListner that listens to propertyChangeEvents occuring in JMenu*/ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** ++ * Creates a new BasicMenuUI object. ++ */ ++ public BasicMenuUI() ++ { ++ mouseInputListener = createMouseInputListener((JMenu) menuItem); ++ menuListener = createMenuListener((JMenu) menuItem); ++ propertyChangeListener = createPropertyChangeListener((JMenu) menuItem); ++ } ++ ++ /** ++ * This method creates a new ChangeListener. ++ * ++ * @return A new ChangeListener. ++ */ ++ protected ChangeListener createChangeListener(JComponent c) ++ { ++ return new ChangeHandler(); ++ } ++ ++ /** ++ * This method creates new MenuDragMouseListener to listen to mouse dragged events ++ * occuring in the Menu ++ * ++ * @param c the menu to listen to ++ * ++ * @return The MenuDrageMouseListener ++ */ ++ protected MenuDragMouseListener createMenuDragMouseListener(JComponent c) ++ { ++ return new MenuDragMouseHandler(); ++ } ++ ++ /** ++ * This method creates new MenuDragKeyListener to listen to key events ++ * ++ * @param c the menu to listen to ++ * ++ * @return The MenuKeyListener ++ */ ++ protected MenuKeyListener createMenuKeyListener(JComponent c) ++ { ++ return new MenuKeyHandler(); ++ } ++ ++ /** ++ * This method creates new MenuListener to listen to menu events ++ * occuring in the Menu ++ * ++ * @param c the menu to listen to ++ * ++ * @return The MenuListener ++ */ ++ protected MenuListener createMenuListener(JComponent c) ++ { ++ return new MenuHandler(); ++ } ++ ++ /** ++ * This method creates new MouseInputListener to listen to mouse input events ++ * occuring in the Menu ++ * ++ * @param c the menu to listen to ++ * ++ * @return The MouseInputListener ++ */ ++ protected MouseInputListener createMouseInputListener(JComponent c) ++ { ++ return new MouseInputHandler(); ++ } ++ ++ /** ++ * This method creates newPropertyChangeListener to listen to property changes ++ * occuring in the Menu ++ * ++ * @param c the menu to listen to ++ * ++ * @return The PropertyChangeListener ++ */ ++ protected PropertyChangeListener createPropertyChangeListener(JComponent c) ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method creates a new BasicMenuUI. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A new BasicMenuUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicMenuUI(); ++ } ++ ++ /** ++ * Get the component's maximum size. ++ * ++ * @param c The JComponent for which to get maximum size ++ * ++ * @return The maximum size of the component ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return null; ++ } ++ ++ /** ++ * Initializes any default properties that this UI has from the defaults for ++ * the Basic look and feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ menuItem.setBackground(defaults.getColor("Menu.background")); ++ menuItem.setBorder(defaults.getBorder("Menu.border")); ++ menuItem.setFont(defaults.getFont("Menu.font")); ++ menuItem.setForeground(defaults.getColor("Menu.foreground")); ++ menuItem.setMargin(defaults.getInsets("Menu.margin")); ++ acceleratorFont = defaults.getFont("Menu.acceleratorFont"); ++ acceleratorForeground = defaults.getColor("Menu.acceleratorForeground"); ++ acceleratorSelectionForeground = defaults.getColor("Menu.acceleratorSelectionForeground"); ++ selectionBackground = defaults.getColor("Menu.selectionBackground"); ++ selectionForeground = defaults.getColor("Menu.selectionForeground"); ++ arrowIcon = defaults.getIcon("Menu.arrowIcon"); ++ oldBorderPainted = defaults.getBoolean("Menu.borderPainted"); ++ menuItem.setOpaque(true); ++ } ++ ++ /** ++ * Installs any keyboard actions. The list of keys that need to be bound are ++ * listed in Basic look and feel's defaults. ++ * ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * Creates and registers all the listeners for this UI delegate. ++ */ ++ protected void installListeners() ++ { ++ ((JMenu) menuItem).addMouseListener(mouseInputListener); ++ ((JMenu) menuItem).addMouseMotionListener(mouseInputListener); ++ ((JMenu) menuItem).addMenuListener(menuListener); ++ ((JMenu) menuItem).addMenuDragMouseListener(menuDragMouseListener); ++ } ++ ++ protected void setupPostTimer(JMenu menu) ++ { ++ } ++ ++ /** ++ * This method uninstalls the defaults and sets any objects created during ++ * install to null ++ */ ++ protected void uninstallDefaults() ++ { ++ menuItem.setBackground(null); ++ menuItem.setBorder(null); ++ menuItem.setFont(null); ++ menuItem.setForeground(null); ++ menuItem.setMargin(null); ++ acceleratorFont = null; ++ acceleratorForeground = null; ++ acceleratorSelectionForeground = null; ++ selectionBackground = null; ++ selectionForeground = null; ++ arrowIcon = null; ++ } ++ ++ /** ++ * Uninstalls any keyboard actions. The list of keys used are listed in ++ * Basic look and feel's defaults. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * Unregisters all the listeners that this UI delegate was using. In ++ * addition, it will also null any listeners that it was using. ++ */ ++ protected void uninstallListeners() ++ { ++ ((JMenu) menuItem).removeMouseListener(mouseInputListener); ++ ((JMenu) menuItem).removeMenuListener(menuListener); ++ ((JMenu) menuItem).removePropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * This class is used by menus to handle mouse events occuring in the ++ * menu. ++ */ ++ protected class MouseInputHandler implements MouseInputListener ++ { ++ public void mouseClicked(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ public void mouseDragged(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ public void mouseEntered(MouseEvent e) ++ { ++ /* When mouse enters menu item, it should be considered selected ++ ++ if (i) if this menu is a submenu in some other menu ++ (ii) or if this menu is in a menu bar and some other menu in a menu bar was just ++ selected. (If nothing was selected, menu should be pressed before ++ it will be selected) ++ */ ++ JMenu menu = (JMenu) menuItem; ++ if (! menu.isTopLevelMenu() ++ || (menu.isTopLevelMenu() ++ && (((JMenuBar) menu.getParent()).isSelected() && ! menu.isArmed()))) ++ { ++ // set new selection and forward this event to MenuSelectionManager ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(getPath()); ++ manager.processMouseEvent(e); ++ } ++ } ++ ++ public void mouseExited(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ ++ public void mouseMoved(MouseEvent e) ++ { ++ } ++ ++ public void mousePressed(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ JMenu menu = (JMenu) menuItem; ++ manager.processMouseEvent(e); ++ ++ // Menu should be displayed when the menu is pressed only if ++ // it is top-level menu ++ if (menu.isTopLevelMenu()) ++ { ++ if (menu.getPopupMenu().isVisible()) ++ // If menu is visible and menu button was pressed.. ++ // then need to cancel the menu ++ manager.clearSelectedPath(); ++ else ++ { ++ // Display the menu ++ int x = 0; ++ int y = menu.getHeight(); ++ ++ manager.setSelectedPath(getPath()); ++ ++ JMenuBar mb = (JMenuBar) menu.getParent(); ++ ++ // set selectedIndex of the selectionModel of a menuBar ++ mb.getSelectionModel().setSelectedIndex(mb.getComponentIndex(menu)); ++ } ++ } ++ } ++ ++ public void mouseReleased(MouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.processMouseEvent(e); ++ } ++ } ++ ++ /** ++ * This class handles MenuEvents fired by the JMenu ++ */ ++ protected class MenuHandler implements MenuListener ++ { ++ /** ++ * This method is called when menu is cancelled. The menu is cancelled ++ * when its popup menu is closed without selection. It clears selected index ++ * in the selectionModel of the menu parent. ++ * ++ * @param e The MenuEvent. ++ */ ++ public void menuCanceled(MenuEvent e) ++ { ++ menuDeselected(e); ++ } ++ ++ /** ++ * This method is called when menu is deselected. It clears selected index ++ * in the selectionModel of the menu parent. ++ * ++ * @param e The MenuEvent. ++ */ ++ public void menuDeselected(MenuEvent e) ++ { ++ JMenu menu = (JMenu) menuItem; ++ if (menu.isTopLevelMenu()) ++ ((JMenuBar) menu.getParent()).getSelectionModel().clearSelection(); ++ else ++ ((JPopupMenu) menu.getParent()).getSelectionModel().clearSelection(); ++ } ++ ++ /** ++ * This method is called when menu is selected. It sets selected index ++ * in the selectionModel of the menu parent. ++ * ++ * @param e The MenuEvent. ++ */ ++ public void menuSelected(MenuEvent e) ++ { ++ JMenu menu = (JMenu) menuItem; ++ if (menu.isTopLevelMenu()) ++ ((JMenuBar) menu.getParent()).setSelected(menu); ++ else ++ ((JPopupMenu) menu.getParent()).setSelected(menu); ++ } ++ } ++ ++ /** ++ * This class handles PropertyChangeEvents fired from the JMenu ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called whenever one of the properties of the menu item ++ * changes. ++ * ++ * @param e The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ } ++ } ++ ++ protected class ChangeHandler implements ChangeListener ++ { ++ public void stateChanged(ChangeEvent e) ++ { ++ // FIXME: It seems that this class is not used anywhere ++ } ++ } ++ ++ /** ++ * This class handles mouse dragged events occuring in the menu. ++ */ ++ protected class MenuDragMouseHandler implements MenuDragMouseListener ++ { ++ /** ++ * This method is invoked when mouse is dragged over the menu item. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseDragged(MenuDragMouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(e.getPath()); ++ } ++ ++ /** ++ * This method is invoked when mouse enters the menu item while it is ++ * being dragged. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseEntered(MenuDragMouseEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.setSelectedPath(e.getPath()); ++ } ++ ++ /** ++ * This method is invoked when mouse exits the menu item while ++ * it is being dragged ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseExited(MenuDragMouseEvent e) ++ { ++ } ++ ++ /** ++ * This method is invoked when mouse was dragged and released ++ * inside the menu item. ++ * ++ * @param e The MenuDragMouseEvent ++ */ ++ public void menuDragMouseReleased(MenuDragMouseEvent e) ++ { ++ } ++ } ++ ++ /** ++ * This class handles key events occuring when menu item is visible on the ++ * screen. ++ */ ++ protected class MenuKeyHandler implements MenuKeyListener ++ { ++ /** ++ * This method is invoked when key has been pressed ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyPressed(MenuKeyEvent e) ++ { ++ } ++ ++ /** ++ * This method is invoked when key has been pressed ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyReleased(MenuKeyEvent e) ++ { ++ } ++ ++ /** ++ * This method is invoked when key has been typed ++ * It handles the mnemonic key for the menu item. ++ * ++ * @param e A {@link MenuKeyEvent}. ++ */ ++ public void menuKeyTyped(MenuKeyEvent e) ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicOptionPaneUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicOptionPaneUI.java,v +retrieving revision 1.6 +diff -u -r1.6 BasicOptionPaneUI.java +--- javax/swing/plaf/basic/BasicOptionPaneUI.java 10 Jan 2004 21:59:30 -0000 1.6 ++++ javax/swing/plaf/basic/BasicOptionPaneUI.java 6 Sep 2004 16:36:06 -0000 +@@ -1,5 +1,5 @@ + /* BasicOptionPaneUI.java +- Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ Copyright (C) 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,124 +35,1295 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + ++import java.awt.BorderLayout; ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Container; + import java.awt.Dimension; ++import java.awt.FlowLayout; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.GridBagConstraints; ++import java.awt.GridBagLayout; ++import java.awt.Insets; + import java.awt.LayoutManager; ++import java.awt.Polygon; ++import java.awt.Rectangle; ++import java.awt.Window; + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.beans.PropertyVetoException; ++import javax.swing.Box; ++import javax.swing.BoxLayout; ++import javax.swing.Icon; + import javax.swing.JButton; ++import javax.swing.JComboBox; + import javax.swing.JComponent; ++import javax.swing.JDialog; ++import javax.swing.JInternalFrame; + import javax.swing.JLabel; ++import javax.swing.JList; + import javax.swing.JOptionPane; ++import javax.swing.JPanel; ++import javax.swing.JTextField; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.border.Border; + import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.IconUIResource; + import javax.swing.plaf.OptionPaneUI; + ++ ++/** ++ * This class is the UI delegate for JOptionPane in the Basic Look and Feel. ++ */ + public class BasicOptionPaneUI extends OptionPaneUI + { +- JOptionPane pane; ++ /** ++ * This is a helper class that listens to the buttons located at the bottom ++ * of the JOptionPane. ++ */ ++ protected class ButtonActionListener implements ActionListener ++ { ++ /** The index of the option this button represents. */ ++ protected int buttonIndex; ++ ++ /** ++ * Creates a new ButtonActionListener object with the given buttonIndex. ++ * ++ * @param buttonIndex The index of the option this button represents. ++ */ ++ public ButtonActionListener(int buttonIndex) ++ { ++ this.buttonIndex = buttonIndex; ++ } ++ ++ /** ++ * This method is called when one of the option buttons are pressed. ++ * ++ * @param e The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ Object value = new Integer(JOptionPane.CLOSED_OPTION); ++ Object[] options = optionPane.getOptions(); ++ if (options != null) ++ value = new Integer(buttonIndex); ++ else ++ { ++ String text = ((JButton) e.getSource()).getText(); ++ if (text.equals(OK_STRING)) ++ value = new Integer(JOptionPane.OK_OPTION); ++ if (text.equals(CANCEL_STRING)) ++ value = new Integer(JOptionPane.CANCEL_OPTION); ++ if (text.equals(YES_STRING)) ++ value = new Integer(JOptionPane.YES_OPTION); ++ if (text.equals(NO_STRING)) ++ value = new Integer(JOptionPane.NO_OPTION); ++ } ++ optionPane.setValue(value); ++ resetInputValue(); ++ ++ Window owner = SwingUtilities.windowForComponent(optionPane); ++ ++ if (owner instanceof JDialog) ++ ((JDialog) owner).dispose(); ++ ++ //else we probably have some kind of internal frame. ++ JInternalFrame inf = (JInternalFrame) SwingUtilities.getAncestorOfClass(JInternalFrame.class, ++ optionPane); ++ if (inf != null) ++ { ++ try ++ { ++ inf.setClosed(true); ++ } ++ catch (PropertyVetoException pve) ++ { ++ } ++ } ++ } ++ } + +- BasicOptionPaneUI() ++ /** ++ * This helper layout manager is responsible for the layout of the button ++ * area. The button area is the panel that holds the buttons which ++ * represent the options. ++ */ ++ protected class ButtonAreaLayout implements LayoutManager ++ { ++ /** Whether this layout will center the buttons. */ ++ protected boolean centersChildren = true; ++ ++ /** The space between the buttons. */ ++ protected int padding; ++ ++ /** Whether the buttons will share the same widths. */ ++ protected boolean syncAllWidths; ++ ++ /** The width of the widest button. */ ++ private transient int widthOfWidestButton; ++ ++ /** The height of the tallest button. */ ++ private transient int tallestButton; ++ ++ /** ++ * Creates a new ButtonAreaLayout object with the given sync widths ++ * property and padding. ++ * ++ * @param syncAllWidths Whether the buttons will share the same widths. ++ * @param padding The padding between the buttons. ++ */ ++ public ButtonAreaLayout(boolean syncAllWidths, int padding) + { ++ this.syncAllWidths = syncAllWidths; ++ this.padding = padding; + } + +- public static ComponentUI createUI(JComponent x) ++ /** ++ * This method is called when a component is added to the container. ++ * ++ * @param string The constraints string. ++ * @param comp The component added. ++ */ ++ public void addLayoutComponent(String string, Component comp) + { +- return new BasicOptionPaneUI(); ++ // Do nothing. + } + +- public void installUI(JComponent c) ++ /** ++ * This method returns whether the children will be centered. ++ * ++ * @return Whether the children will be centered. ++ */ ++ public boolean getCentersChildren() + { +- super.installUI(c); +- pane = (JOptionPane)c; ++ return centersChildren; ++ } + +- System.out.println(" -------------: " + pane); ++ /** ++ * This method returns the amount of space between components. ++ * ++ * @return The amount of space between components. ++ */ ++ public int getPadding() ++ { ++ return padding; ++ } + +- JLabel message = null; +- JButton ok_button = new JButton("Ok"); ++ /** ++ * This method returns whether all components will share widths (set to ++ * largest width). ++ * ++ * @return Whether all components will share widths. ++ */ ++ public boolean getSyncAllWidths() ++ { ++ return syncAllWidths; ++ } + +- ok_button.addActionListener(new ActionListener() ++ /** ++ * This method lays out the given container. ++ * ++ * @param container The container to lay out. ++ */ ++ public void layoutContainer(Container container) ++ { ++ Component[] buttonList = container.getComponents(); ++ int x = container.getInsets().left; ++ if (getCentersChildren()) ++ x += (int) ((double) (container.getSize().width) / 2 ++ - (double) (buttonRowLength(container)) / 2); ++ for (int i = 0; i < buttonList.length; i++) ++ { ++ Dimension dims = buttonList[i].getPreferredSize(); ++ if (getSizeButtonsToSameWidth()) + { +- public void actionPerformed(ActionEvent a) +- { +- System.out.println("ACTION ---> " + a); +- // pane.dialog.dispose(); +- +- if (pane.dialog.isModal()) +- { +- System.out.println("modal dialog !!"); +- pane.dialog.setModal(false); +- } +- pane.dialog.setVisible(false); +- } +- }); +- +- Object[] options = null; +- if (options != null) ++ buttonList[i].setBounds(x, 0, widthOfWidestButton, dims.height); ++ x += widthOfWidestButton + getPadding(); ++ } ++ else + { +- for (int i=0; i maxll) ++ { ++ Box tmp = new Box(BoxLayout.Y_AXIS); ++ burstStringInto(tmp, msg.toString(), maxll); ++ addMessageComponents(container, cons, tmp, maxll, true); ++ } ++ else ++ addMessageComponents(container, cons, new JLabel(msg.toString()), ++ maxll, true); ++ } ++ } ++ ++ /** ++ * This method creates instances of d (recursively if necessary based on ++ * maxll) and adds to c. ++ * ++ * @param c The container to add to. ++ * @param d The string to burst. ++ * @param maxll The max line length. ++ */ ++ protected void burstStringInto(Container c, String d, int maxll) + { +- throw new Error ("Not implemented"); ++ // FIXME: Verify that this is the correct behaviour. ++ // One interpretation of the spec is that this method ++ // should recursively call itself to create (and add) ++ // JLabels to the container if the length of the String d ++ // is greater than maxll. ++ // but in practice, even with a really long string, this is ++ // all that happens. ++ if (d == null || c == null) ++ return; ++ JLabel label = new JLabel(d); ++ c.add(label); + } + ++ /** ++ * This method returns true if the given JOptionPane contains custom ++ * components. ++ * ++ * @param op The JOptionPane to check. ++ * ++ * @return True if the JOptionPane contains custom components. ++ */ + public boolean containsCustomComponents(JOptionPane op) + { +- throw new Error ("Not implemented"); ++ return hasCustomComponents; ++ } ++ ++ /** ++ * This method creates a button action listener for the given button index. ++ * ++ * @param buttonIndex The index of the button in components. ++ * ++ * @return A new ButtonActionListener. ++ */ ++ protected ActionListener createButtonActionListener(int buttonIndex) ++ { ++ return new ButtonActionListener(buttonIndex); ++ } ++ ++ /** ++ * This method creates the button area. ++ * ++ * @return A new Button Area. ++ */ ++ protected Container createButtonArea() ++ { ++ JPanel buttonPanel = new JPanel(); ++ ++ buttonPanel.setLayout(createLayoutManager()); ++ addButtonComponents(buttonPanel, getButtons(), getInitialValueIndex()); ++ ++ return buttonPanel; ++ } ++ ++ /** ++ * This method creates a new LayoutManager for the button area. ++ * ++ * @return A new LayoutManager for the button area. ++ */ ++ protected LayoutManager createLayoutManager() ++ { ++ return new ButtonAreaLayout(getSizeButtonsToSameWidth(), 6); ++ } ++ ++ /** ++ * This method creates the message area. ++ * ++ * @return A new message area. ++ */ ++ protected Container createMessageArea() ++ { ++ JPanel messageArea = new JPanel(); ++ messageArea.setLayout(new BorderLayout()); ++ addIcon(messageArea); ++ ++ JPanel rightSide = new JPanel() ++ { ++ public Dimension getPreferredSize() ++ { ++ int w = Math.max(optionPane.getSize().width, minimumWidth); ++ Insets i = optionPane.getInsets(); ++ Dimension orig = super.getPreferredSize(); ++ Dimension value = new Dimension(w - i.left - i.right - iconSize, ++ orig.height); ++ return value; ++ } ++ }; ++ rightSide.setLayout(new GridBagLayout()); ++ GridBagConstraints con = createConstraints(); ++ ++ addMessageComponents(rightSide, con, getMessage(), ++ getMaxCharactersPerLineCount(), false); ++ ++ if (optionPane.getWantsInput()) ++ { ++ Object[] selection = optionPane.getSelectionValues(); ++ ++// if (selection == null) ++// inputComponent = new JTextField(); ++// else if (selection.length < 20) ++// inputComponent = new JComboBox(selection); ++ // FIXME: Uncomment when the widgets are done. ++ if (selection == null) ++ inputComponent = null; ++ else ++ inputComponent = new JList(selection); ++ if (inputComponent != null) ++ { ++ addMessageComponents(rightSide, con, inputComponent, ++ getMaxCharactersPerLineCount(), true); ++ resetSelectedValue(); ++ selectInitialValue(optionPane); ++ } ++ } ++ ++ messageArea.add(rightSide, BorderLayout.EAST); ++ ++ return messageArea; ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener for listening to the ++ * JOptionPane. ++ * ++ * @return A new PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method creates a Container that will separate the message and button ++ * areas. ++ * ++ * @return A Container that will separate the message and button areas. ++ */ ++ protected Container createSeparator() ++ { ++ return null; ++ } ++ ++ /** ++ * This method creates a new BasicOptionPaneUI for the given component. ++ * ++ * @param x The component to create a UI for. ++ * ++ * @return A new BasicOptionPaneUI. ++ */ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicOptionPaneUI(); ++ } ++ ++ /** ++ * This method returns the buttons for the JOptionPane. If no options are ++ * set, a set of options will be created based upon the optionType. ++ * ++ * @return The buttons that will be added. ++ */ ++ protected Object[] getButtons() ++ { ++ if (optionPane.getOptions() != null) ++ return optionPane.getOptions(); ++ switch (optionPane.getOptionType()) ++ { ++ case JOptionPane.YES_NO_OPTION: ++ return new Object[] { YES_STRING, NO_STRING }; ++ case JOptionPane.YES_NO_CANCEL_OPTION: ++ return new Object[] { YES_STRING, NO_STRING, CANCEL_STRING }; ++ case JOptionPane.OK_CANCEL_OPTION: ++ case JOptionPane.DEFAULT_OPTION: ++ return new Object[] { OK_STRING, CANCEL_STRING }; ++ } ++ return null; ++ } ++ ++ /** ++ * This method will return the icon the user has set or the icon that will ++ * be used based on message type. ++ * ++ * @return The icon to use in the JOptionPane. ++ */ ++ protected Icon getIcon() ++ { ++ if (optionPane.getIcon() != null) ++ return optionPane.getIcon(); ++ else ++ return getIconForType(optionPane.getMessageType()); ++ } ++ ++ /** ++ * This method returns the icon for the given messageType. ++ * ++ * @param messageType The type of message. ++ * ++ * @return The icon for the given messageType. ++ */ ++ protected Icon getIconForType(int messageType) ++ { ++ Icon tmp = null; ++ switch (messageType) ++ { ++ case JOptionPane.ERROR_MESSAGE: ++ tmp = errorIcon; ++ break; ++ case JOptionPane.INFORMATION_MESSAGE: ++ tmp = infoIcon; ++ break; ++ case JOptionPane.WARNING_MESSAGE: ++ tmp = warningIcon; ++ break; ++ case JOptionPane.QUESTION_MESSAGE: ++ tmp = questionIcon; ++ break; ++ } ++ return tmp; ++ // FIXME: Don't cast till the default icons are in. ++ // return new IconUIResource(tmp); ++ } ++ ++ /** ++ * This method returns the index of the initialValue in the options array. ++ * ++ * @return The index of the initalValue. ++ */ ++ protected int getInitialValueIndex() ++ { ++ Object[] buttons = getButtons(); ++ ++ if (buttons == null) ++ return -1; ++ ++ Object select = optionPane.getInitialValue(); ++ ++ for (int i = 0; i < buttons.length; i++) ++ { ++ if (select == buttons[i]) ++ return i; ++ } ++ return 0; ++ } ++ ++ /** ++ * This method returns the maximum number of characters that should be ++ * placed on a line. ++ * ++ * @return The maximum number of characteres that should be placed on a ++ * line. ++ */ ++ protected int getMaxCharactersPerLineCount() ++ { ++ return optionPane.getMaxCharactersPerLineCount(); ++ } ++ ++ /** ++ * This method returns the maximum size. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the message of the JOptionPane. ++ * ++ * @return The message. ++ */ ++ protected Object getMessage() ++ { ++ return optionPane.getMessage(); ++ } ++ ++ /** ++ * This method returns the minimum size of the JOptionPane. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumOptionPaneSize() ++ { ++ return minimumSize; ++ } ++ ++ /** ++ * This method returns the minimum size. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size of the JOptionPane. The preferred ++ * size is the maximum of the size desired by the layout and the minimum ++ * size. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ Dimension d = optionPane.getLayout().preferredLayoutSize(optionPane); ++ Dimension d2 = getMinimumOptionPaneSize(); ++ ++ int w = Math.max(d.width, d2.width); ++ int h = Math.max(d.height, d2.height); ++ return new Dimension(w, h); ++ } ++ ++ /** ++ * This method returns whether all buttons should have the same width. ++ * ++ * @return Whether all buttons should have the same width. ++ */ ++ protected boolean getSizeButtonsToSameWidth() ++ { ++ return true; ++ } ++ ++ /** ++ * This method installs components for the JOptionPane. ++ */ ++ protected void installComponents() ++ { ++ // reset it. ++ hasCustomComponents = false; ++ Container msg = createMessageArea(); ++ if (msg != null) ++ { ++ ((JComponent) msg).setBorder(messageBorder); ++ msg.setForeground(messageForeground); ++ messageAreaContainer = msg; ++ optionPane.add(msg); ++ } ++ ++ Container sep = createSeparator(); ++ if (sep != null) ++ optionPane.add(sep); ++ ++ Container button = createButtonArea(); ++ if (button != null) ++ { ++ ((JComponent) button).setBorder(buttonBorder); ++ buttonContainer = button; ++ optionPane.add(button); ++ } ++ ++ optionPane.invalidate(); ++ } ++ ++ /** ++ * This method installs defaults for the JOptionPane. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ optionPane.setFont(defaults.getFont("OptionPane.font")); ++ optionPane.setBackground(defaults.getColor("OptionPane.background")); ++ optionPane.setForeground(defaults.getColor("OptionPane.foreground")); ++ optionPane.setBorder(defaults.getBorder("OptionPane.border")); ++ ++ messageBorder = defaults.getBorder("OptionPane.messageAreaBorder"); ++ messageForeground = defaults.getColor("OptionPane.messageForeground"); ++ buttonBorder = defaults.getBorder("OptionPane.buttonAreaBorder"); ++ ++ minimumSize = defaults.getDimension("OptionPane.minimumSize"); ++ minimumWidth = minimumSize.width; ++ minimumHeight = minimumSize.height; ++ ++ // FIXME: Image icons don't seem to work properly right now. ++ // Once they do, replace the synthetic icons with these ones. ++ ++ /* ++ warningIcon = (IconUIResource) defaults.getIcon("OptionPane.warningIcon"); ++ infoIcon = (IconUIResource) defaults.getIcon("OptionPane.informationIcon"); ++ errorIcon = (IconUIResource) defaults.getIcon("OptionPane.errorIcon"); ++ questionIcon = (IconUIResource) defaults.getIcon("OptionPane.questionIcon"); ++ */ ++ } ++ ++ /** ++ * This method installs keyboard actions for the JOptionpane. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method installs listeners for the JOptionPane. ++ */ ++ protected void installListeners() ++ { ++ propertyChangeListener = createPropertyChangeListener(); ++ ++ optionPane.addPropertyChangeListener(propertyChangeListener); ++ } ++ ++ /** ++ * This method installs the UI for the JOptionPane. ++ * ++ * @param c The JComponent to install the UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ if (c instanceof JOptionPane) ++ { ++ optionPane = (JOptionPane) c; ++ ++ installDefaults(); ++ installComponents(); ++ installListeners(); ++ installKeyboardActions(); ++ } ++ } ++ ++ /** ++ * Changes the inputValue property in the JOptionPane based on the current ++ * value of the inputComponent. ++ */ ++ protected void resetInputValue() ++ { ++ if (optionPane.getWantsInput() && inputComponent != null) ++ { ++ Object output = null; ++ if (inputComponent instanceof JTextField) ++ output = ((JTextField) inputComponent).getText(); ++ else if (inputComponent instanceof JComboBox) ++ output = ((JComboBox) inputComponent).getSelectedItem(); ++ else if (inputComponent instanceof JList) ++ output = ((JList) inputComponent).getSelectedValue(); ++ ++ if (output != null) ++ optionPane.setInputValue(output); ++ } ++ } ++ ++ /** ++ * This method requests focus to the inputComponent (if one is present) and ++ * the initialFocusComponent otherwise. ++ * ++ * @param op The JOptionPane. ++ */ ++ public void selectInitialValue(JOptionPane op) ++ { ++ if (inputComponent != null) ++ { ++ inputComponent.requestFocus(); ++ return; ++ } ++ if (initialFocusComponent != null) ++ initialFocusComponent.requestFocus(); ++ } ++ ++ /** ++ * This method resets the value in the inputComponent to the ++ * initialSelectionValue property. ++ */ ++ private void resetSelectedValue() ++ { ++ if (inputComponent != null) ++ { ++ Object init = optionPane.getInitialSelectionValue(); ++ if (init == null) ++ return; ++ if (inputComponent instanceof JTextField) ++ ((JTextField) inputComponent).setText((String) init); ++ else if (inputComponent instanceof JComboBox) ++ ((JComboBox) inputComponent).setSelectedItem(init); ++ else if (inputComponent instanceof JList) ++ { ++ // ((JList) inputComponent).setSelectedValue(init, true); ++ } ++ } ++ } ++ ++ /** ++ * This method uninstalls all the components in the JOptionPane. ++ */ ++ protected void uninstallComponents() ++ { ++ optionPane.removeAll(); ++ buttonContainer = null; ++ messageAreaContainer = null; ++ } ++ ++ /** ++ * This method uninstalls the defaults for the JOptionPane. ++ */ ++ protected void uninstallDefaults() ++ { ++ optionPane.setFont(null); ++ optionPane.setForeground(null); ++ optionPane.setBackground(null); ++ ++ minimumSize = null; ++ ++ messageBorder = null; ++ buttonBorder = null; ++ messageForeground = null; ++ ++ // FIXME: ImageIcons don't seem to work properly ++ ++ /* ++ warningIcon = null; ++ errorIcon = null; ++ questionIcon = null; ++ infoIcon = null; ++ */ ++ } ++ ++ /** ++ * This method uninstalls keyboard actions for the JOptionPane. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method uninstalls listeners for the JOptionPane. ++ */ ++ protected void uninstallListeners() ++ { ++ optionPane.removePropertyChangeListener(propertyChangeListener); ++ propertyChangeListener = null; ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. ++ * ++ * @param c The JComponent to uninstall for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallComponents(); ++ uninstallDefaults(); ++ ++ optionPane = null; + } + } +Index: javax/swing/plaf/basic/BasicPanelUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicPanelUI.java,v +retrieving revision 1.3 +diff -u -r1.3 BasicPanelUI.java +--- javax/swing/plaf/basic/BasicPanelUI.java 10 Jan 2004 21:59:30 -0000 1.3 ++++ javax/swing/plaf/basic/BasicPanelUI.java 6 Sep 2004 16:36:06 -0000 +@@ -44,8 +44,6 @@ + + public class BasicPanelUI extends PanelUI + { +- int gap = 3; +- + public static ComponentUI createUI(JComponent x) + { + return new BasicPanelUI(); +@@ -53,6 +51,6 @@ + + public void installUI(JComponent c) + { +- super.installUI(c); ++ super.installUI(c); + } + } +Index: javax/swing/plaf/basic/BasicPasswordFieldUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicPasswordFieldUI.java +diff -N javax/swing/plaf/basic/BasicPasswordFieldUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicPasswordFieldUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,61 @@ ++/* BasicPasswordFieldUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.plaf.basic; ++ ++import javax.swing.JComponent; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.text.Element; ++import javax.swing.text.View; ++ ++public class BasicPasswordFieldUI extends BasicTextFieldUI ++{ ++ public BasicPasswordFieldUI() ++ { ++ } ++ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicPasswordFieldUI(); ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return "PasswordField"; ++ } ++} +Index: javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java +diff -N javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,118 @@ ++/* BasicPopupMenuSeparatorUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import javax.swing.JComponent; ++import javax.swing.JPopupMenu; ++import javax.swing.JSeparator; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.SeparatorUI; ++ ++ ++/** ++ * The Basic Look and Feel UI delegate for JPopupMenu.Separator. ++ */ ++public class BasicPopupMenuSeparatorUI extends BasicSeparatorUI ++{ ++ /** ++ * Creates a new BasicPopupMenuSeparatorUI object. ++ */ ++ public BasicPopupMenuSeparatorUI() ++ { ++ super(); ++ } ++ ++ /** ++ * Creates a new UI delegate for the given JComponent. ++ * ++ * @param c The JComponent to create a delegate for. ++ * ++ * @return A new BasicPopupMenuSeparatorUI ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicPopupMenuSeparatorUI(); ++ } ++ ++ /** ++ * The Popup Menu Separator has two lines. The top line will be ++ * painted using highlight color and the bottom using shadow color. ++ * ++ * @param g The Graphics object to paint with ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ if (! (c instanceof JPopupMenu.Separator)) ++ return; ++ ++ Rectangle r = new Rectangle(); ++ SwingUtilities.calculateInnerArea(c, r); ++ Color saved = g.getColor(); ++ ++ int midAB = r.width / 2 + r.x; ++ int midAD = r.height / 2 + r.y; ++ ++ g.setColor(highlight); ++ g.drawLine(r.x, midAD, r.x + r.width, midAD); ++ ++ g.setColor(shadow); ++ g.drawLine(r.x, midAD + 1, r.x + r.width, midAD + 1); ++ } ++ ++ /** ++ * This method returns the preferred size of the ++ * JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return super.getPreferredSize(c); ++ } ++} +Index: javax/swing/plaf/basic/BasicPopupMenuUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicPopupMenuUI.java +diff -N javax/swing/plaf/basic/BasicPopupMenuUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicPopupMenuUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,433 @@ ++/* BasicPopupMenuUI.java ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.AWTKeyStroke; ++import java.awt.BasicStroke; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.GridBagLayout; ++import java.awt.GridLayout; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import java.awt.Stroke; ++import java.awt.event.ComponentEvent; ++import java.awt.event.ComponentListener; ++import java.awt.event.FocusAdapter; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.util.EventListener; ++import javax.swing.AbstractButton; ++import javax.swing.ButtonModel; ++import javax.swing.Icon; ++import javax.swing.JCheckBoxMenuItem; ++import javax.swing.JComponent; ++import javax.swing.JMenuItem; ++import javax.swing.JPopupMenu; ++import javax.swing.JRadioButtonMenuItem; ++import javax.swing.KeyStroke; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.MenuDragMouseEvent; ++import javax.swing.event.MenuDragMouseListener; ++import javax.swing.event.MenuKeyEvent; ++import javax.swing.event.MenuKeyListener; ++import javax.swing.event.MouseInputListener; ++import javax.swing.event.PopupMenuEvent; ++import javax.swing.event.PopupMenuListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.MenuItemUI; ++import javax.swing.plaf.PopupMenuUI; ++ ++ ++/** ++ * UI Delegate for JPopupMenu ++ */ ++public class BasicPopupMenuUI extends PopupMenuUI ++{ ++ /* popupMenu for which this UI delegate is for*/ ++ protected JPopupMenu popupMenu; ++ ++ /* MouseInputListener listens to mouse events */ ++ private static transient MouseInputListener mouseInputListener; ++ ++ /* PopupMenuListener listens to popup menu events fired by JPopupMenu*/ ++ private transient PopupMenuListener popupMenuListener; ++ ++ /* ComponentListener listening to popupMenu's invoker. */ ++ private TopWindowListener topWindowListener; ++ ++ /** ++ * Creates a new BasicPopupMenuUI object. ++ */ ++ public BasicPopupMenuUI() ++ { ++ popupMenuListener = new PopupMenuHandler(); ++ mouseInputListener = new MouseInputHandler(); ++ topWindowListener = new TopWindowListener(); ++ } ++ ++ /** ++ * Factory method to create a BasicPopupMenuUI for the given {@link ++ * JComponent}, which should be a {@link JMenuItem}. ++ * ++ * @param x The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicPopupMenuUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicPopupMenuUI(); ++ } ++ ++ /** ++ * Installs and initializes all fields for this UI delegate. Any properties ++ * of the UI that need to be initialized and/or set to defaults will be ++ * done now. It will also install any listeners necessary. ++ * ++ * @param c The {@link JComponent} that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ popupMenu = (JPopupMenu) c; ++ popupMenu.setLayout(new GridBagLayout()); ++ popupMenu.setBorderPainted(true); ++ JPopupMenu.setDefaultLightWeightPopupEnabled(true); ++ ++ installDefaults(); ++ installListeners(); ++ } ++ ++ /** ++ * This method installs the defaults that are defined in the Basic look and ++ * feel for this {@link JPopupMenu}. ++ */ ++ public void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ popupMenu.setBackground(defaults.getColor("PopupMenu.background")); ++ popupMenu.setBorder(defaults.getBorder("PopupMenu.border")); ++ popupMenu.setFont(defaults.getFont("PopupMenu.font")); ++ popupMenu.setForeground(defaults.getColor("PopupMenu.foreground")); ++ popupMenu.setOpaque(true); ++ } ++ ++ /** ++ * This method installs the listeners for the {@link JMenuItem}. ++ */ ++ protected void installListeners() ++ { ++ popupMenu.addMouseListener(mouseInputListener); ++ popupMenu.addMouseMotionListener(mouseInputListener); ++ popupMenu.addPopupMenuListener(popupMenuListener); ++ } ++ ++ /** ++ * This method installs the keyboard actions for this {@link JPopupMenu}. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * Performs the opposite of installUI. Any properties or resources that need ++ * to be cleaned up will be done now. It will also uninstall any listeners ++ * it has. In addition, any properties of this UI will be nulled. ++ * ++ * @param c The {@link JComponent} that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(); ++ uninstallDefaults(); ++ popupMenu = null; ++ } ++ ++ /** ++ * This method uninstalls the defaults and sets any objects created during ++ * install to null ++ */ ++ protected void uninstallDefaults() ++ { ++ popupMenu.setBackground(null); ++ popupMenu.setBorder(null); ++ popupMenu.setFont(null); ++ popupMenu.setForeground(null); ++ } ++ ++ /** ++ * Unregisters all the listeners that this UI delegate was using. ++ */ ++ protected void uninstallListeners() ++ { ++ popupMenu.removeMouseListener(mouseInputListener); ++ popupMenu.removeMouseMotionListener(mouseInputListener); ++ popupMenu.removePopupMenuListener(popupMenuListener); ++ } ++ ++ /** ++ * Uninstalls any keyboard actions. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Need to implement ++ } ++ ++ /** ++ * This method returns the minimum size of the JPopupMenu. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the preferred size of the JPopupMenu. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the minimum size of the JPopupMenu. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return null; ++ } ++ ++ /** ++ * Return true if given mouse event is a platform popup trigger, and false ++ * otherwise ++ * ++ * @param e MouseEvent that is to be checked for popup trigger event ++ * ++ * @return true if given mouse event is a platform popup trigger, and false ++ * otherwise ++ */ ++ public boolean isPopupTrigger(MouseEvent e) ++ { ++ return false; ++ } ++ ++ /** ++ * This listener handles PopupMenuEvents fired by JPopupMenu ++ */ ++ private class PopupMenuHandler implements PopupMenuListener ++ { ++ /** ++ * This method is invoked when JPopupMenu is cancelled. ++ * ++ * @param event the PopupMenuEvent ++ */ ++ public void popupMenuCanceled(PopupMenuEvent event) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ ++ /** ++ * This method is invoked when JPopupMenu becomes invisible ++ * ++ * @param event the PopupMenuEvent ++ */ ++ public void popupMenuWillBecomeInvisible(PopupMenuEvent event) ++ { ++ // remove listener that listens to component events fired ++ // by the top - level window that this popup belongs to. ++ Component invoker = popupMenu.getInvoker(); ++ ++ Container rootContainer = (Container) SwingUtilities.getRoot(invoker); ++ rootContainer.removeComponentListener(topWindowListener); ++ } ++ ++ /** ++ * This method is invoked when JPopupMenu becomes visible ++ * ++ * @param event the PopupMenuEvent ++ */ ++ public void popupMenuWillBecomeVisible(PopupMenuEvent event) ++ { ++ // Adds topWindowListener to top-level window to listener to ++ // ComponentEvents fired by it. We need to cancel this popup menu ++ // if topWindow to which this popup belongs was resized or moved. ++ Component invoker = popupMenu.getInvoker(); ++ Container rootContainer = (Container) SwingUtilities.getRoot(invoker); ++ rootContainer.addComponentListener(topWindowListener); ++ ++ // if this popup menu is a free floating popup menu, ++ // then by default its first element should be always selected when ++ // this popup menu becomes visible. ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ ++ if (manager.getSelectedPath().length == 0) ++ { ++ // Set selected path to point to the first item in the popup menu ++ MenuElement[] path = new MenuElement[2]; ++ path[0] = popupMenu; ++ Component[] comps = popupMenu.getComponents(); ++ if (comps.length != 0 && comps[0] instanceof MenuElement) ++ { ++ path[1] = (MenuElement) comps[0]; ++ manager.setSelectedPath(path); ++ } ++ } ++ } ++ } ++ ++ /** ++ * ComponentListener that listens to Component Events fired by the top - ++ * level window to which popup menu belongs. If top-level window was ++ * resized, moved or hidded then popup menu will be hidded and selected ++ * path of current menu hierarchy will be set to null. ++ */ ++ private class TopWindowListener implements ComponentListener ++ { ++ /** ++ * This method is invoked when top-level window is resized. This method ++ * closes current menu hierarchy. ++ * ++ * @param e The ComponentEvent ++ */ ++ public void componentResized(ComponentEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ ++ /** ++ * This method is invoked when top-level window is moved. This method ++ * closes current menu hierarchy. ++ * ++ * @param e The ComponentEvent ++ */ ++ public void componentMoved(ComponentEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ ++ /** ++ * This method is invoked when top-level window is shown This method does ++ * nothing by default. ++ * ++ * @param e The ComponentEvent ++ */ ++ public void componentShown(ComponentEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ ++ /** ++ * This method is invoked when top-level window is hidden This method ++ * closes current menu hierarchy. ++ * ++ * @param e The ComponentEvent ++ */ ++ public void componentHidden(ComponentEvent e) ++ { ++ MenuSelectionManager manager = MenuSelectionManager.defaultManager(); ++ manager.clearSelectedPath(); ++ } ++ } ++ ++ private class MouseInputHandler implements MouseInputListener ++ { ++ public void mouseClicked(MouseEvent e) ++ { ++ } ++ ++ public void mouseDragged(MouseEvent e) ++ { ++ } ++ ++ public void mouseEntered(MouseEvent e) ++ { ++ } ++ ++ public void mouseExited(MouseEvent e) ++ { ++ } ++ ++ public void mouseMoved(MouseEvent e) ++ { ++ } ++ ++ public void mousePressed(MouseEvent e) ++ { ++ } ++ ++ public void mouseReleased(MouseEvent e) ++ { ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicProgressBarUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicProgressBarUI.java +diff -N javax/swing/plaf/basic/BasicProgressBarUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicProgressBarUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,824 @@ ++/* BasicProgressBarUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.JComponent; ++import javax.swing.JProgressBar; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.Timer; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.ProgressBarUI; ++ ++ ++/** ++ * The Basic Look and Feel UI delegate for the ++ * JProgressBar. ++ */ ++public class BasicProgressBarUI extends ProgressBarUI ++{ ++ /** ++ * A helper class that listens for ChangeEvents ++ * from the progressBar's model. ++ */ ++ protected class ChangeHandler implements ChangeListener ++ { ++ /** ++ * Called every time the state of the model changes. ++ * ++ * @param e The ChangeEvent given by the model. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ // Nothing to do but repaint. ++ progressBar.repaint(); ++ } ++ } ++ ++ /** ++ * This helper class is used to listen for ++ * PropertyChangeEvents from the progressBar. ++ */ ++ private class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * Called every time the properties of the ++ * progressBar change. ++ * ++ * @param e The PropertyChangeEvent given by the progressBar. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ // Only need to listen for indeterminate changes. ++ // All other things are done on a repaint. ++ if (e.getPropertyName().equals(JProgressBar.INDETERMINATE_CHANGED_PROPERTY)) ++ if (((Boolean) e.getNewValue()).booleanValue()) ++ startAnimationTimer(); ++ else ++ stopAnimationTimer(); ++ else ++ progressBar.repaint(); ++ } ++ } ++ ++ /** ++ * This helper class is used to listen for ++ * the animationTimer's intervals. On every interval, ++ * the bouncing box should move. ++ */ ++ private class Animator implements ActionListener ++ { ++ /** ++ * Called every time the animationTimer reaches ++ * its interval. ++ * ++ * @param e The ActionEvent given by the timer. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ // Incrementing the animation index will cause ++ // a repaint. ++ incrementAnimationIndex(); ++ } ++ } ++ ++ /** The timer used to move the bouncing box. */ ++ private transient Timer animationTimer; ++ ++ // The total number of frames must be an even number. ++ // The total number of frames is calculated from ++ // the cycleTime and repaintInterval given by ++ // the basic Look and Feel defaults. ++ // ++ // +-----------------------------------------------+ ++ // | frame0 | frame1 | frame2 | frame 3 | frame 4 | ++ // | | frame7 | frame6 | frame 5 | | ++ // +-----------------------------------------------+ ++ ++ /** The current animation index. */ ++ private transient int animationIndex; ++ ++ /** The total number of frames.*/ ++ private transient int numFrames; ++ ++ /** The helper that moves the bouncing box. */ ++ private transient Animator animation; ++ ++ /** The helper that listens for property change events. */ ++ private transient PropertyChangeHandler propertyListener; ++ ++ /** The Listener for the model. */ ++ protected ChangeListener changeListener; ++ ++ /** The progressBar for this UI. */ ++ protected JProgressBar progressBar; ++ ++ /** The length of the cell. The cell is the painted part. */ ++ private transient int cellLength; ++ ++ /** The gap between cells. */ ++ private transient int cellSpacing; ++ ++ /** The color of the text when the bar is not over it.*/ ++ private transient Color selectionBackground; ++ ++ /** The color of the text when the bar is over it. */ ++ private transient Color selectionForeground; ++ ++ /** ++ * Creates a new BasicProgressBarUI object. ++ */ ++ public BasicProgressBarUI() ++ { ++ super(); ++ } ++ ++ /** ++ * Creates a new BasicProgressBarUI for the component. ++ * ++ * @param x The JComponent to create the UI for. ++ * ++ * @return A new BasicProgressBarUI. ++ */ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicProgressBarUI(); ++ } ++ ++ /** ++ * This method returns the length of the bar (from the minimum) ++ * in pixels (or units that the Graphics object draws in) based ++ * on the progressBar's getPercentComplete() value. ++ * ++ * @param b The insets of the progressBar. ++ * @param width The width of the progressBar. ++ * @param height The height of the progressBar. ++ * ++ * @return The length of the bar that should be painted in pixels. ++ */ ++ protected int getAmountFull(Insets b, int width, int height) ++ { ++ double percentDone = progressBar.getPercentComplete(); ++ if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) ++ return (int) (percentDone * (width - b.left - b.right)); ++ else ++ return (int) (percentDone * (height - b.top - b.bottom)); ++ } ++ ++ /** ++ * The current animation index. ++ * ++ * @return The current animation index. ++ */ ++ protected int getAnimationIndex() ++ { ++ return animationIndex; ++ } ++ ++ /** ++ * This method returns the size and position of the bouncing box ++ * for the current animation index. It stores the values in the ++ * given rectangle and returns it. It returns null if no box should ++ * be drawn. ++ * ++ * @param r The bouncing box rectangle. ++ * ++ * @return The bouncing box rectangle. ++ */ ++ protected Rectangle getBox(Rectangle r) ++ { ++ if (!progressBar.isIndeterminate()) ++ return null; ++ //numFrames has to be an even number as defined by spec. ++ int iterations = numFrames / 2 + 1; ++ ++ double boxDependent; ++ double boxIndependent; ++ ++ if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) ++ { ++ Dimension dims = getPreferredInnerHorizontal(); ++ boxDependent = (double) dims.width / iterations; ++ boxIndependent = dims.height; ++ } ++ else ++ { ++ Dimension dims = getPreferredInnerVertical(); ++ boxDependent = (double) dims.height / iterations; ++ boxIndependent = dims.width; ++ } ++ ++ Rectangle vr = new Rectangle(); ++ SwingUtilities.calculateInnerArea(progressBar, vr); ++ ++ int index = getAnimationIndex(); ++ if (animationIndex > (numFrames + 1) / 2) ++ index = numFrames - getAnimationIndex(); ++ ++ if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) ++ { ++ r.x = vr.x + (int) (index * boxDependent); ++ r.y = vr.y; ++ r.width = (int) boxDependent; ++ r.height = (int) boxIndependent; ++ } ++ else ++ { ++ index++; ++ r.x = vr.x; ++ r.y = vr.height - (int) (index * boxDependent) + vr.y; ++ r.width = (int) boxIndependent; ++ r.height = (int) boxDependent; ++ } ++ ++ return r; ++ } ++ ++ /** ++ * This method returns the length of the cells. ++ * ++ * @return The cell length. ++ */ ++ protected int getCellLength() ++ { ++ return cellLength; ++ } ++ ++ /** ++ * This method returns the spacing between cells. ++ * ++ * @return The cell gap. ++ */ ++ protected int getCellSpacing() ++ { ++ return cellSpacing; ++ } ++ ++ /** ++ * This method returns the maximum size of the JComponent. ++ * If it returns null, it is up to the LayoutManager ++ * to give it a size. ++ * ++ * @param c The component to find a maximum size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the minimum size of the JComponent. ++ * If it returns null, it is up to the LayoutManager to ++ * give it a size. ++ * ++ * @param c The component to find a minimum size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size of the inner ++ * rectangle (the bounds without the insets) if the ++ * progressBar is horizontal. ++ * ++ * @return The preferred size of the progressBar minus ++ * insets if it's horizontal. ++ */ ++ protected Dimension getPreferredInnerHorizontal() ++ { ++ Rectangle vr = new Rectangle(); ++ ++ SwingUtilities.calculateInnerArea(progressBar, vr); ++ ++ return new Dimension(vr.width, vr.height); ++ } ++ ++ /** ++ * This method returns the preferred size of the inner ++ * rectangle (the bounds without insets) if the ++ * progressBar is vertical. ++ * ++ * @return The preferred size of the progressBar minus ++ * insets if it's vertical. ++ */ ++ protected Dimension getPreferredInnerVertical() ++ { ++ Rectangle vr = new Rectangle(); ++ ++ SwingUtilities.calculateInnerArea(progressBar, vr); ++ ++ return new Dimension(vr.width, vr.height); ++ } ++ ++ /** ++ * This method returns the preferred size of the ++ * given JComponent. If it returns null, then it ++ * is up to the LayoutManager to give it a size. ++ * ++ * @param c The component to find the preferred size for. ++ * ++ * @return The preferred size of the component. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ // The only thing we need to worry about is ++ // the text size. ++ Graphics g = progressBar.getGraphics(); ++ ++ Insets insets = c.getInsets(); ++ ++ FontMetrics fm = g.getFontMetrics(c.getFont()); ++ ++ int textW = fm.stringWidth(progressBar.getString()); ++ int textH = fm.getHeight(); ++ ++ g.dispose(); ++ ++ if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) ++ { ++ if (textH < 20) ++ textH = 20; ++ if (textW < 200) ++ textW = 200; ++ } ++ else ++ { ++ if (textH < 200) ++ textH = 200; ++ if (textW < 20) ++ textW = 20; ++ } ++ textW += insets.left + insets.right; ++ textH += insets.top + insets.bottom; ++ return new Dimension(textW, textH); ++ } ++ ++ /** ++ * This method returns the Color that the text is shown in when the bar is ++ * not over the text. ++ * ++ * @return The color of the text when the bar is not over it. ++ */ ++ protected Color getSelectionBackground() ++ { ++ return selectionBackground; ++ } ++ ++ /** ++ * This method returns the Color that the text is shown in when the bar is ++ * over the text. ++ * ++ * @return The color of the text when the bar is over it. ++ */ ++ protected Color getSelectionForeground() ++ { ++ return selectionForeground; ++ } ++ ++ /** ++ * This method returns the point (the top left of the bounding box) ++ * where the text should be painted. ++ * ++ * @param g The Graphics object to measure FontMetrics with. ++ * @param progressString The string to paint. ++ * @param x The x coordinate of the overall bounds box. ++ * @param y The y coordinate of the overall bounds box. ++ * @param width The width of the overall bounds box. ++ * @param height The height of the overall bounds box. ++ * ++ * @return The top left of the bounding box where text should be painted. ++ */ ++ protected Point getStringPlacement(Graphics g, String progressString, int x, ++ int y, int width, int height) ++ { ++ Rectangle tr = new Rectangle(); ++ Rectangle vr = new Rectangle(x, y, width, height); ++ Rectangle ir = new Rectangle(); ++ ++ Font f = g.getFont(); ++ FontMetrics fm = g.getFontMetrics(f); ++ ++ SwingUtilities.layoutCompoundLabel(progressBar, fm, progressString, null, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, vr, ir, tr, 0); ++ return new Point(tr.x, tr.y); ++ } ++ ++ /** ++ * This method increments the animation index. ++ */ ++ public void incrementAnimationIndex() ++ { ++ animationIndex++; ++ //numFrames is like string length, it should be named numFrames or something ++ if (animationIndex >= numFrames) ++ animationIndex = 0; ++ progressBar.repaint(); ++ } ++ ++ /** ++ * This method paints the progressBar. It delegates its responsibilities ++ * to paintDeterminate and paintIndeterminate. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ if (! progressBar.isIndeterminate()) ++ paintDeterminate(g, c); ++ else ++ paintIndeterminate(g, c); ++ ++ if (progressBar.isBorderPainted()) ++ progressBar.getBorder().paintBorder(progressBar, g, 0, 0, ++ progressBar.getWidth(), ++ progressBar.getHeight()); ++ } ++ ++ /** ++ * This method is called if the painting to be done is ++ * for a determinate progressBar. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ protected void paintDeterminate(Graphics g, JComponent c) ++ { ++ Color saved = g.getColor(); ++ int space = getCellSpacing(); ++ int len = getCellLength(); ++ int max = progressBar.getMaximum(); ++ int min = progressBar.getMinimum(); ++ int value = progressBar.getValue(); ++ ++ Rectangle vr = new Rectangle(); ++ SwingUtilities.calculateInnerArea(c, vr); ++ ++ Rectangle or = c.getBounds(); ++ ++ Insets insets = c.getInsets(); ++ ++ int amountFull = getAmountFull(insets, or.width, or.height); ++ ++ g.setColor(c.getBackground()); ++ g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false); ++ ++ if (max != min && len != 0 && value > min) ++ { ++ int iterations = value / (space + len); ++ ++ if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) ++ { ++ double spaceInUnits = space * (double) vr.width / (max - min); ++ double lenInUnits = len * (double) vr.width / (max - min); ++ double currX = vr.x; ++ ++ g.setColor(c.getForeground()); ++ g.fill3DRect(vr.x, vr.y, amountFull, vr.height, true); ++ ++ g.setColor(c.getBackground()); ++ if (spaceInUnits != 0) ++ { ++ for (int i = 0; i < iterations; i++) ++ { ++ currX += lenInUnits; ++ g.fill3DRect((int) currX, vr.y, (int) spaceInUnits, ++ vr.height, true); ++ currX += spaceInUnits; ++ } ++ } ++ } ++ else ++ { ++ double currY = vr.y; ++ double spaceInUnits = space * (double) vr.height / (max - min); ++ double lenInUnits = len * (double) vr.height / (max - min); ++ ++ g.setColor(c.getForeground()); ++ g.fill3DRect(vr.x, vr.y + vr.height - amountFull, vr.width, ++ amountFull, true); ++ ++ g.setColor(c.getBackground()); ++ ++ if (spaceInUnits != 0) ++ { ++ for (int i = 0; i < iterations; i++) ++ { ++ currY -= lenInUnits + spaceInUnits; ++ g.fill3DRect(vr.x, (int) currY, vr.width, ++ (int) spaceInUnits, true); ++ } ++ } ++ } ++ } ++ ++ if (progressBar.isStringPainted() && !progressBar.getString().equals("")) ++ paintString(g, 0, 0, or.width, or.height, amountFull, insets); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method is called if the painting to be done is for ++ * an indeterminate progressBar. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ protected void paintIndeterminate(Graphics g, JComponent c) ++ { ++ //need to paint the box at it's current position. no text is painted since ++ //all we're doing is bouncing back and forth ++ Color saved = g.getColor(); ++ Insets insets = c.getInsets(); ++ ++ Rectangle or = c.getBounds(); ++ Rectangle vr = new Rectangle(); ++ SwingUtilities.calculateInnerArea(c, vr); ++ ++ g.setColor(c.getBackground()); ++ g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false); ++ ++ Rectangle box = new Rectangle(); ++ getBox(box); ++ ++ g.setColor(c.getForeground()); ++ g.fill3DRect(box.x, box.y, box.width, box.height, true); ++ ++ if (progressBar.isStringPainted() && !progressBar.getString().equals("")) ++ paintString(g, 0, 0, or.width, or.height, ++ getAmountFull(insets, or.width, or.height), insets); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the string for the progressBar. ++ * ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate of the progressBar. ++ * @param y The y coordinate of the progressBar. ++ * @param width The width of the progressBar. ++ * @param height The height of the progressBar. ++ * @param amountFull The amount of the progressBar that has its bar filled. ++ * @param b The insets of the progressBar. ++ */ ++ protected void paintString(Graphics g, int x, int y, int width, int height, ++ int amountFull, Insets b) ++ { ++ // We want to place in the exact center of the bar. ++ Point placement = getStringPlacement(g, progressBar.getString(), ++ x + b.left, y + b.top, ++ width - b.left - b.right, ++ height - b.top - b.bottom); ++ Color saved = g.getColor(); ++ ++ // FIXME: The Color of the text should use selectionForeground and selectionBackground ++ // but that can't be done right now, so we'll use white in the mean time. ++ g.setColor(Color.WHITE); ++ ++ FontMetrics fm = g.getFontMetrics(progressBar.getFont()); ++ ++ g.drawString(progressBar.getString(), placement.x, ++ placement.y + fm.getAscent()); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method sets the current animation index. If the index ++ * is greater than the number of frames, it resets to 0. ++ * ++ * @param newValue The new animation index. ++ */ ++ protected void setAnimationIndex(int newValue) ++ { ++ animationIndex = (newValue <= numFrames) ? newValue : 0; ++ progressBar.repaint(); ++ } ++ ++ /** ++ * This method sets the cell length. ++ * ++ * @param cellLen The cell length. ++ */ ++ protected void setCellLength(int cellLen) ++ { ++ cellLength = cellLen; ++ } ++ ++ /** ++ * This method sets the cell spacing. ++ * ++ * @param cellSpace The cell spacing. ++ */ ++ protected void setCellSpacing(int cellSpace) ++ { ++ cellSpacing = cellSpace; ++ } ++ ++ /** ++ * This method starts the animation timer. It is called ++ * when the propertyChangeListener detects that the progressBar ++ * has changed to indeterminate mode. ++ * ++ * @since 1.4 ++ */ ++ protected void startAnimationTimer() ++ { ++ if (animationTimer != null) ++ animationTimer.start(); ++ } ++ ++ /** ++ * This method stops the animation timer. It is called when ++ * the propertyChangeListener detects that the progressBar ++ * has changed to determinate mode. ++ * ++ * @since 1.4 ++ */ ++ protected void stopAnimationTimer() ++ { ++ if (animationTimer != null) ++ animationTimer.stop(); ++ setAnimationIndex(0); ++ } ++ ++ /** ++ * This method changes the settings for the progressBar to ++ * the defaults provided by the current Look and Feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ progressBar.setFont(defaults.getFont("ProgressBar.font")); ++ progressBar.setForeground(defaults.getColor("ProgressBar.foreground")); ++ progressBar.setBackground(defaults.getColor("ProgressBar.background")); ++ progressBar.setBorder(defaults.getBorder("ProgressBar.border")); ++ progressBar.setOpaque(true); ++ ++ selectionForeground = defaults.getColor("ProgressBar.selectionForeground"); ++ selectionBackground = defaults.getColor("ProgressBar.selectionBackground"); ++ cellLength = defaults.getInt("ProgressBar.cellLength"); ++ cellSpacing = defaults.getInt("ProgressBar.cellSpacing"); ++ ++ int repaintInterval = defaults.getInt("ProgressBar.repaintInterval"); ++ int cycleTime = defaults.getInt("ProgressBar.cycleTime"); ++ ++ if (cycleTime % repaintInterval != 0 ++ && (cycleTime / repaintInterval) % 2 != 0) ++ { ++ int div = (cycleTime / repaintInterval) + 2; ++ div /= 2; ++ div *= 2; ++ cycleTime = div * repaintInterval; ++ } ++ setAnimationIndex(0); ++ numFrames = cycleTime / repaintInterval; ++ animationTimer.setDelay(repaintInterval); ++ } ++ ++ /** ++ * The method uninstalls any defaults that were ++ * set by the current Look and Feel. ++ */ ++ protected void uninstallDefaults() ++ { ++ progressBar.setFont(null); ++ progressBar.setForeground(null); ++ progressBar.setBackground(null); ++ ++ selectionForeground = null; ++ selectionBackground = null; ++ } ++ ++ /** ++ * This method registers listeners to all the ++ * components that this UI delegate needs to listen to. ++ */ ++ protected void installListeners() ++ { ++ changeListener = new ChangeHandler(); ++ propertyListener = new PropertyChangeHandler(); ++ animation = new Animator(); ++ ++ progressBar.addChangeListener(changeListener); ++ progressBar.addPropertyChangeListener(propertyListener); ++ animationTimer.addActionListener(animation); ++ } ++ ++ /** ++ * This method unregisters listeners to all the ++ * components that were listened to. ++ */ ++ protected void uninstallListeners() ++ { ++ progressBar.removeChangeListener(changeListener); ++ progressBar.removePropertyChangeListener(propertyListener); ++ animationTimer.removeActionListener(animation); ++ ++ changeListener = null; ++ propertyListener = null; ++ animation = null; ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * This includes setting up defaults and listeners as ++ * well as initializing any values or objects that ++ * the UI may need. ++ * ++ * @param c The JComponent that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof JProgressBar) ++ { ++ progressBar = (JProgressBar) c; ++ ++ animationTimer = new Timer(200, null); ++ animationTimer.setRepeats(true); ++ ++ installDefaults(); ++ installListeners(); ++ } ++ } ++ ++ /** ++ * This method removes the UI for the given JComponent. ++ * This includes removing any listeners or defaults ++ * that the installUI may have set up. ++ * ++ * @param c The JComponent that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ super.uninstallUI(c); ++ uninstallListeners(); ++ uninstallDefaults(); ++ ++ animationTimer = null; ++ progressBar = null; ++ } ++} +Index: javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java +diff -N javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,101 @@ ++/* BasicRadioButtonMenuItemUI.java ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.event.MouseEvent; ++import javax.swing.JComponent; ++import javax.swing.JMenuItem; ++import javax.swing.MenuElement; ++import javax.swing.MenuSelectionManager; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++ ++ ++/** ++ * UI Delegator for JRadioButtonMenuItem ++ */ ++public class BasicRadioButtonMenuItemUI extends BasicMenuItemUI ++{ ++ /** ++ * Creates a new BasicRadioButtonMenuItemUI object. ++ */ ++ public BasicRadioButtonMenuItemUI() ++ { ++ super(); ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ checkIcon = defaults.getIcon("RadioButtonMenuItem.checkIcon"); ++ } ++ ++ /** ++ * Factory method to create a BasicRadioButtonMenuItemUI for the given {@link ++ * JComponent}, which should be a JRadioButtonMenuItem. ++ * ++ * @param b The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicRadioButtonMenuItemUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent b) ++ { ++ return new BasicRadioButtonMenuItemUI(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @return $returnType$ DOCUMENT ME! ++ */ ++ protected String getPropertyPrefix() ++ { ++ return null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param item DOCUMENT ME! ++ * @param e DOCUMENT ME! ++ * @param path DOCUMENT ME! ++ * @param manager DOCUMENT ME! ++ */ ++ public void processMouseEvent(JMenuItem item, MouseEvent e, ++ MenuElement[] path, ++ MenuSelectionManager manager) ++ { ++ } ++} +Index: javax/swing/plaf/basic/BasicRadioButtonUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicRadioButtonUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicRadioButtonUI.java +--- javax/swing/plaf/basic/BasicRadioButtonUI.java 10 Jan 2004 21:59:30 -0000 1.4 ++++ javax/swing/plaf/basic/BasicRadioButtonUI.java 6 Sep 2004 16:36:06 -0000 +@@ -38,116 +38,42 @@ + + package javax.swing.plaf.basic; + +-import java.awt.Color; +-import java.awt.Dimension; +-import java.awt.Graphics; +-import java.awt.Rectangle; + import javax.swing.AbstractButton; ++import javax.swing.Icon; + import javax.swing.JComponent; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + + public class BasicRadioButtonUI extends BasicToggleButtonUI + { +- int large_circle_width = 20; +- int circle_width = large_circle_width - 8; // FIXME: sun == ? +- +- public static ComponentUI createUI(final JComponent c) { +- return new BasicRadioButtonUI(); +- } + ++ protected Icon icon; ++ ++ public static ComponentUI createUI(final JComponent c) { ++ return new BasicRadioButtonUI(); ++ } ++ ++ public BasicRadioButtonUI() ++ { ++ icon = getDefaultIcon(); ++ } ++ ++ public void installUI(final JComponent c) { ++ super.installUI(c); ++ if (c instanceof AbstractButton) ++ { ++ AbstractButton b = (AbstractButton) c; ++ b.setIcon(icon); ++ } ++ } ++ ++ public Icon getDefaultIcon() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ return defaults.getIcon("RadioButton.icon"); ++ } + +- public void installUI(final JComponent c) { +- super.installUI(c); +- } +- +- public Dimension getPreferredSize(JComponent c) +- { +- AbstractButton b = (AbstractButton)c; +- Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap); +- +- // and add a little something for the circles: +- +- d.width += large_circle_width; +- d.height = Math.max(large_circle_width, d.height); +- +- //System.out.println("^^^^^^^^^^^^^^^^^^^^^^ BASIC-PREF="+d + ",T="+b.text); +- return d; +- } +- +- protected void paintFocus(Graphics g, +- JComponent c, +- Rectangle vr, +- Rectangle tr, +- Rectangle ir) +- { +- } +- +- protected void paintIcon(Graphics g, +- JComponent c, +- Rectangle iconRect) +- { +- } +- +- protected void paintButtonPressed(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- paintButtonNormal(g, b); +- +- int x = gap; +- int y = gap; +- +- int diffp = 2; +- int diff = 3; +- +- g.setColor(textColor); +- g.fillArc(x+diffp, y+diffp, +- circle_width-diff, circle_width-diff, +- 0, 360); +- } +- +- protected void paintButtonNormal(Graphics g, +- JComponent c) +- { +- AbstractButton b = (AbstractButton) c; +- +- Dimension size = b.getSize(); +- +- g.setColor(normalBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- int x = gap; +- int y = gap; +- +- g.setColor(pressedBackgroundColor); +- g.drawArc(x, y, +- circle_width, circle_width, +- 0, 360); +- +- g.setColor(new Color(255,255,255)); +- g.drawArc(x, y, +- circle_width+1, circle_width+1, +- 145, 160); +- } +- +- protected void paintText(Graphics g, +- JComponent c, +- Rectangle textRect, +- String text) +- { +- // AbstractButton b = (AbstractButton) c; +- +- //System.out.println("drawing string: " + text + ", " + c.isEnabled()); +- +- g.setColor(c.isEnabled() ? textColor : disabledTextColor); +- +- BasicGraphicsUtils.drawString(g, +- text, +- 0, +- textRect.x + circle_width + gap, +- textRect.y); +- } + } + + +Index: javax/swing/plaf/basic/BasicRootPaneUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicRootPaneUI.java +diff -N javax/swing/plaf/basic/BasicRootPaneUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicRootPaneUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,67 @@ ++/* BasicPanelUI.java ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.plaf.basic; ++ ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.JComponent; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.RootPaneUI; ++ ++ ++public class BasicRootPaneUI extends RootPaneUI ++ implements PropertyChangeListener ++{ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicRootPaneUI(); ++ } ++ ++ public void installUI(JComponent c) ++ { ++ c.setOpaque(true); ++ c.setBackground(UIManager.getColor("control")); ++ super.installUI(c); ++ } ++ ++ public void propertyChange(PropertyChangeEvent event) ++ { ++ } ++} +Index: javax/swing/plaf/basic/BasicScrollBarUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicScrollBarUI.java +diff -N javax/swing/plaf/basic/BasicScrollBarUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicScrollBarUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,1405 @@ ++/* BasicScrollBarUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Point; ++import java.awt.Polygon; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseMotionListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++ ++import javax.swing.BoundedRangeModel; ++import javax.swing.Icon; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JScrollBar; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.Timer; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.ScrollBarUI; ++ ++ ++/** ++ * The Basic Look and Feel UI delegate for JScrollBar. ++ */ ++public class BasicScrollBarUI extends ScrollBarUI implements LayoutManager, ++ SwingConstants ++{ ++ /** ++ * A helper class that listens to the two JButtons on each end ++ * of the JScrollBar. ++ */ ++ protected class ArrowButtonListener extends MouseAdapter ++ { ++ /** ++ * Move the thumb in the direction specified by the ++ * button's arrow. If this button is held down, then ++ * it should keep moving the thumb. ++ * ++ * @param e The MouseEvent fired by the JButton. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ scrollTimer.stop(); ++ scrollListener.setScrollByBlock(false); ++ if (e.getSource() == incrButton) ++ scrollListener.setDirection(POSITIVE_SCROLL); ++ else ++ scrollListener.setDirection(NEGATIVE_SCROLL); ++ scrollTimer.start(); ++ } ++ ++ /** ++ * Stops the thumb when the JButton is released. ++ * ++ * @param e The MouseEvent fired by the JButton. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ scrollTimer.stop(); ++ } ++ } ++ ++ /** ++ * A helper class that listens to the ScrollBar's model ++ * for ChangeEvents. ++ */ ++ protected class ModelListener implements ChangeListener ++ { ++ /** ++ * Called when the model changes. ++ * ++ * @param e The ChangeEvent fired by the model. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ // System.err.println(this + ".stateChanged()"); ++ calculatePreferredSize(); ++ layoutContainer(scrollbar); ++ getThumbBounds(); ++ scrollbar.repaint(); ++ } ++ } ++ ++ /** ++ * A helper class that listens to the ScrollBar's properties. ++ */ ++ public class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * Called when one of the ScrollBar's properties change. ++ * ++ * @param e The PropertyChangeEvent fired by the ScrollBar. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JScrollBar.MODEL_CHANGED_PROPERTY)) ++ { ++ ((BoundedRangeModel) e.getOldValue()).removeChangeListener(modelListener); ++ scrollbar.getModel().addChangeListener(modelListener); ++ getThumbBounds(); ++ } ++ else if (e.getPropertyName().equals(JScrollBar.ORIENTATION_CHANGED_PROPERTY)) ++ { ++ incrButton.removeMouseListener(buttonListener); ++ decrButton.removeMouseListener(buttonListener); ++ incrButton = createIncreaseButton(scrollbar.getOrientation()); ++ decrButton = createDecreaseButton(scrollbar.getOrientation()); ++ incrButton.addMouseListener(buttonListener); ++ decrButton.addMouseListener(buttonListener); ++ calculatePreferredSize(); ++ layoutContainer(scrollbar); ++ } ++ layoutContainer(scrollbar); ++ scrollbar.repaint(); ++ } ++ } ++ ++ /** ++ * A helper class that listens for events from ++ * the timer that is used to move the thumb. ++ */ ++ protected class ScrollListener implements ActionListener ++ { ++ /** The direction the thumb moves in. */ ++ private transient int direction; ++ ++ /** Whether movement will be in blocks. */ ++ private transient boolean block; ++ ++ /** ++ * Creates a new ScrollListener object. ++ * The default is scrolling positively with block movement. ++ */ ++ public ScrollListener() ++ { ++ direction = POSITIVE_SCROLL; ++ block = true; ++ } ++ ++ /** ++ * Creates a new ScrollListener object using ++ * the given direction and block. ++ * ++ * @param dir The direction to move in. ++ * @param block Whether movement will be in blocks. ++ */ ++ public ScrollListener(int dir, boolean block) ++ { ++ direction = dir; ++ this.block = block; ++ } ++ ++ /** ++ * Sets the direction to scroll in. ++ * ++ * @param direction The direction to scroll in. ++ */ ++ public void setDirection(int direction) ++ { ++ this.direction = direction; ++ } ++ ++ /** ++ * Sets whether scrolling will be done in blocks. ++ * ++ * @param block Whether scrolling will be in blocks. ++ */ ++ public void setScrollByBlock(boolean block) ++ { ++ this.block = block; ++ } ++ ++ /** ++ * Called every time the timer reaches its interval. ++ * ++ * @param e The ActionEvent fired by the timer. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (block) ++ { ++ // Only need to check it if it's block scrolling ++ // We only block scroll if the click occurs ++ // in the track. ++ ++ if (!trackListener.shouldScroll(direction)) ++ { ++ trackHighlight = NO_HIGHLIGHT; ++ scrollbar.repaint(); ++ return; ++ } ++ scrollByBlock(direction); ++ } ++ else ++ scrollByUnit(direction); ++ } ++ } ++ ++ /** ++ * Helper class that listens for movement on the track. ++ */ ++ protected class TrackListener extends MouseAdapter ++ implements MouseMotionListener ++ { ++ /** The current X coordinate of the mouse. */ ++ protected int currentMouseX; ++ ++ /** The current Y coordinate of the mouse. */ ++ protected int currentMouseY; ++ ++ /** The offset between the current mouse cursor and the ++ current value of the scrollbar. */ ++ protected int offset; ++ ++ /** ++ * This method is called when the mouse is being ++ * dragged. ++ * ++ * @param e The MouseEvent given. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ currentMouseX = e.getX(); ++ currentMouseY = e.getY(); ++ if (scrollbar.getValueIsAdjusting()) ++ { ++ int value; ++ if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL) ++ value = valueForXPosition(currentMouseX) - offset; ++ else ++ value = valueForYPosition(currentMouseY) - offset; ++ ++ scrollbar.setValue(value); ++ } ++ } ++ ++ /** ++ * This method is called when the mouse is moved. ++ * ++ * @param e The MouseEvent given. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ // Not interested in where the mouse ++ // is unless it is being dragged. ++ } ++ ++ /** ++ * This method is called when the mouse is ++ * pressed. When it is pressed, the thumb should ++ * move in blocks towards the cursor. ++ * ++ * @param e The MouseEvent given. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ currentMouseX = e.getX(); ++ currentMouseY = e.getY(); ++ ++ int value; ++ if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL) ++ value = valueForXPosition(currentMouseX); ++ else ++ value = valueForYPosition(currentMouseY); ++ ++ if (value == scrollbar.getValue()) ++ return; ++ ++ if (!thumbRect.contains(e.getPoint())) ++ { ++ scrollTimer.stop(); ++ scrollListener.setScrollByBlock(true); ++ if (value > scrollbar.getValue()) ++ { ++ trackHighlight = INCREASE_HIGHLIGHT; ++ scrollListener.setDirection(POSITIVE_SCROLL); ++ } ++ else ++ { ++ trackHighlight = DECREASE_HIGHLIGHT; ++ scrollListener.setDirection(NEGATIVE_SCROLL); ++ } ++ scrollTimer.start(); ++ } ++ else ++ { ++ // We'd like to keep track of where the cursor ++ // is inside the thumb. ++ // This works because the scrollbar's value represents ++ // "lower" edge of the thumb. The value at which ++ // the cursor is at must be greater or equal ++ // to that value. ++ scrollbar.setValueIsAdjusting(true); ++ offset = value - scrollbar.getValue(); ++ } ++ scrollbar.repaint(); ++ } ++ ++ /** ++ * This method is called when the mouse is released. ++ * It should stop movement on the thumb ++ * ++ * @param e The MouseEvent given. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ trackHighlight = NO_HIGHLIGHT; ++ scrollTimer.stop(); ++ ++ if (scrollbar.getValueIsAdjusting()) ++ scrollbar.setValueIsAdjusting(false); ++ scrollbar.repaint(); ++ } ++ ++ /** ++ * A helper method that decides whether we should ++ * keep scrolling in the given direction. ++ * ++ * @param direction The direction to check for. ++ * ++ * @return Whether the thumb should keep scrolling. ++ */ ++ public boolean shouldScroll (int direction) ++ { ++ int value; ++ if (scrollbar.getOrientation() == HORIZONTAL) ++ value = valueForXPosition(currentMouseX); ++ else ++ value = valueForYPosition(currentMouseY); ++ ++ if (direction == POSITIVE_SCROLL) ++ return (value > scrollbar.getValue()); ++ else ++ return (value < scrollbar.getValue()); ++ } ++ } ++ ++ /** The listener that listens to the JButtons. */ ++ protected ArrowButtonListener buttonListener; ++ ++ /** The listener that listens to the model. */ ++ protected ModelListener modelListener; ++ ++ /** The listener that listens to the scrollbar for property ++ changes. */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** The listener that listens to the timer. */ ++ protected ScrollListener scrollListener; ++ ++ /** The listener that listens for MouseEvents on the track. */ ++ protected TrackListener trackListener; ++ ++ /** The JButton that decrements the scrollbar's value. */ ++ protected JButton decrButton; ++ ++ /** The JButton that increments the scrollbar's value. */ ++ protected JButton incrButton; ++ ++ /** The dimensions of the maximum thumb size. */ ++ protected static Dimension maximumThumbSize; ++ ++ /** The dimensions of the minimum thumb size. */ ++ protected static Dimension minimumThumbSize; ++ ++ /** The color of the thumb. */ ++ protected Color thumbColor; ++ ++ /** The outer shadow of the thumb. */ ++ protected Color thumbDarkShadowColor; ++ ++ /** The top and left edge color for the thumb. */ ++ protected Color thumbHighlightColor; ++ ++ /** The outer light shadow for the thumb. */ ++ protected Color thumbLightShadowColor; ++ ++ /** The color that is used when the mouse press ++ occurs in the track. */ ++ protected Color trackHighlightColor; ++ ++ /** The color of the track. */ ++ protected Color trackColor; ++ ++ /** The size and position of the track. */ ++ protected Rectangle trackRect; ++ ++ /** The size and position of the thumb. */ ++ protected Rectangle thumbRect; ++ ++ /** Indicates that the decrease highlight should be painted. */ ++ protected static int DECREASE_HIGHLIGHT = 1; ++ ++ /** Indicates that the increase highlight should be painted. */ ++ protected static int INCREASE_HIGHLIGHT = 2; ++ ++ /** Indicates that no highlight should be painted. */ ++ protected static int NO_HIGHLIGHT = 0; ++ ++ /** Indicates that the scrolling direction is positive. */ ++ private static int POSITIVE_SCROLL = 1; ++ ++ /** Indicates that the scrolling direction is negative. */ ++ private static int NEGATIVE_SCROLL = -1; ++ ++ /** The cached preferred size for the scrollbar. */ ++ private transient Dimension preferredSize; ++ ++ /** The current highlight status. */ ++ protected int trackHighlight; ++ ++ /** FIXME: Use this for something (presumably mouseDragged) */ ++ protected boolean isDragging; ++ ++ /** The timer used to move the thumb when the mouse is held. */ ++ protected Timer scrollTimer; ++ ++ /** The scrollbar this UI is acting for. */ ++ protected JScrollBar scrollbar; ++ ++ /** ++ * A helper class that allows us to draw icons for ++ * the JButton. ++ */ ++ private static class arrowIcon implements Icon ++ { ++ /** The polygon that describes the icon. */ ++ private Polygon arrow; ++ ++ /** ++ * Creates a new arrowIcon object. ++ * ++ * @param arrow The polygon that describes the arrow. ++ */ ++ public arrowIcon(Polygon arrow) ++ { ++ this.arrow = arrow; ++ } ++ ++ /** ++ * Returns the height of the icon. ++ * ++ * @return The height of the icon. ++ */ ++ public int getIconHeight() ++ { ++ return 10; ++ } ++ ++ /** ++ * Returns the width of the icon. ++ * ++ * @return The width of the icon. ++ */ ++ public int getIconWidth() ++ { ++ return 10; ++ } ++ ++ /** ++ * Paints the icon. ++ * ++ * @param c The Component to paint for. ++ * @param g The Graphics object to draw with. ++ * @param x The X coordinate to draw at. ++ * @param y The Y coordinate to draw at. ++ */ ++ public void paintIcon(Component c, Graphics g, int x, int y) ++ { ++ g.translate(x, y); ++ ++ Color saved = g.getColor(); ++ ++ g.setColor(Color.BLACK); ++ ++ g.fillPolygon(arrow); ++ ++ g.setColor(saved); ++ g.translate(-x, -y); ++ } ++ } ++ ++ /** The Icon that points up. */ ++ private static Icon upIcon = new arrowIcon(new Polygon(new int[] { 2, 5, 8 }, ++ new int[] { 7, 3, 7 }, ++ 3)); ++ ++ /** The Icon that points down. */ ++ private static Icon downIcon = new arrowIcon(new Polygon(new int[] { 2, 5, 8 }, ++ new int[] { 3, 7, 3 }, ++ 3)); ++ ++ /** The Icon that points left. */ ++ private static Icon leftIcon = new arrowIcon(new Polygon(new int[] { 7, 3, 7 }, ++ new int[] { 2, 5, 8 }, ++ 3)); ++ ++ /** The Icon that points right. */ ++ private static Icon rightIcon = new arrowIcon(new Polygon(new int[] { 3, 7, 3}, ++ new int[] { 2, 5, 8}, ++ 3)); ++ ++ /** ++ * This method adds a component to the layout. ++ * ++ * @param name The name to associate with the component that is added. ++ * @param child The Component to add. ++ */ ++ public void addLayoutComponent(String name, Component child) ++ { ++ // You should not be adding stuff to this component. ++ // The contents are fixed. ++ } ++ ++ /** ++ * This method configures the scrollbar's colors. This can be ++ * done by looking up the standard colors from the Look and Feel defaults. ++ */ ++ protected void configureScrollBarColors() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ trackColor = defaults.getColor("ScrollBar.track"); ++ trackHighlightColor = defaults.getColor("ScrollBar.trackHighlight"); ++ thumbColor = defaults.getColor("ScrollBar.thumb"); ++ thumbHighlightColor = defaults.getColor("ScrollBar.thumbHighlight"); ++ thumbDarkShadowColor = defaults.getColor("ScrollBar.thumbDarkShadow"); ++ thumbLightShadowColor = defaults.getColor("ScrollBar.thumbLightShadow"); ++ } ++ ++ /** ++ * This method creates an ArrowButtonListener. ++ * ++ * @return A new ArrowButtonListener. ++ */ ++ protected ArrowButtonListener createArrowButtonListener() ++ { ++ return new ArrowButtonListener(); ++ } ++ ++ /** ++ * This method creates a new JButton with the appropriate ++ * icon for the orientation. ++ * ++ * @param orientation The orientation this JButton uses. ++ * ++ * @return The increase JButton. ++ */ ++ protected JButton createIncreaseButton(int orientation) ++ { ++ if (incrButton == null) ++ { ++ incrButton = new JButton(); ++ incrButton.setMargin(new Insets(0,0,0,0)); ++ incrButton.setHorizontalAlignment(SwingConstants.CENTER); ++ incrButton.setHorizontalTextPosition(SwingConstants.CENTER); ++ incrButton.setVerticalAlignment(SwingConstants.CENTER); ++ incrButton.setVerticalTextPosition(SwingConstants.CENTER); ++ } ++ ++ if (orientation == SwingConstants.HORIZONTAL) ++ incrButton.setIcon(rightIcon); ++ else ++ incrButton.setIcon(downIcon); ++ ++ return incrButton; ++ } ++ ++ /** ++ * This method creates a new JButton with the appropriate ++ * icon for the orientation. ++ * ++ * @param orientation The orientation this JButton uses. ++ * ++ * @return The decrease JButton. ++ */ ++ protected JButton createDecreaseButton(int orientation) ++ { ++ if (decrButton == null) ++ { ++ decrButton = new JButton(); ++ decrButton.setMargin(new Insets(0,0,0,0)); ++ decrButton.setHorizontalAlignment(SwingConstants.CENTER); ++ decrButton.setHorizontalTextPosition(SwingConstants.CENTER); ++ decrButton.setVerticalAlignment(SwingConstants.CENTER); ++ decrButton.setVerticalTextPosition(SwingConstants.CENTER); ++ } ++ ++ if (orientation == SwingConstants.HORIZONTAL) ++ decrButton.setIcon(leftIcon); ++ else ++ decrButton.setIcon(upIcon); ++ ++ return decrButton; ++ } ++ ++ /** ++ * This method creates a new ModelListener. ++ * ++ * @return A new ModelListener. ++ */ ++ protected ModelListener createModelListener() ++ { ++ return new ModelListener(); ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener. ++ * ++ * @return A new PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method creates a new ScrollListener. ++ * ++ * @return A new ScrollListener. ++ */ ++ protected ScrollListener createScrollListener() ++ { ++ return new ScrollListener(); ++ } ++ ++ /** ++ * This method creates a new TrackListener. ++ * ++ * @return A new TrackListener. ++ */ ++ protected TrackListener createTrackListener() ++ { ++ return new TrackListener(); ++ } ++ ++ /** ++ * This method returns a new BasicScrollBarUI. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A new BasicScrollBarUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicScrollBarUI(); ++ } ++ ++ /** ++ * This method returns the maximum size for this JComponent. ++ * ++ * @param c The JComponent to measure the maximum size for. ++ * ++ * @return The maximum size for the component. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the maximum thumb size. ++ * ++ * @return The maximum thumb size. ++ */ ++ protected Dimension getMaximumThumbSize() ++ { ++ return maximumThumbSize; ++ } ++ ++ /** ++ * This method returns the minimum size for this JComponent. ++ * ++ * @param c The JComponent to measure the minimum size for. ++ * ++ * @return The minimum size for the component. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the minimum thumb size. ++ * ++ * @return The minimum thumb size. ++ */ ++ protected Dimension getMinimumThumbSize() ++ { ++ return minimumThumbSize; ++ } ++ ++ /** ++ * This method calculates the preferred size since ++ * calling getPreferredSize() returns a cached value. ++ */ ++ private void calculatePreferredSize() ++ { ++ // System.err.println(this + ".calculatePreferredSize()"); ++ ++ int height; ++ int width; ++ height = width = 0; ++ ++ if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL) ++ { ++ width += incrButton.getPreferredSize().getWidth(); ++ width += decrButton.getPreferredSize().getWidth(); ++ ++ width += (scrollbar.getMaximum() - scrollbar.getMinimum()); ++ ++ height = Math.max(incrButton.getPreferredSize().height, ++ decrButton.getPreferredSize().height); ++ height = Math.max(getMinimumThumbSize().height, height); ++ height = Math.max(20, height); ++ height = Math.min(getMaximumThumbSize().height, height); ++ } ++ else ++ { ++ height += incrButton.getPreferredSize().getHeight(); ++ height += decrButton.getPreferredSize().getHeight(); ++ ++ height += (scrollbar.getMaximum() - scrollbar.getMinimum()); ++ ++ width = Math.max(incrButton.getPreferredSize().width, ++ decrButton.getPreferredSize().width); ++ width = Math.max(getMinimumThumbSize().width, width); ++ width = Math.max(20, width); ++ width = Math.min(getMaximumThumbSize().width, width); ++ } ++ ++ Insets insets = scrollbar.getInsets(); ++ ++ height += insets.top + insets.bottom; ++ width += insets.left + insets.right; ++ ++ preferredSize = new Dimension(width, height); ++ } ++ ++ /** ++ * This method returns a cached value of the preferredSize. ++ * The only restrictions are: If the scrollbar is horizontal, the ++ * height should be the maximum of the height of the JButtons and ++ * the minimum width of the thumb. For vertical scrollbars, the ++ * calculation is similar (swap width for height and vice versa). ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The preferredSize. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ calculatePreferredSize(); ++ return preferredSize; ++ } ++ ++ /** ++ * This method returns the thumb's bounds based on the ++ * current value of the scrollbar. This method updates the ++ * cached value and returns that. ++ * ++ * @return The thumb bounds. ++ */ ++ protected Rectangle getThumbBounds() ++ { ++ int max = scrollbar.getMaximum(); ++ int min = scrollbar.getMinimum(); ++ int value = scrollbar.getValue(); ++ int extent = scrollbar.getVisibleAmount(); ++ ++ // System.err.println(this + ".getThumbBounds()"); ++ ++ if (max == min) ++ { ++ thumbRect.x = trackRect.x; ++ thumbRect.y = trackRect.y; ++ if (scrollbar.getOrientation() == HORIZONTAL) ++ { ++ thumbRect.width = getMinimumThumbSize().width; ++ thumbRect.height = trackRect.height; ++ } ++ else ++ { ++ thumbRect.width = trackRect.width; ++ thumbRect.height = getMinimumThumbSize().height; ++ } ++ return thumbRect; ++ } ++ ++ ++ if (scrollbar.getOrientation() == HORIZONTAL) ++ { ++ thumbRect.x = trackRect.x; ++ thumbRect.x += (value - min) * trackRect.width / (max - min); ++ thumbRect.y = trackRect.y; ++ ++ thumbRect.width = extent * trackRect.width / (max - min); ++ thumbRect.height = trackRect.height; ++ } ++ else ++ { ++ thumbRect.x = trackRect.x; ++ thumbRect.y = trackRect.y ++ + value * trackRect.height / (max - min); ++ ++ thumbRect.width = trackRect.width; ++ thumbRect.height = extent * trackRect.height / (max - min); ++ } ++ return thumbRect; ++ } ++ ++ /** ++ * This method calculates the bounds of the track. This method ++ * updates the cached value and returns it. ++ * ++ * @return The track's bounds. ++ */ ++ protected Rectangle getTrackBounds() ++ { ++ SwingUtilities.calculateInnerArea(scrollbar, trackRect); ++ ++ if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL) ++ { ++ trackRect.width -= incrButton.getPreferredSize().getWidth(); ++ trackRect.width -= decrButton.getPreferredSize().getWidth(); ++ ++ trackRect.x += decrButton.getPreferredSize().getWidth(); ++ } ++ else ++ { ++ trackRect.height -= incrButton.getPreferredSize().getHeight(); ++ trackRect.height -= decrButton.getPreferredSize().getHeight(); ++ ++ trackRect.y += incrButton.getPreferredSize().getHeight(); ++ } ++ return trackRect; ++ } ++ ++ /** ++ * This method installs any addition Components that ++ * are a part of or related to this scrollbar. ++ */ ++ protected void installComponents() ++ { ++ incrButton = createIncreaseButton(scrollbar.getOrientation()); ++ scrollbar.add(incrButton); ++ decrButton = createDecreaseButton(scrollbar.getOrientation()); ++ scrollbar.add(decrButton); ++ } ++ ++ /** ++ * This method installs the defaults for the scrollbar specified ++ * by the Basic Look and Feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ scrollbar.setForeground(defaults.getColor("ScrollBar.foreground")); ++ scrollbar.setBackground(defaults.getColor("ScrollBar.background")); ++ scrollbar.setBorder(defaults.getBorder("ScrollBar.border")); ++ scrollbar.setOpaque(true); ++ ++ maximumThumbSize = defaults.getDimension("ScrollBar.maximumThumbSize"); ++ minimumThumbSize = defaults.getDimension("ScrollBar.minimumThumbSize"); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the scrollbar. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method installs any listeners for the scrollbar. ++ * This method also installs listeners for things such as ++ * the JButtons and the timer. ++ */ ++ protected void installListeners() ++ { ++ scrollListener = createScrollListener(); ++ trackListener = createTrackListener(); ++ buttonListener = createArrowButtonListener(); ++ modelListener = createModelListener(); ++ propertyChangeListener = createPropertyChangeListener(); ++ ++ scrollbar.addMouseMotionListener(trackListener); ++ scrollbar.addMouseListener(trackListener); ++ ++ incrButton.addMouseListener(buttonListener); ++ decrButton.addMouseListener(buttonListener); ++ ++ scrollbar.addPropertyChangeListener(propertyChangeListener); ++ scrollbar.getModel().addChangeListener(modelListener); ++ ++ scrollTimer.addActionListener(scrollListener); ++ } ++ ++ /** ++ * This method installs the UI for the component. ++ * This can include setting up listeners, defaults, ++ * and components. This also includes initializing any data ++ * objects. ++ * ++ * @param c The JComponent to install. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof JScrollBar) ++ { ++ scrollbar = (JScrollBar) c; ++ ++ trackRect = new Rectangle(); ++ thumbRect = new Rectangle(); ++ ++ scrollTimer = new Timer(200, null); ++ scrollTimer.setRepeats(true); ++ ++ installComponents(); ++ installListeners(); ++ installDefaults(); ++ configureScrollBarColors(); ++ ++ calculatePreferredSize(); ++ layoutContainer(scrollbar); ++ } ++ } ++ ++ /** ++ * This method lays out the scrollbar. ++ * ++ * @param scrollbarContainer The Container to layout. ++ */ ++ public void layoutContainer(Container scrollbarContainer) ++ { ++ if (scrollbarContainer instanceof JScrollBar) ++ { ++ if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL) ++ layoutHScrollbar((JScrollBar) scrollbarContainer); ++ else ++ layoutVScrollbar((JScrollBar) scrollbarContainer); ++ } ++ } ++ ++ /** ++ * This method lays out the scrollbar horizontally. ++ * ++ * @param sb The JScrollBar to layout. ++ */ ++ protected void layoutHScrollbar(JScrollBar sb) ++ { ++ // All we have to do is layout the 2 buttons? ++ Rectangle vr = new Rectangle(); ++ SwingUtilities.calculateInnerArea(scrollbar, vr); ++ ++ // Update the rectangles. ++ getTrackBounds(); ++ getThumbBounds(); ++ ++ Dimension incrDims = incrButton.getPreferredSize(); ++ Dimension decrDims = decrButton.getPreferredSize(); ++ ++ decrButton.setBounds(vr.x, vr.y, decrDims.width, trackRect.height); ++ incrButton.setBounds(trackRect.x + trackRect.width, vr.y, incrDims.width, ++ trackRect.height); ++ } ++ ++ /** ++ * This method lays out the scrollbar vertically. ++ * ++ * @param sb The JScrollBar to layout. ++ */ ++ protected void layoutVScrollbar(JScrollBar sb) ++ { ++ Rectangle vr = new Rectangle(); ++ SwingUtilities.calculateInnerArea(scrollbar, vr); ++ ++ // Update rectangles ++ getTrackBounds(); ++ getThumbBounds(); ++ ++ Dimension incrDims = incrButton.getPreferredSize(); ++ Dimension decrDims = decrButton.getPreferredSize(); ++ ++ decrButton.setBounds(vr.x, vr.y, trackRect.width, decrDims.height); ++ incrButton.setBounds(vr.x, trackRect.y + trackRect.height, ++ trackRect.width, incrDims.height); ++ } ++ ++ /** ++ * This method returns the minimum size required for the layout. ++ * ++ * @param scrollbarContainer The Container that is laid out. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension minimumLayoutSize(Container scrollbarContainer) ++ { ++ return preferredLayoutSize(scrollbarContainer); ++ } ++ ++ /** ++ * This method is called when the component is painted. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ layoutContainer(scrollbar); ++ paintTrack(g, c, getTrackBounds()); ++ paintThumb(g, c, getThumbBounds()); ++ ++ if (trackHighlight == INCREASE_HIGHLIGHT) ++ paintIncreaseHighlight(g); ++ else if (trackHighlight == DECREASE_HIGHLIGHT) ++ paintDecreaseHighlight(g); ++ } ++ ++ /** ++ * This method is called when repainting and the mouse is ++ * pressed in the track. It paints the track below the thumb ++ * with the trackHighlight color. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ protected void paintDecreaseHighlight(Graphics g) ++ { ++ Color saved = g.getColor(); ++ ++ g.setColor(trackHighlightColor); ++ if (scrollbar.getOrientation() == HORIZONTAL) ++ g.fillRect(trackRect.x, trackRect.y, thumbRect.x - trackRect.x, ++ trackRect.height); ++ else ++ g.fillRect(trackRect.x, trackRect.y, trackRect.width, ++ thumbRect.y - trackRect.y); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method is called when repainting and the mouse is ++ * pressed in the track. It paints the track above the thumb ++ * with the trackHighlight color. ++ * ++ * @param g The Graphics objet to paint with. ++ */ ++ protected void paintIncreaseHighlight(Graphics g) ++ { ++ Color saved = g.getColor(); ++ ++ g.setColor(trackHighlightColor); ++ if (scrollbar.getOrientation() == HORIZONTAL) ++ g.fillRect(thumbRect.x + thumbRect.width, trackRect.y, ++ trackRect.x + trackRect.width - thumbRect.x - thumbRect.width, ++ trackRect.height); ++ else ++ g.fillRect(trackRect.x, thumbRect.y + thumbRect.height, ++ trackRect.width, ++ trackRect.y + trackRect.height - thumbRect.y - ++ thumbRect.height); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the thumb. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The Component that is being painted. ++ * @param thumbBounds The thumb bounds. ++ */ ++ protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) ++ { ++ Color saved = g.getColor(); ++ Point x; ++ Point y; ++ Point z; ++ Polygon lines; ++ ++ g.setColor(thumbHighlightColor); ++ x = new Point(thumbBounds.x + 1, thumbBounds.y + 1); ++ y = new Point(x); ++ y.translate(thumbBounds.width - 2, 0); ++ z = new Point(x); ++ z.translate(0, thumbBounds.height - 2); ++ ++ lines = new Polygon(new int[] { x.x, y.x, z.x }, ++ new int[] { x.y, y.y, z.y }, 3); ++ ++ g.drawPolygon(lines); ++ ++ g.setColor(thumbLightShadowColor); ++ x = new Point(thumbBounds.x + thumbBounds.width - 1, ++ thumbBounds.y + thumbBounds.height - 1); ++ y = new Point(x); ++ y.translate(-(thumbBounds.width - 2), 0); ++ z = new Point(x); ++ z.translate(0, -(thumbBounds.height - 2)); ++ ++ lines = new Polygon(new int[] { x.x, y.x, z.x }, ++ new int[] { x.y, y.y, z.y }, 3); ++ g.drawPolygon(lines); ++ ++ g.setColor(thumbDarkShadowColor); ++ x = new Point(thumbBounds.x + thumbBounds.width, ++ thumbBounds.y + thumbBounds.height); ++ y = new Point(x); ++ y.translate(-thumbBounds.width, 0); ++ z = new Point(x); ++ z.translate(0, -thumbBounds.height); ++ ++ lines = new Polygon(new int[] { x.x, y.x, z.x }, ++ new int[] { x.y, y.y, z.y }, 3); ++ g.drawPolygon(lines); ++ ++ g.setColor(thumbColor); ++ g.fillRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, ++ thumbBounds.height); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the track. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent being painted. ++ * @param trackBounds The track's bounds. ++ */ ++ protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) ++ { ++ Color saved = g.getColor(); ++ g.setColor(trackColor); ++ g.fill3DRect(trackBounds.x, trackBounds.y, trackBounds.width, ++ trackBounds.height, false); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method returns the preferred size for the layout. ++ * ++ * @param scrollbarContainer The Container to find a size for. ++ * ++ * @return The preferred size for the layout. ++ */ ++ public Dimension preferredLayoutSize(Container scrollbarContainer) ++ { ++ if (scrollbarContainer instanceof JComponent) ++ return getPreferredSize((JComponent) scrollbarContainer); ++ else ++ return null; ++ } ++ ++ /** ++ * This method removes a child component from the layout. ++ * ++ * @param child The child to remove. ++ */ ++ public void removeLayoutComponent(Component child) ++ { ++ // You should not be removing stuff from this component. ++ } ++ ++ /** ++ * The method scrolls the thumb by a block in the ++ * direction specified. ++ * ++ * @param direction The direction to scroll. ++ */ ++ protected void scrollByBlock(int direction) ++ { ++ scrollbar.setValue(scrollbar.getValue() + scrollbar.getBlockIncrement(direction)); ++ } ++ ++ /** ++ * The method scrolls the thumb by a unit in the ++ * direction specified. ++ * ++ * @param direction The direction to scroll. ++ */ ++ protected void scrollByUnit(int direction) ++ { ++ scrollbar.setValue(scrollbar.getValue() + scrollbar.getUnitIncrement(direction)); ++ } ++ ++ /** ++ * This method sets the thumb's bounds. ++ * ++ * @param x The X position of the thumb. ++ * @param y The Y position of the thumb. ++ * @param width The width of the thumb. ++ * @param height The height of the thumb. ++ */ ++ protected void setThumbBounds(int x, int y, int width, int height) ++ { ++ thumbRect.x = x; ++ thumbRect.y = y; ++ thumbRect.width = width; ++ thumbRect.height = height; ++ } ++ ++ /** ++ * This method uninstalls any components that ++ * are a part of or related to this scrollbar. ++ */ ++ protected void uninstallComponents() ++ { ++ scrollbar.remove(incrButton); ++ scrollbar.remove(decrButton); ++ incrButton = null; ++ decrButton = null; ++ } ++ ++ /** ++ * This method uninstalls any defaults that this ++ * scrollbar acquired from the Basic Look and Feel defaults. ++ */ ++ protected void uninstallDefaults() ++ { ++ scrollbar.setForeground(null); ++ scrollbar.setBackground(null); ++ scrollbar.setBorder(null); ++ } ++ ++ /** ++ * This method uninstalls any keyboard ++ * actions this scrollbar acquired during install. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method uninstalls any listeners that ++ * were registered during install. ++ */ ++ protected void uninstallListeners() ++ { ++ scrollTimer.removeActionListener(scrollListener); ++ ++ scrollbar.getModel().removeChangeListener(modelListener); ++ scrollbar.removePropertyChangeListener(propertyChangeListener); ++ ++ decrButton.removeMouseListener(buttonListener); ++ incrButton.removeMouseListener(buttonListener); ++ ++ scrollbar.removeMouseListener(trackListener); ++ scrollbar.removeMouseMotionListener(trackListener); ++ ++ propertyChangeListener = null; ++ modelListener = null; ++ buttonListener = null; ++ trackListener = null; ++ scrollListener = null; ++ } ++ ++ /** ++ * This method uninstalls the UI. This includes ++ * removing any defaults, listeners, and components ++ * that this UI may have initialized. It also nulls ++ * any instance data. ++ * ++ * @param c The Component to uninstall for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallDefaults(); ++ uninstallListeners(); ++ uninstallComponents(); ++ ++ scrollTimer = null; ++ ++ thumbRect = null; ++ trackRect = null; ++ ++ trackColor = null; ++ trackHighlightColor = null; ++ thumbColor = null; ++ thumbHighlightColor = null; ++ thumbDarkShadowColor = null; ++ thumbLightShadowColor = null; ++ ++ scrollbar = null; ++ } ++ ++ /** ++ * This method returns the value in the scrollbar's range given the y ++ * coordinate. If the value is out of range, it will return the closest ++ * legal value. ++ * ++ * @param yPos The y coordinate to calculate a value for. ++ * ++ * @return The value for the y coordinate. ++ */ ++ private int valueForYPosition(int yPos) ++ { ++ int min = scrollbar.getMinimum(); ++ int max = scrollbar.getMaximum(); ++ int len = trackRect.height; ++ ++ int value; ++ ++ // If the length is 0, you shouldn't be able to even see where the thumb is. ++ // This really shouldn't ever happen, but just in case, we'll return the middle. ++ if (len == 0) ++ return ((max - min) / 2); ++ ++ value = ((yPos - trackRect.y) * (max - min) / len + min); ++ ++ // If this isn't a legal value, then we'll have to move to one now. ++ if (value > max) ++ value = max; ++ else if (value < min) ++ value = min; ++ return value; ++ } ++ ++ /** ++ * This method returns the value in the scrollbar's range given the x ++ * coordinate. If the value is out of range, it will return the closest ++ * legal value. ++ * ++ * @param xPos The x coordinate to calculate a value for. ++ * ++ * @return The value for the x coordinate. ++ */ ++ private int valueForXPosition(int xPos) ++ { ++ int min = scrollbar.getMinimum(); ++ int max = scrollbar.getMaximum(); ++ int len = trackRect.width; ++ ++ int value; ++ ++ // If the length is 0, you shouldn't be able to even see where the slider is. ++ // This really shouldn't ever happen, but just in case, we'll return the middle. ++ if (len == 0) ++ return ((max - min) / 2); ++ ++ value = ((xPos - trackRect.x) * (max - min) / len + min); ++ ++ // If this isn't a legal value, then we'll have to move to one now. ++ if (value > max) ++ value = max; ++ else if (value < min) ++ value = min; ++ return value; ++ } ++} +Index: javax/swing/plaf/basic/BasicScrollPaneUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicScrollPaneUI.java,v +retrieving revision 1.3 +diff -u -r1.3 BasicScrollPaneUI.java +--- javax/swing/plaf/basic/BasicScrollPaneUI.java 10 Jan 2004 21:59:30 -0000 1.3 ++++ javax/swing/plaf/basic/BasicScrollPaneUI.java 6 Sep 2004 16:36:06 -0000 +@@ -40,54 +40,75 @@ + + import java.awt.Dimension; + import java.awt.Graphics; ++ + import javax.swing.JComponent; + import javax.swing.JScrollPane; ++import javax.swing.ScrollPaneConstants; ++import javax.swing.ScrollPaneLayout; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.ScrollPaneUI; + + public class BasicScrollPaneUI extends ScrollPaneUI ++ implements ScrollPaneConstants + { +- int min_w = 50; +- int min_h = 50; + + public static ComponentUI createUI(final JComponent c) + { + return new BasicScrollPaneUI(); + } + ++ protected void installDefaults(JScrollPane p) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ p.setForeground(defaults.getColor("ScrollPane.foreground")); ++ p.setBackground(defaults.getColor("ScrollPane.background")); ++ p.setFont(defaults.getFont("ScrollPane.font")); ++ p.setBorder(defaults.getBorder("ScrollPane.border")); ++ p.setOpaque(true); ++ } ++ ++ protected void uninstallDefaults(JScrollPane p) ++ { ++ p.setForeground(null); ++ p.setBackground(null); ++ p.setFont(null); ++ p.setBorder(null); ++ } + + public void installUI(final JComponent c) + { + super.installUI(c); ++ this.installDefaults((JScrollPane)c); ++ } ++ ++ public void uninstallUI(final JComponent c) ++ { ++ super.uninstallUI(c); ++ this.uninstallDefaults((JScrollPane)c); + } + ++ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ JScrollPane p = (JScrollPane ) c; ++ ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout(); ++ return sl.minimumLayoutSize(c); ++ } + + public Dimension getPreferredSize(JComponent c) + { + JScrollPane p = (JScrollPane ) c; +- +- Dimension d = new Dimension(min_w, +- min_h); +- +- Dimension a = p.getViewport().getPreferredSize(); +- +- if (a != null) +- { +- d.width = Math.max(d.width, a.width); +- d.height = Math.max(d.height, a.height); +- } +- +- +- System.out.println("BasicScrollPaneUI->preff->"+d); +- return d; ++ ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout(); ++ return sl.preferredLayoutSize(c); + } + ++ + public void paint(Graphics g, JComponent c) + { +- System.out.println("BasicScrollPaneUI->paint()->"+c); +- +- JScrollPane p = (JScrollPane ) c; +- p.getViewport().paint(g); ++ // do nothing; the normal painting-of-children algorithm, along with ++ // ScrollPaneLayout, does all the relevant work. + } + } + +Index: javax/swing/plaf/basic/BasicSeparatorUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicSeparatorUI.java +diff -N javax/swing/plaf/basic/BasicSeparatorUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicSeparatorUI.java 6 Sep 2004 16:36:06 -0000 +@@ -0,0 +1,267 @@ ++/* BasicSeparatorUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Dimension; ++import java.awt.Color; ++import java.awt.Rectangle; ++import java.awt.Graphics; ++import java.awt.Insets; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.SeparatorUI; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.JComponent; ++import javax.swing.JSeparator; ++import javax.swing.SwingUtilities; ++ ++/** ++ * The Basic Look and Feel UI delegate for JSeparator. ++ */ ++public class BasicSeparatorUI extends SeparatorUI ++{ ++ /** The shadow color. */ ++ protected Color shadow; ++ ++ /** The highlight color. */ ++ protected Color highlight; ++ ++ /** ++ * Creates a new UI delegate for the given JComponent. ++ * ++ * @param c The JComponent to create a delegate for. ++ * ++ * @return A new BasicSeparatorUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicSeparatorUI(); ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * This can include installing defaults, listeners, and ++ * initializing any instance data. ++ * ++ * @param c The JComponent that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ ++ if (c instanceof JSeparator) ++ { ++ JSeparator s = (JSeparator) c; ++ ++ installDefaults(s); ++ installListeners(s); ++ } ++ } ++ ++ /** ++ * Uninstalls the UI for the given JComponent. This ++ * method reverses what was done when installing ++ * the UI on the JComponent. ++ * ++ * @param c The JComponent that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ if (c instanceof JSeparator) ++ { ++ JSeparator s = (JSeparator) c; ++ ++ uninstallListeners(s); ++ uninstallDefaults(s); ++ } ++ } ++ ++ /** ++ * This method installs the defaults that are given by ++ * the Basic Look and Feel. ++ * ++ * @param s The JSeparator that is being installed. ++ */ ++ protected void installDefaults(JSeparator s) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ shadow = defaults.getColor("Separator.shadow"); ++ highlight = defaults.getColor("Separator.highlight"); ++ s.setOpaque(true); ++ } ++ ++ /** ++ * This method removes the defaults that were given ++ * by the Basic Look and Feel. ++ * ++ * @param s The JSeparator that is being uninstalled. ++ */ ++ protected void uninstallDefaults(JSeparator s) ++ { ++ shadow = null; ++ highlight = null; ++ } ++ ++ /** ++ * This method installs any listeners that need ++ * to be attached to the JSeparator or any of its ++ * components. ++ * ++ * @param s The JSeparator that is being installed. ++ */ ++ protected void installListeners(JSeparator s) ++ { ++ // Separators don't receive events. ++ } ++ ++ /** ++ * This method uninstalls any listeners that ++ * were installed during the install UI process. ++ * ++ * @param s The JSeparator that is being uninstalled. ++ */ ++ protected void uninstallListeners(JSeparator s) ++ { ++ // Separators don't receive events. ++ } ++ ++ /** ++ * The separator is made of two lines. The top line will be ++ * the highlight color (or left line if it's vertical). The bottom ++ * or right line will be the shadow color. The two lines will ++ * be centered inside the bounds box. If the separator is horizontal, ++ * then it will be vertically centered, or if it's vertical, it will ++ * be horizontally centered. ++ * ++ * @param g The Graphics object to paint with ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ Rectangle r = new Rectangle(); ++ SwingUtilities.calculateInnerArea(c, r); ++ Color saved = g.getColor(); ++ ++ int midAB = r.width / 2 + r.x; ++ int midAD = r.height / 2 + r.y; ++ ++ JSeparator s; ++ if (c instanceof JSeparator) ++ s = (JSeparator) c; ++ else ++ return; ++ ++ if (s.getOrientation() == JSeparator.HORIZONTAL) ++ { ++ g.setColor(highlight); ++ g.drawLine(r.x, midAD, r.x + r.width, midAD); ++ ++ g.setColor(shadow); ++ g.drawLine(r.x, midAD + 1, r.x + r.width, midAD + 1); ++ } ++ else ++ { ++ g.setColor(highlight); ++ g.drawLine(midAB, r.y, midAB, r.y + r.height); ++ ++ g.setColor(shadow); ++ g.drawLine(midAB + 1, r.y, midAB + 1, r.y + r.height); ++ } ++ } ++ ++ /** ++ * This method returns the preferred size of the ++ * JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ Dimension dims = new Dimension(0, 0); ++ Insets insets = c.getInsets(); ++ ++ if (c instanceof JSeparator) ++ { ++ JSeparator s = (JSeparator) c; ++ ++ if (s.getOrientation() == JSeparator.HORIZONTAL) ++ { ++ dims.height = 2; ++ dims.width = 40; ++ } ++ else ++ { ++ dims.width = 2; ++ dims.height = 40; ++ } ++ } ++ dims.width += insets.left + insets.right; ++ dims.height += insets.top + insets.bottom; ++ ++ return dims; ++ } ++ ++ /** ++ * This method returns the minimum size of the ++ * JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the maximum size of the ++ * JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++} +Index: javax/swing/plaf/basic/BasicSliderUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicSliderUI.java +diff -N javax/swing/plaf/basic/BasicSliderUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicSliderUI.java 6 Sep 2004 16:36:07 -0000 +@@ -0,0 +1,2217 @@ ++/* BasicSliderUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.ComponentOrientation; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Point; ++import java.awt.Polygon; ++import java.awt.Rectangle; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.awt.event.ComponentAdapter; ++import java.awt.event.ComponentEvent; ++import java.awt.event.ComponentListener; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.util.Dictionary; ++import java.util.Enumeration; ++import javax.swing.BoundedRangeModel; ++import javax.swing.JComponent; ++import javax.swing.JLabel; ++import javax.swing.JSlider; ++import javax.swing.SwingUtilities; ++import javax.swing.Timer; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import javax.swing.event.MouseInputAdapter; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.SliderUI; ++ ++ ++/** ++ *

    ++ * BasicSliderUI.java This is the UI delegate in the Basic look and feel that ++ * paints JSliders. ++ *

    ++ * ++ *

    ++ * The UI delegate keeps track of 6 rectangles that place the various parts of ++ * the JSlider inside the component. ++ *

    ++ * ++ *

    ++ * The rectangles are organized as follows: ++ *

    ++ *
    ++ *     +-------------------------------------------------------+ <-- focusRect
    ++ *     |                                                       |
    ++ *     |  +==+-------------------+==+--------------------+==+<------ contentRect
    ++ *     |  |  |                   |  |<---thumbRect       |  |  |
    ++ *     |  |  |    TRACK          |  |                    |<--------- trackRect
    ++ *     |  |  +-------------------+==+--------------------+  |  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |  |          TICKS GO HERE                    |<-------- tickRect
    ++ *     |  |  |                                           |  |  |
    ++ *     |  +==+-------------------------------------------+==+  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |  |                                           |  |<----- labelRect
    ++ *     |  |  |                 LABELS GO HERE            |  |  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |  |                                           |  |  |
    ++ *     |  |                                              |  |  |
    ++ * 
    ++ * ++ *

    ++ * The space between the contentRect and the focusRect are the FocusInsets. ++ *

    ++ * ++ *

    ++ * The space between the focusRect and the component bounds is the insetCache ++ * which are the component's insets. ++ *

    ++ * ++ *

    ++ * The top of the thumb is the top of the contentRect. The trackRect has to be ++ * as tall as the thumb. ++ *

    ++ * ++ *

    ++ * The trackRect and tickRect do not start from the left edge of the ++ * focusRect. They are trackBuffer away from each side of the focusRect. This ++ * is so that the thumb has room to move. ++ *

    ++ * ++ *

    ++ * The labelRect does start right against the contentRect's left and right ++ * edges and it gets all remaining space. ++ *

    ++ */ ++public class BasicSliderUI extends SliderUI ++{ ++ /** ++ * Helper class that listens to the {@link JSlider}'s model for changes. ++ */ ++ protected class ChangeHandler implements ChangeListener ++ { ++ /** ++ * Called when the slider's model has been altered. The UI delegate should ++ * recalculate any rectangles that are dependent on the model for their ++ * positions and repaint. ++ * ++ * @param e A static {@link ChangeEvent} passed from the model. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ // Maximum, minimum, and extent values will be taken ++ // care of automatically when the slider is repainted. ++ // Only thing that needs recalculation is the thumb. ++ calculateThumbLocation(); ++ slider.repaint(); ++ } ++ } ++ ++ /** ++ * Helper class that listens for resize events. ++ */ ++ protected class ComponentHandler extends ComponentAdapter ++ { ++ /** ++ * Called when the size of the component changes. The UI delegate should ++ * recalculate any rectangles that are dependent on the model for their ++ * positions and repaint. ++ * ++ * @param e A {@link ComponentEvent}. ++ */ ++ public void componentResized(ComponentEvent e) ++ { ++ calculateGeometry(); ++ ++ slider.revalidate(); ++ slider.repaint(); ++ } ++ } ++ ++ /** ++ * Helper class that listens for focus events. ++ */ ++ protected class FocusHandler implements FocusListener ++ { ++ /** ++ * Called when the {@link JSlider} has gained focus. It should repaint ++ * the slider with the focus drawn. ++ * ++ * @param e A {@link FocusEvent}. ++ */ ++ public void focusGained(FocusEvent e) ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * Called when the {@link JSlider} has lost focus. It should repaint the ++ * slider without the focus drawn. ++ * ++ * @param e A {@link FocusEvent}. ++ */ ++ public void focusLost(FocusEvent e) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * Helper class that listens for changes to the properties of the {@link ++ * JSlider}. ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * Called when one of the properties change. The UI should recalculate any ++ * rectangles if necessary and repaint. ++ * ++ * @param e A {@link PropertyChangeEvent}. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ // Check for orientation changes. ++ if (e.getPropertyName().equals(JSlider.ORIENTATION_CHANGED_PROPERTY)) ++ recalculateIfOrientationChanged(); ++ else if (e.getPropertyName().equals(JSlider.MODEL_CHANGED_PROPERTY)) ++ { ++ BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue(); ++ oldModel.removeChangeListener(changeListener); ++ slider.getModel().addChangeListener(changeListener); ++ calculateThumbLocation(); ++ } ++ ++ // elif the componentOrientation changes (this is a bound property, ++ // just undocumented) we change leftToRightCache. In Sun's ++ // implementation, the LTR cache changes on a repaint. This is strange ++ // since there is no need to do so. We could events here and ++ // update the cache. ++ // elif the border/insets change, we recalculateInsets. ++ slider.repaint(); ++ } ++ } ++ ++ /** ++ * Helper class that listens to our swing timer. This class is responsible ++ * for listening to the timer and moving the thumb in the proper direction ++ * every interval. ++ */ ++ protected class ScrollListener implements ActionListener ++ { ++ /** Indicates which direction the thumb should scroll. */ ++ private transient int direction; ++ ++ /** Indicates whether we should scroll in blocks or in units. */ ++ private transient boolean block; ++ ++ /** ++ * Creates a new ScrollListener object. ++ */ ++ public ScrollListener() ++ { ++ direction = POSITIVE_SCROLL; ++ block = false; ++ } ++ ++ /** ++ * Creates a new ScrollListener object. ++ * ++ * @param dir The direction to scroll in. ++ * @param block If movement will be in blocks. ++ */ ++ public ScrollListener(int dir, boolean block) ++ { ++ direction = dir; ++ this.block = block; ++ } ++ ++ /** ++ * Called every time the swing timer reaches its interval. If the thumb ++ * needs to move, then this method will move the thumb one block or unit ++ * in the direction desired. Otherwise, the timer can be stopped. ++ * ++ * @param e An {@link ActionEvent}. ++ */ ++ public void actionPerformed(ActionEvent e) ++ { ++ if (! trackListener.shouldScroll(direction)) ++ { ++ scrollTimer.stop(); ++ return; ++ } ++ ++ if (block) ++ scrollByBlock(direction); ++ else ++ scrollByUnit(direction); ++ } ++ ++ /** ++ * Sets the direction to scroll in. ++ * ++ * @param direction The direction to scroll in. ++ */ ++ public void setDirection(int direction) ++ { ++ this.direction = direction; ++ } ++ ++ /** ++ * Sets whether movement will be in blocks. ++ * ++ * @param block If movement will be in blocks. ++ */ ++ public void setScrollByBlock(boolean block) ++ { ++ this.block = block; ++ } ++ } ++ ++ /** ++ * Helper class that listens for mouse events. ++ */ ++ protected class TrackListener extends MouseInputAdapter ++ { ++ /** The current X position of the mouse. */ ++ protected int currentMouseX; ++ ++ /** The current Y position of the mouse. */ ++ protected int currentMouseY; ++ ++ /** ++ * The offset between the current slider value and the cursor's position. ++ */ ++ protected int offset; ++ ++ /** ++ * Called when the mouse has been dragged. This should find the mouse's ++ * current position and adjust the value of the {@link JSlider} ++ * accordingly. ++ * ++ * @param e A {@link MouseEvent} ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ currentMouseX = e.getX(); ++ currentMouseY = e.getY(); ++ if (slider.getValueIsAdjusting()) ++ { ++ int value; ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ value = valueForXPosition(currentMouseX) - offset; ++ else ++ value = valueForYPosition(currentMouseY) - offset; ++ ++ slider.setValue(value); ++ } ++ } ++ ++ /** ++ * Called when the mouse has moved over a component but no buttons have ++ * been pressed yet. ++ * ++ * @param e A {@link MouseEvent} ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ // Don't care that we're moved unless we're dragging. ++ } ++ ++ /** ++ * Called when the mouse is pressed. When the press occurs on the thumb ++ * itself, the {@link JSlider} should have its value set to where the ++ * mouse was pressed. If the press occurs on the track, then the thumb ++ * should move one block towards the direction of the mouse. ++ * ++ * @param e A {@link MouseEvent} ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ currentMouseX = e.getX(); ++ currentMouseY = e.getY(); ++ ++ int value; ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ value = valueForXPosition(currentMouseX); ++ else ++ value = valueForYPosition(currentMouseY); ++ ++ if (slider.getSnapToTicks()) ++ value = findClosestTick(value); ++ ++ // If the thumb is hit, then we don't need to set the timers to move it. ++ if (!thumbRect.contains(e.getPoint())) ++ { ++ // The mouse has hit some other part of the slider. ++ // The value moves no matter where in the slider you hit. ++ if (value > slider.getValue()) ++ scrollDueToClickInTrack(POSITIVE_SCROLL); ++ else ++ scrollDueToClickInTrack(NEGATIVE_SCROLL); ++ } ++ else ++ { ++ slider.setValueIsAdjusting(true); ++ offset = value - slider.getValue(); ++ } ++ } ++ ++ /** ++ * Called when the mouse is released. This should stop the timer that ++ * scrolls the thumb. ++ * ++ * @param e A {@link MouseEvent} ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ currentMouseX = e.getX(); ++ currentMouseY = e.getY(); ++ ++ if (slider.getValueIsAdjusting()) ++ { ++ slider.setValueIsAdjusting(false); ++ if (slider.getSnapToTicks()) ++ slider.setValue(findClosestTick(slider.getValue())); ++ } ++ if (scrollTimer != null) ++ scrollTimer.stop(); ++ } ++ ++ /** ++ * Indicates whether the thumb should scroll in the given direction. ++ * ++ * @param direction The direction to check. ++ * ++ * @return True if the thumb should move in that direction. ++ */ ++ public boolean shouldScroll(int direction) ++ { ++ int value; ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ value = valueForXPosition(currentMouseX); ++ else ++ value = valueForYPosition(currentMouseY); ++ ++ if (direction == POSITIVE_SCROLL) ++ return (value > slider.getValue()); ++ else ++ return (value < slider.getValue()); ++ } ++ } ++ ++ /** The preferred height of the thumb. */ ++ private transient int thumbHeight; ++ ++ /** The preferred width of the thumb. */ ++ private transient int thumbWidth; ++ ++ /** The preferred height of the tick rectangle. */ ++ private transient int tickHeight; ++ ++ /** Listener for changes from the model. */ ++ protected ChangeListener changeListener; ++ ++ /** Listener for changes to the {@link JSlider}. */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** Listener for the scrollTimer. */ ++ protected ScrollListener scrollListener; ++ ++ /** Listener for component resizing. */ ++ protected ComponentListener componentListener; ++ ++ /** Listener for focus handling. */ ++ protected FocusListener focusListener; ++ ++ /** Listener for mouse events. */ ++ protected TrackListener trackListener; ++ ++ /** The insets between the FocusRectangle and the ContentRectangle. */ ++ protected Insets focusInsets; ++ ++ /** The {@link JSlider}'s insets. */ ++ protected Insets insetCache; ++ ++ /** Rectangle describing content bounds. See diagram above. */ ++ protected Rectangle contentRect; ++ ++ /** Rectangle describing focus bounds. See diagram above. */ ++ protected Rectangle focusRect; ++ ++ /** Rectangle describing the thumb's bounds. See diagram above. */ ++ protected Rectangle thumbRect; ++ ++ /** Rectangle describing the tick bounds. See diagram above. */ ++ protected Rectangle tickRect; ++ ++ /** Rectangle describing the label bounds. See diagram above. */ ++ protected Rectangle labelRect; ++ ++ /** Rectangle describing the track bounds. See diagram above. */ ++ protected Rectangle trackRect; ++ ++ /** FIXME: use this somewhere. */ ++ public static final int MAX_SCROLL = 2; ++ ++ /** FIXME: use this somewhere. */ ++ public static final int MIN_SCROLL = -2; ++ ++ /** A constant describing scrolling towards the minimum. */ ++ public static final int NEGATIVE_SCROLL = -1; ++ ++ /** A constant describing scrolling towards the maximum. */ ++ public static final int POSITIVE_SCROLL = 1; ++ ++ /** The gap between the edges of the contentRect and trackRect. */ ++ protected int trackBuffer; ++ ++ /** Whether this slider is actually drawn left to right. */ ++ protected boolean leftToRightCache; ++ ++ /** A timer that periodically moves the thumb. */ ++ protected Timer scrollTimer; ++ ++ /** A reference to the {@link JSlider} that this UI was created for. */ ++ protected JSlider slider; ++ ++ /** The shadow color. */ ++ private transient Color shadowColor; ++ ++ /** The highlight color. */ ++ private transient Color highlightColor; ++ ++ /** The focus color. */ ++ private transient Color focusColor; ++ ++ /** ++ * Creates a new Basic look and feel Slider UI. ++ * ++ * @param b The {@link JSlider} that this UI was created for. ++ */ ++ public BasicSliderUI(JSlider b) ++ { ++ super(); ++ } ++ ++ /** ++ * Gets the shadow color to be used for this slider. The shadow color is the ++ * color used for drawing the top and left edges of the track. ++ * ++ * @return The shadow color. ++ */ ++ protected Color getShadowColor() ++ { ++ return shadowColor; ++ } ++ ++ /** ++ * Gets the highlight color to be used for this slider. The highlight color ++ * is the color used for drawing the bottom and right edges of the track. ++ * ++ * @return The highlight color. ++ */ ++ protected Color getHighlightColor() ++ { ++ return highlightColor; ++ } ++ ++ /** ++ * Gets the focus color to be used for this slider. The focus color is the ++ * color used for drawing the focus rectangle when the component gains ++ * focus. ++ * ++ * @return The focus color. ++ */ ++ protected Color getFocusColor() ++ { ++ return focusColor; ++ } ++ ++ /** ++ * Factory method to create a BasicSliderUI for the given {@link ++ * JComponent}, which should be a {@link JSlider}. ++ * ++ * @param b The {@link JComponent} a UI is being created for. ++ * ++ * @return A BasicSliderUI for the {@link JComponent}. ++ */ ++ public static ComponentUI createUI(JComponent b) ++ { ++ return new BasicSliderUI((JSlider) b); ++ } ++ ++ /** ++ * Installs and initializes all fields for this UI delegate. Any properties ++ * of the UI that need to be initialized and/or set to defaults will be ++ * done now. It will also install any listeners necessary. ++ * ++ * @param c The {@link JComponent} that is having this UI installed. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof JSlider) ++ { ++ slider = (JSlider) c; ++ ++ focusRect = new Rectangle(); ++ contentRect = new Rectangle(); ++ thumbRect = new Rectangle(); ++ trackRect = new Rectangle(); ++ tickRect = new Rectangle(); ++ labelRect = new Rectangle(); ++ ++ insetCache = slider.getInsets(); ++ leftToRightCache = ! slider.getInverted(); ++ ++ scrollTimer = new Timer(200, null); ++ scrollTimer.setRepeats(true); ++ ++ installDefaults(slider); ++ installListeners(slider); ++ installKeyboardActions(slider); ++ ++ calculateFocusRect(); ++ ++ calculateContentRect(); ++ calculateThumbSize(); ++ calculateTrackBuffer(); ++ calculateTrackRect(); ++ calculateThumbLocation(); ++ ++ calculateTickRect(); ++ calculateLabelRect(); ++ } ++ } ++ ++ /** ++ * Performs the opposite of installUI. Any properties or resources that need ++ * to be cleaned up will be done now. It will also uninstall any listeners ++ * it has. In addition, any properties of this UI will be nulled. ++ * ++ * @param c The {@link JComponent} that is having this UI uninstalled. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ super.uninstallUI(c); ++ ++ uninstallKeyboardActions(slider); ++ uninstallListeners(slider); ++ ++ scrollTimer = null; ++ ++ focusRect = null; ++ contentRect = null; ++ thumbRect = null; ++ trackRect = null; ++ tickRect = null; ++ labelRect = null; ++ ++ focusInsets = null; ++ } ++ ++ /** ++ * Initializes any default properties that this UI has from the defaults for ++ * the Basic look and feel. ++ * ++ * @param slider The {@link JSlider} that is having this UI installed. ++ */ ++ protected void installDefaults(JSlider slider) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ slider.setForeground(defaults.getColor("Slider.foreground")); ++ slider.setBackground(defaults.getColor("Slider.background")); ++ shadowColor = defaults.getColor("Slider.shadow"); ++ highlightColor = defaults.getColor("Slider.highlight"); ++ focusColor = defaults.getColor("Slider.focus"); ++ slider.setBorder(defaults.getBorder("Slider.border")); ++ slider.setOpaque(true); ++ ++ thumbHeight = defaults.getInt("Slider.thumbHeight"); ++ thumbWidth = defaults.getInt("Slider.thumbWidth"); ++ tickHeight = defaults.getInt("Slider.tickHeight"); ++ ++ focusInsets = defaults.getInsets("Slider.focusInsets"); ++ } ++ ++ /** ++ * Creates a new {@link TrackListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link TrackListener} is ++ * created for. ++ * ++ * @return A new {@link TrackListener}. ++ */ ++ protected TrackListener createTrackListener(JSlider slider) ++ { ++ return new TrackListener(); ++ } ++ ++ /** ++ * Creates a new {@link ChangeListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link ChangeListener} is ++ * created for. ++ * ++ * @return A new {@link ChangeListener}. ++ */ ++ protected ChangeListener createChangeListener(JSlider slider) ++ { ++ return new ChangeHandler(); ++ } ++ ++ /** ++ * Creates a new {@link ComponentListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link ComponentListener} is ++ * created for. ++ * ++ * @return A new {@link ComponentListener}. ++ */ ++ protected ComponentListener createComponentListener(JSlider slider) ++ { ++ return new ComponentHandler(); ++ } ++ ++ /** ++ * Creates a new {@link FocusListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link FocusListener} is ++ * created for. ++ * ++ * @return A new {@link FocusListener}. ++ */ ++ protected FocusListener createFocusListener(JSlider slider) ++ { ++ return new FocusHandler(); ++ } ++ ++ /** ++ * Creates a new {@link ScrollListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link ScrollListener} is ++ * created for. ++ * ++ * @return A new {@link ScrollListener}. ++ */ ++ protected ScrollListener createScrollListener(JSlider slider) ++ { ++ return new ScrollListener(); ++ } ++ ++ /** ++ * Creates a new {@link PropertyChangeListener}. ++ * ++ * @param slider The {@link JSlider} that this {@link ++ * PropertyChangeListener} is created for. ++ * ++ * @return A new {@link PropertyChangeListener}. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener(JSlider slider) ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * Creates and registers all the listeners for this UI delegate. This ++ * includes creating the ScrollListener and registering it to the timer. ++ * ++ * @param slider The {@link JSlider} is having listeners installed. ++ */ ++ protected void installListeners(JSlider slider) ++ { ++ propertyChangeListener = createPropertyChangeListener(slider); ++ componentListener = createComponentListener(slider); ++ trackListener = createTrackListener(slider); ++ focusListener = createFocusListener(slider); ++ changeListener = createChangeListener(slider); ++ scrollListener = createScrollListener(slider); ++ ++ slider.addPropertyChangeListener(propertyChangeListener); ++ slider.addComponentListener(componentListener); ++ slider.addMouseListener(trackListener); ++ slider.addMouseMotionListener(trackListener); ++ slider.addFocusListener(focusListener); ++ slider.getModel().addChangeListener(changeListener); ++ ++ scrollTimer.addActionListener(scrollListener); ++ } ++ ++ /** ++ * Unregisters all the listeners that this UI delegate was using. In ++ * addition, it will also null any listeners that it was using. ++ * ++ * @param slider The {@link JSlider} that is having listeners removed. ++ */ ++ protected void uninstallListeners(JSlider slider) ++ { ++ slider.removePropertyChangeListener(propertyChangeListener); ++ slider.removeComponentListener(componentListener); ++ slider.removeMouseListener(trackListener); ++ slider.removeMouseMotionListener(trackListener); ++ slider.removeFocusListener(focusListener); ++ slider.getModel().removeChangeListener(changeListener); ++ ++ scrollTimer.removeActionListener(scrollListener); ++ ++ propertyChangeListener = null; ++ componentListener = null; ++ trackListener = null; ++ focusListener = null; ++ changeListener = null; ++ scrollListener = null; ++ } ++ ++ /** ++ * Installs any keyboard actions. The list of keys that need to be bound are ++ * listed in Basic look and feel's defaults. ++ * ++ * @param slider The {@link JSlider} that is having keyboard actions ++ * installed. ++ */ ++ protected void installKeyboardActions(JSlider slider) ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * Uninstalls any keyboard actions. The list of keys used are listed in ++ * Basic look and feel's defaults. ++ * ++ * @param slider The {@link JSlider} that is having keyboard actions ++ * uninstalled. ++ */ ++ protected void uninstallKeyboardActions(JSlider slider) ++ { ++ // FIXME: implement. ++ } ++ ++ /* XXX: This is all after experimentation with SUN's implementation. ++ ++ PreferredHorizontalSize seems to be 200x21. ++ PreferredVerticalSize seems to be 21x200. ++ ++ MinimumHorizontalSize seems to be 36x21. ++ MinimumVerticalSize seems to be 21x36. ++ ++ PreferredSize seems to be 200x63. Or Components.getBounds? ++ ++ MinimumSize seems to be 36x63. ++ ++ MaximumSize seems to be 32767x63. ++ */ ++ ++ /** ++ * This method returns the preferred size when the slider is horizontally ++ * oriented. ++ * ++ * @return The dimensions of the preferred horizontal size. ++ */ ++ public Dimension getPreferredHorizontalSize() ++ { ++ Insets insets = slider.getInsets(); ++ ++ // The width should cover all the labels (which are usually the ++ // deciding factor of the width) ++ int width = getWidthOfWidestLabel() * (slider.getLabelTable() == null ? 0 ++ : slider.getLabelTable() ++ .size()); ++ ++ // If there are not enough labels. ++ // This number is pretty much arbitrary, but it looks nice. ++ if (width < 200) ++ width = 200; ++ ++ // We can only draw inside of the focusRectangle, so we have to ++ // pad it with insets. ++ width += insets.left + insets.right + focusInsets.left + focusInsets.right; ++ ++ // Height is determined by the thumb, the ticks and the labels. ++ int height = thumbHeight; ++ ++ if (slider.getPaintTicks() && slider.getMajorTickSpacing() > 0 ++ || slider.getMinorTickSpacing() > 0) ++ height += tickHeight; ++ ++ if (slider.getPaintLabels()) ++ height += getHeightOfTallestLabel(); ++ ++ height += insets.top + insets.bottom + focusInsets.top ++ + focusInsets.bottom; ++ ++ return new Dimension(width, height); ++ } ++ ++ /** ++ * This method returns the preferred size when the slider is vertically ++ * oriented. ++ * ++ * @return The dimensions of the preferred vertical size. ++ */ ++ public Dimension getPreferredVerticalSize() ++ { ++ Insets insets = slider.getInsets(); ++ ++ int height = getHeightOfTallestLabel() * (slider.getLabelTable() == null ++ ? 0 : slider.getLabelTable() ++ .size()); ++ ++ if (height < 200) ++ height = 200; ++ ++ height += insets.top + insets.bottom + focusInsets.top ++ + focusInsets.bottom; ++ ++ int width = thumbHeight; ++ ++ if (slider.getPaintTicks() && slider.getMajorTickSpacing() > 0 ++ || slider.getMinorTickSpacing() > 0) ++ width += tickHeight; ++ ++ if (slider.getPaintLabels()) ++ width += getWidthOfWidestLabel(); ++ ++ width += insets.left + insets.right + focusInsets.left + focusInsets.right; ++ ++ return new Dimension(width, height); ++ } ++ ++ /** ++ * This method returns the minimum size when the slider is horizontally ++ * oriented. ++ * ++ * @return The dimensions of the minimum horizontal size. ++ */ ++ public Dimension getMinimumHorizontalSize() ++ { ++ return getPreferredHorizontalSize(); ++ } ++ ++ /** ++ * This method returns the minimum size of the slider when it is vertically ++ * oriented. ++ * ++ * @return The dimensions of the minimum vertical size. ++ */ ++ public Dimension getMinimumVerticalSize() ++ { ++ return getPreferredVerticalSize(); ++ } ++ ++ /** ++ * This method returns the preferred size of the component. If it returns ++ * null, then it is up to the Layout Manager to give the {@link JComponent} ++ * a size. ++ * ++ * @param c The {@link JComponent} to find the preferred size for. ++ * ++ * @return The dimensions of the preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ return getPreferredHorizontalSize(); ++ else ++ return getPreferredVerticalSize(); ++ } ++ ++ /** ++ * This method returns the minimum size for this {@link JSlider} for this ++ * look and feel. If it returns null, then it is up to the Layout Manager ++ * to give the {@link JComponent} a size. ++ * ++ * @param c The {@link JComponent} to find the minimum size for. ++ * ++ * @return The dimensions of the minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ return getPreferredHorizontalSize(); ++ else ++ return getPreferredVerticalSize(); ++ } ++ ++ /** ++ * This method returns the maximum size for this {@link JSlider} for this ++ * look and feel. If it returns null, then it is up to the Layout Manager ++ * to give the {@link JComponent} a size. ++ * ++ * @param c The {@link JComponent} to find a maximum size for. ++ * ++ * @return The dimensions of the maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ return getPreferredHorizontalSize(); ++ else ++ return getPreferredVerticalSize(); ++ } ++ ++ /** ++ * This method calculates all the sizes of the rectangles by delegating to ++ * the helper methods calculateXXXRect. ++ */ ++ protected void calculateGeometry() ++ { ++ calculateFocusRect(); ++ calculateContentRect(); ++ calculateThumbSize(); ++ calculateTrackBuffer(); ++ calculateTrackRect(); ++ calculateTickRect(); ++ calculateLabelRect(); ++ calculateThumbLocation(); ++ } ++ ++ /** ++ * This method calculates the size and position of the focusRect. This ++ * method does not need to be called if the orientation changes. ++ */ ++ protected void calculateFocusRect() ++ { ++ insetCache = slider.getInsets(); ++ focusRect = SwingUtilities.calculateInnerArea(slider, focusRect); ++ ++ if (focusRect.width < 0) ++ focusRect.width = 0; ++ if (focusRect.height < 0) ++ focusRect.height = 0; ++ } ++ ++ /** ++ * This method calculates the size but not the position of the thumbRect. It ++ * must take into account the orientation of the slider. ++ */ ++ protected void calculateThumbSize() ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ if (thumbWidth > contentRect.width) ++ thumbRect.width = contentRect.width / 4; ++ else ++ thumbRect.width = thumbWidth; ++ if (thumbHeight > contentRect.height) ++ thumbRect.height = contentRect.height; ++ else ++ thumbRect.height = thumbHeight; ++ } ++ else ++ { ++ // The thumb gets flipped when inverted, so thumbWidth ++ // actually is the height and vice versa. ++ if (thumbWidth > contentRect.height) ++ thumbRect.height = contentRect.height / 4; ++ else ++ thumbRect.height = thumbWidth; ++ if (thumbHeight > contentRect.width) ++ thumbRect.width = contentRect.width; ++ else ++ thumbRect.width = thumbHeight; ++ } ++ } ++ ++ /** ++ * This method calculates the size and position of the contentRect. This ++ * method does not need to be called if the orientation changes. ++ */ ++ protected void calculateContentRect() ++ { ++ contentRect.x = focusRect.x + focusInsets.left; ++ contentRect.y = focusRect.y + focusInsets.top; ++ contentRect.width = focusRect.width - focusInsets.left - focusInsets.right; ++ contentRect.height = focusRect.height - focusInsets.top ++ - focusInsets.bottom; ++ ++ if (contentRect.width < 0) ++ contentRect.width = 0; ++ if (contentRect.height < 0) ++ contentRect.height = 0; ++ } ++ ++ /** ++ * Calculates the position of the thumbRect based on the current value of ++ * the slider. It must take into account the orientation of the slider. ++ */ ++ protected void calculateThumbLocation() ++ { ++ int value = slider.getValue(); ++ ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ thumbRect.x = xPositionForValue(value) - thumbRect.width / 2; ++ thumbRect.y = contentRect.y; ++ } ++ else ++ { ++ thumbRect.x = contentRect.x; ++ thumbRect.y = yPositionForValue(value) - thumbRect.height / 2; ++ } ++ } ++ ++ /** ++ * Calculates the gap size between the left edge of the contentRect and the ++ * left edge of the trackRect. ++ */ ++ protected void calculateTrackBuffer() ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ trackBuffer = thumbRect.width; ++ else ++ trackBuffer = thumbRect.height; ++ } ++ ++ /** ++ * This method returns the size of the thumbRect. ++ * ++ * @return The dimensions of the thumb. ++ */ ++ protected Dimension getThumbSize() ++ { ++ // This is really just the bounds box for the thumb. ++ // The thumb will actually be pointed (like a rectangle + triangle at bottom) ++ return thumbRect.getSize(); ++ } ++ ++ /** ++ * Calculates the size and position of the trackRect. It must take into ++ * account the orientation of the slider. ++ */ ++ protected void calculateTrackRect() ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ trackRect.x = contentRect.x + trackBuffer; ++ trackRect.y = contentRect.y; ++ trackRect.width = contentRect.width - 2 * trackBuffer; ++ trackRect.height = thumbRect.height; ++ } ++ else ++ { ++ trackRect.x = contentRect.x; ++ trackRect.y = contentRect.y + trackBuffer; ++ trackRect.width = thumbRect.width; ++ trackRect.height = contentRect.height - 2 * trackBuffer; ++ } ++ } ++ ++ /** ++ * This method returns the height of the tick area box if the slider is ++ * horizontal and the width of the tick area box is the slider is vertical. ++ * It not necessarily how long the ticks will be. If a gap between the edge ++ * of tick box and the actual tick is desired, then that will need to be ++ * handled in the tick painting methods. ++ * ++ * @return The height (or width if the slider is vertical) of the tick ++ * rectangle. ++ */ ++ protected int getTickLength() ++ { ++ return tickHeight; ++ } ++ ++ /** ++ * This method calculates the size and position of the tickRect. It must ++ * take into account the orientation of the slider. ++ */ ++ protected void calculateTickRect() ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ tickRect.x = trackRect.x; ++ tickRect.y = trackRect.y + trackRect.height; ++ tickRect.width = trackRect.width; ++ tickRect.height = getTickLength(); ++ ++ if (tickRect.y + tickRect.height > contentRect.y + contentRect.height) ++ tickRect.height = contentRect.y + contentRect.height - tickRect.y; ++ } ++ else ++ { ++ tickRect.x = trackRect.x + trackRect.width; ++ tickRect.y = trackRect.y; ++ tickRect.width = getTickLength(); ++ tickRect.height = trackRect.height; ++ ++ if (tickRect.x + tickRect.width > contentRect.x + contentRect.width) ++ tickRect.width = contentRect.x + contentRect.width - tickRect.x; ++ } ++ } ++ ++ /** ++ * This method calculates the size and position of the labelRect. It must ++ * take into account the orientation of the slider. ++ */ ++ protected void calculateLabelRect() ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ labelRect.x = contentRect.x; ++ labelRect.y = tickRect.y + tickRect.height; ++ labelRect.width = contentRect.width; ++ labelRect.height = contentRect.height - labelRect.y; ++ } ++ else ++ { ++ labelRect.x = tickRect.x + tickRect.width; ++ labelRect.y = contentRect.y; ++ labelRect.width = contentRect.width - labelRect.x; ++ labelRect.height = contentRect.height; ++ } ++ } ++ ++ /** ++ * This method returns the width of the widest label in the slider's label ++ * table. ++ * ++ * @return The width of the widest label or 0 if no label table exists. ++ */ ++ protected int getWidthOfWidestLabel() ++ { ++ int widest = 0; ++ Component label; ++ ++ if (slider.getLabelTable() == null) ++ return 0; ++ ++ Dimension pref; ++ for (Enumeration list = slider.getLabelTable().elements(); ++ list.hasMoreElements();) ++ { ++ Object comp = list.nextElement(); ++ if (! (comp instanceof Component)) ++ continue; ++ label = (Component) comp; ++ pref = label.getPreferredSize(); ++ if (pref != null && pref.width > widest) ++ widest = pref.width; ++ } ++ return widest; ++ } ++ ++ /** ++ * This method returns the height of the tallest label in the slider's label ++ * table. ++ * ++ * @return The height of the tallest label or 0 if no label table exists. ++ */ ++ protected int getHeightOfTallestLabel() ++ { ++ int tallest = 0; ++ Component label; ++ ++ if (slider.getLabelTable() == null) ++ return 0; ++ Dimension pref; ++ for (Enumeration list = slider.getLabelTable().elements(); ++ list.hasMoreElements();) ++ { ++ Object comp = list.nextElement(); ++ if (! (comp instanceof Component)) ++ continue; ++ label = (Component) comp; ++ pref = label.getPreferredSize(); ++ if (pref != null && pref.height > tallest) ++ tallest = pref.height; ++ } ++ return tallest; ++ } ++ ++ /** ++ * This method returns the width of the label whose key has the highest ++ * value. ++ * ++ * @return The width of the high value label or 0 if no label table exists. ++ */ ++ protected int getWidthOfHighValueLabel() ++ { ++ Component highValueLabel = getHighestValueLabel(); ++ if (highValueLabel != null) ++ return highValueLabel.getWidth(); ++ else ++ return 0; ++ } ++ ++ /** ++ * This method returns the width of the label whose key has the lowest ++ * value. ++ * ++ * @return The width of the low value label or 0 if no label table exists. ++ */ ++ protected int getWidthOfLowValueLabel() ++ { ++ Component lowValueLabel = getLowestValueLabel(); ++ if (lowValueLabel != null) ++ return lowValueLabel.getWidth(); ++ else ++ return 0; ++ } ++ ++ /** ++ * This method returns the height of the label whose key has the highest ++ * value. ++ * ++ * @return The height of the high value label or 0 if no label table exists. ++ */ ++ protected int getHeightOfHighValueLabel() ++ { ++ Component highValueLabel = getHighestValueLabel(); ++ if (highValueLabel != null) ++ return highValueLabel.getHeight(); ++ else ++ return 0; ++ } ++ ++ /** ++ * This method returns the height of the label whose key has the lowest ++ * value. ++ * ++ * @return The height of the low value label or 0 if no label table exists. ++ */ ++ protected int getHeightOfLowValueLabel() ++ { ++ Component lowValueLabel = getLowestValueLabel(); ++ if (lowValueLabel != null) ++ return lowValueLabel.getHeight(); ++ else ++ return 0; ++ } ++ ++ /** ++ * This method returns whether the slider is to be drawn inverted. ++ * ++ * @return True is the slider is to be drawn inverted. ++ */ ++ protected boolean drawInverted() ++ { ++ return ! (slider.getInverted() ^ leftToRightCache); ++ } ++ ++ /** ++ * This method returns the label whose key has the lowest value. ++ * ++ * @return The low value label or null if no label table exists. ++ */ ++ protected Component getLowestValueLabel() ++ { ++ Integer key = new Integer(Integer.MAX_VALUE); ++ Integer tmpKey; ++ Dictionary labelTable = slider.getLabelTable(); ++ ++ if (labelTable == null) ++ return null; ++ ++ for (Enumeration list = labelTable.keys(); list.hasMoreElements();) ++ { ++ Object value = list.nextElement(); ++ if (! (value instanceof Integer)) ++ continue; ++ tmpKey = (Integer) value; ++ if (tmpKey.intValue() < key.intValue()) ++ key = tmpKey; ++ } ++ Object comp = labelTable.get(key); ++ if (! (comp instanceof Component)) ++ return null; ++ return (Component) comp; ++ } ++ ++ /** ++ * This method returns the label whose key has the highest value. ++ * ++ * @return The high value label or null if no label table exists. ++ */ ++ protected Component getHighestValueLabel() ++ { ++ Integer key = new Integer(Integer.MIN_VALUE); ++ Integer tmpKey; ++ Dictionary labelTable = slider.getLabelTable(); ++ ++ if (labelTable == null) ++ return null; ++ ++ for (Enumeration list = labelTable.keys(); list.hasMoreElements();) ++ { ++ Object value = list.nextElement(); ++ if (! (value instanceof Integer)) ++ continue; ++ tmpKey = (Integer) value; ++ if (tmpKey.intValue() > key.intValue()) ++ key = tmpKey; ++ } ++ Object comp = labelTable.get(key); ++ if (! (comp instanceof Component)) ++ return null; ++ return (Component) comp; ++ } ++ ++ /** ++ * This method is used to paint the {@link JSlider}. It delegates all its ++ * duties to the various paint methods like paintTicks(), paintTrack(), ++ * paintThumb(), etc. ++ * ++ * @param g The {@link Graphics} object to paint with. ++ * @param c The {@link JComponent} that is being painted. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ // FIXME: Move this to propertyChangeEvent handler, when we get those. ++ leftToRightCache = slider.getComponentOrientation() != ComponentOrientation.RIGHT_TO_LEFT; ++ // FIXME: This next line is only here because the above line is here. ++ calculateThumbLocation(); ++ ++ if (slider.getPaintTrack()) ++ paintTrack(g); ++ if (slider.getPaintTicks()) ++ paintTicks(g); ++ if (slider.getPaintLabels()) ++ paintLabels(g); ++ ++ //FIXME: Paint focus. ++ paintThumb(g); ++ } ++ ++ /** ++ * This method recalculates any rectangles that need to be recalculated ++ * after the insets of the component have changed. ++ */ ++ protected void recalculateIfInsetsChanged() ++ { ++ // Examining a test program shows that either Sun calls private ++ // methods that we don't know about, or these don't do anything. ++ calculateFocusRect(); ++ ++ calculateContentRect(); ++ calculateThumbSize(); ++ calculateTrackBuffer(); ++ calculateTrackRect(); ++ calculateThumbLocation(); ++ ++ calculateTickRect(); ++ calculateLabelRect(); ++ } ++ ++ /** ++ * This method recalculates any rectangles that need to be recalculated ++ * after the orientation of the slider changes. ++ */ ++ protected void recalculateIfOrientationChanged() ++ { ++ // Examining a test program shows that either Sun calls private ++ // methods that we don't know about, or these don't do anything. ++ calculateThumbSize(); ++ calculateTrackBuffer(); ++ calculateTrackRect(); ++ calculateThumbLocation(); ++ ++ calculateTickRect(); ++ calculateLabelRect(); ++ } ++ ++ /** ++ * This method is called during a repaint if the slider has focus. It draws ++ * an outline of the focusRect using the color returned by ++ * getFocusColor(). ++ * ++ * @param g The {@link Graphics} object to draw with. ++ */ ++ public void paintFocus(Graphics g) ++ { ++ Color saved_color = g.getColor(); ++ ++ g.setColor(getFocusColor()); ++ ++ g.drawRect(focusRect.x, focusRect.y, focusRect.width, focusRect.height); ++ ++ g.setColor(saved_color); ++ } ++ ++ /** ++ *

    ++ * This method is called during a repaint if the track is to be drawn. It ++ * draws a 3D rectangle to represent the track. The track is not the size ++ * of the trackRect. The top and left edges of the track should be outlined ++ * with the shadow color. The bottom and right edges should be outlined ++ * with the highlight color. ++ *

    ++ *
    ++   *    a---d   
    ++   *    |   |   
    ++   *    |   |   a------------------------d
    ++   *    |   |   |                        |
    ++   *    |   |   b------------------------c
    ++   *    |   |
    ++   *    |   |   
    ++   *    b---c
    ++   * 
    ++ * ++ *

    ++ * The b-a-d path needs to be drawn with the shadow color and the b-c-d path ++ * needs to be drawn with the highlight color. ++ *

    ++ * ++ * @param g The {@link Graphics} object to draw with. ++ */ ++ public void paintTrack(Graphics g) ++ { ++ Color saved_color = g.getColor(); ++ int width; ++ int height; ++ ++ Point a = new Point(trackRect.x, trackRect.y); ++ Point b = new Point(a); ++ Point c = new Point(a); ++ Point d = new Point(a); ++ ++ Polygon high; ++ Polygon shadow; ++ ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ width = trackRect.width; ++ height = (thumbRect.height / 4 == 0) ? 1 : thumbRect.height / 4; ++ ++ a.translate(0, (trackRect.height / 2) - (height / 2)); ++ b.translate(0, (trackRect.height / 2) + (height / 2)); ++ c.translate(trackRect.width, (trackRect.height / 2) + (height / 2)); ++ d.translate(trackRect.width, (trackRect.height / 2) - (height / 2)); ++ } ++ else ++ { ++ width = (thumbRect.width / 4 == 0) ? 1 : thumbRect.width / 4; ++ height = trackRect.height; ++ ++ a.translate((trackRect.width / 2) - (width / 2), 0); ++ b.translate((trackRect.width / 2) - (width / 2), trackRect.height); ++ c.translate((trackRect.width / 2) + (width / 2), trackRect.height); ++ d.translate((trackRect.width / 2) + (width / 2), 0); ++ } ++ g.setColor(Color.GRAY); ++ g.fillRect(a.x, a.y, width, height); ++ ++ g.setColor(getHighlightColor()); ++ g.drawLine(b.x, b.y, c.x, c.y); ++ g.drawLine(c.x, c.y, d.x, d.y); ++ ++ g.setColor(getShadowColor()); ++ g.drawLine(b.x, b.y, a.x, a.y); ++ g.drawLine(a.x, a.y, d.x, d.y); ++ ++ g.setColor(saved_color); ++ } ++ ++ /** ++ * This method is called during a repaint if the ticks are to be drawn. This ++ * method must still verify that the majorTickSpacing and minorTickSpacing ++ * are greater than zero before drawing the ticks. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ */ ++ public void paintTicks(Graphics g) ++ { ++ int max = slider.getMaximum(); ++ int min = slider.getMinimum(); ++ int majorSpace = slider.getMajorTickSpacing(); ++ int minorSpace = slider.getMinorTickSpacing(); ++ ++ if (majorSpace > 0) ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ double loc = tickRect.x; ++ double increment = (max == min) ? 0 ++ : majorSpace * (double) tickRect.width / (max ++ - min); ++ if (drawInverted()) ++ { ++ loc += tickRect.width; ++ increment *= -1; ++ } ++ for (int i = min; i <= max; i += majorSpace) ++ { ++ paintMajorTickForHorizSlider(g, tickRect, (int) loc); ++ loc += increment; ++ } ++ } ++ else ++ { ++ double loc = tickRect.height + tickRect.y; ++ double increment = (max == min) ? 0 ++ : -majorSpace * (double) tickRect.height / (max ++ - min); ++ if (drawInverted()) ++ { ++ loc = tickRect.y; ++ increment *= -1; ++ } ++ for (int i = min; i <= max; i += majorSpace) ++ { ++ paintMajorTickForVertSlider(g, tickRect, (int) loc); ++ loc += increment; ++ } ++ } ++ } ++ if (minorSpace > 0) ++ { ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ double loc = tickRect.x; ++ double increment = (max == min) ? 0 ++ : minorSpace * (double) tickRect.width / (max ++ - min); ++ if (drawInverted()) ++ { ++ loc += tickRect.width; ++ increment *= -1; ++ } ++ for (int i = min; i <= max; i += minorSpace) ++ { ++ paintMinorTickForHorizSlider(g, tickRect, (int) loc); ++ loc += increment; ++ } ++ } ++ else ++ { ++ double loc = tickRect.height + tickRect.y; ++ double increment = (max == min) ? 0 ++ : -minorSpace * (double) tickRect.height / (max ++ - min); ++ if (drawInverted()) ++ { ++ loc = tickRect.y; ++ increment *= -1; ++ } ++ for (int i = min; i <= max; i += minorSpace) ++ { ++ paintMinorTickForVertSlider(g, tickRect, (int) loc); ++ loc += increment; ++ } ++ } ++ } ++ } ++ ++ /* Minor ticks start at 1/4 of the height (or width) of the tickRect and extend ++ to 1/2 of the tickRect. ++ ++ Major ticks start at 1/4 of the height and extend to 3/4. ++ */ ++ ++ /** ++ * This method paints a minor tick for a horizontal slider at the given x ++ * value. x represents the x coordinate to paint at. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param tickBounds The tickRect rectangle. ++ * @param x The x coordinate to draw the tick at. ++ */ ++ protected void paintMinorTickForHorizSlider(Graphics g, ++ Rectangle tickBounds, int x) ++ { ++ int y = tickRect.y + tickRect.height / 4; ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawLine(x, y, x, y + tickRect.height / 4); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints a major tick for a horizontal slider at the given x ++ * value. x represents the x coordinate to paint at. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param tickBounds The tickRect rectangle. ++ * @param x The x coordinate to draw the tick at. ++ */ ++ protected void paintMajorTickForHorizSlider(Graphics g, ++ Rectangle tickBounds, int x) ++ { ++ int y = tickRect.y + tickRect.height / 4; ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawLine(x, y, x, y + tickRect.height / 2); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints a minor tick for a vertical slider at the given y ++ * value. y represents the y coordinate to paint at. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param tickBounds The tickRect rectangle. ++ * @param y The y coordinate to draw the tick at. ++ */ ++ protected void paintMinorTickForVertSlider(Graphics g, Rectangle tickBounds, ++ int y) ++ { ++ int x = tickRect.x + tickRect.width / 4; ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawLine(x, y, x + tickRect.width / 4, y); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints a major tick for a vertical slider at the given y ++ * value. y represents the y coordinate to paint at. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param tickBounds The tickRect rectangle. ++ * @param y The y coordinate to draw the tick at. ++ */ ++ protected void paintMajorTickForVertSlider(Graphics g, Rectangle tickBounds, ++ int y) ++ { ++ int x = tickRect.x + tickRect.width / 4; ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawLine(x, y, x + tickRect.width / 2, y); ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints all the labels from the slider's label table. This ++ * method must make sure that the label table is not null before painting ++ * the labels. Each entry in the label table is a (integer, component) ++ * pair. Every label is painted at the value of the integer. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ */ ++ public void paintLabels(Graphics g) ++ { ++ if (slider.getLabelTable() != null) ++ { ++ Dictionary table = slider.getLabelTable(); ++ Integer tmpKey; ++ Object key; ++ Object element; ++ Component label; ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ for (Enumeration list = table.keys(); list.hasMoreElements();) ++ { ++ key = list.nextElement(); ++ if (! (key instanceof Integer)) ++ continue; ++ tmpKey = (Integer) key; ++ element = table.get(tmpKey); ++ // We won't paint them if they're not ++ // JLabels so continue anyway ++ if (! (element instanceof JLabel)) ++ continue; ++ label = (Component) element; ++ paintHorizontalLabel(g, tmpKey.intValue(), label); ++ } ++ } ++ else ++ { ++ for (Enumeration list = table.keys(); list.hasMoreElements();) ++ { ++ key = list.nextElement(); ++ if (! (key instanceof Integer)) ++ continue; ++ tmpKey = (Integer) key; ++ element = table.get(tmpKey); ++ // We won't paint them if they're not ++ // JLabels so continue anyway ++ if (! (element instanceof JLabel)) ++ continue; ++ label = (Component) element; ++ paintVerticalLabel(g, tmpKey.intValue(), label); ++ } ++ } ++ } ++ } ++ ++ /** ++ * This method paints the label on the horizontal slider at the value ++ * specified. The value is not a coordinate. It is a value within the range ++ * of the slider. If the value is not within the range of the slider, this ++ * method will do nothing. This method should not paint outside the ++ * boundaries of the labelRect. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param value The value to paint at. ++ * @param label The label to paint. ++ */ ++ protected void paintHorizontalLabel(Graphics g, int value, Component label) ++ { ++ // This relies on clipping working properly or we'll end up ++ // painting all over the place. If our preferred size is ignored, then ++ // the labels may not fit inside the slider's bounds. Rather than mucking ++ // with font sizes and possible icon sizes, we'll set the bounds for ++ // the label and let it get clipped. ++ Dimension dim = label.getPreferredSize(); ++ int w = (int) dim.getWidth(); ++ int h = (int) dim.getHeight(); ++ ++ int max = slider.getMaximum(); ++ int min = slider.getMinimum(); ++ ++ if (value > max || value < min) ++ return; ++ ++ // value ++ // | ++ // ------------ ++ // | | ++ // | | ++ // | | ++ // The label must move w/2 to the right to fit directly under the value. ++ int xpos = xPositionForValue(value) - w / 2; ++ int ypos = labelRect.y; ++ ++ // We want to center the label around the xPositionForValue ++ // So we use xpos - w / 2. However, if value is min and the label ++ // is large, we run the risk of going out of bounds. So we bring it back ++ // to 0 if it becomes negative. ++ if (xpos < 0) ++ xpos = 0; ++ ++ // If the label + starting x position is greater than ++ // the x space in the label rectangle, we reset it to the largest ++ // amount possible in the rectangle. This means ugliness. ++ if (xpos + w > labelRect.x + labelRect.width) ++ w = labelRect.x + labelRect.width - xpos; ++ ++ // If the label is too tall. We reset it to the height of the label ++ // rectangle. ++ if (h > labelRect.height) ++ h = labelRect.height; ++ ++ label.setBounds(xpos, ypos, w, h); ++ javax.swing.SwingUtilities.paintComponent(g, label, null, label.getBounds()); ++ } ++ ++ /** ++ * This method paints the label on the vertical slider at the value ++ * specified. The value is not a coordinate. It is a value within the range ++ * of the slider. If the value is not within the range of the slider, this ++ * method will do nothing. This method should not paint outside the ++ * boundaries of the labelRect. ++ * ++ * @param g The {@link Graphics} object to draw with. ++ * @param value The value to paint at. ++ * @param label The label to paint. ++ */ ++ protected void paintVerticalLabel(Graphics g, int value, Component label) ++ { ++ Dimension dim = label.getPreferredSize(); ++ int w = (int) dim.getWidth(); ++ int h = (int) dim.getHeight(); ++ ++ int max = slider.getMaximum(); ++ int min = slider.getMinimum(); ++ ++ if (value > max || value < min) ++ return; ++ ++ int xpos = labelRect.x; ++ int ypos = yPositionForValue(value) - h / 2; ++ ++ if (ypos < 0) ++ ypos = 0; ++ ++ if (ypos + h > labelRect.y + labelRect.height) ++ h = labelRect.y + labelRect.height - ypos; ++ ++ if (w > labelRect.width) ++ w = labelRect.width; ++ ++ label.setBounds(xpos, ypos, w, h); ++ javax.swing.SwingUtilities.paintComponent(g, label, null, label.getBounds()); ++ } ++ ++ /** ++ *

    ++ * This method paints a thumb. There are two types of thumb: ++ *

    ++ *
    ++   *   Vertical         Horizontal
    ++   *    a---b            a-----b
    ++   *    |   |            |      \
    ++   *    e   c            |       c
    ++   *     \ /             |      /
    ++   *      d              e-----d
    ++   *  
    ++ * ++ *

    ++ * In the case of vertical thumbs, we highlight the path b-a-e-d and shadow ++ * the path b-c-d. In the case of horizontal thumbs, we highlight the path ++ * c-b-a-e and shadow the path c-d-e. In both cases we fill the path ++ * a-b-c-d-e before shadows and highlights are drawn. ++ *

    ++ * ++ * @param g The graphics object to paint with ++ */ ++ public void paintThumb(Graphics g) ++ { ++ Color saved_color = g.getColor(); ++ ++ Polygon thumb = new Polygon(); ++ ++ Point a = new Point(thumbRect.x, thumbRect.y); ++ Point b = new Point(a); ++ Point c = new Point(a); ++ Point d = new Point(a); ++ Point e = new Point(a); ++ ++ Polygon bright; ++ Polygon dark; ++ Polygon all; ++ ++ // This will be in X-dimension if the slider is inverted and y if it isn't. ++ int turnPoint; ++ ++ if (slider.getOrientation() == JSlider.HORIZONTAL) ++ { ++ turnPoint = thumbRect.height * 3 / 4; ++ ++ b.translate(thumbRect.width, 0); ++ c.translate(thumbRect.width, turnPoint); ++ d.translate(thumbRect.width / 2, thumbRect.height); ++ e.translate(0, turnPoint); ++ ++ bright = new Polygon(new int[] { b.x, a.x, e.x, d.x }, ++ new int[] { b.y, a.y, e.y, d.y }, 4); ++ ++ dark = new Polygon(new int[] { b.x, c.x, d.x }, ++ new int[] { b.y, c.y, d.y }, 3); ++ all = new Polygon(new int[] { a.x + 1, b.x, c.x, d.x, e.x + 1 }, ++ new int[] { a.y + 1, b.y + 1, c.y, d.y + 1, e.y }, 5); ++ } ++ else ++ { ++ turnPoint = thumbRect.width * 3 / 4; ++ ++ b.translate(turnPoint, 0); ++ c.translate(thumbRect.width, thumbRect.height / 2); ++ d.translate(turnPoint, thumbRect.height); ++ e.translate(0, thumbRect.height); ++ ++ bright = new Polygon(new int[] { c.x, b.x, a.x, e.x }, ++ new int[] { c.y, b.y, a.y, e.y }, 4); ++ ++ dark = new Polygon(new int[] { c.x, d.x, e.x + 1 }, ++ new int[] { c.y, d.y, e.y }, 3); ++ ++ all = new Polygon(new int[] { a.x + 1, b.x, c.x - 1, d.x, e.x + 1 }, ++ new int[] { a.y + 1, b.y + 1, c.y, d.y, e.y }, 5); ++ } ++ ++ g.setColor(Color.WHITE); ++ g.drawPolygon(bright); ++ ++ g.setColor(Color.BLACK); ++ g.drawPolygon(dark); ++ ++ g.setColor(Color.GRAY); ++ g.fillPolygon(all); ++ ++ g.setColor(saved_color); ++ } ++ ++ /** ++ * This method sets the position of the thumbRect. ++ * ++ * @param x The new x position. ++ * @param y The new y position. ++ */ ++ public void setThumbLocation(int x, int y) ++ { ++ thumbRect.x = x; ++ thumbRect.y = y; ++ } ++ ++ /** ++ * This method is used to move the thumb one block in the direction ++ * specified. If the slider snaps to ticks, this method is responsible for ++ * snapping it to a tick after the thumb has been moved. ++ * ++ * @param direction The direction to move in. ++ */ ++ public void scrollByBlock(int direction) ++ { ++ // The direction is -1 for backwards and 1 for forwards. ++ int unit = direction * (slider.getMaximum() - slider.getMinimum()) / 10; ++ ++ int moveTo = slider.getValue() + unit; ++ ++ if (slider.getSnapToTicks()) ++ moveTo = findClosestTick(moveTo); ++ ++ slider.setValue(moveTo); ++ } ++ ++ /** ++ * This method is used to move the thumb one unit in the direction ++ * specified. If the slider snaps to ticks, this method is responsible for ++ * snapping it to a tick after the thumb has been moved. ++ * ++ * @param direction The direction to move in. ++ */ ++ public void scrollByUnit(int direction) ++ { ++ // The direction is -1 for backwards and 1 for forwards. ++ int moveTo = slider.getValue() + direction; ++ ++ if (slider.getSnapToTicks()) ++ moveTo = findClosestTick(moveTo); ++ ++ slider.setValue(moveTo); ++ } ++ ++ /** ++ * This method is called when there has been a click in the track and the ++ * thumb needs to be scrolled on regular intervals. This method is only ++ * responsible for starting the timer and not for stopping it. ++ * ++ * @param dir The direction to move in. ++ */ ++ protected void scrollDueToClickInTrack(int dir) ++ { ++ scrollTimer.stop(); ++ ++ scrollListener.setDirection(dir); ++ scrollListener.setScrollByBlock(true); ++ ++ scrollTimer.start(); ++ } ++ ++ /** ++ * This method returns the X coordinate for the value passed in. ++ * ++ * @param value The value to calculate an x coordinate for. ++ * ++ * @return The x coordinate for the value. ++ */ ++ protected int xPositionForValue(int value) ++ { ++ int min = slider.getMinimum(); ++ int max = slider.getMaximum(); ++ int extent = slider.getExtent(); ++ int len = trackRect.width; ++ ++ int xPos = (max == min) ? 0 : (value - min) * len / (max - min); ++ ++ if (! drawInverted()) ++ xPos += trackRect.x; ++ else ++ { ++ xPos = trackRect.width - xPos; ++ xPos += trackRect.x; ++ } ++ return xPos; ++ } ++ ++ /** ++ * This method returns the y coordinate for the value passed in. ++ * ++ * @param value The value to calculate a y coordinate for. ++ * ++ * @return The y coordinate for the value. ++ */ ++ protected int yPositionForValue(int value) ++ { ++ int min = slider.getMinimum(); ++ int max = slider.getMaximum(); ++ int extent = slider.getExtent(); ++ int len = trackRect.height; ++ ++ int yPos = (max == min) ? 0 : (value - min) * len / (max - min); ++ ++ if (! drawInverted()) ++ { ++ yPos = trackRect.height - yPos; ++ yPos += trackRect.y; ++ } ++ else ++ yPos += trackRect.y; ++ return yPos; ++ } ++ ++ /** ++ * This method returns the value in the slider's range given the y ++ * coordinate. If the value is out of range, it will return the closest ++ * legal value. ++ * ++ * @param yPos The y coordinate to calculate a value for. ++ * ++ * @return The value for the y coordinate. ++ */ ++ public int valueForYPosition(int yPos) ++ { ++ int min = slider.getMinimum(); ++ int max = slider.getMaximum(); ++ int len = trackRect.height; ++ ++ int value; ++ ++ // If the length is 0, you shouldn't be able to even see where the slider is. ++ // This really shouldn't ever happen, but just in case, we'll return the middle. ++ if (len == 0) ++ return ((max - min) / 2); ++ ++ if (! drawInverted()) ++ value = ((len - (yPos - trackRect.y)) * (max - min) / len + min); ++ else ++ value = ((yPos - trackRect.y) * (max - min) / len + min); ++ ++ // If this isn't a legal value, then we'll have to move to one now. ++ if (value > max) ++ value = max; ++ else if (value < min) ++ value = min; ++ return value; ++ } ++ ++ /** ++ * This method returns the value in the slider's range given the x ++ * coordinate. If the value is out of range, it will return the closest ++ * legal value. ++ * ++ * @param xPos The x coordinate to calculate a value for. ++ * ++ * @return The value for the x coordinate. ++ */ ++ public int valueForXPosition(int xPos) ++ { ++ int min = slider.getMinimum(); ++ int max = slider.getMaximum(); ++ int len = trackRect.width; ++ ++ int value; ++ ++ // If the length is 0, you shouldn't be able to even see where the slider is. ++ // This really shouldn't ever happen, but just in case, we'll return the middle. ++ if (len == 0) ++ return ((max - min) / 2); ++ ++ if (! drawInverted()) ++ value = ((xPos - trackRect.x) * (max - min) / len + min); ++ else ++ value = ((len - (xPos - trackRect.x)) * (max - min) / len + min); ++ ++ // If this isn't a legal value, then we'll have to move to one now. ++ if (value > max) ++ value = max; ++ else if (value < min) ++ value = min; ++ return value; ++ } ++ ++ /** ++ * This method finds the closest value that has a tick associated with it. ++ * ++ * @param value The value to search from. ++ * ++ * @return The closest value that has a tick associated with it. ++ */ ++ private int findClosestTick(int value) ++ { ++ int min = slider.getMinimum(); ++ int max = slider.getMaximum(); ++ int majorSpace = slider.getMajorTickSpacing(); ++ int minorSpace = slider.getMinorTickSpacing(); ++ ++ // The default value to return is value + minor or ++ // value + major. ++ // Initializing at min - value leaves us with a default ++ // return value of min, which always has tick marks ++ // (if ticks are painted). ++ int minor = min - value; ++ int major = min - value; ++ ++ // If there are no major tick marks or minor tick marks ++ // e.g. snap is set to true but no ticks are set, then ++ // we can just return the value. ++ if (majorSpace <= 0 && minorSpace <= 0) ++ return value; ++ ++ // First check the major ticks. ++ if (majorSpace > 0) ++ { ++ int lowerBound = (value - min) / majorSpace; ++ int majLower = majorSpace * lowerBound + min; ++ int majHigher = majorSpace * (lowerBound + 1) + min; ++ ++ if (majHigher <= max && majHigher - value <= value - majLower) ++ major = majHigher - value; ++ else ++ major = majLower - value; ++ } ++ ++ if (minorSpace > 0) ++ { ++ int lowerBound = value / minorSpace; ++ int minLower = minorSpace * lowerBound; ++ int minHigher = minorSpace * (lowerBound + 1); ++ ++ if (minHigher <= max && minHigher - value <= value - minLower) ++ minor = minHigher - value; ++ else ++ minor = minLower - value; ++ } ++ ++ // Give preference to minor ticks ++ if (Math.abs(minor) > Math.abs(major)) ++ return value + major; ++ else ++ return value + minor; ++ } ++} +Index: javax/swing/plaf/basic/BasicSpinnerUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicSpinnerUI.java +diff -N javax/swing/plaf/basic/BasicSpinnerUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicSpinnerUI.java 6 Sep 2004 16:36:07 -0000 +@@ -0,0 +1,572 @@ ++/* SpinnerUI.java -- ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Component; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JSpinner; ++import javax.swing.Timer; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.SpinnerUI; ++ ++ ++/** ++ * DOCUMENT ME! ++ * ++ * @author Ka-Hing Cheung ++ * ++ * @see javax.swing.JSpinner ++ * @since 1.4 ++ */ ++public class BasicSpinnerUI extends SpinnerUI ++{ ++ /** ++ * Creates a new ComponentUI for the specified ++ * JComponent ++ * ++ * @param c DOCUMENT ME! ++ * ++ * @return a ComponentUI ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicSpinnerUI(); ++ } ++ ++ /** ++ * Creates an editor component. Really, it just returns ++ * JSpinner.getEditor() ++ * ++ * @return a JComponent as an editor ++ * ++ * @see javax.swing.JSpinner#getEditor ++ */ ++ protected JComponent createEditor() ++ { ++ return spinner.getEditor(); ++ } ++ ++ /** ++ * Creates a LayoutManager that layouts the sub components. The ++ * subcomponents are identifies by the constraint "Next", "Previous" and ++ * "Editor" ++ * ++ * @return a LayoutManager ++ * ++ * @see java.awt.LayoutManager ++ */ ++ protected LayoutManager createLayout() ++ { ++ return new DefaultLayoutManager(); ++ } ++ ++ /** ++ * Creates the "Next" button ++ * ++ * @return the next button component ++ */ ++ protected Component createNextButton() ++ { ++ JButton button = new BasicArrowButton(BasicArrowButton.NORTH); ++ return button; ++ } ++ ++ /** ++ * Creates the "Previous" button ++ * ++ * @return the previous button component ++ */ ++ protected Component createPreviousButton() ++ { ++ JButton button = new BasicArrowButton(BasicArrowButton.SOUTH); ++ return button; ++ } ++ ++ /** ++ * Creates the PropertyChangeListener that will be attached by ++ * installListeners. It should watch for the "editor" ++ * property, when it's changed, replace the old editor with the new one, ++ * probably by calling replaceEditor ++ * ++ * @return a PropertyChangeListener ++ * ++ * @see #replaceEditor ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeListener() ++ { ++ public void propertyChange(PropertyChangeEvent evt) ++ { ++ // FIXME: Add check for enabled property change. Need to ++ // disable the buttons. ++ if ("editor".equals(evt.getPropertyName())) ++ BasicSpinnerUI.this.replaceEditor((JComponent) evt.getOldValue(), ++ (JComponent) evt.getNewValue()); ++ } ++ }; ++ } ++ ++ /** ++ * Called by installUI. This should set various defaults ++ * obtained from UIManager.getLookAndFeelDefaults, as well as ++ * set the layout obtained from createLayout ++ * ++ * @see #javax.swing.UIManager#getLookAndFeelDefaults ++ * @see #createLayout ++ * @see #installUI ++ */ ++ protected void installDefaults() ++ { ++ /* most of it copied from BasicLabelUI, I don't know what keys are ++ available, so someone may want to update this. Hence: TODO ++ */ ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ /* ++ spinner.setForeground(defaults.getColor("Spinner.foreground")); ++ spinner.setBackground(defaults.getColor("Spinner.background")); ++ spinner.setFont(defaults.getFont("Spinner.font")); ++ spinner.setBorder(defaults.getBorder("Spinner.border")); ++ */ ++ spinner.setLayout(createLayout()); ++ } ++ ++ /* ++ * Called by installUI, which basically adds the ++ * PropertyChangeListener created by ++ * createPropertyChangeListener ++ * ++ * @see #createPropertyChangeListener ++ * @see #installUI ++ */ ++ protected void installListeners() ++ { ++ spinner.addPropertyChangeListener(listener); ++ } ++ ++ /* ++ * Install listeners to the next button so that it increments the model ++ */ ++ protected void installNextButtonListeners(Component c) ++ { ++ c.addMouseListener(new MouseAdapter() ++ { ++ public void mousePressed(MouseEvent evt) ++ { ++ if (! spinner.isEnabled()) ++ return; ++ increment(); ++ timer.setInitialDelay(500); ++ timer.start(); ++ } ++ ++ public void mouseReleased(MouseEvent evt) ++ { ++ timer.stop(); ++ } ++ ++ void increment() ++ { ++ Object next = BasicSpinnerUI.this.spinner.getNextValue(); ++ if (next != null) ++ BasicSpinnerUI.this.spinner.getModel().setValue(next); ++ } ++ ++ volatile boolean mouseDown = false; ++ Timer timer = new Timer(50, ++ new ActionListener() ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ increment(); ++ } ++ }); ++ }); ++ } ++ ++ /* ++ * Install listeners to the previous button so that it decrements the model ++ */ ++ protected void installPreviousButtonListeners(Component c) ++ { ++ c.addMouseListener(new MouseAdapter() ++ { ++ public void mousePressed(MouseEvent evt) ++ { ++ if (! spinner.isEnabled()) ++ return; ++ decrement(); ++ timer.setInitialDelay(500); ++ timer.start(); ++ } ++ ++ public void mouseReleased(MouseEvent evt) ++ { ++ timer.stop(); ++ } ++ ++ void decrement() ++ { ++ Object prev = BasicSpinnerUI.this.spinner.getPreviousValue(); ++ if (prev != null) ++ BasicSpinnerUI.this.spinner.getModel().setValue(prev); ++ } ++ ++ volatile boolean mouseDown = false; ++ Timer timer = new Timer(50, ++ new ActionListener() ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ decrement(); ++ } ++ }); ++ }); ++ } ++ ++ /** ++ * Install this UI to the JComponent, which in reality, is a ++ * JSpinner. Calls installDefaults, ++ * installListeners, and also adds the buttons and editor. ++ * ++ * @param c DOCUMENT ME! ++ * ++ * @see #installDefaults ++ * @see #installListeners ++ * @see #createNextButton ++ * @see #createPreviousButton ++ * @see #createEditor ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ ++ spinner = (JSpinner) c; ++ ++ installDefaults(); ++ installListeners(); ++ ++ Component next = createNextButton(); ++ Component previous = createPreviousButton(); ++ ++ installNextButtonListeners(next); ++ installPreviousButtonListeners(previous); ++ ++ c.add(createEditor(), "Editor"); ++ c.add(next, "Next"); ++ c.add(previous, "Previous"); ++ } ++ ++ /** ++ * Replace the old editor with the new one ++ * ++ * @param oldEditor the old editor ++ * @param newEditor the new one to replace with ++ */ ++ protected void replaceEditor(JComponent oldEditor, JComponent newEditor) ++ { ++ spinner.remove(oldEditor); ++ spinner.add(newEditor); ++ } ++ ++ /** ++ * The reverse of installDefaults. Called by ++ * uninstallUI ++ */ ++ protected void uninstallDefaults() ++ { ++ spinner.setLayout(null); ++ } ++ ++ /** ++ * The reverse of installListeners, called by ++ * uninstallUI ++ */ ++ protected void uninstallListeners() ++ { ++ spinner.removePropertyChangeListener(listener); ++ } ++ ++ /** ++ * Called when the current L&F is replaced with another one, should call ++ * uninstallDefaults and uninstallListeners as ++ * well as remove the next/previous buttons and the editor ++ * ++ * @param c DOCUMENT ME! ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ super.uninstallUI(c); ++ ++ uninstallDefaults(); ++ uninstallListeners(); ++ c.removeAll(); ++ } ++ ++ /** The spinner for this UI */ ++ protected JSpinner spinner; ++ ++ /** DOCUMENT ME! */ ++ private PropertyChangeListener listener = createPropertyChangeListener(); ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ private class DefaultLayoutManager implements LayoutManager ++ { ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ */ ++ public void layoutContainer(Container parent) ++ { ++ synchronized (parent.getTreeLock()) ++ { ++ Insets i = parent.getInsets(); ++ boolean l2r = parent.getComponentOrientation().isLeftToRight(); ++ /* ++ -------------- -------------- ++ | | n | | n | | ++ | e | - | or | - | e | ++ | | p | | p | | ++ -------------- -------------- ++ */ ++ Dimension e = minSize(editor); ++ Dimension n = minSize(next); ++ Dimension p = minSize(previous); ++ Dimension s = spinner.getPreferredSize(); ++ ++ int x = l2r ? i.left : i.right; ++ int y = i.top; ++ int w = Math.max(p.width, n.width); ++ int h = Math.max(p.height, n.height); ++ h = Math.max(h, e.height / 2); ++ int e_width = s.width - w; ++ ++ if (l2r) ++ { ++ setBounds(editor, x, y + (s.height - e.height) / 2, e_width, ++ e.height); ++ x += e_width; ++ ++ setBounds(next, x, y, w, h); ++ y += h; ++ ++ setBounds(previous, x, y, w, h); ++ } ++ else ++ { ++ setBounds(next, x, y + (s.height - e.height) / 2, w, h); ++ y += h; ++ ++ setBounds(previous, x, y, w, h); ++ x += w; ++ y -= h; ++ ++ setBounds(editor, x, y, e_width, e.height); ++ } ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ Dimension d = new Dimension(); ++ ++ if (editor != null) ++ { ++ Dimension tmp = editor.getMinimumSize(); ++ d.width += tmp.width; ++ d.height = tmp.height; ++ } ++ ++ int nextWidth = 0; ++ int previousWidth = 0; ++ int otherHeight = 0; ++ ++ if (next != null) ++ { ++ Dimension tmp = next.getMinimumSize(); ++ nextWidth = tmp.width; ++ otherHeight += tmp.height; ++ } ++ if (previous != null) ++ { ++ Dimension tmp = previous.getMinimumSize(); ++ previousWidth = tmp.width; ++ otherHeight += tmp.height; ++ } ++ ++ d.height = Math.max(d.height, otherHeight); ++ d.width += Math.max(nextWidth, previousWidth); ++ ++ return d; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param parent DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ Dimension d = new Dimension(); ++ ++ if (editor != null) ++ { ++ Dimension tmp = editor.getPreferredSize(); ++ d.width += Math.max(tmp.width, 40); ++ d.height = tmp.height; ++ } ++ ++ int nextWidth = 0; ++ int previousWidth = 0; ++ int otherHeight = 0; ++ ++ if (next != null) ++ { ++ Dimension tmp = next.getPreferredSize(); ++ nextWidth = tmp.width; ++ otherHeight += tmp.height; ++ } ++ if (previous != null) ++ { ++ Dimension tmp = previous.getPreferredSize(); ++ previousWidth = tmp.width; ++ otherHeight += tmp.height; ++ } ++ ++ d.height = Math.max(d.height, otherHeight); ++ d.width += Math.max(nextWidth, previousWidth); ++ ++ return d; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param child DOCUMENT ME! ++ */ ++ public void removeLayoutComponent(Component child) ++ { ++ if (child == editor) ++ editor = null; ++ else if (child == next) ++ next = null; ++ else if (previous == child) ++ previous = null; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param name DOCUMENT ME! ++ * @param child DOCUMENT ME! ++ */ ++ public void addLayoutComponent(String name, Component child) ++ { ++ if ("Editor".equals(name)) ++ editor = child; ++ else if ("Next".equals(name)) ++ next = child; ++ else if ("Previous".equals(name)) ++ previous = child; ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ * ++ * @return DOCUMENT ME! ++ */ ++ private Dimension minSize(Component c) ++ { ++ if (c == null) ++ return new Dimension(); ++ else ++ return c.getMinimumSize(); ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param c DOCUMENT ME! ++ * @param x DOCUMENT ME! ++ * @param y DOCUMENT ME! ++ * @param w DOCUMENT ME! ++ * @param h DOCUMENT ME! ++ */ ++ private void setBounds(Component c, int x, int y, int w, int h) ++ { ++ if (c != null) ++ c.setBounds(x, y, w, h); ++ } ++ ++ /** DOCUMENT ME! */ ++ private Component editor; ++ ++ /** DOCUMENT ME! */ ++ private Component next; ++ ++ /** DOCUMENT ME! */ ++ private Component previous; ++ } ++} +Index: javax/swing/plaf/basic/BasicSplitPaneDivider.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java,v +retrieving revision 1.1 +diff -u -r1.1 BasicSplitPaneDivider.java +--- javax/swing/plaf/basic/BasicSplitPaneDivider.java 24 Jun 2003 09:48:42 -0000 1.1 ++++ javax/swing/plaf/basic/BasicSplitPaneDivider.java 6 Sep 2004 16:36:07 -0000 +@@ -1,5 +1,5 @@ + /* BasicSplitPaneDivider.java +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,14 +35,15 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + ++import java.awt.Color; + import java.awt.Component; + import java.awt.Container; + import java.awt.Dimension; + import java.awt.Graphics; + import java.awt.Insets; ++import java.awt.LayoutManager; + import java.awt.event.MouseAdapter; + import java.awt.event.MouseEvent; + import java.awt.event.MouseMotionListener; +@@ -50,173 +51,197 @@ + import java.beans.PropertyChangeListener; + import javax.swing.JButton; + import javax.swing.JSplitPane; ++import javax.swing.SwingConstants; + import javax.swing.border.Border; + + + /** +- * The divider that separates the two parts of a JSplitPane in the +- * Basic look and feel. +- * +- *

    Implementation status: We do not have a real implementation yet. +- * Currently, it is mostly a stub to allow compiling other parts of +- * the javax.swing.plaf.basic package, although some parts are already ++ * The divider that separates the two parts of a JSplitPane in the Basic look ++ * and feel. ++ * ++ *

    ++ * Implementation status: We do not have a real implementation yet. Currently, ++ * it is mostly a stub to allow compiling other parts of the ++ * javax.swing.plaf.basic package, although some parts are already + * functional. ++ *

    + * +- * @author Sascha Brawer (brawer@dandelis.ch) ++ * @author Sascha Brawer (brawer_AT_dandelis.ch) + */ +-public class BasicSplitPaneDivider +- extends Container ++public class BasicSplitPaneDivider extends Container + implements PropertyChangeListener + { + /** +- * Determined using the serialver tool +- * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5. ++ * Determined using the serialver tool of Apple/Sun JDK 1.3.1 ++ * on MacOS X 10.1.5. + */ + static final long serialVersionUID = 1463404307042803342L; + +- + /** +- * The width and height of the little buttons for showing and +- * hiding parts of a JSplitPane in a single mouse click. ++ * The width and height of the little buttons for showing and hiding parts ++ * of a JSplitPane in a single mouse click. + */ + protected static final int ONE_TOUCH_SIZE = 6; + +- +- // FIXME: Javadoc. ++ /** The distance the one touch buttons will sit from the divider's edges. */ + protected static final int ONE_TOUCH_OFFSET = 2; + +- + /** + * An object that performs the tasks associated with an ongoing drag +- * operation, or null if the user is currently not +- * dragging the divider. ++ * operation, or null if the user is currently not dragging ++ * the divider. + */ + protected DragController dragger; + +- + /** + * The delegate object that is responsible for the UI of the + * JSplitPane that contains this divider. + */ + protected BasicSplitPaneUI splitPaneUI; + +- +- /** +- * The thickness of the divider in pixels. +- */ ++ /** The thickness of the divider in pixels. */ + protected int dividerSize; +- + +- /** +- * A divider that is used for layout purposes. +- */ ++ /** A divider that is used for layout purposes. */ + protected Component hiddenDivider; + +- +- /** +- * The JSplitPane containing this divider. +- */ ++ /** The JSplitPane containing this divider. */ + protected JSplitPane splitPane; + +- + /** +- * The listener for handling mouse events from both the divider +- * and the containing JSplitPane. +- * +- *

    The reason for also handling MouseEvents from the containing +- * JSplitPane is that users should be able to start +- * a drag gesture from inside the JSplitPane, but slightly outisde +- * the divider. ++ * The listener for handling mouse events from both the divider and the ++ * containing JSplitPane. ++ * ++ *

    ++ * The reason for also handling MouseEvents from the containing ++ * JSplitPane is that users should be able to start a drag ++ * gesture from inside the JSplitPane, but slightly outisde the divider. ++ *

    + */ + protected MouseHandler mouseHandler = new MouseHandler(); + +- + /** +- * The current orientation of the containing JSplitPane, +- * which is either {@link javax.swing.JSplitPane#HORIZONTAL_SPLIT} +- * or {@link javax.swing.JSplitPane#VERTICAL_SPLIT}. ++ * The current orientation of the containing JSplitPane, which ++ * is either {@link javax.swing.JSplitPane#HORIZONTAL_SPLIT} or {@link ++ * javax.swing.JSplitPane#VERTICAL_SPLIT}. + */ + protected int orientation; + +- + /** +- * The button for showing and hiding the left (or top) component +- * of the JSplitPane. ++ * The button for showing and hiding the left (or top) component of the ++ * JSplitPane. + */ + protected JButton leftButton; + +- + /** +- * The button for showing and hiding the right (or bottom) component +- * of the JSplitPane. ++ * The button for showing and hiding the right (or bottom) component of the ++ * JSplitPane. + */ + protected JButton rightButton; + +- + /** +- * The border of this divider. Typically, this will be an instance of +- * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. ++ * The border of this divider. Typically, this will be an instance of {@link ++ * javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. + * + * @see #getBorder() + * @see #setBorder(javax.swing.border.Border) + */ + private Border border; + ++ // This is not a pixel count. ++ // This int should be able to take 3 values. ++ // left (top), middle, right(bottom) ++ // 0 1 2 ++ ++ /** Keeps track of where the divider should be placed when using one touch expand ++ * buttons. */ ++ private transient int currentDividerLocation = 1; ++ ++ private transient Border tmpBorder = new Border() ++ { ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(2, 2, 2, 2); ++ } ++ ++ public boolean isBorderOpaque() ++ { ++ return false; ++ } ++ ++ public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) ++ { ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawRect(x + 2, y + 2, width - 4, height - 4); ++ ++ g.setColor(saved); ++ } ++ }; + + /** + * Constructs a new divider. + * +- * @param ui the UI delegate of the enclosing +- * JSplitPane. ++ * @param ui the UI delegate of the enclosing JSplitPane. + */ + public BasicSplitPaneDivider(BasicSplitPaneUI ui) + { ++ setLayout(new DividerLayout()); + setBasicSplitPaneUI(ui); ++ setDividerSize(splitPane.getDividerSize()); ++ setBorder(tmpBorder); + } + +- + /** +- * Sets the delegate object that is responsible for the UI of the +- * {@link javax.swing.JSplitPane} containing this divider. ++ * Sets the delegate object that is responsible for the UI of the {@link ++ * javax.swing.JSplitPane} containing this divider. + * +- * @param newUI the UI delegate, or null to release +- * the connection to the current delegate. ++ * @param newUI the UI delegate, or null to release the ++ * connection to the current delegate. + */ + public void setBasicSplitPaneUI(BasicSplitPaneUI newUI) + { + /* Remove the connection to the existing JSplitPane. */ + if (splitPane != null) +- { +- splitPane.removePropertyChangeListener(this); +- splitPane.removeMouseListener(mouseHandler); +- splitPane.removeMouseMotionListener(mouseHandler); +- splitPane = null; +- } +- ++ { ++ splitPane.removePropertyChangeListener(this); ++ splitPane.removeMouseListener(mouseHandler); ++ splitPane.removeMouseMotionListener(mouseHandler); ++ removeMouseListener(mouseHandler); ++ removeMouseMotionListener(mouseHandler); ++ splitPane = null; ++ hiddenDivider = null; ++ } ++ + /* Establish the connection to the new JSplitPane. */ + splitPaneUI = newUI; + if (splitPaneUI != null) + splitPane = newUI.getSplitPane(); + if (splitPane != null) +- { +- splitPane.addPropertyChangeListener(this); +- splitPane.addMouseListener(mouseHandler); +- splitPane.addMouseMotionListener(mouseHandler); +- orientation = splitPane.getOrientation(); +- } ++ { ++ splitPane.addPropertyChangeListener(this); ++ splitPane.addMouseListener(mouseHandler); ++ splitPane.addMouseMotionListener(mouseHandler); ++ addMouseListener(mouseHandler); ++ addMouseMotionListener(mouseHandler); ++ hiddenDivider = splitPaneUI.getNonContinuousLayoutDivider(); ++ orientation = splitPane.getOrientation(); ++ oneTouchExpandableChanged(); ++ } + } +- + + /** +- * Returns the delegate object that is responsible for the UI of the +- * {@link javax.swing.JSplitPane} containing this divider. ++ * Returns the delegate object that is responsible for the UI of the {@link ++ * javax.swing.JSplitPane} containing this divider. ++ * ++ * @return The UI for the JSplitPane. + */ + public BasicSplitPaneUI getBasicSplitPaneUI() + { + return splitPaneUI; + } + +- + /** + * Sets the thickness of the divider. + * +@@ -227,37 +252,40 @@ + this.dividerSize = newSize; + } + +- + /** + * Retrieves the thickness of the divider. ++ * ++ * @return The thickness of the divider. + */ + public int getDividerSize() + { + return dividerSize; + } +- +- ++ + /** + * Sets the border of this divider. + * + * @param border the new border. Typically, this will be an instance of +- * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. ++ * {@link ++ * javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. + * + * @since 1.3 + */ + public void setBorder(Border border) + { +- Border oldValue = this.border; +- this.border = border; +- firePropertyChange("border", oldValue, border); ++ if (border != this.border) ++ { ++ Border oldValue = this.border; ++ this.border = border; ++ firePropertyChange("border", oldValue, border); ++ } + } + +- + /** + * Retrieves the border of this divider. + * +- * @return the current border, or null if no border +- * has been set. ++ * @return the current border, or null if no border has been ++ * set. + * + * @since 1.3 + */ +@@ -265,13 +293,12 @@ + { + return border; + } +- + + /** +- * Retrieves the insets of the divider. If a border has been +- * installed on the divider, the result of calling its +- * getBorderInsets method is returned. Otherwise, +- * the inherited implementation will be invoked. ++ * Retrieves the insets of the divider. If a border has been installed on ++ * the divider, the result of calling its getBorderInsets ++ * method is returned. Otherwise, the inherited implementation will be ++ * invoked. + * + * @see javax.swing.border.Border#getBorderInsets(java.awt.Component) + */ +@@ -282,42 +309,56 @@ + else + return super.getInsets(); + } +- +- ++ + /** + * Returns the preferred size of this divider, which is +- * dividerSize by dividerSize +- * pixels. ++ * dividerSize by dividerSize pixels. ++ * ++ * @return The preferred size of the divider. + */ + public Dimension getPreferredSize() + { +- return new Dimension(dividerSize, dividerSize); ++ return getLayout().preferredLayoutSize(this); + } + +- + /** + * Returns the minimal size of this divider, which is +- * dividerSize by dividerSize +- * pixels. ++ * dividerSize by dividerSize pixels. ++ * ++ * @return The minimal size of the divider. + */ + public Dimension getMinimumSize() + { + return getPreferredSize(); + } +- +- ++ + /** +- * Processes events from the JSplitPane that contains +- * this divider. ++ * Processes events from the JSplitPane that contains this ++ * divider. ++ * ++ * @param e The PropertyChangeEvent. + */ + public void propertyChange(PropertyChangeEvent e) + { +- // FIXME: Not yet implemented. ++ if (e.getPropertyName().equals(JSplitPane.ONE_TOUCH_EXPANDABLE_PROPERTY)) ++ oneTouchExpandableChanged(); ++ else if (e.getPropertyName().equals(JSplitPane.ORIENTATION_PROPERTY)) ++ { ++ orientation = splitPane.getOrientation(); ++ if (splitPane.isOneTouchExpandable()) ++ { ++ layout(); ++ repaint(); ++ } ++ } ++ else if (e.getPropertyName().equals(JSplitPane.DIVIDER_SIZE_PROPERTY)) ++ dividerSize = splitPane.getDividerSize(); + } + +- + /** + * Paints the divider by painting its border. ++ * ++ * @param g The Graphics Object to paint with. + */ + public void paint(Graphics g) + { +@@ -325,50 +366,85 @@ + + super.paint(g); + if (border != null) +- { +- dividerSize = getSize(); +- border.paintBorder(this, g, 0, 0, dividerSize.width, dividerSize.height); +- //System.out.println(dividerSize); +- //g.setColor(java.awt.Color.white); +- //g.drawRect(0, 0, 5, 5); +- } ++ { ++ dividerSize = getSize(); ++ border.paintBorder(this, g, 0, 0, dividerSize.width, dividerSize.height); ++ } + } + +- + /** +- * Reacts to changes of the oneToughExpandable +- * property of the containing JSplitPane. ++ * Reacts to changes of the oneToughExpandable property of the ++ * containing JSplitPane. + */ + protected void oneTouchExpandableChanged() + { +- // FIXME: Not yet implemented. ++ if (splitPane.isOneTouchExpandable()) ++ { ++ leftButton = createLeftOneTouchButton(); ++ rightButton = createRightOneTouchButton(); ++ add(leftButton); ++ add(rightButton); ++ ++ leftButton.addMouseListener(mouseHandler); ++ rightButton.addMouseListener(mouseHandler); ++ ++ // Set it to 1. ++ currentDividerLocation = 1; ++ } ++ else ++ { ++ if (leftButton != null && rightButton != null) ++ { ++ leftButton.removeMouseListener(mouseHandler); ++ rightButton.removeMouseListener(mouseHandler); ++ ++ remove(leftButton); ++ remove(rightButton); ++ leftButton = null; ++ rightButton = null; ++ } ++ } ++ layout(); ++ repaint(); + } + +- + /** +- * Creates a button for showing and hiding the left (or top) +- * part of a JSplitPane. ++ * Creates a button for showing and hiding the left (or top) part of a ++ * JSplitPane. ++ * ++ * @return The left one touch button. + */ + protected JButton createLeftOneTouchButton() + { +- return new OneTouchButton(/* left */ true); +- } ++ int dir = SwingConstants.WEST; ++ if (orientation == JSplitPane.VERTICAL_SPLIT) ++ dir = SwingConstants.NORTH; ++ JButton button = new BasicArrowButton(dir); ++ button.setBorderPainted(false); + ++ return button; ++ } + + /** +- * Creates a button for showing and hiding the right (or bottom) +- * part of a JSplitPane. ++ * Creates a button for showing and hiding the right (or bottom) part of a ++ * JSplitPane. ++ * ++ * @return The right one touch button. + */ + protected JButton createRightOneTouchButton() + { +- return new OneTouchButton(/* left */ false); ++ int dir = SwingConstants.EAST; ++ if (orientation == JSplitPane.VERTICAL_SPLIT) ++ dir = SwingConstants.SOUTH; ++ JButton button = new BasicArrowButton(dir); ++ button.setBorderPainted(false); ++ return button; + } +- + + /** + * Prepares the divider for dragging by calling the +- * startDragging method of the UI delegate of the +- * enclosing JSplitPane. ++ * startDragging method of the UI delegate of the enclosing ++ * JSplitPane. + * + * @see BasicSplitPaneUI#startDragging() + */ +@@ -378,15 +454,14 @@ + splitPaneUI.startDragging(); + } + +- + /** + * Drags the divider to a given location by calling the +- * dragDividerTo method of the UI delegate of the +- * enclosing JSplitPane. ++ * dragDividerTo method of the UI delegate of the enclosing ++ * JSplitPane. + * + * @param location the new location of the divider. + * +- * @see BasicSplitPaneUI#dragDividerTo(int location) ++ * @see BasicSplitPaneUI#dragDividerTo(int location) + */ + protected void dragDividerTo(int location) + { +@@ -394,11 +469,9 @@ + splitPaneUI.dragDividerTo(location); + } + +- + /** +- * Finishes a dragging gesture by calling the +- * finishDraggingTo method of the UI delegate of the +- * enclosing JSplitPane. ++ * Finishes a dragging gesture by calling the finishDraggingTo ++ * method of the UI delegate of the enclosing JSplitPane. + * + * @param location the new, final location of the divider. + * +@@ -410,125 +483,424 @@ + splitPaneUI.finishDraggingTo(location); + } + ++ /** ++ * This helper method moves the divider to one of the ++ * three locations when using one touch expand buttons. ++ * Location 0 is the left (or top) most location. ++ * Location 1 is the middle. ++ * Location 2 is the right (or bottom) most location. ++ * ++ * @param locationIndex The location to move to. ++ */ ++ private void moveDividerTo(int locationIndex) ++ { ++ Insets insets = splitPane.getInsets(); ++ switch (locationIndex) ++ { ++ case 1: ++ splitPane.setDividerLocation(splitPane.getLastDividerLocation()); ++ break; ++ case 0: ++ int top = (orientation == JSplitPane.HORIZONTAL_SPLIT) ? insets.left ++ : insets.top; ++ splitPane.setDividerLocation(top); ++ break; ++ case 2: ++ int bottom; ++ if (orientation == JSplitPane.HORIZONTAL_SPLIT) ++ bottom = splitPane.getBounds().width - insets.right - dividerSize; ++ else ++ bottom = splitPane.getBounds().height - insets.bottom - dividerSize; ++ splitPane.setDividerLocation(bottom); ++ break; ++ } ++ } + + /** +- * The listener for handling mouse events from both the divider +- * and the containing JSplitPane. +- * +- *

    The reason for also handling MouseEvents from the containing +- * JSplitPane is that users should be able to start +- * a drag gesture from inside the JSplitPane, but slightly outisde +- * the divider. ++ * The listener for handling mouse events from both the divider and the ++ * containing JSplitPane. ++ * ++ *

    ++ * The reason for also handling MouseEvents from the containing ++ * JSplitPane is that users should be able to start a drag ++ * gesture from inside the JSplitPane, but slightly outisde the divider. ++ *

    + * +- * @author Sascha Brawer (brawer@dandelis.ch) ++ * @author Sascha Brawer (brawer_AT_dandelis.ch) + */ +- protected class MouseHandler +- extends MouseAdapter ++ protected class MouseHandler extends MouseAdapter + implements MouseMotionListener + { +- ++ /** Keeps track of whether a drag is occurring. */ ++ private transient boolean isDragging; ++ ++ /** ++ * This method is called when the mouse is pressed. ++ * ++ * @param e The MouseEvent. ++ */ + public void mousePressed(MouseEvent e) + { +- // FIXME: Not yet implemented. ++ if (splitPane.isOneTouchExpandable()) ++ { ++ if (e.getSource() == leftButton) ++ { ++ currentDividerLocation--; ++ if (currentDividerLocation < 0) ++ currentDividerLocation = 0; ++ moveDividerTo(currentDividerLocation); ++ return; ++ } ++ else if (e.getSource() == rightButton) ++ { ++ currentDividerLocation++; ++ if (currentDividerLocation > 2) ++ currentDividerLocation = 2; ++ moveDividerTo(currentDividerLocation); ++ return; ++ } ++ } ++ isDragging = true; ++ currentDividerLocation = 1; ++ if (orientation == JSplitPane.HORIZONTAL_SPLIT) ++ dragger = new DragController(e); ++ else ++ dragger = new VerticalDragController(e); ++ prepareForDragging(); + } + +- ++ /** ++ * This method is called when the mouse is released. ++ * ++ * @param e The MouseEvent. ++ */ + public void mouseReleased(MouseEvent e) + { +- // FIXME: Not yet implemented. ++ if (isDragging) ++ dragger.completeDrag(e); ++ isDragging = false; + } + +- + /** +- * Repeatedly invoked when the user is dragging the mouse cursor +- * while having pressed a mouse button. ++ * Repeatedly invoked when the user is dragging the mouse cursor while ++ * having pressed a mouse button. ++ * ++ * @param e The MouseEvent. + */ + public void mouseDragged(MouseEvent e) + { +- // FIXME: Not yet implemented. ++ if (dragger != null) ++ dragger.continueDrag(e); + } + +- + /** +- * Repeatedly invoked when the user is dragging the mouse cursor +- * without having pressed a mouse button. ++ * Repeatedly invoked when the user is dragging the mouse cursor without ++ * having pressed a mouse button. ++ * ++ * @param e The MouseEvent. + */ + public void mouseMoved(MouseEvent e) + { +- // FIXME: Not yet implemented. ++ // Do nothing. + } + } + +- + /** +- * A small button for showing and hiding parts of a +- * JSplitPane with a single mouse click. ++ * Performs the tasks associated with an ongoing drag operation. + * +- * @author Sascha Brawer (brawer@dandelis.ch) ++ * @author Sascha Brawer (brawer_AT_dandelis.ch) + */ +- private static class OneTouchButton +- extends JButton ++ protected class DragController + { +- OneTouchButton(boolean left) ++ /** The difference between where the mouse is clicked and the ++ * initial divider location. */ ++ transient int offset; ++ ++ /** ++ * Creates a new DragController object. ++ * ++ * @param e The MouseEvent to initialize with. ++ */ ++ protected DragController(MouseEvent e) + { +- // FIXME: Set various properties of the button. +- // Make sure it looks identical to the small +- // buttons of the Sun reference implementation. +- // The size should also be the same. +- if (left) +- setText("<"); +- else +- setText(">"); ++ offset = e.getX(); ++ } ++ ++ /** ++ * This method returns true if the divider can move. ++ * ++ * @return True if dragging is allowed. ++ */ ++ protected boolean isValid() ++ { ++ // Views can always be resized? ++ return true; ++ } + +- Dimension butSize = new Dimension(ONE_TOUCH_SIZE, ONE_TOUCH_SIZE); +- setMinimumSize(butSize); +- setMaximumSize(butSize); +- setPreferredSize(butSize); ++ /** ++ * Returns a position for the divider given the MouseEvent. ++ * ++ * @param e MouseEvent. ++ * ++ * @return The position for the divider to move to. ++ */ ++ protected int positionForMouseEvent(MouseEvent e) ++ { ++ return e.getX() + getX() - offset; ++ } + +- setBorderPainted(false); ++ /** ++ * This method returns one of the two paramters ++ * for the orientation. In this case, it returns x. ++ * ++ * @param x The x coordinate. ++ * @param y The y coordinate. ++ * ++ * @return The x coordinate. ++ */ ++ protected int getNeededLocation(int x, int y) ++ { ++ return x; ++ } ++ ++ /** ++ * This method is called to pass on the drag information ++ * to the UI through dragDividerTo. ++ * ++ * @param newX The x coordinate of the MouseEvent. ++ * @param newY The y coordinate of the MouseEvent. ++ */ ++ protected void continueDrag(int newX, int newY) ++ { ++ if (isValid()) ++ dragDividerTo(adjust(newX, newY)); + } +- } + ++ /** ++ * This method is called to pass on the drag information ++ * to the UI through dragDividerTo. ++ * ++ * @param e The MouseEvent. ++ */ ++ protected void continueDrag(MouseEvent e) ++ { ++ if (isValid()) ++ dragDividerTo(positionForMouseEvent(e)); ++ } ++ ++ /** ++ * This method is called to finish the drag session ++ * by calling finishDraggingTo. ++ * ++ * @param x The x coordinate of the MouseEvent. ++ * @param y The y coordinate of the MouseEvent. ++ */ ++ protected void completeDrag(int x, int y) ++ { ++ finishDraggingTo(adjust(x, y)); ++ } ++ ++ /** ++ * This method is called to finish the drag session ++ * by calling finishDraggingTo. ++ * ++ * @param e The MouseEvent. ++ */ ++ protected void completeDrag(MouseEvent e) ++ { ++ finishDraggingTo(positionForMouseEvent(e)); ++ } ++ ++ /** ++ * This is a helper method that includes the offset ++ * in the needed location. ++ * ++ * @param x The x coordinate of the MouseEvent. ++ * @param y The y coordinate of the MouseEvent. ++ * ++ * @return The needed location adjusted by the offsets. ++ */ ++ int adjust(int x, int y) ++ { ++ return getNeededLocation(x, y) + getX() - offset; ++ } ++ } + + /** +- * Performs the tasks associated with an ongoing drag +- * operation. +- * +- * @author Sascha Brawer (brawer@dandelis.ch) ++ * This is a helper class that controls dragging when ++ * the orientation is VERTICAL_SPLIT. + */ +- protected class DragController ++ protected class VerticalDragController extends DragController + { +- // FIXME: Not yet implemented. +- protected DragController(MouseEvent e) ++ /** ++ * Creates a new VerticalDragController object. ++ * ++ * @param e The MouseEvent to initialize with. ++ */ ++ protected VerticalDragController(MouseEvent e) + { ++ super(e); ++ offset = e.getY(); + } + +- protected boolean isValid() ++ /** ++ * This method returns one of the two parameters given ++ * the orientation. In this case, it returns y. ++ * ++ * @param x The x coordinate of the MouseEvent. ++ * @param y The y coordinate of the MouseEvent. ++ * ++ * @return The y coordinate. ++ */ ++ protected int getNeededLocation(int x, int y) + { +- // FIXME: Not yet implemented. +- return true; ++ return y; + } + ++ /** ++ * This method returns the new location of the divider ++ * given a MouseEvent. ++ * ++ * @param e The MouseEvent. ++ * ++ * @return The new location of the divider. ++ */ + protected int positionForMouseEvent(MouseEvent e) + { +- return 0; ++ return e.getY() + getY() - offset; + } + +- protected int getNeededLocation(int x, int y) ++ /** ++ * This is a helper method that includes the offset ++ * in the needed location. ++ * ++ * @param x The x coordinate of the MouseEvent. ++ * @param y The y coordinate of the MouseEvent. ++ * ++ * @return The needed location adjusted by the offsets. ++ */ ++ int adjust(int x, int y) ++ { ++ return getNeededLocation(x, y) + getY() - offset; ++ } ++ } ++ ++ /** ++ * This helper class acts as the Layout Manager for ++ * the divider. ++ */ ++ protected class DividerLayout implements LayoutManager ++ { ++ /** ++ * Creates a new DividerLayout object. ++ */ ++ protected DividerLayout() + { +- return 0; + } + +- protected void continueDrag(int newX, int newY) ++ /** ++ * This method is called when a Component is added. ++ * ++ * @param string The constraints string. ++ * @param c The Component to add. ++ */ ++ public void addLayoutComponent(String string, Component c) + { ++ // Do nothing. + } + +- protected void completeDrag(int x, int y) ++ /** ++ * This method is called to lay out the container. ++ * ++ * @param c The container to lay out. ++ */ ++ public void layoutContainer(Container c) + { ++ if (splitPane.isOneTouchExpandable()) ++ { ++ changeButtonOrientation(); ++ positionButtons(); ++ } + } + +- protected void completeDrag(MouseEvent e) ++ /** ++ * This method returns the minimum layout size. ++ * ++ * @param c The container to calculate for. ++ * ++ * @return The minimum layout size. ++ */ ++ public Dimension minimumLayoutSize(Container c) ++ { ++ return preferredLayoutSize(c); ++ } ++ ++ /** ++ * This method returns the preferred layout size. ++ * ++ * @param c The container to calculate for. ++ * ++ * @return The preferred layout size. ++ */ ++ public Dimension preferredLayoutSize(Container c) + { ++ return new Dimension(dividerSize, dividerSize); ++ } ++ ++ /** ++ * This method is called when a component is removed. ++ * ++ * @param c The component to remove. ++ */ ++ public void removeLayoutComponent(Component c) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method changes the button orientation when ++ * the orientation of the SplitPane changes. ++ */ ++ private void changeButtonOrientation() ++ { ++ if (orientation == JSplitPane.HORIZONTAL_SPLIT) ++ { ++ ((BasicArrowButton) rightButton).setDirection(SwingConstants.EAST); ++ ((BasicArrowButton) leftButton).setDirection(SwingConstants.WEST); ++ } ++ else ++ { ++ ((BasicArrowButton) rightButton).setDirection(SwingConstants.SOUTH); ++ ((BasicArrowButton) leftButton).setDirection(SwingConstants.NORTH); ++ } ++ } ++ ++ /** ++ * This method sizes and positions the buttons. ++ */ ++ private void positionButtons() ++ { ++ int w = 0; ++ int h = 0; ++ if (orientation == JSplitPane.HORIZONTAL_SPLIT) ++ { ++ rightButton.setLocation(ONE_TOUCH_OFFSET, ONE_TOUCH_OFFSET); ++ leftButton.setLocation(ONE_TOUCH_OFFSET, ++ ONE_TOUCH_OFFSET + 2 * ONE_TOUCH_SIZE); ++ w = dividerSize - 2 * ONE_TOUCH_OFFSET; ++ h = 2 * ONE_TOUCH_SIZE; ++ } ++ else ++ { ++ leftButton.setLocation(ONE_TOUCH_OFFSET, ONE_TOUCH_OFFSET); ++ rightButton.setLocation(ONE_TOUCH_OFFSET + 2 * ONE_TOUCH_SIZE, ++ ONE_TOUCH_OFFSET); ++ h = dividerSize - 2 * ONE_TOUCH_OFFSET; ++ w = 2 * ONE_TOUCH_SIZE; ++ } ++ Dimension dims = new Dimension(w, h); ++ leftButton.setSize(dims); ++ rightButton.setSize(dims); + } + } + } +Index: javax/swing/plaf/basic/BasicSplitPaneUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicSplitPaneUI.java,v +retrieving revision 1.1 +diff -u -r1.1 BasicSplitPaneUI.java +--- javax/swing/plaf/basic/BasicSplitPaneUI.java 24 Jun 2003 09:48:42 -0000 1.1 ++++ javax/swing/plaf/basic/BasicSplitPaneUI.java 6 Sep 2004 16:36:08 -0000 +@@ -1,5 +1,5 @@ + /* BasicSplitPaneUI.java +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,273 +37,1478 @@ + + package javax.swing.plaf.basic; + ++import java.awt.Canvas; ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Container; + import java.awt.Dimension; + import java.awt.Graphics; + import java.awt.Insets; ++import java.awt.LayoutManager2; ++import java.awt.Point; ++import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; ++import java.awt.event.FocusAdapter; ++import java.awt.event.FocusEvent; + import java.awt.event.FocusListener; ++import java.awt.event.MouseEvent; ++import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; ++import javax.swing.JButton; + import javax.swing.JComponent; + import javax.swing.JSplitPane; + import javax.swing.KeyStroke; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.SplitPaneUI; + ++ + /** +- * FIXME: Stubbed to allow compiling other classes, +- * no real implementation. ++ * This is the Basic Look and Feel implementation of the SplitPaneUI class. + */ +-public class BasicSplitPaneUI +- extends SplitPaneUI ++public class BasicSplitPaneUI extends SplitPaneUI + { +- protected static final String NON_CONTINUOUS_DIVIDER +- = "nonContinuousDivider"; ++ /** ++ * This Layout Manager controls the position and size of the components when ++ * the JSplitPane's orientation is HORIZONTAL_SPLIT. ++ */ ++ protected class BasicHorizontalLayoutManager implements LayoutManager2 ++ { ++ // 3 components at a time. ++ // LEFT/TOP = 0 ++ // RIGHT/BOTTOM = 1 ++ // DIVIDER = 2 ++ ++ /** ++ * This array contains the components in the JSplitPane. The left/top ++ * component is at index 0, the right/bottom is at 1, and the divider is ++ * at 2. ++ */ ++ protected Component[] components = new Component[3]; ++ ++ // These are the _current_ widths of the associated component. ++ ++ /** ++ * This array contains the current width (for HORIZONTAL_SPLIT) or height ++ * (for VERTICAL_SPLIT) of the components. The indices are the same as ++ * for components. ++ */ ++ protected int[] sizes = new int[3]; ++ ++ /** ++ * This method adds the component given to the JSplitPane. The position of ++ * the component is given by the constraints object. ++ * ++ * @param comp The Component to add. ++ * @param constraints The constraints that bind the object. ++ */ ++ public void addLayoutComponent(Component comp, Object constraints) ++ { ++ addLayoutComponent((String) constraints, comp); ++ } ++ ++ /** ++ * This method is called to add a Component to the JSplitPane. The ++ * placement string determines where the Component will be placed. The ++ * string should be one of LEFT, RIGHT, TOP, BOTTOM or null (signals that ++ * the component is the divider). ++ * ++ * @param place The placement of the Component. ++ * @param component The Component to add. ++ * ++ * @throws IllegalArgumentException DOCUMENT ME! ++ */ ++ public void addLayoutComponent(String place, Component component) ++ { ++ int i = 0; ++ if (place == null) ++ i = 2; ++ else if (place.equals(JSplitPane.TOP) || place.equals(JSplitPane.LEFT)) ++ i = 0; ++ else if (place.equals(JSplitPane.BOTTOM) ++ || place.equals(JSplitPane.RIGHT)) ++ i = 1; ++ else ++ throw new IllegalArgumentException("Illegal placement in JSplitPane"); ++ components[i] = component; ++ resetSizeAt(i); ++ splitPane.revalidate(); ++ splitPane.repaint(); ++ } ++ ++ /** ++ * This method returns the width of the JSplitPane minus the insets. ++ * ++ * @param containerSize The Dimensions of the JSplitPane. ++ * @param insets The Insets of the JSplitPane. ++ * ++ * @return The width of the JSplitPane minus the insets. ++ */ ++ protected int getAvailableSize(Dimension containerSize, Insets insets) ++ { ++ return containerSize.width - insets.left - insets.right; ++ } ++ ++ /** ++ * This method returns the given insets left value. If the given inset is ++ * null, then 0 is returned. ++ * ++ * @param insets The Insets to use with the JSplitPane. ++ * ++ * @return The inset's left value. ++ */ ++ protected int getInitialLocation(Insets insets) ++ { ++ if (insets != null) ++ return insets.left; ++ return 0; ++ } ++ ++ /** ++ * This specifies how a component is aligned with respect to other ++ * components in the x fdirection. ++ * ++ * @param target The container. ++ * ++ * @return The component's alignment. ++ */ ++ public float getLayoutAlignmentX(Container target) ++ { ++ return target.getAlignmentX(); ++ } ++ ++ /** ++ * This specifies how a component is aligned with respect to other ++ * components in the y direction. ++ * ++ * @param target The container. ++ * ++ * @return The component's alignment. ++ */ ++ public float getLayoutAlignmentY(Container target) ++ { ++ return target.getAlignmentY(); ++ } ++ ++ /** ++ * This method returns the preferred width of the component. ++ * ++ * @param c The component to measure. ++ * ++ * @return The preferred width of the component. ++ */ ++ protected int getPreferredSizeOfComponent(Component c) ++ { ++ Dimension dims = c.getPreferredSize(); ++ if (dims != null) ++ return dims.width; ++ return 0; ++ } ++ ++ /** ++ * This method returns the current width of the component. ++ * ++ * @param c The component to measure. ++ * ++ * @return The width of the component. ++ */ ++ protected int getSizeOfComponent(Component c) ++ { ++ return c.getWidth(); ++ } ++ ++ /** ++ * This method returns the sizes array. ++ * ++ * @return The sizes array. ++ */ ++ protected int[] getSizes() ++ { ++ return sizes; ++ } ++ ++ /** ++ * This method invalidates the layout. It does nothing. ++ * ++ * @param c The container to invalidate. ++ */ ++ public void invalidateLayout(Container c) ++ { ++ // DO NOTHING ++ } ++ ++ /** ++ * This method lays out the components in the container. ++ * ++ * @param container The container to lay out. ++ */ ++ public void layoutContainer(Container container) ++ { ++ if (container instanceof JSplitPane) ++ { ++ JSplitPane split = (JSplitPane) container; ++ distributeExtraSpace(); ++ Insets insets = split.getInsets(); ++ int width = getInitialLocation(insets); ++ Dimension dims = split.getSize(); ++ for (int i = 0; i < components.length; i += 2) ++ { ++ if (components[i] == null) ++ continue; ++ setComponentToSize(components[i], sizes[i], width, insets, dims); ++ width += sizes[i]; ++ } ++ if (components[1] != null) ++ { ++ setComponentToSize(components[1], sizes[1], width, insets, dims); ++ width += sizes[1]; ++ } ++ } ++ } ++ ++ /** ++ * This method returns the maximum size for the container given the ++ * components. It returns a new Dimension object that has width and ++ * height equal to Integer.MAX_VALUE. ++ * ++ * @param target The container to measure. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension maximumLayoutSize(Container target) ++ { ++ return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); ++ } ++ ++ /** ++ * This method returns the container's minimum size. The minimum width is ++ * the sum of all the component's minimum widths. The minimum height is ++ * the maximum of all the components' minimum heights. ++ * ++ * @param target The container to measure. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension minimumLayoutSize(Container target) ++ { ++ if (target instanceof JSplitPane) ++ { ++ JSplitPane split = (JSplitPane) target; ++ Insets insets = target.getInsets(); ++ ++ int height = 0; ++ int width = 0; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] == null) ++ continue; ++ Dimension dims = components[i].getMinimumSize(); ++ if (dims != null) ++ { ++ width += dims.width; ++ height = Math.max(height, dims.height); ++ } ++ } ++ return new Dimension(width, height); ++ } ++ return null; ++ } ++ ++ /** ++ * This method returns the container's preferred size. The preferred width ++ * is the sum of all the component's preferred widths. The preferred ++ * height is the maximum of all the components' preferred heights. ++ * ++ * @param target The container to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension preferredLayoutSize(Container target) ++ { ++ if (target instanceof JSplitPane) ++ { ++ JSplitPane split = (JSplitPane) target; ++ Insets insets = target.getInsets(); ++ ++ int height = 0; ++ int width = 0; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] == null) ++ continue; ++ Dimension dims = components[i].getPreferredSize(); ++ if (dims != null) ++ { ++ width += dims.width; ++ if (! (components[i] instanceof BasicSplitPaneDivider)) ++ height = Math.max(height, dims.height); ++ } ++ } ++ return new Dimension(500, 500); //width, height); ++ } ++ return null; ++ } ++ ++ /** ++ * This method removes the component from the layout. ++ * ++ * @param component The component to remove from the layout. ++ */ ++ public void removeLayoutComponent(Component component) ++ { ++ for (int i = 0; i < components.length; i++) ++ { ++ if (component == components[i]) ++ { ++ components[i] = null; ++ sizes[i] = 0; ++ } ++ } ++ } ++ ++ /** ++ * This method resets the size of Component to the preferred size. ++ * ++ * @param index The index of the component to reset. ++ */ ++ protected void resetSizeAt(int index) ++ { ++ if (components[index] != null) ++ sizes[index] = getPreferredSizeOfComponent(components[index]); ++ } ++ ++ /** ++ * This method resets the sizes of all the components. ++ */ ++ public void resetToPreferredSizes() ++ { ++ for (int i = 0; i < components.length; i++) ++ resetSizeAt(i); ++ } ++ ++ /** ++ * This methods sets the bounds of the given component. The width is the ++ * size. The height is the container size minus the top and bottom ++ * inset. The x coordinate is the location given. The y coordinate is ++ * the top inset. ++ * ++ * @param c The component to set. ++ * @param size The width of the component. ++ * @param location The x coordinate. ++ * @param insets The insets to use. ++ * @param containerSize The height of the container. ++ */ ++ protected void setComponentToSize(Component c, int size, int location, ++ Insets insets, Dimension containerSize) ++ { ++ int w = size; ++ int h = containerSize.height - insets.top - insets.bottom; ++ int x = location; ++ int y = insets.top; ++ c.setBounds(x, y, w, h); ++ } ++ ++ /** ++ * This method stores the given int array as the new sizes array. ++ * ++ * @param newSizes The array to use as sizes. ++ */ ++ protected void setSizes(int[] newSizes) ++ { ++ sizes = newSizes; ++ } ++ ++ /** ++ * This method determines the size of each component. It should be called ++ * when a new Layout Manager is created for an existing JSplitPane. ++ */ ++ protected void updateComponents() ++ { ++ Component left = splitPane.getLeftComponent(); ++ Component right = splitPane.getRightComponent(); ++ ++ if (left != null) ++ { ++ components[0] = left; ++ resetSizeAt(0); ++ } ++ if (right != null) ++ { ++ components[1] = right; ++ resetSizeAt(1); ++ } ++ components[2] = divider; ++ resetSizeAt(2); ++ } ++ ++ /** ++ * This method resizes the left and right components to fit inside the ++ * JSplitPane when there is extra space. ++ */ ++ void distributeExtraSpace() ++ { ++ int availSize = getAvailableSize(splitPane.getSize(), ++ splitPane.getInsets()); ++ int[] newSizes = new int[3]; ++ double weight = splitPane.getResizeWeight(); ++ ++ int oldLen = sizes[0] + sizes[1]; ++ ++ // dividers don't change size. ++ availSize -= sizes[2] + oldLen; ++ ++ int rightAlloc = (int) (availSize * (1 - weight)); ++ int leftAlloc = availSize - rightAlloc; ++ ++ sizes[0] += leftAlloc; ++ sizes[1] += rightAlloc; ++ } ++ ++ /** ++ * This method returns the minimum width of the component at the given ++ * index. ++ * ++ * @param index The index to check. ++ * ++ * @return The minimum width. ++ */ ++ int minimumSizeOfComponent(int index) ++ { ++ Dimension dims = components[index].getMinimumSize(); ++ if (dims != null) ++ return dims.width; ++ else ++ return 0; ++ } ++ } //end BasicHorizontalLayoutManager ++ ++ /** ++ * This class is the Layout Manager for the JSplitPane when the orientation ++ * is VERTICAL_SPLIT. ++ */ ++ protected class BasicVerticalLayoutManager ++ extends BasicHorizontalLayoutManager ++ { ++ /** ++ * This method returns the height of the container minus the top and ++ * bottom inset. ++ * ++ * @param containerSize The size of the container. ++ * @param insets The insets of the container. ++ * ++ * @return The height minus top and bottom inset. ++ */ ++ protected int getAvailableSize(Dimension containerSize, Insets insets) ++ { ++ return containerSize.height - insets.top - insets.bottom; ++ } ++ ++ /** ++ * This method returns the top inset. ++ * ++ * @param insets The Insets to use. ++ * ++ * @return The top inset. ++ */ ++ protected int getInitialLocation(Insets insets) ++ { ++ return insets.top; ++ } ++ ++ /** ++ * This method returns the preferred height of the component. ++ * ++ * @param c The component to measure. ++ * ++ * @return The preferred height of the component. ++ */ ++ protected int getPreferredSizeOfComponent(Component c) ++ { ++ Dimension dims = c.getPreferredSize(); ++ if (dims != null) ++ return dims.height; ++ return 0; ++ } ++ ++ /** ++ * This method returns the current height of the component. ++ * ++ * @param c The component to measure. ++ * ++ * @return The current height of the component. ++ */ ++ protected int getSizeOfComponent(Component c) ++ { ++ return c.getHeight(); ++ } ++ ++ /** ++ * This method returns the minimum layout size. The minimum height is the ++ * sum of all the components' minimum heights. The minimum width is the ++ * maximum of all the components' minimum widths. ++ * ++ * @param container The container to measure. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension minimumLayoutSize(Container container) ++ { ++ if (container instanceof JSplitPane) ++ { ++ JSplitPane split = (JSplitPane) container; ++ Insets insets = container.getInsets(); ++ ++ int height = 0; ++ int width = 0; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] == null) ++ continue; ++ Dimension dims = components[i].getMinimumSize(); ++ if (dims != null) ++ { ++ height += dims.height; ++ width = Math.max(width, dims.width); ++ } ++ } ++ return new Dimension(width, height); ++ } ++ return null; ++ } ++ ++ /** ++ * This method returns the preferred layout size. The preferred height is ++ * the sum of all the components' preferred heights. The preferred width ++ * is the maximum of all the components' preferred widths. ++ * ++ * @param container The container to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension preferredLayoutSize(Container container) ++ { ++ if (container instanceof JSplitPane) ++ { ++ JSplitPane split = (JSplitPane) container; ++ Insets insets = container.getInsets(); ++ ++ int height = 0; ++ int width = 0; ++ for (int i = 0; i < components.length; i++) ++ { ++ if (components[i] == null) ++ continue; ++ Dimension dims = components[i].getPreferredSize(); ++ if (dims != null) ++ { ++ height += dims.height; ++ width = Math.max(width, dims.width); ++ } ++ } ++ return new Dimension(500, 500); //width, height); ++ } ++ return null; ++ } ++ ++ /** ++ * This method sets the bounds of the given component. The y coordinate is ++ * the location given. The x coordinate is the left inset. The height is ++ * the size given. The width is the container size minus the left and ++ * right inset. ++ * ++ * @param c The component to set bounds for. ++ * @param size The height. ++ * @param location The y coordinate. ++ * @param insets The insets to use. ++ * @param containerSize The container's size. ++ */ ++ protected void setComponentToSize(Component c, int size, int location, ++ Insets insets, Dimension containerSize) ++ { ++ int y = location; ++ int x = insets.left; ++ int h = size; ++ int w = containerSize.width - insets.left - insets.right; ++ ++ c.setBounds(x, y, w, h); ++ } ++ ++ /** ++ * This method returns the minimum height of the component at the given ++ * index. ++ * ++ * @param index The index of the component to check. ++ * ++ * @return The minimum height of the given component. ++ */ ++ int minimumSizeOfComponent(int index) ++ { ++ Dimension dims = components[index].getMinimumSize(); ++ if (dims != null) ++ return dims.height; ++ else ++ return 0; ++ } ++ } ++ ++ /** ++ * This class handles FocusEvents from the JComponent. ++ */ ++ protected class FocusHandler extends FocusAdapter ++ { ++ /** ++ * This method is called when the JSplitPane gains focus. ++ * ++ * @param ev The FocusEvent. ++ */ ++ public void focusGained(FocusEvent ev) ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method is called when the JSplitPane loses focus. ++ * ++ * @param ev The FocusEvent. ++ */ ++ public void focusLost(FocusEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This is a deprecated class. It is supposed to be used for handling down ++ * and right key presses. ++ */ ++ protected class KeyboardDownRightHandler implements ActionListener ++ { ++ /** ++ * This method is called when the down or right keys are pressed. ++ * ++ * @param ev The ActionEvent ++ */ ++ public void actionPerformed(ActionEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This is a deprecated class. It is supposed to be used for handling end ++ * key presses. ++ */ ++ protected class KeyboardEndHandler implements ActionListener ++ { ++ /** ++ * This method is called when the end key is pressed. ++ * ++ * @param ev The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This is a deprecated class. It is supposed to be used for handling home ++ * key presses. ++ */ ++ protected class KeyboardHomeHandler implements ActionListener ++ { ++ /** ++ * This method is called when the home key is pressed. ++ * ++ * @param ev The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This is a deprecated class. It is supposed to be used for handling resize ++ * toggles. ++ */ ++ protected class KeyboardResizeToggleHandler implements ActionListener ++ { ++ /** ++ * This method is called when a resize is toggled. ++ * ++ * @param ev The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This is a deprecated class. It is supposed to be used for handler up and ++ * left key presses. ++ */ ++ protected class KeyboardUpLeftHandler implements ActionListener ++ { ++ /** ++ * This method is called when the left or up keys are pressed. ++ * ++ * @param ev The ActionEvent. ++ */ ++ public void actionPerformed(ActionEvent ev) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This helper class handles PropertyChangeEvents from the JSplitPane. When ++ * a property changes, this will update the UI accordingly. ++ */ ++ protected class PropertyHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called whenever one of the JSplitPane's properties ++ * change. ++ * ++ * @param e DOCUMENT ME! ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JSplitPane.DIVIDER_SIZE_PROPERTY)) ++ { ++ int newSize = splitPane.getDividerSize(); ++ int[] tmpSizes = layoutManager.getSizes(); ++ dividerSize = tmpSizes[2]; ++ Component left = splitPane.getLeftComponent(); ++ Component right = splitPane.getRightComponent(); ++ int newSpace = newSize - tmpSizes[2]; ++ ++ tmpSizes[2] = newSize; ++ ++ tmpSizes[0] += newSpace / 2; ++ tmpSizes[1] += newSpace / 2; ++ ++ layoutManager.setSizes(tmpSizes); ++ } ++ else if (e.getPropertyName().equals(JSplitPane.ORIENTATION_PROPERTY)) ++ { ++ int max = layoutManager.getAvailableSize(splitPane.getSize(), ++ splitPane.getInsets()); ++ int dividerLoc = getDividerLocation(splitPane); ++ double prop = ((double) dividerLoc) / max; ++ ++ resetLayoutManager(); ++ if (prop <= 1 && prop >= 0) ++ splitPane.setDividerLocation(prop); ++ } ++ layoutManager.layoutContainer(splitPane); ++ splitPane.repaint(); ++ // Don't have to deal with continuous_layout - only ++ // necessary in dragging modes (and it's checked ++ // every time you drag there) ++ // Don't have to deal with resize_weight (as there ++ // will be no extra space associated with this ++ // event - the changes to the weighting will ++ // be taken into account the next time the ++ // sizes change.) ++ // Don't have to deal with divider_location ++ // The method in JSplitPane calls our setDividerLocation ++ // so we'll know about those anyway. ++ // Don't have to deal with last_divider_location ++ // Although I'm not sure why, it doesn't seem to ++ // have any effect on Sun's JSplitPane. ++ // one_touch_expandable changes are dealt with ++ // by our divider. ++ } ++ } ++ ++ /** The location of the divider when dragging began. */ ++ protected int beginDragDividerLocation; ++ ++ /** The size of the divider while dragging. */ ++ protected int dividerSize; + ++ /** The location where the last drag location ended. */ ++ transient int lastDragLocation = -1; ++ ++ /** The distance the divider is moved when moved by keyboard actions. */ + protected static int KEYBOARD_DIVIDER_MOVE_OFFSET; + +- protected JSplitPane splitPane; ++ /** The divider that divides this JSplitPane. */ + protected BasicSplitPaneDivider divider; ++ ++ /** The listener that listens for PropertyChangeEvents from the JSplitPane. */ + protected PropertyChangeListener propertyChangeListener; ++ ++ /** The JSplitPane's focus handler. */ + protected FocusListener focusListener; +- protected int dividerSize; +- protected Component nonContinuousLayoutDivider; +- protected boolean draggingHW; +- protected int beginDragDividerLocation; +- protected KeyStroke upKey; +- protected KeyStroke downKey; +- protected KeyStroke leftKey; +- protected KeyStroke rightKey; +- protected KeyStroke homeKey; +- protected KeyStroke endKey; +- protected KeyStroke dividerResizeToggleKey; +- protected ActionListener keyboardUpLeftListener; ++ ++ /** Deprecated. The handler for down and right key presses. */ + protected ActionListener keyboardDownRightListener; +- protected ActionListener keyboardHomeListener; ++ ++ /** Deprecated. The handler for end key presses. */ + protected ActionListener keyboardEndListener; ++ ++ /** Deprecated. The handler for home key presses. */ ++ protected ActionListener keyboardHomeListener; ++ ++ /** Deprecated. The handler for toggling resizes. */ + protected ActionListener keyboardResizeToggleListener; + +- public static ComponentUI createUI(JComponent c) +- { +- BasicSplitPaneUI newUI; ++ /** Deprecated. The handler for up and left key presses. */ ++ protected ActionListener keyboardUpLeftListener; + +- newUI = new BasicSplitPaneUI(); +- newUI.installUI(c); +- return newUI; +- } ++ /** The JSplitPane's current layout manager. */ ++ protected BasicHorizontalLayoutManager layoutManager; ++ ++ /** Deprecated. The divider resize toggle key. */ ++ protected KeyStroke dividerResizeToggleKey; ++ ++ /** Deprecated. The down key. */ ++ protected KeyStroke downKey; ++ ++ /** Deprecated. The end key. */ ++ protected KeyStroke endKey; ++ ++ /** Deprecated. The home key. */ ++ protected KeyStroke homeKey; ++ ++ /** Deprecated. The left key. */ ++ protected KeyStroke leftKey; ++ ++ /** Deprecated. The right key. */ ++ protected KeyStroke rightKey; ++ ++ /** Deprecated. The up key. */ ++ protected KeyStroke upKey; ++ ++ /** Set to true when dragging heavy weight components. */ ++ protected boolean draggingHW; ++ ++ /** ++ * The constraints object used when adding the non-continuous divider to the ++ * JSplitPane. ++ */ ++ protected static String NON_CONTINUOUS_DIVIDER; ++ ++ /** The dark divider used when dragging in non-continuous layout mode. */ ++ protected Component nonContinuousLayoutDivider; + ++ /** The JSplitPane that this UI draws. */ ++ protected JSplitPane splitPane; ++ ++ /** ++ * Creates a new BasicSplitPaneUI object. ++ */ + public BasicSplitPaneUI() + { +- propertyChangeListener = createPropertyChangeListener(); +- focusListener = createFocusListener(); + } + ++ /** ++ * This method creates a new BasicSplitPaneUI for the given JComponent. ++ * ++ * @param x The JComponent to create a UI for. ++ * ++ * @return A new BasicSplitPaneUI. ++ */ ++ public static ComponentUI createUI(JComponent x) ++ { ++ return new BasicSplitPaneUI(); ++ } ++ ++ /** ++ * This method installs the BasicSplitPaneUI for the given JComponent. ++ * ++ * @param c The JComponent to install the UI for. ++ */ + public void installUI(JComponent c) + { ++ if (c instanceof JSplitPane) ++ { ++ splitPane = (JSplitPane) c; ++ installDefaults(); ++ installListeners(); ++ installKeyboardActions(); ++ } + } + +- protected void installDefaults() ++ /** ++ * This method uninstalls the BasicSplitPaneUI for the given JComponent. ++ * ++ * @param c The JComponent to uninstall the UI for. ++ */ ++ public void uninstallUI(JComponent c) + { +- } ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallDefaults(); + +- protected void installListeners() +- { ++ splitPane = null; + } + +- protected void installKeyboardListeners() ++ /** ++ * This method installs the defaults given by the Look and Feel. ++ */ ++ protected void installDefaults() + { +- } +- +- protected void installKeyboardActions() ++ resetLayoutManager(); ++ divider = createDefaultDivider(); ++ nonContinuousLayoutDivider = createDefaultNonContinuousLayoutDivider(); ++ splitPane.add(divider, JSplitPane.DIVIDER); ++ ++ // There is no need to add the nonContinuousLayoutDivider ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ splitPane.setBackground(defaults.getColor("SplitPane.background")); ++ splitPane.setBorder(defaults.getBorder("SplitPane.border")); ++ splitPane.setDividerSize(defaults.getInt("SplitPane.dividerSize")); ++ } ++ ++ /** ++ * This method uninstalls the defaults and nulls any objects created during ++ * install. ++ */ ++ protected void uninstallDefaults() + { ++ layoutManager = null; ++ splitPane.remove(divider); ++ divider = null; ++ nonContinuousLayoutDivider = null; ++ ++ splitPane.setBackground(null); ++ splitPane.setBorder(null); + } + +- public void uninstallUI(JComponent c) ++ /** ++ * This method installs the listeners needed for this UI to function. ++ */ ++ protected void installListeners() + { ++ propertyChangeListener = createPropertyChangeListener(); ++ focusListener = createFocusListener(); ++ ++ splitPane.addPropertyChangeListener(propertyChangeListener); ++ splitPane.addFocusListener(focusListener); + } + +- protected void uninstallDefaults() ++ /** ++ * This method uninstalls all listeners registered for the UI. ++ */ ++ protected void uninstallListeners() + { ++ splitPane.removePropertyChangeListener(propertyChangeListener); ++ splitPane.removeFocusListener(focusListener); ++ ++ focusListener = null; ++ propertyChangeListener = null; + } + +- protected void uninstallListeners() ++ /** ++ * This method installs the keyboard actions for the JSplitPane. ++ */ ++ protected void installKeyboardActions() + { ++ // FIXME: implement. + } + ++ /** ++ * This method reverses the work done in installKeyboardActions. ++ */ + protected void uninstallKeyboardActions() + { ++ // FIXME: implement. + } + ++ /** ++ * This method creates a new PropertyChangeListener. ++ * ++ * @return A new PropertyChangeListener. ++ */ + protected PropertyChangeListener createPropertyChangeListener() + { +- return null; ++ return new PropertyHandler(); + } + ++ /** ++ * This method creates a new FocusListener. ++ * ++ * @return A new FocusListener. ++ */ + protected FocusListener createFocusListener() + { +- return null; ++ return new FocusHandler(); + } + ++ /** ++ * Deprecated. This method creates a new ActionListener for up and left key ++ * presses. ++ * ++ * @return A new ActionListener for up and left keys. ++ */ + protected ActionListener createKeyboardUpLeftListener() + { +- return null; ++ return new KeyboardUpLeftHandler(); + } + ++ /** ++ * Deprecated. This method creates a new ActionListener for down and right ++ * key presses. ++ * ++ * @return A new ActionListener for down and right keys. ++ */ + protected ActionListener createKeyboardDownRightListener() + { +- return null; ++ return new KeyboardDownRightHandler(); + } + ++ /** ++ * Deprecated. This method creates a new ActionListener for home key ++ * presses. ++ * ++ * @return A new ActionListener for home keys. ++ */ + protected ActionListener createKeyboardHomeListener() + { +- return null; ++ return new KeyboardHomeHandler(); + } + ++ /** ++ * Deprecated. This method creates a new ActionListener for end key presses. ++ * ++ * @return A new ActionListener for end keys. ++ */ + protected ActionListener createKeyboardEndListener() + { +- return null; ++ return new KeyboardEndHandler(); + } + ++ /** ++ * Depcreated. This method creates a new ActionListener for resize toggle ++ * key events. ++ * ++ * @return A new ActionListener for resize toggle keys. ++ */ + protected ActionListener createKeyboardResizeToggleListener() + { +- return null; ++ return new KeyboardResizeToggleHandler(); + } + ++ /** ++ * This method returns the orientation of the JSplitPane. ++ * ++ * @return The orientation of the JSplitPane. ++ */ + public int getOrientation() + { + return splitPane.getOrientation(); + } + ++ /** ++ * This method sets the orientation of the JSplitPane. ++ * ++ * @param orientation The new orientation of the JSplitPane. ++ */ + public void setOrientation(int orientation) + { ++ splitPane.setOrientation(orientation); + } + +- ++ /** ++ * This method returns true if the JSplitPane is using continuous layout. ++ * ++ * @return True if the JSplitPane is using continuous layout. ++ */ + public boolean isContinuousLayout() + { +- return false; ++ return splitPane.isContinuousLayout(); + } + ++ /** ++ * This method sets the continuous layout property of the JSplitPane. ++ * ++ * @param b True if the JsplitPane is to use continuous layout. ++ */ + public void setContinuousLayout(boolean b) + { ++ splitPane.setContinuousLayout(b); + } + ++ /** ++ * This method returns the last location the divider was dragged to. ++ * ++ * @return The last location the divider was dragged to. ++ */ + public int getLastDragLocation() + { +- return 0; ++ return lastDragLocation; + } + ++ /** ++ * This method sets the last location the divider was dragged to. ++ * ++ * @param l The last location the divider was dragged to. ++ */ + public void setLastDragLocation(int l) + { ++ lastDragLocation = l; + } + +- ++ /** ++ * This method returns the BasicSplitPaneDivider that divides this ++ * JSplitPane. ++ * ++ * @return The divider for the JSplitPane. ++ */ + public BasicSplitPaneDivider getDivider() + { + return divider; + } + +- ++ /** ++ * This method creates a nonContinuousLayoutDivider for use with the ++ * JSplitPane in nonContinousLayout mode. The default divider is a gray ++ * Canvas. ++ * ++ * @return The default nonContinousLayoutDivider. ++ */ + protected Component createDefaultNonContinuousLayoutDivider() + { +- return null; ++ if (nonContinuousLayoutDivider == null) ++ { ++ nonContinuousLayoutDivider = new Canvas(); ++ nonContinuousLayoutDivider.setBackground(Color.DARK_GRAY); ++ } ++ return nonContinuousLayoutDivider; + } + ++ /** ++ * This method sets the component to use as the nonContinuousLayoutDivider. ++ * ++ * @param newDivider The component to use as the nonContinuousLayoutDivider. ++ */ + protected void setNonContinuousLayoutDivider(Component newDivider) + { +- setNonContinuousLayoutDivider(newDivider, true /* false? */); ++ setNonContinuousLayoutDivider(newDivider, true); + } + ++ /** ++ * This method sets the component to use as the nonContinuousLayoutDivider. ++ * ++ * @param newDivider The component to use as the nonContinuousLayoutDivider. ++ * @param rememberSizes FIXME: document. ++ */ + protected void setNonContinuousLayoutDivider(Component newDivider, + boolean rememberSizes) + { ++ // FIXME: use rememberSizes for something + nonContinuousLayoutDivider = newDivider; + } + ++ /** ++ * This method returns the nonContinuousLayoutDivider. ++ * ++ * @return The nonContinuousLayoutDivider. ++ */ + public Component getNonContinuousLayoutDivider() + { + return nonContinuousLayoutDivider; + } + ++ /** ++ * This method returns the JSplitPane that this BasicSplitPaneUI draws. ++ * ++ * @return The JSplitPane. ++ */ + public JSplitPane getSplitPane() + { + return splitPane; + } + ++ /** ++ * This method creates the divider used normally with the JSplitPane. ++ * ++ * @return The default divider. ++ */ + public BasicSplitPaneDivider createDefaultDivider() + { +- return null; ++ if (divider == null) ++ divider = new BasicSplitPaneDivider(this); ++ return divider; + } + ++ /** ++ * This method is called when JSplitPane's resetToPreferredSizes is called. ++ * It resets the sizes of all components in the JSplitPane. ++ * ++ * @param jc The JSplitPane to reset. ++ */ + public void resetToPreferredSizes(JSplitPane jc) + { ++ layoutManager.resetToPreferredSizes(); + } + ++ /** ++ * This method sets the location of the divider. ++ * ++ * @param jc The JSplitPane to set the divider location in. ++ * @param location The new location of the divider. ++ */ + public void setDividerLocation(JSplitPane jc, int location) + { +- } +- ++ setLastDragLocation(getDividerLocation(splitPane)); ++ splitPane.setLastDividerLocation(getDividerLocation(splitPane)); ++ int[] tmpSizes = layoutManager.getSizes(); ++ tmpSizes[0] = location ++ - layoutManager.getInitialLocation(splitPane.getInsets()); ++ tmpSizes[1] = layoutManager.getAvailableSize(splitPane.getSize(), ++ splitPane.getInsets()) ++ - tmpSizes[0] - tmpSizes[1]; ++ ++ layoutManager.setSizes(tmpSizes); ++ splitPane.revalidate(); ++ splitPane.repaint(); ++ } ++ ++ /** ++ * This method returns the location of the divider. ++ * ++ * @param jc The JSplitPane to retrieve the location for. ++ * ++ * @return The location of the divider. ++ */ + public int getDividerLocation(JSplitPane jc) + { +- return 0; ++ return layoutManager.sizes[0] ++ + layoutManager.getInitialLocation(splitPane.getInsets()); + } + ++ /** ++ * This method returns the smallest value possible for the location of the ++ * divider. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The minimum divider location. ++ */ + public int getMinimumDividerLocation(JSplitPane jc) + { +- return 0; ++ int value = layoutManager.getInitialLocation(jc.getInsets()); ++ if (layoutManager.components[0] != null) ++ value += layoutManager.minimumSizeOfComponent(0); ++ return value; + } + ++ /** ++ * This method returns the largest value possible for the location of the ++ * divider. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The maximum divider location. ++ */ + public int getMaximumDividerLocation(JSplitPane jc) + { +- return 0; ++ int value = layoutManager.getInitialLocation(jc.getInsets()) ++ + layoutManager.getAvailableSize(jc.getSize(), jc.getInsets()) ++ - splitPane.getDividerSize(); ++ if (layoutManager.components[1] != null) ++ value -= layoutManager.minimumSizeOfComponent(1); ++ return value; + } + ++ /** ++ * This method is called after the children of the JSplitPane are painted. ++ * ++ * @param jc The JSplitPane. ++ * @param g The Graphics object to paint with. ++ */ + public void finishedPaintingChildren(JSplitPane jc, Graphics g) + { ++ if (! splitPane.isContinuousLayout() && nonContinuousLayoutDivider != null ++ && nonContinuousLayoutDivider.isVisible()) ++ javax.swing.SwingUtilities.paintComponent(g, nonContinuousLayoutDivider, ++ null, ++ nonContinuousLayoutDivider ++ .getBounds()); + } + ++ /** ++ * This method is called to paint the JSplitPane. ++ * ++ * @param g The Graphics object to paint with. ++ * @param jc The JSplitPane to paint. ++ */ + public void paint(Graphics g, JComponent jc) + { ++ // Do nothing. All the painting is handled by children. + } + ++ /** ++ * This method returns the preferred size of the JSplitPane. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The preferred size of the JSplitPane. ++ */ + public Dimension getPreferredSize(JComponent jc) + { +- return null; ++ return layoutManager.preferredLayoutSize((Container) jc); + } + ++ /** ++ * This method returns the minimum size of the JSplitPane. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The minimum size of the JSplitPane. ++ */ + public Dimension getMinimumSize(JComponent jc) + { +- return null; ++ return layoutManager.minimumLayoutSize((Container) jc); + } + ++ /** ++ * This method returns the maximum size of the JSplitPane. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The maximum size of the JSplitPane. ++ */ + public Dimension getMaximumSize(JComponent jc) + { +- return null; ++ return layoutManager.maximumLayoutSize((Container) jc); + } + ++ /** ++ * This method returns the border insets of the current border. ++ * ++ * @param jc The JSplitPane. ++ * ++ * @return The current border insets. ++ */ + public Insets getInsets(JComponent jc) + { +- return new Insets(0, 0, 0, 0); ++ return splitPane.getBorder().getBorderInsets(splitPane); + } + ++ /** ++ * This method resets the current layout manager. The type of layout manager ++ * is dependent on the current orientation. ++ */ + protected void resetLayoutManager() + { +- } +- ++ if (getOrientation() == JSplitPane.HORIZONTAL_SPLIT) ++ layoutManager = new BasicHorizontalLayoutManager(); ++ else ++ layoutManager = new BasicVerticalLayoutManager(); ++ layoutManager.invalidateLayout(splitPane); ++ layoutManager.updateComponents(); ++ getSplitPane().setLayout(layoutManager); ++ ++ // invalidating by itself does not invalidate the layout. ++ getSplitPane().revalidate(); ++ } ++ ++ /** ++ * This method is called when dragging starts. It resets lastDragLocation ++ * and dividerSize. ++ */ + protected void startDragging() + { +- } ++ dividerSize = divider.getDividerSize(); ++ setLastDragLocation(-1); + ++ if (! splitPane.getLeftComponent().isLightweight() ++ || ! splitPane.getRightComponent().isLightweight()) ++ draggingHW = true; ++ ++ if (splitPane.isContinuousLayout()) ++ nonContinuousLayoutDivider.setVisible(false); ++ else ++ { ++ nonContinuousLayoutDivider.setVisible(true); ++ nonContinuousLayoutDivider.setBounds(divider.getBounds()); ++ } ++ splitPane.revalidate(); ++ splitPane.repaint(); ++ } ++ ++ /** ++ * This method is called whenever the divider is dragged. If the JSplitPane ++ * is in continuousLayout mode, the divider needs to be moved and the ++ * JSplitPane needs to be laid out. ++ * ++ * @param location The new location of the divider. ++ */ + protected void dragDividerTo(int location) + { +- } +- ++ location = validLocation(location); ++ if (beginDragDividerLocation == -1) ++ beginDragDividerLocation = location; ++ ++ if (splitPane.isContinuousLayout()) ++ splitPane.setDividerLocation(location); ++ else ++ { ++ Point p = nonContinuousLayoutDivider.getLocation(); ++ if (getOrientation() == JSplitPane.HORIZONTAL_SPLIT) ++ p.x = location; ++ else ++ p.y = location; ++ nonContinuousLayoutDivider.setLocation(p); ++ } ++ setLastDragLocation(location); ++ splitPane.repaint(); ++ } ++ ++ /** ++ * This method is called when the dragging is finished. ++ * ++ * @param location The location where the drag finished. ++ */ + protected void finishDraggingTo(int location) + { +- } +- ++ if (nonContinuousLayoutDivider != null) ++ nonContinuousLayoutDivider.setVisible(false); ++ draggingHW = false; ++ location = validLocation(location); ++ dragDividerTo(location); ++ splitPane.setDividerLocation(location); ++ splitPane.setLastDividerLocation(beginDragDividerLocation); ++ beginDragDividerLocation = -1; ++ splitPane.repaint(); ++ } ++ ++ /** ++ * Deprecated. This method returns the width of one of the sides of the ++ * divider's border. ++ * ++ * @return The width of one side of the divider's border. ++ */ + protected int getDividerBorderSize() + { +- return 0; ++ if (getOrientation() == JSplitPane.HORIZONTAL_SPLIT) ++ return divider.getBorder().getBorderInsets(divider).left; ++ else ++ return divider.getBorder().getBorderInsets(divider).top; ++ } ++ ++ /** ++ * This is a helper method that returns a valid location for the divider ++ * when dragging. ++ * ++ * @param location The location to check. ++ * ++ * @return A valid location. ++ */ ++ private int validLocation(int location) ++ { ++ if (location < getMinimumDividerLocation(splitPane)) ++ return getMinimumDividerLocation(splitPane); ++ if (location > getMaximumDividerLocation(splitPane)) ++ return getMaximumDividerLocation(splitPane); ++ return location; + } + } +Index: javax/swing/plaf/basic/BasicTabbedPaneUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicTabbedPaneUI.java,v +retrieving revision 1.3 +diff -u -r1.3 BasicTabbedPaneUI.java +--- javax/swing/plaf/basic/BasicTabbedPaneUI.java 13 Jul 2003 15:29:11 -0000 1.3 ++++ javax/swing/plaf/basic/BasicTabbedPaneUI.java 6 Sep 2004 16:36:08 -0000 +@@ -1,5 +1,5 @@ + /* BasicTabbedPaneUI.java +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -28,82 +28,2985 @@ + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that ++independent module, the terms and conditions of7 the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.plaf.basic; + ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Container; + import java.awt.Dimension; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; + import java.awt.Insets; ++import java.awt.LayoutManager; ++import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.event.FocusAdapter; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++ ++import javax.swing.Icon; + import javax.swing.JComponent; ++import javax.swing.JPanel; + import javax.swing.JTabbedPane; ++import javax.swing.JViewport; ++import javax.swing.KeyStroke; + import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; + import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.PanelUI; + import javax.swing.plaf.TabbedPaneUI; ++import javax.swing.plaf.UIResource; ++import javax.swing.text.View; + +-public class BasicTabbedPaneUI extends TabbedPaneUI +- implements SwingConstants ++ ++/** ++ * This is the Basic Look and Feel's UI delegate for JTabbedPane. ++ */ ++public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants + { +- public static ComponentUI createUI(final JComponent c) ++ /** ++ * A helper class that handles focus. ++ */ ++ protected class FocusHandler extends FocusAdapter ++ { ++ /** ++ * This method is called when the component gains focus. ++ * ++ * @param e The FocusEvent. ++ */ ++ public void focusGained(FocusEvent e) + { +- return new BasicTabbedPaneUI(); ++ // FIXME: Implement. + } +- +- public void installUI(final JComponent c) ++ ++ /** ++ * This method is called when the component loses focus. ++ * ++ * @param e The FocusEvent. ++ */ ++ public void focusLost(FocusEvent e) + { +- super.installUI(c); ++ // FIXME: Implement. + } +- +- public Dimension getPreferredSize(JComponent c) ++ } ++ ++ /** ++ * A helper class for determining if mouse presses occur inside tabs and ++ * sets the index appropriately. In SCROLL_TAB_MODE, this class also ++ * handles the mouse clicks on the scrolling buttons. ++ */ ++ protected class MouseHandler extends MouseAdapter ++ { ++ /** ++ * This method is called when the mouse is pressed. The index cannot ++ * change to a tab that is not enabled. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) + { +- JTabbedPane p = (JTabbedPane) c; ++ int x = e.getX(); ++ int y = e.getY(); ++ int tabCount = tabPane.getTabCount(); + +- Dimension d = new Dimension(50,50); +- +- for (int i=0;i= tabCount) ++ currentScrollLocation = tabCount - 1; ++ if (currentScrollLocation == tabCount - 1) ++ incrButton.setEnabled(false); ++ else if (! decrButton.isEnabled()) ++ decrButton.setEnabled(true); ++ tabPane.layout(); ++ tabPane.repaint(); ++ return; ++ } ++ else if (e.getSource() == decrButton) ++ { ++ if (--currentScrollLocation < 0) ++ currentScrollLocation = 0; ++ if (currentScrollLocation == 0) ++ decrButton.setEnabled(false); ++ else if (! incrButton.isEnabled()) ++ incrButton.setEnabled(true); ++ tabPane.layout(); ++ tabPane.repaint(); ++ return; ++ } ++ } ++ ++ int index = tabForCoordinate(tabPane, x, y); ++ ++ // We need to check since there are areas where tabs cannot be ++ // e.g. in the inset area. ++ if (index != -1 && tabPane.isEnabledAt(index)) ++ tabPane.setSelectedIndex(index); ++ tabPane.layout(); ++ tabPane.repaint(); ++ } ++ } + +- d.width = Math.max(d.width, comp.getWidth()); +- d.height = Math.max(d.height, comp.getHeight()); ++ /** ++ * This class handles PropertyChangeEvents fired from the JTabbedPane. ++ */ ++ protected class PropertyChangeHandler implements PropertyChangeListener ++ { ++ /** ++ * This method is called whenever one of the properties of the JTabbedPane ++ * changes. ++ * ++ * @param e The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ if (e.getPropertyName().equals(JTabbedPane.TAB_LAYOUT_POLICY_CHANGED_PROPERTY)) ++ { ++ layoutManager = createLayoutManager(); ++ ++ tabPane.setLayout(layoutManager); ++ } ++ else if (e.getPropertyName().equals(JTabbedPane.TAB_PLACEMENT_CHANGED_PROPERTY) ++ && tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) ++ { ++ incrButton = createIncreaseButton(); ++ decrButton = createDecreaseButton(); ++ } ++ tabPane.layout(); ++ tabPane.repaint(); ++ } ++ } ++ ++ /** ++ * A LayoutManager responsible for placing all the tabs and the visible ++ * component inside the JTabbedPane. This class is only used for ++ * WRAP_TAB_LAYOUT. ++ */ ++ protected class TabbedPaneLayout implements LayoutManager ++ { ++ /** ++ * This method is called when a component is added to the JTabbedPane. ++ * ++ * @param name The name of the component. ++ * @param comp The component being added. ++ */ ++ public void addLayoutComponent(String name, Component comp) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method is called when the rectangles need to be calculated. It ++ * also fixes the size of the visible component. ++ */ ++ public void calculateLayoutInfo() ++ { ++ calculateTabRects(tabPane.getTabPlacement(), tabPane.getTabCount()); ++ ++ if (tabPane.getSelectedIndex() != -1) ++ { ++ Component visible = getVisibleComponent(); ++ Insets insets = getContentBorderInsets(tabPane.getTabPlacement()); ++ if (visible != null) ++ visible.setBounds(contentRect.x + insets.left, ++ contentRect.y + insets.top, ++ contentRect.width - insets.left - insets.right, ++ contentRect.height - insets.top - insets.bottom); ++ } ++ } ++ ++ /** ++ * This method calculates the size of the the JTabbedPane. ++ * ++ * @param minimum Whether the JTabbedPane will try to be as small as it ++ * can. ++ * ++ * @return The desired size of the JTabbedPane. ++ */ ++ protected Dimension calculateSize(boolean minimum) ++ { ++ int tabPlacement = tabPane.getTabPlacement(); ++ int width = 0; ++ int height = 0; ++ ++ int componentHeight = 0; ++ int componentWidth = 0; ++ Component c; ++ Dimension dims; ++ for (int i = 0; i < tabPane.getTabCount(); i++) ++ { ++ c = tabPane.getComponentAt(i); ++ if (c == null) ++ continue; ++ calcRect = c.getBounds(); ++ dims = c.getPreferredSize(); ++ if (dims != null) ++ { ++ componentHeight = Math.max(componentHeight, dims.height); ++ componentWidth = Math.max(componentWidth, dims.width); + } +- +- Insets i = p.getInsets(); +- +- d.width += i.left + i.right; +- d.height += i.top + i.bottom; ++ } ++ Insets insets = tabPane.getInsets(); ++ ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ width = calculateMaxTabWidth(tabPlacement) * tabPane.getTabCount(); ++ calcRect = tabPane.getParent().getBounds(); ++ width = Math.max(width, componentWidth); + +- int height_of_tabs = 25; ++ int tabAreaHeight = preferredTabAreaHeight(tabPlacement, width); ++ height = tabAreaHeight + componentHeight; ++ } ++ else ++ { ++ height = calculateMaxTabHeight(tabPlacement) * tabPane.getTabCount(); ++ calcRect = tabPane.getParent().getBounds(); ++ height = Math.max(height, componentHeight); + +- d.height += height_of_tabs; ++ int tabAreaWidth = preferredTabAreaWidth(tabPlacement, height); ++ width = tabAreaWidth + componentWidth; ++ } + +- // FIXME: should be max of panes in p +- return d; ++ return new Dimension(width, height); ++ } ++ ++ // if tab placement is LEFT OR RIGHT, they share width. ++ // if tab placement is TOP OR BOTTOM, they share height ++ // PRE STEP: finds the default sizes for the labels as well as their locations. ++ // AND where they will be placed within the run system. ++ // 1. calls normalizeTab Runs. ++ // 2. calls rotate tab runs. ++ // 3. pads the tab runs. ++ // 4. pads the selected tab. ++ ++ /** ++ * This method is called to calculate the tab rectangles. This method ++ * will calculate the size and position of all rectangles (taking into ++ * account which ones should be in which tab run). It will pad them and ++ * normalize them as necessary. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabCount The run the current selection is in. ++ */ ++ protected void calculateTabRects(int tabPlacement, int tabCount) ++ { ++ if (tabCount == 0) ++ return; ++ assureRectsCreated(tabCount); ++ ++ FontMetrics fm = getFontMetrics(); ++ SwingUtilities.calculateInnerArea(tabPane, calcRect); ++ Insets tabAreaInsets = getTabAreaInsets(tabPlacement); ++ Insets insets = tabPane.getInsets(); ++ int max = 0; ++ int runs = 0; ++ int start = getTabRunIndent(tabPlacement, 1); ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ int maxHeight = calculateMaxTabHeight(tabPlacement); ++ ++ calcRect.width -= tabAreaInsets.left + tabAreaInsets.right; ++ max = calcRect.width + tabAreaInsets.left + insets.left; ++ start += tabAreaInsets.left + insets.left; ++ int width = 0; ++ int runWidth = start; ++ ++ for (int i = 0; i < tabCount; i++) ++ { ++ width = calculateTabWidth(tabPlacement, i, fm); ++ ++ if (runWidth + width > max) ++ { ++ runWidth = tabAreaInsets.left + insets.left ++ + getTabRunIndent(tabPlacement, ++runs); ++ rects[i] = new Rectangle(runWidth, ++ insets.top + tabAreaInsets.top, ++ width, maxHeight); ++ runWidth += width; ++ if (runs > tabRuns.length - 1) ++ expandTabRunsArray(); ++ tabRuns[runs] = i; ++ } ++ else ++ { ++ rects[i] = new Rectangle(runWidth, ++ insets.top + tabAreaInsets.top, ++ width, maxHeight); ++ runWidth += width; ++ } ++ } ++ runs++; ++ tabAreaRect.width = tabPane.getWidth() - insets.left - insets.right; ++ tabAreaRect.height = runs * maxTabHeight ++ - (runs - 1) * tabRunOverlay ++ + tabAreaInsets.top + tabAreaInsets.bottom; ++ contentRect.width = tabAreaRect.width; ++ contentRect.height = tabPane.getHeight() - insets.top ++ - insets.bottom - tabAreaRect.height; ++ contentRect.x = insets.left; ++ tabAreaRect.x = insets.left; ++ if (tabPlacement == SwingConstants.BOTTOM) ++ { ++ contentRect.y = insets.top; ++ tabAreaRect.y = contentRect.y + contentRect.height; ++ } ++ else ++ { ++ tabAreaRect.y = insets.top; ++ contentRect.y = tabAreaRect.y + tabAreaRect.height; ++ } ++ } ++ else ++ { ++ int maxWidth = calculateMaxTabWidth(tabPlacement); ++ calcRect.height -= tabAreaInsets.top + tabAreaInsets.bottom; ++ max = calcRect.height + tabAreaInsets.top + insets.top; ++ ++ int height = 0; ++ start += tabAreaInsets.top + insets.top; ++ int runHeight = start; ++ ++ int fontHeight = fm.getHeight(); ++ ++ for (int i = 0; i < tabCount; i++) ++ { ++ height = calculateTabHeight(tabPlacement, i, fontHeight); ++ if (runHeight + height > max) ++ { ++ runHeight = tabAreaInsets.top + insets.top ++ + getTabRunIndent(tabPlacement, ++runs); ++ rects[i] = new Rectangle(insets.left + tabAreaInsets.left, ++ runHeight, maxWidth, height); ++ runHeight += height; ++ if (runs > tabRuns.length - 1) ++ expandTabRunsArray(); ++ tabRuns[runs] = i; ++ } ++ else ++ { ++ rects[i] = new Rectangle(insets.left + tabAreaInsets.left, ++ runHeight, maxWidth, height); ++ runHeight += height; ++ } ++ } ++ runs++; ++ ++ tabAreaRect.width = runs * maxTabWidth - (runs - 1) * tabRunOverlay ++ + tabAreaInsets.left + tabAreaInsets.right; ++ tabAreaRect.height = tabPane.getHeight() - insets.top ++ - insets.bottom; ++ tabAreaRect.y = insets.top; ++ contentRect.width = tabPane.getWidth() - insets.left - insets.right ++ - tabAreaRect.width; ++ contentRect.height = tabAreaRect.height; ++ contentRect.y = insets.top; ++ if (tabPlacement == SwingConstants.LEFT) ++ { ++ tabAreaRect.x = insets.left; ++ contentRect.x = tabAreaRect.x + tabAreaRect.width; ++ } ++ else ++ { ++ contentRect.x = insets.left; ++ tabAreaRect.x = contentRect.x + contentRect.width; ++ } ++ } ++ runCount = runs; ++ ++ tabRuns[0] = 0; ++ normalizeTabRuns(tabPlacement, tabCount, start, max); ++ selectedRun = getRunForTab(tabCount, tabPane.getSelectedIndex()); ++ if (shouldRotateTabRuns(tabPlacement)) ++ rotateTabRuns(tabPlacement, selectedRun); ++ ++ // Need to pad the runs and move them to the correct location. ++ for (int i = 0; i < runCount; i++) ++ { ++ int first = lastTabInRun(tabCount, getPreviousTabRun(i)) + 1; ++ if (first == tabCount) ++ first = 0; ++ int last = lastTabInRun(tabCount, i); ++ if (shouldPadTabRun(tabPlacement, i)) ++ padTabRun(tabPlacement, first, last, max); ++ ++ // Done padding, now need to move it. ++ if (tabPlacement == SwingConstants.TOP && i > 0) ++ { ++ for (int j = first; j <= last; j++) ++ rects[j].y += (runCount - i) * maxTabHeight ++ + (runCount - i) * tabRunOverlay; ++ } ++ ++ if (tabPlacement == SwingConstants.BOTTOM) ++ { ++ int height = tabPane.getBounds().height - insets.bottom ++ - tabAreaInsets.bottom; ++ int adjustment; ++ if (i == 0) ++ adjustment = height - maxTabHeight; ++ else ++ adjustment = height - (runCount - i + 1) * maxTabHeight ++ - (runCount - i) * tabRunOverlay; ++ ++ for (int j = first; j <= last; j++) ++ rects[j].y = adjustment; ++ } ++ ++ if (tabPlacement == SwingConstants.LEFT && i > 0) ++ { ++ for (int j = first; j <= last; j++) ++ rects[j].x += (runCount - i) * maxTabWidth ++ - (runCount - i) * tabRunOverlay; ++ } ++ ++ if (tabPlacement == SwingConstants.RIGHT) ++ { ++ int width = tabPane.getBounds().width - insets.right ++ - tabAreaInsets.right; ++ int adjustment; ++ if (i == 0) ++ adjustment = width - maxTabWidth; ++ else ++ adjustment = width - (runCount - i + 1) * maxTabWidth ++ + (runCount - i) * tabRunOverlay; ++ ++ for (int j = first; j <= last; j++) ++ rects[j].x = adjustment; ++ } ++ } ++ padSelectedTab(tabPlacement, tabPane.getSelectedIndex()); ++ } ++ ++ /** ++ * This method is called when the JTabbedPane is laid out in ++ * WRAP_TAB_LAYOUT. It calls calculateLayoutInfo to find the positions ++ * of all its components. ++ * ++ * @param parent The Container to lay out. ++ */ ++ public void layoutContainer(Container parent) ++ { ++ calculateLayoutInfo(); ++ } ++ ++ /** ++ * This method returns the minimum layout size for the given container. ++ * ++ * @param parent The container that is being sized. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return calculateSize(false); ++ } ++ ++ // If there is more free space in an adjacent run AND the tab in the run can fit in the ++ // adjacent run, move it. This method is not perfect, it is merely an approximation. ++ // If you play around with Sun's JTabbedPane, you'll see that ++ // it does do some pretty strange things with regards to not moving tabs ++ // that should be moved. ++ // start = the x position where the tabs will begin ++ // max = the maximum position of where the tabs can go to (tabAreaInsets.left + the width of the tab area) ++ ++ /** ++ * This method tries to "even out" the number of tabs in each run based on ++ * their widths. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabCount The number of tabs. ++ * @param start The x position where the tabs will begin. ++ * @param max The maximum x position where the tab can run to. ++ */ ++ protected void normalizeTabRuns(int tabPlacement, int tabCount, int start, ++ int max) ++ { ++ Insets tabAreaInsets = getTabAreaInsets(tabPlacement); ++ if (tabPlacement == SwingUtilities.TOP ++ || tabPlacement == SwingUtilities.BOTTOM) ++ { ++ // We should only do this for runCount - 1, cause we can only shift that many times between ++ // runs. ++ for (int i = 1; i < runCount; i++) ++ { ++ Rectangle currRun = rects[lastTabInRun(tabCount, i)]; ++ Rectangle nextRun = rects[lastTabInRun(tabCount, getNextTabRun(i))]; ++ int spaceInCurr = currRun.x + currRun.width; ++ int spaceInNext = nextRun.x + nextRun.width; ++ ++ int diffNow = spaceInCurr - spaceInNext; ++ int diffLater = (spaceInCurr - currRun.width) ++ - (spaceInNext + currRun.width); ++ while (Math.abs(diffLater) < Math.abs(diffNow) ++ && spaceInNext + currRun.width < max) ++ { ++ tabRuns[i]--; ++ spaceInNext += currRun.width; ++ spaceInCurr -= currRun.width; ++ currRun = rects[lastTabInRun(tabCount, i)]; ++ diffNow = spaceInCurr - spaceInNext; ++ diffLater = (spaceInCurr - currRun.width) ++ - (spaceInNext + currRun.width); ++ } ++ ++ // Fix the bounds. ++ int first = lastTabInRun(tabCount, i) + 1; ++ int last = lastTabInRun(tabCount, getNextTabRun(i)); ++ int currX = tabAreaInsets.left; ++ for (int j = first; j <= last; j++) ++ { ++ rects[j].x = currX; ++ currX += rects[j].width; ++ } ++ } ++ } ++ else ++ { ++ for (int i = 1; i < runCount; i++) ++ { ++ Rectangle currRun = rects[lastTabInRun(tabCount, i)]; ++ Rectangle nextRun = rects[lastTabInRun(tabCount, getNextTabRun(i))]; ++ int spaceInCurr = currRun.y + currRun.height; ++ int spaceInNext = nextRun.y + nextRun.height; ++ ++ int diffNow = spaceInCurr - spaceInNext; ++ int diffLater = (spaceInCurr - currRun.height) ++ - (spaceInNext + currRun.height); ++ while (Math.abs(diffLater) < Math.abs(diffNow) ++ && spaceInNext + currRun.height < max) ++ { ++ tabRuns[i]--; ++ spaceInNext += currRun.height; ++ spaceInCurr -= currRun.height; ++ currRun = rects[lastTabInRun(tabCount, i)]; ++ diffNow = spaceInCurr - spaceInNext; ++ diffLater = (spaceInCurr - currRun.height) ++ - (spaceInNext + currRun.height); ++ } ++ ++ int first = lastTabInRun(tabCount, i) + 1; ++ int last = lastTabInRun(tabCount, getNextTabRun(i)); ++ int currY = tabAreaInsets.top; ++ for (int j = first; j <= last; j++) ++ { ++ rects[j].y = currY; ++ currY += rects[j].height; ++ } ++ } ++ } ++ } ++ ++ /** ++ * This method pads the tab at the selected index by the selected tab pad ++ * insets (so that it looks larger). ++ * ++ * @param tabPlacement The placement of the tabs. ++ * @param selectedIndex The selected index. ++ */ ++ protected void padSelectedTab(int tabPlacement, int selectedIndex) ++ { ++ Insets insets = getSelectedTabPadInsets(tabPlacement); ++ rects[selectedIndex].x -= insets.left; ++ rects[selectedIndex].y -= insets.top; ++ rects[selectedIndex].width += insets.left + insets.right; ++ rects[selectedIndex].height += insets.top + insets.bottom; ++ } ++ ++ // If the tabs on the run don't fill the width of the window, make it fit now. ++ // start = starting index of the run ++ // end = last index of the run ++ // max = tabAreaInsets.left + width (or equivalent) ++ // assert start <= end. ++ ++ /** ++ * This method makes each tab in the run larger so that the tabs expand ++ * to fill the runs width/height (depending on tabPlacement). ++ * ++ * @param tabPlacement The placement of the tabs. ++ * @param start The index of the first tab. ++ * @param end The last index of the tab ++ * @param max The amount of space in the run (width for TOP and BOTTOM ++ * tabPlacement). ++ */ ++ protected void padTabRun(int tabPlacement, int start, int end, int max) ++ { ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ int runWidth = rects[end].x + rects[end].width; ++ int spaceRemaining = max - runWidth; ++ int numTabs = end - start + 1; ++ ++ // now divvy up the space. ++ int spaceAllocated = spaceRemaining / numTabs; ++ int currX = rects[start].x; ++ for (int i = start; i <= end; i++) ++ { ++ rects[i].x = currX; ++ rects[i].width += spaceAllocated; ++ currX += rects[i].width; ++ // This is used because since the spaceAllocated ++ // variable is an int, it rounds down. Sometimes, ++ // we don't fill an entire row, so we make it do ++ // so now. ++ if (i == end && rects[i].x + rects[i].width != max) ++ rects[i].width = max - rects[i].x; ++ } ++ } ++ else ++ { ++ int runHeight = rects[end].y + rects[end].height; ++ int spaceRemaining = max - runHeight; ++ int numTabs = end - start + 1; ++ ++ int spaceAllocated = spaceRemaining / numTabs; ++ int currY = rects[start].y; ++ for (int i = start; i <= end; i++) ++ { ++ rects[i].y = currY; ++ rects[i].height += spaceAllocated; ++ currY += rects[i].height; ++ if (i == end && rects[i].y + rects[i].height != max) ++ rects[i].height = max - rects[i].y; ++ } ++ } + } +- + +- public Rectangle getTabBounds(JTabbedPane pane, int index) ++ /** ++ * This method returns the preferred layout size for the given container. ++ * ++ * @param parent The container to size. ++ * ++ * @return The preferred layout size. ++ */ ++ public Dimension preferredLayoutSize(Container parent) + { +- return null; ++ return calculateSize(false); + } + +- public int getTabRunCount(JTabbedPane pane) ++ /** ++ * This method returns the preferred tab height given a tabPlacement and ++ * width. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param width The expected width. ++ * ++ * @return The preferred tab area height. ++ */ ++ protected int preferredTabAreaHeight(int tabPlacement, int width) + { +- return 0; ++ if (tabPane.getTabCount() == 0) ++ return calculateTabAreaHeight(tabPlacement, 0, 0); ++ ++ int runs = 0; ++ int runWidth = 0; ++ int tabWidth = 0; ++ ++ FontMetrics fm = getFontMetrics(); ++ ++ Insets tabAreaInsets = getTabAreaInsets(tabPlacement); ++ Insets insets = tabPane.getInsets(); ++ ++ // Only interested in width, this is a messed up rectangle now. ++ width -= tabAreaInsets.left + tabAreaInsets.right + insets.left ++ + insets.right; ++ ++ // The reason why we can't use runCount: ++ // This method is only called to calculate the size request ++ // for the tabbedPane. However, this size request is dependent on ++ // our desired width. We need to find out what the height would ++ // be IF we got our desired width. ++ for (int i = 0; i < tabPane.getTabCount(); i++) ++ { ++ tabWidth = calculateTabWidth(tabPlacement, i, fm); ++ if (runWidth + tabWidth > width) ++ { ++ runWidth = tabWidth; ++ runs++; ++ } ++ else ++ runWidth += tabWidth; ++ } ++ runs++; ++ ++ int maxTabHeight = calculateMaxTabHeight(tabPlacement); ++ int tabAreaHeight = calculateTabAreaHeight(tabPlacement, runs, ++ maxTabHeight); ++ return tabAreaHeight; + } + +- public int tabForCoordinate(JTabbedPane pane, int x, int y) ++ /** ++ * This method calculates the preferred tab area width given a tab ++ * placement and height. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param height The expected height. ++ * ++ * @return The preferred tab area width. ++ */ ++ protected int preferredTabAreaWidth(int tabPlacement, int height) + { +- return 0; ++ if (tabPane.getTabCount() == 0) ++ return calculateTabAreaHeight(tabPlacement, 0, 0); ++ ++ int runs = 0; ++ int runHeight = 0; ++ int tabHeight = 0; ++ ++ FontMetrics fm = getFontMetrics(); ++ ++ Insets tabAreaInsets = getTabAreaInsets(tabPlacement); ++ Insets insets = tabPane.getInsets(); ++ ++ height -= tabAreaInsets.top + tabAreaInsets.bottom + insets.top ++ + insets.bottom; ++ int fontHeight = fm.getHeight(); ++ ++ for (int i = 0; i < tabPane.getTabCount(); i++) ++ { ++ tabHeight = calculateTabHeight(tabPlacement, i, fontHeight); ++ if (runHeight + tabHeight > height) ++ { ++ runHeight = tabHeight; ++ runs++; ++ } ++ else ++ runHeight += tabHeight; ++ } ++ runs++; ++ ++ int maxTabWidth = calculateMaxTabWidth(tabPlacement); ++ int tabAreaWidth = calculateTabAreaWidth(tabPlacement, runs, maxTabWidth); ++ return tabAreaWidth; + } ++ ++ /** ++ * This method rotates the places each run in the correct place the ++ * tabRuns array. See the comment for tabRuns for how the runs are placed ++ * in the array. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedRun The run the current selection is in. ++ */ ++ protected void rotateTabRuns(int tabPlacement, int selectedRun) ++ { ++ if (selectedRun == 1 || selectedRun == -1) ++ return; ++ int[] newTabRuns = new int[tabRuns.length]; ++ int currentRun = selectedRun; ++ int i = 1; ++ do ++ { ++ newTabRuns[i] = tabRuns[currentRun]; ++ currentRun = getNextTabRun(currentRun); ++ i++; ++ } ++ while (i < runCount); ++ if (runCount > 1) ++ newTabRuns[0] = tabRuns[currentRun]; ++ ++ tabRuns = newTabRuns; ++ BasicTabbedPaneUI.this.selectedRun = 1; ++ } ++ ++ /** ++ * This method is called when a component is removed from the ++ * JTabbedPane. ++ * ++ * @param comp The component removed. ++ */ ++ public void removeLayoutComponent(Component comp) ++ { ++ // Do nothing. ++ } ++ } ++ ++ /** ++ * This class acts as the LayoutManager for the JTabbedPane in ++ * SCROLL_TAB_MODE. ++ */ ++ private class TabbedPaneScrollLayout extends TabbedPaneLayout ++ { ++ /** ++ * This method returns the preferred layout size for the given container. ++ * ++ * @param parent The container to calculate a size for. ++ * ++ * @return The preferred layout size. ++ */ ++ public Dimension preferredLayoutSize(Container parent) ++ { ++ return super.calculateSize(true); ++ } ++ ++ /** ++ * This method returns the minimum layout size for the given container. ++ * ++ * @param parent The container to calculate a size for. ++ * ++ * @return The minimum layout size. ++ */ ++ public Dimension minimumLayoutSize(Container parent) ++ { ++ return super.calculateSize(true); ++ } ++ ++ /** ++ * This method calculates the tab area height given a desired width. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param width The expected width. ++ * ++ * @return The tab area height given the width. ++ */ ++ protected int preferredTabAreaHeight(int tabPlacement, int width) ++ { ++ if (tabPane.getTabCount() == 0) ++ return calculateTabAreaHeight(tabPlacement, 0, 0); ++ ++ int runs = 1; ++ ++ int maxTabHeight = calculateMaxTabHeight(tabPlacement); ++ int tabAreaHeight = calculateTabAreaHeight(tabPlacement, runs, ++ maxTabHeight); ++ return tabAreaHeight; ++ } ++ ++ /** ++ * This method calculates the tab area width given a desired height. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param height The expected height. ++ * ++ * @return The tab area width given the height. ++ */ ++ protected int preferredTabAreaWidth(int tabPlacement, int height) ++ { ++ if (tabPane.getTabCount() == 0) ++ return calculateTabAreaHeight(tabPlacement, 0, 0); ++ ++ int runs = 1; ++ ++ int maxTabWidth = calculateMaxTabWidth(tabPlacement); ++ int tabAreaWidth = calculateTabAreaWidth(tabPlacement, runs, maxTabWidth); ++ return tabAreaWidth; ++ } ++ ++ /** ++ * This method is called to calculate the tab rectangles. This method ++ * will calculate the size and position of all rectangles (taking into ++ * account which ones should be in which tab run). It will pad them and ++ * normalize them as necessary. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabCount The number of tabs. ++ */ ++ protected void calculateTabRects(int tabPlacement, int tabCount) ++ { ++ if (tabCount == 0) ++ return; ++ assureRectsCreated(tabCount); ++ ++ FontMetrics fm = getFontMetrics(); ++ SwingUtilities.calculateInnerArea(tabPane, calcRect); ++ Insets tabAreaInsets = getTabAreaInsets(tabPlacement); ++ Insets insets = tabPane.getInsets(); ++ int max = 0; ++ int runs = 1; ++ int start = 0; ++ int top = 0; ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ int maxHeight = calculateMaxTabHeight(tabPlacement); ++ calcRect.width -= tabAreaInsets.left + tabAreaInsets.right; ++ max = calcRect.width + tabAreaInsets.left + insets.left; ++ start = tabAreaInsets.left + insets.left; ++ int width = 0; ++ int runWidth = start; ++ top = insets.top + tabAreaInsets.top; ++ for (int i = 0; i < tabCount; i++) ++ { ++ width = calculateTabWidth(tabPlacement, i, fm); ++ ++ rects[i] = new Rectangle(runWidth, top, width, maxHeight); ++ runWidth += width; ++ } ++ tabAreaRect.width = tabPane.getWidth() - insets.left - insets.right; ++ tabAreaRect.height = runs * maxTabHeight ++ - (runs - 1) * tabRunOverlay ++ + tabAreaInsets.top + tabAreaInsets.bottom; ++ contentRect.width = tabAreaRect.width; ++ contentRect.height = tabPane.getHeight() - insets.top ++ - insets.bottom - tabAreaRect.height; ++ contentRect.x = insets.left; ++ tabAreaRect.x = insets.left; ++ if (tabPlacement == SwingConstants.BOTTOM) ++ { ++ contentRect.y = insets.top; ++ tabAreaRect.y = contentRect.y + contentRect.height; ++ } ++ else ++ { ++ tabAreaRect.y = insets.top; ++ contentRect.y = tabAreaRect.y + tabAreaRect.height; ++ } ++ } ++ else ++ { ++ int maxWidth = calculateMaxTabWidth(tabPlacement); ++ ++ calcRect.height -= tabAreaInsets.top + tabAreaInsets.bottom; ++ max = calcRect.height + tabAreaInsets.top; ++ int height = 0; ++ start = tabAreaInsets.top + insets.top; ++ int runHeight = start; ++ int fontHeight = fm.getHeight(); ++ top = insets.left + tabAreaInsets.left; ++ for (int i = 0; i < tabCount; i++) ++ { ++ height = calculateTabHeight(tabPlacement, i, fontHeight); ++ rects[i] = new Rectangle(top, runHeight, maxWidth, height); ++ runHeight += height; ++ } ++ tabAreaRect.width = runs * maxTabWidth - (runs - 1) * tabRunOverlay ++ + tabAreaInsets.left + tabAreaInsets.right; ++ tabAreaRect.height = tabPane.getHeight() - insets.top ++ - insets.bottom; ++ tabAreaRect.y = insets.top; ++ contentRect.width = tabPane.getWidth() - insets.left - insets.right ++ - tabAreaRect.width; ++ contentRect.height = tabAreaRect.height; ++ contentRect.y = insets.top; ++ if (tabPlacement == SwingConstants.LEFT) ++ { ++ tabAreaRect.x = insets.left; ++ contentRect.x = tabAreaRect.x + tabAreaRect.width; ++ } ++ else ++ { ++ contentRect.x = insets.left; ++ tabAreaRect.x = contentRect.x + contentRect.width; ++ } ++ } ++ runCount = runs; ++ ++ padSelectedTab(tabPlacement, tabPane.getSelectedIndex()); ++ } ++ ++ /** ++ * This method is called when the JTabbedPane is laid out in ++ * SCROLL_TAB_LAYOUT. It finds the position for all components in the ++ * JTabbedPane. ++ * ++ * @param pane The JTabbedPane to be laid out. ++ */ ++ public void layoutContainer(Container pane) ++ { ++ super.layoutContainer(pane); ++ int tabCount = tabPane.getTabCount(); ++ if (tabCount == 0) ++ return; ++ int tabPlacement = tabPane.getTabPlacement(); ++ incrButton.hide(); ++ decrButton.hide(); ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ if (tabAreaRect.x + tabAreaRect.width < rects[tabCount - 1].x ++ + rects[tabCount - 1].width) ++ { ++ Dimension incrDims = incrButton.getPreferredSize(); ++ Dimension decrDims = decrButton.getPreferredSize(); ++ ++ decrButton.setBounds(tabAreaRect.x + tabAreaRect.width ++ - incrDims.width - decrDims.width, ++ tabAreaRect.y, decrDims.width, ++ tabAreaRect.height); ++ incrButton.setBounds(tabAreaRect.x + tabAreaRect.width ++ - incrDims.width, tabAreaRect.y, ++ decrDims.width, tabAreaRect.height); ++ ++ tabAreaRect.width -= decrDims.width + incrDims.width; ++ incrButton.show(); ++ decrButton.show(); ++ } ++ } ++ ++ if (tabPlacement == SwingConstants.LEFT ++ || tabPlacement == SwingConstants.RIGHT) ++ { ++ if (tabAreaRect.y + tabAreaRect.height < rects[tabCount - 1].y ++ + rects[tabCount - 1].height) ++ { ++ Dimension incrDims = incrButton.getPreferredSize(); ++ Dimension decrDims = decrButton.getPreferredSize(); ++ ++ decrButton.setBounds(tabAreaRect.x, ++ tabAreaRect.y + tabAreaRect.height ++ - incrDims.height - decrDims.height, ++ tabAreaRect.width, decrDims.height); ++ incrButton.setBounds(tabAreaRect.x, ++ tabAreaRect.y + tabAreaRect.height ++ - incrDims.height, tabAreaRect.width, ++ incrDims.height); ++ ++ tabAreaRect.height -= decrDims.height + incrDims.height; ++ incrButton.show(); ++ decrButton.show(); ++ } ++ } ++ viewport.setBounds(tabAreaRect.x, tabAreaRect.y, tabAreaRect.width, ++ tabAreaRect.height); ++ int tabC = tabPane.getTabCount() - 1; ++ if (tabCount > 0) ++ { ++ int w = Math.max(rects[tabC].width + rects[tabC].x, tabAreaRect.width); ++ int h = Math.max(rects[tabC].height, tabAreaRect.height); ++ Point p = findPointForIndex(currentScrollLocation); ++ ++ // we want to cover that entire space so that borders that run under ++ // the tab area don't show up when we move the viewport around. ++ panel.setSize(w + p.x, h + p.y); ++ } ++ viewport.setViewPosition(findPointForIndex(currentScrollLocation)); ++ } ++ } ++ ++ /** ++ * This class handles ChangeEvents from the JTabbedPane. ++ */ ++ protected class TabSelectionHandler implements ChangeListener ++ { ++ /** ++ * This method is called whenever a ChangeEvent is fired from the ++ * JTabbedPane. ++ * ++ * @param e The ChangeEvent fired. ++ */ ++ public void stateChanged(ChangeEvent e) ++ { ++ selectedRun = getRunForTab(tabPane.getTabCount(), ++ tabPane.getSelectedIndex()); ++ tabPane.revalidate(); ++ tabPane.repaint(); ++ } ++ } ++ ++ /** ++ * This helper class is a JPanel that fits inside the ScrollViewport. This ++ * panel's sole job is to paint the tab rectangles inside the viewport so ++ * that it's clipped correctly. ++ */ ++ private class ScrollingPanel extends JPanel ++ { ++ /** ++ * This is a private UI class for our panel. ++ */ ++ private class ScrollingPanelUI extends BasicPanelUI ++ { ++ /** ++ * This method overrides the default paint method. It paints the tab ++ * rectangles for the JTabbedPane in the panel. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ paintTabArea(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex()); ++ } ++ } ++ ++ /** ++ * This method overrides the updateUI method. It makes the default UI for ++ * this ScrollingPanel to be a ScrollingPanelUI. ++ */ ++ public void updateUI() ++ { ++ setUI((PanelUI) new ScrollingPanelUI()); ++ } ++ } ++ ++ /** ++ * This is a helper class that paints the panel that paints tabs. This ++ * custom JViewport is used so that the tabs painted in the panel will be ++ * clipped. This class implements UIResource so tabs are not added when ++ * this objects of this class are added to the JTabbedPane. ++ */ ++ private class ScrollingViewport extends JViewport implements UIResource ++ { ++ } ++ ++ /** ++ * This is a helper class that implements UIResource so it is not added as a ++ * tab when an object of this class is added to the JTabbedPane. ++ */ ++ private static class ScrollingButton extends BasicArrowButton ++ implements UIResource ++ { ++ /** ++ * Creates a ScrollingButton given the direction. ++ * ++ * @param dir The direction to point in. ++ */ ++ public ScrollingButton(int dir) ++ { ++ super(dir); ++ } ++ } ++ ++ /** The button that increments the current scroll location. */ ++ private transient ScrollingButton incrButton; ++ ++ /** The button that decrements the current scroll location. */ ++ private transient ScrollingButton decrButton; ++ ++ /** The viewport used to display the tabs. */ ++ private transient ScrollingViewport viewport; ++ ++ /** The panel inside the viewport that paints the tabs. */ ++ private transient ScrollingPanel panel; ++ ++ /** The starting visible tab in the run in SCROLL_TAB_MODE. */ ++ private transient int currentScrollLocation; ++ ++ /** A reusable rectangle. */ ++ protected Rectangle calcRect; ++ ++ /** An array of Rectangles keeping track of the tabs' area and position. */ ++ protected Rectangle[] rects; ++ ++ /** The insets around the content area. */ ++ protected Insets contentBorderInsets; ++ ++ /** The extra insets around the selected tab. */ ++ protected Insets selectedTabPadInsets; ++ ++ /** The insets around the tab area. */ ++ protected Insets tabAreaInsets; ++ ++ /** The insets around each and every tab. */ ++ protected Insets tabInsets; ++ ++ /** ++ * The outer bottom and right edge color for both the tab and content ++ * border. ++ */ ++ protected Color darkShadow; ++ ++ /** The color of the focus outline on the selected tab. */ ++ protected Color focus; ++ ++ /** FIXME: find a use for this. */ ++ protected Color highlight; ++ ++ /** The top and left edge color for both the tab and content border. */ ++ protected Color lightHighlight; ++ ++ /** The inner bottom and right edge color for the tab and content border. */ ++ protected Color shadow; ++ ++ /** The maximum tab height. */ ++ protected int maxTabHeight; ++ ++ /** The maximum tab width. */ ++ protected int maxTabWidth; ++ ++ /** The number of runs in the JTabbedPane. */ ++ protected int runCount; ++ ++ /** The index of the run that the selected index is in. */ ++ protected int selectedRun; ++ ++ /** The amount of space each run overlaps the previous by. */ ++ protected int tabRunOverlay; ++ ++ /** The gap between text and label */ ++ protected int textIconGap; ++ ++ // Keeps track of tab runs. ++ // The organization of this array is as follows (lots of experimentation to ++ // figure this out) ++ // index 0 = furthest away from the component area (aka outer run) ++ // index 1 = closest to component area (aka selected run) ++ // index > 1 = listed in order leading from selected run to outer run. ++ // each int in the array is the tab index + 1 (counting starts at 1) ++ // for the last tab in the run. (same as the rects array) ++ ++ /** This array keeps track of which tabs are in which run. See above. */ ++ protected int[] tabRuns; ++ ++ /** Deprecated. This is the keystroke for moving down. */ ++ protected KeyStroke downKey; ++ ++ /** Deprecated. This is the keystroke for moving left. */ ++ protected KeyStroke leftKey; ++ ++ /** Deprecated. This is the keystroke for moving right. */ ++ protected KeyStroke rightKey; ++ ++ /** Deprecated. This is the keystroke for moving up. */ ++ protected KeyStroke upKey; ++ ++ /** The listener that listens for focus events. */ ++ protected FocusListener focusListener; ++ ++ /** The listener that listens for mouse events. */ ++ protected MouseListener mouseListener; ++ ++ /** The listener that listens for property change events. */ ++ protected PropertyChangeListener propertyChangeListener; ++ ++ /** The listener that listens for change events. */ ++ protected ChangeListener tabChangeListener; ++ ++ /** The tab pane that this UI paints. */ ++ protected JTabbedPane tabPane; ++ ++ /** The current layout manager for the tabPane. */ ++ private transient LayoutManager layoutManager; ++ ++ /** The rectangle that describes the tab area's position and size. */ ++ private transient Rectangle tabAreaRect; ++ ++ /** The rectangle that describes the content area's position and size. */ ++ private transient Rectangle contentRect; ++ ++ /** ++ * Creates a new BasicTabbedPaneUI object. ++ */ ++ public BasicTabbedPaneUI() ++ { ++ super(); ++ } ++ ++ /** ++ * This method creates a ScrollingButton that points in the appropriate ++ * direction for an increasing button. ++ * ++ * @return The increase ScrollingButton. ++ */ ++ private ScrollingButton createIncreaseButton() ++ { ++ if (incrButton == null) ++ incrButton = new ScrollingButton(SwingConstants.NORTH); ++ if (tabPane.getTabPlacement() == SwingConstants.TOP ++ || tabPane.getTabPlacement() == SwingConstants.BOTTOM) ++ incrButton.setDirection(SwingConstants.EAST); ++ else ++ incrButton.setDirection(SwingConstants.SOUTH); ++ return incrButton; ++ } ++ ++ /** ++ * This method creates a ScrollingButton that points in the appropriate ++ * direction for a decreasing button. ++ * ++ * @return The decrease ScrollingButton. ++ */ ++ private ScrollingButton createDecreaseButton() ++ { ++ if (decrButton == null) ++ decrButton = new ScrollingButton(SwingConstants.SOUTH); ++ if (tabPane.getTabPlacement() == SwingConstants.TOP ++ || tabPane.getTabPlacement() == SwingConstants.BOTTOM) ++ decrButton.setDirection(SwingConstants.WEST); ++ else ++ decrButton.setDirection(SwingConstants.NORTH); ++ return decrButton; ++ } ++ ++ /** ++ * This method finds the point to set the view position at given the index ++ * of a tab. The tab will be the first visible tab in the run. ++ * ++ * @param index The index of the first visible tab. ++ * ++ * @return The position of the first visible tab. ++ */ ++ private Point findPointForIndex(int index) ++ { ++ int tabPlacement = tabPane.getTabPlacement(); ++ int selectedIndex = tabPane.getSelectedIndex(); ++ Insets insets = getSelectedTabPadInsets(tabPlacement); ++ int w = 0; ++ int h = 0; ++ ++ if (tabPlacement == TOP || tabPlacement == BOTTOM) ++ { ++ if (index > 0) ++ { ++ w += rects[index - 1].x + rects[index - 1].width; ++ if (index > selectedIndex) ++ w -= insets.left + insets.right; ++ } ++ } ++ ++ else ++ { ++ if (index > 0) ++ { ++ h += rects[index - 1].y + rects[index - 1].height; ++ if (index > selectedIndex) ++ h -= insets.top + insets.bottom; ++ } ++ } ++ ++ Point p = new Point(w, h); ++ return p; ++ } ++ ++ /** ++ * This method creates a new BasicTabbedPaneUI. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A new BasicTabbedPaneUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicTabbedPaneUI(); ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install the UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ if (c instanceof JTabbedPane) ++ { ++ tabPane = (JTabbedPane) c; ++ ++ installComponents(); ++ installDefaults(); ++ installListeners(); ++ installKeyboardActions(); ++ ++ layoutManager = createLayoutManager(); ++ tabPane.setLayout(layoutManager); ++ tabPane.layout(); ++ } ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. ++ * ++ * @param c The JComponent to uninstall the UI for. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ layoutManager = null; ++ ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallDefaults(); ++ uninstallComponents(); ++ ++ tabPane = null; ++ } ++ ++ /** ++ * This method creates the appropriate layout manager for the JTabbedPane's ++ * current tab layout policy. If the tab layout policy is ++ * SCROLL_TAB_LAYOUT, then all the associated components that need to be ++ * created will be done so now. ++ * ++ * @return A layout manager given the tab layout policy. ++ */ ++ public LayoutManager createLayoutManager() ++ { ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT) ++ return new TabbedPaneLayout(); ++ else ++ { ++ incrButton = createIncreaseButton(); ++ decrButton = createDecreaseButton(); ++ viewport = new ScrollingViewport(); ++ panel = new ScrollingPanel(); ++ viewport.setView(panel); ++ tabPane.add(incrButton); ++ tabPane.add(decrButton); ++ tabPane.add(viewport); ++ currentScrollLocation = 0; ++ decrButton.setEnabled(false); ++ panel.addMouseListener(mouseListener); ++ incrButton.addMouseListener(mouseListener); ++ decrButton.addMouseListener(mouseListener); ++ viewport.setBackground(Color.LIGHT_GRAY); ++ ++ return new TabbedPaneScrollLayout(); ++ } ++ } ++ ++ /** ++ * This method installs components for this JTabbedPane. ++ */ ++ protected void installComponents() ++ { ++ // Nothing to be done. ++ } ++ ++ /** ++ * This method uninstalls components for this JTabbedPane. ++ */ ++ protected void uninstallComponents() ++ { ++ // Nothing to be done. ++ } ++ ++ /** ++ * This method installs defaults for the Look and Feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ tabPane.setFont(defaults.getFont("TabbedPane.font")); ++ tabPane.setForeground(defaults.getColor("TabbedPane.foreground")); ++ tabPane.setBackground(defaults.getColor("TabbedPane.background")); ++ tabPane.setOpaque(true); ++ ++ highlight = defaults.getColor("TabbedPane.highlight"); ++ lightHighlight = defaults.getColor("TabbedPane.lightHighlight"); ++ ++ shadow = defaults.getColor("TabbedPane.shadow"); ++ darkShadow = defaults.getColor("TabbedPane.darkShadow"); ++ ++ focus = defaults.getColor("TabbedPane.focus"); ++ ++ textIconGap = defaults.getInt("TabbedPane.textIconGap"); ++ tabRunOverlay = defaults.getInt("TabbedPane.tabRunOverlay"); ++ ++ tabInsets = defaults.getInsets("TabbedPane.tabbedPaneTabInsets"); ++ selectedTabPadInsets = defaults.getInsets("TabbedPane.tabbedPaneTabPadInsets"); ++ tabAreaInsets = defaults.getInsets("TabbedPane.tabbedPaneTabAreaInsets"); ++ contentBorderInsets = defaults.getInsets("TabbedPane.tabbedPaneContentBorderInsets"); ++ ++ calcRect = new Rectangle(); ++ tabRuns = new int[10]; ++ tabAreaRect = new Rectangle(); ++ contentRect = new Rectangle(); ++ } ++ ++ /** ++ * This method uninstalls defaults for the Look and Feel. ++ */ ++ protected void uninstallDefaults() ++ { ++ calcRect = null; ++ tabAreaRect = null; ++ contentRect = null; ++ tabRuns = null; ++ ++ contentBorderInsets = null; ++ tabAreaInsets = null; ++ selectedTabPadInsets = null; ++ tabInsets = null; ++ ++ focus = null; ++ darkShadow = null; ++ shadow = null; ++ lightHighlight = null; ++ highlight = null; ++ ++ tabPane.setBackground(null); ++ tabPane.setForeground(null); ++ tabPane.setFont(null); ++ } ++ ++ /** ++ * This method creates and installs the listeners for this UI. ++ */ ++ protected void installListeners() ++ { ++ mouseListener = createMouseListener(); ++ tabChangeListener = createChangeListener(); ++ propertyChangeListener = createPropertyChangeListener(); ++ focusListener = createFocusListener(); ++ ++ tabPane.addMouseListener(mouseListener); ++ tabPane.addChangeListener(tabChangeListener); ++ tabPane.addPropertyChangeListener(propertyChangeListener); ++ tabPane.addFocusListener(focusListener); ++ } ++ ++ /** ++ * This method removes and nulls the listeners for this UI. ++ */ ++ protected void uninstallListeners() ++ { ++ tabPane.removeFocusListener(focusListener); ++ tabPane.removePropertyChangeListener(propertyChangeListener); ++ tabPane.removeChangeListener(tabChangeListener); ++ tabPane.removeMouseListener(mouseListener); ++ ++ focusListener = null; ++ propertyChangeListener = null; ++ tabChangeListener = null; ++ mouseListener = null; ++ } ++ ++ /** ++ * This method creates a new MouseListener. ++ * ++ * @return A new MouseListener. ++ */ ++ protected MouseListener createMouseListener() ++ { ++ return new MouseHandler(); ++ } ++ ++ /** ++ * This method creates a new FocusListener. ++ * ++ * @return A new FocusListener. ++ */ ++ protected FocusListener createFocusListener() ++ { ++ return new FocusHandler(); ++ } ++ ++ /** ++ * This method creates a new ChangeListener. ++ * ++ * @return A new ChangeListener. ++ */ ++ protected ChangeListener createChangeListener() ++ { ++ return new TabSelectionHandler(); ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener. ++ * ++ * @return A new PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyChangeListener() ++ { ++ return new PropertyChangeHandler(); ++ } ++ ++ /** ++ * This method installs keyboard actions for the JTabbedPane. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method uninstalls keyboard actions for the JTabbedPane. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method returns the preferred size of the JTabbedPane. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return layoutManager.preferredLayoutSize(tabPane); ++ } ++ ++ /** ++ * This method returns the minimum size of the JTabbedPane. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return layoutManager.minimumLayoutSize(tabPane); ++ } ++ ++ /** ++ * This method returns the maximum size of the JTabbedPane. ++ * ++ * @param c The JComponent to find a size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method paints the JTabbedPane. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ if (tabPane.getTabCount() == 0) ++ return; ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT) ++ paintTabArea(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex()); ++ paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex()); ++ } ++ ++ /** ++ * This method paints the tab area. This includes painting the rectangles ++ * that make up the tabs. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The selected index. ++ */ ++ protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) ++ { ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ ++ // Please note: the ordering of the painting is important. ++ // we WANT to paint the outermost run first and then work our way in. ++ int tabCount = tabPane.getTabCount(); ++ int currRun = 1; ++ if (tabCount < 1) ++ return; ++ ++ if (runCount > 1) ++ currRun = 0; ++ for (int i = 0; i < runCount; i++) ++ { ++ int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1; ++ if (first == tabCount) ++ first = 0; ++ int last = lastTabInRun(tabCount, currRun); ++ for (int j = first; j <= last; j++) ++ { ++ if (j != selectedIndex) ++ paintTab(g, tabPlacement, rects, j, ir, tr); ++ } ++ currRun = getNextTabRun(currRun); ++ } ++ paintTab(g, tabPlacement, rects, selectedIndex, ir, tr); ++ } ++ ++ /** ++ * This method paints an individual tab. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param rects The array of rectangles that keep the size and position of ++ * the tabs. ++ * @param tabIndex The tab index to paint. ++ * @param iconRect The rectangle to use for the icon. ++ * @param textRect The rectangle to use for the text. ++ */ ++ protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, ++ int tabIndex, Rectangle iconRect, Rectangle textRect) ++ { ++ FontMetrics fm = getFontMetrics(); ++ Icon icon = getIconForTab(tabIndex); ++ String title = tabPane.getTitleAt(tabIndex); ++ boolean isSelected = tabIndex == tabPane.getSelectedIndex(); ++ calcRect = getTabBounds(tabPane, tabIndex); ++ ++ int x = calcRect.x; ++ int y = calcRect.y; ++ int w = calcRect.width; ++ int h = calcRect.height; ++ if (getRunForTab(tabPane.getTabCount(), tabIndex) == 1) ++ { ++ Insets insets = getTabAreaInsets(tabPlacement); ++ switch (tabPlacement) ++ { ++ case TOP: ++ h += insets.bottom; ++ break; ++ case LEFT: ++ w += insets.right; ++ break; ++ case BOTTOM: ++ y -= insets.top; ++ h += insets.top; ++ break; ++ case RIGHT: ++ x -= insets.left; ++ w += insets.left; ++ break; ++ } ++ } ++ ++ layoutLabel(tabPlacement, fm, tabIndex, title, icon, calcRect, iconRect, ++ textRect, isSelected); ++ paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, isSelected); ++ paintTabBorder(g, tabPlacement, tabIndex, x, y, w, h, isSelected); ++ ++ // FIXME: Paint little folding corner and jagged edge clipped tab. ++ if (icon != null) ++ paintIcon(g, tabPlacement, tabIndex, icon, iconRect, isSelected); ++ if (title != null && ! title.equals("")) ++ paintText(g, tabPlacement, tabPane.getFont(), fm, tabIndex, title, ++ textRect, isSelected); ++ } ++ ++ /** ++ * This method lays out the tab and finds the location to paint the icon ++ * and text. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param metrics The font metrics for the font to paint with. ++ * @param tabIndex The tab index to paint. ++ * @param title The string painted. ++ * @param icon The icon painted. ++ * @param tabRect The tab bounds. ++ * @param iconRect The calculated icon bounds. ++ * @param textRect The calculated text bounds. ++ * @param isSelected Whether this tab is selected. ++ */ ++ protected void layoutLabel(int tabPlacement, FontMetrics metrics, ++ int tabIndex, String title, Icon icon, ++ Rectangle tabRect, Rectangle iconRect, ++ Rectangle textRect, boolean isSelected) ++ { ++ SwingUtilities.layoutCompoundLabel(metrics, title, icon, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, tabRect, ++ iconRect, textRect, textIconGap); ++ ++ int shiftX = getTabLabelShiftX(tabPlacement, tabIndex, isSelected); ++ int shiftY = getTabLabelShiftY(tabPlacement, tabIndex, isSelected); ++ ++ iconRect.x += shiftX; ++ iconRect.y += shiftY; ++ ++ textRect.x += shiftX; ++ textRect.y += shiftY; ++ } ++ ++ /** ++ * This method paints the icon. ++ * ++ * @param g The Graphics object to paint. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index to paint. ++ * @param icon The icon to paint. ++ * @param iconRect The bounds of the icon. ++ * @param isSelected Whether this tab is selected. ++ */ ++ protected void paintIcon(Graphics g, int tabPlacement, int tabIndex, ++ Icon icon, Rectangle iconRect, boolean isSelected) ++ { ++ icon.paintIcon(tabPane, g, iconRect.x, iconRect.y); ++ } ++ ++ /** ++ * This method paints the text for the given tab. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param font The font to paint with. ++ * @param metrics The fontmetrics of the given font. ++ * @param tabIndex The tab index. ++ * @param title The string to paint. ++ * @param textRect The bounds of the string. ++ * @param isSelected Whether this tab is selected. ++ */ ++ protected void paintText(Graphics g, int tabPlacement, Font font, ++ FontMetrics metrics, int tabIndex, String title, ++ Rectangle textRect, boolean isSelected) ++ { ++ View textView = getTextViewForTab(tabIndex); ++ if (textView != null) ++ { ++ textView.paint(g, textRect); ++ return; ++ } ++ ++ Color fg = tabPane.getForegroundAt(tabIndex); ++ if (fg == null) ++ fg = tabPane.getForeground(); ++ Color bg = tabPane.getBackgroundAt(tabIndex); ++ if (bg == null) ++ bg = tabPane.getBackground(); ++ ++ Color saved_color = g.getColor(); ++ Font f = g.getFont(); ++ g.setFont(font); ++ ++ if (tabPane.isEnabledAt(tabIndex)) ++ { ++ g.setColor(fg); ++ ++ int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); ++ ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, ++ textRect.x, ++ textRect.y ++ + metrics.getAscent()); ++ else ++ g.drawString(title, textRect.x, textRect.y + metrics.getAscent()); ++ } ++ else ++ { ++ g.setColor(bg.brighter()); ++ ++ int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); ++ ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, ++ textRect.x, textRect.y); ++ else ++ g.drawString(title, textRect.x, textRect.y); ++ ++ g.setColor(bg.darker()); ++ if (mnemIndex != -1) ++ BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, ++ textRect.x + 1, ++ textRect.y + 1); ++ else ++ g.drawString(title, textRect.x + 1, textRect.y + 1); ++ } ++ ++ g.setColor(saved_color); ++ g.setFont(f); ++ } ++ ++ /** ++ * This method returns how much the label for the tab should shift in the X ++ * direction. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index being painted. ++ * @param isSelected Whether this tab is selected. ++ * ++ * @return The amount the label should shift by in the X direction. ++ */ ++ protected int getTabLabelShiftX(int tabPlacement, int tabIndex, ++ boolean isSelected) ++ { ++ // No reason to shift. ++ return 0; ++ } ++ ++ /** ++ * This method returns how much the label for the tab should shift in the Y ++ * direction. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index being painted. ++ * @param isSelected Whether this tab is selected. ++ * ++ * @return The amount the label should shift by in the Y direction. ++ */ ++ protected int getTabLabelShiftY(int tabPlacement, int tabIndex, ++ boolean isSelected) ++ { ++ // No reason to shift. ++ return 0; ++ } ++ ++ /** ++ * This method paints the focus rectangle around the selected tab. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param rects The array of rectangles keeping track of size and position. ++ * @param tabIndex The tab index. ++ * @param iconRect The icon bounds. ++ * @param textRect The text bounds. ++ * @param isSelected Whether this tab is selected. ++ */ ++ protected void paintFocusIndicator(Graphics g, int tabPlacement, ++ Rectangle[] rects, int tabIndex, ++ Rectangle iconRect, Rectangle textRect, ++ boolean isSelected) ++ { ++ Color saved = g.getColor(); ++ calcRect = iconRect.union(textRect); ++ ++ g.setColor(focus); ++ ++ g.drawRect(calcRect.x, calcRect.y, calcRect.width, calcRect.height); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the border for an individual tab. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index. ++ * @param x The x position of the tab. ++ * @param y The y position of the tab. ++ * @param w The width of the tab. ++ * @param h The height of the tab. ++ * @param isSelected Whether the tab is selected. ++ */ ++ protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, ++ int x, int y, int w, int h, boolean isSelected) ++ { ++ Color saved = g.getColor(); ++ ++ if (! isSelected || tabPlacement != SwingConstants.TOP) ++ { ++ g.setColor(shadow); ++ g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1); ++ g.setColor(darkShadow); ++ g.drawLine(x, y + h, x + w, y + h); ++ } ++ ++ if (! isSelected || tabPlacement != SwingConstants.LEFT) ++ { ++ g.setColor(darkShadow); ++ g.drawLine(x + w, y, x + w, y + h); ++ g.setColor(shadow); ++ g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1); ++ } ++ ++ if (! isSelected || tabPlacement != SwingConstants.RIGHT) ++ { ++ g.setColor(lightHighlight); ++ g.drawLine(x, y, x, y + h); ++ } ++ ++ if (! isSelected || tabPlacement != SwingConstants.BOTTOM) ++ { ++ g.setColor(lightHighlight); ++ g.drawLine(x, y, x + w, y); ++ } ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the background for an individual tab. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index. ++ * @param x The x position of the tab. ++ * @param y The y position of the tab. ++ * @param w The width of the tab. ++ * @param h The height of the tab. ++ * @param isSelected Whether the tab is selected. ++ */ ++ protected void paintTabBackground(Graphics g, int tabPlacement, ++ int tabIndex, int x, int y, int w, int h, ++ boolean isSelected) ++ { ++ Color saved = g.getColor(); ++ if (isSelected) ++ g.setColor(Color.LIGHT_GRAY); ++ else ++ { ++ Color bg = tabPane.getBackgroundAt(tabIndex); ++ if (bg == null) ++ bg = tabPane.getBackground(); ++ g.setColor(bg); ++ } ++ ++ g.fillRect(x, y, w, h); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the border around the content area. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The index of the selected tab. ++ */ ++ protected void paintContentBorder(Graphics g, int tabPlacement, ++ int selectedIndex) ++ { ++ Insets insets = getContentBorderInsets(tabPlacement); ++ int x = contentRect.x; ++ int y = contentRect.y; ++ int w = contentRect.width; ++ int h = contentRect.height; ++ paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h); ++ paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h); ++ paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h); ++ paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h); ++ } ++ ++ /** ++ * This method paints the top edge of the content border. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The selected tab index. ++ * @param x The x coordinate for the content area. ++ * @param y The y coordinate for the content area. ++ * @param w The width of the content area. ++ * @param h The height of the content area. ++ */ ++ protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, ++ int selectedIndex, int x, int y, ++ int w, int h) ++ { ++ Color saved = g.getColor(); ++ g.setColor(lightHighlight); ++ ++ int startgap = rects[selectedIndex].x; ++ int endgap = rects[selectedIndex].x + rects[selectedIndex].width; ++ ++ int diff = 0; ++ ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) ++ { ++ Point p = findPointForIndex(currentScrollLocation); ++ diff = p.x; ++ } ++ ++ if (tabPlacement == SwingConstants.TOP) ++ { ++ g.drawLine(x, y, startgap - diff, y); ++ g.drawLine(endgap - diff, y, x + w, y); ++ } ++ else ++ g.drawLine(x, y, x + w, y); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the left edge of the content border. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The selected tab index. ++ * @param x The x coordinate for the content area. ++ * @param y The y coordinate for the content area. ++ * @param w The width of the content area. ++ * @param h The height of the content area. ++ */ ++ protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, ++ int selectedIndex, int x, int y, ++ int w, int h) ++ { ++ Color saved = g.getColor(); ++ g.setColor(lightHighlight); ++ ++ int startgap = rects[selectedIndex].y; ++ int endgap = rects[selectedIndex].y + rects[selectedIndex].height; ++ ++ int diff = 0; ++ ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) ++ { ++ Point p = findPointForIndex(currentScrollLocation); ++ diff = p.y; ++ } ++ ++ if (tabPlacement == SwingConstants.LEFT) ++ { ++ g.drawLine(x, y, x, startgap - diff); ++ g.drawLine(x, endgap - diff, x, y + h); ++ } ++ else ++ g.drawLine(x, y, x, y + h); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the bottom edge of the content border. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The selected tab index. ++ * @param x The x coordinate for the content area. ++ * @param y The y coordinate for the content area. ++ * @param w The width of the content area. ++ * @param h The height of the content area. ++ */ ++ protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, ++ int selectedIndex, int x, int y, ++ int w, int h) ++ { ++ Color saved = g.getColor(); ++ ++ int startgap = rects[selectedIndex].x; ++ int endgap = rects[selectedIndex].x + rects[selectedIndex].width; ++ ++ int diff = 0; ++ ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) ++ { ++ Point p = findPointForIndex(currentScrollLocation); ++ diff = p.x; ++ } ++ ++ if (tabPlacement == SwingConstants.BOTTOM) ++ { ++ g.setColor(shadow); ++ g.drawLine(x + 1, y + h - 1, startgap - diff, y + h - 1); ++ g.drawLine(endgap - diff, y + h - 1, x + w - 1, y + h - 1); ++ ++ g.setColor(darkShadow); ++ g.drawLine(x, y + h, startgap - diff, y + h); ++ g.drawLine(endgap - diff, y + h, x + w, y + h); ++ } ++ else ++ { ++ g.setColor(shadow); ++ g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1); ++ g.setColor(darkShadow); ++ g.drawLine(x, y + h, x + w, y + h); ++ } ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the right edge of the content border. ++ * ++ * @param g The Graphics object to paint with. ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param selectedIndex The selected tab index. ++ * @param x The x coordinate for the content area. ++ * @param y The y coordinate for the content area. ++ * @param w The width of the content area. ++ * @param h The height of the content area. ++ */ ++ protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, ++ int selectedIndex, int x, int y, ++ int w, int h) ++ { ++ Color saved = g.getColor(); ++ int startgap = rects[selectedIndex].y; ++ int endgap = rects[selectedIndex].y + rects[selectedIndex].height; ++ ++ int diff = 0; ++ if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) ++ { ++ Point p = findPointForIndex(currentScrollLocation); ++ diff = p.y; ++ } ++ ++ if (tabPlacement == SwingConstants.RIGHT) ++ { ++ g.setColor(shadow); ++ g.drawLine(x + w - 1, y + 1, x + w - 1, startgap - diff); ++ g.drawLine(x + w - 1, endgap - diff, x + w - 1, y + h - 1); ++ ++ g.setColor(darkShadow); ++ g.drawLine(x + w, y, x + w, startgap - diff); ++ g.drawLine(x + w, endgap - diff, x + w, y + h); ++ } ++ else ++ { ++ g.setColor(shadow); ++ g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1); ++ g.setColor(darkShadow); ++ g.drawLine(x + w, y, x + w, y + h); ++ } ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method returns the tab bounds for the given index. ++ * ++ * @param pane The JTabbedPane. ++ * @param i The index to look for. ++ * ++ * @return The bounds of the tab with the given index. ++ */ ++ public Rectangle getTabBounds(JTabbedPane pane, int i) ++ { ++ return rects[i]; ++ } ++ ++ /** ++ * This method returns the number of runs. ++ * ++ * @param pane The JTabbedPane. ++ * ++ * @return The number of runs. ++ */ ++ public int getTabRunCount(JTabbedPane pane) ++ { ++ return runCount; ++ } ++ ++ /** ++ * This method returns the tab index given a coordinate. ++ * ++ * @param pane The JTabbedPane. ++ * @param x The x coordinate. ++ * @param y The y coordinate. ++ * ++ * @return The tab index that the coordinate lands in. ++ */ ++ public int tabForCoordinate(JTabbedPane pane, int x, int y) ++ { ++ Point p = new Point(x, y); ++ int tabCount = tabPane.getTabCount(); ++ int currRun = 1; ++ for (int i = 0; i < runCount; i++) ++ { ++ int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1; ++ if (first == tabCount) ++ first = 0; ++ int last = lastTabInRun(tabCount, currRun); ++ for (int j = first; j <= last; j++) ++ { ++ if (getTabBounds(pane, j).contains(p)) ++ return j; ++ } ++ currRun = getNextTabRun(currRun); ++ } ++ return -1; ++ } ++ ++ /** ++ * This method returns the tab bounds in the given rectangle. ++ * ++ * @param tabIndex The index to get bounds for. ++ * @param dest The rectangle to store bounds in. ++ * ++ * @return The rectangle passed in. ++ */ ++ protected Rectangle getTabBounds(int tabIndex, Rectangle dest) ++ { ++ dest.setBounds(getTabBounds(tabPane, tabIndex)); ++ return dest; ++ } ++ ++ /** ++ * This method returns the component that is shown in the content area. ++ * ++ * @return The component that is shown in the content area. ++ */ ++ protected Component getVisibleComponent() ++ { ++ return tabPane.getComponentAt(tabPane.getSelectedIndex()); ++ } ++ ++ /** ++ * This method sets the visible component. ++ * ++ * @param component The component to be set visible. ++ */ ++ protected void setVisibleComponent(Component component) ++ { ++ component.setVisible(true); ++ tabPane.setSelectedComponent(component); ++ } ++ ++ /** ++ * This method assures that enough rectangles are created given the ++ * tabCount. The old array is copied to the new one. ++ * ++ * @param tabCount The number of tabs. ++ */ ++ protected void assureRectsCreated(int tabCount) ++ { ++ if (rects == null) ++ rects = new Rectangle[tabCount]; ++ if (tabCount == rects.length) ++ return; ++ else ++ { ++ int numToCopy = Math.min(tabCount, rects.length); ++ Rectangle[] tmp = new Rectangle[tabCount]; ++ System.arraycopy(rects, 0, tmp, 0, numToCopy); ++ rects = tmp; ++ } ++ } ++ ++ /** ++ * This method expands the tabRuns array to give it more room. The old array ++ * is copied to the new one. ++ */ ++ protected void expandTabRunsArray() ++ { ++ // This method adds another 10 index positions to the tabRuns array. ++ if (tabRuns == null) ++ tabRuns = new int[10]; ++ else ++ { ++ int[] newRuns = new int[tabRuns.length + 10]; ++ System.arraycopy(tabRuns, 0, newRuns, 0, tabRuns.length); ++ tabRuns = newRuns; ++ } ++ } ++ ++ /** ++ * This method returns which run a particular tab belongs to. ++ * ++ * @param tabCount The number of tabs. ++ * @param tabIndex The tab to find. ++ * ++ * @return The tabRuns index that it belongs to. ++ */ ++ protected int getRunForTab(int tabCount, int tabIndex) ++ { ++ if (runCount == 1 && tabIndex < tabCount && tabIndex >= 0) ++ return 1; ++ for (int i = 0; i < runCount; i++) ++ { ++ int first = lastTabInRun(tabCount, getPreviousTabRun(i)) + 1; ++ if (first == tabCount) ++ first = 0; ++ int last = lastTabInRun(tabCount, i); ++ if (last >= tabIndex && first <= tabIndex) ++ return i; ++ } ++ return -1; ++ } ++ ++ /** ++ * This method returns the index of the last tab in a run. ++ * ++ * @param tabCount The number of tabs. ++ * @param run The run to check. ++ * ++ * @return The last tab in the given run. ++ */ ++ protected int lastTabInRun(int tabCount, int run) ++ { ++ if (tabRuns[run] == 0) ++ return tabCount - 1; ++ else ++ return tabRuns[run] - 1; ++ } ++ ++ /** ++ * This method returns the tab run overlay. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The tab run overlay. ++ */ ++ protected int getTabRunOverlay(int tabPlacement) ++ { ++ return tabRunOverlay; ++ } ++ ++ /** ++ * This method returns the tab run indent. It is used in WRAP_TAB_LAYOUT and ++ * makes each tab run start indented by a certain amount. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param run The run to get indent for. ++ * ++ * @return The amount a run should be indented. ++ */ ++ protected int getTabRunIndent(int tabPlacement, int run) ++ { ++ return 0; ++ } ++ ++ /** ++ * This method returns whether a tab run should be padded. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param run The run to check. ++ * ++ * @return Whether the given run should be padded. ++ */ ++ protected boolean shouldPadTabRun(int tabPlacement, int run) ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns whether the tab runs should be rotated. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return Whether runs should be rotated. ++ */ ++ protected boolean shouldRotateTabRuns(int tabPlacement) ++ { ++ return true; ++ } ++ ++ /** ++ * This method returns an icon for the tab. If the tab is disabled, it ++ * should return the disabledIcon. If it is enabled, then it should return ++ * the default icon. ++ * ++ * @param tabIndex The tab index to get an icon for. ++ * ++ * @return The icon for the tab index. ++ */ ++ protected Icon getIconForTab(int tabIndex) ++ { ++ if (tabPane.isEnabledAt(tabIndex)) ++ return tabPane.getIconAt(tabIndex); ++ else ++ return tabPane.getDisabledIconAt(tabIndex); ++ } ++ ++ /** ++ * This method returns a view that can paint the text for the label. ++ * ++ * @param tabIndex The tab index to get a view for. ++ * ++ * @return The view for the tab index. ++ */ ++ protected View getTextViewForTab(int tabIndex) ++ { ++ return null; ++ } ++ ++ /** ++ * This method returns the tab height, including insets, for the given index ++ * and fontheight. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The index of the tab to calculate. ++ * @param fontHeight The font height. ++ * ++ * @return This tab's height. ++ */ ++ protected int calculateTabHeight(int tabPlacement, int tabIndex, ++ int fontHeight) ++ { ++ Icon icon = getIconForTab(tabIndex); ++ Insets insets = getTabInsets(tabPlacement, tabIndex); ++ ++ if (icon != null) ++ { ++ Rectangle vr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ layoutLabel(tabPlacement, getFontMetrics(), tabIndex, ++ tabPane.getTitleAt(tabIndex), icon, vr, ir, tr, ++ tabIndex == tabPane.getSelectedIndex()); ++ calcRect = tr.union(ir); ++ } ++ else ++ calcRect.height = fontHeight; ++ ++ calcRect.height += insets.top + insets.bottom; ++ return calcRect.height; ++ } ++ ++ /** ++ * This method returns the max tab height. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The maximum tab height. ++ */ ++ protected int calculateMaxTabHeight(int tabPlacement) ++ { ++ maxTabHeight = 0; ++ ++ FontMetrics fm = getFontMetrics(); ++ int fontHeight = fm.getHeight(); ++ ++ for (int i = 0; i < tabPane.getTabCount(); i++) ++ maxTabHeight = Math.max(calculateTabHeight(tabPlacement, i, fontHeight), ++ maxTabHeight); ++ ++ return maxTabHeight; ++ } ++ ++ /** ++ * This method calculates the tab width, including insets, for the given tab ++ * index and font metrics. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index to calculate for. ++ * @param metrics The font's metrics. ++ * ++ * @return The tab width for the given index. ++ */ ++ protected int calculateTabWidth(int tabPlacement, int tabIndex, ++ FontMetrics metrics) ++ { ++ Icon icon = getIconForTab(tabIndex); ++ Insets insets = getTabInsets(tabPlacement, tabIndex); ++ ++ if (icon != null) ++ { ++ Rectangle vr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ layoutLabel(tabPlacement, getFontMetrics(), tabIndex, ++ tabPane.getTitleAt(tabIndex), icon, vr, ir, tr, ++ tabIndex == tabPane.getSelectedIndex()); ++ calcRect = tr.union(ir); ++ } ++ else ++ calcRect.width = metrics.stringWidth(tabPane.getTitleAt(tabIndex)); ++ ++ calcRect.width += insets.left + insets.right; ++ return calcRect.width; ++ } ++ ++ /** ++ * This method calculates the max tab width. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The maximum tab width. ++ */ ++ protected int calculateMaxTabWidth(int tabPlacement) ++ { ++ maxTabWidth = 0; ++ ++ FontMetrics fm = getFontMetrics(); ++ ++ for (int i = 0; i < tabPane.getTabCount(); i++) ++ maxTabWidth = Math.max(calculateTabWidth(tabPlacement, i, fm), ++ maxTabWidth); ++ ++ return maxTabWidth; ++ } ++ ++ /** ++ * This method calculates the tab area height, including insets, for the ++ * given amount of runs and tab height. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param horizRunCount The number of runs. ++ * @param maxTabHeight The max tab height. ++ * ++ * @return The tab area height. ++ */ ++ protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount, ++ int maxTabHeight) ++ { ++ Insets insets = getTabAreaInsets(tabPlacement); ++ int tabAreaHeight = horizRunCount * maxTabHeight ++ - (horizRunCount - 1) * tabRunOverlay; ++ ++ tabAreaHeight += insets.top + insets.bottom; ++ ++ return tabAreaHeight; ++ } ++ ++ /** ++ * This method calculates the tab area width, including insets, for the ++ * given amount of runs and tab width. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param vertRunCount The number of runs. ++ * @param maxTabWidth The max tab width. ++ * ++ * @return The tab area width. ++ */ ++ protected int calculateTabAreaWidth(int tabPlacement, int vertRunCount, ++ int maxTabWidth) ++ { ++ Insets insets = getTabAreaInsets(tabPlacement); ++ int tabAreaWidth = vertRunCount * maxTabWidth ++ - (vertRunCount - 1) * tabRunOverlay; ++ ++ tabAreaWidth += insets.left + insets.right; ++ ++ return tabAreaWidth; ++ } ++ ++ /** ++ * This method returns the tab insets appropriately rotated. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab index. ++ * ++ * @return The tab insets for the given index. ++ */ ++ protected Insets getTabInsets(int tabPlacement, int tabIndex) ++ { ++ Insets target = new Insets(0, 0, 0, 0); ++ rotateInsets(tabInsets, target, tabPlacement); ++ return target; ++ } ++ ++ /** ++ * This method returns the selected tab pad insets appropriately rotated. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The selected tab pad insets. ++ */ ++ protected Insets getSelectedTabPadInsets(int tabPlacement) ++ { ++ Insets target = new Insets(0, 0, 0, 0); ++ rotateInsets(selectedTabPadInsets, target, tabPlacement); ++ return target; ++ } ++ ++ /** ++ * This method returns the tab area insets appropriately rotated. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The tab area insets. ++ */ ++ protected Insets getTabAreaInsets(int tabPlacement) ++ { ++ Insets target = new Insets(0, 0, 0, 0); ++ rotateInsets(tabAreaInsets, target, tabPlacement); ++ return target; ++ } ++ ++ /** ++ * This method returns the content border insets appropriately rotated. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * ++ * @return The content border insets. ++ */ ++ protected Insets getContentBorderInsets(int tabPlacement) ++ { ++ Insets target = new Insets(0, 0, 0, 0); ++ rotateInsets(contentBorderInsets, target, tabPlacement); ++ return target; ++ } ++ ++ /** ++ * This method returns the fontmetrics for the font of the JTabbedPane. ++ * ++ * @return The font metrics for the JTabbedPane. ++ */ ++ protected FontMetrics getFontMetrics() ++ { ++ FontMetrics fm = tabPane.getToolkit().getFontMetrics(tabPane.getFont()); ++ return fm; ++ } ++ ++ /** ++ * This method navigates from the selected tab into the given direction. As ++ * a result, a new tab will be selected (if possible). ++ * ++ * @param direction The direction to navigate in. ++ */ ++ protected void navigateSelectedTab(int direction) ++ { ++ int tabPlacement = tabPane.getTabPlacement(); ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ { ++ if (direction == SwingConstants.WEST) ++ selectPreviousTabInRun(tabPane.getSelectedIndex()); ++ else if (direction == SwingConstants.EAST) ++ selectNextTabInRun(tabPane.getSelectedIndex()); ++ ++ else ++ { ++ int offset = getTabRunOffset(tabPlacement, tabPane.getTabCount(), ++ tabPane.getSelectedIndex(), ++ (tabPlacement == SwingConstants.RIGHT) ++ ? true : false); ++ selectAdjacentRunTab(tabPlacement, tabPane.getSelectedIndex(), ++ offset); ++ } ++ } ++ if (tabPlacement == SwingConstants.LEFT ++ || tabPlacement == SwingConstants.RIGHT) ++ { ++ if (direction == SwingConstants.NORTH) ++ selectPreviousTabInRun(tabPane.getSelectedIndex()); ++ else if (direction == SwingConstants.SOUTH) ++ selectNextTabInRun(tabPane.getSelectedIndex()); ++ else ++ { ++ int offset = getTabRunOffset(tabPlacement, tabPane.getTabCount(), ++ tabPane.getSelectedIndex(), ++ (tabPlacement == SwingConstants.RIGHT) ++ ? true : false); ++ selectAdjacentRunTab(tabPlacement, tabPane.getSelectedIndex(), ++ offset); ++ } ++ } ++ } ++ ++ /** ++ * This method selects the next tab in the run. ++ * ++ * @param current The current selected index. ++ */ ++ protected void selectNextTabInRun(int current) ++ { ++ tabPane.setSelectedIndex(getNextTabIndexInRun(tabPane.getTabCount(), ++ current)); ++ } ++ ++ /** ++ * This method selects the previous tab in the run. ++ * ++ * @param current The current selected index. ++ */ ++ protected void selectPreviousTabInRun(int current) ++ { ++ tabPane.setSelectedIndex(getPreviousTabIndexInRun(tabPane.getTabCount(), ++ current)); ++ } ++ ++ /** ++ * This method selects the next tab (regardless of runs). ++ * ++ * @param current The current selected index. ++ */ ++ protected void selectNextTab(int current) ++ { ++ tabPane.setSelectedIndex(getNextTabIndex(current)); ++ } ++ ++ /** ++ * This method selects the previous tab (regardless of runs). ++ * ++ * @param current The current selected index. ++ */ ++ protected void selectPreviousTab(int current) ++ { ++ tabPane.setSelectedIndex(getPreviousTabIndex(current)); ++ } ++ ++ /** ++ * This method selects the correct tab given an offset from the current tab ++ * index. If the tab placement is TOP or BOTTOM, the offset will be in the ++ * y direction, otherwise, it will be in the x direction. A new coordinate ++ * will be found by adding the offset to the current location of the tab. ++ * The tab that the new location will be selected. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabIndex The tab to start from. ++ * @param offset The coordinate offset. ++ */ ++ protected void selectAdjacentRunTab(int tabPlacement, int tabIndex, ++ int offset) ++ { ++ int x = rects[tabIndex].x + rects[tabIndex].width / 2; ++ int y = rects[tabIndex].y + rects[tabIndex].height / 2; ++ ++ switch (tabPlacement) ++ { ++ case SwingConstants.TOP: ++ case SwingConstants.BOTTOM: ++ y += offset; ++ break; ++ case SwingConstants.RIGHT: ++ case SwingConstants.LEFT: ++ x += offset; ++ break; ++ } ++ ++ int index = tabForCoordinate(tabPane, x, y); ++ if (index != -1) ++ tabPane.setSelectedIndex(index); ++ } ++ ++ // This method is called when you press up/down to cycle through tab runs. ++ // it returns the distance (between the two runs' x/y position. ++ // where one run is the current selected run and the other run is the run in the ++ // direction of the scroll (dictated by the forward flag) ++ // the offset is an absolute value of the difference ++ ++ /** ++ * This method calculates the offset distance for use in ++ * selectAdjacentRunTab. The offset returned will be a difference in the y ++ * coordinate between the run in the desired direction and the current run ++ * (for tabPlacement in TOP or BOTTOM). Use x coordinate for LEFT and ++ * RIGHT. ++ * ++ * @param tabPlacement The JTabbedPane's tab placement. ++ * @param tabCount The number of tabs. ++ * @param tabIndex The starting index. ++ * @param forward If forward, the run in the desired direction will be the ++ * next run. ++ * ++ * @return The offset between the two runs. ++ */ ++ protected int getTabRunOffset(int tabPlacement, int tabCount, int tabIndex, ++ boolean forward) ++ { ++ int currRun = getRunForTab(tabCount, tabIndex); ++ int offset; ++ int nextRun = (forward) ? getNextTabRun(currRun) : getPreviousTabRun(currRun); ++ if (tabPlacement == SwingConstants.TOP ++ || tabPlacement == SwingConstants.BOTTOM) ++ offset = rects[lastTabInRun(tabCount, nextRun)].y ++ - rects[lastTabInRun(tabCount, currRun)].y; ++ else ++ offset = rects[lastTabInRun(tabCount, nextRun)].x ++ - rects[lastTabInRun(tabCount, currRun)].x; ++ return offset; ++ } ++ ++ /** ++ * This method returns the previous tab index. ++ * ++ * @param base The index to start from. ++ * ++ * @return The previous tab index. ++ */ ++ protected int getPreviousTabIndex(int base) ++ { ++ base--; ++ if (base < 0) ++ return tabPane.getTabCount() - 1; ++ return base; ++ } ++ ++ /** ++ * This method returns the next tab index. ++ * ++ * @param base The index to start from. ++ * ++ * @return The next tab index. ++ */ ++ protected int getNextTabIndex(int base) ++ { ++ base++; ++ if (base == tabPane.getTabCount()) ++ return 0; ++ return base; ++ } ++ ++ /** ++ * This method returns the next tab index in the run. If the next index is ++ * out of this run, it will return the starting tab index for the run. ++ * ++ * @param tabCount The number of tabs. ++ * @param base The index to start from. ++ * ++ * @return The next tab index in the run. ++ */ ++ protected int getNextTabIndexInRun(int tabCount, int base) ++ { ++ int index = getNextTabIndex(base); ++ int run = getRunForTab(tabCount, base); ++ if (index == lastTabInRun(tabCount, run) + 1) ++ index = lastTabInRun(tabCount, getPreviousTabRun(run)) + 1; ++ return getNextTabIndex(base); ++ } ++ ++ /** ++ * This method returns the previous tab index in the run. If the previous ++ * index is out of this run, it will return the last index for the run. ++ * ++ * @param tabCount The number of tabs. ++ * @param base The index to start from. ++ * ++ * @return The previous tab index in the run. ++ */ ++ protected int getPreviousTabIndexInRun(int tabCount, int base) ++ { ++ int index = getPreviousTabIndex(base); ++ int run = getRunForTab(tabCount, base); ++ if (index == lastTabInRun(tabCount, getPreviousTabRun(run))) ++ index = lastTabInRun(tabCount, run); ++ return getPreviousTabIndex(base); ++ } ++ ++ /** ++ * This method returns the index of the previous run. ++ * ++ * @param baseRun The run to start from. ++ * ++ * @return The index of the previous run. ++ */ ++ protected int getPreviousTabRun(int baseRun) ++ { ++ if (getTabRunCount(tabPane) == 1) ++ return 1; ++ ++ int prevRun = --baseRun; ++ if (prevRun < 0) ++ prevRun = getTabRunCount(tabPane) - 1; ++ return prevRun; ++ } ++ ++ /** ++ * This method returns the index of the next run. ++ * ++ * @param baseRun The run to start from. ++ * ++ * @return The index of the next run. ++ */ ++ protected int getNextTabRun(int baseRun) ++ { ++ if (getTabRunCount(tabPane) == 1) ++ return 1; ++ ++ int nextRun = ++baseRun; ++ if (nextRun == getTabRunCount(tabPane)) ++ nextRun = 0; ++ return nextRun; ++ } ++ ++ /** ++ * This method rotates the insets given a direction to rotate them in. ++ * Target placement should be one of TOP, LEFT, BOTTOM, RIGHT. The rotated ++ * insets will be stored in targetInsets. Passing in TOP as the direction ++ * does nothing. Passing in LEFT switches top and left, right and bottom. ++ * Passing in BOTTOM switches top and bottom. Passing in RIGHT switches top ++ * for left, left for bottom, bottom for right, and right for top. ++ * ++ * @param topInsets The reference insets. ++ * @param targetInsets An Insets object to store the new insets. ++ * @param targetPlacement The rotation direction. ++ */ ++ protected static void rotateInsets(Insets topInsets, Insets targetInsets, ++ int targetPlacement) ++ { ++ // Sun's version will happily throw an NPE if params are null, ++ // so I won't check it either. ++ switch (targetPlacement) ++ { ++ case SwingConstants.TOP: ++ targetInsets.top = topInsets.top; ++ targetInsets.left = topInsets.left; ++ targetInsets.right = topInsets.right; ++ targetInsets.bottom = topInsets.bottom; ++ break; ++ case SwingConstants.LEFT: ++ targetInsets.left = topInsets.top; ++ targetInsets.top = topInsets.left; ++ targetInsets.right = topInsets.bottom; ++ targetInsets.bottom = topInsets.right; ++ break; ++ case SwingConstants.BOTTOM: ++ targetInsets.top = topInsets.bottom; ++ targetInsets.bottom = topInsets.top; ++ targetInsets.left = topInsets.left; ++ targetInsets.right = topInsets.right; ++ break; ++ case SwingConstants.RIGHT: ++ targetInsets.top = topInsets.left; ++ targetInsets.left = topInsets.bottom; ++ targetInsets.bottom = topInsets.right; ++ targetInsets.right = topInsets.top; ++ break; ++ } ++ } + } +- +Index: javax/swing/plaf/basic/BasicTableHeaderUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicTableHeaderUI.java +diff -N javax/swing/plaf/basic/BasicTableHeaderUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicTableHeaderUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,301 @@ ++/* BasicTableHeaderUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Rectangle; ++import java.awt.event.MouseEvent; ++import javax.swing.CellRendererPane; ++import javax.swing.JComponent; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.border.Border; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.TableHeaderUI; ++import javax.swing.table.JTableHeader; ++import javax.swing.table.TableCellRenderer; ++import javax.swing.table.TableColumn; ++import javax.swing.table.TableColumnModel; ++ ++ ++public class BasicTableHeaderUI ++ extends TableHeaderUI ++{ ++ ++ public static ComponentUI createUI(JComponent h) ++ { ++ return new BasicTableHeaderUI(); ++ } ++ ++ protected JTableHeader header; ++ protected MouseInputListener mouseInputListener; ++ protected CellRendererPane rendererPane; ++ protected Border cellBorder; ++ ++ class MouseInputHandler ++ implements MouseInputListener ++ { ++ public void mouseClicked(MouseEvent e) {} ++ public void mouseDragged(MouseEvent e) {} ++ public void mouseEntered(MouseEvent e) {} ++ public void mouseExited(MouseEvent e) {} ++ public void mouseMoved(MouseEvent e) {} ++ public void mousePressed(MouseEvent e) {} ++ public void mouseReleased(MouseEvent e) {} ++ } ++ ++ protected MouseInputListener createMouseInputListener() ++ { ++ return new MouseInputHandler(); ++ } ++ ++ public BasicTableHeaderUI() ++ { ++ mouseInputListener = createMouseInputListener(); ++ } ++ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ header.setBackground(defaults.getColor("TableHeader.background")); ++ header.setForeground(defaults.getColor("TableHeader.foreground")); ++ header.setFont(defaults.getFont("TableHeader.font")); ++ cellBorder = defaults.getBorder("TableHeader.cellBorder"); ++ } ++ ++ protected void installKeyboardActions() ++ { ++ } ++ ++ protected void installListeners() ++ { ++ header.addMouseListener(mouseInputListener); ++ } ++ ++ public void installUI(JComponent c) ++ { ++ header = (JTableHeader) c; ++ installDefaults(); ++ installKeyboardActions(); ++ installListeners(); ++ } ++ ++ protected void uninstallDefaults() ++ { ++ header.setBackground(null); ++ header.setForeground(null); ++ header.setFont(null); ++ } ++ ++ protected void uninstallKeyboardActions() ++ { ++ } ++ ++ protected void uninstallListeners() ++ { ++ header.removeMouseListener(mouseInputListener); ++ } ++ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(); ++ uninstallKeyboardActions(); ++ uninstallDefaults(); ++ } ++ ++ public void paint(Graphics gfx, JComponent c) ++ { ++ TableColumnModel cmod = header.getColumnModel(); ++ int ncols = cmod.getColumnCount(); ++ if (ncols == 0) ++ return; ++ ++ Rectangle clip = gfx.getClipBounds(); ++ TableCellRenderer defaultRend = header.getDefaultRenderer(); ++ ++ for (int i = 0; i < ncols; ++i) ++ { ++ Rectangle bounds = header.getHeaderRect(i); ++ if (bounds.intersects(clip)) ++ { ++ TableColumn col = cmod.getColumn(i); ++ TableCellRenderer rend = col.getHeaderRenderer(); ++ if (rend == null) ++ rend = defaultRend; ++ Object val = col.getHeaderValue(); ++ Component comp = rend.getTableCellRendererComponent(header.getTable(), ++ val, ++ false, // isSelected ++ false, // isFocused ++ -1, i); ++ comp.setFont(header.getFont()); ++ comp.setBackground(header.getBackground()); ++ comp.setForeground(header.getForeground()); ++ if (comp instanceof JComponent) ++ ((JComponent)comp).setBorder(cellBorder); ++ gfx.translate(bounds.x, bounds.y); ++ comp.setSize(bounds.width, bounds.height); ++ comp.setLocation(0,0); ++ comp.paint(gfx); ++ gfx.translate(-bounds.x, -bounds.y); ++ } ++ } ++ ++ } ++ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ TableColumnModel cmod = header.getColumnModel(); ++ TableCellRenderer defaultRend = header.getDefaultRenderer(); ++ int ncols = cmod.getColumnCount(); ++ int spacing = 0; ++ Dimension ret = getPreferredSize(c); ++ ++ if (header.getTable() != null ++ && header.getTable().getInterCellSpacing() != null) ++ spacing = header.getTable().getInterCellSpacing().width; ++ ++ ret.width = 0; ++ for (int i = 0; i < ncols; ++i) ++ { ++ TableColumn col = cmod.getColumn(i); ++ TableCellRenderer rend = col.getHeaderRenderer(); ++ if (rend == null) ++ rend = defaultRend; ++ Object val = col.getHeaderValue(); ++ Component comp = rend.getTableCellRendererComponent(header.getTable(), ++ val, ++ false, // isSelected ++ false, // isFocused ++ -1, i); ++ comp.setFont(header.getFont()); ++ comp.setBackground(header.getBackground()); ++ comp.setForeground(header.getForeground()); ++ if (comp instanceof JComponent) ++ ((JComponent)comp).setBorder(cellBorder); ++ ++ Dimension d = comp.getMaximumSize(); ++ ret.width += col.getMaxWidth(); ++ ret.height = Math.max(ret.height, d.height); ++ ret.width += spacing; ++ } ++ return ret; ++ } ++ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ TableColumnModel cmod = header.getColumnModel(); ++ TableCellRenderer defaultRend = header.getDefaultRenderer(); ++ int ncols = cmod.getColumnCount(); ++ int spacing = 0; ++ Dimension ret = getPreferredSize(c); ++ ++ if (header.getTable() != null ++ && header.getTable().getInterCellSpacing() != null) ++ spacing = header.getTable().getInterCellSpacing().width; ++ ++ ret.width = 0; ++ for (int i = 0; i < ncols; ++i) ++ { ++ TableColumn col = cmod.getColumn(i); ++ TableCellRenderer rend = col.getHeaderRenderer(); ++ if (rend == null) ++ rend = defaultRend; ++ Object val = col.getHeaderValue(); ++ Component comp = rend.getTableCellRendererComponent(header.getTable(), ++ val, ++ false, // isSelected ++ false, // isFocused ++ -1, i); ++ comp.setFont(header.getFont()); ++ comp.setBackground(header.getBackground()); ++ comp.setForeground(header.getForeground()); ++ if (comp instanceof JComponent) ++ ((JComponent)comp).setBorder(cellBorder); ++ ++ Dimension d = comp.getMinimumSize(); ++ ret.width += col.getMinWidth(); ++ ret.width += spacing; ++ ret.height = Math.max(ret.height, d.height); ++ } ++ return ret; ++ } ++ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ TableColumnModel cmod = header.getColumnModel(); ++ TableCellRenderer defaultRend = header.getDefaultRenderer(); ++ int ncols = cmod.getColumnCount(); ++ Dimension ret = new Dimension(0,0); ++ int spacing = 0; ++ ++ if (header.getTable() != null ++ && header.getTable().getInterCellSpacing() != null) ++ spacing = header.getTable().getInterCellSpacing().width; ++ ++ for (int i = 0; i < ncols; ++i) ++ { ++ TableColumn col = cmod.getColumn(i); ++ TableCellRenderer rend = col.getHeaderRenderer(); ++ if (rend == null) ++ rend = defaultRend; ++ Object val = col.getHeaderValue(); ++ Component comp = rend.getTableCellRendererComponent(header.getTable(), ++ val, ++ false, // isSelected ++ false, // isFocused ++ -1, i); ++ comp.setFont(header.getFont()); ++ comp.setBackground(header.getBackground()); ++ comp.setForeground(header.getForeground()); ++ if (comp instanceof JComponent) ++ ((JComponent)comp).setBorder(cellBorder); ++ ++ Dimension d = comp.getPreferredSize(); ++ ret.width += d.width; ++ ret.width += spacing; ++ ret.height = Math.max(d.height, ret.height); ++ } ++ return ret; ++ } ++ ++ ++} +Index: javax/swing/plaf/basic/BasicTableUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicTableUI.java +diff -N javax/swing/plaf/basic/BasicTableUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicTableUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,374 @@ ++/* BasicTableUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.event.KeyEvent; ++import java.awt.event.KeyListener; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.MouseEvent; ++import javax.swing.CellRendererPane; ++import javax.swing.JComponent; ++import javax.swing.JTable; ++import javax.swing.ListSelectionModel; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.TableUI; ++import javax.swing.table.TableCellRenderer; ++import javax.swing.table.TableColumn; ++import javax.swing.table.TableColumnModel; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++ ++ ++public class BasicTableUI ++ extends TableUI ++{ ++ ++ public static ComponentUI createUI(JComponent comp) ++ { ++ return new BasicTableUI(); ++ } ++ ++ protected FocusListener focusListener; ++ protected KeyListener keyListener; ++ protected MouseInputListener mouseInputListener; ++ protected CellRendererPane rendererPane; ++ protected JTable table; ++ ++ class FocusHandler implements FocusListener ++ { ++ public void focusGained(FocusEvent e) ++ { ++ } ++ public void focusLost(FocusEvent e) ++ { ++ } ++ } ++ ++ class KeyHandler implements KeyListener ++ { ++ public void keyPressed(KeyEvent e) ++ { ++ } ++ public void keyReleased(KeyEvent e) ++ { ++ } ++ public void keyTyped(KeyEvent e) ++ { ++ } ++ } ++ ++ class MouseInputHandler implements MouseInputListener ++ { ++ Point begin, curr; ++ ++ private int getRowForPoint(Point p) ++ { ++ int y0 = table.getLocation().y; ++ int nrows = table.getRowCount(); ++ Dimension gap = table.getInterCellSpacing(); ++ int height = table.getRowHeight() + (gap == null ? 0 : gap.height); ++ int y = p.y; ++ for (int i = 0; i < nrows; ++i) ++ { ++ if (0 <= y && y < height) ++ return i; ++ y -= height; ++ } ++ return -1; ++ } ++ ++ private int getColForPoint(Point p) ++ { ++ int x0 = table.getLocation().x; ++ int ncols = table.getColumnCount(); ++ Dimension gap = table.getInterCellSpacing(); ++ TableColumnModel cols = table.getColumnModel(); ++ int x = p.x; ++ for (int i = 0; i < ncols; ++i) ++ { ++ int width = cols.getColumn(i).getWidth() + (gap == null ? 0 : gap.width); ++ if (0 <= x && x < width) ++ return i; ++ x -= width; ++ } ++ return -1; ++ } ++ ++ private void updateSelection() ++ { ++ if (table.getRowSelectionAllowed()) ++ { ++ int lo_row = getRowForPoint(begin); ++ int hi_row = getRowForPoint(curr); ++ ListSelectionModel rowModel = table.getSelectionModel(); ++ if (lo_row != -1 && hi_row != -1) ++ rowModel.setSelectionInterval(lo_row, hi_row); ++ } ++ ++ if (table.getColumnSelectionAllowed()) ++ { ++ int lo_col = getColForPoint(begin); ++ int hi_col = getColForPoint(curr); ++ ListSelectionModel colModel = table.getColumnModel().getSelectionModel(); ++ if (lo_col != -1 && hi_col != -1) ++ colModel.setSelectionInterval(lo_col, hi_col); ++ } ++ } ++ ++ public void mouseClicked(MouseEvent e) ++ { ++ } ++ public void mouseDragged(MouseEvent e) ++ { ++ curr = new Point(e.getX(), e.getY()); ++ updateSelection(); ++ } ++ public void mouseEntered(MouseEvent e) ++ { ++ } ++ public void mouseExited(MouseEvent e) ++ { ++ } ++ public void mouseMoved(MouseEvent e) ++ { ++ } ++ public void mousePressed(MouseEvent e) ++ { ++ begin = new Point(e.getX(), e.getY()); ++ curr = new Point(e.getX(), e.getY()); ++ updateSelection(); ++ } ++ public void mouseReleased(MouseEvent e) ++ { ++ begin = null; ++ curr = null; ++ } ++ } ++ ++ protected FocusListener createFocusListener() ++ { ++ return new FocusHandler(); ++ } ++ protected KeyListener createKeyListener() ++ { ++ return new KeyHandler(); ++ } ++ protected MouseInputListener createMouseInputListener() ++ { ++ return new MouseInputHandler(); ++ } ++ ++ public Dimension getMaximumSize(JComponent comp) ++ { ++ return getPreferredSize(comp); ++ } ++ ++ public Dimension getMinimumSize(JComponent comp) ++ { ++ return getPreferredSize(comp); ++ } ++ ++ public Dimension getPreferredSize(JComponent comp) ++ { ++ int width = table.getColumnModel().getTotalColumnWidth(); ++ int height = table.getRowCount() * table.getRowHeight(); ++ return new Dimension(width, height); ++ } ++ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ table.setFont(defaults.getFont("Table.font")); ++ table.setGridColor(defaults.getColor("Table.gridColor")); ++ table.setForeground(defaults.getColor("Table.foreground")); ++ table.setBackground(defaults.getColor("Table.background")); ++ table.setSelectionForeground(defaults.getColor("Table.selectionForeground")); ++ table.setSelectionBackground(defaults.getColor("Table.selectionBackground")); ++ table.setOpaque(true); ++ } ++ protected void installKeyboardActions() ++ { ++ } ++ ++ protected void installListeners() ++ { ++ table.addFocusListener(focusListener); ++ table.addKeyListener(keyListener); ++ table.addMouseListener(mouseInputListener); ++ } ++ ++ protected void uninstallDefaults() ++ { ++ table.setFont(null); ++ table.setGridColor(null); ++ table.setForeground(null); ++ table.setBackground(null); ++ table.setSelectionForeground(null); ++ table.setSelectionBackground(null); ++ } ++ ++ protected void uninstallKeyboardActions() ++ { ++ } ++ ++ protected void uninstallListeners() ++ { ++ table.removeFocusListener(focusListener); ++ table.removeKeyListener(keyListener); ++ table.removeMouseListener(mouseInputListener); ++ } ++ ++ public void installUI(JComponent comp) ++ { ++ table = (JTable)comp; ++ focusListener = createFocusListener(); ++ keyListener = createKeyListener(); ++ mouseInputListener = createMouseInputListener(); ++ installDefaults(); ++ installKeyboardActions(); ++ installListeners(); ++ } ++ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(); ++ uninstallKeyboardActions(); ++ uninstallDefaults(); ++ } ++ ++ public void paint(Graphics gfx, JComponent ignored) ++ { ++ int ncols = table.getColumnCount(); ++ int nrows = table.getRowCount(); ++ if (nrows == 0 || ncols == 0) ++ return; ++ ++ Rectangle clip = gfx.getClipBounds(); ++ TableColumnModel cols = table.getColumnModel(); ++ ++ int height = table.getRowHeight(); ++ int x0 = 0, y0 = 0; ++ int x = x0; ++ int y = y0; ++ ++ Dimension gap = table.getInterCellSpacing(); ++ int ymax = clip.y + clip.height; ++ int xmax = clip.x + clip.width; ++ ++ // paint the cell contents ++ for (int c = 0; c < ncols && x < xmax; ++c) ++ { ++ y = y0; ++ TableColumn col = cols.getColumn(c); ++ int width = col.getWidth(); ++ int modelCol = col.getModelIndex(); ++ ++ for (int r = 0; r < nrows && y < ymax; ++r) ++ { ++ Rectangle bounds = new Rectangle(x, y, width, height); ++ if (bounds.intersects(clip)) ++ { ++ TableCellRenderer rend = table.getCellRenderer(r, c); ++ Component comp = table.prepareRenderer(rend, r, c); ++ gfx.translate(x, y); ++ comp.setBounds(new Rectangle(0, 0, width, height)); ++ comp.paint(gfx); ++ gfx.translate(-x, -y); ++ } ++ y += height; ++ if (gap != null) ++ y += gap.height; ++ } ++ x += width; ++ if (gap != null) ++ x += gap.width; ++ } ++ ++ // tighten up the x and y max bounds ++ ymax = y; ++ xmax = x; ++ ++ Color grid = table.getGridColor(); ++ ++ // paint vertical grid lines ++ if (grid != null && table.getShowVerticalLines()) ++ { ++ x = x0; ++ Color save = gfx.getColor(); ++ gfx.setColor(grid); ++ boolean paintedLine = false; ++ for (int c = 0; c < ncols && x < xmax; ++c) ++ { ++ x += cols.getColumn(c).getWidth();; ++ if (gap != null) ++ x += gap.width; ++ gfx.drawLine(x, y0, x, ymax); ++ paintedLine = true; ++ } ++ gfx.setColor(save); ++ } ++ ++ // paint horizontal grid lines ++ if (grid != null && table.getShowHorizontalLines()) ++ { ++ y = y0; ++ Color save = gfx.getColor(); ++ gfx.setColor(grid); ++ boolean paintedLine = false; ++ for (int r = 0; r < nrows && y < ymax; ++r) ++ { ++ y += height; ++ if (gap != null) ++ y += gap.height; ++ gfx.drawLine(x0, y, xmax, y); ++ paintedLine = true; ++ } ++ gfx.setColor(save); ++ } ++ ++ } ++ ++} +Index: javax/swing/plaf/basic/BasicTextAreaUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicTextAreaUI.java +diff -N javax/swing/plaf/basic/BasicTextAreaUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicTextAreaUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,69 @@ ++/* BasicTextAreaUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.plaf.basic; ++ ++import java.beans.PropertyChangeEvent; ++ ++import javax.swing.JComponent; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.text.Element; ++import javax.swing.text.PlainView; ++import javax.swing.text.View; ++ ++public class BasicTextAreaUI extends BasicTextUI ++{ ++ public static ComponentUI createUI(JComponent comp) ++ { ++ return new BasicTextAreaUI(); ++ } ++ ++ public BasicTextAreaUI() ++ { ++ } ++ ++ public View create(Element elem) ++ { ++ return new PlainView(elem); ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return "TextArea"; ++ } ++} +Index: javax/swing/plaf/basic/BasicTextFieldUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicTextFieldUI.java +diff -N javax/swing/plaf/basic/BasicTextFieldUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicTextFieldUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,82 @@ ++/* BasicTextFieldUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.plaf.basic; ++ ++import java.beans.PropertyChangeEvent; ++ ++import javax.swing.JComponent; ++import javax.swing.JTextField; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.text.Element; ++import javax.swing.text.FieldView; ++import javax.swing.text.PlainDocument; ++import javax.swing.text.View; ++ ++public class BasicTextFieldUI extends BasicTextUI ++{ ++ public BasicTextFieldUI() ++ { ++ super(); ++ } ++ ++ public View create(Element elem) ++ { ++ return new FieldView(elem); ++ } ++ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicTextFieldUI(); ++ } ++ ++ protected String getPropertyPrefix() ++ { ++ return "TextField"; ++ } ++ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ } ++ ++ protected void propertyChange(PropertyChangeEvent event) ++ { ++ // Does nothing by default. ++ } ++} +Index: javax/swing/plaf/basic/BasicTextUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicTextUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicTextUI.java +--- javax/swing/plaf/basic/BasicTextUI.java 13 Jul 2003 15:29:11 -0000 1.4 ++++ javax/swing/plaf/basic/BasicTextUI.java 6 Sep 2004 16:36:08 -0000 +@@ -1,5 +1,5 @@ + /* BasicTextUI.java +- Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,151 +39,433 @@ + package javax.swing.plaf.basic; + + import java.awt.Color; ++import java.awt.Container; + import java.awt.Dimension; + import java.awt.Graphics; ++import java.awt.Insets; + import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.Shape; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++ ++import javax.swing.Action; ++import javax.swing.ActionMap; ++import javax.swing.InputMap; + import javax.swing.JComponent; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.TextUI; ++import javax.swing.plaf.UIResource; + import javax.swing.text.BadLocationException; ++import javax.swing.text.Caret; ++import javax.swing.text.DefaultCaret; + import javax.swing.text.DefaultEditorKit; ++import javax.swing.text.DefaultHighlighter; ++import javax.swing.text.Document; + import javax.swing.text.EditorKit; + import javax.swing.text.Element; ++import javax.swing.text.Highlighter; + import javax.swing.text.JTextComponent; ++import javax.swing.text.Keymap; ++import javax.swing.text.PlainDocument; ++import javax.swing.text.PlainView; + import javax.swing.text.Position; + import javax.swing.text.View; + import javax.swing.text.ViewFactory; + +-public class BasicTextUI extends TextUI ++ ++public abstract class BasicTextUI extends TextUI + implements ViewFactory + { +- int gap = 3; +- View view = null; // was: new RootView(); +- Color textColor, disabledTextColor, normalBackgroundColor; +- EditorKit kit = new DefaultEditorKit(); +- +- /* ***************************************************************** +- * This View is way too incomplete to be of any use. To avoid errors +- * when compiling with the Sun JDK, it has been commented out. +- * -- Sascha Brawer (brawer@dandelis.ch) +- * +- * (begin of commented out section) +- class RootView extends View ++ public static class BasicCaret extends DefaultCaret ++ implements UIResource ++ { ++ public BasicCaret() + { +- RootView() +- { +- super(null); +- } +- public void paint(Graphics g, Shape s) +- { +- if (view != null) +- { +- Rectangle r = s.getBounds(); +- +- view.setSize((int)r.getWidth(), +- (int)r.getHeight()); +- view.paint(g, s); +- } +- } + } +- * (end of commented out section) +- *************************************************************** */ ++ } + +- public BasicTextUI() ++ public static class BasicHighlighter extends DefaultHighlighter ++ implements UIResource ++ { ++ public BasicHighlighter() + { + } ++ } + +- public static ComponentUI createUI(final JComponent c) ++ private class RootView extends View ++ { ++ private View view; ++ ++ public RootView() + { +- return new BasicTextUI(); ++ super(null); + } + +- +- public void installUI(final JComponent c) ++ public ViewFactory getViewFactory() + { +- super.installUI(c); +- +- textColor = new Color(0,0,0); +- disabledTextColor = new Color(130, 130, 130); +- normalBackgroundColor = new Color(192,192,192); ++ // FIXME: Handle EditorKit somehow. ++ return BasicTextUI.this; + } +- +- public Dimension getPreferredSize(JComponent c) +- { +- JTextComponent b = (JTextComponent) c; +- +- View v = getRootView(b); + +- float w = v.getPreferredSpan(View.X_AXIS); +- float h = v.getPreferredSpan(View.Y_AXIS); ++ public void setView(View v) ++ { ++ if (view != null) ++ view.setParent(null); ++ ++ if (v != null) ++ v.setParent(null); + +- return new Dimension((int)w, (int) h); ++ view = v; + } +- + +- public void paint(Graphics g, JComponent c) +- { +- // view.paint( ++ public Container getContainer() ++ { ++ return textComponent; + } + +- public void damageRange(JTextComponent t, int p0, int p1) ++ public float getPreferredSpan(int axis) + { +- damageRange(t, p0, p1, null, null); +- } ++ if (view != null) ++ return view.getPreferredSpan(axis); + +- public void damageRange(JTextComponent t, +- int p0, int p1, +- Position.Bias firstBias, +- Position.Bias secondBias) +- { +- } ++ return Integer.MAX_VALUE; ++ } + +- public EditorKit getEditorKit(JTextComponent t) ++ public void paint(Graphics g, Shape s) + { +- return kit; ++ if (view != null) ++ view.paint(g, s); + } +- +- public int getNextVisualPositionFrom(JTextComponent t, +- int pos, +- Position.Bias b, +- int direction, +- Position.Bias[] biasRet) +- throws BadLocationException ++ ++ protected Rectangle modelToView(int position, Shape a, Position.Bias bias) ++ throws BadLocationException + { +- return 0; ++ return ((PlainView) view).modelToView(position, a, bias).getBounds(); + } +- +- public View getRootView(JTextComponent t) ++ } ++ ++ class UpdateHandler implements PropertyChangeListener ++ { ++ public void propertyChange(PropertyChangeEvent event) + { +- return view; ++ if (event.getPropertyName().equals("document")) ++ { ++ // Document changed. ++ modelChanged(); ++ } + } ++ } ++ ++ static EditorKit kit = new DefaultEditorKit(); ++ ++ RootView rootView = new RootView(); ++ JTextComponent textComponent; ++ UpdateHandler updateHandler = new UpdateHandler(); ++ ++ public BasicTextUI() ++ { ++ } ++ ++ protected Caret createCaret() ++ { ++ return new BasicCaret(); ++ } ++ ++ protected Highlighter createHighlighter() ++ { ++ return new BasicHighlighter(); ++ } ++ ++ protected final JTextComponent getComponent() ++ { ++ return textComponent; ++ } ++ ++ public void installUI(final JComponent c) ++ { ++ super.installUI(c); ++ c.setOpaque(true); ++ ++ textComponent = (JTextComponent) c; ++ ++ Document doc = textComponent.getDocument(); ++ if (doc == null) ++ { ++ doc = getEditorKit(textComponent).createDefaultDocument(); ++ textComponent.setDocument(doc); ++ } + +- public Rectangle modelToView(JTextComponent t, int pos) +- throws BadLocationException +- { +- return modelToView(t, pos, null); +- } ++ textComponent.addPropertyChangeListener(updateHandler); ++ modelChanged(); + +- public Rectangle modelToView(JTextComponent t, int pos, Position.Bias bias) +- throws BadLocationException +- { +- return null; +- } ++ installDefaults(); ++ installListeners(); ++ installKeyboardActions(); ++ } ++ ++ protected void installDefaults() ++ { ++ Caret caret = textComponent.getCaret(); ++ if (caret == null) ++ { ++ caret = createCaret(); ++ textComponent.setCaret(caret); ++ } ++ ++ Highlighter highlighter = textComponent.getHighlighter(); ++ if (highlighter == null) ++ textComponent.setHighlighter(createHighlighter()); ++ ++ String prefix = getPropertyPrefix(); ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ textComponent.setBackground(defaults.getColor(prefix + ".background")); ++ textComponent.setForeground(defaults.getColor(prefix + ".foreground")); ++ textComponent.setMargin(defaults.getInsets(prefix + ".margin")); ++ textComponent.setBorder(defaults.getBorder(prefix + ".border")); ++ textComponent.setFont(defaults.getFont(prefix + ".font")); ++ ++ caret.setBlinkRate(defaults.getInt(prefix + ".caretBlinkRate")); ++ } ++ ++ protected void installListeners() ++ { ++ // Do nothing here. ++ } ++ ++ protected String getKeymapName() ++ { ++ return "BasicTextUI"; ++ } ++ ++ protected Keymap createKeymap() ++ { ++ String prefix = getPropertyPrefix(); ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ JTextComponent.KeyBinding[] bindings = ++ (JTextComponent.KeyBinding[]) defaults.get(prefix + ".keyBindings"); ++ Keymap km = JTextComponent.addKeymap(getKeymapName(), ++ JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP)); ++ JTextComponent.loadKeymap(km, bindings, textComponent.getActions()); ++ return km; ++ } ++ ++ protected void installKeyboardActions() ++ { ++ // load any bindings for the older Keymap interface ++ Keymap km = JTextComponent.getKeymap(getKeymapName()); ++ if (km == null) ++ km = createKeymap(); ++ textComponent.setKeymap(km); ++ ++ // load any bindings for the newer InputMap / ActionMap interface ++ SwingUtilities.replaceUIInputMap(textComponent, ++ JComponent.WHEN_FOCUSED, ++ getInputMap(JComponent.WHEN_FOCUSED)); ++ SwingUtilities.replaceUIActionMap(textComponent, getActionMap()); ++ } ++ ++ InputMap getInputMap(int condition) ++ { ++ String prefix = getPropertyPrefix(); ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ switch (condition) ++ { ++ case JComponent.WHEN_IN_FOCUSED_WINDOW: ++ // FIXME: is this the right string? nobody seems to use it. ++ return (InputMap) defaults.get(prefix + ".windowInputMap"); ++ case JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT: ++ return (InputMap) defaults.get(prefix + ".ancestorInputMap"); ++ default: ++ case JComponent.WHEN_FOCUSED: ++ return (InputMap) defaults.get(prefix + ".focusInputMap"); ++ } ++ } ++ ++ ActionMap getActionMap() ++ { ++ String prefix = getPropertyPrefix(); ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ActionMap am = (ActionMap) defaults.get(prefix + ".actionMap"); ++ if (am == null) ++ { ++ am = createActionMap(); ++ defaults.put(prefix + ".actionMap", am); ++ } ++ return am; ++ } ++ ++ ActionMap createActionMap() ++ { ++ Action[] actions = textComponent.getActions(); ++ ActionMap am = new ActionMap(); ++ for (int i = 0; i < actions.length; ++i) ++ { ++ String name = (String) actions[i].getValue(Action.NAME); ++ if (name != null) ++ am.put(name, actions[i]); ++ } ++ return am; ++ } ++ ++ public void uninstallUI(final JComponent component) ++ { ++ super.uninstallUI(component); ++ rootView.setView(null); ++ ++ textComponent.removePropertyChangeListener(updateHandler); ++ textComponent = null; ++ ++ uninstallDefaults(); ++ uninstallListeners(); ++ uninstallKeyboardActions(); ++ } ++ ++ protected void uninstallDefaults() ++ { ++ // Do nothing here. ++ } ++ ++ protected void uninstallListeners() ++ { ++ // Do nothing here. ++ } ++ ++ protected void uninstallKeyboardActions() ++ { ++ // Do nothing here. ++ } ++ ++ protected abstract String getPropertyPrefix(); ++ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ View v = getRootView(textComponent); ++ ++ float w = v.getPreferredSpan(View.X_AXIS); ++ float h = v.getPreferredSpan(View.Y_AXIS); ++ ++ return new Dimension((int) w, (int) h); ++ } ++ ++ public final void paint(Graphics g, JComponent c) ++ { ++ paintSafely(g); ++ } ++ ++ protected void paintSafely(Graphics g) ++ { ++ Caret caret = textComponent.getCaret(); ++ Highlighter highlighter = textComponent.getHighlighter(); + +- public int viewToModel(JTextComponent t, Point pt) +- { +- return viewToModel(t, pt, null); +- } ++ if (textComponent.isOpaque()) ++ paintBackground(g); + +- public int viewToModel(JTextComponent t, Point pt, Position.Bias[] biasReturn) +- { +- return 0; +- } ++ if (highlighter != null ++ && textComponent.getSelectionStart() != textComponent.getSelectionEnd()) ++ highlighter.paint(g); ++ ++ rootView.paint(g, getVisibleEditorRect()); + +- public View create (Element elem) ++ if (caret != null) ++ caret.paint(g); ++ } ++ ++ protected void paintBackground(Graphics g) ++ { ++ g.setColor(textComponent.getBackground()); ++ g.fillRect(0, 0, textComponent.getWidth(), textComponent.getHeight()); ++ } ++ ++ public void damageRange(JTextComponent t, int p0, int p1) ++ { ++ damageRange(t, p0, p1, null, null); ++ } ++ ++ public void damageRange(JTextComponent t, int p0, int p1, ++ Position.Bias firstBias, Position.Bias secondBias) ++ { ++ } ++ ++ public EditorKit getEditorKit(JTextComponent t) ++ { ++ return kit; ++ } ++ ++ public int getNextVisualPositionFrom(JTextComponent t, int pos, ++ Position.Bias b, int direction, ++ Position.Bias[] biasRet) ++ throws BadLocationException ++ { ++ return 0; ++ } ++ ++ public View getRootView(JTextComponent t) ++ { ++ return rootView; ++ } ++ ++ public Rectangle modelToView(JTextComponent t, int pos) ++ throws BadLocationException ++ { ++ return modelToView(t, pos, Position.Bias.Forward); ++ } ++ ++ public Rectangle modelToView(JTextComponent t, int pos, Position.Bias bias) ++ throws BadLocationException ++ { ++ return rootView.modelToView(pos, getVisibleEditorRect(), bias).getBounds(); ++ } ++ ++ public int viewToModel(JTextComponent t, Point pt) ++ { ++ return viewToModel(t, pt, null); ++ } ++ ++ public int viewToModel(JTextComponent t, Point pt, Position.Bias[] biasReturn) ++ { ++ return 0; ++ } ++ ++ public View create(Element elem) ++ { ++ // subclasses have to implement this to get this functionality ++ return null; ++ } ++ ++ public View create(Element elem, int p0, int p1) + { + // subclasses have to implement this to get this functionality + return null; + } ++ ++ protected Rectangle getVisibleEditorRect() ++ { ++ int width = textComponent.getWidth(); ++ int height = textComponent.getHeight(); ++ ++ if (width <= 0 || height <= 0) ++ return null; ++ ++ Insets insets = textComponent.getInsets(); ++ return new Rectangle(insets.left, insets.top, ++ width - insets.left + insets.right, ++ height - insets.top + insets.bottom); ++ } ++ ++ protected final void setView(View view) ++ { ++ rootView.setView(view); ++ view.setParent(rootView); ++ } ++ ++ protected void modelChanged() ++ { ++ ViewFactory factory = rootView.getViewFactory(); ++ Element elem = textComponent.getDocument().getDefaultRootElement(); ++ setView(factory.create(elem)); ++ } + } +Index: javax/swing/plaf/basic/BasicToggleButtonUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicToggleButtonUI.java,v +retrieving revision 1.4 +diff -u -r1.4 BasicToggleButtonUI.java +--- javax/swing/plaf/basic/BasicToggleButtonUI.java 10 Jan 2004 21:59:30 -0000 1.4 ++++ javax/swing/plaf/basic/BasicToggleButtonUI.java 6 Sep 2004 16:36:08 -0000 +@@ -38,86 +38,15 @@ + + package javax.swing.plaf.basic; + +-import java.awt.Dimension; +-import java.awt.Graphics; +-import java.awt.Rectangle; +-import javax.swing.AbstractButton; + import javax.swing.JComponent; + import javax.swing.plaf.ComponentUI; + + public class BasicToggleButtonUI extends BasicButtonUI + { +- +- public static ComponentUI createUI(final JComponent c) { +- return new BasicToggleButtonUI(); +- } ++ public static ComponentUI createUI(final JComponent component) ++ { ++ return new BasicToggleButtonUI(); ++ } + +- +- public void installUI(final JComponent c) { +- super.installUI(c); +- } +- +- public Dimension getPreferredSize(JComponent c) +- { +- AbstractButton b = (AbstractButton)c; +- Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap); +- +- //System.out.println("^^^^^^^^^^^^^^^^^^^^^^ BASIC-PREF="+d + ",T="+b.text); +- return d; +- } +- +- protected void paintFocus(Graphics g, +- JComponent c, +- Rectangle vr, +- Rectangle tr, +- Rectangle ir) +- { +- } +- +- protected void paintIcon(Graphics g, +- JComponent c, +- Rectangle iconRect) +- { +- } +- +- protected void paintButtonPressed(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(pressedBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } +- +- protected void paintButtonNormal(Graphics g, +- JComponent b) +- { +- Dimension size = b.getSize(); +- +- g.setColor(normalBackgroundColor); +- g.fillRect(1,1,size.width-2, size.height-2); +- +- } +- protected void paintText(Graphics g, +- JComponent c, +- Rectangle textRect, +- String text) +- { +- // AbstractButton b = (AbstractButton) c; +- +- // System.out.println("drawing string: " + text + ", at:" + textRect); +- +- g.setColor(textColor); +- +- BasicGraphicsUtils.drawString(g, +- text, +- 0, +- textRect.x, +- textRect.y); +- } + } + +- +- +- +Index: javax/swing/plaf/basic/BasicToolBarSeparatorUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicToolBarSeparatorUI.java +diff -N javax/swing/plaf/basic/BasicToolBarSeparatorUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicToolBarSeparatorUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,132 @@ ++/* BasicToolBarSeparatorUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import javax.swing.JComponent; ++import javax.swing.JToolBar.Separator; ++import javax.swing.JSeparator; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.SeparatorUI; ++ ++ ++/** ++ * The Basic Look and Feel UI delegate for Separator. ++ */ ++public class BasicToolBarSeparatorUI extends BasicSeparatorUI ++{ ++ private transient Dimension size; ++ ++ /** ++ * Creates a new UI delegate for the given JComponent. ++ * ++ * @param c The JComponent to create a delegate for. ++ * ++ * @return A new BasicToolBarSeparatorUI. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicToolBarSeparatorUI(); ++ } ++ ++ /** ++ * This method installs the defaults that are given by the Basic L&F. ++ * ++ * @param s The Separator that is being installed. ++ */ ++ protected void installDefaults(JSeparator s) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ size = defaults.getDimension("ToolBar.separatorSize"); ++ } ++ ++ /** ++ * This method does nothing as a Separator is just blank space. ++ * ++ * @param g The Graphics object to paint with ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ // Do nothing. ++ } ++ ++ /** ++ * This method returns the preferred size of the JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return size; ++ } ++ ++ /** ++ * This method returns the minimum size of the JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return size; ++ } ++ ++ /** ++ * This method returns the maximum size of the JComponent. ++ * ++ * @param c The JComponent to measure. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return size; ++ } ++} +Index: javax/swing/plaf/basic/BasicToolBarUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicToolBarUI.java +diff -N javax/swing/plaf/basic/BasicToolBarUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicToolBarUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,1435 @@ ++/* BasicToolBarUI.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.ComponentOrientation; ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.GridLayout; ++import java.awt.Insets; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.Window; ++import java.awt.event.ContainerEvent; ++import java.awt.event.ContainerListener; ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.event.WindowAdapter; ++import java.awt.event.WindowEvent; ++import java.awt.event.WindowListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; ++import java.util.Enumeration; ++import java.util.Hashtable; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JDialog; ++import javax.swing.JFrame; ++import javax.swing.JToolBar; ++import javax.swing.RootPaneContainer; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.border.Border; ++import javax.swing.event.MouseInputListener; ++import javax.swing.plaf.BorderUIResource; ++import javax.swing.plaf.BorderUIResource.EtchedBorderUIResource; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.ToolBarUI; ++import javax.swing.plaf.UIResource; ++ ++ ++/** ++ * This is the Basic Look and Feel UI class for JToolBar. ++ */ ++public class BasicToolBarUI extends ToolBarUI implements SwingConstants ++{ ++ /** Static owner of all DragWindows. */ ++ private static JFrame owner = new JFrame(); ++ ++ /** The border used when the JToolBar is in nonrollover mode. */ ++ private static Border nonRolloverBorder; ++ ++ /** The border used when the JToolBar is in rollover mode. */ ++ private static Border rolloverBorder; ++ ++ /** The last known BorderLayout constraint before floating. */ ++ protected String constraintBeforeFloating; ++ ++ /** The last known orientation of the JToolBar before floating. */ ++ private int lastGoodOrientation; ++ ++ /** The color of the border when it is dockable. */ ++ protected Color dockingBorderColor; ++ ++ /** The background color of the JToolBar when it is dockable. */ ++ protected Color dockingColor; ++ ++ /** The docking listener responsible for mouse events on the JToolBar. */ ++ protected MouseInputListener dockingListener; ++ ++ /** The window used for dragging the JToolBar. */ ++ protected BasicToolBarUI.DragWindow dragWindow; ++ ++ /** The color of the border when it is not dockable. */ ++ protected Color floatingBorderColor; ++ ++ /** The background color of the JToolBar when it is not dockable. */ ++ protected Color floatingColor; ++ ++ /** The index of the focused component. */ ++ protected int focusedCompIndex; ++ ++ /** The PropertyChangeListener for the JToolBar. */ ++ protected PropertyChangeListener propertyListener; ++ ++ /** The JToolBar this UI delegate is responsible for. */ ++ protected JToolBar toolBar; ++ ++ /** The Container listener for the JToolBar. */ ++ protected ContainerListener toolBarContListener; ++ ++ /** The Focus listener for the JToolBar. */ ++ protected FocusListener toolBarFocusListener; ++ ++ /** ++ * The floating window that is responsible for holding the JToolBar when it ++ * is dragged outside of its original parent. ++ */ ++ private transient Window floatFrame; ++ ++ /** The original parent of the JToolBar. */ ++ private transient Container origParent; ++ ++ /** A hashtable of components and their original borders. */ ++ private transient Hashtable borders; ++ ++ /** A window listener for the floatable frame. */ ++ private transient WindowListener windowListener; ++ ++ /** A set of cached bounds of the JToolBar. */ ++ private transient Dimension cachedBounds; ++ ++ /** The cached orientation of the JToolBar. */ ++ private transient int cachedOrientation; ++ ++ /** ++ * This method creates a new BasicToolBarUI object for the given JToolBar. ++ */ ++ public BasicToolBarUI() ++ { ++ super(); ++ } ++ ++ /** ++ * This method returns whether the JToolBar can dock at the given position. ++ * ++ * @param c The component to try to dock in. ++ * @param p The position of the mouse cursor relative to the given ++ * component. ++ * ++ * @return Whether the JToolBar can dock. ++ */ ++ protected boolean canDock(Component c, Point p) ++ { ++ if (areaOfClick(c, p) != -1) ++ return true; ++ ++ return false; ++ } ++ ++ /** ++ * This helper method returns the position of the JToolBar if it can dock. ++ * ++ * @param c The component to try to dock in. ++ * @param p The position of the mouse cursor relative to the given ++ * component. ++ * ++ * @return One of the SwingConstants directions or -1 if the JToolBar can't ++ * dock. ++ */ ++ private int areaOfClick(Component c, Point p) ++ { ++ // Has to dock in immediate parent, not eventual root container. ++ Rectangle pBounds = c.getBounds(); ++ ++ // XXX: In Sun's implementation, the space the toolbar has to dock is dependent on the size it had last. ++ Dimension d = toolBar.getSize(); ++ int limit = Math.min(d.width, d.height); ++ ++ // The order of checking is 1. top 2. bottom 3. left 4. right ++ if (! pBounds.contains(p)) ++ return -1; ++ ++ if (p.y < limit) ++ return SwingConstants.NORTH; ++ ++ if (p.y > (pBounds.height - limit)) ++ return SwingConstants.SOUTH; ++ ++ if (p.x < limit) ++ return SwingConstants.WEST; ++ ++ if (p.x > (pBounds.width - limit)) ++ return SwingConstants.EAST; ++ ++ return -1; ++ } ++ ++ /** ++ * This method creates a new DockingListener for the JToolBar. ++ * ++ * @return A new DockingListener for the JToolBar. ++ */ ++ protected MouseInputListener createDockingListener() ++ { ++ return new DockingListener(toolBar); ++ } ++ ++ /** ++ * This method creates a new DragWindow for the given JToolBar. ++ * ++ * @param toolbar The JToolBar to create a DragWindow for. ++ * ++ * @return A new DragWindow. ++ */ ++ protected BasicToolBarUI.DragWindow createDragWindow(JToolBar toolbar) ++ { ++ return new DragWindow(); ++ } ++ ++ /** ++ * This method creates a new floating frame for the JToolBar. By default, ++ * this UI uses createFloatingWindow instead. This method of creating a ++ * floating frame is deprecated. ++ * ++ * @param toolbar The JToolBar to create a floating frame for. ++ * ++ * @return A new floating frame. ++ */ ++ protected JFrame createFloatingFrame(JToolBar toolbar) ++ { ++ // FIXME: Though deprecated, this should still work. ++ return null; ++ } ++ ++ /** ++ * This method creates a new floating window for the JToolBar. This is the ++ * method used by default to create a floating container for the JToolBar. ++ * ++ * @param toolbar The JToolBar to create a floating window for. ++ * ++ * @return A new floating window. ++ */ ++ protected RootPaneContainer createFloatingWindow(JToolBar toolbar) ++ { ++ // This one is used by default though. ++ return new ToolBarDialog(); ++ } ++ ++ /** ++ * This method creates a new WindowListener for the JToolBar. ++ * ++ * @return A new WindowListener. ++ */ ++ protected WindowListener createFrameListener() ++ { ++ return new FrameListener(); ++ } ++ ++ /** ++ * This method creates a new nonRolloverBorder for JButtons when the ++ * JToolBar's rollover property is set to false. ++ * ++ * @return A new NonRolloverBorder. ++ */ ++ protected Border createNonRolloverBorder() ++ { ++ return new EtchedBorderUIResource(); ++ } ++ ++ /** ++ * This method creates a new PropertyChangeListener for the JToolBar. ++ * ++ * @return A new PropertyChangeListener. ++ */ ++ protected PropertyChangeListener createPropertyListener() ++ { ++ return new PropertyListener(); ++ } ++ ++ /** ++ * This method creates a new rollover border for JButtons when the ++ * JToolBar's rollover property is set to true. ++ * ++ * @return A new rollover border. ++ */ ++ protected Border createRolloverBorder() ++ { ++ return new EtchedBorderUIResource() ++ { ++ public void paintBorder(Component c, Graphics g, int x, int y, ++ int width, int height) ++ { ++ if (c instanceof JButton) ++ { ++ if (((JButton) c).getModel().isRollover()) ++ super.paintBorder(c, g, x, y, width, height); ++ } ++ } ++ }; ++ } ++ ++ /** ++ * This method creates a new Container listener for the JToolBar. ++ * ++ * @return A new Container listener. ++ */ ++ protected ContainerListener createToolBarContListener() ++ { ++ return new ToolBarContListener(); ++ } ++ ++ /** ++ * This method creates a new FocusListener for the JToolBar. ++ * ++ * @return A new FocusListener for the JToolBar. ++ */ ++ protected FocusListener createToolBarFocusListener() ++ { ++ return new ToolBarFocusListener(); ++ } ++ ++ /** ++ * This method creates a new UI delegate for the given JComponent. ++ * ++ * @param c The JComponent to create a UI delegate for. ++ * ++ * @return A new UI delegate. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicToolBarUI(); ++ } ++ ++ /** ++ * This method is called to drag the DragWindow around when the JToolBar is ++ * being dragged around. ++ * ++ * @param position The mouse cursor coordinates relative to the JToolBar. ++ * @param origin The screen position of the JToolBar. ++ */ ++ protected void dragTo(Point position, Point origin) ++ { ++ int loc = areaOfClick(origParent, ++ SwingUtilities.convertPoint(toolBar, position, ++ origParent)); ++ ++ if (loc != -1) ++ { ++ dragWindow.setBorderColor(dockingBorderColor); ++ dragWindow.setBackground(dockingColor); ++ } ++ else ++ { ++ dragWindow.setBorderColor(floatingBorderColor); ++ dragWindow.setBackground(floatingColor); ++ } ++ ++ int w = 0; ++ int h = 0; ++ ++ boolean tmp = ((loc == SwingConstants.NORTH) ++ || (loc == SwingConstants.SOUTH) || (loc == -1)); ++ ++ if (((cachedOrientation == SwingConstants.HORIZONTAL) && tmp) ++ || ((cachedOrientation == VERTICAL) && ! tmp)) ++ { ++ w = cachedBounds.width; ++ h = cachedBounds.height; ++ } ++ else ++ { ++ w = cachedBounds.height; ++ h = cachedBounds.width; ++ } ++ ++ Point p = dragWindow.getOffset(); ++ Insets insets = toolBar.getInsets(); ++ ++ dragWindow.setBounds((origin.x + position.x) - p.x ++ - ((insets.left + insets.right) / 2), ++ (origin.y + position.y) - p.y ++ - ((insets.top + insets.bottom) / 2), w, h); ++ ++ if (! dragWindow.isVisible()) ++ dragWindow.show(); ++ } ++ ++ /** ++ * This method is used at the end of a drag session to place the frame in ++ * either its original parent as a docked JToolBar or in its floating ++ * frame. ++ * ++ * @param position The position of the mouse cursor relative to the ++ * JToolBar. ++ * @param origin The screen position of the JToolBar before the drag session ++ * started. ++ */ ++ protected void floatAt(Point position, Point origin) ++ { ++ Point p = new Point(position); ++ int aoc = areaOfClick(origParent, ++ SwingUtilities.convertPoint(toolBar, p, origParent)); ++ ++ Container oldParent = toolBar.getParent(); ++ ++ oldParent.remove(toolBar); ++ oldParent.doLayout(); ++ oldParent.repaint(); ++ ++ Container newParent; ++ ++ if (aoc == -1) ++ newParent = ((RootPaneContainer) floatFrame).getContentPane(); ++ else ++ { ++ floatFrame.hide(); ++ newParent = origParent; ++ } ++ ++ String constraint; ++ switch (aoc) ++ { ++ case SwingConstants.EAST: ++ constraint = BorderLayout.EAST; ++ break; ++ case SwingConstants.NORTH: ++ constraint = BorderLayout.NORTH; ++ break; ++ case SwingConstants.SOUTH: ++ constraint = BorderLayout.SOUTH; ++ break; ++ case SwingConstants.WEST: ++ constraint = BorderLayout.WEST; ++ break; ++ default: ++ constraint = BorderLayout.CENTER; ++ break; ++ } ++ ++ int newOrientation = SwingConstants.HORIZONTAL; ++ if ((aoc != -1) ++ && ((aoc == SwingConstants.EAST) || (aoc == SwingConstants.WEST))) ++ newOrientation = SwingConstants.VERTICAL; ++ ++ if (aoc != -1) ++ { ++ constraintBeforeFloating = constraint; ++ lastGoodOrientation = newOrientation; ++ } ++ ++ newParent.add(toolBar, constraint); ++ ++ setFloating(aoc == -1, null); ++ toolBar.setOrientation(newOrientation); ++ ++ Insets insets = floatFrame.getInsets(); ++ Dimension dims = toolBar.getPreferredSize(); ++ p = dragWindow.getOffset(); ++ setFloatingLocation((position.x + origin.x) - p.x ++ - ((insets.left + insets.right) / 2), ++ (position.y + origin.y) - p.y ++ - ((insets.top + insets.bottom) / 2)); ++ ++ if (aoc == -1) ++ { ++ floatFrame.pack(); ++ floatFrame.setSize(dims.width + insets.left + insets.right, ++ dims.height + insets.top + insets.bottom); ++ floatFrame.show(); ++ } ++ ++ newParent.invalidate(); ++ newParent.validate(); ++ newParent.repaint(); ++ } ++ ++ /** ++ * This method returns the docking color. ++ * ++ * @return The docking color. ++ */ ++ public Color getDockingColor() ++ { ++ return dockingColor; ++ } ++ ++ /** ++ * This method returns the Color which is displayed when over a floating ++ * area. ++ * ++ * @return The color which is displayed when over a floating area. ++ */ ++ public Color getFloatingColor() ++ { ++ return floatingColor; ++ } ++ ++ /** ++ * This method returns the maximum size of the given JComponent for this UI. ++ * ++ * @param c The JComponent to find the maximum size for. ++ * ++ * @return The maximum size for this UI. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the minimum size of the given JComponent for this UI. ++ * ++ * @param c The JComponent to find a minimum size for. ++ * ++ * @return The minimum size for this UI. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size of the given JComponent for this ++ * UI. ++ * ++ * @param c The JComponent to find a preferred size for. ++ * ++ * @return The preferred size for this UI. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ return toolBar.getLayout().preferredLayoutSize(c); ++ } ++ ++ /** ++ * This method installs the needed components for the JToolBar. ++ */ ++ protected void installComponents() ++ { ++ floatFrame = (Window) createFloatingWindow(toolBar); ++ ++ dragWindow = createDragWindow(toolBar); ++ ++ cachedBounds = toolBar.getPreferredSize(); ++ cachedOrientation = toolBar.getOrientation(); ++ ++ nonRolloverBorder = createNonRolloverBorder(); ++ rolloverBorder = createRolloverBorder(); ++ ++ borders = new Hashtable(); ++ ++ fillHashtable(); ++ } ++ ++ /** ++ * This method installs the defaults as specified by the look and feel. ++ */ ++ protected void installDefaults() ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ ++ toolBar.setBorder(new ToolBarBorder()); ++ toolBar.setBackground(defaults.getColor("ToolBar.background")); ++ toolBar.setForeground(defaults.getColor("ToolBar.foreground")); ++ toolBar.setFont(defaults.getFont("ToolBar.font")); ++ ++ dockingBorderColor = defaults.getColor("ToolBar.dockingForeground"); ++ dockingColor = defaults.getColor("ToolBar.dockingBackground"); ++ ++ floatingBorderColor = defaults.getColor("ToolBar.floatingForeground"); ++ floatingColor = defaults.getColor("ToolBar.floatingBackground"); ++ } ++ ++ /** ++ * This method installs the keyboard actions for the JToolBar as specified ++ * by the look and feel. ++ */ ++ protected void installKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method installs listeners for the JToolBar. ++ * ++ * @param toolbar The JToolBar to register listeners for. ++ */ ++ protected void installListeners(JToolBar toolbar) ++ { ++ dockingListener = createDockingListener(); ++ toolBar.addMouseListener(dockingListener); ++ toolBar.addMouseMotionListener(dockingListener); ++ ++ propertyListener = createPropertyListener(); ++ toolBar.addPropertyChangeListener(propertyListener); ++ ++ toolBarContListener = createToolBarContListener(); ++ toolBar.addContainerListener(toolBarContListener); ++ ++ windowListener = createFrameListener(); ++ floatFrame.addWindowListener(windowListener); ++ ++ toolBarFocusListener = createToolBarFocusListener(); ++ toolBar.addFocusListener(toolBarFocusListener); ++ } ++ ++ /** ++ * This method installs non rollover borders for each component inside the ++ * given JComponent. ++ * ++ * @param c The JComponent whose children need to have non rollover borders ++ * installed. ++ */ ++ protected void installNonRolloverBorders(JComponent c) ++ { ++ Component[] components = toolBar.getComponents(); ++ ++ for (int i = 0; i < components.length; i++) ++ setBorderToNonRollover(components[i]); ++ } ++ ++ /** ++ * This method installs normal (or their original) borders for each ++ * component inside the given JComponent. ++ * ++ * @param c The JComponent whose children need to have their original ++ * borders installed. ++ */ ++ protected void installNormalBorders(JComponent c) ++ { ++ Component[] components = toolBar.getComponents(); ++ ++ for (int i = 0; i < components.length; i++) ++ setBorderToNormal(components[i]); ++ } ++ ++ /** ++ * This method install rollover borders for each component inside the given ++ * JComponent. ++ * ++ * @param c The JComponent whose children need to have rollover borders ++ * installed. ++ */ ++ protected void installRolloverBorders(JComponent c) ++ { ++ Component[] components = toolBar.getComponents(); ++ ++ for (int i = 0; i < components.length; i++) ++ setBorderToRollover(components[i]); ++ } ++ ++ /** ++ * This method fills the borders hashtable with a list of components that ++ * are JButtons and their borders. ++ */ ++ private void fillHashtable() ++ { ++ Component[] c = toolBar.getComponents(); ++ ++ for (int i = 0; i < c.length; i++) ++ { ++ if (c[i] instanceof JButton) ++ { ++ // Don't really care about anything other than JButtons ++ JButton b = (JButton) c[i]; ++ ++ if (b.getBorder() != null) ++ borders.put(b, b.getBorder()); ++ } ++ } ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install a UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ ++ if (c instanceof JToolBar) ++ { ++ toolBar = (JToolBar) c; ++ toolBar.setOpaque(true); ++ installDefaults(); ++ installComponents(); ++ installListeners(toolBar); ++ installKeyboardActions(); ++ } ++ } ++ ++ /** ++ * This method returns whether the JToolBar is floating. ++ * ++ * @return Whether the JToolBar is floating. ++ */ ++ public boolean isFloating() ++ { ++ return floatFrame.isVisible(); ++ } ++ ++ /** ++ * This method returns whether rollover borders have been set. ++ * ++ * @return Whether rollover borders have been set. ++ */ ++ public boolean isRolloverBorders() ++ { ++ return toolBar.isRollover(); ++ } ++ ++ /** ++ * This method navigates in the given direction giving focus to the next ++ * component in the given direction. ++ * ++ * @param direction The direction to give focus to. ++ */ ++ protected void navigateFocusedComp(int direction) ++ { ++ // FIXME: Implement. ++ } ++ ++ /** ++ * This method sets the border of the given component to a non rollover ++ * border. ++ * ++ * @param c The Component whose border needs to be set. ++ */ ++ protected void setBorderToNonRollover(Component c) ++ { ++ if (c instanceof JButton) ++ { ++ JButton b = (JButton) c; ++ b.setRolloverEnabled(false); ++ b.setBorder(nonRolloverBorder); ++ } ++ } ++ ++ /** ++ * This method sets the border of the given component to its original value. ++ * ++ * @param c The Component whose border needs to be set. ++ */ ++ protected void setBorderToNormal(Component c) ++ { ++ if (c instanceof JButton) ++ { ++ JButton b = (JButton) c; ++ Border border = (Border) borders.get(b); ++ b.setBorder(border); ++ } ++ } ++ ++ /** ++ * This method sets the border of the given component to a rollover border. ++ * ++ * @param c The Component whose border needs to be set. ++ */ ++ protected void setBorderToRollover(Component c) ++ { ++ if (c instanceof JButton) ++ { ++ JButton b = (JButton) c; ++ b.setRolloverEnabled(true); ++ b.setBorder(rolloverBorder); ++ } ++ } ++ ++ /** ++ * This method sets the docking color. ++ * ++ * @param c The docking color. ++ */ ++ public void setDockingColor(Color c) ++ { ++ dockingColor = c; ++ } ++ ++ /** ++ * This method sets the floating property for the JToolBar. ++ * ++ * @param b Whether the JToolBar is floating. ++ * @param p FIXME ++ */ ++ public void setFloating(boolean b, Point p) ++ { ++ // FIXME: use p for something. It's not location ++ // since we already have setFloatingLocation. ++ floatFrame.setVisible(b); ++ } ++ ++ /** ++ * This method sets the color displayed when the JToolBar is not in a ++ * dockable area. ++ * ++ * @param c The floating color. ++ */ ++ public void setFloatingColor(Color c) ++ { ++ floatingColor = c; ++ } ++ ++ /** ++ * This method sets the floating location of the JToolBar. ++ * ++ * @param x The x coordinate for the floating frame. ++ * @param y The y coordinate for the floating frame. ++ */ ++ public void setFloatingLocation(int x, int y) ++ { ++ // x,y are the coordinates of the new JFrame created to store the toolbar ++ // XXX: The floating location is bogus is not floating. ++ floatFrame.setLocation(x, y); ++ floatFrame.invalidate(); ++ floatFrame.validate(); ++ floatFrame.repaint(); ++ } ++ ++ /** ++ * This is a convenience method for changing the orientation of the ++ * JToolBar. ++ * ++ * @param orientation The new orientation. ++ */ ++ public void setOrientation(int orientation) ++ { ++ toolBar.setOrientation(orientation); ++ } ++ ++ /** ++ * This method changes the child components to have rollover borders if the ++ * given parameter is true. Otherwise, the components are set to have non ++ * rollover borders. ++ * ++ * @param rollover Whether the children will have rollover borders. ++ */ ++ public void setRolloverBorders(boolean rollover) ++ { ++ if (rollover) ++ installRolloverBorders(toolBar); ++ else ++ installNonRolloverBorders(toolBar); ++ } ++ ++ /** ++ * This method uninstall UI installed components from the JToolBar. ++ */ ++ protected void uninstallComponents() ++ { ++ installNormalBorders(toolBar); ++ borders = null; ++ rolloverBorder = null; ++ nonRolloverBorder = null; ++ cachedBounds = null; ++ ++ floatFrame = null; ++ dragWindow = null; ++ } ++ ++ /** ++ * This method removes the defaults installed by the Look and Feel. ++ */ ++ protected void uninstallDefaults() ++ { ++ toolBar.setBackground(null); ++ toolBar.setForeground(null); ++ toolBar.setFont(null); ++ ++ dockingBorderColor = null; ++ dockingColor = null; ++ floatingBorderColor = null; ++ floatingColor = null; ++ } ++ ++ /** ++ * This method uninstalls keyboard actions installed by the UI. ++ */ ++ protected void uninstallKeyboardActions() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * This method uninstalls listeners installed by the UI. ++ */ ++ protected void uninstallListeners() ++ { ++ toolBar.removeFocusListener(toolBarFocusListener); ++ toolBarFocusListener = null; ++ ++ floatFrame.removeWindowListener(windowListener); ++ windowListener = null; ++ ++ toolBar.removeContainerListener(toolBarContListener); ++ toolBarContListener = null; ++ ++ toolBar.removeMouseMotionListener(dockingListener); ++ toolBar.removeMouseListener(dockingListener); ++ dockingListener = null; ++ } ++ ++ /** ++ * This method uninstalls the UI. ++ * ++ * @param c The JComponent that is having this UI removed. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallKeyboardActions(); ++ uninstallListeners(); ++ uninstallComponents(); ++ uninstallDefaults(); ++ toolBar = null; ++ } ++ ++ /** ++ * This is the MouseHandler class that allows the user to drag the JToolBar ++ * in and out of the parent and dock it if it can. ++ */ ++ protected class DockingListener implements MouseInputListener ++ { ++ /** Whether the JToolBar is being dragged. */ ++ protected boolean isDragging; ++ ++ /** ++ * The origin point. This point is saved from the beginning press and is ++ * used until the end of the drag session. ++ */ ++ protected Point origin; ++ ++ /** The JToolBar being dragged. */ ++ protected JToolBar toolBar; ++ ++ /** ++ * Creates a new DockingListener object. ++ * ++ * @param t The JToolBar this DockingListener is being used for. ++ */ ++ public DockingListener(JToolBar t) ++ { ++ toolBar = t; ++ } ++ ++ /** ++ * This method is called when the mouse is clicked. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseClicked(MouseEvent e) ++ { ++ // Don't care. ++ } ++ ++ /** ++ * This method is called when the mouse is dragged. It delegates the drag ++ * painting to the dragTo method. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseDragged(MouseEvent e) ++ { ++ if (isDragging) ++ dragTo(e.getPoint(), origin); ++ } ++ ++ /** ++ * This method is called when the mouse enters the JToolBar. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseEntered(MouseEvent e) ++ { ++ // Don't care (yet). ++ } ++ ++ /** ++ * This method is called when the mouse exits the JToolBar. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseExited(MouseEvent e) ++ { ++ // Don't care (yet). ++ } ++ ++ /** ++ * This method is called when the mouse is moved in the JToolBar. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseMoved(MouseEvent e) ++ { ++ } ++ ++ /** ++ * This method is called when the mouse is pressed in the JToolBar. If the ++ * press doesn't occur in a place where it causes the JToolBar to be ++ * dragged, it returns. Otherwise, it starts a drag session. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mousePressed(MouseEvent e) ++ { ++ if (! toolBar.isFloatable()) ++ return; ++ ++ Point ssd = e.getPoint(); ++ Insets insets = toolBar.getInsets(); ++ ++ // Verify that this click occurs in the top inset. ++ if (toolBar.getOrientation() == SwingConstants.HORIZONTAL) ++ { ++ if (e.getX() > insets.left) ++ return; ++ } ++ else ++ { ++ if (e.getY() > insets.top) ++ return; ++ } ++ ++ origin = new Point(0, 0); ++ SwingUtilities.convertPointToScreen(ssd, toolBar); ++ ++ if (! (SwingUtilities.getAncestorOfClass(Window.class, toolBar) instanceof UIResource)) ++ // Need to know who keeps the toolBar if it gets dragged back into it. ++ origParent = toolBar.getParent(); ++ ++ SwingUtilities.convertPointToScreen(origin, toolBar); ++ ++ isDragging = true; ++ ++ if (dragWindow != null) ++ dragWindow.setOffset(new Point(e.getX(), e.getY())); ++ ++ dragTo(e.getPoint(), origin); ++ } ++ ++ /** ++ * This method is called when the mouse is released from the JToolBar. ++ * ++ * @param e The MouseEvent. ++ */ ++ public void mouseReleased(MouseEvent e) ++ { ++ if (! isDragging || ! toolBar.isFloatable()) ++ return; ++ ++ isDragging = false; ++ floatAt(e.getPoint(), origin); ++ dragWindow.hide(); ++ } ++ } ++ ++ /** ++ * This is the window that appears when the JToolBar is being dragged ++ * around. ++ */ ++ protected class DragWindow extends Window ++ { ++ /** ++ * The current border color. It changes depending on whether the JToolBar ++ * is over a place that allows it to dock. ++ */ ++ private Color borderColor; ++ ++ /** The between the mouse and the top left corner of the window. */ ++ private Point offset; ++ ++ /** ++ * Creates a new DragWindow object. ++ */ ++ private DragWindow() ++ { ++ super(owner); ++ } ++ ++ /** ++ * The color that the border should be. ++ * ++ * @return The border color. ++ */ ++ public Color getBorderColor() ++ { ++ if (borderColor == null) ++ return Color.BLACK; ++ ++ return borderColor; ++ } ++ ++ /** ++ * This method returns the insets for the DragWindow. ++ * ++ * @return The insets for the DragWindow. ++ */ ++ public Insets getInsets() ++ { ++ // This window has no decorations, so insets are empty. ++ return new Insets(0, 0, 0, 0); ++ } ++ ++ /** ++ * This method returns the mouse offset from the top left corner of the ++ * DragWindow. ++ * ++ * @return The mouse offset. ++ */ ++ public Point getOffset() ++ { ++ return offset; ++ } ++ ++ /** ++ * This method paints the DragWindow. ++ * ++ * @param g The Graphics object to paint with. ++ */ ++ public void paint(Graphics g) ++ { ++ // No visiting children necessary. ++ Color saved = g.getColor(); ++ Rectangle b = getBounds(); ++ ++ g.setColor(getBorderColor()); ++ g.drawRect(0, 0, b.width - 1, b.height - 1); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method changes the border color. ++ * ++ * @param c The new border color. ++ */ ++ public void setBorderColor(Color c) ++ { ++ borderColor = c; ++ } ++ ++ /** ++ * This method changes the mouse offset. ++ * ++ * @param p The new mouse offset. ++ */ ++ public void setOffset(Point p) ++ { ++ offset = p; ++ } ++ ++ /** ++ * FIXME: Do something. ++ * ++ * @param o DOCUMENT ME! ++ */ ++ public void setOrientation(int o) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This helper class listens for Window events from the floatable window and ++ * if it is closed, returns the JToolBar to the last known good location. ++ */ ++ protected class FrameListener extends WindowAdapter ++ { ++ /** ++ * This method is called when the floating window is closed. ++ * ++ * @param e The WindowEvent. ++ */ ++ public void windowClosing(WindowEvent e) ++ { ++ Container parent = toolBar.getParent(); ++ parent.remove(toolBar); ++ ++ if (origParent != null) ++ { ++ origParent.add(toolBar, ++ (constraintBeforeFloating != null) ++ ? constraintBeforeFloating : BorderLayout.NORTH); ++ toolBar.setOrientation(lastGoodOrientation); ++ } ++ ++ origParent.invalidate(); ++ origParent.validate(); ++ origParent.repaint(); ++ } ++ } ++ ++ /** ++ * This helper class listens for PropertyChangeEvents from the JToolBar. ++ */ ++ protected class PropertyListener implements PropertyChangeListener ++ { ++ /** ++ * This method is called when a property from the JToolBar is changed. ++ * ++ * @param e The PropertyChangeEvent. ++ */ ++ public void propertyChange(PropertyChangeEvent e) ++ { ++ // FIXME: need name properties so can change floatFrame title. ++ if (e.getPropertyName().equals(JToolBar.ROLLOVER_CHANGED_PROPERTY)) ++ setRolloverBorders(toolBar.isRollover()); ++ } ++ } ++ ++ /** ++ * This helper class listens for components added to and removed from the ++ * JToolBar. ++ */ ++ protected class ToolBarContListener implements ContainerListener ++ { ++ /** ++ * This method is responsible for setting rollover or non rollover for new ++ * buttons added to the JToolBar. ++ * ++ * @param e The ContainerEvent. ++ */ ++ public void componentAdded(ContainerEvent e) ++ { ++ if (e.getChild() instanceof JButton) ++ { ++ JButton b = (JButton) e.getChild(); ++ ++ if (b.getBorder() != null) ++ borders.put(b, b.getBorder()); ++ } ++ ++ if (isRolloverBorders()) ++ setBorderToRollover(e.getChild()); ++ else ++ setBorderToNonRollover(e.getChild()); ++ ++ cachedBounds = toolBar.getPreferredSize(); ++ cachedOrientation = toolBar.getOrientation(); ++ } ++ ++ /** ++ * This method is responsible for giving the child components their ++ * original borders when they are removed. ++ * ++ * @param e The ContainerEvent. ++ */ ++ public void componentRemoved(ContainerEvent e) ++ { ++ setBorderToNormal(e.getChild()); ++ cachedBounds = toolBar.getPreferredSize(); ++ cachedOrientation = toolBar.getOrientation(); ++ } ++ } ++ ++ /** ++ * This is the floating window that is returned when getFloatingWindow is ++ * called. ++ */ ++ private class ToolBarDialog extends JDialog implements UIResource ++ { ++ /** ++ * Creates a new ToolBarDialog object with the name given by the JToolBar. ++ */ ++ public ToolBarDialog() ++ { ++ super(); ++ setName((toolBar.getName() != null) ? toolBar.getName() : ""); ++ } ++ } ++ ++ /** ++ * DOCUMENT ME! ++ */ ++ protected class ToolBarFocusListener implements FocusListener ++ { ++ /** ++ * Creates a new ToolBarFocusListener object. ++ */ ++ protected ToolBarFocusListener() ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param e DOCUMENT ME! ++ */ ++ public void focusGained(FocusEvent e) ++ { ++ // FIXME: implement. ++ } ++ ++ /** ++ * DOCUMENT ME! ++ * ++ * @param e DOCUMENT ME! ++ */ ++ public void focusLost(FocusEvent e) ++ { ++ // FIXME: implement. ++ } ++ } ++ ++ /** ++ * This helper class acts as the border for the JToolBar. ++ */ ++ private static class ToolBarBorder implements Border ++ { ++ /** The size of the larger, draggable side of the border. */ ++ private static int offset = 10; ++ ++ /** The other sides. */ ++ private static int regular = 2; ++ ++ /** ++ * This method returns the border insets for the JToolBar. ++ * ++ * @param c The Component to find insets for. ++ * ++ * @return The border insets. ++ */ ++ public Insets getBorderInsets(Component c) ++ { ++ if (c instanceof JToolBar) ++ { ++ JToolBar tb = (JToolBar) c; ++ int orientation = tb.getOrientation(); ++ ++ if (! tb.isFloatable()) ++ return new Insets(regular, regular, regular, regular); ++ else if (orientation == SwingConstants.HORIZONTAL) ++ return new Insets(regular, offset, regular, regular); ++ else ++ return new Insets(offset, regular, regular, regular); ++ } ++ ++ return new Insets(0, 0, 0, 0); ++ } ++ ++ /** ++ * This method returns whether the border is opaque. ++ * ++ * @return Whether the border is opaque. ++ */ ++ public boolean isBorderOpaque() ++ { ++ return false; ++ } ++ ++ /** ++ * This method paints the ribbed area of the border. ++ * ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate of the area. ++ * @param y The y coordinate of the area. ++ * @param w The width of the area. ++ * @param h The height of the area. ++ * @param size The size of the bump. ++ * @param c The color of the bumps. ++ */ ++ private void paintBumps(Graphics g, int x, int y, int w, int h, int size, ++ Color c) ++ { ++ Color saved = g.getColor(); ++ g.setColor(c); ++ ++ int hgap = 2 * size; ++ int vgap = 4 * size; ++ int count = 0; ++ ++ for (int i = x; i < (w + x); i += hgap) ++ for (int j = ((count++ % 2) == 0) ? y : (y + (2 * size)); j < (h + y); ++ j += vgap) ++ g.fillRect(i, j, size, size); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method paints the border around the given Component. ++ * ++ * @param c The Component whose border is being painted. ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate of the component. ++ * @param y The y coordinate of the component. ++ * @param width The width of the component. ++ * @param height The height of the component. ++ */ ++ public void paintBorder(Component c, Graphics g, int x, int y, int width, ++ int height) ++ { ++ if (c instanceof JToolBar) ++ { ++ JToolBar tb = (JToolBar) c; ++ ++ int orientation = tb.getOrientation(); ++ ++ if (orientation == SwingConstants.HORIZONTAL) ++ { ++ paintBumps(g, x, y, offset, height, 1, Color.WHITE); ++ paintBumps(g, x + 1, y + 1, offset - 1, height - 1, 1, Color.GRAY); ++ } ++ else ++ { ++ paintBumps(g, x, y, width, offset, 1, Color.WHITE); ++ paintBumps(g, x + 1, y + 1, width - 1, offset - 1, 1, Color.GRAY); ++ } ++ } ++ } ++ } ++} +Index: javax/swing/plaf/basic/BasicToolTipUI.java +=================================================================== +RCS file: javax/swing/plaf/basic/BasicToolTipUI.java +diff -N javax/swing/plaf/basic/BasicToolTipUI.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/BasicToolTipUI.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,287 @@ ++/* BasicToolTipUI.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++import javax.swing.JComponent; ++import javax.swing.JToolTip; ++import javax.swing.SwingConstants; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.border.Border; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.ToolTipUI; ++ ++ ++/** ++ * This is the Basic Look and Feel UI class for JToolTip. ++ */ ++public class BasicToolTipUI extends ToolTipUI ++{ ++ /** The default Border around the JToolTip. */ ++ private static Border defaultBorder = new Border() ++ { ++ // FIXME: This needs to go into Basic Look and Feel ++ // defaults. ++ ++ /** ++ * This method returns the border insets. ++ * ++ * @param c The Component to find Border insets for. ++ * ++ * @return The Border insets. ++ */ ++ public Insets getBorderInsets(Component c) ++ { ++ return new Insets(4, 4, 4, 4); ++ } ++ ++ /** ++ * This method returns whether the border is opaque. ++ * ++ * @return Whether the border is opaque. ++ */ ++ public boolean isBorderOpaque() ++ { ++ return false; ++ } ++ ++ /** ++ * This method paints the border. ++ * ++ * @param c The Component to paint this border around. ++ * @param g The Graphics object to paint with. ++ * @param x The x coordinate to start painting at. ++ * @param y The y coordinate to start painting at. ++ * @param w The width of the Component. ++ * @param y The height of the Component. ++ */ ++ public void paintBorder(Component c, Graphics g, int x, int y, int w, ++ int h) ++ { ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawRect(0, 0, w - 1, h - 1); ++ ++ g.setColor(saved); ++ } ++ }; ++ ++ /** The shared instance of BasicToolTipUI used for all ToolTips. */ ++ private static BasicToolTipUI shared; ++ ++ /** ++ * Creates a new BasicToolTipUI object. ++ */ ++ public BasicToolTipUI() ++ { ++ super(); ++ } ++ ++ /** ++ * This method creates a new BasicToolTip UI for the given ++ * JComponent. ++ * ++ * @param c The JComponent to create a UI for. ++ * ++ * @return A BasicToolTipUI that can be used by the given JComponent. ++ */ ++ public static ComponentUI createUI(JComponent c) ++ { ++ if (shared == null) ++ shared = new BasicToolTipUI(); ++ return shared; ++ } ++ ++ /** ++ * This method returns the msximum size of the given JComponent. ++ * ++ * @param c The JComponent to find a maximum size for. ++ * ++ * @return The maximum size. ++ */ ++ public Dimension getMaximumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the minimum size of the given JComponent. ++ * ++ * @param c The JComponent to find a minimum size for. ++ * ++ * @return The minimum size. ++ */ ++ public Dimension getMinimumSize(JComponent c) ++ { ++ return getPreferredSize(c); ++ } ++ ++ /** ++ * This method returns the preferred size of the given JComponent. ++ * ++ * @param c The JComponent to find a preferred size for. ++ * ++ * @return The preferred size. ++ */ ++ public Dimension getPreferredSize(JComponent c) ++ { ++ JToolTip tip = (JToolTip) c; ++ Rectangle vr = new Rectangle(); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ Insets insets = tip.getInsets(); ++ FontMetrics fm = tip.getToolkit().getFontMetrics(tip.getFont()); ++ SwingUtilities.layoutCompoundLabel(tip, fm, tip.getTipText(), null, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, vr, ir, tr, 0); ++ return new Dimension(insets.left + tr.width + insets.right, ++ insets.top + tr.height + insets.bottom); ++ } ++ ++ /** ++ * This method installs the defaults for the given JComponent. ++ * ++ * @param c The JComponent to install defaults for. ++ */ ++ protected void installDefaults(JComponent c) ++ { ++ UIDefaults defaults = UIManager.getLookAndFeelDefaults(); ++ c.setBackground(defaults.getColor("ToolTip.background")); ++ c.setForeground(defaults.getColor("ToolTip.foreground")); ++ c.setFont(defaults.getFont("ToolTip.font")); ++ c.setBorder(defaultBorder); ++ } ++ ++ /** ++ * This method installs the listeners for the given JComponent. ++ * ++ * @param c The JComponent to install listeners for. ++ */ ++ protected void installListeners(JComponent c) ++ { ++ } ++ ++ /** ++ * This method installs the UI for the given JComponent. ++ * ++ * @param c The JComponent to install the UI for. ++ */ ++ public void installUI(JComponent c) ++ { ++ c.setOpaque(true); ++ installDefaults(c); ++ installListeners(c); ++ } ++ ++ /** ++ * This method paints the given JComponent with the given Graphics object. ++ * ++ * @param g The Graphics object to paint with. ++ * @param c The JComponent to paint. ++ */ ++ public void paint(Graphics g, JComponent c) ++ { ++ JToolTip tip = (JToolTip) c; ++ ++ String text = tip.getTipText(); ++ if (text == null) ++ return; ++ ++ Rectangle vr = new Rectangle(); ++ vr = SwingUtilities.calculateInnerArea(tip, vr); ++ Rectangle ir = new Rectangle(); ++ Rectangle tr = new Rectangle(); ++ FontMetrics fm = tip.getToolkit().getFontMetrics(tip.getFont()); ++ SwingUtilities.layoutCompoundLabel(tip, fm, tip.getTipText(), null, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, ++ SwingConstants.CENTER, vr, ir, tr, 0); ++ ++ Color saved = g.getColor(); ++ g.setColor(Color.BLACK); ++ ++ g.drawString(text, vr.x, vr.y + fm.getAscent()); ++ ++ g.setColor(saved); ++ } ++ ++ /** ++ * This method uninstalls the defaults for the given JComponent. ++ * ++ * @param c The JComponent to uninstall defaults for. ++ */ ++ protected void uninstallDefaults(JComponent c) ++ { ++ c.setForeground(null); ++ c.setBackground(null); ++ c.setFont(null); ++ c.setBorder(null); ++ } ++ ++ /** ++ * This method uninstalls listeners for the given JComponent. ++ * ++ * @param c The JComponent to uninstall listeners for. ++ */ ++ protected void uninstallListeners(JComponent c) ++ { ++ } ++ ++ /** ++ * This method uninstalls the UI for the given JComponent. ++ * ++ * @param c The JComponent to uninstall. ++ */ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallDefaults(c); ++ uninstallListeners(c); ++ } ++} +Index: javax/swing/plaf/basic/BasicViewportUI.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicViewportUI.java,v +retrieving revision 1.3 +diff -u -r1.3 BasicViewportUI.java +--- javax/swing/plaf/basic/BasicViewportUI.java 10 Jan 2004 21:59:30 -0000 1.3 ++++ javax/swing/plaf/basic/BasicViewportUI.java 6 Sep 2004 16:36:08 -0000 +@@ -38,36 +38,154 @@ + + package javax.swing.plaf.basic; + ++import java.awt.Component; + import java.awt.Dimension; + import java.awt.Graphics; ++import java.awt.Image; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.image.ImageObserver; + import javax.swing.JComponent; ++import javax.swing.JViewport; ++import javax.swing.ViewportLayout; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; + import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.ViewportUI; + + public class BasicViewportUI extends ViewportUI + { + +- public static ComponentUI createUI(final JComponent c) ++ ChangeListener changeListener; ++ Image backingStoreImage; ++ int backingStoreWidth = -1; ++ int backingStoreHeight = -1; ++ ++ class ChangeHandler implements ChangeListener ++ { ++ public void stateChanged(ChangeEvent event) + { +- return new BasicViewportUI(); ++ JViewport v = (JViewport) event.getSource(); ++ v.repaint(); + } ++ } + +- +- public void installUI(final JComponent c) +- { +- super.installUI(c); +- } ++ void installDefaults(JComponent c) ++ { ++ c.setOpaque(true); ++ } ++ ++ void uninstallDefaults(JComponent c) ++ { ++ } ++ ++ void installListeners(JComponent c) ++ { ++ ((JViewport)c).addChangeListener(changeListener); ++ } ++ ++ void uninstallListeners(JComponent c) ++ { ++ ((JViewport)c).removeChangeListener(changeListener); ++ } ++ ++ public BasicViewportUI() ++ { ++ changeListener = new ChangeHandler(); ++ } ++ ++ public static ComponentUI createUI(JComponent c) ++ { ++ return new BasicViewportUI(); ++ } ++ ++ public void installUI(JComponent c) ++ { ++ super.installUI(c); ++ c.setLayout(new ViewportLayout()); ++ installListeners(c); ++ } ++ ++ public void uninstallUI(JComponent c) ++ { ++ uninstallListeners(c); ++ } + + +- public Dimension getPreferredSize(JComponent c) +- { +- Dimension d = new Dimension(100,100); +- System.out.println("BasicViewportUI->preff->"+d); +- return d; +- } ++ public Dimension getPreferredSize(JComponent c) ++ { ++ // let the ViewportLayout decide ++ return null; ++ } + +- public void paint(Graphics g, JComponent c) +- { +- System.out.println("BasicViewportUI->paint->"+c); +- } ++ public void paint(Graphics g, JComponent c) ++ { ++ ++ JViewport v = (JViewport)c; ++ Component view = v.getView(); ++ ++ if (view == null) ++ return; ++ ++ Point pos = v.getViewPosition(); ++ Rectangle viewBounds = view.getBounds(); ++ Rectangle portBounds = v.getBounds(); ++ ++ if (viewBounds.width == 0 ++ || viewBounds.height == 0 ++ || portBounds.width == 0 ++ || portBounds.height == 0) ++ return; ++ ++ if (backingStoreImage == null ++ || backingStoreWidth != viewBounds.width ++ || backingStoreHeight != viewBounds.height) ++ { ++ backingStoreImage = v.createImage(viewBounds.width, viewBounds.height); ++ backingStoreWidth = viewBounds.width; ++ backingStoreHeight = viewBounds.height; ++ } ++ ++ Graphics g2 = backingStoreImage.getGraphics(); ++ ++ ++ if (c.getBackground() != null) ++ { ++ // fill the backing store background ++ java.awt.Color save = g2.getColor(); ++ g2.setColor(c.getBackground()); ++ g2.fillRect (0, 0, backingStoreWidth, backingStoreHeight); ++ g2.setColor(save); ++ ++ // fill the viewport background ++ save = g.getColor(); ++ g.setColor(c.getBackground()); ++ g.fillRect (0, 0, portBounds.width, portBounds.height); ++ g.setColor(save); ++ ++ } ++ else ++ { ++ // clear the backing store background ++ g2.clearRect(0, 0, backingStoreWidth, backingStoreHeight); ++ ++ // clear the viewport background ++ g.clearRect(0, 0, portBounds.width, portBounds.height); ++ } ++ ++ g2.setClip(g.getClipBounds()); ++ g2.translate(-pos.x, -pos.y); ++ try ++ { ++ view.paint(g2); ++ } ++ finally ++ { ++ g2.translate(pos.x, pos.y); ++ } ++ g2 = null; ++ g.drawImage(backingStoreImage, ++ 0, 0, ++ (ImageObserver)null); ++ } + } +Index: javax/swing/plaf/basic/ComboPopup.java +=================================================================== +RCS file: javax/swing/plaf/basic/ComboPopup.java +diff -N javax/swing/plaf/basic/ComboPopup.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/plaf/basic/ComboPopup.java 6 Sep 2004 16:36:08 -0000 +@@ -0,0 +1,103 @@ ++/* ComboPopup.java ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.plaf.basic; ++ ++import java.awt.event.KeyListener; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseListener; ++import java.awt.event.MouseMotionListener; ++import javax.swing.JList; ++ ++ ++public interface ComboPopup ++{ ++ /** ++ * This method display popup menu containing list of JComboBox's items to ++ * the screen ++ */ ++ void show(); ++ ++ /** ++ * This method hides popup menu with list of JComboBox's item from the ++ * screen ++ */ ++ void hide(); ++ ++ /** ++ * Retursn true if popup menu with JComboBOx's item is currently visible on ++ * the screen and false otherwise ++ * ++ * @return true if JComboBox's popup menu with list of items is currently ++ * visible on the screen and false otherwise. ++ */ ++ boolean isVisible(); ++ ++ /** ++ * Return JList that is used to draw cells of the JComboBox. ++ * ++ * @return JList that is used to draw cells of the JcomboBox ++ */ ++ JList getList(); ++ ++ /** ++ * This method returns MouseListener that listen's to mouse events occuring ++ * in the combo box ++ * ++ * @return MouseListenere ++ */ ++ MouseListener getMouseListener(); ++ ++ /** ++ * This method returns MouseListener that listen's to mouse events occuring ++ * in the combo box. ++ * ++ * @return MouseMotionListener ++ */ ++ MouseMotionListener getMouseMotionListener(); ++ ++ /** ++ * This method returns KeyListener that listen's to key events occuring in ++ * the combo box. ++ * ++ * @return KeyListener ++ */ ++ KeyListener getKeyListener(); ++ ++ /* This method removes any listeners that were installed */ ++ void uninstallingUI(); ++} +Index: javax/swing/plaf/metal/MetalLookAndFeel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/metal/MetalLookAndFeel.java,v +retrieving revision 1.4 +diff -u -r1.4 MetalLookAndFeel.java +--- javax/swing/plaf/metal/MetalLookAndFeel.java 12 Oct 2003 13:26:01 -0000 1.4 ++++ javax/swing/plaf/metal/MetalLookAndFeel.java 6 Sep 2004 16:36:09 -0000 +@@ -40,7 +40,6 @@ + package javax.swing.plaf.metal; + + import javax.swing.UIDefaults; +-import javax.swing.plaf.basic.BasicDefaults; + import javax.swing.plaf.basic.BasicLookAndFeel; + + public class MetalLookAndFeel extends BasicLookAndFeel +@@ -61,7 +60,7 @@ + public UIDefaults getDefaults() + { + if (LAF_defaults == null) +- LAF_defaults = new BasicDefaults(); ++ LAF_defaults = super.getDefaults(); + + // Returns the default values for this look and feel. + return LAF_defaults; +Index: javax/swing/table/AbstractTableModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/AbstractTableModel.java,v +retrieving revision 1.5 +diff -u -r1.5 AbstractTableModel.java +--- javax/swing/table/AbstractTableModel.java 8 Oct 2003 15:29:52 -0000 1.5 ++++ javax/swing/table/AbstractTableModel.java 6 Sep 2004 16:36:09 -0000 +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.table; + + import java.io.Serializable; +@@ -271,25 +270,4 @@ + { + return listenerList.getListeners (listenerType); + } +- +- /** +- * getValueAt +- * @param value0 TODO +- * @param value1 TODO +- * @return Object +- */ +- public abstract Object getValueAt (int row, int column); +- +- /** +- * getColumnCount +- * @return int +- */ +- public abstract int getColumnCount(); +- +- /** +- * getRowCount +- * @return int +- */ +- public abstract int getRowCount(); +- +-} // AbstractTableModel ++} +Index: javax/swing/table/DefaultTableCellRenderer.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/DefaultTableCellRenderer.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultTableCellRenderer.java +--- javax/swing/table/DefaultTableCellRenderer.java 11 Jun 2003 13:20:41 -0000 1.3 ++++ javax/swing/table/DefaultTableCellRenderer.java 6 Sep 2004 16:36:09 -0000 +@@ -1,5 +1,5 @@ + /* DefaultTableCellRenderer.java +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,40 +35,194 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.table; + ++import java.awt.Color; + import java.awt.Component; ++import java.awt.Rectangle; + import java.io.Serializable; + import javax.swing.JLabel; + import javax.swing.JTable; + import javax.swing.border.Border; ++import javax.swing.border.EmptyBorder; + + /** +- * STUBBED ++ * Class to display every cells. + */ + public class DefaultTableCellRenderer extends JLabel + implements TableCellRenderer, Serializable + { + static final long serialVersionUID = 7878911414715528324L; + ++ protected static Border noFocusBorder = new EmptyBorder(0, 0, 0, 0); ++ + public static class UIResource extends DefaultTableCellRenderer + implements javax.swing.plaf.UIResource + { + public UIResource() + { + } +- } // class UIResource ++ } + ++ /** ++ * Creates a default table cell renderer with an empty border. ++ */ + public DefaultTableCellRenderer() + { ++ super(); ++ } ++ ++ /** ++ * Assign the unselected-foreground. ++ * ++ * @param c the color to assign ++ */ ++ public void setForeground(Color c) ++ { ++ super.setForeground(c); + } + ++ /** ++ * Assign the unselected-background. ++ * ++ * @param c the color to assign ++ */ ++ public void setBackground(Color c) ++ { ++ super.setBackground(c); ++ } ++ ++ /** ++ * Look and feel has changed. ++ * ++ *

    Replaces the current UI object with the latest version from ++ * the UIManager.

    ++ */ ++ public void updateUI() ++ { ++ super.updateUI(); ++ } ++ ++ /** ++ * Get the string value of the object and pass it to setText(). ++ * ++ * @param table the JTable ++ * @param value the value of the object ++ * @param isSelected is the cell selected? ++ * @param hasFocus has the cell the focus? ++ * @param row the row to render ++ * @param column the cell to render ++ * ++ * @return this component (the default table cell renderer) ++ */ + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, + boolean hasFocus, + int row, int column) + { +- return null; ++ if (value!=null) ++ super.setText(value.toString()); ++ ++ setOpaque(true); ++ if (isSelected) ++ { ++ setBackground(table.getSelectionBackground()); ++ setForeground(table.getSelectionForeground()); ++ } ++ else ++ { ++ setBackground(table.getBackground()); ++ setForeground(table.getForeground()); ++ } ++ ++ setEnabled(table.isEnabled()); ++ setFont(table.getFont()); ++ return this; ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ * ++ * @return always true ++ */ ++ public boolean isOpaque() ++ { ++ return true; ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ */ ++ public void validate() ++ { ++ // Does nothing. ++ } ++ ++ public void revalidate() ++ { ++ // Does nothing. ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ */ ++ public void repaint(long tm, int x, int y, int width, int height) ++ { ++ // Does nothing. ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ */ ++ public void repaint(Rectangle r) ++ { ++ // Does nothing. ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ */ ++ public void firePropertyChange(String propertyName, Object oldValue, ++ Object newValue) ++ { ++ // Does nothing. ++ } ++ ++ /** ++ * Overriden for performance. ++ * ++ *

    This method needs to be overridden in a subclass to actually ++ * do something.

    ++ */ ++ public void firePropertyChange(String propertyName, boolean oldValue, ++ boolean newValue) ++ { ++ // Does nothing. ++ } ++ ++ /** ++ * Sets the String for this cell. ++ * ++ * @param value the string value for this cell; if value is null it ++ * sets the text value to an empty string ++ */ ++ protected void setValue(Object value) ++ { ++ super.setText((value!=null) ? value.toString() : ""); + } +-} // class DefaultTableCellRenderer ++} +Index: javax/swing/table/DefaultTableColumnModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/DefaultTableColumnModel.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultTableColumnModel.java +--- javax/swing/table/DefaultTableColumnModel.java 11 Jun 2003 13:20:41 -0000 1.3 ++++ javax/swing/table/DefaultTableColumnModel.java 6 Sep 2004 16:36:09 -0000 +@@ -1,5 +1,5 @@ + /* DefaultTableColumnModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,7 +35,6 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.table; + + import java.beans.PropertyChangeEvent; +@@ -45,6 +44,7 @@ + import java.util.EventListener; + import java.util.Vector; + import javax.swing.ListSelectionModel; ++import javax.swing.DefaultListSelectionModel; + import javax.swing.event.ChangeEvent; + import javax.swing.event.EventListenerList; + import javax.swing.event.ListSelectionEvent; +@@ -52,315 +52,361 @@ + import javax.swing.event.TableColumnModelEvent; + import javax.swing.event.TableColumnModelListener; + ++ + /** + * DefaultTableColumnModel + * @author Andrew Selkirk + * @version 1.0 + */ + public class DefaultTableColumnModel +- implements TableColumnModel, PropertyChangeListener, +- ListSelectionListener, Serializable ++ implements TableColumnModel, PropertyChangeListener, ListSelectionListener, ++ Serializable + { +- static final long serialVersionUID = 6580012493508960512L; +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * tableColumns +- */ +- protected Vector tableColumns; +- +- /** +- * selectionModel +- */ +- protected ListSelectionModel selectionModel; +- +- /** +- * columnMargin +- */ +- protected int columnMargin; +- +- /** +- * listenerList +- */ +- protected EventListenerList listenerList; +- +- /** +- * changeEvent +- */ +- protected transient ChangeEvent changeEvent; +- +- /** +- * columnSelectionAllowed +- */ +- protected boolean columnSelectionAllowed; +- +- /** +- * totalColumnWidth +- */ +- protected int totalColumnWidth; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultTableColumnModel +- */ +- public DefaultTableColumnModel() { +- // TODO +- } // DefaultTableColumnModel() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * addColumn +- * @param value0 TODO +- */ +- public void addColumn(TableColumn value0) { +- // TODO +- } // addColumn() +- +- /** +- * removeColumn +- * @param value0 TODO +- */ +- public void removeColumn(TableColumn value0) { +- // TODO +- } // removeColumn() +- +- /** +- * moveColumn +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void moveColumn(int value0, int value1) { +- // TODO +- } // moveColumn() ++ private static final long serialVersionUID = 6580012493508960512L; + +- /** +- * setColumnMargin +- * @param value0 TODO +- */ +- public void setColumnMargin(int value0) { +- // TODO +- } // setColumnMargin() ++ /** ++ * tableColumns ++ */ ++ protected Vector tableColumns; ++ ++ /** ++ * selectionModel ++ */ ++ protected ListSelectionModel selectionModel; ++ ++ /** ++ * columnMargin ++ */ ++ protected int columnMargin; ++ ++ /** ++ * listenerList ++ */ ++ protected EventListenerList listenerList = new EventListenerList(); ++ ++ /** ++ * changeEvent ++ */ ++ protected transient ChangeEvent changeEvent = new ChangeEvent(this); ++ ++ /** ++ * columnSelectionAllowed ++ */ ++ protected boolean columnSelectionAllowed; ++ ++ /** ++ * totalColumnWidth ++ */ ++ protected int totalColumnWidth; ++ ++ /** ++ * Constructor DefaultTableColumnModel ++ */ ++ public DefaultTableColumnModel() ++ { ++ tableColumns = new Vector(); ++ setSelectionModel(new DefaultListSelectionModel()); ++ columnMargin = 1; ++ columnSelectionAllowed = false; ++ } ++ ++ /** ++ * addColumn ++ * @param value0 TODO ++ */ ++ public void addColumn(TableColumn col) ++ { ++ tableColumns.add(col); ++ invalidateWidthCache(); ++ } ++ ++ /** ++ * removeColumn ++ * @param value0 TODO ++ */ ++ public void removeColumn(TableColumn col) ++ { ++ tableColumns.remove(col); ++ invalidateWidthCache(); ++ } ++ ++ /** ++ * moveColumn ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void moveColumn(int i, int j) ++ { ++ Object tmp = tableColumns.get(i); ++ tableColumns.set(i, tableColumns.get(j)); ++ tableColumns.set(j, tmp); ++ } ++ ++ /** ++ * setColumnMargin ++ * @param value0 TODO ++ */ ++ public void setColumnMargin(int m) ++ { ++ columnMargin = m; ++ } + + /** + * getColumnCount +- * @returns int ++ * @return int + */ +- public int getColumnCount() { +- return 0; // TODO +- } // getColumnCount() ++ public int getColumnCount() ++ { ++ return tableColumns.size(); ++ } + + /** + * getColumns +- * @returns Enumeration ++ * @return Enumeration + */ +- public Enumeration getColumns() { +- return null; // TODO +- } // getColumns() ++ public Enumeration getColumns() ++ { ++ return tableColumns.elements(); ++ } + + /** + * getColumnIndex + * @param value0 TODO +- * @returns int +- */ +- public int getColumnIndex(Object value0) { +- return 0; // TODO +- } // getColumnIndex() ++ * @return int ++ */ ++ public int getColumnIndex(Object obj) ++ { ++ return tableColumns.indexOf(obj, 0); ++ } + + /** + * getColumn + * @param value0 TODO +- * @returns TableColumn +- */ +- public TableColumn getColumn(int value0) { +- return null; // TODO +- } // getColumn() ++ * @return TableColumn ++ */ ++ public TableColumn getColumn(int i) ++ { ++ return (TableColumn) tableColumns.get(i); ++ } + + /** + * getColumnMargin +- * @returns int ++ * @return int + */ +- public int getColumnMargin() { +- return 0; // TODO +- } // getColumnMargin() ++ public int getColumnMargin() ++ { ++ return columnMargin; ++ } + + /** + * getColumnIndexAtX + * @param value0 TODO +- * @returns int +- */ +- public int getColumnIndexAtX(int value0) { +- return 0; // TODO +- } // getColumnIndexAtX() ++ * @return int ++ */ ++ public int getColumnIndexAtX(int x) ++ { ++ for (int i = 0; i < tableColumns.size(); ++i) ++ { ++ int w = ((TableColumn)tableColumns.get(i)).getWidth(); ++ if (0 <= x && x < w) ++ return i; ++ else ++ x -= w; ++ } ++ return -1; ++ } + + /** + * getTotalColumnWidth +- * @returns int ++ * @return int + */ +- public int getTotalColumnWidth() { +- return 0; // TODO +- } // getTotalColumnWidth() +- +- /** +- * setSelectionModel +- * @param value0 TODO +- */ +- public void setSelectionModel(ListSelectionModel value0) { +- // TODO +- } // setSelectionModel() ++ public int getTotalColumnWidth() ++ { ++ if (totalColumnWidth == -1) ++ recalcWidthCache(); ++ return totalColumnWidth; ++ } ++ ++ /** ++ * setSelectionModel ++ * @param model TODO ++ * @exception IllegalArgumentException if model is null ++ */ ++ public void setSelectionModel(ListSelectionModel model) ++ { ++ if (model == null) ++ throw new IllegalArgumentException(); ++ ++ selectionModel = model; ++ selectionModel.addListSelectionListener(this); ++ } + + /** + * getSelectionModel +- * @returns ListSelectionModel ++ * @return ListSelectionModel + */ +- public ListSelectionModel getSelectionModel() { +- return null; // TODO +- } // getSelectionModel() +- +- /** +- * setColumnSelectionAllowed +- * @param value0 TODO +- */ +- public void setColumnSelectionAllowed(boolean value0) { +- // TODO +- } // setColumnSelectionAllowed() ++ public ListSelectionModel getSelectionModel() ++ { ++ return selectionModel; ++ } ++ ++ /** ++ * setColumnSelectionAllowed ++ * @param value0 TODO ++ */ ++ public void setColumnSelectionAllowed(boolean a) ++ { ++ columnSelectionAllowed = a; ++ } + + /** + * getColumnSelectionAllowed +- * @returns boolean ++ * @return boolean + */ +- public boolean getColumnSelectionAllowed() { +- return false; // TODO +- } // getColumnSelectionAllowed() ++ public boolean getColumnSelectionAllowed() ++ { ++ return columnSelectionAllowed; ++ } + + /** + * getSelectedColumns +- * @returns int[] ++ * @return int[] + */ +- public int[] getSelectedColumns() { ++ public int[] getSelectedColumns() ++ { + return null; // TODO +- } // getSelectedColumns() ++ } + + /** + * getSelectedColumnCount +- * @returns int ++ * @return int + */ +- public int getSelectedColumnCount() { ++ public int getSelectedColumnCount() ++ { + return 0; // TODO +- } // getSelectedColumnCount() ++ } + +- /** +- * addColumnModelListener +- * @param value0 TODO +- */ +- public void addColumnModelListener(TableColumnModelListener value0) { +- // TODO +- } // addColumnModelListener() ++ /** ++ * addColumnModelListener ++ * @param value0 TODO ++ */ ++ public void addColumnModelListener(TableColumnModelListener listener) ++ { ++ listenerList.add(TableColumnModelListener.class, listener); ++ } + + /** + * removeColumnModelListener + * @param value0 TODO + */ +- public void removeColumnModelListener(TableColumnModelListener value0) { ++ public void removeColumnModelListener(TableColumnModelListener value0) ++ { + // TODO +- } // removeColumnModelListener() ++ } + + /** + * fireColumnAdded + * @param value0 TODO + */ +- protected void fireColumnAdded(TableColumnModelEvent value0) { ++ protected void fireColumnAdded(TableColumnModelEvent value0) ++ { + // TODO +- } // fireColumnAdded() ++ } + + /** + * fireColumnRemoved + * @param value0 TODO + */ +- protected void fireColumnRemoved(TableColumnModelEvent value0) { ++ protected void fireColumnRemoved(TableColumnModelEvent value0) ++ { + // TODO +- } // fireColumnRemoved() ++ } + + /** + * fireColumnMoved + * @param value0 TODO + */ +- protected void fireColumnMoved(TableColumnModelEvent value0) { ++ protected void fireColumnMoved(TableColumnModelEvent value0) ++ { + // TODO +- } // fireColumnMoved() ++ } + +- /** +- * fireColumnSelectionChanged +- * @param value0 TODO +- */ +- protected void fireColumnSelectionChanged(ListSelectionEvent value0) { +- // TODO +- } // fireColumnSelectionChanged() ++ /** ++ * fireColumnSelectionChanged ++ * @param value0 TODO ++ */ ++ protected void fireColumnSelectionChanged(ListSelectionEvent evt) ++ { ++ EventListener [] listeners = getListeners(TableColumnModelListener.class); ++ for (int i = 0; i < listeners.length; ++i) ++ ((TableColumnModelListener)listeners[i]).columnSelectionChanged(evt); ++ } + + /** + * fireColumnMarginChanged + */ +- protected void fireColumnMarginChanged() { ++ protected void fireColumnMarginChanged() ++ { + // TODO +- } // fireColumnMarginChanged() ++ } + + /** + * getListeners + * @param value0 TODO +- * @returns EventListener[] +- */ +- public EventListener[] getListeners(Class value0) { +- return null; // TODO +- } // getListeners() ++ * @return EventListener[] ++ */ ++ public EventListener[] getListeners(Class klass) ++ { ++ return listenerList.getListeners(klass); ++ } + + /** + * propertyChange + * @param value0 TODO + */ +- public void propertyChange(PropertyChangeEvent value0) { ++ public void propertyChange(PropertyChangeEvent value0) ++ { + // TODO +- } // propertyChange() ++ } + + /** + * valueChanged + * @param value0 TODO + */ +- public void valueChanged(ListSelectionEvent value0) { +- // TODO +- } // valueChanged() ++ public void valueChanged(ListSelectionEvent value0) ++ { ++ fireColumnSelectionChanged(value0); ++ } + + /** + * createSelectionModel +- * @returns ListSelectionModel ++ * @return ListSelectionModel + */ +- protected ListSelectionModel createSelectionModel() { ++ protected ListSelectionModel createSelectionModel() ++ { + return null; // TODO +- } // createSelectionModel() ++ } + + /** + * recalcWidthCache + */ +- protected void recalcWidthCache() { +- // TODO +- } // recalcWidthCache() ++ protected void recalcWidthCache() ++ { ++ if (totalColumnWidth == -1) ++ { ++ totalColumnWidth = 0; ++ for (int i = 0; i < tableColumns.size(); ++i) ++ { ++ totalColumnWidth += ((TableColumn)tableColumns.get(i)).getWidth(); ++ } ++ } ++ } + + /** + * invalidateWidthCache + */ +- private void invalidateWidthCache() { +- // TODO +- } // invalidateWidthCache() +- +- +-} // DefaultTableColumnModel +- ++ private void invalidateWidthCache() ++ { ++ totalColumnWidth = -1; ++ } ++} +Index: javax/swing/table/DefaultTableModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/DefaultTableModel.java,v +retrieving revision 1.4 +diff -u -r1.4 DefaultTableModel.java +--- javax/swing/table/DefaultTableModel.java 12 Oct 2003 13:33:31 -0000 1.4 ++++ javax/swing/table/DefaultTableModel.java 6 Sep 2004 16:36:09 -0000 +@@ -50,445 +50,387 @@ + implements Serializable + { + static final long serialVersionUID = 6680042567037222321L; +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * dataVector +- */ +- protected Vector dataVector; +- +- /** +- * columnIdentifiers +- */ +- protected Vector columnIdentifiers; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor DefaultTableModel +- */ +- public DefaultTableModel() { +- this(0, 0); +- } // DefaultTableModel() +- +- /** +- * Constructor DefaultTableModel +- * @param value0 TODO +- * @param value1 TODO +- */ +- public DefaultTableModel(int numRows, int numColumns) { +- +- // Variables +- int columnIndex; +- Vector defaultNames; +- +- // Create Column Names +- defaultNames = new Vector(); +- for (columnIndex = 0; columnIndex < numColumns; columnIndex++) { +- defaultNames.addElement(super.getColumnName(columnIndex)); +- } // for +- +- // Setup Data +-// setDataVector(defaultNames, numRows); +- +- } // DefaultTableModel() +- +- /** +- * Constructor DefaultTableModel +- * @param value0 TODO +- * @param value1 TODO +- */ +- public DefaultTableModel(Vector columnNames, int numRows) { +- +- // Variables +- Vector data; +- Vector rowData; +- int rowIndex; +- int numColumns; +- +- // Create Data +- data = new Vector(); +- if (columnNames == null) { +- numColumns = 0; +- } else { +- numColumns = columnNames.size(); +- } // if +- for (rowIndex = 0; rowIndex < numRows; rowIndex++) { +- rowData = new Vector(); +- rowData.setSize(numColumns); +- data.addElement(rowData); +- } // for +- +- // Setup Data +- setDataVector(data, columnNames); +- +- } // DefaultTableModel() +- +- /** +- * Constructor DefaultTableModel +- * @param value0 TODO +- * @param value1 TODO +- */ +- public DefaultTableModel(Object[] columnNames, int numRows) { +- this(convertToVector(columnNames), numRows); +- } // DefaultTableModel() +- +- /** +- * Constructor DefaultTableModel +- * @param value0 TODO +- * @param value1 TODO +- */ +- public DefaultTableModel(Vector data, Vector columnNames) { +- setDataVector(data, columnNames); +- } // DefaultTableModel() +- +- /** +- * Constructor DefaultTableModel +- * @param value0 TODO +- * @param value1 TODO +- */ +- public DefaultTableModel(Object[][] data, Object[] columnNames) { +- this(convertToVector(data), convertToVector(columnNames)); +- } // DefaultTableModel() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getDataVector +- * @returns Vector +- */ +- public Vector getDataVector() { +- return dataVector; +- } // getDataVector() +- +- /** +- * setDataVector +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void setDataVector(Vector data, Vector columnNames) { +- +- // Variables +- int rowIndex; +- int numRows; +- int numColumns; +- Vector columnVector; +- +- // Set Data +- dataVector = data; +- columnIdentifiers = columnNames; +- +- // Check Data +- numRows = data.size(); +- numColumns = columnNames.size(); +- for (rowIndex = 0; rowIndex < numRows; rowIndex++) { +- columnVector = (Vector) dataVector.get(rowIndex); +- columnVector.setSize(numColumns); +- } // for +- +- } // setDataVector() +- +- /** +- * setDataVector +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void setDataVector(Object[][] data, Object[] columnNames) { +- setDataVector(convertToVector(data), convertToVector(columnNames)); +- } // setDataVector() +- +- /** +- * newDataAvailable +- * @param value0 TODO +- */ +- public void newDataAvailable(TableModelEvent event) { +- fireTableChanged(event); +- } // newDataAvailable() +- +- /** +- * newRowsAdded +- * @param value0 TODO +- */ +- public void newRowsAdded(TableModelEvent event) { +- // TODO +- } // newRowsAdded() +- +- /** +- * rowsRemoved +- * @param value0 TODO +- */ +- public void rowsRemoved(TableModelEvent event) { +- fireTableChanged(event); +- } // rowsRemoved() +- +- /** +- * setColumnIdentifiers +- * @param value0 TODO +- */ +- public void setColumnIdentifiers(Vector columnIdentifiers) { +- this.columnIdentifiers = columnIdentifiers; +- setColumnCount(columnIdentifiers.size()); +- } // setColumnIdentifiers() +- +- /** +- * setColumnIdentifiers +- * @param value0 TODO +- */ +- public void setColumnIdentifiers(Object[] columnIdentifiers) { +- setColumnIdentifiers(convertToVector(columnIdentifiers)); +- } // setColumnIdentifiers() +- +- /** +- * setNumRows +- * @param value0 TODO +- */ +- public void setNumRows(int numRows) { +- setRowCount(numRows); +- } // setNumRows() +- +- /** +- * setRowCount +- * @param value0 TODO +- */ +- public void setRowCount(int rowCount) { +- // TODO +- } // setRowCount() +- +- /** +- * setColumnCount +- * @param value0 TODO +- */ +- public void setColumnCount(int columnCount) { +- // TODO +- } // setColumnCount() +- +- /** +- * addColumn +- * @param value0 TODO +- */ +- public void addColumn(Object columnName) { +- addColumn(columnName, new Vector(dataVector.size())); +- } // addColumn() +- +- /** +- * addColumn +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void addColumn(Object columnName, Vector columnData) { +- // TODO +- } // addColumn() +- +- /** +- * addColumn +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void addColumn(Object columnName, Object[] columnData) { +- // TODO +- } // addColumn() +- +- /** +- * addRow +- * @param value0 TODO +- */ +- public void addRow(Vector rowData) { +- // TODO +- } // addRow() +- +- /** +- * addRow +- * @param value0 TODO +- */ +- public void addRow(Object[] rowData) { +- addRow(convertToVector(rowData)); +- } // addRow() +- +- /** +- * insertRow +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void insertRow(int row, Vector rowData) { +- dataVector.add(row, rowData); +- } // insertRow() +- +- /** +- * insertRow +- * @param value0 TODO +- * @param value1 TODO +- */ +- public void insertRow(int row, Object[] rowData) { +- insertRow(row, convertToVector(rowData)); +- } // insertRow() +- +- /** +- * moveRow +- * @param value0 TODO +- * @param value1 TODO +- * @param value2 TODO +- */ +- public void moveRow(int startIndex, int endIndex, int toIndex) { +- +- // Variables +- int index; +- Vector vector; +- +- // Move Rows +- for (index = 0; index < (endIndex - startIndex); index++) { +- vector = (Vector) dataVector.remove(startIndex); +- dataVector.add(toIndex, vector); +- } // for +- +- } // moveRow() +- +- /** +- * removeRow +- * @param value0 TODO +- */ +- public void removeRow(int row) { +- dataVector.remove(row); +- } // removeRow() +- +- /** +- * getRowCount +- * @returns int +- */ +- public int getRowCount() { +- return dataVector.size(); +- } // getRowCount() +- +- /** +- * getColumnCount +- * @returns int +- */ +- public int getColumnCount() { +- return columnIdentifiers.size(); +- } // getColumnCount() +- +- /** +- * getColumnName +- * @param value0 TODO +- * @returns String +- */ +- public String getColumnName(int column) { +- +- // Check for Column +- if (columnIdentifiers == null || column >= getColumnCount()) { +- return super.getColumnName(column); +- } // if +- +- // Return Column name +- return (String) columnIdentifiers.get(column); +- +- } // getColumnName() +- +- /** +- * isCellEditable +- * @param value0 TODO +- * @param value1 TODO +- * @returns boolean +- */ +- public boolean isCellEditable(int row, int column) { +- return true; +- } // isCellEditable() +- +- /** +- * getValueAt +- * @param value0 TODO +- * @param value1 TODO +- * @returns Object +- */ +- public Object getValueAt(int row, int column) { +- +- // Variables +- Vector rowVector; +- +- // Get Row Vector +- rowVector = (Vector) dataVector.get(row); +- +- // Get Data +- return rowVector.get(column); +- +- } // getValueAt() +- +- /** +- * setValueAt +- * @param value0 TODO +- * @param value1 TODO +- * @param value2 TODO +- */ +- public void setValueAt(Object value, int row, int column) { +- +- // Variables +- Vector rowVector; +- +- // Get Row Vector +- rowVector = (Vector) dataVector.get(row); +- +- // Set Data +- rowVector.remove(column); +- rowVector.add(column, value); +- +- } // setValueAt() +- +- /** +- * convertToVector +- * @param value0 TODO +- * @returns Vector +- */ +- protected static Vector convertToVector(Object[] data) { +- +- // Variables +- int index; +- Vector vector; +- +- // Check for null +- if (data == null) { +- return null; +- } // if +- +- // Process +- vector = new Vector(); +- for (index = 0; index < data.length; index++) { +- vector.add(data[index]); +- } // for: index +- +- // Return new Vector +- return vector; +- +- } // convertToVector() +- +- /** +- * convertToVector +- * @param value0 TODO +- * @returns Vector +- */ +- protected static Vector convertToVector(Object[][] data) { +- +- // Variables +- int index; +- Vector vector; +- +- // Process +- vector = new Vector(); +- for (index = 0; index < data.length; index++) { +- vector.add(convertToVector(data[index])); +- } // for: index +- +- // Return new Vector +- return vector; +- +- } // convertToVector() +- +- +-} // DefaultTableModel ++ /** ++ * dataVector ++ */ ++ protected Vector dataVector; ++ ++ /** ++ * columnIdentifiers ++ */ ++ protected Vector columnIdentifiers; ++ ++ /** ++ * Constructor DefaultTableModel ++ */ ++ public DefaultTableModel() ++ { ++ this(0, 0); ++ } ++ ++ /** ++ * Constructor DefaultTableModel ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public DefaultTableModel(int numRows, int numColumns) ++ { ++ Vector defaultNames = new Vector(numColumns); ++ Vector data = new Vector(numRows); ++ for (int i = 0; i < numColumns; i++) ++ { ++ defaultNames.add(super.getColumnName(i)); ++ Vector tmp = new Vector(numColumns); ++ tmp.setSize(numColumns); ++ data.add(tmp); ++ } ++ setDataVector(defaultNames, data); ++ } ++ ++ /** ++ * Constructor DefaultTableModel ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public DefaultTableModel(Vector columnNames, int numRows) ++ { ++ Vector data = new Vector(); ++ int numColumns = 0; ++ ++ if (columnNames != null) ++ numColumns = columnNames.size(); ++ ++ while (0 < numRows--) ++ { ++ Vector rowData = new Vector(); ++ rowData.setSize(numColumns); ++ data.add(rowData); ++ } ++ setDataVector(data, columnNames); ++ } ++ ++ /** ++ * Constructor DefaultTableModel ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public DefaultTableModel(Object[] columnNames, int numRows) ++ { ++ this(convertToVector(columnNames), numRows); ++ } ++ ++ /** ++ * Constructor DefaultTableModel ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public DefaultTableModel(Vector data, Vector columnNames) ++ { ++ setDataVector(data, columnNames); ++ } ++ ++ /** ++ * Constructor DefaultTableModel ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public DefaultTableModel(Object[][] data, Object[] columnNames) ++ { ++ this(convertToVector(data), convertToVector(columnNames)); ++ } ++ ++ /** ++ * getDataVector ++ * @returns Vector ++ */ ++ public Vector getDataVector() ++ { ++ return dataVector; ++ } ++ ++ /** ++ * setDataVector ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void setDataVector(Vector data, Vector columnNames) ++ { ++ dataVector = data; ++ columnIdentifiers = columnNames; ++ for (int r = 0; r < data.size(); r++) { ++ ((Vector) dataVector.get(r)).setSize(columnNames.size()); ++ } ++ } ++ ++ /** ++ * setDataVector ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void setDataVector(Object[][] data, Object[] columnNames) ++ { ++ setDataVector(convertToVector(data), ++ convertToVector(columnNames)); ++ } ++ ++ /** ++ * newDataAvailable ++ * @param value0 TODO ++ */ ++ public void newDataAvailable(TableModelEvent event) ++ { ++ fireTableChanged(event); ++ } ++ ++ /** ++ * newRowsAdded ++ * @param value0 TODO ++ */ ++ public void newRowsAdded(TableModelEvent event) ++ { ++ fireTableChanged(event); ++ } ++ ++ /** ++ * rowsRemoved ++ * @param value0 TODO ++ */ ++ public void rowsRemoved(TableModelEvent event) ++ { ++ fireTableChanged(event); ++ } ++ ++ /** ++ * setColumnIdentifiers ++ * @param value0 TODO ++ */ ++ public void setColumnIdentifiers(Vector columnIdentifiers) ++ { ++ this.columnIdentifiers = columnIdentifiers; ++ setColumnCount(columnIdentifiers.size()); ++ } ++ ++ /** ++ * setColumnIdentifiers ++ * @param value0 TODO ++ */ ++ public void setColumnIdentifiers(Object[] columnIdentifiers) ++ { ++ setColumnIdentifiers(convertToVector(columnIdentifiers)); ++ } ++ ++ /** ++ * setNumRows ++ * @param value0 TODO ++ */ ++ public void setNumRows(int numRows) ++ { ++ setRowCount(numRows); ++ } ++ ++ /** ++ * setRowCount ++ * @param value0 TODO ++ */ ++ public void setRowCount(int rowCount) ++ { ++ dataVector.setSize(rowCount); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * setColumnCount ++ * @param value0 TODO ++ */ ++ public void setColumnCount(int columnCount) ++ { ++ for (int i = 0; i < dataVector.size(); ++i) ++ { ++ ((Vector) dataVector.get(i)).setSize(columnCount); ++ } ++ columnIdentifiers.setSize(columnCount); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * addColumn ++ * @param value0 TODO ++ */ ++ public void addColumn(Object columnName) ++ { ++ addColumn(columnName, (Object[]) null); ++ } ++ ++ /** ++ * addColumn ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void addColumn(Object columnName, Vector columnData) ++ { ++ addColumn(columnName, columnData == null ? null : columnData.toArray()); ++ } ++ ++ /** ++ * addColumn ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void addColumn(Object columnName, Object[] columnData) { ++ for (int i = 0; i < dataVector.size(); ++i) ++ { ++ ((Vector) dataVector.get(i)).add(columnData == null ? null : columnData[i]); ++ } ++ columnIdentifiers.add(columnName); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * addRow ++ * @param value0 TODO ++ */ ++ public void addRow(Vector rowData) { ++ dataVector.add(rowData); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * addRow ++ * @param value0 TODO ++ */ ++ public void addRow(Object[] rowData) { ++ addRow(convertToVector(rowData)); ++ } ++ ++ /** ++ * insertRow ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void insertRow(int row, Vector rowData) { ++ dataVector.add(row, rowData); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * insertRow ++ * @param value0 TODO ++ * @param value1 TODO ++ */ ++ public void insertRow(int row, Object[] rowData) { ++ insertRow(row, convertToVector(rowData)); ++ } ++ ++ /** ++ * moveRow ++ * @param value0 TODO ++ * @param value1 TODO ++ * @param value2 TODO ++ */ ++ public void moveRow(int startIndex, int endIndex, int toIndex) { ++ for (int index = 0; index < (endIndex - startIndex); index++) { ++ Vector vector = (Vector) dataVector.remove(startIndex); ++ dataVector.add(toIndex, vector); ++ } ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * removeRow ++ * @param value0 TODO ++ */ ++ public void removeRow(int row) { ++ dataVector.remove(row); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * getRowCount ++ * @returns int ++ */ ++ public int getRowCount() { ++ return dataVector.size(); ++ } ++ ++ /** ++ * getColumnCount ++ * @returns int ++ */ ++ public int getColumnCount() { ++ return columnIdentifiers.size(); ++ } ++ ++ /** ++ * getColumnName ++ * @param value0 TODO ++ * @returns String ++ */ ++ public String getColumnName(int column) { ++ // Check for Column ++ if (columnIdentifiers == null || column >= getColumnCount()) { ++ return super.getColumnName(column); ++ } ++ ++ // Return Column name ++ return (String) columnIdentifiers.get(column); ++ } ++ ++ /** ++ * isCellEditable ++ * @param value0 TODO ++ * @param value1 TODO ++ * @returns boolean ++ */ ++ public boolean isCellEditable(int row, int column) { ++ return true; ++ } ++ ++ /** ++ * getValueAt ++ * @param value0 TODO ++ * @param value1 TODO ++ * @returns Object ++ */ ++ public Object getValueAt(int row, int column) { ++ return ((Vector) dataVector.get(row)).get(column); ++ } ++ ++ /** ++ * setValueAt ++ * @param value0 TODO ++ * @param value1 TODO ++ * @param value2 TODO ++ */ ++ public void setValueAt(Object value, int row, int column) { ++ ((Vector) dataVector.get(row)).set(column, value); ++ fireTableDataChanged(); ++ } ++ ++ /** ++ * convertToVector ++ * @param value0 TODO ++ * @returns Vector ++ */ ++ protected static Vector convertToVector(Object[] data) { ++ if (data == null) ++ return null; ++ Vector vector = new Vector(data.length); ++ for (int i = 0; i < data.length; i++) ++ vector.add(data[i]); ++ return vector; ++ } ++ ++ /** ++ * convertToVector ++ * @param value0 TODO ++ * @returns Vector ++ */ ++ protected static Vector convertToVector(Object[][] data) { ++ if (data == null) ++ return null; ++ Vector vector = new Vector(data.length); ++ for (int i = 0; i < data.length; i++) ++ vector.add(convertToVector(data[i])); ++ return vector; ++ } ++} +Index: javax/swing/table/JTableHeader.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/JTableHeader.java,v +retrieving revision 1.1 +diff -u -r1.1 JTableHeader.java +--- javax/swing/table/JTableHeader.java 11 Jun 2003 16:36:11 -0000 1.1 ++++ javax/swing/table/JTableHeader.java 6 Sep 2004 16:36:09 -0000 +@@ -1,5 +1,5 @@ + /* JTableHeader.java +- Copyright (C) 2003 Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,6 +38,8 @@ + + package javax.swing.table; + ++import java.awt.event.FocusEvent; ++import java.awt.event.FocusListener; + import java.awt.Color; + import java.awt.Cursor; + import java.awt.Dimension; +@@ -45,38 +47,527 @@ + import java.awt.FontMetrics; + import java.awt.Point; + import java.awt.Rectangle; +-import java.awt.event.FocusListener; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; + import java.util.Locale; ++ + import javax.accessibility.Accessible; ++import javax.accessibility.AccessibleAction; + import javax.accessibility.AccessibleComponent; + import javax.accessibility.AccessibleContext; +-import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleSelection; + import javax.accessibility.AccessibleStateSet; ++import javax.accessibility.AccessibleRole; ++import javax.accessibility.AccessibleText; ++import javax.accessibility.AccessibleValue; + import javax.swing.JComponent; + import javax.swing.JTable; +-import javax.swing.event.ChangeEvent; +-import javax.swing.event.ListSelectionEvent; +-import javax.swing.event.TableColumnModelEvent; +-import javax.swing.event.TableColumnModelListener; ++import javax.swing.UIManager; + import javax.swing.plaf.TableHeaderUI; + +-public class JTableHeader ++public class JTableHeader extends JComponent + { +- protected class AccessibleJTableHeader ++ protected class AccessibleJTableHeader extends AccessibleJComponent + { +- protected class AccessibleJTableHeaderEntry ++ protected class AccessibleJTableHeaderEntry extends AccessibleContext ++ implements Accessible, AccessibleComponent + { +- } ++ public void addFocusListener(FocusListener l) ++ { ++ throw new Error("not implemented"); ++ } ++ public void addPropertyChangeListener(PropertyChangeListener l) ++ { ++ throw new Error("not implemented"); ++ } ++ public boolean contains(Point p) ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleAction getAccessibleAction() ++ { ++ throw new Error("not implemented"); ++ } ++ public Accessible getAccessibleAt(Point p) ++ { ++ throw new Error("not implemented"); ++ } ++ public Accessible getAccessibleChild(int i) ++ { ++ throw new Error("not implemented"); ++ } ++ public int getAccessibleChildrenCount() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleComponent getAccessibleComponent() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleContext getAccessibleContext() ++ { ++ throw new Error("not implemented"); ++ } ++ public String getAccessibleDescription() ++ { ++ throw new Error("not implemented"); ++ } ++ public int getAccessibleIndexInParent() ++ { ++ throw new Error("not implemented"); ++ } ++ public String getAccessibleName() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleRole getAccessibleRole() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleSelection getAccessibleSelection() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleStateSet getAccessibleStateSet() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleText getAccessibleText() ++ { ++ throw new Error("not implemented"); ++ } ++ public AccessibleValue getAccessibleValue() ++ { ++ throw new Error("not implemented"); ++ } ++ public Color getBackground() ++ { ++ throw new Error("not implemented"); ++ } ++ public Rectangle getBounds() ++ { ++ throw new Error("not implemented"); ++ } ++ public Cursor getCursor() ++ { ++ throw new Error("not implemented"); ++ } ++ public Font getFont() ++ { ++ throw new Error("not implemented"); ++ } ++ public FontMetrics getFontMetrics(Font f) ++ { ++ throw new Error("not implemented"); ++ } ++ public Color getForeground() ++ { ++ throw new Error("not implemented"); ++ } ++ public Locale getLocale() ++ { ++ throw new Error("not implemented"); ++ } ++ public Point getLocation() ++ { ++ throw new Error("not implemented"); ++ } ++ public Point getLocationOnScreen() ++ { ++ throw new Error("not implemented"); ++ } ++ public Dimension getSize() ++ { ++ throw new Error("not implemented"); ++ } ++ public boolean isEnabled() ++ { ++ throw new Error("not implemented"); ++ } ++ public boolean isFocusTraversable() ++ { ++ throw new Error("not implemented"); ++ } ++ public boolean isShowing() ++ { ++ throw new Error("not implemented"); ++ } ++ public boolean isVisible() ++ { ++ throw new Error("not implemented"); ++ } ++ public void removeFocusListener(FocusListener l) ++ { ++ throw new Error("not implemented"); ++ } ++ public void removePropertyChangeListener(PropertyChangeListener l) ++ { ++ throw new Error("not implemented"); ++ } ++ public void requestFocus() ++ { ++ throw new Error("not implemented"); ++ } ++ public void setAccessibleDescription(String s) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setAccessibleName(String s) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setBackground(Color c) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setBounds(Rectangle r) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setCursor(Cursor c) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setEnabled(boolean b) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setFont(Font f) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setForeground(Color c) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setLocation(Point p) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setSize(Dimension d) ++ { ++ throw new Error("not implemented"); ++ } ++ public void setVisible(boolean b) ++ { ++ throw new Error("not implemented"); ++ } ++ }; + } + + private static final long serialVersionUID = 5144633983372967710L; + +- protected TableColumnModel columnModel; +- protected TableColumn draggedColumn; +- protected int draggedDistance; +- protected boolean reorderingAllowed; +- protected boolean resizingAllowed; +- protected TableColumn resizingColumn; +- protected JTable table; +- protected boolean updateTableInRealTime; ++ /** ++ * The accessibleContext property. ++ */ ++ AccessibleContext accessibleContext; ++ ++ /** ++ * The columnModel property. ++ */ ++ TableColumnModel columnModel; ++ ++ /** ++ * The draggedColumn property. ++ */ ++ TableColumn draggedColumn; ++ ++ /** ++ * The draggedDistance property. ++ */ ++ int draggedDistance; ++ ++ /** ++ * The opaque property. ++ */ ++ boolean opaque; ++ ++ /** ++ * The reorderingAllowed property. ++ */ ++ boolean reorderingAllowed; ++ ++ /** ++ * The resizingAllowed property. ++ */ ++ boolean resizingAllowed; ++ ++ /** ++ * The resizingColumn property. ++ */ ++ TableColumn resizingColumn; ++ ++ /** ++ * The table property. ++ */ ++ JTable table; ++ ++ /** ++ * The updateTableInRealTime property. ++ */ ++ boolean updateTableInRealTime; ++ ++ TableCellRenderer cellRenderer; ++ ++ public JTableHeader() ++ { ++ this(null); ++ } ++ ++ public JTableHeader(TableColumnModel cm) ++ { ++ accessibleContext = new AccessibleJTableHeader(); ++ columnModel = cm == null ? createDefaultTableColumnModel() : cm; ++ draggedColumn = null; ++ draggedDistance = 0; ++ opaque = true; ++ reorderingAllowed = true; ++ resizingAllowed = true; ++ resizingColumn = null; ++ table = null; ++ updateTableInRealTime = true; ++ cellRenderer = createDefaultRenderer(); ++ updateUI(); ++ } ++ ++ protected TableColumnModel createDefaultTableColumnModel() ++ { ++ return new DefaultTableColumnModel(); ++ } ++ ++ ++ /** ++ * Get the value of the {@link #accessibleContext} property. ++ * ++ * @return The current value of the property ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return accessibleContext; ++ } ++ ++ /** ++ * Get the value of the {@link #columnModel} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableColumnModel getColumnModel() ++ { ++ return columnModel; ++ } ++ ++ /** ++ * Get the value of the {@link #draggedColumn} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableColumn getDraggedColumn() ++ { ++ return draggedColumn; ++ } ++ ++ /** ++ * Get the value of the {@link #draggedDistance} property. ++ * ++ * @return The current value of the property ++ */ ++ public int getDraggedDistance() ++ { ++ return draggedDistance; ++ } ++ ++ /** ++ * Get the value of the {@link #reorderingAllowed} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getReorderingAllowed() ++ { ++ return reorderingAllowed; ++ } ++ ++ /** ++ * Get the value of the {@link #resizingAllowed} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getResizingAllowed() ++ { ++ return resizingAllowed; ++ } ++ ++ /** ++ * Get the value of the {@link #resizingColumn} property. ++ * ++ * @return The current value of the property ++ */ ++ public TableColumn getResizingColumn() ++ { ++ return resizingColumn; ++ } ++ ++ /** ++ * Get the value of the {@link #table} property. ++ * ++ * @return The current value of the property ++ */ ++ public JTable getTable() ++ { ++ return table; ++ } ++ ++ /** ++ * Get the value of the {@link #updateTableInRealTime} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean getUpdateTableInRealTime() ++ { ++ return updateTableInRealTime; ++ } ++ ++ /** ++ * Get the value of the {@link #opaque} property. ++ * ++ * @return The current value of the property ++ */ ++ public boolean isOpaque() ++ { ++ return opaque; ++ } ++ ++ /** ++ * Set the value of the {@link #columnModel} property. ++ * ++ * @param c The new value of the property ++ */ ++ public void setColumnModel(TableColumnModel c) ++ { ++ columnModel = c; ++ } ++ ++ /** ++ * Set the value of the {@link #draggedColumn} property. ++ * ++ * @param d The new value of the property ++ */ ++ public void setDraggedColumn(TableColumn d) ++ { ++ draggedColumn = d; ++ } ++ ++ /** ++ * Set the value of the {@link #draggedDistance} property. ++ * ++ * @param d The new value of the property ++ */ ++ public void setDraggedDistance(int d) ++ { ++ draggedDistance = d; ++ } ++ ++ /** ++ * Set the value of the {@link #opaque} property. ++ * ++ * @param o The new value of the property ++ */ ++ public void setOpaque(boolean o) ++ { ++ opaque = o; ++ } ++ ++ /** ++ * Set the value of the {@link #reorderingAllowed} property. ++ * ++ * @param r The new value of the property ++ */ ++ public void setReorderingAllowed(boolean r) ++ { ++ reorderingAllowed = r; ++ } ++ ++ /** ++ * Set the value of the {@link #resizingAllowed} property. ++ * ++ * @param r The new value of the property ++ */ ++ public void setResizingAllowed(boolean r) ++ { ++ resizingAllowed = r; ++ } ++ ++ /** ++ * Set the value of the {@link #resizingColumn} property. ++ * ++ * @param r The new value of the property ++ */ ++ public void setResizingColumn(TableColumn r) ++ { ++ resizingColumn = r; ++ } ++ ++ /** ++ * Set the value of the {@link #table} property. ++ * ++ * @param t The new value of the property ++ */ ++ public void setTable(JTable t) ++ { ++ table = t; ++ } ++ ++ /** ++ * Set the value of the {@link #updateTableInRealTime} property. ++ * ++ * @param u The new value of the property ++ */ ++ public void setUpdateTableInRealTime(boolean u) ++ { ++ updateTableInRealTime = u; ++ } ++ ++ protected TableCellRenderer createDefaultRenderer() ++ { ++ return new DefaultTableCellRenderer(); ++ } ++ ++ public TableCellRenderer getDefaultRenderer() ++ { ++ return cellRenderer; ++ } ++ ++ public Rectangle getHeaderRect(int column) ++ { ++ Rectangle r = getTable().getCellRect(-1, column, true); ++ r.height = getHeight(); ++ return r; ++ } ++ ++ protected String paramString() ++ { ++ return "JTableHeader"; ++ } ++ ++ // UI support ++ ++ public String getUIClassID() ++ { ++ return "TableHeaderUI"; ++ } ++ ++ public TableHeaderUI getUI() ++ { ++ return (TableHeaderUI) ui; ++ } ++ ++ public void setUI(TableHeaderUI u) ++ { ++ super.setUI(u); ++ } ++ ++ public void updateUI() ++ { ++ setUI((TableHeaderUI) UIManager.getUI(this)); ++ } ++ + } +Index: javax/swing/table/TableColumn.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/TableColumn.java,v +retrieving revision 1.3 +diff -u -r1.3 TableColumn.java +--- javax/swing/table/TableColumn.java 11 Jun 2003 13:20:41 -0000 1.3 ++++ javax/swing/table/TableColumn.java 6 Sep 2004 16:36:09 -0000 +@@ -35,26 +35,23 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package javax.swing.table; + + import java.beans.PropertyChangeListener; + import java.io.Serializable; + import javax.swing.event.SwingPropertyChangeSupport; + ++ + /** + * TableColumn + * @author Andrew Selkirk + * @version 1.0 + */ +-public class TableColumn implements Serializable ++public class TableColumn ++ implements Serializable + { + static final long serialVersionUID = -6113660025878112608L; + +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- + /** + * COLUMN_WIDTH_PROPERTY + */ +@@ -138,36 +135,35 @@ + /** + * changeSupport + */ +- private SwingPropertyChangeSupport changeSupport = new SwingPropertyChangeSupport(this); +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- ++ private SwingPropertyChangeSupport changeSupport = ++ new SwingPropertyChangeSupport(this); + + /** + * Constructor TableColumn + */ +- public TableColumn() { ++ public TableColumn() ++ { + this(0, 75, null, null); +- } // TableColumn() ++ } + + /** + * Constructor TableColumn + * @param modelIndex TODO + */ +- public TableColumn(int modelIndex) { ++ public TableColumn(int modelIndex) ++ { + this(modelIndex, 75, null, null); +- } // TableColumn() ++ } + + /** + * Constructor TableColumn + * @param modelIndex TODO + * @param width TODO + */ +- public TableColumn(int modelIndex, int width) { ++ public TableColumn(int modelIndex, int width) ++ { + this(modelIndex, width, null, null); +- } // TableColumn() ++ } + + /** + * Constructor TableColumn +@@ -177,7 +173,8 @@ + * @param cellEditor TODO + */ + public TableColumn(int modelIndex, int width, +- TableCellRenderer cellRenderer, TableCellEditor cellEditor) { ++ TableCellRenderer cellRenderer, TableCellEditor cellEditor) ++ { + this.modelIndex = modelIndex; + this.width = width; + this.preferredWidth = width; +@@ -185,12 +182,7 @@ + this.cellEditor = cellEditor; + this.headerValue = null; + this.identifier = null; +- } // TableColumn() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * firePropertyChange +@@ -198,9 +190,11 @@ + * @param oldValue TODO + * @param newValue TODO + */ +- private void firePropertyChange(String property, Object oldValue, Object newValue) { ++ private void firePropertyChange(String property, Object oldValue, ++ Object newValue) ++ { + changeSupport.firePropertyChange(property, oldValue, newValue); +- } // firePropertyChange() ++ } + + /** + * firePropertyChange +@@ -208,9 +202,10 @@ + * @param oldValue TODO + * @param newValue TODO + */ +- private void firePropertyChange(String property, int oldValue, int newValue) { ++ private void firePropertyChange(String property, int oldValue, int newValue) ++ { + firePropertyChange(property, new Integer(oldValue), new Integer(newValue)); +- } // firePropertyChange() ++ } + + /** + * firePropertyChange +@@ -218,51 +213,56 @@ + * @param oldValue TODO + * @param newValue TODO + */ +- private void firePropertyChange(String property, boolean oldValue, boolean newValue) { ++ private void firePropertyChange(String property, boolean oldValue, ++ boolean newValue) ++ { + firePropertyChange(property, new Boolean(oldValue), new Boolean(newValue)); +- } // firePropertyChange() ++ } + + /** + * setModelIndex + * @param modelIndex TODO + */ +- public void setModelIndex(int modelIndex) { ++ public void setModelIndex(int modelIndex) ++ { + this.modelIndex = modelIndex; +- } // setModelIndex() ++ } + + /** + * getModelIndex +- * @returns int ++ * @return int + */ +- public int getModelIndex() { ++ public int getModelIndex() ++ { + return modelIndex; +- } // getModelIndex() ++ } + + /** + * setIdentifier + * @param identifier TODO + */ +- public void setIdentifier(Object identifier) { ++ public void setIdentifier(Object identifier) ++ { + this.identifier = identifier; +- } // setIdentifier() ++ } + + /** + * getIdentifier +- * @returns Object ++ * @return Object + */ +- public Object getIdentifier() { +- if (identifier == null) { ++ public Object getIdentifier() ++ { ++ if (identifier == null) + return getHeaderValue(); +- } // if + return identifier; +- } // getIdentifier() ++ } + + /** + * setHeaderValue + * @param headerValue TODO + */ +- public void setHeaderValue(Object headerValue) { +- ++ public void setHeaderValue(Object headerValue) ++ { + // Variables + Object oldValue; + +@@ -273,245 +273,243 @@ + this.headerValue = headerValue; + + // Notify Listeners of change +- firePropertyChange(HEADER_VALUE_PROPERTY, +- oldValue, headerValue); +- +- } // setHeaderValue() ++ firePropertyChange(HEADER_VALUE_PROPERTY, oldValue, headerValue); ++ } + + /** + * getHeaderValue +- * @returns Object ++ * @return Object + */ +- public Object getHeaderValue() { ++ public Object getHeaderValue() ++ { + return headerValue; +- } // getHeaderValue() ++ } + +- /** +- * setHeaderRenderer +- * @param headerRenderer TODO +- */ +- public void setHeaderRenderer(TableCellRenderer headerRenderer) { +- +- // Variables +- TableCellRenderer oldRenderer; +- +- // Get Old Renderer +- oldRenderer = this.headerRenderer; +- +- // Set Property +- this.headerRenderer = headerRenderer; +- +- // Notify Listeners of change +- firePropertyChange(HEADER_RENDERER_PROPERTY, +- oldRenderer, headerRenderer); +- +- } // setHeaderRenderer() ++ /** ++ * setHeaderRenderer ++ * @param headerRenderer TODO ++ */ ++ public void setHeaderRenderer(TableCellRenderer renderer) ++ { ++ if (headerRenderer == renderer) ++ return; ++ ++ TableCellRenderer oldRenderer = headerRenderer; ++ headerRenderer = renderer; ++ firePropertyChange(HEADER_RENDERER_PROPERTY, ++ oldRenderer, headerRenderer); ++ } + + /** + * getHeaderRenderer +- * @returns TableCellRenderer ++ * @return TableCellRenderer + */ +- public TableCellRenderer getHeaderRenderer() { ++ public TableCellRenderer getHeaderRenderer() ++ { + return headerRenderer; +- } // getHeaderRenderer() +- +- /** +- * setCellRenderer +- * @param cellRenderer TODO +- */ +- public void setCellRenderer(TableCellRenderer cellRenderer) { +- +- // Variables +- TableCellRenderer oldRenderer; +- +- // Get Old Renderer +- oldRenderer = this.cellRenderer; +- +- // Set Property +- this.cellRenderer = cellRenderer; +- +- // Notify Listeners of change +- firePropertyChange(CELL_RENDERER_PROPERTY, +- oldRenderer, cellRenderer); ++ } + +- } // setCellRenderer() ++ /** ++ * setCellRenderer ++ * @param cellRenderer TODO ++ */ ++ public void setCellRenderer(TableCellRenderer renderer) ++ { ++ if (cellRenderer == renderer) ++ return; ++ ++ TableCellRenderer oldRenderer = cellRenderer; ++ cellRenderer = renderer; ++ firePropertyChange(CELL_RENDERER_PROPERTY, ++ oldRenderer, cellRenderer); ++ } + + /** + * getCellRenderer +- * @returns TableCellRenderer ++ * @return TableCellRenderer + */ +- public TableCellRenderer getCellRenderer() { ++ public TableCellRenderer getCellRenderer() ++ { + return cellRenderer; +- } // getCellRenderer() ++ } + + /** + * setCellEditor + * @param cellEditor TODO + */ +- public void setCellEditor(TableCellEditor cellEditor) { ++ public void setCellEditor(TableCellEditor cellEditor) ++ { + this.cellEditor = cellEditor; +- } // setCellEditor() ++ } + + /** + * getCellEditor +- * @returns TableCellEditor ++ * @return TableCellEditor + */ +- public TableCellEditor getCellEditor() { ++ public TableCellEditor getCellEditor() ++ { + return cellEditor; +- } // getCellEditor() ++ } + +- /** +- * setWidth +- * @param width TODO +- */ +- public void setWidth(int width) { +- +- // Variables +- int oldWidth; ++ /** ++ * setWidth ++ * @param newWidth TODO ++ */ ++ public void setWidth(int newWidth) ++ { ++ int oldWidth = width; ++ ++ if (newWidth < minWidth) ++ width = minWidth; ++ else if (newWidth > maxWidth) ++ width = maxWidth; ++ else ++ width = newWidth; + +- // Get Old Width +- oldWidth = this.width; ++ if (width == oldWidth) ++ return; + +- // Adjust Width within Limits +- if (width < minWidth) { +- this.width = minWidth; +- } else if (width > maxWidth) { +- this.width = maxWidth; +- } else { +- this.width = width; +- } // if +- +- // Fire Property Change +- firePropertyChange(COLUMN_WIDTH_PROPERTY, oldWidth, this.width); +- +- } // setWidth() ++ firePropertyChange(COLUMN_WIDTH_PROPERTY, oldWidth, width); ++ } + + /** + * getWidth +- * @returns int ++ * @return int + */ +- public int getWidth() { ++ public int getWidth() ++ { + return width; +- } // getWidth() ++ } + + /** + * setPreferredWidth + * @param preferredWidth TODO + */ +- public void setPreferredWidth(int preferredWidth) { +- if (preferredWidth < minWidth) { ++ public void setPreferredWidth(int preferredWidth) ++ { ++ if (preferredWidth < minWidth) + this.preferredWidth = minWidth; +- } else if (preferredWidth > maxWidth) { ++ else if (preferredWidth > maxWidth) + this.preferredWidth = maxWidth; +- } else { ++ else + this.preferredWidth = preferredWidth; +- } // if +- } // setPreferredWidth() ++ } + + /** + * getPreferredWidth +- * @returns int ++ * @return int + */ +- public int getPreferredWidth() { ++ public int getPreferredWidth() ++ { + return preferredWidth; +- } // getPreferredWidth() ++ } + + /** + * setMinWidth + * @param minWidth TODO + */ +- public void setMinWidth(int minWidth) { ++ public void setMinWidth(int minWidth) ++ { + this.minWidth = minWidth; + setWidth(getWidth()); + setPreferredWidth(getPreferredWidth()); +- } // setMinWidth() ++ } + + /** + * getMinWidth +- * @returns int ++ * @return int + */ +- public int getMinWidth() { ++ public int getMinWidth() ++ { + return minWidth; +- } // getMinWidth() ++ } + + /** + * setMaxWidth + * @param maxWidth TODO + */ +- public void setMaxWidth(int maxWidth) { ++ public void setMaxWidth(int maxWidth) ++ { + this.maxWidth = maxWidth; + setWidth(getWidth()); + setPreferredWidth(getPreferredWidth()); +- } // setMaxWidth() ++ } + + /** + * getMaxWidth +- * @returns int ++ * @return int + */ +- public int getMaxWidth() { ++ public int getMaxWidth() ++ { + return maxWidth; +- } // getMaxWidth() ++ } + + /** + * setResizable + * @param isResizable TODO + */ +- public void setResizable(boolean isResizable) { ++ public void setResizable(boolean isResizable) ++ { + this.isResizable = isResizable; +- } // setResizable() ++ } + + /** + * getResizable +- * @returns boolean ++ * @return boolean + */ +- public boolean getResizable() { ++ public boolean getResizable() ++ { + return isResizable; +- } // getResizable() ++ } + + /** + * sizeWidthToFit + */ +- public void sizeWidthToFit() { ++ public void sizeWidthToFit() ++ { + // TODO +- } // sizeWidthToFit() ++ } + + /** + * disableResizedPosting + */ +- public void disableResizedPosting() { ++ public void disableResizedPosting() ++ { + // Does nothing +- } // disableResizedPosting() ++ } + + /** + * enableResizedPosting + */ +- public void enableResizedPosting() { ++ public void enableResizedPosting() ++ { + // Does nothing +- } // enableResizedPosting() ++ } + + /** + * addPropertyChangeListener +- * @param listener TODO ++ * @param listener the listener to all + */ +- public synchronized void addPropertyChangeListener(PropertyChangeListener listener) { ++ public synchronized void addPropertyChangeListener(PropertyChangeListener listener) ++ { + changeSupport.addPropertyChangeListener(listener); +- } // addPropertyChangeListener() ++ } + + /** + * removePropertyChangeListener +- * @param listener TODO ++ * @param listener the listener to remove + */ +- public synchronized void removePropertyChangeListener(PropertyChangeListener listener) { ++ public synchronized void removePropertyChangeListener(PropertyChangeListener listener) ++ { + changeSupport.removePropertyChangeListener(listener); +- } // removePropertyChangeListener() ++ } + + /** + * createDefaultHeaderRenderer +- * @returns TableCellRenderer ++ * @return TableCellRenderer + */ +- protected TableCellRenderer createDefaultHeaderRenderer() { ++ protected TableCellRenderer createDefaultHeaderRenderer() ++ { + return new DefaultTableCellRenderer(); +- } // createDefaultHeaderRenderer() +- +- +-} // TableColumn ++ } ++} +Index: javax/swing/table/TableColumnModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/TableColumnModel.java,v +retrieving revision 1.2 +diff -u -r1.2 TableColumnModel.java +--- javax/swing/table/TableColumnModel.java 12 Oct 2003 13:33:31 -0000 1.2 ++++ javax/swing/table/TableColumnModel.java 6 Sep 2004 16:36:09 -0000 +@@ -37,17 +37,17 @@ + + package javax.swing.table; + +-// Imports + import java.util.Enumeration; + import javax.swing.ListSelectionModel; + import javax.swing.event.TableColumnModelListener; + ++ + /** + * TableColumnModel public interface + * @author Andrew Selkirk + */ +-public interface TableColumnModel { +- ++public interface TableColumnModel ++{ + /** + * addColumn + * @param column TableColumn +@@ -75,13 +75,13 @@ + + /** + * getColumnCount +- * @returns Column count ++ * @return Column count + */ + int getColumnCount(); + + /** + * getColumns +- * @returns Enumeration of columns ++ * @return Enumeration of columns + */ + Enumeration getColumns(); + +@@ -99,19 +99,19 @@ + + /** + * getColumnMargin +- * @returns Column margin ++ * @return Column margin + */ + int getColumnMargin(); + + /** + * getColumnIndexAtX +- * @returns Column index as position x ++ * @return Column index as position x + */ + int getColumnIndexAtX(int xPosition); + + /** + * getTotalColumnWidth +- * @returns Total column width ++ * @return Total column width + */ + int getTotalColumnWidth(); + +@@ -123,19 +123,19 @@ + + /** + * getColumnSelectionAllowed +- * @returns true if column selection allowed, false otherwise ++ * @return true if column selection allowed, false otherwise + */ + boolean getColumnSelectionAllowed(); + + /** + * getSelectedColumns +- * @returns Selected columns ++ * @return Selected columns + */ + int[] getSelectedColumns(); + + /** + * getSelectedColumnCount +- * @returns Count of selected columns ++ * @return Count of selected columns + */ + int getSelectedColumnCount(); + +@@ -162,6 +162,4 @@ + * @param listener TableColumnModelListener + */ + void removeColumnModelListener(TableColumnModelListener listener); +- +- +-} // TableColumnModel ++} +Index: javax/swing/table/TableModel.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/table/TableModel.java,v +retrieving revision 1.2 +diff -u -r1.2 TableModel.java +--- javax/swing/table/TableModel.java 12 Oct 2003 13:33:31 -0000 1.2 ++++ javax/swing/table/TableModel.java 6 Sep 2004 16:36:09 -0000 +@@ -37,38 +37,38 @@ + + package javax.swing.table; + +-// Imports + import javax.swing.event.TableModelListener; + ++ + /** + * TableModel public interface + * @author Andrew Selkirk + */ +-public interface TableModel { +- ++public interface TableModel ++{ + /** + * getRowCount +- * @returns row count ++ * @return row count + */ + int getRowCount(); + + /** + * getColumnCount +- * @returns column count ++ * @return column count + */ + int getColumnCount(); + + /** + * getColumnName + * @param columnIndex Column index +- * @returns Column name ++ * @return Column name + */ + String getColumnName(int columnIndex); + + /** + * getColumnClass + * @param columnIndex Column index +- * @returns Column class ++ * @return Column class + */ + Class getColumnClass(int columnIndex); + +@@ -76,7 +76,7 @@ + * isCellEditable + * @param rowIndex Row index + * @param columnIndex Column index +- * @returns true if editable, false otherwise ++ * @return true if editable, false otherwise + */ + boolean isCellEditable(int rowIndex, int columnIndex); + +@@ -84,7 +84,7 @@ + * getValueAt + * @param rowIndex Row index + * @param columnIndex Column index +- * @returns Value at specified indices ++ * @return Value at specified indices + */ + Object getValueAt(int rowIndex, int columnIndex); + +@@ -107,6 +107,4 @@ + * @param listener TableModelListener + */ + void removeTableModelListener(TableModelListener listener); +- +- +-} // TableModel ++} +Index: javax/swing/text/AbstractDocument.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/AbstractDocument.java,v +retrieving revision 1.3 +diff -u -r1.3 AbstractDocument.java +--- javax/swing/text/AbstractDocument.java 10 Jan 2004 21:07:44 -0000 1.3 ++++ javax/swing/text/AbstractDocument.java 6 Sep 2004 16:36:09 -0000 +@@ -1,4 +1,4 @@ +-/* AbstractDocument.java -- ++/* AbstractDocument.java -- + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -37,6 +37,8 @@ + + package javax.swing.text; + ++import java.io.Serializable; ++import java.util.Collections; + import java.util.Dictionary; + import java.util.Enumeration; + import java.util.EventListener; +@@ -47,321 +49,776 @@ + import javax.swing.event.UndoableEditEvent; + import javax.swing.event.UndoableEditListener; + import javax.swing.tree.TreeNode; ++import javax.swing.undo.AbstractUndoableEdit; ++import javax.swing.undo.CompoundEdit; + import javax.swing.undo.UndoableEdit; + +-public abstract class AbstractDocument implements Document ++ ++public abstract class AbstractDocument ++ implements Document, Serializable + { +- Vector doc_list = new Vector(); +- Vector undo_list = new Vector(); ++ private static final long serialVersionUID = -116069779446114664L; ++ protected static final String BAD_LOCATION = "document location failure"; ++ public static final String BidiElementName = "bidi level"; ++ public static final String ContentElementName = "content"; ++ public static final String ParagraphElementName = "paragraph"; ++ public static final String SectionElementName = "section"; ++ public static final String ElementNameAttribute = "$ename"; ++ ++ Content content; ++ AttributeContext context; ++ protected EventListenerList listenerList = new EventListenerList(); ++ ++ protected AbstractDocument(Content doc) ++ { ++ this(doc, StyleContext.getDefaultStyleContext()); ++ } ++ ++ protected AbstractDocument(Content doc, AttributeContext ctx) ++ { ++ content = doc; ++ context = ctx; ++ } ++ ++ // These still need to be implemented by a derived class: ++ public abstract Element getParagraphElement(int pos); ++ ++ public abstract Element getDefaultRootElement(); ++ ++ protected Element createBranchElement(Element parent, ++ AttributeSet attributes) ++ { ++ return new BranchElement(parent, attributes); ++ } ++ ++ protected Element createLeafElement(Element parent, AttributeSet attributes, ++ int start, int end) ++ { ++ return new LeafElement(parent, attributes, start, end); ++ } ++ ++ public Position createPosition(final int offset) throws BadLocationException ++ { ++ if (offset < 0 || offset > getLength()) ++ throw new BadLocationException(getText(0, getLength()), offset); ++ ++ return new Position() ++ { ++ public int getOffset() ++ { ++ return offset; ++ } ++ }; ++ } + +- // these still need to be implemented by a derived class: +- public abstract Element getParagraphElement(int pos); +- public abstract Element getDefaultRootElement(); +- +- // some inner classes sun says I should have: +- abstract class AbstractElement implements Element, TreeNode +- { +- int count, offset; +- AttributeSet attr; +- Vector elts = new Vector(); +- String name; +- Element parent; +- Vector kids = new Vector(); +- TreeNode tree_parent; +- +- public AbstractElement(Element p, AttributeSet s) +- { parent = p; attr = s; } +- +- public Enumeration children() { return kids.elements(); } +- public boolean getAllowsChildren() { return true; } +- public TreeNode getChildAt(int index) { return (TreeNode) kids.elementAt(index); } +- public int getChildCount() { return kids.size(); } +- public int getIndex(TreeNode node) { return kids.indexOf(node); } +- public TreeNode getParent() { return tree_parent; } +- +- public AttributeSet getAttributes() { return attr; } +- public Document getDocument() { return AbstractDocument.this; } +- public Element getElement(int index) { return (Element)elts.elementAt(index); } +- public String getName() { return name; } +- public Element getParentElement() { return parent; } +- +- public abstract boolean isLeaf(); +- public abstract int getEndOffset(); +- public abstract int getElementCount(); +- public abstract int getElementIndex(int offset); +- public abstract int getStartOffset(); ++ protected void fireChangedUpdate(DocumentEvent event) ++ { ++ DocumentListener[] listeners = getDocumentListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].changedUpdate(event); ++ } ++ ++ protected void fireInsertUpdate(DocumentEvent event) ++ { ++ DocumentListener[] listeners = getDocumentListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].insertUpdate(event); ++ } ++ ++ protected void fireRemoveUpdate(DocumentEvent event) ++ { ++ DocumentListener[] listeners = getDocumentListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].removeUpdate(event); ++ } ++ ++ protected void fireUndoableEditUpdate(UndoableEditEvent event) ++ { ++ UndoableEditListener[] listeners = getUndoableEditListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].undoableEditHappened(event); ++ } ++ ++ public int getAsynchronousLoadPriority() ++ { ++ return 0; ++ } ++ ++ protected AttributeContext getAttributeContext() ++ { ++ return context; ++ } ++ ++ public Element getBidiRootElement() ++ { ++ return null; ++ } ++ ++ protected Content getContent() ++ { ++ return content; ++ } ++ ++ protected Thread getCurrentWriter() ++ { ++ return null; ++ } ++ ++ public Dictionary getDocumentProperties() ++ { ++ return null; ++ } ++ ++ public Position getEndPosition() ++ { ++ return new Position() ++ { ++ public int getOffset() ++ { ++ return getLength(); ++ } ++ }; ++ } ++ ++ public int getLength() ++ { ++ return content.length(); ++ } ++ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ public Object getProperty(Object key) ++ { ++ return null; ++ } ++ ++ public Element[] getRootElements() ++ { ++ Element[] elements = new Element[1]; ++ elements[0] = getDefaultRootElement(); ++ return elements; ++ } ++ ++ public Position getStartPosition() ++ { ++ return new Position() ++ { ++ public int getOffset() ++ { ++ return 0; ++ } ++ }; ++ } ++ ++ public String getText(int offset, int length) throws BadLocationException ++ { ++ return content.getString(offset, length); ++ } ++ ++ public void getText(int offset, int length, Segment segment) ++ throws BadLocationException ++ { ++ content.getChars(offset, length, segment); ++ } ++ ++ public void insertString(int offset, String text, AttributeSet attributes) ++ throws BadLocationException ++ { ++ // Just return when no text to insert was given. ++ if (text == null || text.length() == 0) ++ return; ++ ++ DefaultDocumentEvent event = ++ new DefaultDocumentEvent(offset, text.length(), ++ DocumentEvent.EventType.INSERT); ++ content.insertString(offset, text); ++ insertUpdate(event, attributes); ++ fireInsertUpdate(event); ++ } ++ ++ protected void insertUpdate(DefaultDocumentEvent chng, AttributeSet attr) ++ { ++ } ++ ++ protected void postRemoveUpdate(DefaultDocumentEvent chng) ++ { ++ } ++ ++ public void putProperty(Object key, Object value) ++ { ++ } ++ ++ public void readLock() ++ { ++ } ++ ++ public void readUnlock() ++ { ++ } ++ ++ public void remove(int offset, int length) throws BadLocationException ++ { ++ DefaultDocumentEvent event = ++ new DefaultDocumentEvent(offset, length, ++ DocumentEvent.EventType.REMOVE); ++ removeUpdate(event); ++ content.remove(offset, length); ++ postRemoveUpdate(event); ++ fireRemoveUpdate(event); ++ } ++ ++ /** ++ * Replaces some text in the document. ++ * ++ * @since 1.4 ++ */ ++ public void replace(int offset, int length, String text, ++ AttributeSet attributes) ++ throws BadLocationException ++ { ++ remove(offset, length); ++ insertString(offset, text, attributes); ++ } ++ ++ /** ++ * Adds a DocumentListener object to this document. ++ * ++ * @param listener the listener to add ++ */ ++ public void addDocumentListener(DocumentListener listener) ++ { ++ listenerList.add(DocumentListener.class, listener); ++ } ++ ++ /** ++ * Removes a DocumentListener object from this document. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeDocumentListener(DocumentListener listener) ++ { ++ listenerList.remove(DocumentListener.class, listener); ++ } ++ ++ /** ++ * Returns add added DocumentListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public DocumentListener[] getDocumentListeners() ++ { ++ return (DocumentListener[]) getListeners(DocumentListener.class); ++ } ++ ++ /** ++ * Adds a UndoableEditListener object to this document. ++ * ++ * @param listener the listener to add ++ */ ++ public void addUndoableEditListener(UndoableEditListener listener) ++ { ++ listenerList.add(UndoableEditListener.class, listener); ++ } ++ ++ /** ++ * Removes a UndoableEditListener object from this document. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeUndoableEditListener(UndoableEditListener listener) ++ { ++ listenerList.remove(UndoableEditListener.class, listener); ++ } ++ ++ /** ++ * Returns add added UndoableEditListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public UndoableEditListener[] getUndoableEditListeners() ++ { ++ return (UndoableEditListener[]) getListeners(UndoableEditListener.class); ++ } ++ ++ protected void removeUpdate(DefaultDocumentEvent chng) ++ { ++ } ++ ++ public void render(Runnable r) ++ { ++ } ++ ++ public void setAsynchronousLoadPriority(int p) ++ { ++ } ++ ++ public void setDocumentProperties(Dictionary x) ++ { ++ } ++ ++ protected void writeLock() ++ { ++ } ++ ++ protected void writeUnlock() ++ { ++ } ++ ++ public interface AttributeContext ++ { ++ AttributeSet addAttribute(AttributeSet old, Object name, Object value); ++ ++ AttributeSet addAttributes(AttributeSet old, AttributeSet attributes); ++ ++ AttributeSet getEmptySet(); ++ ++ void reclaim(AttributeSet attributes); ++ ++ AttributeSet removeAttribute(AttributeSet old, Object name); ++ ++ AttributeSet removeAttributes(AttributeSet old, AttributeSet attributes); ++ ++ AttributeSet removeAttributes(AttributeSet old, Enumeration names); ++ } ++ ++ public interface Content ++ { ++ Position createPosition(int offset) throws BadLocationException; ++ ++ int length(); ++ ++ UndoableEdit insertString(int where, String str) ++ throws BadLocationException; ++ ++ UndoableEdit remove(int where, int nitems) throws BadLocationException; ++ ++ String getString(int where, int len) throws BadLocationException; ++ ++ void getChars(int where, int len, Segment txt) throws BadLocationException; ++ } ++ ++ public abstract class AbstractElement ++ implements Element, MutableAttributeSet, TreeNode, Serializable ++ { ++ private static final long serialVersionUID = 1265312733007397733L; ++ int count; ++ int offset; ++ ++ AttributeSet attributes; ++ ++ Element element_parent; ++ Vector element_children; ++ ++ TreeNode tree_parent; ++ Vector tree_children; ++ ++ public AbstractElement(Element p, AttributeSet s) ++ { ++ element_parent = p; ++ attributes = s; + } + +- interface AttributeContext ++ // TreeNode implementation ++ ++ public Enumeration children() ++ { ++ return Collections.enumeration(tree_children); ++ } ++ ++ public boolean getAllowsChildren() ++ { ++ return true; ++ } ++ ++ public TreeNode getChildAt(int index) + { ++ return (TreeNode) tree_children.get(index); ++ } ++ ++ public int getChildCount() ++ { ++ return tree_children.size(); ++ } ++ ++ public int getIndex(TreeNode node) ++ { ++ return tree_children.indexOf(node); + } + +- +- class BranchElement extends AbstractElement ++ public TreeNode getParent() + { +- public BranchElement(Element e, AttributeSet a, int s, int end) +- { super(e, a); } ++ return tree_parent; ++ } + +- public boolean isLeaf() { return false; } +- public int getEndOffset() { return 0; } +- public int getElementCount() { return 0; } +- public int getElementIndex(int offset) { return 0; } +- public int getStartOffset() { return 0; } ++ public abstract boolean isLeaf(); ++ ++ ++ // MutableAttributeSet support ++ ++ public void addAttribute(Object name, Object value) ++ { ++ attributes = getAttributeContext().addAttribute(attributes, name, value); + } +- +- interface Content ++ ++ public void addAttributes(AttributeSet attrs) + { +- Position createPosition(int offset) throws BadLocationException; +- int length(); +- UndoableEdit insertString(int where, String str) throws BadLocationException; +- UndoableEdit remove(int where, int nitems) throws BadLocationException; +- String getString(int where, int len) throws BadLocationException; +- void getChars(int where, int len, Segment txt) throws BadLocationException; ++ attributes = getAttributeContext().addAttributes(attributes, attrs); + } +- +- class DefaultDocumentEvent implements DocumentEvent ++ ++ public void removeAttribute(Object name) + { +- public int len, off; +- public Document getDocument() { return AbstractDocument.this; } +- public int getLength() { return len; } +- public int getOffset() { return off; } +- public DocumentEvent.EventType getType() { return null; } +- public DocumentEvent.ElementChange getChange(Element elem) { return null; } ++ attributes = getAttributeContext().removeAttribute(attributes, name); + } +- +- static class ElementEdit ++ ++ public void removeAttributes(AttributeSet attrs) + { +- } +- +- class LeafElement extends AbstractElement ++ attributes = getAttributeContext().removeAttributes(attributes, attrs); ++ } ++ ++ public void removeAttributes(Enumeration names) ++ { ++ attributes = getAttributeContext().removeAttributes(attributes, names); ++ } ++ ++ public void setResolveParent(AttributeSet parent) + { +- LeafElement(Element e, AttributeSet a, int s, int end) +- { super(e, a); } ++ attributes = getAttributeContext().addAttribute(attributes, ResolveAttribute, parent); ++ } ++ ++ ++ // AttributeSet interface support + +- public boolean isLeaf() { return true; } +- public int getEndOffset() { return 0; } +- public int getElementCount() { return 0; } +- public int getElementIndex(int offset) { return 0; } +- public int getStartOffset() { return 0; } ++ public boolean containsAttribute(Object name, Object value) ++ { ++ return attributes.containsAttribute(name, value); + } +- + +- Content content; ++ public boolean containsAttributes(AttributeSet attrs) ++ { ++ return attributes.containsAttributes(attrs); ++ } + +- AbstractDocument(Content doc) ++ public AttributeSet copyAttributes() + { +- content = doc; ++ return attributes.copyAttributes(); + } +- +- /******************************************************** +- * +- * the meat: +- * +- ***********/ +- + +- public void addDocumentListener(DocumentListener listener) ++ public Object getAttribute(Object key) + { +- doc_list.addElement(listener); ++ return attributes.getAttribute(key); + } +- +- public void addUndoableEditListener(UndoableEditListener listener) ++ ++ public int getAttributeCount() + { +- undo_list.addElement(listener); ++ return attributes.getAttributeCount(); + } +- +- protected Element createBranchElement(Element parent, AttributeSet a) +- { +- return new BranchElement(parent, a, 0, 0); ++ ++ public Enumeration getAttributeNames() ++ { ++ return attributes.getAttributeNames(); + } +- +- protected Element createLeafElement(Element parent, AttributeSet a, int p0, int p1) ++ ++ public AttributeSet getResolveParent() + { +- return new LeafElement(parent, a, p0, p1-p0); ++ return attributes.getResolveParent(); + } + +- public Position createPosition(int offs) ++ public boolean isDefined(Object attrName) + { +- final int a = offs; +- return new Position() +- { +- public int getOffset() +- { +- return a; +- } +- }; ++ return attributes.isDefined(attrName); + } +- +- protected void fireChangedUpdate(DocumentEvent e) ++ ++ public boolean isEqual(AttributeSet attrs) + { ++ return attributes.isEqual(attrs); + } +- +- protected void fireInsertUpdate(DocumentEvent e) ++ ++ // Element interface support ++ ++ public AttributeSet getAttributes() + { ++ return attributes; + } +- +- protected void fireRemoveUpdate(DocumentEvent e) ++ ++ public Document getDocument() + { ++ return AbstractDocument.this; + } +- +- protected void fireUndoableEditUpdate(UndoableEditEvent e) ++ ++ public Element getElement(int index) + { ++ return (Element) element_children.get(index); + } +- int getAsynchronousLoadPriority() ++ ++ public String getName() + { +- return 0; ++ return (String) getAttribute(NameAttribute); + } +- +- protected AttributeContext getAttributeContext() ++ ++ public Element getParentElement() + { +- return null; ++ return element_parent; + } ++ ++ public abstract int getEndOffset(); ++ ++ public abstract int getElementCount(); ++ ++ public abstract int getElementIndex(int offset); ++ ++ public abstract int getStartOffset(); ++ } ++ ++ public class BranchElement extends AbstractElement ++ { ++ private static final long serialVersionUID = -8595176318868717313L; + +- Element getBidiRootElement() ++ private Vector children = new Vector(); ++ ++ public BranchElement(Element parent, AttributeSet attributes) + { +- return null; ++ super(parent, attributes); ++ } ++ ++ public Enumeration children() ++ { ++ return children.elements(); + } +- +- protected Content getContent() ++ ++ public boolean getAllowsChildren() + { +- return content; ++ return true; + } +- +- protected Thread getCurrentWriter() ++ ++ public Element getElement(int index) + { ++ if (index < 0 || index >= children.size()) + return null; ++ ++ return (Element) children.get(index); + } + ++ public int getElementCount() ++ { ++ return children.size(); ++ } + +- public Dictionary getDocumentProperties() ++ public int getElementIndex(int offset) + { +- return null; ++ if (children.size() == 0) ++ return 0; ++ ++ Element element = positionToElement(offset); ++ ++ if (element == null) ++ return 0; ++ ++ return children.indexOf(element); + } + +- public Position getEndPosition() ++ public int getEndOffset() + { +- return null; ++ return ((Element) children.lastElement()).getEndOffset(); + } + +- public int getLength() ++ public String getName() + { +- return content.length(); ++ return "AbstractDocument.BranchElement"; + } +- +- public EventListener[] getListeners(Class listenerType) ++ ++ public int getStartOffset() + { +- return null; ++ return ((Element) children.firstElement()).getStartOffset(); + } +- +- public Object getProperty(Object key) ++ ++ public boolean isLeaf() + { +- return null; ++ return false; + } + +- public Element[] getRootElements() ++ public Element positionToElement(int position) + { +- return null; ++ // XXX: There is surely a better algorithm ++ // as beginning from first element each time. ++ for (int index = 0; index < children.size(); ++index) ++ { ++ Element elem = (Element) children.get(index); ++ ++ if ((elem.getStartOffset() <= position) ++ && (position < elem.getEndOffset())) ++ return elem; ++ } ++ ++ return null; ++ } ++ ++ public void replace(int offset, int length, Element[] elems) ++ { ++ for (int index = 0; index < length; ++index) ++ children.removeElementAt(offset); ++ ++ for (int index = 0; index < elems.length; ++index) ++ children.add(offset + index, elems[index]); ++ } ++ ++ public String toString() ++ { ++ return getName() + ": " + "content"; + } ++ } ++ ++ public class DefaultDocumentEvent extends CompoundEdit ++ implements DocumentEvent ++ { ++ private static final long serialVersionUID = -7406103236022413522L; + +- public Position getStartPosition() ++ private int offset; ++ private int length; ++ private DocumentEvent.EventType type; ++ ++ public DefaultDocumentEvent(int offset, int length, ++ DocumentEvent.EventType type) + { +- return null; ++ this.offset = offset; ++ this.length = length; ++ this.type = type; + } + +- public String getText(int offset, int length) ++ public Document getDocument() + { +- try { +- return content.getString(offset, length); +- } catch (Exception e) { +- System.out.println("Hmmm, fail to getText: " + offset + " -> " + length); +- return null; +- } ++ return AbstractDocument.this; ++ } ++ ++ public int getLength() ++ { ++ return length; + } +- +- public void getText(int offset, int length, Segment txt) ++ ++ public int getOffset() + { +- String a = getText(offset, length); ++ return offset; ++ } + +- if (a == null) +- { +- txt.offset = 0; +- txt.count = 0; +- txt.array = new char[0]; +- return; +- } +- +- txt.offset = offset; +- txt.count = length; +- +- char chars[] = new char[ a.length() ]; +- +- a.getChars(0, a.length(), chars, 0); +- +- txt.array = chars; +- } +- +- public void insertString(int offs, String str, AttributeSet a) +- { +- try { +- content.insertString(offs, str); +- } catch (Exception e) { +- System.err.println("FAILED TO INSERT-STRING: " + e + ", at:"+offs); +- } ++ public DocumentEvent.EventType getType() ++ { ++ return type; + } +- +- protected void insertUpdate(DefaultDocumentEvent chng, AttributeSet attr) ++ ++ public DocumentEvent.ElementChange getChange(Element elem) + { ++ return null; + } +- +- protected void postRemoveUpdate(DefaultDocumentEvent chng) ++ } ++ ++ public static class ElementEdit extends AbstractUndoableEdit ++ implements DocumentEvent.ElementChange ++ { ++ private static final long serialVersionUID = -1216620962142928304L; ++ ++ private Element elem; ++ private int index; ++ private Element[] removed; ++ private Element[] added; ++ ++ public ElementEdit(Element elem, int index, ++ Element[] removed, Element[] added) + { ++ this.elem = elem; ++ this.index = index; ++ this.removed = removed; ++ this.added = added; + } +- +- public void putProperty(Object key, Object value) ++ ++ public Element[] getChildrenAdded() + { ++ return added; + } +- +- public void readLock() ++ ++ public Element[] getChildrenRemoved() + { ++ return removed; + } +- +- public void readUnlock() ++ ++ public Element getElement() + { ++ return elem; + } +- +- public void remove(int offs, int len) ++ ++ public int getIndex() + { ++ return index; + } +- +- public void removeDocumentListener(DocumentListener listener) ++ } ++ ++ public class LeafElement extends AbstractElement ++ { ++ private static final long serialVersionUID = 5115368706941283802L; ++ private int start; ++ private int end; ++ ++ public LeafElement(Element parent, AttributeSet attributes, int start, ++ int end) + { ++ super(parent, attributes); ++ this.start = start; ++ this.end = end; + } +- +- public void removeUndoableEditListener(UndoableEditListener listener) ++ ++ public Enumeration children() + { ++ return null; + } +- +- protected void removeUpdate(DefaultDocumentEvent chng) ++ ++ public boolean getAllowsChildren() + { ++ return false; + } +- +- public void render(Runnable r) ++ ++ public Element getElement() + { ++ return null; + } +- +- void setAsynchronousLoadPriority(int p) ++ ++ public int getElementCount() ++ { ++ return 0; ++ } ++ ++ public int getElementIndex(int offset) ++ { ++ return -1; ++ } ++ ++ public int getEndOffset() ++ { ++ return end; ++ } ++ ++ public String getName() + { ++ return "AbstractDocument.LeafElement"; + } +- +- void setDocumentProperties(Dictionary x) ++ ++ public int getStartOffset() + { ++ return start; + } +- +- protected void writeLock() ++ ++ public boolean isLeaf() + { ++ return true; + } +- +- protected void writeUnlock() ++ ++ public String toString() + { ++ return getName() + ": " + "content"; + } ++ } + } +Index: javax/swing/text/AttributeSet.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/AttributeSet.java,v +retrieving revision 1.2 +diff -u -r1.2 AttributeSet.java +--- javax/swing/text/AttributeSet.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/AttributeSet.java 6 Sep 2004 16:36:09 -0000 +@@ -41,13 +41,32 @@ + + public interface AttributeSet + { +- boolean containsAttribute(Object name, Object value); +- boolean containsAttributes(AttributeSet attributes); +- AttributeSet copyAttributes(); +- Object getAttribute(Object key); +- int getAttributeCount(); +- Enumeration getAttributeNames(); +- AttributeSet getResolveParent(); +- boolean isDefined(Object attrName); +- boolean isEqual(AttributeSet attr); ++ static interface CharacterAttribute ++ { ++ } ++ ++ static interface ColorAttribute ++ { ++ } ++ ++ static interface FontAttribute ++ { ++ } ++ ++ static interface ParagraphAttribute ++ { ++ } ++ ++ static Object NameAttribute = StyleConstants.NameAttribute; ++ static Object ResolveAttribute = StyleConstants.ResolveAttribute; ++ ++ boolean containsAttribute(Object name, Object value); ++ boolean containsAttributes(AttributeSet attributes); ++ AttributeSet copyAttributes(); ++ Object getAttribute(Object key); ++ int getAttributeCount(); ++ Enumeration getAttributeNames(); ++ AttributeSet getResolveParent(); ++ boolean isDefined(Object attrName); ++ boolean isEqual(AttributeSet attr); + } +Index: javax/swing/text/BadLocationException.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/BadLocationException.java,v +retrieving revision 1.2 +diff -u -r1.2 BadLocationException.java +--- javax/swing/text/BadLocationException.java 21 Mar 2003 09:18:31 -0000 1.2 ++++ javax/swing/text/BadLocationException.java 6 Sep 2004 16:36:09 -0000 +@@ -1,5 +1,5 @@ +-/* BadLocationException.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* BadLocationException.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,27 +37,28 @@ + + package javax.swing.text; + +- + public class BadLocationException extends Exception +-{ +- int offset; ++{ ++ private static final long serialVersionUID = -7712259886815656766L; + ++ int offset; ++ + /** + * Constructs a BadLocationException + * + * @param str A string indicating what was wrong with the arguments + * @param offset Offset within the document that was requested >= 0 + */ +- public BadLocationException (String str, int offset) ++ public BadLocationException(String str, int offset) + { +- super (str); ++ super(str); + this.offset = offset; + } + + /** + * Returns the offset into the document that was not legal + */ +- public int offsetRequested () ++ public int offsetRequested() + { + return offset; + } +Index: javax/swing/text/CharacterIterator.java +=================================================================== +RCS file: javax/swing/text/CharacterIterator.java +diff -N javax/swing/text/CharacterIterator.java +--- javax/swing/text/CharacterIterator.java 9 Aug 2002 04:26:12 -0000 1.1 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,53 +0,0 @@ +-/* CharacterIterator.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +-package javax.swing.text; +- +- +-public interface CharacterIterator extends Cloneable +-{ +- Object clone(); +- char current(); +- char first(); +- int getBeginIndex(); +- int getEndIndex(); +- int getIndex(); +- char last(); +- char next(); +- char previous(); +- char setIndex(int position); +-} +Index: javax/swing/text/ComponentView.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/ComponentView.java,v +retrieving revision 1.3 +diff -u -r1.3 ComponentView.java +--- javax/swing/text/ComponentView.java 10 Jan 2004 21:07:44 -0000 1.3 ++++ javax/swing/text/ComponentView.java 6 Sep 2004 16:36:09 -0000 +@@ -79,6 +79,7 @@ + } + + public Shape modelToView(int pos, Shape a, Position.Bias b) ++ throws BadLocationException + { + return null; + } +Index: javax/swing/text/DefaultCaret.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/DefaultCaret.java,v +retrieving revision 1.3 +diff -u -r1.3 DefaultCaret.java +--- javax/swing/text/DefaultCaret.java 10 Jan 2004 21:07:44 -0000 1.3 ++++ javax/swing/text/DefaultCaret.java 6 Sep 2004 16:36:10 -0000 +@@ -1,4 +1,4 @@ +-/* DefaultCaret.java -- ++/* DefaultCaret.java -- + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -41,139 +41,276 @@ + import java.awt.Graphics; + import java.awt.Point; + import java.awt.Rectangle; +-import java.awt.Shape; + import java.awt.event.FocusEvent; + import java.awt.event.FocusListener; + import java.awt.event.MouseEvent; + import java.awt.event.MouseListener; + import java.awt.event.MouseMotionListener; + import java.util.EventListener; +-import java.util.Vector; ++ ++import javax.swing.event.ChangeEvent; + import javax.swing.event.ChangeListener; + import javax.swing.event.EventListenerList; + + +-public class DefaultCaret extends Rectangle implements Caret, FocusListener, MouseListener, MouseMotionListener ++public class DefaultCaret extends Rectangle ++ implements Caret, FocusListener, MouseListener, MouseMotionListener + { +- Color color = new Color(0,0,0); +- JTextComponent parent; ++ private static final long serialVersionUID = 228155774675466193L; ++ ++ protected ChangeEvent changeEvent = new ChangeEvent(this); ++ protected EventListenerList listenerList = new EventListenerList(); ++ ++ private JTextComponent textComponent; ++ ++ private boolean selectionVisible = true; ++ private int blinkRate = 0; ++ private int dot = 0; ++ private int mark = 0; ++ private Point magicCaretPosition = null; ++ private boolean visible = true; ++ private Object highlightEntry; ++ ++ public void mouseDragged(MouseEvent event) ++ { ++ } ++ ++ public void mouseMoved(MouseEvent event) ++ { ++ } ++ ++ public void mouseClicked(MouseEvent event) ++ { ++ } ++ ++ public void mouseEntered(MouseEvent event) ++ { ++ } ++ ++ public void mouseExited(MouseEvent event) ++ { ++ } ++ ++ public void mousePressed(MouseEvent event) ++ { ++ } ++ ++ public void mouseReleased(MouseEvent event) ++ { ++ } ++ ++ public void focusGained(FocusEvent event) ++ { ++ } ++ ++ public void focusLost(FocusEvent event) ++ { ++ } ++ ++ protected void moveCaret(MouseEvent event) ++ { ++ } ++ ++ protected void positionCaret(MouseEvent event) ++ { ++ } ++ ++ public void deinstall(JTextComponent c) ++ { ++ textComponent.removeFocusListener(this); ++ textComponent.removeMouseListener(this); ++ textComponent.removeMouseMotionListener(this); ++ textComponent = null; ++ } ++ ++ public void install(JTextComponent c) ++ { ++ textComponent = c; ++ textComponent.addFocusListener(this); ++ textComponent.addMouseListener(this); ++ textComponent.addMouseMotionListener(this); ++ repaint(); ++ } ++ ++ public void setMagicCaretPosition(Point p) ++ { ++ magicCaretPosition = p; ++ } ++ ++ public Point getMagicCaretPosition() ++ { ++ return magicCaretPosition; ++ } ++ ++ public int getMark() ++ { ++ return mark; ++ } ++ ++ private void handleHighlight() ++ { ++ Highlighter highlighter = textComponent.getHighlighter(); ++ ++ if (highlighter == null) ++ return; ++ ++ int p0 = Math.min(dot, mark); ++ int p1 = Math.max(dot, mark); ++ ++ if (selectionVisible && p0 != p1) ++ { ++ try ++ { ++ if (highlightEntry == null) ++ highlightEntry = highlighter.addHighlight(p0, p1, getSelectionPainter()); ++ else ++ highlighter.changeHighlight(highlightEntry, p0, p1); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen. ++ throw new InternalError(); ++ } ++ } ++ else ++ { ++ if (highlightEntry != null) ++ { ++ highlighter.removeHighlight(highlightEntry); ++ highlightEntry = null; ++ } ++ } ++ } ++ ++ public void setSelectionVisible(boolean v) ++ { ++ if (selectionVisible == v) ++ return; ++ ++ selectionVisible = v; ++ handleHighlight(); ++ repaint(); ++ } ++ ++ public boolean isSelectionVisible() ++ { ++ return selectionVisible; ++ } ++ ++ protected final void repaint() ++ { ++ if (textComponent != null) ++ textComponent.repaint(); ++ } ++ ++ public void paint(Graphics g) ++ { ++ if (textComponent == null) ++ return; ++ ++ int dot = getDot(); ++ Rectangle rect = null; ++ ++ try ++ { ++ rect = textComponent.modelToView(dot); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen as dot should be always valid. ++ return; ++ } ++ ++ if (rect == null) ++ return; ++ ++ // First we need to delete the old caret. ++ // FIXME: Implement deleting of old caret. + +- public void mouseDragged(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mouseMoved(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mouseClicked(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mouseEntered(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mouseExited(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mousePressed(java.awt.event.MouseEvent evt) +- { +- } +- +- public void mouseReleased(java.awt.event.MouseEvent evt) +- { +- } +- +- public void focusGained(java.awt.event.FocusEvent evt) +- { +- } +- +- public void focusLost(java.awt.event.FocusEvent evt) +- { +- } +- +- // caret methods: +- +- public void deinstall(JTextComponent c) +- { +- parent.removeFocusListener(this); +- parent.removeMouseListener(this); +- +- parent = null; +- } +- public void install(JTextComponent c) +- { +- parent.addFocusListener(this); +- parent.addMouseListener(this); +- parent = c; +- repaint(); +- } +- +- Point magic = null; +- public void setMagicCaretPosition(Point p) +- { magic = p; } +- public Point getMagicCaretPosition() +- { return magic; } +- +- +- int mark = 0; +- public int getMark() +- { return mark; } +- +- boolean vis_sel = true; +- public void setSelectionVisible(boolean v) +- { vis_sel = v; repaint(); } +- public boolean isSelectionVisible() +- { return vis_sel; } +- +- private void repaint() +- { +- if (parent != null) +- { +- parent.repaint(); +- } +- } +- +- public void paint(Graphics g) +- { +- g.setColor(color); +- g.drawLine(x,y, +- x,y+height); +- } +- +- +- Vector changes = new Vector(); +- public void addChangeListener(ChangeListener l) +- { changes.addElement(l); } +- public void removeChangeListener(ChangeListener l) +- { changes.removeElement(l); } +- +- +- int blink = 500; +- public int getBlinkRate() +- { return blink; } +- public void setBlinkRate(int rate) +- { blink = rate; } +- +- int dot = 0; +- public int getDot() +- { return dot; } +- public void moveDot(int dot) +- { setDot(dot); } +- public void setDot(int dot) +- { +- this.dot = dot; +- repaint(); +- } +- +- boolean vis = true; +- public boolean isVisible() +- { return vis; } +- public void setVisible(boolean v) +- { +- vis = v; +- repaint(); +- } ++ // Now draw the caret on the new position if visible. ++ if (visible) ++ { ++ g.setColor(textComponent.getCaretColor()); ++ g.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height); ++ } ++ } ++ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) getListeners(ChangeListener.class); ++ } ++ ++ protected void fireStateChanged() ++ { ++ ChangeListener[] listeners = getChangeListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].stateChanged(changeEvent); ++ } ++ ++ protected final JTextComponent getComponent() ++ { ++ return textComponent; ++ } ++ ++ public int getBlinkRate() ++ { ++ return blinkRate; ++ } ++ ++ public void setBlinkRate(int rate) ++ { ++ blinkRate = rate; ++ } ++ ++ public int getDot() ++ { ++ return dot; ++ } ++ ++ public void moveDot(int dot) ++ { ++ this.dot = dot; ++ handleHighlight(); ++ repaint(); ++ } ++ ++ public void setDot(int dot) ++ { ++ this.dot = dot; ++ this.mark = dot; ++ handleHighlight(); ++ repaint(); ++ } ++ ++ public boolean isVisible() ++ { ++ return visible; ++ } ++ ++ public void setVisible(boolean v) ++ { ++ visible = v; ++ repaint(); ++ } ++ ++ protected Highlighter.HighlightPainter getSelectionPainter() ++ { ++ return DefaultHighlighter.DefaultPainter; ++ } + } +Index: javax/swing/text/DefaultEditorKit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/DefaultEditorKit.java,v +retrieving revision 1.4 +diff -u -r1.4 DefaultEditorKit.java +--- javax/swing/text/DefaultEditorKit.java 10 Jan 2004 21:07:44 -0000 1.4 ++++ javax/swing/text/DefaultEditorKit.java 6 Sep 2004 16:36:10 -0000 +@@ -37,15 +37,134 @@ + + package javax.swing.text; + ++import java.awt.Toolkit; ++import java.awt.event.ActionEvent; + import java.io.InputStream; ++import java.io.IOException; + import java.io.OutputStream; + import java.io.Reader; + import java.io.Writer; + import javax.swing.Action; + import javax.swing.JEditorPane; + ++ + public class DefaultEditorKit extends EditorKit + { ++ public static class BeepAction ++ extends TextAction ++ { ++ public BeepAction() ++ { ++ super(beepAction); ++ } ++ ++ public void actionPerformed(ActionEvent event) ++ { ++ Toolkit.getDefaultToolkit().beep(); ++ } ++ } ++ ++ public static class CopyAction ++ extends TextAction ++ { ++ public CopyAction() ++ { ++ super(copyAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ public static class CutAction ++ extends TextAction ++ { ++ public CutAction() ++ { ++ super(cutAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ public static class DefaultKeyTypedAction ++ extends TextAction ++ { ++ public DefaultKeyTypedAction() ++ { ++ super(defaultKeyTypedAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ try ++ { ++ t.getDocument().insertString(t.getCaret().getDot(), event.getActionCommand(), null); ++ t.getCaret().setDot(Math.min(t.getCaret().getDot() + 1, ++ t.getDocument().getEndPosition().getOffset())); ++ t.repaint(); ++ } ++ catch (BadLocationException be) ++ { ++ // FIXME: we're not authorized to throw this.. swallow it? ++ } ++ } ++ } ++ } ++ ++ public static class InsertBreakAction ++ extends TextAction ++ { ++ public InsertBreakAction() ++ { ++ super(insertBreakAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ public static class InsertContentAction ++ extends TextAction ++ { ++ public InsertContentAction() ++ { ++ super(insertContentAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ public static class InsertTabAction ++ extends TextAction ++ { ++ public InsertTabAction() ++ { ++ super(insertTabAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ public static class PasteAction ++ extends TextAction ++ { ++ public PasteAction() ++ { ++ super(pasteAction); ++ } ++ public void actionPerformed(ActionEvent event) ++ { ++ } ++ } ++ ++ private static final long serialVersionUID = 9017245433028523428L; ++ + public static final String backwardAction = "caret-backward"; + public static final String beepAction = "beep"; + public static final String beginAction = "caret-begin"; +@@ -60,7 +179,7 @@ + public static final String downAction = "caret-down"; + public static final String endAction = "caret-end"; + public static final String endLineAction = "caret-end-line"; +- public static final String endOfLineStringProperty = "__EndOfLine__"; ++ public static final String EndOfLineStringProperty = "__EndOfLine__"; + public static final String endParagraphAction = "caret-end-paragraph"; + public static final String endWordAction = "caret-end-word"; + public static final String forwardAction = "caret-forward"; +@@ -77,16 +196,19 @@ + public static final String selectionBackwardAction = "selection-backward"; + public static final String selectionBeginAction = "selection-begin"; + public static final String selectionBeginLineAction = "selection-begin-line"; +- public static final String selectionBeginParagraphAction = "selection-begin-paragraph"; ++ public static final String selectionBeginParagraphAction = ++ "selection-begin-paragraph"; + public static final String selectionBeginWordAction = "selection-begin-word"; + public static final String selectionDownAction = "selection-down"; + public static final String selectionEndAction = "selection-end"; + public static final String selectionEndLineAction = "selection-end-line"; +- public static final String selectionEndParagraphAction = "selection-end-paragraph"; ++ public static final String selectionEndParagraphAction = ++ "selection-end-paragraph"; + public static final String selectionEndWordAction = "selection-end-word"; + public static final String selectionForwardAction = "selection-forward"; + public static final String selectionNextWordAction = "selection-next-word"; +- public static final String selectionPreviousWordAction = "selection-previous-word"; ++ public static final String selectionPreviousWordAction = ++ "selection-previous-word"; + public static final String selectionUpAction = "selection-up"; + public static final String selectLineAction = "select-line"; + public static final String selectParagraphAction = "select-paragraph"; +@@ -94,48 +216,170 @@ + public static final String upAction = "caret-up"; + public static final String writableAction = "set-writable"; + +- void deinstall(JEditorPane c) +- { +- // Called when the kit is being removed from the JEditorPane. +- } +- void install(JEditorPane c) +- { +- } ++ public DefaultEditorKit() ++ { ++ } + +- Caret createCaret() +- { +- return null; +- } +- Document createDefaultDocument() ++ private static Action[] defaultActions = ++ new Action[] { ++ new BeepAction(), ++ new CopyAction(), ++ new CutAction(), ++ new DefaultKeyTypedAction(), ++ new InsertBreakAction(), ++ new InsertContentAction(), ++ new InsertTabAction(), ++ new PasteAction(), ++ new TextAction(deleteNextCharAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ try ++ { ++ int pos = t.getCaret().getDot(); ++ if (pos < t.getDocument().getEndPosition().getOffset()) ++ { ++ t.getDocument().remove(t.getCaret().getDot(), 1); ++ t.repaint(); ++ } ++ } ++ catch (BadLocationException e) ++ { ++ // FIXME: we're not authorized to throw this.. swallow it? ++ } ++ } ++ } ++ }, ++ new TextAction(deletePrevCharAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ try ++ { ++ int pos = t.getCaret().getDot(); ++ if (pos > t.getDocument().getStartPosition().getOffset()) ++ { ++ t.getDocument().remove(pos - 1, 1); ++ t.getCaret().setDot(pos - 1); ++ t.repaint(); ++ } ++ } ++ catch (BadLocationException e) ++ { ++ // FIXME: we're not authorized to throw this.. swallow it? ++ } ++ } ++ } ++ }, ++ new TextAction(backwardAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ t.getCaret().setDot(Math.max(t.getCaret().getDot() - 1, ++ t.getDocument().getStartPosition().getOffset())); ++ } ++ } ++ }, ++ new TextAction(forwardAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ t.getCaret().setDot(Math.min(t.getCaret().getDot() + 1, ++ t.getDocument().getEndPosition().getOffset())); ++ } ++ } ++ }, ++ new TextAction(selectionBackwardAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ t.getCaret().moveDot(Math.max(t.getCaret().getDot() - 1, ++ t.getDocument().getStartPosition().getOffset())); ++ } ++ } ++ }, ++ new TextAction(selectionForwardAction) ++ { ++ public void actionPerformed(ActionEvent event) ++ { ++ JTextComponent t = getTextComponent(event); ++ if (t != null) ++ { ++ t.getCaret().moveDot(Math.min(t.getCaret().getDot() + 1, ++ t.getDocument().getEndPosition().getOffset())); ++ } ++ } ++ }, ++ }; ++ ++ /** ++ * Called when the kit is being removed from the JEditorPane. ++ */ ++ public void deinstall(JEditorPane c) + { +- return new PlainDocument(); + } + +- Action[] getActions() ++ public void install(JEditorPane c) + { +- return null; + } + +- String getContentType() ++ public Caret createCaret() ++ { ++ return new DefaultCaret(); ++ } ++ ++ public Document createDefaultDocument() ++ { ++ return new PlainDocument(); ++ } ++ ++ public Action[] getActions() ++ { ++ return defaultActions; ++ } ++ ++ public String getContentType() + { + return "text/plain"; + } + +- ViewFactory getViewFactory() ++ public ViewFactory getViewFactory() + { + return null; + } +- void read(InputStream in, Document doc, int pos) ++ ++ public void read(InputStream in, Document doc, int pos) ++ throws BadLocationException, IOException + { + } +- void read(Reader in, Document doc, int pos) ++ ++ public void read(Reader in, Document doc, int pos) ++ throws BadLocationException, IOException + { + } +- void write(OutputStream out, Document doc, int pos, int len) ++ ++ public void write(OutputStream out, Document doc, int pos, int len) ++ throws BadLocationException, IOException + { + } +- void write(Writer out, Document doc, int pos, int len) ++ ++ public void write(Writer out, Document doc, int pos, int len) ++ throws BadLocationException, IOException + { + } + } +- +Index: javax/swing/text/DefaultHighlighter.java +=================================================================== +RCS file: javax/swing/text/DefaultHighlighter.java +diff -N javax/swing/text/DefaultHighlighter.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/DefaultHighlighter.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,250 @@ ++/* DefaultHighlighter.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.text; ++ ++import java.awt.Color; ++import java.awt.Graphics; ++import java.awt.Rectangle; ++import java.awt.Shape; ++import java.util.Vector; ++ ++import javax.swing.text.JTextComponent; ++import javax.swing.text.View; ++ ++ ++public class DefaultHighlighter extends LayeredHighlighter ++{ ++ public static class DefaultHighlightPainter ++ extends LayerPainter ++ { ++ private Color color; ++ ++ public DefaultHighlightPainter(Color c) ++ { ++ super(); ++ color = c; ++ } ++ ++ public Color getColor() ++ { ++ return color; ++ } ++ ++ private void paintHighlight(Graphics g, Rectangle rect) ++ { ++ g.fillRect(rect.x, rect.y, rect.width, rect.height); ++ } ++ ++ public void paint(Graphics g, int p0, int p1, Shape bounds, ++ JTextComponent c) ++ { ++ Rectangle r0 = null; ++ Rectangle r1 = null; ++ Rectangle rect = bounds.getBounds(); ++ ++ try ++ { ++ r0 = c.modelToView(p0); ++ r1 = c.modelToView(p1); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never occur. ++ return; ++ } ++ ++ if (r0 == null || r1 == null) ++ return; ++ ++ if (color == null) ++ g.setColor(c.getSelectionColor()); ++ else ++ g.setColor(color); ++ ++ // Check if only one line to highlight. ++ if (r0.y == r1.y) ++ { ++ r0.width = r1.x - r0.x; ++ paintHighlight(g, r0); ++ return; ++ } ++ ++ // First line, from p0 to end-of-line. ++ r0.width = rect.x + rect.width - r0.x; ++ paintHighlight(g, r0); ++ ++ // FIXME: All the full lines in between, if any (assumes that all lines ++ // have the same height -- not a good assumption with JEditorPane/JTextPane). ++ r0.y += r0.height; ++ r0.x = rect.x; ++ ++ while (r0.y < r1.y) ++ { ++ paintHighlight(g, r0); ++ r0.y += r0.height; ++ } ++ ++ // Last line, from beginnin-of-line to p1. ++ paintHighlight(g, r1); ++ } ++ ++ public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds, ++ JTextComponent c, View view) ++ { ++ throw new InternalError(); ++ } ++ } ++ ++ private class HighlightEntry ++ { ++ int p0; ++ int p1; ++ Highlighter.HighlightPainter painter; ++ ++ public HighlightEntry(int p0, int p1, Highlighter.HighlightPainter painter) ++ { ++ this.p0 = p0; ++ this.p1 = p1; ++ this.painter = painter; ++ } ++ ++ public int getStartPosition() ++ { ++ return p0; ++ } ++ ++ public int getEndPosition() ++ { ++ return p1; ++ } ++ ++ public Highlighter.HighlightPainter getPainter() ++ { ++ return painter; ++ } ++ } ++ ++ /** ++ * @specnote final as of 1.4 ++ */ ++ public static final LayeredHighlighter.LayerPainter DefaultPainter = ++ new DefaultHighlightPainter(null); ++ ++ private JTextComponent textComponent; ++ private Vector highlights = new Vector(); ++ ++ public DefaultHighlighter() ++ { ++ } ++ ++ private void checkPositions(int p0, int p1) ++ throws BadLocationException ++ { ++ if (p0 < 0) ++ throw new BadLocationException("DefaultHighlighter", p0); ++ ++ if (p1 < p0) ++ throw new BadLocationException("DefaultHighlighter", p1); ++ } ++ ++ public void install(JTextComponent c) ++ { ++ textComponent = c; ++ removeAllHighlights(); ++ } ++ ++ public void deinstall(JTextComponent c) ++ { ++ textComponent = null; ++ } ++ ++ public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter painter) ++ throws BadLocationException ++ { ++ checkPositions(p0, p1); ++ HighlightEntry entry = new HighlightEntry(p0, p1, painter); ++ highlights.add(entry); ++ return entry; ++ } ++ ++ public void removeHighlight(Object tag) ++ { ++ highlights.remove(tag); ++ } ++ ++ public void removeAllHighlights() ++ { ++ highlights.clear(); ++ } ++ ++ public Highlighter.Highlight[] getHighlights() ++ { ++ return null; ++ } ++ ++ public void changeHighlight(Object tag, int p0, int p1) ++ throws BadLocationException ++ { ++ checkPositions(p0, p1); ++ HighlightEntry entry = (HighlightEntry) tag; ++ entry.p0 = p0; ++ entry.p1 = p1; ++ } ++ ++ public void paintLayeredHighlights(Graphics g, int p0, int p1, ++ Shape viewBounds, JTextComponent editor, ++ View view) ++ { ++ } ++ ++ public void paint(Graphics g) ++ { ++ // Check if there are any highlights. ++ if (highlights.size() == 0) ++ return; ++ ++ Shape bounds = textComponent.getBounds(); ++ ++ for (int index = 0; index < highlights.size(); ++index) ++ { ++ HighlightEntry entry = (HighlightEntry) highlights.get(index); ++ entry.painter.paint(g, entry.p0, entry.p1, bounds, textComponent); ++ } ++ } ++} +Index: javax/swing/text/Document.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/Document.java,v +retrieving revision 1.4 +diff -u -r1.4 Document.java +--- javax/swing/text/Document.java 10 Jan 2004 21:07:44 -0000 1.4 ++++ javax/swing/text/Document.java 6 Sep 2004 16:36:10 -0000 +@@ -1,4 +1,4 @@ +-/* Document.java -- ++/* Document.java -- + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -40,27 +40,48 @@ + import javax.swing.event.DocumentListener; + import javax.swing.event.UndoableEditListener; + ++ + public interface Document +-{ ++{ + String StreamDescriptionProperty = "stream"; +- + String TitleProperty = "text"; + + void addDocumentListener(DocumentListener listener); ++ + void addUndoableEditListener(UndoableEditListener listener); +- Position createPosition(int offs); ++ ++ Position createPosition(int offs) ++ throws BadLocationException; ++ + Element getDefaultRootElement(); ++ + Position getEndPosition(); ++ + int getLength(); ++ + Object getProperty(Object key); ++ + Element[] getRootElements(); ++ + Position getStartPosition(); +- String getText(int offset, int length); +- void getText(int offset, int length, Segment txt); +- void insertString(int offset, String str, AttributeSet a); ++ ++ String getText(int offset, int length) ++ throws BadLocationException; ++ ++ void getText(int offset, int length, Segment txt) ++ throws BadLocationException; ++ ++ void insertString(int offset, String str, AttributeSet a) ++ throws BadLocationException; ++ + void putProperty(Object key, Object value); +- void remove(int offs, int len); ++ ++ void remove(int offs, int len) ++ throws BadLocationException; ++ + void removeDocumentListener(DocumentListener listener); ++ + void removeUndoableEditListener(UndoableEditListener listener); ++ + void render(Runnable r); + } +Index: javax/swing/text/EditorKit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/EditorKit.java,v +retrieving revision 1.2 +diff -u -r1.2 EditorKit.java +--- javax/swing/text/EditorKit.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/EditorKit.java 6 Sep 2004 16:36:10 -0000 +@@ -38,38 +38,58 @@ + package javax.swing.text; + + import java.io.InputStream; ++import java.io.IOException; + import java.io.OutputStream; + import java.io.Reader; ++import java.io.Serializable; + import java.io.Writer; + import javax.swing.Action; + import javax.swing.JEditorPane; + +-public abstract class EditorKit implements Cloneable ++ ++public abstract class EditorKit ++ implements Cloneable, Serializable + { +- EditorKit() ++ private static final long serialVersionUID = -5044124649345887822L; ++ ++ public EditorKit() + { + } + +- EditorKit(EditorKit kit) ++ public Object clone() + { ++ try ++ { ++ return super.clone(); + } +- +- void deinstall(JEditorPane c) ++ catch (CloneNotSupportedException e) + { +- // Called when the kit is being removed from the JEditorPane. ++ return null; + } +- void install(JEditorPane c) ++ } ++ ++ /** ++ * Called when the kit is being removed from the JEditorPane. ++ */ ++ public void deinstall(JEditorPane c) + { + } + +- abstract Caret createCaret(); +- abstract Document createDefaultDocument(); +- abstract Action[] getActions(); +- abstract String getContentType(); +- abstract ViewFactory getViewFactory(); +- abstract void read(InputStream in, Document doc, int pos); +- abstract void read(Reader in, Document doc, int pos); +- abstract void write(OutputStream out, Document doc, int pos, int len); +- abstract void write(Writer out, Document doc, int pos, int len); ++ public void install(JEditorPane c) ++ { + } + ++ public abstract Caret createCaret(); ++ public abstract Document createDefaultDocument(); ++ public abstract Action[] getActions(); ++ public abstract String getContentType(); ++ public abstract ViewFactory getViewFactory(); ++ public abstract void read(InputStream in, Document doc, int pos) ++ throws BadLocationException, IOException; ++ public abstract void read(Reader in, Document doc, int pos) ++ throws BadLocationException, IOException; ++ public abstract void write(OutputStream out, Document doc, int pos, int len) ++ throws BadLocationException, IOException; ++ public abstract void write(Writer out, Document doc, int pos, int len) ++ throws BadLocationException, IOException; ++} +Index: javax/swing/text/FieldView.java +=================================================================== +RCS file: javax/swing/text/FieldView.java +diff -N javax/swing/text/FieldView.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/FieldView.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,103 @@ ++/* FieldView.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.text; ++ ++import java.awt.Component; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Shape; ++ ++ ++public class FieldView extends PlainView ++{ ++ public FieldView(Element elem) ++ { ++ super(elem); ++ } ++ ++ protected FontMetrics getFontMetrics() ++ { ++ Component container = getContainer(); ++ return container.getFontMetrics(container.getFont()); ++ } ++ ++ public float getPreferredSpan(int axis) ++ { ++ if (axis != X_AXIS && axis != Y_AXIS) ++ throw new IllegalArgumentException(); ++ ++ FontMetrics fm = getFontMetrics(); ++ ++ if (axis == Y_AXIS) ++ return fm.getHeight(); ++ ++ String text; ++ Element elem = getElement(); ++ ++ try ++ { ++ text = elem.getDocument().getText(elem.getStartOffset(), ++ elem.getEndOffset()); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen. ++ text = ""; ++ System.out.println("Michael: FieldView.getPreferredSpan: Error"); ++ } ++ ++ return fm.stringWidth(text); ++ } ++ ++ public int getResizeWeight(int axis) ++ { ++ return axis = axis == X_AXIS ? 1 : 0; ++ } ++ ++ public Shape modelToView(int pos, Shape a, Position.Bias bias) ++ throws BadLocationException ++ { ++ return super.modelToView(pos, a, bias); ++ } ++ ++ public void paint(Graphics g, Shape s) ++ { ++ super.paint(g, s); ++ } ++} +Index: javax/swing/text/GapContent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/GapContent.java,v +retrieving revision 1.2 +diff -u -r1.2 GapContent.java +--- javax/swing/text/GapContent.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/GapContent.java 6 Sep 2004 16:36:10 -0000 +@@ -1,4 +1,4 @@ +-/* GapContent.java -- ++/* GapContent.java -- + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -35,69 +35,75 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +-package javax.swing.text; ++package javax.swing.text; ++ ++import java.io.Serializable; + + // too lazy to make a real gapcontent. + // lets just use a stringbuffer instead. +- + import javax.swing.undo.UndoableEdit; + +-public class GapContent implements AbstractDocument.Content ++public class GapContent ++ implements AbstractDocument.Content, Serializable + { +- StringBuffer buf = new StringBuffer(); +- +- public GapContent() +- { +- this(10); +- } ++ private static final long serialVersionUID = 8374645204155842629L; + +- public GapContent(int size) +- { +- } +- +- public Position createPosition(final int offset) throws BadLocationException +- { +- return new Position() +- { +- int off = offset; +- public int getOffset() +- { +- return off; +- } +- }; +- } +- +- public int length() +- { +- return buf.length(); +- } +- +- public UndoableEdit insertString(int where, String str) throws BadLocationException +- { +- buf.insert(where, str); +- return null; +- } +- +- public UndoableEdit remove(int where, int nitems) throws BadLocationException +- { +- buf.delete(where, where + nitems); +- return null; +- } +- +- public String getString(int where, int len) throws BadLocationException +- { +- return buf.toString(); +- } +- +- public void getChars(int where, int len, Segment txt) throws BadLocationException +- { +- txt.array = new char[len]; +- +- System.arraycopy(buf.toString().toCharArray(), where, +- txt.array, 0, +- len); +- +- txt.count = len; +- txt.offset = 0; +- } ++ StringBuffer buf = new StringBuffer(); ++ ++ public GapContent() ++ { ++ this(10); ++ } ++ ++ public GapContent(int size) ++ { ++ } ++ ++ public Position createPosition(final int offset) throws BadLocationException ++ { ++ return new Position() ++ { ++ int off = offset; ++ ++ public int getOffset() ++ { ++ return off; ++ } ++ }; ++ } ++ ++ public int length() ++ { ++ return buf.length(); ++ } ++ ++ public UndoableEdit insertString(int where, String str) ++ throws BadLocationException ++ { ++ buf.insert(where, str); ++ return null; ++ } ++ ++ public UndoableEdit remove(int where, int nitems) ++ throws BadLocationException ++ { ++ buf.delete(where, where + nitems); ++ return null; ++ } ++ ++ public String getString(int where, int len) throws BadLocationException ++ { ++ return buf.toString(); ++ } ++ ++ public void getChars(int where, int len, Segment txt) ++ throws BadLocationException ++ { ++ txt.array = new char[len]; ++ ++ System.arraycopy(buf.toString().toCharArray(), where, txt.array, 0, len); ++ ++ txt.count = len; ++ txt.offset = 0; ++ } + } +Index: javax/swing/text/Highlighter.java +=================================================================== +RCS file: javax/swing/text/Highlighter.java +diff -N javax/swing/text/Highlighter.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/Highlighter.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,80 @@ ++/* Highlighter.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.text; ++ ++import java.awt.Graphics; ++import java.awt.Shape; ++ ++ ++public interface Highlighter ++{ ++ public interface Highlight ++ { ++ int getEndOffset(); ++ ++ int getStartOffset(); ++ ++ HighlightPainter getPainter(); ++ } ++ ++ public interface HighlightPainter ++ { ++ public void paint(Graphics g, int p0, int p1, Shape bounds, ++ JTextComponent c); ++ } ++ ++ void install(JTextComponent c); ++ ++ void deinstall(JTextComponent c); ++ ++ Object addHighlight(int p0, int p1, HighlightPainter p) ++ throws BadLocationException; ++ ++ void removeAllHighlights(); ++ ++ void removeHighlight(Object tag); ++ ++ void changeHighlight(Object tag, int p0, int p1) ++ throws BadLocationException; ++ ++ Highlight[] getHighlights(); ++ ++ void paint(Graphics g); ++} ++ +Index: javax/swing/text/JTextComponent.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/JTextComponent.java,v +retrieving revision 1.3 +diff -u -r1.3 JTextComponent.java +--- javax/swing/text/JTextComponent.java 24 Jun 2003 09:51:28 -0000 1.3 ++++ javax/swing/text/JTextComponent.java 6 Sep 2004 16:36:10 -0000 +@@ -1,5 +1,5 @@ +-/* JTextComponent.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* JTextComponent.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,19 +38,30 @@ + package javax.swing.text; + + import java.awt.AWTEvent; ++import java.awt.Color; + import java.awt.Component; + import java.awt.Dimension; + import java.awt.Image; + import java.awt.Insets; +-import java.awt.Rectangle; + import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.event.InputMethodListener; ++import java.awt.event.KeyEvent; ++ ++import java.util.Enumeration; ++import java.util.Hashtable; ++ + import javax.accessibility.Accessible; + import javax.accessibility.AccessibleContext; + import javax.accessibility.AccessibleRole; + import javax.accessibility.AccessibleStateSet; + import javax.accessibility.AccessibleText; ++import javax.swing.Action; ++import javax.swing.ActionMap; + import javax.swing.Icon; ++import javax.swing.InputMap; + import javax.swing.JComponent; ++import javax.swing.JViewport; + import javax.swing.KeyStroke; + import javax.swing.Scrollable; + import javax.swing.UIManager; +@@ -58,454 +69,1268 @@ + import javax.swing.event.CaretListener; + import javax.swing.event.DocumentEvent; + import javax.swing.event.DocumentListener; ++import javax.swing.plaf.ActionMapUIResource; ++import javax.swing.plaf.InputMapUIResource; + import javax.swing.plaf.TextUI; + ++ + public abstract class JTextComponent extends JComponent + implements Scrollable, Accessible + { +-// public class AccessibleJTextComponent extends AccessibleJComponent +-// implements AccessibleText, CaretListener, DocumentListener, +-// AccessibleAction, AccessibleEditableText +-// { +-// } // class AccessibleJTextComponent +- +- /** +- * AccessibleJTextComponent +- */ +- public class AccessibleJTextComponent extends AccessibleJComponent +- implements AccessibleText, CaretListener, DocumentListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * caretPos +- */ +- int caretPos; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor AccessibleJTextComponent +- * @param component TODO +- */ +- public AccessibleJTextComponent(JTextComponent component) { +- super(component); +- // TODO +- } // AccessibleJTextComponent() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * getCaretPosition +- * @returns int +- */ +- public int getCaretPosition() { +- return 0; // TODO +- } // getCaretPosition() +- +- /** +- * getSelectedText +- * @returns String +- */ +- public String getSelectedText() { +- return null; // TODO +- } // getSelectedText() +- +- /** +- * getSelectionStart +- * @returns int +- */ +- public int getSelectionStart() { +- return 0; // TODO +- } // getSelectionStart() +- +- /** +- * getSelectionEnd +- * @returns int +- */ +- public int getSelectionEnd() { +- return 0; // TODO +- } // getSelectionEnd() +- +- /** +- * caretUpdate +- * @param value0 TODO +- */ +- public void caretUpdate(CaretEvent value0) { +- // TODO +- } // caretUpdate() +- +- /** +- * getAccessibleStateSet +- * @returns AccessibleStateSet +- */ +- public AccessibleStateSet getAccessibleStateSet() { +- return null; // TODO +- } // getAccessibleStateSet() +- +- /** +- * getAccessibleRole +- * @returns AccessibleRole +- */ +- public AccessibleRole getAccessibleRole() { +- return null; // TODO +- } // getAccessibleRole() +- +- /** +- * getAccessibleText +- * @returns AccessibleText +- */ +- public AccessibleText getAccessibleText() { +- return null; // TODO +- } // getAccessibleText() +- +- /** +- * insertUpdate +- * @param value0 TODO +- */ +- public void insertUpdate(DocumentEvent value0) { +- // TODO +- } // insertUpdate() +- +- /** +- * removeUpdate +- * @param value0 TODO +- */ +- public void removeUpdate(DocumentEvent value0) { +- // TODO +- } // removeUpdate() +- +- /** +- * changedUpdate +- * @param value0 TODO +- */ +- public void changedUpdate(DocumentEvent value0) { +- // TODO +- } // changedUpdate() +- +- /** +- * getIndexAtPoint +- * @param value0 TODO +- * @returns int +- */ +- public int getIndexAtPoint(Point value0) { +- return 0; // TODO +- } // getIndexAtPoint() +- +- /** +- * getRootEditorRect +- * @returns Rectangle +- */ +- Rectangle getRootEditorRect() { +- return null; // TODO +- } // getRootEditorRect() +- +- /** +- * getCharacterBounds +- * @param value0 TODO +- * @returns Rectangle +- */ +- public Rectangle getCharacterBounds(int value0) { +- return null; // TODO +- } // getCharacterBounds() +- +- /** +- * getCharCount +- * @returns int +- */ +- public int getCharCount() { +- return 0; // TODO +- } // getCharCount() +- +- /** +- * getCharacterAttribute +- * @param value0 TODO +- * @returns AttributeSet +- */ +- public AttributeSet getCharacterAttribute(int value0) { +- return null; // TODO +- } // getCharacterAttribute() +- +- /** +- * getAtIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getAtIndex(int value0, int value1) { +- return null; // TODO +- } // getAtIndex() +- +- /** +- * getAfterIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getAfterIndex(int value0, int value1) { +- return null; // TODO +- } // getAfterIndex() +- +- /** +- * getBeforeIndex +- * @param value0 TODO +- * @param value1 TODO +- * @returns String +- */ +- public String getBeforeIndex(int value0, int value1) { +- return null; // TODO +- } // getBeforeIndex() +- ++ /** ++ * AccessibleJTextComponent ++ */ ++ public class AccessibleJTextComponent extends AccessibleJComponent ++ implements AccessibleText, CaretListener, DocumentListener ++ { ++ private static final long serialVersionUID = 7664188944091413696L; + +- } // AccessibleJTextComponent ++ /** ++ * Constructor AccessibleJTextComponent ++ * @param component TODO ++ */ ++ public AccessibleJTextComponent() ++ { ++ } + ++ /** ++ * getCaretPosition ++ * @return int ++ */ ++ public int getCaretPosition() ++ { ++ return 0; // TODO ++ } + ++ /** ++ * getSelectedText ++ * @return String ++ */ ++ public String getSelectedText() ++ { ++ return null; // TODO ++ } + +- public static class KeyBinding +- { +- public KeyStroke key; +- public String actionName; +- public KeyBinding(KeyStroke key, String actionName) ++ /** ++ * getSelectionStart ++ * @return int ++ */ ++ public int getSelectionStart() + { +- this.key = key; +- this.actionName = actionName; ++ return 0; // TODO + } +- } // class KeyBinding + +- int icon_gap; +- Icon icon; +- int align; +- Document doc; ++ /** ++ * getSelectionEnd ++ * @return int ++ */ ++ public int getSelectionEnd() ++ { ++ return 0; // TODO ++ } + +- public JTextComponent() ++ /** ++ * caretUpdate ++ * @param value0 TODO ++ */ ++ public void caretUpdate(CaretEvent value0) + { +- this("", null, 0); ++ // TODO + } + +- public JTextComponent(Icon image) ++ /** ++ * getAccessibleStateSet ++ * @return AccessibleStateSet ++ */ ++ public AccessibleStateSet getAccessibleStateSet() + { +- this("", image, 0); ++ return null; // TODO + } + +- public JTextComponent(Icon image, int horizontalAlignment) ++ /** ++ * getAccessibleRole ++ * @return AccessibleRole ++ */ ++ public AccessibleRole getAccessibleRole() + { +- this("", image, horizontalAlignment); ++ return null; // TODO + } + +- public JTextComponent(String text) ++ /** ++ * getAccessibleText ++ * @return AccessibleText ++ */ ++ public AccessibleText getAccessibleText() + { +- this(text, null, 0); ++ return null; // TODO + } + +- public JTextComponent(String text, int horizontalAlignment) ++ /** ++ * insertUpdate ++ * @param value0 TODO ++ */ ++ public void insertUpdate(DocumentEvent value0) + { +- this(text, null, horizontalAlignment); ++ // TODO + } + +- public JTextComponent(String text, Icon icon, int horizontalAlignment) ++ /** ++ * removeUpdate ++ * @param value0 TODO ++ */ ++ public void removeUpdate(DocumentEvent value0) + { +- setDocument(new PlainDocument()); ++ // TODO ++ } + +- // do the work..... +- setText(text); +- this.icon = icon; +- this.align = horizontalAlignment; +- +- // its an editor, so: +- enableEvents(AWTEvent.KEY_EVENT_MASK); +- updateUI(); ++ /** ++ * changedUpdate ++ * @param value0 TODO ++ */ ++ public void changedUpdate(DocumentEvent value0) ++ { ++ // TODO + } + +- public void setDocument(Document s) ++ /** ++ * getIndexAtPoint ++ * @param value0 TODO ++ * @return int ++ */ ++ public int getIndexAtPoint(Point value0) + { +- doc = s; +- revalidate(); +- repaint(); ++ return 0; // TODO + } + +- public Document getDocument() ++ /** ++ * getRootEditorRect ++ * @return Rectangle ++ */ ++ Rectangle getRootEditorRect() + { +- if (doc == null) +- System.out.println("doc == null !!!"); +- return doc; ++ return null; + } + +- protected int checkHorizontalKey(int key, String message) ++ /** ++ * getCharacterBounds ++ * @param value0 TODO ++ * @return Rectangle ++ */ ++ public Rectangle getCharacterBounds(int value0) + { +- // Verify that key is a legal value for the horizontalAlignment properties. +- return 0; ++ return null; // TODO + } +- protected int checkVerticalKey(int key, String message) ++ ++ /** ++ * getCharCount ++ * @return int ++ */ ++ public int getCharCount() + { +- // Verify that key is a legal value for the verticalAlignment or verticalTextPosition properties. +- return 0; ++ return 0; // TODO + } +- public AccessibleContext getAccessibleContext() ++ ++ /** ++ * getCharacterAttribute ++ * @param value0 TODO ++ * @return AttributeSet ++ */ ++ public AttributeSet getCharacterAttribute(int value0) + { +- // Get the AccessibleContext of this object +- return null; ++ return null; // TODO + } +- public Icon getDisabledIcon() ++ ++ /** ++ * getAtIndex ++ * @param value0 TODO ++ * @param value1 TODO ++ * @return String ++ */ ++ public String getAtIndex(int value0, int value1) + { +- return null; ++ return null; // TODO + } +- public int getDisplayedMnemonic() ++ ++ /** ++ * getAfterIndex ++ * @param value0 TODO ++ * @param value1 TODO ++ * @return String ++ */ ++ public String getAfterIndex(int value0, int value1) + { +- // Return the keycode that indicates a mnemonic key. +- return 0; ++ return null; // TODO + } +- public int getHorizontalAlignment() ++ ++ /** ++ * getBeforeIndex ++ * @param value0 TODO ++ * @param value1 TODO ++ * @return String ++ */ ++ public String getBeforeIndex(int value0, int value1) + { +- // Returns the alignment of the label's contents along the X axis. +- return 0; ++ return null; // TODO + } +- public int getHorizontalTextPosition() ++ } ++ ++ public static class KeyBinding ++ { ++ public KeyStroke key; ++ public String actionName; ++ ++ /** ++ * Creates a new KeyBinding instance. ++ * ++ * @param key a KeyStroke value ++ * @param actionName a String value ++ */ ++ public KeyBinding(KeyStroke key, String actionName) + { +- // Returns the horizontal position of the label's text, relative to its image. +- return 0; ++ this.key = key; ++ this.actionName = actionName; + } ++ } + +- public Icon getIcon() +- { return icon; } +- public int getIconTextGap() +- { return icon_gap; } ++ /** ++ * According to this ++ * report, a pair of private classes wraps a {@link ++ * javax.swing.text.Keymap} in the new {@link InputMap} / {@link ++ * ActionMap} interfaces, such that old Keymap-using code can make use of ++ * the new framework.

    ++ * ++ *

    A little bit of experimentation with these classes reveals the following ++ * structure: ++ * ++ *

      ++ * ++ *
    • KeymapWrapper extends {@link InputMap} and holds a reference to ++ * the underlying {@link Keymap}.
    • ++ * ++ *
    • KeymapWrapper maps {@link KeyStroke} objects to {@link Action} ++ * objects, by delegation to the underlying {@link Keymap}.
    • ++ * ++ *
    • KeymapActionMap extends {@link ActionMap} also holds a reference to ++ * the underlying {@link Keymap} but only appears to use it for listing ++ * its keys.
    • ++ * ++ *
    • KeymapActionMap maps all {@link Action} objects to ++ * themselves, whether they exist in the underlying {@link ++ * Keymap} or not, and passes other objects to the parent {@link ++ * ActionMap} for resolving. ++ * ++ *
    ++ */ + ++ private class KeymapWrapper extends InputMap ++ { ++ Keymap map; + +- Component getLabelFor() ++ public KeymapWrapper(Keymap k) + { +- // Get the component this is labelling. +- return null; ++ map = k; + } + +- public Insets getMargin() ++ public int size() + { +- // FIXME: Not implemented. +- return null; ++ return map.getBoundKeyStrokes().length + super.size(); + } + +- public void setText(String text) ++ public Object get(KeyStroke ks) + { +- getDocument().remove(0,doc.getLength()); +- getDocument().insertString(0, text, null); ++ Action mapped = null; ++ Keymap m = map; ++ while(mapped == null && m != null) ++ { ++ mapped = m.getAction(ks); ++ if (mapped == null && ks.getKeyEventType() == KeyEvent.KEY_TYPED) ++ mapped = m.getDefaultAction(); ++ if (mapped == null) ++ m = m.getResolveParent(); ++ } ++ ++ if (mapped == null) ++ return super.get(ks); ++ else ++ return mapped; + } +- +- public String getText() ++ ++ public KeyStroke[] keys() + { +- return getDocument().getText(0, +- getDocument().getLength()); ++ KeyStroke[] superKeys = super.keys(); ++ KeyStroke[] mapKeys = map.getBoundKeyStrokes(); ++ KeyStroke[] bothKeys = new KeyStroke[superKeys.length + mapKeys.length]; ++ for (int i = 0; i < superKeys.length; ++i) ++ bothKeys[i] = superKeys[i]; ++ for (int i = 0; i < mapKeys.length; ++i) ++ bothKeys[i + superKeys.length] = mapKeys[i]; ++ return bothKeys; + } + +- public String getUIClassID() ++ public KeyStroke[] allKeys() + { +- // Returns a string that specifies the name of the l&f class that renders this component. +- return "JTextComponent"; ++ KeyStroke[] superKeys = super.allKeys(); ++ KeyStroke[] mapKeys = map.getBoundKeyStrokes(); ++ KeyStroke[] bothKeys = new KeyStroke[superKeys.length + mapKeys.length]; ++ for (int i = 0; i < superKeys.length; ++i) ++ bothKeys[i] = superKeys[i]; ++ for (int i = 0; i < mapKeys.length; ++i) ++ bothKeys[i + superKeys.length] = mapKeys[i]; ++ return bothKeys; + } +- public int getVerticalAlignment() ++ } ++ ++ private class KeymapActionMap extends ActionMap ++ { ++ Keymap map; ++ ++ public KeymapActionMap(Keymap k) + { +- // Returns the alignment of the label's contents along the Y axis. +- return 0; ++ map = k; + } +- public int getVerticalTextPosition() ++ ++ public Action get(Object cmd) + { +- // Returns the vertical position of the label's text, relative to its image. +- return 0; ++ if (cmd instanceof Action) ++ return (Action) cmd; ++ else ++ return super.get(cmd); + } + +- public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) ++ public int size() + { +- // This is overriden to return false if the current Icon's Image is not equal to the passed in Image img. +- return (img == icon); ++ return map.getBoundKeyStrokes().length + super.size(); + } +- protected String paramString() ++ ++ public Object[] keys() + { +- // Returns a string representation of this JTextComponent. +- return "JTextComponent"; ++ Object[] superKeys = super.keys(); ++ Object[] mapKeys = map.getBoundKeyStrokes(); ++ Object[] bothKeys = new Object[superKeys.length + mapKeys.length]; ++ for (int i = 0; i < superKeys.length; ++i) ++ bothKeys[i] = superKeys[i]; ++ for (int i = 0; i < mapKeys.length; ++i) ++ bothKeys[i + superKeys.length] = mapKeys[i]; ++ return bothKeys; + } +- void setDisabledIcon(Icon disabledIcon) ++ ++ public Object[] allKeys() + { +- // Set the icon to be displayed if this JTextComponent is "disabled" (JTextComponent.setEnabled(false)). ++ Object[] superKeys = super.allKeys(); ++ Object[] mapKeys = map.getBoundKeyStrokes(); ++ Object[] bothKeys = new Object[superKeys.length + mapKeys.length]; ++ for (int i = 0; i < superKeys.length; ++i) ++ bothKeys[i] = superKeys[i]; ++ for (int i = 0; i < mapKeys.length; ++i) ++ bothKeys[i + superKeys.length] = mapKeys[i]; ++ return bothKeys; + } +- void setDisplayedMnemonic(char aChar) ++ ++ } ++ ++ static class DefaultKeymap implements Keymap ++ { ++ String name; ++ Keymap parent; ++ Hashtable map; ++ Action defaultAction; ++ ++ public DefaultKeymap(String name) ++ { ++ this.name = name; ++ this.map = new Hashtable(); ++ } ++ ++ public void addActionForKeyStroke(KeyStroke key, Action a) ++ { ++ map.put(key, a); ++ } ++ ++ /** ++ * Looks up a KeyStroke either in the current map or the parent Keymap; ++ * does not return the default action if lookup fails. ++ * ++ * @param key The KeyStroke to look up an Action for. ++ * ++ * @return The mapping for key, or null ++ * if no mapping exists in this Keymap or any of its parents. ++ */ ++ public Action getAction(KeyStroke key) ++ { ++ if (map.containsKey(key)) ++ return (Action) map.get(key); ++ else if (parent != null) ++ return parent.getAction(key); ++ else ++ return null; ++ } ++ ++ public Action[] getBoundActions() + { +- // Specifies the displayedMnemonic as a char value. ++ Action [] ret = new Action[map.size()]; ++ Enumeration e = map.elements(); ++ int i = 0; ++ while (e.hasMoreElements()) ++ { ++ ret[i++] = (Action) e.nextElement(); ++ } ++ return ret; + } +- void setDisplayedMnemonic(int key) ++ ++ public KeyStroke[] getBoundKeyStrokes() + { +- // Specify a keycode that indicates a mnemonic key. ++ KeyStroke [] ret = new KeyStroke[map.size()]; ++ Enumeration e = map.keys(); ++ int i = 0; ++ while (e.hasMoreElements()) ++ { ++ ret[i++] = (KeyStroke) e.nextElement(); ++ } ++ return ret; + } +- void setHorizontalAlignment(int alignment) ++ ++ public Action getDefaultAction() + { +- // Sets the alignment of the label's contents along the X axis. ++ return defaultAction; + } +- void setHorizontalTextPosition(int textPosition) ++ ++ public KeyStroke[] getKeyStrokesForAction(Action a) + { +- // Sets the horizontal position of the label's text, relative to its image. ++ int i = 0; ++ Enumeration e = map.keys(); ++ while (e.hasMoreElements()) ++ { ++ if (map.get(e.nextElement()).equals(a)) ++ ++i; ++ } ++ KeyStroke [] ret = new KeyStroke[i]; ++ i = 0; ++ e = map.keys(); ++ while (e.hasMoreElements()) ++ { ++ KeyStroke k = (KeyStroke) e.nextElement(); ++ if (map.get(k).equals(a)) ++ ret[i++] = k; ++ } ++ return ret; + } +- void setIcon(Icon icon) ++ ++ public String getName() + { +- // Defines the icon this component will display. ++ return name; + } +- public void setIconTextGap(int iconTextGap) ++ ++ public Keymap getResolveParent() + { +- // If both the icon and text properties are set, this property defines the space between them. ++ return parent; + } +- +- public void setLabelFor(Component c) ++ ++ public boolean isLocallyDefined(KeyStroke key) + { +- // Set the component this is labelling. ++ return map.containsKey(key); + } +- +- public void setVerticalAlignment(int alignment) ++ ++ public void removeBindings() + { +- // Sets the alignment of the label's contents along the Y axis. ++ map.clear(); + } +- public void setVerticalTextPosition(int textPosition) ++ ++ public void removeKeyStrokeBinding(KeyStroke key) + { +- // Sets the vertical position of the label's text, relative to its image. ++ map.remove(key); + } + +- public TextUI getUI() +- { return (TextUI) ui; ++ public void setDefaultAction(Action a) ++ { ++ defaultAction = a; + } + +- public void updateUI() ++ public void setResolveParent(Keymap p) + { +- TextUI b = (TextUI)UIManager.getUI(this); +- setUI(b); ++ parent = p; + } + ++ } ++ ++ private static final long serialVersionUID = -8796518220218978795L; ++ ++ public static final String DEFAULT_KEYMAP = "default"; ++ public static final String FOCUS_ACCELERATOR_KEY = "focusAcceleratorKey"; ++ ++ private static Hashtable keymaps = new Hashtable(); ++ private Keymap keymap; ++ ++ /** ++ * Get a Keymap from the global keymap table, by name. ++ * ++ * @param n The name of the Keymap to look up ++ * ++ * @return A Keymap associated with the provided name, or ++ * null if no such Keymap exists ++ * ++ * @see #addKeymap() ++ * @see #removeKeymap() ++ * @see #keymaps ++ */ ++ public static Keymap getKeymap(String n) ++ { ++ return (Keymap) keymaps.get(n); ++ } ++ ++ /** ++ * Remove a Keymap from the global Keymap table, by name. ++ * ++ * @param n The name of the Keymap to remove ++ * ++ * @return The keymap removed from the global table ++ * ++ * @see #addKeymap() ++ * @see #getKeymap() ++ * @see #keymaps ++ */ ++ public static Keymap removeKeymap(String n) ++ { ++ Keymap km = (Keymap) keymaps.get(n); ++ keymaps.remove(n); ++ return km; ++ } ++ ++ /** ++ * Create a new Keymap with a specific name and parent, and add the new ++ * Keymap to the global keymap table. The name may be null, ++ * in which case the new Keymap will not be added to the global ++ * Keymap table. The parent may also be null, which is ++ * harmless. ++ * ++ * @param n The name of the new Keymap, or null ++ * @param parent The parent of the new Keymap, or null ++ * ++ * @return The newly created Keymap ++ * ++ * @see #removeKeymap() ++ * @see #getKeymap() ++ * @see #keymaps ++ */ ++ public static Keymap addKeymap(String n, Keymap parent) ++ { ++ Keymap k = new DefaultKeymap(n); ++ k.setResolveParent(parent); ++ if (n != null) ++ keymaps.put(n, k); ++ return k; ++ } ++ ++ /** ++ * Get the current Keymap of this component. ++ * ++ * @return The component's current Keymap ++ * ++ * @see #setKeymap() ++ * @see #keymap ++ */ ++ Keymap getKeymap() ++ { ++ return keymap; ++ } ++ ++ /** ++ * Set the current Keymap of this component, installing appropriate ++ * {@link KeymapWrapper} and {@link KeymapActionMap} objects in the ++ * {@link InputMap} and {@link ActionMap} parent chains, respectively, ++ * and fire a property change event with name "keymap". ++ * ++ * @see #getKeymap() ++ * @see #keymap ++ */ ++ public void setKeymap(Keymap k) ++ { ++ ++ // phase 1: replace the KeymapWrapper entry in the InputMap chain. ++ // the goal here is to always maintain the following ordering: ++ // ++ // [InputMap]? -> [KeymapWrapper]? -> [InputMapUIResource]* ++ // ++ // that is to say, component-specific InputMaps need to remain children ++ // of Keymaps, and Keymaps need to remain children of UI-installed ++ // InputMaps (and the order of each group needs to be preserved, of ++ // course). ++ ++ KeymapWrapper kw = (k == null ? null : new KeymapWrapper(k)); ++ InputMap childInputMap = getInputMap(JComponent.WHEN_FOCUSED); ++ if (childInputMap == null) ++ setInputMap(JComponent.WHEN_FOCUSED, kw); ++ else ++ { ++ while (childInputMap.getParent() != null ++ && !(childInputMap.getParent() instanceof KeymapWrapper) ++ && !(childInputMap.getParent() instanceof InputMapUIResource)) ++ childInputMap = childInputMap.getParent(); ++ ++ // option 1: there is nobody to replace at the end of the chain ++ if (childInputMap.getParent() == null) ++ childInputMap.setParent(kw); ++ ++ // option 2: there is already a KeymapWrapper in the chain which ++ // needs replacing (possibly with its own parents, possibly without) ++ else if (childInputMap.getParent() instanceof KeymapWrapper) ++ { ++ if (kw == null) ++ childInputMap.setParent(childInputMap.getParent().getParent()); ++ else ++ { ++ kw.setParent(childInputMap.getParent().getParent()); ++ childInputMap.setParent(kw); ++ } ++ } ++ ++ // option 3: there is an InputMapUIResource in the chain, which marks ++ // the place where we need to stop and insert ourselves ++ else if (childInputMap.getParent() instanceof InputMapUIResource) ++ { ++ if (kw != null) ++ { ++ kw.setParent(childInputMap.getParent()); ++ childInputMap.setParent(kw); ++ } ++ } ++ } ++ ++ // phase 2: replace the KeymapActionMap entry in the ActionMap chain ++ ++ KeymapActionMap kam = (k == null ? null : new KeymapActionMap(k)); ++ ActionMap childActionMap = getActionMap(); ++ if (childActionMap == null) ++ setActionMap(kam); ++ else ++ { ++ while (childActionMap.getParent() != null ++ && !(childActionMap.getParent() instanceof KeymapActionMap) ++ && !(childActionMap.getParent() instanceof ActionMapUIResource)) ++ childActionMap = childActionMap.getParent(); ++ ++ // option 1: there is nobody to replace at the end of the chain ++ if (childActionMap.getParent() == null) ++ childActionMap.setParent(kam); ++ ++ // option 2: there is already a KeymapActionMap in the chain which ++ // needs replacing (possibly with its own parents, possibly without) ++ else if (childActionMap.getParent() instanceof KeymapActionMap) ++ { ++ if (kam == null) ++ childActionMap.setParent(childActionMap.getParent().getParent()); ++ else ++ { ++ kam.setParent(childActionMap.getParent().getParent()); ++ childActionMap.setParent(kam); ++ } ++ } ++ ++ // option 3: there is an ActionMapUIResource in the chain, which marks ++ // the place where we need to stop and insert ourselves ++ else if (childActionMap.getParent() instanceof ActionMapUIResource) ++ { ++ if (kam != null) ++ { ++ kam.setParent(childActionMap.getParent()); ++ childActionMap.setParent(kam); ++ } ++ } ++ } ++ ++ // phase 3: update the explicit keymap field ++ ++ Keymap old = keymap; ++ keymap = k; ++ firePropertyChange("keymap", old, k); ++ } ++ ++ /** ++ * Resolves a set of bindings against a set of actions and inserts the ++ * results into a {@link Keymap}. Specifically, for each provided binding ++ * b, if there exists a provided action a such ++ * that a.getValue(Action.NAME) == b.ActionName then an ++ * entry is added to the Keymap mapping b to ++ *
    a
    . ++ * ++ * @param map The Keymap to add new mappings to ++ * @param bindings The set of bindings to add to the Keymap ++ * @param actions The set of actions to resolve binding names against ++ * ++ * @see Action#NAME ++ * @see Action#getValue() ++ * @see KeyBinding#ActionName ++ */ ++ public static void loadKeymap(Keymap map, ++ JTextComponent.KeyBinding[] bindings, ++ Action[] actions) ++ { ++ Hashtable acts = new Hashtable(actions.length); ++ for (int i = 0; i < actions.length; ++i) ++ acts.put(actions[i].getValue(Action.NAME), actions[i]); ++ for (int i = 0; i < bindings.length; ++i) ++ if (acts.containsKey(bindings[i].actionName)) ++ map.addActionForKeyStroke(bindings[i].key, (Action) acts.get(bindings[i].actionName)); ++ } ++ ++ /** ++ * Returns the set of available Actions this component's associated ++ * editor can run. Equivalent to calling ++ * getUI().getEditorKit().getActions(). This set of Actions ++ * is a reasonable value to provide as a parameter to {@link ++ * #loadKeymap()}, when resolving a set of {@link #KeyBinding} objects ++ * against this component. ++ * ++ * @return The set of available Actions on this component's {@link EditorKit} ++ * ++ * @see TextUI#getEditorKit() ++ * @see EditorKit#getActions() ++ */ ++ public Action[] getActions() ++ { ++ return getUI().getEditorKit(this).getActions(); ++ } ++ ++ private Document doc; ++ private Caret caret; ++ private Highlighter highlighter; ++ private Color caretColor; ++ private Color disabledTextColor; ++ private Color selectedTextColor; ++ private Color selectionColor; ++ private boolean editable; ++ private Insets margin; ++ ++ /** ++ * Creates a new JTextComponent instance. ++ */ ++ public JTextComponent() ++ { ++ Keymap defkeymap = getKeymap(DEFAULT_KEYMAP); ++ boolean creatingKeymap = false; ++ if (defkeymap == null) ++ { ++ defkeymap = addKeymap(DEFAULT_KEYMAP, null); ++ defkeymap.setDefaultAction(new DefaultEditorKit.DefaultKeyTypedAction()); ++ creatingKeymap = true; ++ } ++ ++ setFocusable(true); ++ enableEvents(AWTEvent.KEY_EVENT_MASK); ++ updateUI(); ++ ++ // need to do this after updateUI() ++ if (creatingKeymap) ++ loadKeymap(defkeymap, ++ new KeyBinding[] { ++ new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), ++ DefaultEditorKit.backwardAction), ++ new KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), ++ DefaultEditorKit.forwardAction), ++ new KeyBinding(KeyStroke.getKeyStroke("typed \b"), ++ DefaultEditorKit.deletePrevCharAction), ++ new KeyBinding(KeyStroke.getKeyStroke("typed \u007f"), ++ DefaultEditorKit.deleteNextCharAction) ++ }, ++ getActions()); ++ } ++ ++ public void setDocument(Document newDoc) ++ { ++ Document oldDoc = doc; ++ doc = newDoc; ++ firePropertyChange("document", oldDoc, newDoc); ++ revalidate(); ++ repaint(); ++ } ++ ++ public Document getDocument() ++ { ++ return doc; ++ } ++ ++ /** ++ * Get the AccessibleContext of this object. ++ * ++ * @return an AccessibleContext object ++ */ ++ public AccessibleContext getAccessibleContext() ++ { ++ return null; ++ } ++ ++ public void setMargin(Insets m) ++ { ++ margin = m; ++ } ++ ++ public Insets getMargin() ++ { ++ return margin; ++ } ++ ++ public void setText(String text) ++ { ++ try ++ { ++ doc.remove(0, doc.getLength()); ++ doc.insertString(0, text, null); ++ } ++ catch (BadLocationException e) ++ { ++ } ++ } ++ ++ /** ++ * Retrieves the current text in this text document. ++ * ++ * @return the text ++ * ++ * @exception NullPointerException if the underlaying document is null ++ */ ++ public String getText() ++ { ++ if (doc == null) ++ return null; ++ ++ try ++ { ++ return doc.getText(0, doc.getLength()); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen. ++ return ""; ++ } ++ } ++ ++ /** ++ * Retrieves a part of the current text in this document. ++ * ++ * @param offset the postion of the first character ++ * @param length the length of the text to retrieve ++ * ++ * @return the text ++ * ++ * @exception BadLocationException if arguments do not hold pre-conditions ++ */ ++ public String getText(int offset, int length) ++ throws BadLocationException ++ { ++ return getDocument().getText(offset, length); ++ } ++ ++ /** ++ * Returns a string that specifies the name of the Look and Feel class ++ * that renders this component. ++ * ++ * @return the string "TextComponentUI" ++ */ ++ public String getUIClassID() ++ { ++ return "TextComponentUI"; ++ } ++ ++ /** ++ * Returns a string representation of this JTextComponent. ++ */ ++ protected String paramString() ++ { ++ return "JTextComponent"; ++ } ++ ++ /** ++ * This method returns the label's UI delegate. ++ * ++ * @return The label's UI delegate. ++ */ ++ public TextUI getUI() ++ { ++ return (TextUI) ui; ++ } ++ ++ /** ++ * This method sets the label's UI delegate. ++ * ++ * @param ui The label's UI delegate. ++ */ ++ public void setUI(TextUI newUI) ++ { ++ super.setUI(newUI); ++ } ++ ++ /** ++ * This method resets the label's UI delegate to the default UI for the ++ * current look and feel. ++ */ ++ public void updateUI() ++ { ++ setUI((TextUI) UIManager.getUI(this)); ++ } ++ + public Dimension getPreferredScrollableViewportSize() + { + return null; + } ++ + public int getScrollableUnitIncrement(Rectangle visible, int orientation, + int direction) + { + return 0; + } ++ + public int getScrollableBlockIncrement(Rectangle visible, int orientation, + int direction) + { + return 0; + } +-} // class JTextComponent + ++ /** ++ * Checks whether this text component it editable. ++ * ++ * @return true if editable, false otherwise ++ */ ++ public boolean isEditable() ++ { ++ return editable; ++ } ++ ++ /** ++ * Enables/disabled this text component's editability. ++ * ++ * @param editable true to make it editable, false otherwise. ++ */ ++ public void setEditable(boolean editable) ++ { ++ firePropertyChange("editable", this.editable, editable); ++ this.editable = editable; ++ } ++ ++ /** ++ * The Caret object used in this text component. ++ * ++ * @return the caret object ++ */ ++ public Caret getCaret() ++ { ++ return caret; ++ } ++ ++ /** ++ * Sets a new Caret for this text component. ++ * ++ * @param newCaret the new Caret to set ++ */ ++ public void setCaret(Caret newCaret) ++ { ++ if (caret != null) ++ caret.deinstall(this); ++ ++ Caret oldCaret = caret; ++ caret = newCaret; ++ ++ if (caret != null) ++ caret.install(this); ++ ++ firePropertyChange("caret", oldCaret, newCaret); ++ } ++ ++ public Color getCaretColor() ++ { ++ return caretColor; ++ } ++ ++ public void setCaretColor(Color newColor) ++ { ++ Color oldCaretColor = caretColor; ++ caretColor = newColor; ++ firePropertyChange("caretColor", oldCaretColor, newColor); ++ } ++ ++ public Color getDisabledTextColor() ++ { ++ return disabledTextColor; ++ } ++ ++ public void setDisabledTextColor(Color newColor) ++ { ++ Color oldColor = disabledTextColor; ++ disabledTextColor = newColor; ++ firePropertyChange("disabledTextColor", oldColor, newColor); ++ } ++ ++ public Color getSelectedTextColor() ++ { ++ return selectedTextColor; ++ } ++ ++ public void setSelectedTextColor(Color newColor) ++ { ++ Color oldColor = selectedTextColor; ++ selectedTextColor = newColor; ++ firePropertyChange("selectedTextColor", oldColor, newColor); ++ } ++ ++ public Color getSelectionColor() ++ { ++ return selectionColor; ++ } ++ ++ public void setSelectionColor(Color newColor) ++ { ++ Color oldColor = selectionColor; ++ selectionColor = newColor; ++ firePropertyChange("selectionColor", oldColor, newColor); ++ } ++ ++ /** ++ * Retrisves the current caret position. ++ * ++ * @return the current position ++ */ ++ public int getCaretPosition() ++ { ++ return caret.getDot(); ++ } ++ ++ /** ++ * Sets the caret to a new position. ++ * ++ * @param position the new position ++ */ ++ public void setCaretPosition(int position) ++ { ++ if (doc == null) ++ return; ++ ++ if (position < 0 || position > doc.getLength()) ++ throw new IllegalArgumentException(); ++ ++ caret.setDot(position); ++ } ++ ++ /** ++ * Moves the caret to a given position. This selects the text between ++ * the old and the new position of the caret. ++ */ ++ public void moveCaretPosition(int position) ++ { ++ if (doc == null) ++ return; ++ ++ if (position < 0 || position > doc.getLength()) ++ throw new IllegalArgumentException(); ++ ++ caret.moveDot(position); ++ } ++ ++ public Highlighter getHighlighter() ++ { ++ return highlighter; ++ } ++ ++ public void setHighlighter(Highlighter newHighlighter) ++ { ++ if (highlighter != null) ++ highlighter.deinstall(this); ++ ++ Highlighter oldHighlighter = highlighter; ++ highlighter = newHighlighter; ++ ++ if (highlighter != null) ++ highlighter.install(this); ++ ++ firePropertyChange("highlighter", oldHighlighter, newHighlighter); ++ } + ++ /** ++ * Returns the start postion of the currently selected text. ++ * ++ * @return the start postion ++ */ ++ public int getSelectionStart() ++ { ++ return Math.min(caret.getDot(), caret.getMark()); ++ } + ++ /** ++ * Selects the text from the given postion to the selection end position. ++ * ++ * @param end the start positon of the selected text. ++ */ ++ public void setSelectionStart(int start) ++ { ++ select(start, getSelectionEnd()); ++ } + ++ /** ++ * Returns the end postion of the currently selected text. ++ * ++ * @return the end postion ++ */ ++ public int getSelectionEnd() ++ { ++ return Math.max(caret.getDot(), caret.getMark()); ++ } + ++ /** ++ * Selects the text from the selection start postion to the given position. ++ * ++ * @param end the end positon of the selected text. ++ */ ++ public void setSelectionEnd(int end) ++ { ++ select(getSelectionStart(), end); ++ } + ++ /** ++ * Selects a part of the content of the text component. ++ * ++ * @param start the start position of the selected text ++ * @param ent the end position of the selected text ++ */ ++ public void select(int start, int end) ++ { ++ int length = doc.getLength(); ++ ++ start = Math.max(start, 0); ++ start = Math.min(start, length); + ++ end = Math.max(end, 0); ++ end = Math.min(end, length); + ++ setCaretPosition(start); ++ moveCaretPosition(end); ++ } + ++ /** ++ * Selects the whole content of the text component. ++ */ ++ public void selectAll() ++ { ++ select(0, doc.getLength()); ++ } + ++ public synchronized void replaceSelection(String content) ++ { ++ int dot = caret.getDot(); ++ int mark = caret.getMark(); + ++ // If content is empty delete selection. ++ if (content == null) ++ { ++ caret.setDot(dot); ++ return; ++ } ++ ++ try ++ { ++ // Remove selected text. ++ if (dot != mark) ++ doc.remove(Math.min(dot, mark), Math.max(dot, mark)); ++ ++ // Insert new text. ++ doc.insertString(Math.min(dot, mark), content, null); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen. ++ System.out.println("Michael: JTextComponent.replaceSelection: Error"); ++ } ++ } + ++ public boolean getScrollableTracksViewportHeight() ++ { ++ if (getParent() instanceof JViewport) ++ return ((JViewport) getParent()).getHeight() > getPreferredSize().height; ++ ++ return false; ++ } ++ ++ public boolean getScrollableTracksViewportWidth() ++ { ++ if (getParent() instanceof JViewport) ++ return ((JViewport) getParent()).getWidth() > getPreferredSize().width; ++ ++ return false; ++ } ++ ++ /** ++ * Adds a CaretListener object to this text component. ++ * ++ * @param listener the listener to add ++ */ ++ public void addCaretListener(CaretListener listener) ++ { ++ listenerList.add(CaretListener.class, listener); ++ } ++ ++ /** ++ * Removed a CaretListener object from this text component. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeCaretListener(CaretListener listener) ++ { ++ listenerList.remove(CaretListener.class, listener); ++ } ++ ++ /** ++ * Returns all added CaretListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public CaretListener[] getCaretListeners() ++ { ++ return (CaretListener[]) getListeners(CaretListener.class); ++ } ++ ++ /** ++ * Notifies all registered CaretListener objects that the caret ++ * was updated. ++ * ++ * @param event the event to send ++ */ ++ protected void fireCaretUpdate(CaretEvent event) ++ { ++ CaretListener[] listeners = getCaretListeners(); ++ ++ for (int index = 0; index < listeners.length; ++index) ++ listeners[index].caretUpdate(event); ++ } ++ ++ /** ++ * Adds an InputListener object to this text component. ++ * ++ * @param listener the listener to add ++ */ ++ public void addInputMethodListener(InputMethodListener listener) ++ { ++ listenerList.add(InputMethodListener.class, listener); ++ } ++ ++ /** ++ * Removes an InputListener object from this text component. ++ * ++ * @param listener the listener to remove ++ */ ++ public void removeInputMethodListener(InputMethodListener listener) ++ { ++ listenerList.remove(InputMethodListener.class, listener); ++ } ++ ++ /** ++ * Returns all added InputMethodListener objects. ++ * ++ * @return an array of listeners ++ */ ++ public InputMethodListener[] getInputMethodListeners() ++ { ++ return (InputMethodListener[]) getListeners(InputMethodListener.class); ++ } ++ ++ public Rectangle modelToView(int position) throws BadLocationException ++ { ++ return getUI().modelToView(this, position); ++ } ++} +Index: javax/swing/text/LayeredHighlighter.java +=================================================================== +RCS file: javax/swing/text/LayeredHighlighter.java +diff -N javax/swing/text/LayeredHighlighter.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/LayeredHighlighter.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,61 @@ ++/* LayeredHighlighter.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.awt.Graphics; ++import java.awt.Shape; ++ ++import javax.swing.text.JTextComponent; ++import javax.swing.text.View; ++ ++ ++public abstract class LayeredHighlighter ++ implements Highlighter ++{ ++ public abstract static class LayerPainter ++ implements Highlighter.HighlightPainter ++ { ++ public abstract Shape paintLayer(Graphics g, int p0, int p1, ++ Shape viewBounds, JTextComponent editor, ++ View view); ++ } ++ ++ public abstract void paintLayeredHighlights(Graphics g, int p0, int p1, ++ Shape viewBounds, ++ JTextComponent editor, View view); ++} +Index: javax/swing/text/MutableAttributeSet.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/MutableAttributeSet.java,v +retrieving revision 1.3 +diff -u -r1.3 MutableAttributeSet.java +--- javax/swing/text/MutableAttributeSet.java 10 Jan 2004 21:07:44 -0000 1.3 ++++ javax/swing/text/MutableAttributeSet.java 6 Sep 2004 16:36:10 -0000 +@@ -44,48 +44,42 @@ + * @author Andrew Selkirk + * @version 1.0 + */ +-public interface MutableAttributeSet extends AttributeSet { +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * addAttribute +- * @param name TODO +- * @param value TODO +- */ +- void addAttribute(Object name, Object value); +- +- /** +- * addAttributes +- * @param attributes TODO +- */ +- void addAttributes(AttributeSet attributes); +- +- /** +- * removeAttribute +- * @param name TODO +- */ +- void removeAttribute(Object name); +- +- /** +- * removeAttributes +- * @param names TODO +- */ +- void removeAttributes(Enumeration names); +- +- /** +- * removeAttributes +- * @param attributes TODO +- */ +- void removeAttributes(AttributeSet attributes); +- +- /** +- * setResolveParent +- * @param parent TODO +- */ +- void setResolveParent(AttributeSet parent); +- +- +-} // MutableAttributeSet ++public interface MutableAttributeSet extends AttributeSet ++{ ++ /** ++ * addAttribute ++ * @param name TODO ++ * @param value TODO ++ */ ++ void addAttribute(Object name, Object value); ++ ++ /** ++ * addAttributes ++ * @param attributes TODO ++ */ ++ void addAttributes(AttributeSet attributes); ++ ++ /** ++ * removeAttribute ++ * @param name TODO ++ */ ++ void removeAttribute(Object name); ++ ++ /** ++ * removeAttributes ++ * @param names TODO ++ */ ++ void removeAttributes(Enumeration names); ++ ++ /** ++ * removeAttributes ++ * @param attributes TODO ++ */ ++ void removeAttributes(AttributeSet attributes); ++ ++ /** ++ * setResolveParent ++ * @param parent TODO ++ */ ++ void setResolveParent(AttributeSet parent); ++} +Index: javax/swing/text/PlainDocument.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/PlainDocument.java,v +retrieving revision 1.1 +diff -u -r1.1 PlainDocument.java +--- javax/swing/text/PlainDocument.java 9 Aug 2002 04:26:12 -0000 1.1 ++++ javax/swing/text/PlainDocument.java 6 Sep 2004 16:36:10 -0000 +@@ -1,5 +1,5 @@ +-/* PlainDocument.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++/* PlainDocument.java -- ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,22 +37,45 @@ + + package javax.swing.text; + +- + public class PlainDocument extends AbstractDocument + { +- PlainDocument() +- { +- super(new GapContent()); +- } +- +- public Element getDefaultRootElement() +- { +- return null; +- } +- +- public Element getParagraphElement(int pos) +- { +- return null; +- } ++ private static final long serialVersionUID = 4758290289196893664L; ++ ++ public static final String lineLimitAttribute = "lineLimit"; ++ public static final String tabSizeAttribute = "tabSize"; ++ ++ private Element rootElement; ++ private int tabSize; ++ ++ public PlainDocument() ++ { ++ this(new GapContent()); ++ } ++ ++ public PlainDocument(AbstractDocument.Content content) ++ { ++ super(content); ++ tabSize = 8; ++ rootElement = createDefaultRoot(); ++ } ++ ++ protected AbstractDocument.AbstractElement createDefaultRoot() ++ { ++ BranchElement rootElement = ++ (BranchElement) createBranchElement(null, null); ++ Element[] lines = new Element[1]; ++ lines[0] = createLeafElement(rootElement, null, 0, 1); ++ rootElement.replace(0, 0, lines); ++ return rootElement; ++ } ++ ++ public Element getDefaultRootElement() ++ { ++ return rootElement; ++ } ++ ++ public Element getParagraphElement(int pos) ++ { ++ return null; ++ } + } +- +Index: javax/swing/text/PlainEditorKit.java +=================================================================== +RCS file: javax/swing/text/PlainEditorKit.java +diff -N javax/swing/text/PlainEditorKit.java +--- javax/swing/text/PlainEditorKit.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ /dev/null 1 Jan 1970 00:00:00 -0000 +@@ -1,103 +0,0 @@ +-/* PlainEditorKit.java -- +- Copyright (C) 2002, 2004 Free Software Foundation, Inc. +- +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ +- +-package javax.swing.text; +- +-import java.io.InputStream; +-import java.io.OutputStream; +-import java.io.Reader; +-import java.io.Writer; +-import javax.swing.Action; +-import javax.swing.JEditorPane; +- +-public class PlainEditorKit extends EditorKit +-{ +- public PlainEditorKit() +- { +- } +- +- public PlainEditorKit(PlainEditorKit kit) +- { +- super(kit); +- } +- +- protected Object clone() +- { +- return new PlainEditorKit(this); +- } +- void deinstall(JEditorPane c) +- { +- // Called when the kit is being removed from the JEditorPane. +- } +- void install(JEditorPane c) +- { +- } +- +- Caret createCaret() +- { +- return null; +- } +- Document createDefaultDocument() +- { +- return null; +- } +- Action[] getActions() +- { +- return null; +- } +- String getContentType() +- { +- return null; +- } +- ViewFactory getViewFactory() +- { +- return null; +- } +- void read(InputStream in, Document doc, int pos) +- { +- } +- void read(Reader in, Document doc, int pos) +- { +- } +- void write(OutputStream out, Document doc, int pos, int len) +- { +- } +- void write(Writer out, Document doc, int pos, int len) +- { +- } +-} +- +Index: javax/swing/text/PlainView.java +=================================================================== +RCS file: javax/swing/text/PlainView.java +diff -N javax/swing/text/PlainView.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/PlainView.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,192 @@ ++/* PlainView.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.text; ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++import java.awt.Rectangle; ++import java.awt.Shape; ++ ++ ++public class PlainView extends View ++ implements TabExpander ++{ ++ private Color selectedColor; ++ private Color unselectedColor; ++ private Font font; ++ ++ protected FontMetrics metrics; ++ ++ public PlainView(Element elem) ++ { ++ super(elem); ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ protected void updateMetrics() ++ { ++ Component component = getContainer(); ++ Font font = component.getFont(); ++ ++ if (this.font != font) ++ { ++ this.font = font; ++ metrics = component.getFontMetrics(font); ++ } ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ protected Rectangle lineToRect(Shape a, int line) ++ { ++ // Ensure metrics are up-to-date. ++ updateMetrics(); ++ ++ Rectangle rect = a.getBounds(); ++ int fontHeight = metrics.getHeight(); ++ return new Rectangle(rect.x, rect.y + (line * fontHeight), ++ rect.width, fontHeight); ++ } ++ ++ public Shape modelToView(int position, Shape a, Position.Bias b) ++ throws BadLocationException ++ { ++ Document document = getDocument(); ++ ++ // Get rectangle of the line containing position. ++ int lineIndex = getElement().getElementIndex(position); ++ Rectangle rect = lineToRect(a, lineIndex); ++ ++ // Get the rectangle for position. ++ Element line = getElement().getElement(lineIndex); ++ int lineStart = line.getStartOffset(); ++ Segment segment = new Segment(); ++ document.getText(lineStart, position - lineStart, segment); ++ int xoffset = Utilities.getTabbedTextWidth(segment, metrics, rect.x, ++ this, lineStart); ++ ++ // Calc the real rectangle. ++ rect.x += xoffset; ++ rect.width = 1; ++ rect.height = metrics.getHeight(); ++ ++ return rect; ++ } ++ ++ public void drawLine(int lineIndex, Graphics g, int x, int y) ++ { ++ try ++ { ++ metrics = g.getFontMetrics(); ++ // FIXME: Selected text are not drawn yet. ++ drawUnselectedText(g, x, y, 0, getDocument().getLength()); ++ //drawSelectedText(g, , , , ); ++ } ++ catch (BadLocationException e) ++ { ++ // This should never happen. ++ } ++ } ++ ++ public int drawSelectedText(Graphics g, int x, int y, int p0, int p1) ++ throws BadLocationException ++ { ++ g.setColor(selectedColor); ++ Segment segment = new Segment(); ++ getDocument().getText(p0, p1 - p0, segment); ++ return Utilities.drawTabbedText(segment, x, y, g, this, 0); ++ } ++ ++ public int drawUnselectedText(Graphics g, int x, int y, int p0, int p1) ++ throws BadLocationException ++ { ++ g.setColor(unselectedColor); ++ Segment segment = new Segment(); ++ getDocument().getText(p0, p1 - p0, segment); ++ return Utilities.drawTabbedText(segment, x, y, g, this, 0); ++ } ++ ++ public void paint(Graphics g, Shape s) ++ { ++ JTextComponent textComponent = (JTextComponent) getContainer(); ++ ++ g.setFont(textComponent.getFont()); ++ selectedColor = textComponent.getSelectedTextColor(); ++ unselectedColor = textComponent.getForeground(); ++ ++ Rectangle rect = s.getBounds(); ++ ++ // FIXME: Text may be scrolled. ++ drawLine(0, g, rect.x, rect.y); ++ } ++ ++ public int getTabSize() ++ { ++ return 8; ++ } ++ ++ /** ++ * Returns the next tab stop position after a given reference position. ++ * ++ * This implementation ignores the tabStop argument. ++ * ++ * @param x the current x position in pixels ++ * @param tabStop the position within the text stream that the tab occured at ++ */ ++ public float nextTabStop(float x, int tabStop) ++ { ++ float tabSizePixels = getTabSize() + metrics.charWidth('m'); ++ return (float) (Math.floor(x / tabSizePixels) + 1) * tabSizePixels; ++ } ++ ++ public float getPreferredSpan(int axis) ++ { ++ if (axis != X_AXIS && axis != Y_AXIS) ++ throw new IllegalArgumentException(); ++ ++ return 10; ++ } ++} ++ +Index: javax/swing/text/Position.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/Position.java,v +retrieving revision 1.1 +diff -u -r1.1 Position.java +--- javax/swing/text/Position.java 9 Aug 2002 04:26:12 -0000 1.1 ++++ javax/swing/text/Position.java 6 Sep 2004 16:36:10 -0000 +@@ -1,5 +1,5 @@ + /* Position.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,6 +42,20 @@ + { + static class Bias + { ++ public static final Bias Backward = new Bias("backward"); ++ public static final Bias Forward = new Bias("forward"); ++ ++ private String name; ++ ++ private Bias(String n) ++ { ++ name = n; ++ } ++ ++ public String toString() ++ { ++ return name; ++ } + } + + int getOffset(); +Index: javax/swing/text/Segment.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/Segment.java,v +retrieving revision 1.2 +diff -u -r1.2 Segment.java +--- javax/swing/text/Segment.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/Segment.java 6 Sep 2004 16:36:10 -0000 +@@ -37,71 +37,140 @@ + + package javax.swing.text; + +-public class Segment implements Cloneable, CharacterIterator ++import java.text.CharacterIterator; ++ ++public class Segment ++ implements Cloneable, CharacterIterator + { +- char[] array; +- int count; +- int offset; ++ private boolean partialReturn; ++ private int current; ++ ++ public char[] array; ++ public int count; ++ public int offset; ++ ++ public Segment() ++ { ++ } ++ ++ public Segment(char[] array, int offset, int count) ++ { ++ this.array = array; ++ this.offset = offset; ++ this.count = count; ++ } + + public Object clone() + { +- try { ++ try ++ { + return super.clone(); +- } catch (Exception e) { +- System.err.println("Huuuhhh, this class implements cloneable !!!!!!"); +- System.err.println("I think there is a bug in this JVM somewhere"); + } ++ catch (CloneNotSupportedException e) ++ { + return null; +- } ++ } ++ } ++ ++ public char current() ++ { ++ if (count == 0 ++ || current >= getEndIndex()) ++ return DONE; + +- public char current() +- { +- return array[getIndex()]; +- } ++ return array[current]; ++ } + +- public char first() +- { +- offset = getBeginIndex(); +- return array[offset]; +- } ++ public char first() ++ { ++ if (count == 0) ++ return DONE; ++ ++ current = getBeginIndex(); ++ return array[current]; ++ } ++ ++ public int getBeginIndex() ++ { ++ return offset; ++ } ++ ++ public int getEndIndex() ++ { ++ return offset + count; ++ } ++ ++ public int getIndex() ++ { ++ return current; ++ } ++ ++ public char last() ++ { ++ if (count == 0) ++ return DONE; + +- public int getBeginIndex() +- { +- return offset; +- } ++ current = getEndIndex() - 1; ++ return array[current]; ++ } ++ ++ public char next() ++ { ++ if (count == 0) ++ return DONE; ++ ++ if ((current + 1) >= getEndIndex()) ++ { ++ current = getEndIndex(); ++ return DONE; ++ } + +- public int getEndIndex() +- { +- return offset + count; +- } +- public int getIndex() +- { +- return offset; +- } +- public char last() +- { +- offset = getEndIndex() - 1; +- return array[offset]; +- } +- public char next() +- { +- offset++; +- return array[offset]; +- } +- public char previous() +- { +- offset--; +- return array[offset]; +- } +- public char setIndex(int position) +- { +- offset = position; +- return array[offset]; +- } ++ current++; ++ return array[current]; ++ } + +- public String toString() +- { +- return new String(array, offset, count); +- } +-} ++ public char previous() ++ { ++ if (count == 0 ++ || current == getBeginIndex()) ++ return DONE; ++ ++ current--; ++ return array[current]; ++ } ++ ++ public char setIndex(int position) ++ { ++ if (position < getBeginIndex() ++ || position > getEndIndex()) ++ throw new IllegalArgumentException(); + ++ current = position; ++ ++ if (position == getEndIndex()) ++ return DONE; ++ ++ return array[current]; ++ } ++ ++ public String toString() ++ { ++ return new String(array, offset, count); ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ public void setPartialReturn(boolean p) ++ { ++ partialReturn = p; ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ public boolean isPartialReturn() ++ { ++ return partialReturn; ++ } ++} +Index: javax/swing/text/SimpleAttributeSet.java +=================================================================== +RCS file: javax/swing/text/SimpleAttributeSet.java +diff -N javax/swing/text/SimpleAttributeSet.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/SimpleAttributeSet.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,192 @@ ++/* SimpleAttributeSet.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.io.Serializable; ++import java.util.Enumeration; ++import java.util.Hashtable; ++import java.lang.Cloneable; ++ ++public class SimpleAttributeSet ++ implements MutableAttributeSet, Serializable, Cloneable ++{ ++ Hashtable tab; ++ ++ static AttributeSet EMPTY = new SimpleAttributeSet(); ++ ++ public SimpleAttributeSet() ++ { ++ this(null); ++ } ++ ++ public SimpleAttributeSet(AttributeSet a) ++ { ++ tab = new Hashtable(); ++ addAttributes(a); ++ } ++ ++ public void addAttribute(Object name, Object value) ++ { ++ tab.put(name, value); ++ } ++ ++ public void addAttributes(AttributeSet attributes) ++ { ++ Enumeration e = attributes.getAttributeNames(); ++ while (e.hasMoreElements()) ++ { ++ Object name = e.nextElement(); ++ Object val = attributes.getAttribute(name); ++ tab.put(name, val); ++ } ++ } ++ ++ public Object clone() ++ { ++ SimpleAttributeSet s = new SimpleAttributeSet(); ++ s.tab = (Hashtable) tab.clone(); ++ return s; ++ } ++ ++ public boolean containsAttribute(Object name, Object value) ++ { ++ return tab.containsKey(name) ++ && tab.get(name).equals(value); ++ } ++ ++ public boolean containsAttributes(AttributeSet attributes) ++ { ++ Enumeration e = attributes.getAttributeNames(); ++ while (e.hasMoreElements()) ++ { ++ Object name = e.nextElement(); ++ Object val = attributes.getAttribute(name); ++ if (! containsAttribute(name, val)) ++ return false; ++ } ++ return true; ++ } ++ ++ public AttributeSet copyAttributes() ++ { ++ return (AttributeSet) clone(); ++ } ++ ++ public boolean equals(Object obj) ++ { ++ return (obj != null) ++ && (obj instanceof SimpleAttributeSet) ++ && ((SimpleAttributeSet)obj).tab.equals(this.tab); ++ } ++ ++ public Object getAttribute(Object name) ++ { ++ Object val = tab.get(name); ++ if (val != null) ++ return val; ++ ++ Object p = getResolveParent(); ++ if (p != null && p instanceof AttributeSet) ++ return (((AttributeSet)p).getAttribute(name)); ++ ++ return null; ++ } ++ ++ public int getAttributeCount() ++ { ++ return tab.size(); ++ } ++ ++ public Enumeration getAttributeNames() ++ { ++ return tab.keys(); ++ } ++ ++ public AttributeSet getResolveParent() ++ { ++ return (AttributeSet) tab.get(ResolveAttribute); ++ } ++ ++ public int hashCode() ++ { ++ return tab.hashCode(); ++ } ++ ++ public boolean isDefined(Object attrName) ++ { ++ return tab.containsKey(attrName); ++ } ++ ++ public boolean isEmpty() ++ { ++ return tab.isEmpty(); ++ } ++ ++ public boolean isEqual(AttributeSet attr) ++ { ++ return this.equals(attr); ++ } ++ ++ public void removeAttribute(Object name) ++ { ++ tab.remove(name); ++ } ++ ++ public void removeAttributes(AttributeSet attributes) ++ { ++ removeAttributes(attributes.getAttributeNames()); ++ } ++ ++ public void removeAttributes(Enumeration names) ++ { ++ while (names.hasMoreElements()) ++ { ++ removeAttribute(names.nextElement()); ++ } ++ } ++ ++ public void setResolveParent(AttributeSet parent) ++ { ++ addAttribute(ResolveAttribute, parent); ++ } ++ ++ public String toString() ++ { ++ return tab.toString(); ++ } ++} +Index: javax/swing/text/Style.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/Style.java,v +retrieving revision 1.2 +diff -u -r1.2 Style.java +--- javax/swing/text/Style.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/Style.java 6 Sep 2004 16:36:10 -0000 +@@ -39,9 +39,26 @@ + + import javax.swing.event.ChangeListener; + +-public interface Style ++public interface Style extends MutableAttributeSet + { +- void addChangeListener(ChangeListener l); +- String getName(); +- void removeChangeListener(ChangeListener l); ++ /** ++ * Returns the name of the style. ++ * ++ * @return the name ++ */ ++ String getName(); ++ ++ /** ++ * Adds a ChangeListener object to the style. ++ * ++ * @param listener the listener object to add ++ */ ++ void addChangeListener(ChangeListener listener); ++ ++ /** ++ * Removes a ChangeListener from to the style. ++ * ++ * @param listener the listener object to remove, ++ */ ++ void removeChangeListener(ChangeListener listener); + } +Index: javax/swing/text/StyleConstants.java +=================================================================== +RCS file: javax/swing/text/StyleConstants.java +diff -N javax/swing/text/StyleConstants.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/StyleConstants.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,439 @@ ++/* StyleConstants.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.awt.Color; ++import java.awt.Component; ++import javax.swing.Icon; ++ ++public class StyleConstants ++{ ++ ++ String keyname; ++ private StyleConstants(String k) ++ { ++ keyname = k; ++ } ++ ++ public String toString() ++ { ++ return keyname; ++ } ++ ++ public static int ALIGN_CENTER; ++ public static int ALIGN_JUSTIFIED; ++ public static int ALIGN_LEFT; ++ public static int ALIGN_RIGHT; ++ ++ public static Object Background = CharacterConstants.Background; ++ public static Object BidiLevel = CharacterConstants.BidiLevel; ++ public static Object Bold = CharacterConstants.Bold; ++ public static Object ComponentAttribute = CharacterConstants.ComponentAttribute; ++ public static Object FontFamily = CharacterConstants.Family; ++ public static Object FontSize = CharacterConstants.Size; ++ public static Object Foreground = CharacterConstants.Foreground; ++ public static Object IconAttribute = CharacterConstants.IconAttribute; ++ public static Object Italic = CharacterConstants.Italic; ++ public static Object StrikeThrough = CharacterConstants.StrikeThrough; ++ public static Object Subscript = CharacterConstants.Subscript; ++ public static Object Superscript = CharacterConstants.Superscript; ++ public static Object Underline = CharacterConstants.Underline; ++ ++ public static Object Alignment = ParagraphConstants.Alignment; ++ public static Object FirstLineIndent = ParagraphConstants.FirstLineIndent; ++ public static Object LeftIndent = ParagraphConstants.LeftIndent; ++ public static Object LineSpacing = ParagraphConstants.LineSpacing; ++ public static Object Orientation = ParagraphConstants.Orientation; ++ public static Object RightIndent = ParagraphConstants.RightIndent; ++ public static Object SpaceAbove = ParagraphConstants.SpaceAbove; ++ public static Object SpaceBelow = ParagraphConstants.SpaceBelow; ++ public static Object TabSet = ParagraphConstants.TabSet; ++ ++ public static String ComponentElementName = new String("component"); ++ public static String IconElementName = new String("icon"); ++ ++ public static Object ComposedTextAttribute = new StyleConstants("composed text"); ++ public static Object ModelAttribute = new StyleConstants("model"); ++ public static Object NameAttribute = new StyleConstants("name"); ++ public static Object ResolveAttribute = new StyleConstants("resolver"); ++ ++ public static int getAlignment(AttributeSet a) ++ { ++ if (a.isDefined(Alignment)) ++ return ((Integer)a.getAttribute(Alignment)).intValue(); ++ else ++ return ALIGN_LEFT; ++ } ++ ++ public static Color getBackground(AttributeSet a) ++ { ++ if (a.isDefined(Background)) ++ return (Color) a.getAttribute(Background); ++ else ++ return Color.BLACK; ++ } ++ ++ public static int getBidiLevel(AttributeSet a) ++ { ++ if (a.isDefined(BidiLevel)) ++ return ((Integer)a.getAttribute(BidiLevel)).intValue(); ++ else ++ return 0; ++ } ++ ++ public static Component getComponent(AttributeSet a) ++ { ++ if (a.isDefined(ComponentAttribute)) ++ return (Component) a.getAttribute(ComponentAttribute); ++ else ++ return (Component) null; ++ } ++ ++ public static float getFirstLineIndent(AttributeSet a) ++ { ++ if (a.isDefined(FirstLineIndent)) ++ return ((Float)a.getAttribute(FirstLineIndent)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static String getFontFamily(AttributeSet a) ++ { ++ if (a.isDefined(FontFamily)) ++ return (String) a.getAttribute(FontFamily); ++ else ++ return "Monospaced"; ++ } ++ ++ public static int getFontSize(AttributeSet a) ++ { ++ if (a.isDefined(FontSize)) ++ return ((Integer)a.getAttribute(FontSize)).intValue(); ++ else ++ return 12; ++ } ++ ++ public static Color getForeground(AttributeSet a) ++ { ++ if (a.isDefined(Foreground)) ++ return (Color) a.getAttribute(Foreground); ++ else ++ return Color.BLACK; ++ } ++ ++ public static Icon getIcon(AttributeSet a) ++ { ++ if (a.isDefined(IconAttribute)) ++ return (Icon) a.getAttribute(IconAttribute); ++ else ++ return (Icon) null; ++ } ++ ++ public static float getLeftIndent(AttributeSet a) ++ { ++ if (a.isDefined(LeftIndent)) ++ return ((Float)a.getAttribute(LeftIndent)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static float getLineSpacing(AttributeSet a) ++ { ++ if (a.isDefined(LineSpacing)) ++ return ((Float)a.getAttribute(LineSpacing)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static float getRightIndent(AttributeSet a) ++ { ++ if (a.isDefined(RightIndent)) ++ return ((Float)a.getAttribute(RightIndent)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static float getSpaceAbove(AttributeSet a) ++ { ++ if (a.isDefined(SpaceAbove)) ++ return ((Float)a.getAttribute(SpaceAbove)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static float getSpaceBelow(AttributeSet a) ++ { ++ if (a.isDefined(SpaceBelow)) ++ return ((Float)a.getAttribute(SpaceBelow)).floatValue(); ++ else ++ return 0.f; ++ } ++ ++ public static javax.swing.text.TabSet getTabSet(AttributeSet a) ++ { ++ if (a.isDefined(StyleConstants.TabSet)) ++ return (javax.swing.text.TabSet) a.getAttribute(StyleConstants.TabSet); ++ else ++ return (javax.swing.text.TabSet) null; ++ } ++ ++ public static boolean isBold(AttributeSet a) ++ { ++ if (a.isDefined(Bold)) ++ return ((Boolean) a.getAttribute(Bold)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static boolean isItalic(AttributeSet a) ++ { ++ if (a.isDefined(Italic)) ++ return ((Boolean) a.getAttribute(Italic)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static boolean isStrikeThrough(AttributeSet a) ++ { ++ if (a.isDefined(StrikeThrough)) ++ return ((Boolean) a.getAttribute(StrikeThrough)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static boolean isSubscript(AttributeSet a) ++ { ++ if (a.isDefined(Subscript)) ++ return ((Boolean) a.getAttribute(Subscript)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static boolean isSuperscript(AttributeSet a) ++ { ++ if (a.isDefined(Superscript)) ++ return ((Boolean) a.getAttribute(Superscript)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static boolean isUnderline(AttributeSet a) ++ { ++ if (a.isDefined(Underline)) ++ return ((Boolean) a.getAttribute(Underline)).booleanValue(); ++ else ++ return false; ++ } ++ ++ public static void setAlignment(MutableAttributeSet a, int align) ++ { ++ a.addAttribute(Alignment, new Integer(align)); ++ } ++ ++ public static void setBackground(MutableAttributeSet a, Color fg) ++ { ++ a.addAttribute(Background, fg); ++ } ++ ++ public static void setBidiLevel(MutableAttributeSet a, int lev) ++ { ++ a.addAttribute(BidiLevel, new Integer(lev)); ++ } ++ ++ public static void setBold(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(Bold, new Boolean(b)); ++ } ++ ++ public static void setComponent(MutableAttributeSet a, Component c) ++ { ++ a.addAttribute(ComponentAttribute, c); ++ } ++ ++ public static void setFirstLineIndent(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(FirstLineIndent, new Float(i)); ++ } ++ ++ public static void setFontFamily(MutableAttributeSet a, String fam) ++ { ++ a.addAttribute(FontFamily, fam); ++ } ++ ++ public static void setFontSize(MutableAttributeSet a, int s) ++ { ++ a.addAttribute(FontSize, new Integer(s)); ++ } ++ ++ public static void setForeground(MutableAttributeSet a, Color fg) ++ { ++ a.addAttribute(Foreground, fg); ++ } ++ ++ public static void setIcon(MutableAttributeSet a, Icon c) ++ { ++ a.addAttribute(IconAttribute, c); ++ } ++ ++ public static void setItalic(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(Italic, new Boolean(b)); ++ } ++ ++ public static void setLeftIndent(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(LeftIndent, new Float(i)); ++ } ++ ++ public static void setLineSpacing(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(LineSpacing, new Float(i)); ++ } ++ ++ public static void setRightIndent(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(RightIndent, new Float(i)); ++ } ++ ++ public static void setSpaceAbove(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(SpaceAbove, new Float(i)); ++ } ++ ++ public static void setSpaceBelow(MutableAttributeSet a, float i) ++ { ++ a.addAttribute(SpaceBelow, new Float(i)); ++ } ++ ++ public static void setStrikeThrough(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(StrikeThrough, new Boolean(b)); ++ } ++ ++ public static void setSubscript(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(Subscript, new Boolean(b)); ++ } ++ ++ public static void setSuperscript(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(Superscript, new Boolean(b)); ++ } ++ ++ public static void setTabSet(MutableAttributeSet a, javax.swing.text.TabSet tabs) ++ { ++ a.addAttribute(StyleConstants.TabSet, tabs); ++ } ++ ++ public static void setUnderline(MutableAttributeSet a, boolean b) ++ { ++ a.addAttribute(Underline, new Boolean(b)); ++ } ++ ++ // The remainder are so-called "typesafe enumerations" which ++ // alias subsets of the above constants. ++ public static class CharacterConstants ++ extends StyleConstants ++ implements AttributeSet.CharacterAttribute ++ { ++ private CharacterConstants(String k) ++ { ++ super(k); ++ } ++ ++ public static Object Background = ColorConstants.Background; ++ public static Object BidiLevel = new CharacterConstants("bidiLevel"); ++ public static Object Bold = FontConstants.Bold; ++ public static Object ComponentAttribute = new CharacterConstants("component"); ++ public static Object Family = FontConstants.Family; ++ public static Object Size = FontConstants.Size; ++ public static Object Foreground = ColorConstants.Foreground; ++ public static Object IconAttribute = new CharacterConstants("icon"); ++ public static Object Italic = FontConstants.Italic; ++ public static Object StrikeThrough = new CharacterConstants("strikethrough"); ++ public static Object Subscript = new CharacterConstants("subscript"); ++ public static Object Superscript = new CharacterConstants("superscript"); ++ public static Object Underline = new CharacterConstants("underline"); ++ } ++ ++ public static class ColorConstants ++ extends StyleConstants ++ implements AttributeSet.ColorAttribute, AttributeSet.CharacterAttribute ++ { ++ private ColorConstants(String k) ++ { ++ super(k); ++ } ++ public static Object Foreground = new ColorConstants("foreground"); ++ public static Object Background = new ColorConstants("background"); ++ } ++ ++ public static class FontConstants ++ extends StyleConstants ++ implements AttributeSet.FontAttribute, AttributeSet.CharacterAttribute ++ { ++ private FontConstants(String k) ++ { ++ super(k); ++ } ++ public static Object Bold = new FontConstants("bold"); ++ public static Object Family = new FontConstants("family"); ++ public static Object Italic = new FontConstants("italic"); ++ public static Object Size = new FontConstants("size"); ++ } ++ ++ public static class ParagraphConstants ++ extends StyleConstants ++ implements AttributeSet.ParagraphAttribute ++ { ++ private ParagraphConstants(String k) ++ { ++ super(k); ++ } ++ public static Object Alignment = new ParagraphConstants("Alignment"); ++ public static Object FirstLineIndent = new ParagraphConstants("FirstLineIndent"); ++ public static Object LeftIndent = new ParagraphConstants("LeftIndent"); ++ public static Object LineSpacing = new ParagraphConstants("LineSpacing"); ++ public static Object Orientation = new ParagraphConstants("Orientation"); ++ public static Object RightIndent = new ParagraphConstants("RightIndent"); ++ public static Object SpaceAbove = new ParagraphConstants("SpaceAbove"); ++ public static Object SpaceBelow = new ParagraphConstants("SpaceBelow"); ++ public static Object TabSet = new ParagraphConstants("TabSet"); ++ } ++ ++} +Index: javax/swing/text/StyleContext.java +=================================================================== +RCS file: javax/swing/text/StyleContext.java +diff -N javax/swing/text/StyleContext.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/StyleContext.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,697 @@ ++/* StyleContext.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.awt.Color; ++import java.awt.Font; ++import java.awt.FontMetrics; ++import java.awt.Toolkit; ++import java.io.IOException; ++import java.io.ObjectInputStream; ++import java.io.ObjectOutputStream; ++import java.io.Serializable; ++import javax.swing.event.EventListenerList; ++import javax.swing.event.ChangeEvent; ++import javax.swing.event.ChangeListener; ++import java.util.Enumeration; ++import java.util.EventListener; ++import java.util.Hashtable; ++ ++public class StyleContext ++ implements Serializable, AbstractDocument.AttributeContext ++{ ++ public class NamedStyle ++ implements Serializable, Style ++ { ++ protected ChangeEvent changeEvent; ++ protected EventListenerList listenerList; ++ ++ AttributeSet attributes; ++ String name; ++ ++ public NamedStyle() ++ { ++ this(null, null); ++ } ++ ++ public NamedStyle(Style parent) ++ { ++ this(null, parent); ++ } ++ ++ public NamedStyle(String name, Style parent) ++ { ++ this.name = name; ++ this.attributes = getEmptySet(); ++ this.changeEvent = new ChangeEvent(this); ++ this.listenerList = new EventListenerList(); ++ setResolveParent(parent); ++ } ++ ++ public String getName() ++ { ++ return name; ++ } ++ ++ public void setName(String n) ++ { ++ name = n; ++ fireStateChanged(); ++ } ++ ++ public void addChangeListener(ChangeListener l) ++ { ++ listenerList.add(ChangeListener.class, l); ++ } ++ ++ public void removeChangeListener(ChangeListener l) ++ { ++ listenerList.remove(ChangeListener.class, l); ++ } ++ ++ public EventListener[] getListeners(Class listenerType) ++ { ++ return listenerList.getListeners(listenerType); ++ } ++ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) getListeners(ChangeListener.class); ++ } ++ ++ protected void fireStateChanged() ++ { ++ ChangeListener[] listeners = getChangeListeners(); ++ for (int i = 0; i < listeners.length; ++i) ++ { ++ listeners[i].stateChanged(changeEvent); ++ } ++ } ++ ++ public void addAttribute(Object name, Object value) ++ { ++ attributes = StyleContext.this.addAttribute(attributes, name, value); ++ fireStateChanged(); ++ } ++ ++ public void addAttributes(AttributeSet attr) ++ { ++ attributes = StyleContext.this.addAttributes(attributes, attr); ++ fireStateChanged(); ++ } ++ ++ public boolean containsAttribute(Object name, Object value) ++ { ++ return attributes.containsAttribute(name, value); ++ } ++ ++ public boolean containsAttributes(AttributeSet attrs) ++ { ++ return attributes.containsAttributes(attrs); ++ } ++ ++ public AttributeSet copyAttributes() ++ { ++ return attributes.copyAttributes(); ++ } ++ ++ public Object getAttribute(Object attrName) ++ { ++ return attributes.getAttribute(attrName); ++ } ++ ++ public int getAttributeCount() ++ { ++ return attributes.getAttributeCount(); ++ } ++ ++ public Enumeration getAttributeNames() ++ { ++ return attributes.getAttributeNames(); ++ } ++ ++ public boolean isDefined(Object attrName) ++ { ++ return attributes.isDefined(attrName); ++ } ++ ++ public boolean isEqual(AttributeSet attr) ++ { ++ return attributes.isEqual(attr); ++ } ++ ++ public void removeAttribute(Object name) ++ { ++ attributes = StyleContext.this.removeAttribute(attributes, name); ++ fireStateChanged(); ++ } ++ ++ public void removeAttributes(AttributeSet attrs) ++ { ++ attributes = StyleContext.this.removeAttributes(attributes, attrs); ++ fireStateChanged(); ++ } ++ ++ public void removeAttributes(Enumeration names) ++ { ++ attributes = StyleContext.this.removeAttributes(attributes, names); ++ fireStateChanged(); ++ } ++ ++ ++ public AttributeSet getResolveParent() ++ { ++ return attributes.getResolveParent(); ++ } ++ ++ public void setResolveParent(AttributeSet parent) ++ { ++ attributes = StyleContext.this.addAttribute(attributes, ResolveAttribute, parent); ++ fireStateChanged(); ++ } ++ ++ public String toString() ++ { ++ return ("[NamedStyle: name=" + name + ", attrs=" + attributes.toString() + "]"); ++ } ++ } ++ ++ public class SmallAttributeSet ++ implements AttributeSet ++ { ++ final Object [] attrs; ++ public SmallAttributeSet(AttributeSet a) ++ { ++ if (a == null) ++ attrs = new Object[0]; ++ else ++ { ++ int n = a.getAttributeCount(); ++ int i = 0; ++ attrs = new Object[n * 2]; ++ Enumeration e = a.getAttributeNames(); ++ while (e.hasMoreElements()) ++ { ++ Object name = e.nextElement(); ++ attrs[i++] = name; ++ attrs[i++] = a.getAttribute(name); ++ } ++ } ++ } ++ ++ public SmallAttributeSet(Object [] a) ++ { ++ if (a == null) ++ attrs = new Object[0]; ++ else ++ { ++ attrs = new Object[a.length]; ++ System.arraycopy(a, 0, attrs, 0, a.length); ++ } ++ } ++ ++ public Object clone() ++ { ++ return new SmallAttributeSet(this.attrs); ++ } ++ ++ public boolean containsAttribute(Object name, Object value) ++ { ++ for (int i = 0; i < attrs.length; i += 2) ++ { ++ if (attrs[i].equals(name) && ++ attrs[i+1].equals(value)) ++ return true; ++ } ++ return false; ++ } ++ ++ public boolean containsAttributes(AttributeSet a) ++ { ++ Enumeration e = a.getAttributeNames(); ++ while (e.hasMoreElements()) ++ { ++ Object name = e.nextElement(); ++ Object val = a.getAttribute(name); ++ if (!containsAttribute(name, val)) ++ return false; ++ } ++ return true; ++ } ++ ++ public AttributeSet copyAttributes() ++ { ++ return (AttributeSet) clone(); ++ } ++ ++ public boolean equals(Object obj) ++ { ++ return ++ (obj instanceof SmallAttributeSet) ++ && this.isEqual((AttributeSet)obj); ++ } ++ ++ public Object getAttribute(Object key) ++ { ++ for (int i = 0; i < attrs.length; i += 2) ++ { ++ if (attrs[i].equals(key)) ++ return attrs[i+1]; ++ } ++ ++ Object p = getResolveParent(); ++ if (p != null && p instanceof AttributeSet) ++ return (((AttributeSet)p).getAttribute(key)); ++ ++ return null; ++ } ++ ++ public int getAttributeCount() ++ { ++ return attrs.length / 2; ++ } ++ ++ public Enumeration getAttributeNames() ++ { ++ return new Enumeration() ++ { ++ int i = 0; ++ public boolean hasMoreElements() ++ { ++ return i < attrs.length; ++ } ++ public Object nextElement() ++ { ++ i += 2; ++ return attrs[i-2]; ++ } ++ }; ++ } ++ ++ public AttributeSet getResolveParent() ++ { ++ return (AttributeSet) getAttribute(ResolveAttribute); ++ } ++ ++ public int hashCode() ++ { ++ return java.util.Arrays.asList(attrs).hashCode(); ++ } ++ ++ public boolean isDefined(Object key) ++ { ++ for (int i = 0; i < attrs.length; i += 2) ++ { ++ if (attrs[i].equals(key)) ++ return true; ++ } ++ return false; ++ } ++ ++ public boolean isEqual(AttributeSet attr) ++ { ++ return attr != null ++ && attr.containsAttributes(this) ++ && this.containsAttributes(attr); ++ } ++ ++ public String toString() ++ { ++ StringBuffer sb = new StringBuffer(); ++ sb.append("[StyleContext.SmallattributeSet:"); ++ for (int i = 0; i < attrs.length; ++i) ++ { ++ sb.append(" ("); ++ sb.append(attrs[i].toString()); ++ sb.append("="); ++ sb.append(attrs[i+1].toString()); ++ sb.append(")"); ++ } ++ sb.append("]"); ++ return sb.toString(); ++ } ++ } ++ ++ // FIXME: official javadocs suggest that these might be more usefully ++ // implemented using a WeakHashMap, but not sure if that works most ++ // places or whether it really matters anyways. ++ // ++ // FIXME: also not sure if these tables ought to be static (singletons), ++ // shared across all StyleContexts. I think so, but it's not clear in ++ // docs. revert to non-shared if you think it matters. ++ ++ public static final String DEFAULT_STYLE = "default"; ++ ++ static Hashtable sharedAttributeSets = new Hashtable(); ++ static Hashtable sharedFonts = new Hashtable(); ++ ++ static StyleContext defaultStyleContext = new StyleContext(); ++ static final int compressionThreshold = 9; ++ ++ EventListenerList listenerList; ++ Hashtable styleTable; ++ ++ public StyleContext() ++ { ++ listenerList = new EventListenerList(); ++ styleTable = new Hashtable(); ++ } ++ ++ protected SmallAttributeSet createSmallAttributeSet(AttributeSet a) ++ { ++ return new SmallAttributeSet(a); ++ } ++ ++ protected MutableAttributeSet createLargeAttributeSet(AttributeSet a) ++ { ++ return new SimpleAttributeSet(a); ++ } ++ ++ public void addChangeListener(ChangeListener listener) ++ { ++ listenerList.add(ChangeListener.class, listener); ++ } ++ ++ public void removeChangeListener(ChangeListener listener) ++ { ++ listenerList.remove(ChangeListener.class, listener); ++ } ++ ++ public ChangeListener[] getChangeListeners() ++ { ++ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); ++ } ++ ++ public Style addStyle(String name, Style parent) ++ { ++ Style newStyle = new NamedStyle(name, parent); ++ if (name != null) ++ styleTable.put(name, newStyle); ++ return newStyle; ++ } ++ ++ public void removeStyle(String name) ++ { ++ styleTable.remove(name); ++ } ++ ++ public Style getStyle(String name) ++ { ++ return (Style) styleTable.get(name); ++ } ++ ++ public Enumeration getStyleNames() ++ { ++ return styleTable.keys(); ++ } ++ ++ // ++ // StyleContexts only understand the "simple" model of fonts present in ++ // pre-java2d systems: fonts are a family name, a size (integral number ++ // of points), and a mask of style parameters (plain, bold, italic, or ++ // bold|italic). We have an inner class here called SimpleFontSpec which ++ // holds such triples. ++ // ++ // A SimpleFontSpec can be built for *any* AttributeSet because the size, ++ // family, and style keys in an AttributeSet have default values (defined ++ // over in StyleConstants). ++ // ++ // We keep a static cache mapping SimpleFontSpecs to java.awt.Fonts, so ++ // that we reuse Fonts between styles and style contexts. ++ // ++ ++ private static class SimpleFontSpec ++ { ++ String family; ++ int style; ++ int size; ++ public SimpleFontSpec(String family, ++ int style, ++ int size) ++ { ++ this.family = family; ++ this.style = style; ++ this.size = size; ++ } ++ public boolean equals(Object obj) ++ { ++ return (obj != null) ++ && (obj instanceof SimpleFontSpec) ++ && (((SimpleFontSpec)obj).family.equals(this.family)) ++ && (((SimpleFontSpec)obj).style == this.style) ++ && (((SimpleFontSpec)obj).size == this.size); ++ } ++ public int hashCode() ++ { ++ return family.hashCode() + style + size; ++ } ++ } ++ ++ public Font getFont(AttributeSet attr) ++ { ++ String family = StyleConstants.getFontFamily(attr); ++ int style = Font.PLAIN; ++ if (StyleConstants.isBold(attr)) ++ style += Font.BOLD; ++ if (StyleConstants.isItalic(attr)) ++ style += Font.ITALIC; ++ int size = StyleConstants.getFontSize(attr); ++ return getFont(family, style, size); ++ } ++ ++ public Font getFont(String family, int style, int size) ++ { ++ SimpleFontSpec spec = new SimpleFontSpec(family, style, size); ++ if (sharedFonts.containsKey(spec)) ++ return (Font) sharedFonts.get(spec); ++ else ++ { ++ Font tmp = new Font(family, style, size); ++ sharedFonts.put(spec, tmp); ++ return tmp; ++ } ++ } ++ ++ public FontMetrics getFontMetrics(Font f) ++ { ++ return Toolkit.getDefaultToolkit().getFontMetrics(f); ++ } ++ ++ public Color getForeground(AttributeSet a) ++ { ++ return StyleConstants.getForeground(a); ++ } ++ ++ public Color getBackground(AttributeSet a) ++ { ++ return StyleConstants.getBackground(a); ++ } ++ ++ protected int getCompressionThreshold() ++ { ++ return compressionThreshold; ++ } ++ ++ public static StyleContext getDefaultStyleContext() ++ { ++ return defaultStyleContext; ++ } ++ ++ public AttributeSet addAttribute(AttributeSet old, Object name, Object value) ++ { ++ if (old instanceof MutableAttributeSet) ++ { ++ ((MutableAttributeSet)old).addAttribute(name, value); ++ return old; ++ } ++ else ++ { ++ MutableAttributeSet mutable = createLargeAttributeSet(old); ++ mutable.addAttribute(name, value); ++ if (mutable.getAttributeCount() >= getCompressionThreshold()) ++ return mutable; ++ else ++ { ++ SmallAttributeSet small = createSmallAttributeSet(mutable); ++ if (sharedAttributeSets.containsKey(small)) ++ small = (SmallAttributeSet) sharedAttributeSets.get(small); ++ else ++ sharedAttributeSets.put(small,small); ++ return small; ++ } ++ } ++ } ++ ++ public AttributeSet addAttributes(AttributeSet old, AttributeSet attributes) ++ { ++ if (old instanceof MutableAttributeSet) ++ { ++ ((MutableAttributeSet)old).addAttributes(attributes); ++ return old; ++ } ++ else ++ { ++ MutableAttributeSet mutable = createLargeAttributeSet(old); ++ mutable.addAttributes(attributes); ++ if (mutable.getAttributeCount() >= getCompressionThreshold()) ++ return mutable; ++ else ++ { ++ SmallAttributeSet small = createSmallAttributeSet(mutable); ++ if (sharedAttributeSets.containsKey(small)) ++ small = (SmallAttributeSet) sharedAttributeSets.get(small); ++ else ++ sharedAttributeSets.put(small,small); ++ return small; ++ } ++ } ++ } ++ ++ public AttributeSet getEmptySet() ++ { ++ AttributeSet e = createSmallAttributeSet(null); ++ if (sharedAttributeSets.containsKey(e)) ++ e = (AttributeSet) sharedAttributeSets.get(e); ++ else ++ sharedAttributeSets.put(e, e); ++ return e; ++ } ++ ++ public void reclaim(AttributeSet attributes) ++ { ++ if (sharedAttributeSets.containsKey(attributes)) ++ sharedAttributeSets.remove(attributes); ++ } ++ ++ public AttributeSet removeAttribute(AttributeSet old, Object name) ++ { ++ if (old instanceof MutableAttributeSet) ++ { ++ ((MutableAttributeSet)old).removeAttribute(name); ++ if (old.getAttributeCount() < getCompressionThreshold()) ++ { ++ SmallAttributeSet small = createSmallAttributeSet(old); ++ if (!sharedAttributeSets.containsKey(small)) ++ sharedAttributeSets.put(small,small); ++ old = (AttributeSet) sharedAttributeSets.get(small); ++ } ++ return old; ++ } ++ else ++ { ++ MutableAttributeSet mutable = createLargeAttributeSet(old); ++ mutable.removeAttribute(name); ++ SmallAttributeSet small = createSmallAttributeSet(mutable); ++ if (sharedAttributeSets.containsKey(small)) ++ small = (SmallAttributeSet) sharedAttributeSets.get(small); ++ else ++ sharedAttributeSets.put(small,small); ++ return small; ++ } ++ } ++ ++ public AttributeSet removeAttributes(AttributeSet old, AttributeSet attributes) ++ { ++ return removeAttributes(old, attributes.getAttributeNames()); ++ } ++ ++ public AttributeSet removeAttributes(AttributeSet old, Enumeration names) ++ { ++ if (old instanceof MutableAttributeSet) ++ { ++ ((MutableAttributeSet)old).removeAttributes(names); ++ if (old.getAttributeCount() < getCompressionThreshold()) ++ { ++ SmallAttributeSet small = createSmallAttributeSet(old); ++ if (!sharedAttributeSets.containsKey(small)) ++ sharedAttributeSets.put(small,small); ++ old = (AttributeSet) sharedAttributeSets.get(small); ++ } ++ return old; ++ } ++ else ++ { ++ MutableAttributeSet mutable = createLargeAttributeSet(old); ++ mutable.removeAttributes(names); ++ SmallAttributeSet small = createSmallAttributeSet(mutable); ++ if (sharedAttributeSets.containsKey(small)) ++ small = (SmallAttributeSet) sharedAttributeSets.get(small); ++ else ++ sharedAttributeSets.put(small,small); ++ return small; ++ } ++ } ++ ++ ++ // FIXME: there's some sort of quasi-serialization stuff in here which I ++ // have left incomplete; I'm not sure I understand the intent properly. ++ ++ public static Object getStaticAttribute(Object key) ++ { ++ throw new InternalError("not implemented"); ++ } ++ ++ public static Object getStaticAttributeKey(Object key) ++ { ++ throw new InternalError("not implemented"); ++ } ++ ++ public static void readAttributeSet(ObjectInputStream in, MutableAttributeSet a) ++ throws ClassNotFoundException, IOException ++ { ++ throw new InternalError("not implemented"); ++ } ++ ++ public static void writeAttributeSet(ObjectOutputStream out, AttributeSet a) ++ throws IOException ++ { ++ throw new InternalError("not implemented"); ++ } ++ ++ public void readAttributes(ObjectInputStream in, MutableAttributeSet a) ++ throws ClassNotFoundException, IOException ++ { ++ throw new InternalError("not implemented"); ++ } ++ ++ public void writeAttributes(ObjectOutputStream out, AttributeSet a) ++ throws IOException ++ { ++ throw new InternalError("not implemented"); ++ } ++} +Index: javax/swing/text/StyledEditorKit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/StyledEditorKit.java,v +retrieving revision 1.3 +diff -u -r1.3 StyledEditorKit.java +--- javax/swing/text/StyledEditorKit.java 10 Jan 2004 21:07:44 -0000 1.3 ++++ javax/swing/text/StyledEditorKit.java 6 Sep 2004 16:36:10 -0000 +@@ -41,339 +41,242 @@ + import java.awt.event.ActionEvent; + import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; +-import java.io.InputStream; +-import java.io.OutputStream; +-import java.io.Reader; + import java.io.Serializable; +-import java.io.Writer; + import javax.swing.Action; + import javax.swing.JEditorPane; + import javax.swing.event.CaretEvent; + import javax.swing.event.CaretListener; + ++ + /** + * StyledEditorKit ++ * + * @author Andrew Selkirk +- * @version 1.0 + */ + public class StyledEditorKit extends DefaultEditorKit + { +- static final long serialVersionUID = 7002391892985555948L; +- +- //------------------------------------------------------------- +- // Classes ---------------------------------------------------- +- //------------------------------------------------------------- ++ private static final long serialVersionUID = 7002391892985555948L; + + /** + * UnderlineAction + */ +- public static class UnderlineAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class UnderlineAction extends StyledEditorKit.StyledTextAction ++ { + /** + * Constructor UnderlineAction + */ +- public UnderlineAction() { ++ public UnderlineAction() ++ { + super("TODO"); + // TODO +- } // UnderlineAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // UnderlineAction ++ } ++ } + + /** + * ItalicAction + */ +- public static class ItalicAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class ItalicAction extends StyledEditorKit.StyledTextAction ++ { + /** + * Constructor ItalicAction + */ +- public ItalicAction() { ++ public ItalicAction() ++ { + super("TODO"); + // TODO +- } // ItalicAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // ItalicAction ++ } ++ } + + /** + * BoldAction + */ +- public static class BoldAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class BoldAction extends StyledEditorKit.StyledTextAction ++ { + /** + * Constructor BoldAction + */ +- public BoldAction() { ++ public BoldAction() ++ { + super("TODO"); + // TODO +- } // BoldAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // BoldAction ++ } ++ } + + /** + * AlignmentAction + */ +- public static class AlignmentAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class AlignmentAction extends StyledEditorKit.StyledTextAction ++ { + /** + * a + */ + private int a; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor AlignmentAction + * @param nm TODO + * @param a TODO + */ +- public AlignmentAction(String nm, int a) { ++ public AlignmentAction(String nm, int a) ++ { + super("TODO"); + // TODO +- } // AlignmentAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // AlignmentAction ++ } ++ } + + /** + * ForegroundAction + */ +- public static class ForegroundAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class ForegroundAction extends StyledEditorKit.StyledTextAction ++ { + /** + * fg + */ + private Color fg; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor ForegroundAction + * @param nm TODO + * @param fg TODO + */ +- public ForegroundAction(String nm, Color fg) { ++ public ForegroundAction(String nm, Color fg) ++ { + super("TODO"); + // TODO +- } // ForegroundAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // ForegroundAction ++ } ++ } + + /** + * FontSizeAction + */ +- public static class FontSizeAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class FontSizeAction extends StyledEditorKit.StyledTextAction ++ { + /** + * size + */ + private int size; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor FontSizeAction + * @param nm TODO + * @param size TODO + */ +- public FontSizeAction(String nm, int size) { ++ public FontSizeAction(String nm, int size) ++ { + super("TODO"); + // TODO +- } // FontSizeAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // FontSizeAction ++ } ++ } + + /** + * FontFamilyAction + */ +- public static class FontFamilyAction extends StyledEditorKit.StyledTextAction { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- ++ public static class FontFamilyAction extends StyledEditorKit.StyledTextAction ++ { + /** + * family + */ + private String family; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor FontFamilyAction + * @param nm TODO + * @param family TODO + */ +- public FontFamilyAction(String nm, String family) { ++ public FontFamilyAction(String nm, String family) ++ { + super("TODO"); + // TODO +- } // FontFamilyAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * actionPerformed + * @param event TODO + */ +- public void actionPerformed(ActionEvent event) { ++ public void actionPerformed(ActionEvent event) ++ { + // TODO +- } // actionPerformed() +- +- +- } // FontFamilyAction ++ } ++ } + + /** + * StyledTextAction + */ +- public abstract static class StyledTextAction extends TextAction { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ public abstract static class StyledTextAction extends TextAction ++ { + /** + * Constructor StyledTextAction + * @param nm TODO + */ +- public StyledTextAction(String nm) { ++ public StyledTextAction(String nm) ++ { + super(nm); + // TODO +- } // StyledTextAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * getEditor + * @param event TODO + * @returns JEditorPane + */ +- protected final JEditorPane getEditor(ActionEvent event) { ++ protected final JEditorPane getEditor(ActionEvent event) ++ { + return null; // TODO +- } // getEditor() ++ } + + /** + * setCharacterAttributes +@@ -381,27 +284,32 @@ + * @param value1 TODO + * @param value2 TODO + */ +- protected final void setCharacterAttributes(JEditorPane value0, AttributeSet value1, boolean value2) { ++ protected final void setCharacterAttributes(JEditorPane value0, ++ AttributeSet value1, ++ boolean value2) ++ { + // TODO +- } // setCharacterAttributes() ++ } + + /** + * getStyledDocument + * @param value0 TODO + * @returns StyledDocument + */ +- protected final StyledDocument getStyledDocument(JEditorPane value0) { ++ protected final StyledDocument getStyledDocument(JEditorPane value0) ++ { + return null; // TODO +- } // getStyledDocument() ++ } + + /** + * getStyledEditorKit + * @param value0 TODO + * @returns StyledEditorKit + */ +- protected final StyledEditorKit getStyledEditorKit(JEditorPane value0) { ++ protected final StyledEditorKit getStyledEditorKit(JEditorPane value0) ++ { + return null; // TODO +- } // getStyledEditorKit() ++ } + + /** + * setParagraphAttributes +@@ -409,72 +317,53 @@ + * @param value1 TODO + * @param value2 TODO + */ +- protected final void setParagraphAttributes(JEditorPane value0, AttributeSet value1, boolean value2) { ++ protected final void setParagraphAttributes(JEditorPane value0, ++ AttributeSet value1, ++ boolean value2) ++ { + // TODO +- } // setParagraphAttributes() +- +- +- } // StyledTextAction ++ } ++ } + + /** + * StyledViewFactory + */ +- static class StyledViewFactory implements ViewFactory { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ static class StyledViewFactory ++ implements ViewFactory ++ { + /** + * Constructor StyledViewFactory + */ +- StyledViewFactory() { ++ StyledViewFactory() ++ { + // TODO +- } // StyledViewFactory() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * create + * @param value0 TODO + * @returns View + */ +- public View create(Element value0) { ++ public View create(Element value0) ++ { + return null; // TODO +- } // create() +- +- +- } // StyledViewFactory ++ } ++ } + + /** + * AttributeTracker + */ +- class AttributeTracker implements CaretListener, PropertyChangeListener, Serializable { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++ class AttributeTracker ++ implements CaretListener, PropertyChangeListener, Serializable ++ { + /** + * Constructor AttributeTracker + * @param value0 TODO + */ +- AttributeTracker(StyledEditorKit value0) { ++ AttributeTracker(StyledEditorKit value0) ++ { + // TODO +- } // AttributeTracker() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * updateInputAttributes +@@ -482,33 +371,29 @@ + * @param value1 TODO + * @param value2 TODO + */ +- void updateInputAttributes(int value0, int value1, JTextComponent value2) { ++ void updateInputAttributes(int value0, int value1, JTextComponent value2) ++ { + // TODO +- } // updateInputAttributes() ++ } + + /** + * propertyChange + * @param value0 TODO + */ +- public void propertyChange(PropertyChangeEvent value0) { ++ public void propertyChange(PropertyChangeEvent value0) ++ { + // TODO +- } // propertyChange() ++ } + + /** + * caretUpdate + * @param value0 TODO + */ +- public void caretUpdate(CaretEvent value0) { ++ public void caretUpdate(CaretEvent value0) ++ { + // TODO +- } // caretUpdate() +- +- +- } // AttributeTracker +- +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- ++ } ++ } + + /** + * currentRun +@@ -525,96 +410,93 @@ + */ + MutableAttributeSet inputAttributes; + +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- + /** + * Constructor StyledEditorKit + */ +- public StyledEditorKit() { ++ public StyledEditorKit() ++ { + // TODO +- } // StyledEditorKit() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ } + + /** + * clone + * @returns Object + */ +- public Object clone() { ++ public Object clone() ++ { + return null; // TODO +- } // clone() ++ } + + /** + * getActions + * @returns Action[] + */ +- public Action[] getActions() { ++ public Action[] getActions() ++ { + return null; // TODO +- } // getActions() ++ } + + /** + * getInputAttributes + * @returns MutableAttributeSet + */ +- public MutableAttributeSet getInputAttributes() { ++ public MutableAttributeSet getInputAttributes() ++ { + return null; // TODO +- } // getInputAttributes() ++ } + + /** + * getCharacterAttributeRun + * @returns Element + */ +- public Element getCharacterAttributeRun() { ++ public Element getCharacterAttributeRun() ++ { + return null; // TODO +- } // getCharacterAttributeRun() ++ } + + /** + * createDefaultDocument + * @returns Document + */ +- public Document createDefaultDocument() { ++ public Document createDefaultDocument() ++ { + return null; // TODO +- } // createDefaultDocument() ++ } + + /** + * install + * @param component TODO + */ +- public void install(JEditorPane component) { ++ public void install(JEditorPane component) ++ { + // TODO +- } // install() ++ } + + /** + * deinstall + * @param component TODO + */ +- public void deinstall(JEditorPane component) { ++ public void deinstall(JEditorPane component) ++ { + // TODO +- } // deinstall() ++ } + + /** + * getViewFactory + * @returns ViewFactory + */ +- public ViewFactory getViewFactory() { ++ public ViewFactory getViewFactory() ++ { + return null; // TODO +- } // getViewFactory() ++ } + + /** + * createInputAttributes + * @param element TODO + * @param set TODO + */ +- protected void createInputAttributes(Element element, +- MutableAttributeSet set) { ++ protected void createInputAttributes(Element element, MutableAttributeSet set) ++ { + // TODO +- } // createInputAttributes() +- +- +-} // StyledEditorKit ++ } ++} +Index: javax/swing/text/TabExpander.java +=================================================================== +RCS file: javax/swing/text/TabExpander.java +diff -N javax/swing/text/TabExpander.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/TabExpander.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,43 @@ ++/* TabExpander.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++public interface TabExpander ++{ ++ float nextTabStop(float x, int tabOffset); ++} +\ No newline at end of file +Index: javax/swing/text/TabSet.java +=================================================================== +RCS file: javax/swing/text/TabSet.java +diff -N javax/swing/text/TabSet.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/TabSet.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,102 @@ ++/* TabSet.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.io.Serializable; ++ ++public class TabSet implements Serializable ++{ ++ TabStop[] tabs; ++ ++ public TabSet(TabStop[] t) ++ { ++ tabs = t; ++ } ++ ++ public TabStop getTab(int i) ++ { ++ return tabs[i]; ++ } ++ ++ public TabStop getTabAfter(float location) ++ { ++ int idx = getTabIndexAfter(location); ++ if (idx == -1) ++ return null; ++ else ++ return tabs[idx]; ++ } ++ ++ public int getTabCount() ++ { ++ return tabs.length; ++ } ++ ++ public int getTabIndex(TabStop tab) ++ { ++ for (int i = 0; i < tabs.length; ++i) ++ if (tabs[i] == tab) ++ return i; ++ return -1; ++ } ++ ++ public int getTabIndexAfter(float location) ++ { ++ int idx = -1; ++ for (int i = 0; i < tabs.length; ++i) ++ { ++ if (location < tabs[i].getPosition()) ++ idx = i; ++ } ++ return idx; ++ } ++ ++ public String toString() ++ { ++ StringBuffer sb = new StringBuffer(); ++ sb.append("["); ++ for (int i = 0; i < tabs.length; ++i) ++ { ++ if (i != 0) ++ sb.append(" - "); ++ sb.append(tabs[i].toString()); ++ } ++ sb.append("]"); ++ return sb.toString(); ++ } ++} +Index: javax/swing/text/TabStop.java +=================================================================== +RCS file: javax/swing/text/TabStop.java +diff -N javax/swing/text/TabStop.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/TabStop.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,133 @@ ++/* TabSet.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++import java.io.Serializable; ++ ++public class TabStop implements Serializable ++{ ++ public static final int ALIGN_LEFT = 0; ++ public static final int ALIGN_RIGHT = 1; ++ public static final int ALIGN_CENTER = 2; ++ public static final int ALIGN_DECIMAL = 4; ++ public static final int ALIGN_BAR = 5; ++ ++ public static final int LEAD_NONE = 0; ++ public static final int LEAD_DOTS = 1; ++ public static final int LEAD_HYPHENS = 2; ++ public static final int LEAD_UNDERLINE = 3; ++ public static final int LEAD_THICKLINE = 4; ++ public static final int LEAD_EQUALS = 5; ++ ++ float pos; ++ int align; ++ int leader; ++ ++ public TabStop(float pos) ++ { ++ this(pos, ALIGN_LEFT, LEAD_NONE); ++ } ++ ++ public TabStop(float pos, int align, int leader) ++ { ++ this.pos = pos; ++ this.align = align; ++ this.leader = leader; ++ } ++ ++ public boolean equals(Object other) ++ { ++ return (other != null) ++ && (other instanceof TabStop) ++ && (((TabStop)other).getPosition() == this.getPosition()) ++ && (((TabStop)other).getLeader() == this.getLeader()) ++ && (((TabStop)other).getAlignment() == this.getAlignment()); ++ } ++ ++ public int getAlignment() ++ { ++ return align; ++ } ++ ++ public int getLeader() ++ { ++ return leader; ++ } ++ ++ public float getPosition() ++ { ++ return pos; ++ } ++ ++ public int hashCode() ++ { ++ return (int) pos + (int) leader + (int) align; ++ } ++ ++ public String toString() ++ { ++ String prefix = ""; ++ switch (align) ++ { ++ case ALIGN_LEFT: ++ prefix = "left "; ++ break; ++ case ALIGN_RIGHT: ++ prefix = "right "; ++ break; ++ ++ case ALIGN_CENTER: ++ prefix = "center "; ++ break; ++ ++ case ALIGN_DECIMAL: ++ prefix = "decimal "; ++ break; ++ ++ case ALIGN_BAR: ++ prefix = "bar "; ++ break; ++ ++ default: ++ break; ++ } ++ ++ return (prefix + "tab @" + pos + ((leader == LEAD_NONE) ? "" : "(w/leaders)")); ++ } ++ ++} +Index: javax/swing/text/TabableView.java +=================================================================== +RCS file: javax/swing/text/TabableView.java +diff -N javax/swing/text/TabableView.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/TabableView.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,44 @@ ++/* TabableView.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package javax.swing.text; ++ ++public interface TabableView ++{ ++ float getPartialSpan(int p0, int p1); ++ float getTabbedSpan(float x, TabExpander expander); ++} +Index: javax/swing/text/TextAction.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/TextAction.java,v +retrieving revision 1.2 +diff -u -r1.2 TextAction.java +--- javax/swing/text/TextAction.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/TextAction.java 6 Sep 2004 16:36:10 -0000 +@@ -41,56 +41,53 @@ + import javax.swing.AbstractAction; + import javax.swing.Action; + ++ + /** + * TextAction + * @author Andrew Selkirk +- * @version 1.0 + */ +-public abstract class TextAction extends AbstractAction { +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- ++public abstract class TextAction extends AbstractAction ++{ + /** + * Constructor TextAction + * @param name TODO + */ +- public TextAction(String name) { +- // TODO +- } // TextAction() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- ++ public TextAction(String name) ++ { ++ super(name); ++ } + + /** + * getTextComponent + * @param event TODO +- * @returns JTextComponent ++ * @return JTextComponent + */ +- protected final JTextComponent getTextComponent(ActionEvent event) { +- return null; // TODO +- } // getTextComponent() ++ protected final JTextComponent getTextComponent(ActionEvent event) ++ { ++ if (event.getSource() != null && ++ event.getSource() instanceof JTextComponent) ++ return (JTextComponent) event.getSource(); ++ else ++ return getFocusedComponent(); ++ } + + /** + * augmentList + * @param list1 TODO + * @param list2 TODO +- * @returns Action[] ++ * @return Action[] + */ +- public static final Action[] augmentList(Action[] list1, Action[] list2) { ++ public static final Action[] augmentList(Action[] list1, Action[] list2) ++ { + return null; // TODO +- } // augmentList() ++ } + + /** + * getFocusedComponent +- * @returns JTextComponent ++ * @return JTextComponent + */ +- protected final JTextComponent getFocusedComponent() { ++ protected final JTextComponent getFocusedComponent() ++ { + return null; // TODO +- } // getFocusedComponent() +- +- +-} // TextAction ++ } ++} +Index: javax/swing/text/Utilities.java +=================================================================== +RCS file: javax/swing/text/Utilities.java +diff -N javax/swing/text/Utilities.java +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ javax/swing/text/Utilities.java 6 Sep 2004 16:36:10 -0000 +@@ -0,0 +1,182 @@ ++/* Utilities.java -- ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package javax.swing.text; ++ ++import java.awt.FontMetrics; ++import java.awt.Graphics; ++ ++/** ++ * A set of utilities to deal with text. This is used by several other classes ++ * inside this package. ++ * ++ * @author Roman Kennke ++ */ ++public class Utilities ++{ ++ /** ++ * The length of the char buffer that holds the characters to be drawn. ++ */ ++ private static final int BUF_LENGTH = 64; ++ ++ /** ++ * Creates a new Utilities object. ++ */ ++ public Utilities() ++ { ++ // Nothing to be done here. ++ } ++ ++ /** ++ * Draws the given text segment. Contained tabs and newline characters ++ * are taken into account. Tabs are expanded using the ++ * specified {@link TabExpander}. ++ * ++ * @param s the text fragment to be drawn. ++ * @param x the x position for drawing. ++ * @param y the y position for drawing. ++ * @param g the {@link Graphics} context for drawing. ++ * @param e the {@link TabExpander} which specifies the Tab-expanding ++ * technique. ++ * @param startOffset starting offset in the text. ++ * @return the x coordinate at the end of the drawn text. ++ */ ++ public static final int drawTabbedText(Segment s, int x, int y, Graphics g, ++ TabExpander e, int startOffset) ++ { ++ // This buffers the chars to be drawn. ++ char[] buffer = s.array; ++ ++ ++ // The current x and y pixel coordinates. ++ int pixelX = x; ++ int pixelY = y; ++ ++ // The font metrics of the current selected font. ++ FontMetrics metrics = g.getFontMetrics(); ++ int ascent = metrics.getAscent(); ++ ++ for (int offset = s.offset; offset < (s.offset + s.count); ++offset) ++ { ++ switch (buffer[offset]) ++ { ++ case '\t': ++ // In case we have a tab, we just 'jump' over the tab. ++ // When we have no tab expander we just use the width of 'm'. ++ if (e != null) ++ pixelX = (int) e.nextTabStop((float) pixelX, ++ startOffset + offset - s.offset); ++ else ++ pixelX += metrics.charWidth(' '); ++ break; ++ case '\n': ++ // In case we have a newline, we must draw ++ // the buffer and jump on the next line. ++ g.drawChars(buffer, offset, 1, pixelX, y); ++ pixelY += metrics.getHeight(); ++ pixelX = x; ++ break; ++ default: ++ // Here we draw the char. ++ g.drawChars(buffer, offset, 1, pixelX, pixelY + ascent); ++ pixelX += metrics.charWidth(buffer[offset]); ++ break; ++ } ++ } ++ ++ return pixelX; ++ } ++ ++ /** ++ * Determines the width, that the given text s would take ++ * if it was printed with the given {@link java.awt.FontMetrics} on the ++ * specified screen position. ++ * @param s the text fragment ++ * @param metrics the font metrics of the font to be used ++ * @param x the x coordinate of the point at which drawing should be done ++ * @param e the {@link TabExpander} to be used ++ * @param startOffset the index in s where to start ++ * @returns the width of the given text s. This takes tabs and newlines ++ * into account. ++ */ ++ public static final int getTabbedTextWidth(Segment s, FontMetrics metrics, ++ int x, TabExpander e, ++ int startOffset) ++ { ++ // This buffers the chars to be drawn. ++ char[] buffer = s.array; ++ ++ // The current x coordinate. ++ int pixelX = x; ++ ++ // The current maximum width. ++ int maxWidth = 0; ++ ++ for (int offset = s.offset; offset < (s.offset + s.count); ++offset) ++ { ++ switch (buffer[offset]) ++ { ++ case '\t': ++ // In case we have a tab, we just 'jump' over the tab. ++ // When we have no tab expander we just use the width of 'm'. ++ if (e != null) ++ pixelX = (int) e.nextTabStop((float) pixelX, ++ startOffset + offset - s.offset); ++ else ++ pixelX += metrics.charWidth(' '); ++ break; ++ case '\n': ++ // In case we have a newline, we must 'draw' ++ // the buffer and jump on the next line. ++ pixelX += metrics.charWidth(buffer[offset]); ++ maxWidth = Math.max(maxWidth, pixelX - x); ++ pixelX = x; ++ break; ++ default: ++ // Here we draw the char. ++ pixelX += metrics.charWidth(buffer[offset]); ++ break; ++ } ++ } ++ ++ // Take the last line into account. ++ maxWidth = Math.max(maxWidth, pixelX - x); ++ ++ return maxWidth; ++ } ++} +Index: javax/swing/text/View.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/View.java,v +retrieving revision 1.2 +diff -u -r1.2 View.java +--- javax/swing/text/View.java 10 Jan 2004 21:07:44 -0000 1.2 ++++ javax/swing/text/View.java 6 Sep 2004 16:36:10 -0000 +@@ -37,6 +37,7 @@ + + package javax.swing.text; + ++import java.awt.Container; + import java.awt.Graphics; + import java.awt.Shape; + import java.util.Vector; +@@ -44,97 +45,165 @@ + + public abstract class View implements SwingConstants + { +- static int BadBreakWeight; +- static int ExcellentBreakWeight; +- static int ForcedBreakWeight; +- static int GoodBreakWeight; +- +- public final static int X_AXIS = 0; +- public final static int Y_AXIS = 1; +- +- float width, height; +- Element elt; +- View parent; ++ public static final int BadBreakWeight = 0; ++ public static final int ExcellentBreakWeight = 2000; ++ public static final int ForcedBreakWeight = 3000; ++ public static final int GoodBreakWeight = 1000; ++ ++ public static final int X_AXIS = 0; ++ public static final int Y_AXIS = 1; ++ ++ private float width, height; ++ private Element elt; ++ private View parent; + + /** +- * this vector contains the views ordered at offsets... ++ * Creates a new View instance. ++ * ++ * @param elem an Element value + */ +- Vector v = new Vector(); +- +- + public View(Element elem) + { + elt = elem; + } + +- public int getViewCount() ++ public abstract void paint(Graphics g, Shape s); ++ ++ public void setParent(View a) + { +- return v.size(); ++ parent = a; + } + +- public View getView(int a) ++ public View getParent() + { +- return (View) v.get(a); ++ return parent; + } + +- public void remove(int i) ++ public void setSize(int w, int h) + { +- v.removeElementAt(i); ++ width = w; ++ height = h; + } + +- public void insert(int off, View view) ++ public Container getContainer() + { +- v.insertElementAt(view, off); ++ return parent != null ? parent.getContainer() : null; + } + +- public void append(View view) ++ public Document getDocument() + { +- v.addElement(view); ++ return getElement().getDocument(); + } + +- public void paint(Graphics g, Shape allocation) ++ public Element getElement() + { +- System.out.println("view.paint() !!!!"); ++ return elt; + } + +- public void setParent(View a) ++ public abstract float getPreferredSpan(int axis); ++ ++ public float getAlignment(int axis) + { +- parent = a; ++ return 0.5f; + } + +- public View getParent() ++ public AttributeSet getAttributes() + { +- return parent; ++ return elt.getAttributes(); + } + +- public void setSize(int w, int h) ++ public boolean isVisible() + { +- width = w; +- height = h; ++ return true; + } + +- public Document getDocument() ++ public int getViewCount() + { +- return getElement().getDocument(); ++ return 0; + } + +- public Element getElement() ++ public View getView(int index) + { +- return elt; ++ return null; + } + +- public float getPreferredSpan(int a) ++ public ViewFactory getViewFactory() + { +- switch (a) ++ return parent != null ? parent.getViewFactory() : null; ++ } ++ ++ public void replace(int offset, int length, View[] views) + { +- case X_AXIS: return width; +- case Y_AXIS: return height; +- default: ++ // Default implementation does nothing. ++ } ++ ++ public void insert(int offset, View view) + { +- System.err.println("I sure wish Java had enums !!! "); +- return 0; ++ View[] array = { view }; ++ replace(offset, 1, array); + } ++ ++ public void append(View view) ++ { ++ View[] array = { view }; ++ replace(getViewCount(), 1, array); ++ } ++ ++ public void removeAll() ++ { ++ replace(0, getViewCount(), null); + } +- } ++ ++ public void remove(int index) ++ { ++ replace(index, 1, null); ++ } ++ ++ public View createFragment(int p0, int p1) ++ { ++ // The default implementation doesn't support fragmentation. ++ return this; ++ } ++ ++ public int getStartOffset() ++ { ++ return elt.getStartOffset(); ++ } ++ ++ public int getEndOffset() ++ { ++ return elt.getEndOffset(); ++ } ++ ++ public Shape getChildAllocation(int index, Shape a) ++ { ++ return null; ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ public int getViewIndex(float x, float y, Shape allocation) ++ { ++ return -1; ++ } ++ ++ /** ++ * @since 1.4 ++ */ ++ public String getToolTipText(float x, float y, Shape allocation) ++ { ++ int index = getViewIndex(x, y, allocation); ++ ++ if (index < -1) ++ return null; ++ ++ Shape childAllocation = getChildAllocation(index, allocation); ++ ++ if (childAllocation.getBounds().contains(x, y)) ++ return getView(index).getToolTipText(x, y, childAllocation); ++ ++ return null; ++ } + } + +Index: javax/swing/text/ViewFactory.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/text/ViewFactory.java,v +retrieving revision 1.2 +diff -u -r1.2 ViewFactory.java +--- javax/swing/text/ViewFactory.java 12 Oct 2003 13:33:32 -0000 1.2 ++++ javax/swing/text/ViewFactory.java 6 Sep 2004 16:36:10 -0000 +@@ -1,5 +1,5 @@ + /* ViewFactory.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,5 +39,12 @@ + + public interface ViewFactory + { ++ /** ++ * Creates a view for a given element. ++ * ++ * @param elem them element to create view for ++ * ++ * @return a new created view ++ */ + View create (Element elem); + } +Index: javax/swing/tree/DefaultMutableTreeNode.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/tree/DefaultMutableTreeNode.java,v +retrieving revision 1.4 +diff -u -r1.4 DefaultMutableTreeNode.java +--- javax/swing/tree/DefaultMutableTreeNode.java 12 Oct 2003 13:33:32 -0000 1.4 ++++ javax/swing/tree/DefaultMutableTreeNode.java 6 Sep 2004 16:36:10 -0000 +@@ -997,17 +997,17 @@ + public int getLeafCount() { + + // Variables +- Enumeration enum; ++ Enumeration e; + int count; + TreeNode current; + + // Get Enumeration of all descendants +- enum = depthFirstEnumeration(); ++ e = depthFirstEnumeration(); + + // Process Nodes + count = 0; +- while (enum.hasMoreElements() == true) { +- current = (TreeNode) enum.nextElement(); ++ while (e.hasMoreElements() == true) { ++ current = (TreeNode) e.nextElement(); + if (current.isLeaf() == true) { + count++; + } // if +Index: javax/swing/tree/DefaultTreeCellEditor.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/tree/DefaultTreeCellEditor.java,v +retrieving revision 1.2 +diff -u -r1.2 DefaultTreeCellEditor.java +--- javax/swing/tree/DefaultTreeCellEditor.java 11 Jun 2003 13:20:41 -0000 1.2 ++++ javax/swing/tree/DefaultTreeCellEditor.java 6 Sep 2004 16:36:11 -0000 +@@ -1,5 +1,5 @@ + /* DefaultTreeCellEditor.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -50,12 +50,12 @@ + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.util.EventObject; ++ + import javax.swing.Icon; + import javax.swing.JTextField; + import javax.swing.JTree; + import javax.swing.border.Border; + import javax.swing.event.CellEditorListener; +-import javax.swing.event.EventListenerList; + import javax.swing.event.TreeSelectionEvent; + import javax.swing.event.TreeSelectionListener; + +Index: javax/swing/undo/CompoundEdit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/undo/CompoundEdit.java,v +retrieving revision 1.4 +diff -u -r1.4 CompoundEdit.java +--- javax/swing/undo/CompoundEdit.java 11 Jan 2004 12:40:49 -0000 1.4 ++++ javax/swing/undo/CompoundEdit.java 6 Sep 2004 16:36:11 -0000 +@@ -45,17 +45,18 @@ + * UndoableEdits. + * + *

    The use of a CompoundEdit is divided in two separate +- * phases. +- * +- *

    1. In the first phase, the CompoundEdit is +- * initialized. After a new instance of CompoundEdit has +- * been created, {@link #addEdit(UndoableEdit)} is called for each +- * element of the compound. To terminate the initialization phase, +- * call {@link #end()}.
    2. ++ * phases.

      + * ++ *
        ++ *
      1. In the first phase, the CompoundEdit is ++ * initialized. After a new instance of CompoundEdit has ++ * been created, {@link #addEdit(UndoableEdit)} is called for each ++ * element of the compound. To terminate the initialization phase, ++ * call {@link #end()}.
      2. + *
      3. In the second phase, the the CompoundEdit can be +- * used, typically by invoking {@link #undo()} and {@link +- * #redo()}.
      ++ * used, typically by invoking {@link #undo()} and ++ * {@link #redo()}. ++ *
    + * + * @author Andrew Selkirk (aselkirk@sympatico.ca) + * @author Sascha Brawer (brawer@dandelis.ch) +Index: javax/swing/undo/StateEdit.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/undo/StateEdit.java,v +retrieving revision 1.4 +diff -u -r1.4 StateEdit.java +--- javax/swing/undo/StateEdit.java 26 Nov 2003 22:23:40 -0000 1.4 ++++ javax/swing/undo/StateEdit.java 6 Sep 2004 16:36:11 -0000 +@@ -44,52 +44,54 @@ + /** + * A helper class, making it easy to support undo and redo. + * +- *

    The following example shows how to use this class. ++ *

    The following example shows how to use this class.

    + * +- *
      Foo foo; // class Foo implements {@link StateEditable}
    +- *  StateEdit edit;
    +- *
    +- *  edit = new StateEdit(foo, "Name Change");
    +- *  foo.setName("Jane Doe");
    +- *  edit.end();
    +- *  undoManager.addEdit(edit);
    ++ *
    ++ * Foo foo; // class Foo implements {@link StateEditable}
    ++ * StateEdit edit;
    ++ *
    ++ * edit = new StateEdit(foo, "Name Change");
    ++ * foo.setName("Jane Doe");
    ++ * edit.end();
    ++ * undoManager.addEdit(edit);
    ++ * 
    + * + *

    If Foo’s implementation of {@link + * StateEditable} considers the name as part of the editable state, + * the user can now choose “Undo Name Change” or + * “Redo Name Change” from the respective menu. No +- * further undo support is needed from the application. +- * +- *

    The following explains what happens in the example. ++ * further undo support is needed from the application.

    + * +- *

    1. When a StateEdit is created, the associated +- * {@link StateEditable} gets asked to store its state into a hash +- * table, {@link #preState}.
    2. ++ *

      The following explains what happens in the example.

      + * ++ *
        ++ *
      1. When a StateEdit is created, the associated ++ * {@link StateEditable} gets asked to store its state into a hash ++ * table, {@link #preState}.
      2. + *
      3. The application will now perform some changes to the edited +- * object. This typically happens by invoking methods on the edited +- * object.
      4. +- * ++ * object. This typically happens by invoking methods on the edited ++ * object. + *
      5. The editing phase is terminated by invoking the {@link #end()} +- * method of the StateEdit. The end() method +- * does two things. +- * +- *
        • The edited object receives a second request for storing +- * its state. This time, it will use a different hash table, {@link +- * #postState}.
        • +- * +- *
        • To increase efficiency, the StateEdit now removes +- * any entries from {@link #preState} and {@link #postState} that have +- * the same key, and whose values are equal. Equality is determined +- * by invoking the equals method inherited from +- * {@link java.lang.Object}.
      6. ++ * method of the StateEdit. The end() method ++ * does two things. + * ++ *
          ++ *
        • The edited object receives a second request for storing ++ * its state. This time, it will use a different hash table, {@link ++ * #postState}.
        • ++ *
        • To increase efficiency, the StateEdit now removes ++ * any entries from {@link #preState} and {@link #postState} that have ++ * the same key, and whose values are equal. Equality is determined ++ * by invoking the equals method inherited from ++ * {@link java.lang.Object}.
        • ++ *
        + *
      7. When the user later chooses to undo the StateEdit, + * the edited object is asked to {@linkplain StateEditable#restoreState + * restore its state} from the {@link #preState} table. Similarly, + * when the user chooses to redo the StateEdit, + * the edited object gets asked to restore its state from the {@link +- * #postState}.
      ++ * #postState}. ++ *
    + * + * @author Andrew Selkirk (aselkirk@sympatico.ca) + * @author Sascha Brawer (brawer@dandelis.ch) +Index: javax/swing/undo/UndoManager.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/javax/swing/undo/UndoManager.java,v +retrieving revision 1.2 +diff -u -r1.2 UndoManager.java +--- javax/swing/undo/UndoManager.java 11 Jun 2003 13:20:41 -0000 1.2 ++++ javax/swing/undo/UndoManager.java 6 Sep 2004 16:36:11 -0000 +@@ -1,5 +1,5 @@ + /* AbstractTableModel.java -- +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,223 +38,588 @@ + + package javax.swing.undo; + ++import javax.swing.UIManager; + import javax.swing.event.UndoableEditEvent; + import javax.swing.event.UndoableEditListener; + ++ + /** +- * UndoManager +- * @author Andrew Selkirk ++ * A manager for providing an application’s undo/redo ++ * functionality. ++ * ++ *

    Tyipcally, an application will create only one single instance ++ * of UndoManager. When the user performs an undoable action, for ++ * instance changing the color of an object from green to blue, the ++ * application registers an {@link UndoableEdit} object with the ++ * UndoManager. To implement the “undo” and ++ * “redo” menu commands, the application invokes the ++ * UndoManager’s {@link #undo} and {@link #redo} methods. The ++ * human-readable text of these menu commands is provided by {@link ++ * #getUndoPresentationName} and {@link #getRedoPresentationName}, ++ * respectively. To determine whether the menu item should be ++ * selectable or greyed out, use {@link #canUndo} and {@link ++ * #canRedo}. ++ * ++ *

    The UndoManager will only keep a specified number of editing ++ * actions, the limit. The value of this parameter can be ++ * retrieved by calling {@link #getLimit} and set with {@link ++ * #setLimit}. If more UndoableEdits are added to the UndoManager, ++ * the oldest actions will be discarded. ++ * ++ *

    Some applications do not provide separate menu commands for ++ * “undo” and “redo.” Instead, they ++ * have just a single command whose text switches between the two. ++ * Such applications would use an UndoManager with a limit ++ * of 1. The text of this combined menu item is available via ++ * {@link #getUndoOrRedoPresentationName}, and it is implemented ++ * by calling {@link #undoOrRedo}. ++ * ++ *

    Thread Safety: In constrast to the other classes of the ++ * javax.swing.undo package, the public methods of an ++ * UndoManager are safe to call from concurrent threads. ++ * The caller does not need to perform external synchronization, and ++ * {@link javax.swing.event.UndoableEvent} sources do not need to ++ * broadcast their events from inside the Swing worker thread. ++ * ++ * @author Sascha Brawer + */ +-public class UndoManager extends CompoundEdit implements UndoableEditListener { +- +- //------------------------------------------------------------- +- // Variables -------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * indexOfNextAdd +- */ +- int indexOfNextAdd; +- +- /** +- * limit +- */ +- int limit; +- +- +- //------------------------------------------------------------- +- // Initialization --------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * Constructor UndoManager +- */ +- public UndoManager() { +- // TODO +- } // UndoManager() +- +- +- //------------------------------------------------------------- +- // Methods ---------------------------------------------------- +- //------------------------------------------------------------- +- +- /** +- * toString +- * @returns String +- */ +- public String toString() { +- return null; // TODO +- } // toString() +- +- /** +- * end +- */ +- public synchronized void end() { +- // TODO +- } // end() +- +- /** +- * getLimit +- * @returns int +- */ +- public synchronized int getLimit() { +- return 0; // TODO +- } // getLimit() +- +- /** +- * discardAllEdits +- */ +- public synchronized void discardAllEdits() { +- // TODO +- } // discardAllEdits() +- +- /** +- * trimForLimit +- */ +- protected void trimForLimit() { +- // TODO +- } // trimForLimit() +- +- /** +- * trimEdits +- * @param value0 TODO +- * @param value1 TODO +- */ +- protected void trimEdits(int value0, int value1) { +- // TODO +- } // trimEdits() +- +- /** +- * setLimit +- * @param value0 TODO +- */ +- public synchronized void setLimit(int value0) { +- // TODO +- } // setLimit() +- +- /** +- * editToBeUndone +- * @returns UndoableEdit +- */ +- protected UndoableEdit editToBeUndone() { +- return null; // TODO +- } // editToBeUndone() +- +- /** +- * editToBeRedone +- * @returns UndoableEdit +- */ +- protected UndoableEdit editToBeRedone() { +- return null; // TODO +- } // editToBeRedone() +- +- /** +- * undoTo +- * @param value0 TODO +- * @exception CannotUndoException TODO +- */ +- protected void undoTo(UndoableEdit value0) throws CannotUndoException { +- // TODO +- } // undoTo() +- +- /** +- * redoTo +- * @param value0 TODO +- * @exception CannotRedoException TODO +- */ +- protected void redoTo(UndoableEdit value0) throws CannotRedoException { +- // TODO +- } // redoTo() +- +- /** +- * undoOrRedo +- * @exception CannotRedoException TODO +- * @exception CannotUndoException TODO +- */ +- public synchronized void undoOrRedo() throws CannotRedoException, CannotUndoException { +- // TODO +- } // undoOrRedo() +- +- /** +- * canUndoOrRedo +- * @returns boolean +- */ +- public synchronized boolean canUndoOrRedo() { +- return false; // TODO +- } // canUndoOrRedo() +- +- /** +- * undo +- * @exception CannotUndoException TODO +- */ +- public synchronized void undo() throws CannotUndoException { +- // TODO +- } // undo() +- +- /** +- * canUndo +- * @returns boolean +- */ +- public synchronized boolean canUndo() { +- return false; // TODO +- } // canUndo() +- +- /** +- * redo +- * @exception CannotRedoException TODO +- */ +- public synchronized void redo() throws CannotRedoException { +- // TODO +- } // redo() +- +- /** +- * canRedo +- * @returns boolean +- */ +- public synchronized boolean canRedo() { +- return false; // TODO +- } // canRedo() +- +- /** +- * addEdit +- * @param value0 TODO +- * @returns boolean +- */ +- public synchronized boolean addEdit(UndoableEdit value0) { +- return false; // TODO +- } // addEdit() +- +- /** +- * getUndoOrRedoPresentationName +- * @returns String +- */ +- public synchronized String getUndoOrRedoPresentationName() { +- return null; // TODO +- } // getUndoOrRedoPresentationName() +- +- /** +- * getUndoPresentationName +- * @returns String +- */ +- public synchronized String getUndoPresentationName() { +- return null; // TODO +- } // getUndoPresentationName() +- +- /** +- * getRedoPresentationName +- * @returns String +- */ +- public synchronized String getRedoPresentationName() { +- return null; // TODO +- } // getRedoPresentationName() +- +- /** +- * undoableEditHappened +- * @param value0 TODO +- */ +- public void undoableEditHappened(UndoableEditEvent value0) { +- // TODO +- } // undoableEditHappened() +- +- +-} // UndoManager ++public class UndoManager ++ extends CompoundEdit ++ implements UndoableEditListener ++{ ++ /** ++ * The unique ID for serializing instances of this class. Determined ++ * using the serialver tool of Sun JDK 1.4.1_01 on ++ * GNU/Linux. ++ */ ++ static final long serialVersionUID = -2077529998244066750L; ++ ++ ++ /** ++ * An index into the inherited {@link #edits} Vector that indicates ++ * at which position newly added editing actions would get inserted. ++ * ++ *

    Normally, the value of indexOfNextAdd equals ++ * the number of UndoableEdits stored by this UndoManager, i.e. ++ * edits.size(). For each call to {@link #undo}, ++ * indexOfNextAdd is decremented by one. For each ++ * call to {@link #redo}, it is incremented again. ++ */ ++ int indexOfNextAdd; ++ ++ ++ /** ++ * The maximum number of UndoableEdits stored by this UndoManager. ++ */ ++ int limit; ++ ++ ++ /** ++ * Constructs an UndoManager. ++ * ++ *

    The limit of the freshly constructed UndoManager ++ * is 100. ++ */ ++ public UndoManager() ++ { ++ limit = 100; ++ } ++ ++ ++ /** ++ * Returns a string representation for this UndoManager. This may be ++ * useful for debugging purposes. For the text of menu items, please ++ * refer to {@link #getUndoPresentationName}, {@link ++ * #getRedoPresentationName}, and {@link ++ * #getUndoOrRedoPresentationName}. ++ */ ++ public String toString() ++ { ++ return super.toString() ++ + " limit: " + limit ++ + " indexOfNextAdd: " + indexOfNextAdd; ++ } ++ ++ ++ /** ++ * Puts this UndoManager into a state where it acts as a normal ++ * {@link CompoundEdit}. It is unlikely that an application would ++ * want to do this. ++ */ ++ public synchronized void end() ++ { ++ super.end(); ++ trimEdits(indexOfNextAdd, edits.size() - 1); ++ } ++ ++ ++ /** ++ * Returns how many edits this UndoManager can maximally hold. ++ * ++ * @see #setLimit ++ */ ++ public synchronized int getLimit() ++ { ++ return limit; ++ } ++ ++ ++ /** ++ * Changes the maximal number of edits that this UndoManager can ++ * process. If there are currently more edits than the new limit ++ * allows, they will receive a {@link UndoableEdit#die() die} ++ * message in reverse order of addition. ++ * ++ * @param limit the new limit. ++ * ++ * @throws IllegalStateException if {@link #end()} has already been ++ * called on this UndoManager. ++ */ ++ public synchronized void setLimit(int limit) ++ { ++ if (!isInProgress()) ++ throw new IllegalStateException(); ++ ++ this.limit = limit; ++ trimForLimit(); ++ } ++ ++ ++ /** ++ * Discards all editing actions that are currently registered with ++ * this UndoManager. Each {@link UndoableEdit} will receive a {@link ++ * UndoableEdit#die() die message}. ++ */ ++ public synchronized void discardAllEdits() ++ { ++ int size; ++ ++ size = edits.size(); ++ for (int i = size - 1; i >= 0; i--) ++ ((UndoableEdit) edits.get(i)).die(); ++ indexOfNextAdd = 0; ++ edits.clear(); ++ } ++ ++ ++ /** ++ * Called by various internal methods in order to enforce ++ * the limit value. ++ */ ++ protected void trimForLimit() ++ { ++ int high, s; ++ ++ s = edits.size(); ++ ++ /* The Sun J2SE1.4.1_01 implementation can be observed to do ++ * nothing (instead of throwing an exception) with a negative or ++ * zero limit. It may be debatable whether this is the best ++ * behavior, but we replicate it for sake of compatibility. ++ */ ++ if (limit <= 0 || s <= limit) ++ return; ++ ++ high = Math.min(indexOfNextAdd + limit/2 - 1, s - 1); ++ trimEdits(high + 1, s - 1); ++ trimEdits(0, high - limit); ++ } ++ ++ ++ /** ++ * Discards a range of edits. All edits in the range [from ++ * .. to] will receive a {@linkplain UndoableEdit#die() die ++ * message} before being removed from the edits array. If ++ * from is greater than to, nothing ++ * happens. ++ * ++ * @param from the lower bound of the range of edits to be ++ * discarded. ++ * ++ * @param to the upper bound of the range of edits to be discarded. ++ */ ++ protected void trimEdits(int from, int to) ++ { ++ if (from > to) ++ return; ++ ++ for (int i = to; i >= from; i--) ++ ((UndoableEdit) edits.get(i)).die(); ++ ++ // Remove the range [from .. to] from edits. If from == to, which ++ // is likely to be a very common case, we can do better than ++ // creating a sub-list and clearing it. ++ if (to == from) ++ edits.remove(from); ++ else ++ edits.subList(from, to + 1).clear(); ++ ++ if (indexOfNextAdd > to) ++ indexOfNextAdd = indexOfNextAdd - to + from - 1; ++ else if (indexOfNextAdd >= from) ++ indexOfNextAdd = from; ++ } ++ ++ ++ /** ++ * Determines which significant edit would be undone if {@link ++ * #undo()} was called. ++ * ++ * @returns the significant edit that would be undone, or ++ * null if no significant edit would be affected by ++ * calling {@link #undo()}. ++ */ ++ protected UndoableEdit editToBeUndone() ++ { ++ UndoableEdit result; ++ ++ for (int i = indexOfNextAdd - 1; i >= 0; i--) ++ { ++ result = (UndoableEdit) edits.get(i); ++ if (result.isSignificant()) ++ return result; ++ } ++ ++ return null; ++ } ++ ++ ++ /** ++ * Determines which significant edit would be redone if {@link ++ * #redo()} was called. ++ * ++ * @returns the significant edit that would be redone, or ++ * null if no significant edit would be affected by ++ * calling {@link #redo()}. ++ */ ++ protected UndoableEdit editToBeRedone() ++ { ++ UndoableEdit result; ++ ++ for (int i = indexOfNextAdd; i < edits.size(); i++) ++ { ++ result = (UndoableEdit) edits.get(i); ++ if (result.isSignificant()) ++ return result; ++ } ++ ++ return null; ++ } ++ ++ ++ /** ++ * Undoes all editing actions in reverse order of addition, ++ * up to the specified action, ++ * ++ * @param edit the last editing action to be undone. ++ */ ++ protected void undoTo(UndoableEdit edit) ++ throws CannotUndoException ++ { ++ UndoableEdit cur; ++ ++ if (!edits.contains(edit)) ++ throw new CannotUndoException(); ++ ++ while (true) ++ { ++ indexOfNextAdd -= 1; ++ cur = (UndoableEdit) edits.get(indexOfNextAdd); ++ cur.undo(); ++ if (cur == edit) ++ return; ++ } ++ } ++ ++ ++ /** ++ * Redoes all editing actions in the same order as they were ++ * added to this UndoManager, up to the specified action. ++ * ++ * @param edit the last editing action to be redone. ++ */ ++ protected void redoTo(UndoableEdit edit) ++ throws CannotRedoException ++ { ++ UndoableEdit cur; ++ ++ if (!edits.contains(edit)) ++ throw new CannotRedoException(); ++ ++ while (true) ++ { ++ cur = (UndoableEdit) edits.get(indexOfNextAdd); ++ indexOfNextAdd += 1; ++ cur.redo(); ++ if (cur == edit) ++ return; ++ } ++ } ++ ++ ++ /** ++ * Undoes or redoes the last action. If the last action has already ++ * been undone, it will be re-done, and vice versa. ++ * ++ *

    This is useful for applications that do not present a separate ++ * undo and redo facility, but just have a single menu item for ++ * undoing and redoing the very last action. Such applications will ++ * use an UndoManager whose limit is 1. ++ */ ++ public synchronized void undoOrRedo() ++ throws CannotRedoException, CannotUndoException ++ { ++ if (indexOfNextAdd == edits.size()) ++ undo(); ++ else ++ redo(); ++ } ++ ++ ++ /** ++ * Determines whether it would be possible to either undo or redo ++ * this editing action. ++ * ++ *

    This is useful for applications that do not present a separate ++ * undo and redo facility, but just have a single menu item for ++ * undoing and redoing the very last action. Such applications will ++ * use an UndoManager whose limit is 1. ++ * ++ * @return true to indicate that this action can be ++ * undone or redone; false if neither is possible at ++ * the current time. ++ */ ++ public synchronized boolean canUndoOrRedo() ++ { ++ return indexOfNextAdd == edits.size() ? canUndo() : canRedo(); ++ } ++ ++ ++ /** ++ * Undoes one significant edit action. If insignificant actions have ++ * been posted after the last signficant action, the insignificant ++ * ones will be undone first. ++ * ++ *

    However, if {@link #end()} has been called on this ++ * UndoManager, it will behave like a normal {@link ++ * CompoundEdit}. In this case, all actions will be undone in ++ * reverse order of addition. Typical applications will never call ++ * {@link #end()} on their UndoManager. ++ * ++ * @throws CannotUndoException if no action can be undone. ++ * ++ * @see #canUndo() ++ * @see #redo() ++ * @see #undoOrRedo() ++ */ ++ public synchronized void undo() ++ throws CannotUndoException ++ { ++ if (!isInProgress()) ++ { ++ super.undo(); ++ return; ++ } ++ ++ UndoableEdit edit = editToBeUndone(); ++ if (edit == null) ++ throw new CannotUndoException(); ++ ++ undoTo(edit); ++ } ++ ++ ++ /** ++ * Determines whether it would be possible to undo this editing ++ * action. ++ * ++ * @return true to indicate that this action can be ++ * undone; false otherwise. ++ * ++ * @see #undo() ++ * @see #canRedo() ++ * @see #canUndoOrRedo() ++ */ ++ public synchronized boolean canUndo() ++ { ++ UndoableEdit edit; ++ ++ if (!isInProgress()) ++ return super.canUndo(); ++ ++ edit = editToBeUndone(); ++ return edit != null && edit.canUndo(); ++ } ++ ++ ++ ++ /** ++ * Redoes one significant edit action. If insignificant actions have ++ * been posted in between, the insignificant ones will be redone ++ * first. ++ * ++ *

    However, if {@link #end()} has been called on this ++ * UndoManager, it will behave like a normal {@link ++ * CompoundEdit}. In this case, all actions will be redone ++ * in order of addition. Typical applications will never call {@link ++ * #end()} on their UndoManager. ++ * ++ * @throws CannotRedoException if no action can be redone. ++ * ++ * @see #canRedo() ++ * @see #redo() ++ * @see #undoOrRedo() ++ */ ++ public synchronized void redo() ++ throws CannotRedoException ++ { ++ if (!isInProgress()) ++ { ++ super.redo(); ++ return; ++ } ++ ++ UndoableEdit edit = editToBeRedone(); ++ if (edit == null) ++ throw new CannotRedoException(); ++ ++ redoTo(edit); ++ } ++ ++ ++ /** ++ * Determines whether it would be possible to redo this editing ++ * action. ++ * ++ * @return true to indicate that this action can be ++ * redone; false otherwise. ++ * ++ * @see #redo() ++ * @see #canUndo() ++ * @see #canUndoOrRedo() ++ */ ++ public synchronized boolean canRedo() ++ { ++ UndoableEdit edit; ++ ++ if (!isInProgress()) ++ return super.canRedo(); ++ ++ edit = editToBeRedone(); ++ return edit != null && edit.canRedo(); ++ } ++ ++ ++ /** ++ * Registers an undoable editing action with this UndoManager. If ++ * the capacity limit is reached, the oldest action ++ * will be discarded (and receives a {@linkplain UndoableEdit#die() ++ * die message}. Equally, any actions that were undone (but not re-done) ++ * will be discarded, too. ++ * ++ * @param edit the editing action that is added to this UndoManager. ++ * ++ * @return true if edit could be ++ * incorporated; false if edit has not ++ * been incorporated because {@link #end()} has already been called ++ * on this UndoManager. ++ */ ++ public synchronized boolean addEdit(UndoableEdit edit) ++ { ++ boolean result; ++ ++ // Discard any edits starting at indexOfNextAdd. ++ trimEdits(indexOfNextAdd, edits.size() - 1); ++ ++ result = super.addEdit(edit); ++ indexOfNextAdd = edits.size(); ++ trimForLimit(); ++ return result; ++ } ++ ++ ++ /** ++ * Calculates a localized text for presenting the undo or redo ++ * action to the user, for example in the form of a menu command. ++ * ++ *

    This is useful for applications that do not present a separate ++ * undo and redo facility, but just have a single menu item for ++ * undoing and redoing the very last action. Such applications will ++ * use an UndoManager whose limit is 1. ++ * ++ * @return the redo presentation name if the last action has already ++ * been undone, or the undo presentation name otherwise. ++ * ++ * @see #getUndoPresentationName() ++ * @see #getRedoPresentationName() ++ */ ++ public synchronized String getUndoOrRedoPresentationName() ++ { ++ if (indexOfNextAdd == edits.size()) ++ return getUndoPresentationName(); ++ else ++ return getRedoPresentationName(); ++ } ++ ++ ++ /** ++ * Calculates a localized text for presenting the undo action ++ * to the user, for example in the form of a menu command. ++ */ ++ public synchronized String getUndoPresentationName() ++ { ++ UndoableEdit edit; ++ ++ if (!isInProgress()) ++ return super.getUndoPresentationName(); ++ ++ edit = editToBeUndone(); ++ if (edit == null) ++ return UIManager.getString("AbstractUndoableEdit.undoText"); ++ else ++ return edit.getUndoPresentationName(); ++ } ++ ++ ++ /** ++ * Calculates a localized text for presenting the redo action ++ * to the user, for example in the form of a menu command. ++ */ ++ public synchronized String getRedoPresentationName() ++ { ++ UndoableEdit edit; ++ ++ if (!isInProgress()) ++ return super.getRedoPresentationName(); ++ ++ edit = editToBeRedone(); ++ if (edit == null) ++ return UIManager.getString("AbstractUndoableEdit.redoText"); ++ else ++ return edit.getRedoPresentationName(); ++ } ++ ++ ++ /** ++ * Registers the edit action of an {@link UndoableEditEvent} ++ * with this UndoManager. ++ * ++ *

    Thread Safety: This method may safely be invoked from ++ * concurrent threads. The caller does not need to perform external ++ * synchronization. This means that {@link ++ * javax.swing.event.UndoableEvent} sources do not need to broadcast ++ * their events from inside the Swing worker thread. ++ * ++ * @param event the event whose edit will be ++ * passed to {@link #addEdit}. ++ * ++ * @see UndoableEditEvent#getEdit() ++ * @see #addEdit ++ */ ++ public void undoableEditHappened(UndoableEditEvent event) ++ { ++ // Note that this method does not need to be synchronized, ++ // because addEdit will obtain and release the mutex. ++ addEdit(event.getEdit()); ++ } ++} +Index: jni/classpath/jcl.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/classpath/jcl.c,v +retrieving revision 1.2 +diff -u -r1.2 jcl.c +--- jni/classpath/jcl.c 8 Oct 2003 15:49:32 -0000 1.2 ++++ jni/classpath/jcl.c 6 Sep 2004 16:36:11 -0000 +@@ -1,5 +1,5 @@ + /* jcl.c +- Copyright (C) 1998 Free Software Foundation, Inc. ++ Copyright (C) 1998, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -37,13 +37,17 @@ + + #include + #include +-#include ++#include + + #ifndef __GNUC__ + #define __attribute__(x) /* nothing */ + #endif + +-static char errstr[4098]; // this way the memory is pre-allocated, so that we do not have to worry if we are out of memory. ++/* ++ * This way the memory is pre-allocated, so that we do not have to worry ++ * if we are out of memory. ++ */ ++static char errstr[4098]; + + JNIEXPORT void JNICALL JCL_ThrowException(JNIEnv * env, char * className, char * errMsg) { + jclass excClass; +Index: jni/classpath/jnilink.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/classpath/jnilink.c,v +retrieving revision 1.1 +diff -u -r1.1 jnilink.c +--- jni/classpath/jnilink.c 31 Jan 2003 17:54:14 -0000 1.1 ++++ jni/classpath/jnilink.c 6 Sep 2004 16:36:11 -0000 +@@ -1,5 +1,5 @@ + /* JNILINK 1.1: JNI version. +- Copyright (C) 1998 Free Software Foundation, Inc. ++ Copyright (C) 1998, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -40,7 +40,7 @@ + #include + #include + +-#include ++#include + + #define GETCLASS(c) *(jclass*)(c) + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c +=================================================================== +RCS file: jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c +diff -N jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c 6 Sep 2004 16:36:11 -0000 +@@ -0,0 +1,68 @@ ++/* Native implementation of functions in GThreadNativeMethodRunner ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++#include "gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h" ++#include "gthread-jni.h" ++ ++/* ++ * Class: GThreadNativeMethodRunner ++ * Method: nativeRun ++ * Signature: (J)V ++ * ++ * Purpose: Run the C function whose function pointer is ++ * ++ */ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_nativeRun(JNIEnv *gdk_env, jobject lcl_obj, ++ jlong funcAddr, jlong funcArg) ++{ ++ /* Convert the function's address back into a pointer to a C function. */ ++ void *(*funcPtr)(void *) = (void *(*)(void *)) funcAddr; ++ ++ /* We do not need to worry about the return value from funcPtr(); it's ++ just thrown away. That is part of the g_threads spec, so no reason ++ to worry about returning it. */ ++ (void) funcPtr((void *) funcArg); ++ /* Fall off the end and terminate the thread of control. */ ++} ++ ++/* Local Variables: */ ++/* c-file-style: "gnu" */ ++/* End: */ ++ ++ +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c 20 Nov 2003 22:44:01 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c 6 Sep 2004 16:36:11 -0000 +@@ -112,9 +112,10 @@ + struct peerfont *pfont = NULL; + PangoFontMap *map = NULL; + char const *family_name = NULL; ++ enum java_awt_font_style style; + + gdk_threads_enter (); +- enum java_awt_font_style style = (enum java_awt_font_style) style_int; ++ style = (enum java_awt_font_style) style_int; + + g_assert (self != NULL); + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self); +@@ -135,7 +136,7 @@ + pango_font_description_set_family (pfont->desc, family_name); + (*env)->ReleaseStringUTFChars(env, family_name_str, family_name); + +- pango_font_description_set_size (pfont->desc, size * PANGO_SCALE); ++ pango_font_description_set_size (pfont->desc, size * dpi_conversion_factor); + + if (style & java_awt_font_BOLD) + pango_font_description_set_weight (pfont->desc, PANGO_WEIGHT_BOLD); +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 31 Dec 2003 08:58:31 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 6 Sep 2004 16:36:11 -0000 +@@ -53,6 +53,9 @@ + jintArray array; + jint *metrics; + struct peerfont *pf = NULL; ++ FT_Matrix mat; ++ double pointsize; ++ FT_Face face; + + pf = NSA_GET_FONT_PTR(env, font); + g_assert (pf != NULL); +@@ -62,14 +65,21 @@ + + gdk_threads_enter (); + +-#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) +-#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ +- + ((double)((t) & 0x3F) / 63.0)) ++#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) ++#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) ++#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) ++#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) + +- double pointsize = pango_font_description_get_size (pf->desc); ++ pointsize = pango_font_description_get_size (pf->desc); + pointsize /= (double) PANGO_SCALE; + +- FT_Face face = pango_ft2_font_get_face (pf->font); ++ mat.xx = DOUBLE_TO_16_16(1); ++ mat.xy = DOUBLE_TO_16_16(0); ++ mat.yx = DOUBLE_TO_16_16(0); ++ mat.yy = DOUBLE_TO_16_16(1); ++ ++ face = pango_ft2_font_get_face (pf->font); ++ FT_Set_Transform(face, &mat, NULL); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c,v +retrieving revision 1.3 +diff -u -r1.3 gnu_java_awt_peer_gtk_GdkFontMetrics.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 2 Dec 2003 21:00:05 -0000 1.3 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 6 Sep 2004 16:36:11 -0000 +@@ -47,7 +47,8 @@ + #define NUM_METRICS 5 + + JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState +- (JNIEnv *env, jobject obj __attribute__((unused)), jstring fname, jint size) ++ (JNIEnv *env, jobject obj __attribute__((unused)), ++ jstring fname, jint style, jint size) + { + jintArray array; + jint *metrics; +@@ -64,21 +65,28 @@ + gdk_threads_enter (); + + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + context = gdk_pango_context_get(); + pango_context_set_font_description (context, font_desc); + +- pango_metrics = pango_context_get_metrics (context, font_desc, NULL); ++ pango_metrics = pango_context_get_metrics (context, font_desc, ++ gtk_get_default_language ()); + + metrics[ASCENT] = +- pango_font_metrics_get_ascent (pango_metrics) / PANGO_SCALE; ++ PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics)); + metrics[MAX_ASCENT] = metrics[ASCENT]; + metrics[DESCENT] = +- pango_font_metrics_get_descent (pango_metrics) / PANGO_SCALE; ++ PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics)); + metrics[MAX_DESCENT] = metrics[DESCENT]; + metrics[MAX_ADVANCE] = +- pango_font_metrics_get_approximate_char_width (pango_metrics) / PANGO_SCALE; ++ PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (pango_metrics)); + + pango_font_metrics_unref (pango_metrics); + +@@ -94,7 +102,7 @@ + + JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_stringWidth + (JNIEnv *env, jobject obj __attribute__((unused)), +- jstring fname, jint size, jstring str) ++ jstring fname, jint style, jint size, jstring str) + { + PangoFontDescription *font_desc; + PangoContext *context; +@@ -109,7 +117,13 @@ + gdk_threads_enter (); + + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + context = gdk_pango_context_get(); + pango_context_set_font_description (context, font_desc); +@@ -117,6 +131,7 @@ + layout = pango_layout_new (context); + + pango_layout_set_text (layout, cstr, -1); ++ + pango_layout_get_pixel_size (layout, &width, NULL); + + pango_font_description_free (font_desc); +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GdkGlyphVector.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c 20 Nov 2003 22:44:01 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c 6 Sep 2004 16:36:11 -0000 +@@ -47,10 +47,11 @@ + double height; + } rect_t; + +-#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) +-#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ +- + ((double)((t) & 0x3F) / 63.0)) +- ++#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) ++#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) ++#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) ++#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) ++ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState + (JNIEnv *env, jclass clazz) + { +@@ -401,6 +402,21 @@ + return idx; + } + ++static void ++assume_pointsize_and_identity_transform(double pointsize, ++ FT_Face face) ++{ ++ FT_Matrix mat; ++ mat.xx = DOUBLE_TO_16_16(1); ++ mat.xy = DOUBLE_TO_16_16(0); ++ mat.yx = DOUBLE_TO_16_16(0); ++ mat.yy = DOUBLE_TO_16_16(1); ++ FT_Set_Transform(face, &mat, NULL); ++ FT_Set_Char_Size( face, ++ DOUBLE_TO_26_6 (pointsize), ++ DOUBLE_TO_26_6 (pointsize), ++ 0, 0); ++} + + JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents + (JNIEnv *env, jobject self) +@@ -432,10 +448,7 @@ + g_assert (gi->glyphs != NULL); + + face = pango_ft2_font_get_face (gi->item->analysis.font); +- FT_Set_Char_Size( face, +- DOUBLE_TO_26_6 (pointsize), +- DOUBLE_TO_26_6 (pointsize), +- 0, 0); ++ assume_pointsize_and_identity_transform (pointsize, face); + + for (j = 0; j < gi->glyphs->num_glyphs; ++j) + { +@@ -487,10 +500,7 @@ + g_assert (gi->glyphs != NULL); + + face = pango_ft2_font_get_face (gi->item->analysis.font); +- FT_Set_Char_Size( face, +- DOUBLE_TO_26_6 (pointsize), +- DOUBLE_TO_26_6 (pointsize), +- 0, 0); ++ assume_pointsize_and_identity_transform (pointsize, face); + + for (j = 0; j < gi->glyphs->num_glyphs; ++j) + { +@@ -541,11 +551,9 @@ + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + face = pango_ft2_font_get_face (font); +- FT_Set_Char_Size( face, +- DOUBLE_TO_26_6 (pointsize), +- DOUBLE_TO_26_6 (pointsize), +- 0, 0); +- ++ ++ assume_pointsize_and_identity_transform (pointsize, face); ++ + FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); + + /* FIXME: this is probably not the correct set of metrics; +@@ -588,10 +596,8 @@ + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + face = pango_ft2_font_get_face (font); +- FT_Set_Char_Size( face, +- DOUBLE_TO_26_6 (pointsize), +- DOUBLE_TO_26_6 (pointsize), +- 0, 0); ++ ++ assume_pointsize_and_identity_transform (pointsize, face); + + FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); + /* FIXME: this needs to change for vertical layouts */ +@@ -630,9 +636,12 @@ + + gdk_threads_leave (); + +- return ++ return 1; ++ /* FIXME: Pango doesn't seem to have decided how it will deal ++ with vertical text. for the time being we inherit this limitation. + ((dir == PANGO_DIRECTION_LTR) || + (dir == PANGO_DIRECTION_RTL)); ++ */ + } + + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GdkGraphics.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 8 Oct 2003 23:38:45 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 6 Sep 2004 16:36:12 -0000 +@@ -94,15 +94,13 @@ + + /* copy the native state of the peer (GtkWidget *) to the native state + of the graphics object */ +-JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 + (JNIEnv *env, jobject obj, jobject peer) + { + struct graphics *g = (struct graphics *) malloc (sizeof (struct graphics)); + void *ptr; + GtkWidget *widget; + GdkColor color; +- jintArray array; +- jint *rgb; + + ptr = NSA_GET_PTR (env, peer); + g->x_offset = g->y_offset = 0; +@@ -133,16 +131,7 @@ + + gdk_threads_leave (); + +- array = (*env)->NewIntArray (env, 3); +- rgb = (*env)->GetIntArrayElements (env, array, NULL); +- rgb[0] = color.red >> 8; +- rgb[1] = color.green >> 8; +- rgb[2] = color.blue >> 8; +- (*env)->ReleaseIntArrayElements (env, array, rgb, 0); +- + NSA_SET_PTR (env, obj, g); +- +- return array; + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_dispose +@@ -188,7 +177,7 @@ + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString + (JNIEnv *env, jobject obj, jstring str, jint x, jint y, +- jstring fname, jint size) ++ jstring fname, jint style, jint size) + { + struct graphics *g; + const char *cstr; +@@ -207,7 +196,14 @@ + gdk_threads_enter (); + + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + context = gdk_pango_context_get(); + pango_context_set_font_description (context, font_desc); +@@ -219,12 +215,15 @@ + + baseline_y = pango_layout_iter_get_baseline (iter); + +- gdk_draw_layout (g->drawable, g->gc, +- x + g->x_offset, y + g->y_offset - (baseline_y / PANGO_SCALE), layout); ++ gdk_draw_layout (g->drawable, g->gc, ++ x + g->x_offset, ++ y + g->y_offset - PANGO_PIXELS (baseline_y), ++ layout); + + pango_font_description_free (font_desc); + pango_layout_iter_free (iter); + ++ gdk_flush (); + gdk_threads_leave (); + + (*env)->ReleaseStringUTFChars (env, fname, font_name); +@@ -242,6 +241,7 @@ + gdk_draw_line (g->drawable, g->gc, + x + g->x_offset, y + g->y_offset, + x2 + g->x_offset, y2 + g->y_offset); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -253,8 +253,10 @@ + g = (struct graphics *) NSA_GET_PTR (env, obj); + + gdk_threads_enter (); ++ + gdk_draw_rectangle (g->drawable, g->gc, TRUE, + x + g->x_offset, y + g->y_offset, width, height); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -268,6 +270,7 @@ + gdk_threads_enter (); + gdk_draw_rectangle (g->drawable, g->gc, FALSE, + x + g->x_offset, y + g->y_offset, width, height); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -286,6 +289,7 @@ + (GdkWindow *)g->drawable, + x + g->x_offset, y + g->y_offset, + width, height); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -305,9 +309,114 @@ + (GdkWindow *)g2->drawable, + 0 + g2->x_offset, 0 + g2->y_offset, + width, height); ++ gdk_flush (); + gdk_threads_leave (); + } ++ ++static void flip_pixbuf (GdkPixbuf *pixbuf, ++ jboolean flip_x, ++ jboolean flip_y, ++ jint width, ++ jint height) ++{ ++ gint src_rs; ++ guchar *src_pix; ++ ++ src_rs = gdk_pixbuf_get_rowstride (pixbuf); ++ src_pix = gdk_pixbuf_get_pixels (pixbuf); ++ ++ if (flip_x) ++ { ++ gint i, channels; ++ guchar buf[4]; ++ ++ channels = gdk_pixbuf_get_has_alpha (pixbuf) ? 4 : 3; ++ ++ for (i = 0; i < height; i++) ++ { ++ guchar *left = src_pix + i * src_rs; ++ guchar *right = left + channels * (width - 1); ++ while (left < right) ++ { ++ g_memmove (buf, left, channels); ++ g_memmove (left, right, channels); ++ g_memmove (right, buf, channels); ++ left += channels; ++ right -= channels; ++ } ++ } ++ } ++ ++ if (flip_y) ++ { ++ guchar *top = src_pix; ++ guchar *bottom = top + (height - 1) * src_rs; ++ gpointer buf = g_malloc (src_rs); ++ ++ while (top < bottom) ++ { ++ g_memmove (buf, top, src_rs); ++ g_memmove (top, bottom, src_rs); ++ g_memmove (bottom, buf, src_rs); ++ top += src_rs; ++ bottom -= src_rs; ++ } ++ ++ g_free (buf); ++ } ++} + ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyAndScalePixmap ++ (JNIEnv *env, jobject obj, jobject offscreen, jboolean flip_x, jboolean flip_y, ++ jint src_x, jint src_y, jint src_width, jint src_height, ++ jint dest_x, jint dest_y, jint dest_width, jint dest_height) ++{ ++ struct graphics *g1, *g2; ++ GdkPixbuf *buf_src, *buf_dest; ++ ++ g1 = (struct graphics *) NSA_GET_PTR (env, obj); ++ g2 = (struct graphics *) NSA_GET_PTR (env, offscreen); ++ ++ gdk_threads_enter (); ++ ++ buf_src = gdk_pixbuf_get_from_drawable (NULL, ++ g2->drawable, ++ g2->cm, ++ src_x, ++ src_y, ++ 0, ++ 0, ++ src_width, ++ src_height); ++ ++ buf_dest = gdk_pixbuf_scale_simple (buf_src, ++ dest_width, ++ dest_height, ++ GDK_INTERP_BILINEAR); ++ ++ if (flip_x || flip_y) ++ { ++ flip_pixbuf (buf_dest, flip_x, flip_y, dest_width, dest_height); ++ } ++ ++ gdk_pixbuf_render_to_drawable (buf_dest, ++ g1->drawable, ++ g1->gc, ++ 0, ++ 0, ++ dest_x, ++ dest_y, ++ dest_width, ++ dest_height, ++ GDK_RGB_DITHER_NORMAL, ++ 0, ++ 0); ++ ++ g_object_unref (G_OBJECT (buf_src)); ++ g_object_unref (G_OBJECT (buf_dest)); ++ ++ gdk_threads_leave (); ++} + + + +@@ -316,12 +425,25 @@ + (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) + { + struct graphics *g; ++ GdkGCValues saved; + + g = (struct graphics *) NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gdk_window_clear_area ((GdkWindow *)g->drawable, +- x + g->x_offset, y + g->y_offset, width, height); ++ if (GDK_IS_WINDOW (g->drawable)) ++ { ++ gdk_window_clear_area ((GdkWindow *)g->drawable, ++ x + g->x_offset, y + g->y_offset, width, height); ++ } ++ else ++ { ++ gdk_gc_get_values (g->gc, &saved); ++ gdk_gc_set_foreground (g->gc, &(saved.background)); ++ gdk_draw_rectangle (g->drawable, g->gc, TRUE, ++ x + g->x_offset, y + g->y_offset, width, height); ++ gdk_gc_set_foreground (g->gc, &(saved.foreground)); ++ } ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -352,6 +474,7 @@ + gdk_threads_enter (); + gdk_color_alloc (g->cm, &color); + gdk_gc_set_foreground (g->gc, &color); ++ + gdk_threads_leave (); + } + +@@ -367,6 +490,7 @@ + gdk_draw_arc (g->drawable, g->gc, FALSE, + x + g->x_offset, y + g->y_offset, + width, height, angle1 << 6, angle2 << 6); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -410,6 +534,7 @@ + + gdk_threads_enter (); + gdk_draw_lines (g->drawable, g->gc, points, npoints); ++ gdk_flush (); + gdk_threads_leave (); + + g_free (points); +@@ -433,6 +558,7 @@ + + gdk_threads_enter (); + gdk_draw_lines (g->drawable, g->gc, points, npoints); ++ gdk_flush (); + gdk_threads_leave (); + + g_free (points); +@@ -450,6 +576,7 @@ + g->x_offset, g->y_offset); + gdk_threads_enter (); + gdk_draw_polygon (g->drawable, g->gc, TRUE, points, npoints); ++ gdk_flush (); + gdk_threads_leave (); + + g_free (points); +@@ -467,6 +594,7 @@ + gdk_draw_arc (g->drawable, g->gc, TRUE, + x + g->x_offset, y + g->y_offset, + width, height, angle1 << 6, angle2 << 6); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -481,6 +609,7 @@ + gdk_draw_arc (g->drawable, g->gc, FALSE, + x + g->x_offset, y + g->y_offset, + width, height, 0, 23040); ++ gdk_flush (); + gdk_threads_leave (); + } + +@@ -495,8 +624,9 @@ + gdk_draw_arc (g->drawable, g->gc, TRUE, + x + g->x_offset, y + g->y_offset, + width, height, 0, 23040); ++ gdk_flush (); + gdk_threads_leave (); +-} ++} + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setClipRectangle + (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v +retrieving revision 1.5 +diff -u -r1.5 gnu_java_awt_peer_gtk_GdkGraphics2D.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 31 Dec 2003 08:58:31 -0000 1.5 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 6 Sep 2004 16:36:12 -0000 +@@ -67,7 +67,9 @@ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState + (JNIEnv *env, jclass clazz) + { +- NSA_G2D_INIT (env, clazz); ++ gdk_threads_enter(); ++ NSA_G2D_INIT (env, clazz); ++ gdk_threads_leave(); + } + + /* these public final constants are part of the java2d public API, so we +@@ -114,6 +116,41 @@ + java_awt_geom_path_iterator_WIND_NON_ZERO = 1 + }; + ++enum java_awt_rendering_hints_filter ++ { ++ java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR = 0, ++ java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR = 1, ++ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED = 2, ++ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY = 3, ++ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT = 4 ++ ++ }; ++ ++static int ++peer_is_disposed(JNIEnv *env, jobject obj) ++{ ++ static jfieldID fid = NULL; ++ jclass cls; ++ jobject peer; ++ ++ return 0; ++ ++ if (fid == NULL) ++ { ++ cls = (*env)->GetObjectClass(env, obj); ++ fid = (*env)->GetFieldID(env, cls, "component", ++ "Lgnu/java/awt/peer/gtk/GtkComponentPeer;"); ++ } ++ g_assert(fid != NULL); ++ peer = (*env)->GetObjectField(env, obj, fid); ++ if (peer == NULL || NSA_GET_PTR (env, peer) != NULL) ++ return 0; ++ else ++ { ++ return 1; ++ } ++} ++ + + static void + grab_current_drawable (GtkWidget *widget, GdkDrawable **draw, GdkWindow **win) +@@ -136,7 +173,7 @@ + } + + *draw = *win; +- gdk_window_get_internal_paint_info (*win, draw, 0, 0); ++ gdk_window_get_internal_paint_info (*win, draw, 0, 0); + g_object_ref (*draw); + } + +@@ -211,7 +248,7 @@ + static void + begin_drawing_operation (struct graphics2d * gr) + { +- gdk_threads_enter (); ++ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS); + if (gr->drawbuf) + { + +@@ -239,6 +276,7 @@ + static void + end_drawing_operation (struct graphics2d * gr) + { ++ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS); + if (gr->drawbuf) + { + gint drawable_width, drawable_height; +@@ -259,7 +297,6 @@ + if (gr->debug) printf ("copied (%d, %d) pixels from pixbuf to GDK drawable\n", + width, height); + } +- gdk_threads_leave (); + } + + +@@ -279,7 +316,7 @@ + mat = cairo_matrix_create (); + g_assert (mat != NULL); + cairo_matrix_set_affine (mat, a, b, c, d, tx, ty); +- cairo_surface_set_matrix (gr->pattern, mat); ++ cairo_pattern_set_matrix (gr->pattern, mat); + cairo_matrix_destroy (mat); + } + +@@ -294,6 +331,7 @@ + { + struct graphics2d *g = NULL, *g_old = NULL; + ++ gdk_threads_enter(); + g = (struct graphics2d *) malloc (sizeof (struct graphics2d)); + g_assert (g != NULL); + memset (g, 0, sizeof(struct graphics2d)); +@@ -306,7 +344,6 @@ + g->drawable = g_old->drawable; + g->debug = g_old->debug; + +- gdk_threads_enter (); + g_object_ref (g->drawable); + + g->cr = cairo_create(); +@@ -319,9 +356,8 @@ + + cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST); + +- gdk_threads_leave (); +- + NSA_SET_G2D_PTR (env, obj, g); ++ gdk_threads_leave(); + } + + +@@ -329,9 +365,8 @@ + (JNIEnv *env, jobject obj, jint width, jint height) + { + struct graphics2d *gr; +- +- gdk_threads_enter (); + ++ gdk_threads_enter(); + gr = (struct graphics2d *) malloc (sizeof (struct graphics2d)); + g_assert (gr != NULL); + memset (gr, 0, sizeof(struct graphics2d)); +@@ -340,7 +375,7 @@ + + if (gr->debug) printf ("constructing offscreen drawable of size (%d,%d)\n", + width, height); +- ++ + gr->drawable = (GdkDrawable *) gdk_pixmap_new (NULL, width, height, + gdk_rgb_get_visual ()->depth); + g_assert (gr->drawable != NULL); +@@ -353,10 +388,10 @@ + else + init_graphics2d_as_pixbuf (gr); + +- gdk_threads_leave (); + if (gr->debug) printf ("constructed offscreen drawable of size (%d,%d)\n", + width, height); + NSA_SET_G2D_PTR (env, obj, gr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable +@@ -364,8 +399,11 @@ + { + struct graphics2d *src = NULL, *dst = NULL; + gint s_height, s_width, d_height, d_width, height, width; +- GdkGC *gc; ++ cairo_matrix_t *matrix; ++ cairo_operator_t tmp_op; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } + src = (struct graphics2d *)NSA_GET_G2D_PTR (env, other); + dst = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); + g_assert (src != NULL); +@@ -373,64 +411,48 @@ + + if (src->debug) printf ("copying from offscreen drawable\n"); + +- gdk_threads_enter (); ++ begin_drawing_operation(dst); ++ ++ gdk_flush(); ++ + gdk_drawable_get_size (src->drawable, &s_width, &s_height); + gdk_drawable_get_size (dst->drawable, &d_width, &d_height); + width = min (s_width, d_width); +- height = min (s_width, d_height); +- +- gc = gdk_gc_new (dst->drawable); +- g_assert (gc != NULL); +- +- gdk_draw_drawable(dst->drawable, gc, src->drawable, +- 0, 0, x, y, width, height); +- gdk_flush (); +- +- g_object_unref (gc); ++ height = min (s_height, d_height); + +- if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height); +- gdk_threads_leave (); +-} ++ matrix = cairo_matrix_create (); ++ cairo_surface_get_matrix (src->surface, matrix); ++ cairo_matrix_translate (matrix, (double)-x, (double)-y); ++ cairo_surface_set_matrix (src->surface, matrix); + +-static jintArray +-current_colors_of_widget (GtkWidget *widget, JNIEnv *env) +-{ +- GdkColor color; +- jintArray array; +- jint *rgb; +- +- g_assert (widget != NULL); +- g_assert (env != NULL); ++ tmp_op = cairo_current_operator (dst->cr); ++ cairo_set_operator(dst->cr, CAIRO_OPERATOR_SRC); ++ cairo_show_surface (dst->cr, src->surface, width, height); ++ cairo_set_operator(dst->cr, tmp_op); + +- color = widget->style->fg[GTK_STATE_NORMAL]; +- array = (*env)->NewIntArray (env, 6); ++ cairo_matrix_translate (matrix, (double)x, (double)y); ++ cairo_surface_set_matrix (src->surface, matrix); ++ cairo_matrix_destroy (matrix); + +- rgb = (*env)->GetIntArrayElements (env, array, NULL); +- rgb[0] = color.red >> 8; +- rgb[1] = color.green >> 8; +- rgb[2] = color.blue >> 8; ++ gdk_flush(); + +- color = widget->style->bg[GTK_STATE_NORMAL]; +- rgb[3] = color.red >> 8; +- rgb[4] = color.green >> 8; +- rgb[5] = color.blue >> 8; ++ end_drawing_operation(dst); + +- (*env)->ReleaseIntArrayElements (env, array, rgb, 0); +- +- return array; ++ if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height); ++ gdk_threads_leave(); + } + +-JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 + (JNIEnv *env, jobject obj, jobject peer) + { + struct graphics2d *gr = NULL; + GtkWidget *widget = NULL; + void *ptr = NULL; +- jintArray color; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } + ptr = NSA_GET_PTR (env, peer); + g_assert (ptr != NULL); +- gdk_threads_enter (); + + gr = (struct graphics2d *) malloc (sizeof (struct graphics2d)); + g_assert (gr != NULL); +@@ -452,11 +474,8 @@ + else + init_graphics2d_as_pixbuf (gr); + +- color = current_colors_of_widget (widget, env); +- +- gdk_threads_leave (); + NSA_SET_G2D_PTR (env, obj, gr); +- return color; ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose +@@ -464,11 +483,13 @@ + { + struct graphics2d *gr = NULL; + ++ gdk_threads_enter(); + gr = (struct graphics2d *) NSA_DEL_G2D_PTR (env, obj); + if (gr == NULL) +- return; /* dispose has been called more than once */ +- +- gdk_threads_enter (); ++ { ++ gdk_threads_leave(); ++ return; /* dispose has been called more than once */ ++ } + + if (gr->surface) + cairo_surface_destroy (gr->surface); +@@ -481,15 +502,18 @@ + g_object_unref (gr->drawable); + + if (gr->pattern) +- cairo_surface_destroy (gr->pattern); ++ cairo_pattern_destroy (gr->pattern); ++ ++ if (gr->pattern_surface) ++ cairo_surface_destroy (gr->pattern_surface); + + if (gr->pattern_pixels) + free (gr->pattern_pixels); + + if (gr->debug) printf ("disposed of graphics2d\n"); +- free (gr); + +- gdk_threads_leave (); ++ free (gr); ++ gdk_threads_leave(); + } + + +@@ -507,6 +531,8 @@ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } + if (gr->debug) printf ("setGradient (%f,%f) -> (%f,%f); (%d,%d,%d,%d) -> (%d,%d,%d,%d)\n", + x1, y1, + x2, y2, +@@ -578,38 +604,41 @@ + negate offsets. oh well. + + */ +- +- double a = (x2 - x1 == 0.) ? 0. : ((cyclic ? 3.0 : 2.0) / (x2 - x1)); +- double c = (y2 - y1 == 0.) ? 0. : (1. / (y2 - y1)); +- double dx = (x1 == 0.) ? 0. : 1. / x1; +- double dy = (y1 == 0.) ? 0. : 1. / y1; +- +- cairo_matrix_set_affine (mat, +- a, 0., +- c, 0., +- dx, dy); +- +- cairo_surface_set_matrix (surf, mat); +- cairo_matrix_destroy (mat); +- cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); ++ { ++ double a = (x2 - x1 == 0.) ? 0. : ((cyclic ? 3.0 : 2.0) / (x2 - x1)); ++ double c = (y2 - y1 == 0.) ? 0. : (1. / (y2 - y1)); ++ double dx = (x1 == 0.) ? 0. : 1. / x1; ++ double dy = (y1 == 0.) ? 0. : 1. / y1; ++ ++ cairo_matrix_set_affine (mat, ++ a, 0., ++ c, 0., ++ dx, dy); ++ ++ cairo_surface_set_matrix (surf, mat); ++ cairo_matrix_destroy (mat); ++ cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); ++ } + + /* FIXME: repeating gradients (not to mention hold gradients) don't seem to work. */ + /* cairo_surface_set_repeat (surf, cyclic ? 1 : 0); */ + + if (gr->pattern) +- cairo_surface_destroy (gr->pattern); ++ cairo_pattern_destroy (gr->pattern); ++ ++ if (gr->pattern_surface) ++ cairo_surface_destroy (gr->pattern_surface); + + if (gr->pattern_pixels) +- { +- free (gr->pattern_pixels); +- gr->pattern_pixels = NULL; +- } +- +- gr->pattern = surf; ++ free (gr->pattern_pixels); ++ ++ gr->pattern_pixels = NULL; ++ gr->pattern_surface = surf; ++ gr->pattern = cairo_pattern_create_for_surface(surf); + + cairo_restore (gr->cr); + cairo_set_pattern (gr->cr, gr->pattern); +- ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels +@@ -618,6 +647,8 @@ + struct graphics2d *gr = NULL; + jint *jpixels = NULL; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + +@@ -625,12 +656,16 @@ + (*env)->GetArrayLength (env, jarr), w, h, stride); + + if (gr->pattern) +- cairo_surface_destroy (gr->pattern); ++ cairo_pattern_destroy (gr->pattern); ++ ++ if (gr->pattern_surface) ++ cairo_surface_destroy (gr->pattern_surface); + + if (gr->pattern_pixels) + free (gr->pattern_pixels); + + gr->pattern = NULL; ++ gr->pattern_surface = NULL; + gr->pattern_pixels = NULL; + + gr->pattern_pixels = (char *) malloc (h * stride * 4); +@@ -641,13 +676,15 @@ + memcpy (gr->pattern_pixels, jpixels, h * stride * 4); + (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0); + +- gr->pattern = cairo_surface_create_for_image (gr->pattern_pixels, +- CAIRO_FORMAT_ARGB32, +- w, h, stride * 4); ++ gr->pattern_surface = cairo_surface_create_for_image (gr->pattern_pixels, ++ CAIRO_FORMAT_ARGB32, ++ w, h, stride * 4); ++ g_assert (gr->pattern_surface != NULL); ++ cairo_surface_set_repeat (gr->pattern_surface, 1); ++ gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface); + g_assert (gr->pattern != NULL); +- cairo_surface_set_repeat (gr->pattern, 1); + cairo_set_pattern (gr->cr, gr->pattern); +- ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels +@@ -658,6 +695,9 @@ + jint *native_pixels = NULL; + jdouble *native_matrix = NULL; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + +@@ -683,30 +723,86 @@ + native_matrix[2], native_matrix[3], + native_matrix[4], native_matrix[5]); + cairo_surface_set_matrix (surf, mat); +- if (native_matrix[0] != 1. +- || native_matrix[1] != 0. +- || native_matrix[2] != 0. +- || native_matrix[3] != 1.) +- { +- cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); +- cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); +- } +- else +- { +- cairo_surface_set_filter (surf, CAIRO_FILTER_FAST); +- cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); +- } ++ cairo_surface_set_filter (surf, cairo_surface_get_filter(gr->surface)); + cairo_show_surface (gr->cr, surf, w, h); +- cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); + cairo_matrix_destroy (mat); + cairo_surface_destroy (surf); + } + + end_drawing_operation (gr); ++ ++ (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0); ++ (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); ++ ++ gdk_threads_leave(); ++} + +- (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0); +- (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); ++JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels ++ (JNIEnv *env, jobject obj) ++{ ++ struct graphics2d *gr = NULL; ++ jintArray java_pixels; ++ jint* native_pixels; ++ GdkPixbuf *buf = NULL; ++ gint width, height; ++ gint bits_per_sample = 8; ++ gboolean has_alpha = TRUE; ++ gint total_channels = 4; ++ jint i, px; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return NULL; } ++ ++ gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); ++ g_assert (gr != NULL); ++ ++ if (gr->debug) printf ("getImagePixels\n"); ++ ++ gdk_drawable_get_size (gr->drawable, &width, &height); ++ ++ buf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, ++ bits_per_sample, ++ width, height); ++ g_assert (buf != NULL); ++ g_assert (gdk_pixbuf_get_bits_per_sample (buf) == bits_per_sample); ++ g_assert (gdk_pixbuf_get_n_channels (buf) == total_channels); ++ ++ ++ /* copy pixels from drawable to pixbuf */ ++ ++ gdk_pixbuf_get_from_drawable (buf, gr->drawable, ++ NULL, ++ 0, 0, 0, 0, ++ width, height); ++ ++ native_pixels= gdk_pixbuf_get_pixels (buf); ++ ++ ++ /* NOTE: The pixels we got in the pixbuf are stored ++ in reversed order. i.e 0xBBGGRRAA. ++ We need to convert them to 0xAARRGGBB. */ ++ ++ for (i=0; i> 24) & 0xff) | ((px << 8) & 0xffffff00); ++ px = ((px >> 8) & 0x00ff00ff) | ((px << 8) & 0xff00ff00); ++ px = ((px >> 16) & 0x0000ffff) | ((px << 16) & 0xffff0000); ++ native_pixels[i] = px; ++ ++ } ++ ++ java_pixels = (*env) -> NewIntArray (env, width * height); ++ ++ (*env)->SetIntArrayRegion(env, java_pixels, ++ (jsize)0, (jsize) width*height, ++ (jint*) native_pixels); ++ ++ gdk_threads_leave(); ++ return java_pixels; + } + + /* passthrough methods to cairo */ +@@ -715,21 +811,31 @@ + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_save\n"); + cairo_save (gr->cr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_restore\n"); + cairo_restore (gr->cr); + update_pattern_transform (gr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix +@@ -738,6 +844,9 @@ + struct graphics2d *gr = NULL; + jdouble *native_matrix = NULL; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + +@@ -762,6 +871,7 @@ + + (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); + update_pattern_transform (gr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont +@@ -772,14 +882,15 @@ + cairo_font_t *ft = NULL; + FT_Face face = NULL; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); + g_assert (pfont != NULL); + +- gdk_threads_enter (); +- + face = pango_ft2_font_get_face (pfont->font); + g_assert (face != NULL); + +@@ -795,8 +906,7 @@ + (double)PANGO_SCALE); + + cairo_font_destroy (ft); +- +- gdk_threads_leave (); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs +@@ -809,6 +919,9 @@ + jint i; + jint ncodes, nposns; + ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + +@@ -843,12 +956,17 @@ + end_drawing_operation (gr); + + free(glyphs); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator + (JNIEnv *env, jobject obj, jint op) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_operator %d\n", op); +@@ -902,12 +1020,17 @@ + cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR); + break; + } ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor + (JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + +@@ -922,22 +1045,33 @@ + cairo_set_rgb_color (gr->cr, b, g, r); + else + cairo_set_rgb_color (gr->cr, r, g, b); ++ ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha + (JNIEnv *env, jobject obj, jdouble a) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_alpha %f\n", a); + cairo_set_alpha (gr->cr, a); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule + (JNIEnv *env, jobject obj, jint rule) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + if (gr->debug) printf ("cairo_set_fill_rule %d\n", rule); + g_assert (gr != NULL); +@@ -950,22 +1084,32 @@ + cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD); + break; + } ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth + (JNIEnv *env, jobject obj, jdouble width) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_line_width %f\n", width); + cairo_set_line_width (gr->cr, width); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap + (JNIEnv *env, jobject obj, jint cap) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_line_cap %d\n", cap); +@@ -983,12 +1127,17 @@ + cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE); + break; + } ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin + (JNIEnv *env, jobject obj, jint join) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_line_join %d\n", join); +@@ -1006,6 +1155,7 @@ + cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL); + break; + } ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash +@@ -1013,6 +1163,10 @@ + { + struct graphics2d *gr = NULL; + jdouble *dasharr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_dash\n"); +@@ -1020,16 +1174,22 @@ + g_assert (dasharr != NULL); + cairo_set_dash (gr->cr, dasharr, ndash, offset); + (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit + (JNIEnv *env, jobject obj, jdouble miter) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_set_miter_limit %f\n", miter); + cairo_set_miter_limit (gr->cr, miter); ++ gdk_threads_leave(); + } + + +@@ -1037,123 +1197,217 @@ + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_new_path\n"); + cairo_new_path (gr->cr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo + (JNIEnv *env, jobject obj, jdouble x, jdouble y) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_move_to (%f, %f)\n", x, y); + cairo_move_to (gr->cr, x, y); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo + (JNIEnv *env, jobject obj, jdouble x, jdouble y) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_line_to (%f, %f)\n", x, y); + cairo_line_to (gr->cr, x, y); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo + (JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jdouble x3, jdouble y3) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_curve_to (%f, %f), (%f, %f), (%f, %f)\n", x1, y1, x2, y2, x3, y3); + cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo + (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_rel_move_to (%f, %f)\n", dx, dy); + cairo_rel_move_to (gr->cr, dx, dy); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo + (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_rel_line_to (%f, %f)\n", dx, dy); + cairo_rel_line_to (gr->cr, dx, dy); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo + (JNIEnv *env, jobject obj, jdouble dx1, jdouble dy1, jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_rel_curve_to (%f, %f), (%f, %f), (%f, %f)\n", dx1, dy1, dx2, dy2, dx3, dy3); + cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle + (JNIEnv *env, jobject obj, jdouble x, jdouble y, jdouble width, jdouble height) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_rectangle (%f, %f) (%f, %f)\n", x, y, width, height); + cairo_rectangle (gr->cr, x, y, width, height); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_close_path\n"); + cairo_close_path (gr->cr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_stroke\n"); + begin_drawing_operation (gr); + cairo_stroke (gr->cr); + end_drawing_operation (gr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_fill\n"); + begin_drawing_operation (gr); + cairo_fill (gr->cr); + end_drawing_operation (gr); ++ gdk_threads_leave(); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip + (JNIEnv *env, jobject obj) + { + struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_clip\n"); ++ begin_drawing_operation (gr); ++ cairo_init_clip (gr->cr); + cairo_clip (gr->cr); ++ end_drawing_operation (gr); ++ gdk_threads_leave(); + } + ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter ++ (JNIEnv *env, jobject obj, jint filter) ++{ ++ struct graphics2d *gr = NULL; ++ ++ gdk_threads_enter(); ++ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } ++ ++ gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); ++ g_assert (gr != NULL); ++ if (gr->debug) printf ("cairo_surface_set_filter %d\n", filter); ++ switch ((enum java_awt_rendering_hints_filter) filter) ++ { ++ case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR: ++ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST); ++ break; ++ case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR: ++ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); ++ break; ++ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED: ++ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); ++ break; ++ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT: ++ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST); ++ break; ++ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY: ++ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BEST); ++ break; ++ } ++ gdk_threads_leave(); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 1 Dec 2003 18:05:32 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 6 Sep 2004 16:36:12 -0000 +@@ -1,5 +1,5 @@ + /* gdkpixbufdecoder.c +- Copyright (C) 1999, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -35,36 +35,38 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- +-#include ++#include ++#include + #include + #include + +-#include "gtkpeer.h" ++#include ++#include "native_state.h" + #include "gnu_java_awt_peer_gtk_GdkPixbufDecoder.h" + +-struct state_table *native_pixbufdecoder_state_table; +- +-#define NSA_PB_INIT(env, clazz) \ +- native_pixbufdecoder_state_table = init_state_table (env, clazz) ++#include ++#include + +-#define NSA_GET_PB_PTR(env, obj) \ +- get_state (env, obj, native_pixbufdecoder_state_table) +- +-#define NSA_SET_PB_PTR(env, obj, ptr) \ +- set_state (env, obj, native_pixbufdecoder_state_table, (void *)ptr) ++struct state_table *native_pixbufdecoder_state_table; + +-#define NSA_DEL_PB_PTR(env, obj) \ +- remove_state_slot (env, obj, native_pixbufdecoder_state_table) ++/* Union used for type punning. */ ++union env_union ++{ ++ void **void_env; ++ JNIEnv **jni_env; ++}; + ++static JavaVM *vm; + +-jmethodID areaPreparedID; +-jmethodID areaUpdatedID; ++static jmethodID areaPreparedID; ++static jmethodID areaUpdatedID; + + static void + area_prepared (GdkPixbufLoader *loader, + jobject *decoder) + { ++ JNIEnv *env; ++ union env_union e; + jint width, height; + + GdkPixbuf *pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); +@@ -72,17 +74,19 @@ + return; + + width = gdk_pixbuf_get_width (pixbuf); +- height = gdk_pixbuf_get_height (pixbuf), ++ height = gdk_pixbuf_get_height (pixbuf); + + gdk_threads_leave (); + + g_assert (decoder != NULL); + +- (*gdk_env)->CallVoidMethod (gdk_env, +- *decoder, +- areaPreparedID, +- width, height); +- ++ e.jni_env = &env; ++ (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1); ++ (*env)->CallVoidMethod (env, ++ *decoder, ++ areaPreparedID, ++ width, height); ++ + gdk_threads_enter (); + } + +@@ -92,6 +96,8 @@ + gint width, gint height, + jobject *decoder) + { ++ JNIEnv *env; ++ union env_union e; + jint stride_bytes, stride_pixels, n_channels, n_pixels; + int i, px; + jintArray jpixels; +@@ -114,8 +120,10 @@ + n_pixels = height * stride_pixels; + gdk_pixels = gdk_pixbuf_get_pixels (pixbuf); + +- jpixels = (*gdk_env)->NewIntArray (gdk_env, n_pixels); +- java_pixels = (*gdk_env)->GetIntArrayElements (gdk_env, jpixels, NULL); ++ e.jni_env = &env; ++ (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1); ++ jpixels = (*env)->NewIntArray (env, n_pixels); ++ java_pixels = (*env)->GetIntArrayElements (env, jpixels, NULL); + + memcpy (java_pixels, + gdk_pixels + (y * stride_bytes), +@@ -141,22 +149,27 @@ + + gdk_threads_leave (); + +- (*gdk_env)->ReleaseIntArrayElements (gdk_env, jpixels, java_pixels, 0); +- (*gdk_env)->CallVoidMethod (gdk_env, +- *decoder, +- areaUpdatedID, +- (jint) x, (jint) y, +- (jint) width, (jint) height, +- jpixels, +- stride_pixels); ++ (*env)->ReleaseIntArrayElements (env, jpixels, java_pixels, 0); ++ (*env)->CallVoidMethod (env, ++ *decoder, ++ areaUpdatedID, ++ (jint) x, (jint) y, ++ (jint) width, (jint) height, ++ jpixels, ++ stride_pixels); + gdk_threads_enter (); + } + + static void + closed (GdkPixbufLoader *loader __attribute__((unused)), jobject *decoder) + { ++ JNIEnv *env; ++ union env_union e; ++ e.jni_env = &env; ++ (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1); ++ + gdk_threads_leave (); +- (*gdk_env)->DeleteGlobalRef (gdk_env, *decoder); ++ (*env)->DeleteGlobalRef (env, *decoder); + free (decoder); + gdk_threads_enter (); + } +@@ -187,6 +200,8 @@ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState + (JNIEnv *env, jclass clazz) + { ++ (*env)->GetJavaVM(env, &vm); ++ + areaPreparedID = (*env)->GetMethodID (env, clazz, + "areaPrepared", + "(II)V"); +@@ -223,14 +238,14 @@ + if (len < 1) + return; + +- bytes = (*gdk_env)->GetByteArrayElements (gdk_env, jarr, NULL); ++ bytes = (*env)->GetByteArrayElements (env, jarr, NULL); + g_assert (bytes != NULL); + loader = (GdkPixbufLoader *)NSA_GET_PB_PTR (env, obj); + g_assert (loader != NULL); + + gdk_threads_enter (); +- gdk_pixbuf_loader_write (loader, bytes, len, NULL); ++ gdk_pixbuf_loader_write (loader, (const guchar *) bytes, len, NULL); + gdk_threads_leave (); + +- (*gdk_env)->ReleaseByteArrayElements (gdk_env, jarr, bytes, 0); ++ (*env)->ReleaseByteArrayElements (env, jarr, bytes, 0); + } +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v +retrieving revision 1.7 +diff -u -r1.7 gnu_java_awt_peer_gtk_GtkButtonPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 13 Dec 2003 01:15:47 -0000 1.7 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 6 Sep 2004 16:36:12 -0000 +@@ -42,20 +42,23 @@ + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create +- (JNIEnv *env, jobject obj) ++ (JNIEnv *env, jobject obj, jstring label) + { ++ const char *c_label; + GtkWidget *button; + +- /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + ++ c_label = (*env)->GetStringUTFChars (env, label, NULL); ++ + gdk_threads_enter (); +- +- button = gtk_button_new(); ++ ++ button = gtk_button_new_with_label (c_label); + gtk_widget_show (button); + + gdk_threads_leave (); + ++ (*env)->ReleaseStringUTFChars (env, label, c_label); + NSA_SET_PTR (env, obj, button); + } + +@@ -88,29 +91,46 @@ + } + + JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel ++ (JNIEnv *env, jobject obj, jstring jtext) ++{ ++ const char *text; ++ GtkWidget *label; ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ text = (*env)->GetStringUTFChars (env, jtext, NULL); ++ ++ gdk_threads_enter (); ++ ++ label = gtk_bin_get_child (GTK_BIN (ptr)); ++ gtk_label_set_text (GTK_LABEL (label), text); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseStringUTFChars (env, jtext, text); ++} ++ ++JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring name, jint style, jint size) + { + const char *font_name; + void *ptr; +- GtkWidget *button; + GtkWidget *label; + PangoFontDescription *font_desc; + + ptr = NSA_GET_PTR (env, obj); + +- button = GTK_WIDGET (ptr); +- label = gtk_bin_get_child (GTK_BIN(button)); +- +- if (!label) +- return; +- + font_name = (*env)->GetStringUTFChars (env, name, NULL); + + gdk_threads_enter(); + ++ label = gtk_bin_get_child (GTK_BIN (ptr)); ++ + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); +@@ -145,12 +165,24 @@ + + label = gtk_bin_get_child (GTK_BIN(ptr)); + +- if (!label) +- return; +- + gtk_widget_modify_fg (label, GTK_STATE_NORMAL, &color); + gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, &color); + gtk_widget_modify_fg (label, GTK_STATE_PRELIGHT, &color); + + gdk_threads_leave (); + } ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkActivate ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ gtk_widget_activate (GTK_WIDGET (ptr)); ++ ++ gdk_threads_leave (); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c +=================================================================== +RCS file: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c +diff -N jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c 6 Sep 2004 16:36:12 -0000 +@@ -0,0 +1,75 @@ ++/* gtkcheckboxgrouppeer.c -- Native implementation of GtkCheckboxGroupPeer ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++#include "gtkpeer.h" ++#include "gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h" ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose ++ (JNIEnv *env, jobject obj) ++{ ++ /* The actual underlying widget is owned by a different class. So ++ we just clean up the hash table here. */ ++ NSA_DEL_PTR (env, obj); ++} ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove ++ (JNIEnv *env, jobject obj, jobject checkbox) ++{ ++ GtkRadioButton *button; ++ void *ptr; ++ GSList *list; ++ ++ ptr = NSA_GET_PTR (env, checkbox); ++ gdk_threads_enter (); ++ button = GTK_RADIO_BUTTON (ptr); ++ ++ /* Update the group to point to some other widget in the group. We ++ have to do this because Gtk doesn't have a separate object to ++ represent a radio button's group. */ ++ for (list = gtk_radio_button_group (button); list != NULL; ++ list = list->next) ++ { ++ if (list->data != button) ++ break; ++ } ++ ++ gdk_threads_leave (); ++ ++ NSA_SET_PTR (env, obj, list ? list->data : NULL); ++} ++ +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c 13 Dec 2003 01:15:47 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c 6 Sep 2004 16:36:12 -0000 +@@ -37,7 +37,7 @@ + + + #include "gtkpeer.h" +-#include "gnu_java_awt_peer_gtk_GtkMenuItemPeer.h" ++#include "gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.h" + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 13 Dec 2003 01:15:47 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 6 Sep 2004 16:36:12 -0000 +@@ -1,5 +1,5 @@ + /* gtkcheckboxpeer.c -- Native implementation of GtkCheckboxPeer +- Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -42,47 +42,12 @@ + + static void item_toggled (GtkToggleButton *item, jobject peer); + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose +- (JNIEnv *env, jobject obj) +-{ +- /* The actual underlying widget is owned by a different class. So +- we just clean up the hash table here. */ +- NSA_DEL_PTR (env, obj); +-} +- +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove +- (JNIEnv *env, jobject obj, jobject checkbox) +-{ +- GtkRadioButton *button; +- void *ptr; +- GSList *list; +- +- ptr = NSA_GET_PTR (env, checkbox); +- gdk_threads_enter (); +- button = GTK_RADIO_BUTTON (ptr); +- +- /* Update the group to point to some other widget in the group. We +- have to do this because Gtk doesn't have a separate object to +- represent a radio button's group. */ +- for (list = gtk_radio_button_group (button); list != NULL; +- list = list->next) +- { +- if (list->data != button) +- break; +- } +- +- gdk_threads_leave (); +- +- NSA_SET_PTR (env, obj, list ? list->data : NULL); +-} +- + JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate +- (JNIEnv *env, jobject obj, jobject group, jboolean state) ++Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_create ++ (JNIEnv *env, jobject obj, jobject group) + { + GtkWidget *button; + +- /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); +@@ -100,7 +65,6 @@ + NSA_SET_PTR (env, group, button); + } + } +- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), state); + + gdk_threads_leave (); + +@@ -164,10 +128,86 @@ + NSA_SET_PTR (env, group, native_group); + } + ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive ++ (JNIEnv *env, jobject obj, jboolean is_active) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptr), is_active); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetFont ++ (JNIEnv *env, jobject obj, jstring name, jint style, jint size) ++{ ++ const char *font_name; ++ void *ptr; ++ GtkWidget *button; ++ GtkWidget *label; ++ PangoFontDescription *font_desc; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ button = GTK_WIDGET (ptr); ++ label = gtk_bin_get_child (GTK_BIN(button)); ++ ++ if (!label) ++ return; ++ ++ font_name = (*env)->GetStringUTFChars (env, name, NULL); ++ ++ gdk_threads_enter(); ++ ++ font_desc = pango_font_description_from_string (font_name); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); ++ ++ gtk_widget_modify_font (GTK_WIDGET(label), font_desc); ++ ++ pango_font_description_free (font_desc); ++ ++ gdk_threads_leave(); ++ ++ (*env)->ReleaseStringUTFChars (env, name, font_name); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel ++ (JNIEnv *env, jobject obj, jstring label) ++{ ++ const char *c_label; ++ GtkWidget *label_widget; ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ c_label = (*env)->GetStringUTFChars (env, label, NULL); ++ ++ gdk_threads_enter (); ++ ++ label_widget = gtk_bin_get_child (GTK_BIN (ptr)); ++ gtk_label_set_text (GTK_LABEL (label_widget), c_label); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseStringUTFChars (env, label, c_label); ++} ++ + static void + item_toggled (GtkToggleButton *item, jobject peer) + { +- //g_print ("toggled\n"); + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postItemEventID, + peer, +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v +retrieving revision 1.6 +diff -u -r1.6 gnu_java_awt_peer_gtk_GtkChoicePeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 5 Jan 2004 21:18:06 -0000 1.6 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 6 Sep 2004 16:36:12 -0000 +@@ -39,38 +39,27 @@ + #include "gtkpeer.h" + #include "gnu_java_awt_peer_gtk_GtkChoicePeer.h" + +-static void connect_choice_item_selectable_hook (JNIEnv *env, +- jobject peer_obj, +- GtkItem *menuitem, +- const char *label); ++static void selection_changed (GtkComboBox *combobox, gpointer data); + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create + (JNIEnv *env, jobject obj) + { + GtkWidget *menu; +- GtkOptionMenu *option_menu; +- GtkRequisition child_requisition; ++ GtkComboBox *combobox; + +- /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); + +- option_menu = GTK_OPTION_MENU (gtk_option_menu_new ()); +- menu = gtk_menu_new (); +- gtk_widget_show (menu); ++ combobox = gtk_combo_box_new_text (); + +- gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu); +- +- gtk_widget_size_request (gtk_menu_item_new_with_label (""), +- &child_requisition); +- option_menu->width = child_requisition.width; +- option_menu->height = child_requisition.height; ++ g_signal_connect (combobox, "changed", ++ G_CALLBACK (selection_changed), obj); + + gdk_threads_leave (); + +- NSA_SET_PTR (env, obj, option_menu); ++ NSA_SET_PTR (env, obj, combobox); + } + + JNIEXPORT void JNICALL +@@ -78,45 +67,27 @@ + (JNIEnv *env, jobject obj, jobjectArray items) + { + gpointer ptr; +- GtkMenu *menu; + jsize count, i; +- int need_set_history = 0; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + +- menu = GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr))); +- +- /* Are we adding the first element? */ +- if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) < 0) +- need_set_history = 1; +- + count = (*env)->GetArrayLength (env, items); + + for (i = 0; i < count; i++) + { + jobject item; + const char *label; +- GtkWidget *menuitem; + + item = (*env)->GetObjectArrayElement (env, items, i); + label = (*env)->GetStringUTFChars (env, item, NULL); + +- menuitem = gtk_menu_item_new_with_label (label); +- gtk_menu_append (menu, menuitem); +- gtk_widget_show (menuitem); +- +- connect_choice_item_selectable_hook (env, obj, +- GTK_ITEM (menuitem), label); ++ gtk_combo_box_append_text (GTK_COMBO_BOX (ptr), label); + + (*env)->ReleaseStringUTFChars (env, item, label); + } + +- /* If we just added the first element select it. */ +- if (need_set_history) +- gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); +- + gdk_threads_leave (); + } + +@@ -126,36 +97,13 @@ + { + void *ptr; + const char *label; +- GtkWidget *menu, *menuitem; +- int current; +- int need_set_history = 0; + + ptr = NSA_GET_PTR (env, obj); + + label = (*env)->GetStringUTFChars (env, item, 0); + + gdk_threads_enter (); +- +- current = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)); +- +- /* Are we adding the first element or below or at the currently +- selected one? */ +- if ((current < 0) || (current >= index)) +- need_set_history = 1; +- +- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)); +- menuitem = gtk_menu_item_new_with_label (label); +- gtk_menu_insert (GTK_MENU (menu), menuitem, index); +- gtk_widget_show (menuitem); +- +- connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), label); +- +- /* If we just added the first element select it. +- If we added at of below the currently selected position make +- the first item the selected one. */ +- if (need_set_history) +- gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); +- ++ gtk_combo_box_insert_text (GTK_COMBO_BOX (ptr), index, label); + gdk_threads_leave (); + + (*env)->ReleaseStringUTFChars (env, item, label); +@@ -166,50 +114,35 @@ + (JNIEnv *env, jobject obj, jint index) + { + void *ptr; +- GtkContainer *menu; +- GtkWidget *menuitem; +- GList *children; +- int need_set_history = 0; +- int i, from, to; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); ++ gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), index); ++ gdk_threads_leave (); ++} + +- menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr))); +- children = gtk_container_children (menu); ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ GtkTreeModel *model; ++ gint count, i; + +- if (index == -1) +- { +- /* Remove all elements (removeAll) */ +- from = g_list_length (children) - 1; +- to = 0; ++ ptr = NSA_GET_PTR (env, obj); + +- /* Select the first item to prevent spurious activate signals */ +- gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); +- } +- else +- { +- /* Remove the specific index element */ +- from = index; +- to = index; +- +- /* Are we removing the currently selected element? */ +- if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) == index) +- need_set_history = 1; +- } ++ gdk_threads_enter (); + +- for (i = from; i >= to; i--) +- { +- menuitem = GTK_WIDGET (g_list_nth (children, i)->data); +- gtk_container_remove (menu, menuitem); +- gtk_widget_destroy (menuitem); +- } ++ model = gtk_combo_box_get_model (GTK_COMBO_BOX (ptr)); ++ count = gtk_tree_model_iter_n_children (model, NULL); ++ ++ /* First, unselect everything, to avoid problems when removing items. */ ++ gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), -1); + +- /* If we just removed the currently selected element and there are +- still elements left in the list, make the first item the selected one. */ +- if (need_set_history && gtk_container_children (menu)) +- gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); ++ for (i = count - 1; i >= 0; i--) { ++ gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), i); ++ } + + gdk_threads_leave (); + } +@@ -223,12 +156,12 @@ + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), index); ++ gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), index); + gdk_threads_leave (); + } + + JNIEXPORT jint JNICALL +-Java_gnu_java_awt_peer_gtk_GtkChoicePeer_getHistory ++Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected + (JNIEnv *env, jobject obj) + { + void *ptr; +@@ -237,57 +170,38 @@ + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- +- index = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)); +- ++ index = gtk_combo_box_get_active (GTK_COMBO_BOX (ptr)); + gdk_threads_leave (); + + return index; + } + +-static void +-item_activate (GtkItem *item __attribute__((unused)), +- struct item_event_hook_info *ie) ++void selection_changed (GtkComboBox *combobox, jobject peer) + { +- gdk_threads_leave (); ++ jstring label; ++ GtkTreeModel *model; ++ GtkTreeIter iter; ++ GValue value; ++ gchar *selected; ++ gint index; + +- jstring label = (*gdk_env)->NewStringUTF (gdk_env, ie->label); +- (*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj, +- choicePostItemEventID, +- label, +- (jint) AWT_ITEM_SELECTED); +- gdk_threads_enter (); +-} +- +-static void +-item_removed (gpointer data, +- GClosure gc __attribute__((unused))) +-{ +- struct item_event_hook_info *ie = data; +- +- free ((void *) ie->label); +- free (ie); +-} ++ index = gtk_combo_box_get_active(combobox); + +-static void +-connect_choice_item_selectable_hook (JNIEnv *env, +- jobject peer_obj, +- GtkItem *menuitem, +- const char *label) +-{ +- struct item_event_hook_info *ie; +- jobject *peer_objGlobPtr; ++ if (index >= 0) ++ { ++ model = gtk_combo_box_get_model (combobox); + +- ie = (struct item_event_hook_info *) +- malloc (sizeof (struct item_event_hook_info)); ++ gtk_combo_box_get_active_iter (combobox, &iter); + +- peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj); +- g_assert (peer_objGlobPtr); ++ gtk_tree_model_get (model, &iter, 0, &selected, -1); + +- ie->peer_obj = *peer_objGlobPtr; +- ie->label = strdup (label); ++ gdk_threads_leave (); + +- g_signal_connect_data (G_OBJECT (menuitem), "activate", +- GTK_SIGNAL_FUNC (item_activate), ie, +- (GClosureNotify) item_removed, 0); ++ label = (*gdk_env)->NewStringUTF (gdk_env, selected); ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ choicePostItemEventID, ++ label, ++ (jint) AWT_ITEM_SELECTED); ++ gdk_threads_enter (); ++ } + } +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v +retrieving revision 1.12 +diff -u -r1.12 gnu_java_awt_peer_gtk_GtkComponentPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 5 Jan 2004 21:13:46 -0000 1.12 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 6 Sep 2004 16:36:12 -0000 +@@ -1,5 +1,5 @@ + /* gtkcomponentpeer.c -- Native implementation of GtkComponentPeer +- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,28 +39,372 @@ + #include "gtkpeer.h" + #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + #include ++#include + + static GtkWidget *find_fg_color_widget (GtkWidget *widget); + static GtkWidget *find_bg_color_widget (GtkWidget *widget); ++static gboolean focus_in_cb (GtkWidget *widget, ++ GdkEventFocus *event, ++ jobject peer); ++static gboolean focus_out_cb (GtkWidget *widget, ++ GdkEventFocus *event, ++ jobject peer); ++/* ++ * This method returns a GDK keyval that corresponds to one of the ++ * keysyms in the X keymap table. The return value is only used to ++ * determine the keyval's corresponding hardware keycode, and doesn't ++ * reflect an accurate translation of a Java virtual key value to a ++ * GDK keyval. ++ */ ++#ifdef __GNUC__ ++__inline ++#endif ++static guint ++awt_keycode_to_keysym (jint keyCode, jint keyLocation) ++{ ++ /* GDK_A through GDK_Z */ ++ if (keyCode >= VK_A && keyCode <= VK_Z) ++ return gdk_keyval_to_lower (keyCode); ++ ++ /* GDK_0 through GDK_9 */ ++ if (keyCode >= VK_0 && keyCode <= VK_9) ++ return keyCode; + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose +- (JNIEnv *env, jobject obj) +-{ +- void *ptr; +- +- /* Remove entries from state tables */ +- NSA_DEL_GLOBAL_REF (env, obj); +- ptr = NSA_DEL_PTR (env, obj); +- +- gdk_threads_enter (); +- +- /* For now the native state for any object must be a widget. +- However, a subclass could override dispose() if required. */ +- gtk_widget_destroy (GTK_WIDGET (ptr)); +- +- gdk_threads_leave (); ++ switch (keyCode) ++ { ++ case VK_ENTER: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Enter : GDK_Return; ++ case VK_BACK_SPACE: ++ return GDK_BackSpace; ++ case VK_TAB: ++ return GDK_Tab; ++ case VK_CANCEL: ++ return GDK_Cancel; ++ case VK_CLEAR: ++ return GDK_Clear; ++ case VK_SHIFT: ++ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Shift_L : GDK_Shift_R; ++ case VK_CONTROL: ++ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Control_L : GDK_Control_R; ++ case VK_ALT: ++ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Alt_L : GDK_Alt_R; ++ case VK_PAUSE: ++ return GDK_Pause; ++ case VK_CAPS_LOCK: ++ return GDK_Caps_Lock; ++ case VK_ESCAPE: ++ return GDK_Escape; ++ case VK_SPACE: ++ return GDK_space; ++ case VK_PAGE_UP: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Up : GDK_Page_Up; ++ case VK_PAGE_DOWN: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Down : GDK_Page_Down; ++ case VK_END: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_End : GDK_End; ++ case VK_HOME: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Home : GDK_Home; ++ case VK_LEFT: ++ return GDK_Left; ++ case VK_UP: ++ return GDK_Up; ++ case VK_RIGHT: ++ return GDK_Right; ++ case VK_DOWN: ++ return GDK_Down; ++ case VK_COMMA: ++ return GDK_comma; ++ case VK_MINUS: ++ return GDK_minus; ++ case VK_PERIOD: ++ return GDK_period; ++ case VK_SLASH: ++ return GDK_slash; ++ /* ++ case VK_0: ++ case VK_1: ++ case VK_2: ++ case VK_3: ++ case VK_4: ++ case VK_5: ++ case VK_6: ++ case VK_7: ++ case VK_8: ++ case VK_9: ++ */ ++ case VK_SEMICOLON: ++ return GDK_semicolon; ++ case VK_EQUALS: ++ return GDK_equal; ++ /* ++ case VK_A: ++ case VK_B: ++ case VK_C: ++ case VK_D: ++ case VK_E: ++ case VK_F: ++ case VK_G: ++ case VK_H: ++ case VK_I: ++ case VK_J: ++ case VK_K: ++ case VK_L: ++ case VK_M: ++ case VK_N: ++ case VK_O: ++ case VK_P: ++ case VK_Q: ++ case VK_R: ++ case VK_S: ++ case VK_T: ++ case VK_U: ++ case VK_V: ++ case VK_W: ++ case VK_X: ++ case VK_Y: ++ case VK_Z: ++ */ ++ case VK_OPEN_BRACKET: ++ return GDK_bracketleft; ++ case VK_BACK_SLASH: ++ return GDK_backslash; ++ case VK_CLOSE_BRACKET: ++ return GDK_bracketright; ++ case VK_NUMPAD0: ++ return GDK_KP_0; ++ case VK_NUMPAD1: ++ return GDK_KP_1; ++ case VK_NUMPAD2: ++ return GDK_KP_2; ++ case VK_NUMPAD3: ++ return GDK_KP_3; ++ case VK_NUMPAD4: ++ return GDK_KP_4; ++ case VK_NUMPAD5: ++ return GDK_KP_5; ++ case VK_NUMPAD6: ++ return GDK_KP_6; ++ case VK_NUMPAD7: ++ return GDK_KP_7; ++ case VK_NUMPAD8: ++ return GDK_KP_8; ++ case VK_NUMPAD9: ++ return GDK_KP_9; ++ case VK_MULTIPLY: ++ return GDK_KP_Multiply; ++ case VK_ADD: ++ return GDK_KP_Add; ++ /* ++ case VK_SEPARATER: ++ */ ++ case VK_SEPARATOR: ++ return GDK_KP_Separator; ++ case VK_SUBTRACT: ++ return GDK_KP_Subtract; ++ case VK_DECIMAL: ++ return GDK_KP_Decimal; ++ case VK_DIVIDE: ++ return GDK_KP_Divide; ++ case VK_DELETE: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Delete : GDK_Delete; ++ case VK_NUM_LOCK: ++ return GDK_Num_Lock; ++ case VK_SCROLL_LOCK: ++ return GDK_Scroll_Lock; ++ case VK_F1: ++ return GDK_F1; ++ case VK_F2: ++ return GDK_F2; ++ case VK_F3: ++ return GDK_F3; ++ case VK_F4: ++ return GDK_F4; ++ case VK_F5: ++ return GDK_F5; ++ case VK_F6: ++ return GDK_F6; ++ case VK_F7: ++ return GDK_F7; ++ case VK_F8: ++ return GDK_F8; ++ case VK_F9: ++ return GDK_F9; ++ case VK_F10: ++ return GDK_F10; ++ case VK_F11: ++ return GDK_F11; ++ case VK_F12: ++ return GDK_F12; ++ case VK_F13: ++ return GDK_F13; ++ case VK_F14: ++ return GDK_F14; ++ case VK_F15: ++ return GDK_F15; ++ case VK_F16: ++ return GDK_F16; ++ case VK_F17: ++ return GDK_F17; ++ case VK_F18: ++ return GDK_F18; ++ case VK_F19: ++ return GDK_F19; ++ case VK_F20: ++ return GDK_F20; ++ case VK_F21: ++ return GDK_F21; ++ case VK_F22: ++ return GDK_F22; ++ case VK_F23: ++ return GDK_F23; ++ case VK_F24: ++ return GDK_F24; ++ case VK_PRINTSCREEN: ++ return GDK_Print; ++ case VK_INSERT: ++ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Insert : GDK_Insert; ++ case VK_HELP: ++ return GDK_Help; ++ case VK_META: ++ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Meta_L : GDK_Meta_R; ++ case VK_BACK_QUOTE: ++ return GDK_grave; ++ case VK_QUOTE: ++ return GDK_apostrophe; ++ case VK_KP_UP: ++ return GDK_KP_Up; ++ case VK_KP_DOWN: ++ return GDK_KP_Down; ++ case VK_KP_LEFT: ++ return GDK_KP_Left; ++ case VK_KP_RIGHT: ++ return GDK_KP_Right; ++ case VK_DEAD_GRAVE: ++ return GDK_dead_grave; ++ case VK_DEAD_ACUTE: ++ return GDK_dead_acute; ++ case VK_DEAD_CIRCUMFLEX: ++ return GDK_dead_circumflex; ++ case VK_DEAD_TILDE: ++ return GDK_dead_tilde; ++ case VK_DEAD_MACRON: ++ return GDK_dead_macron; ++ case VK_DEAD_BREVE: ++ return GDK_dead_breve; ++ case VK_DEAD_ABOVEDOT: ++ return GDK_dead_abovedot; ++ case VK_DEAD_DIAERESIS: ++ return GDK_dead_diaeresis; ++ case VK_DEAD_ABOVERING: ++ return GDK_dead_abovering; ++ case VK_DEAD_DOUBLEACUTE: ++ return GDK_dead_doubleacute; ++ case VK_DEAD_CARON: ++ return GDK_dead_caron; ++ case VK_DEAD_CEDILLA: ++ return GDK_dead_cedilla; ++ case VK_DEAD_OGONEK: ++ return GDK_dead_ogonek; ++ case VK_DEAD_IOTA: ++ return GDK_dead_iota; ++ case VK_DEAD_VOICED_SOUND: ++ return GDK_dead_voiced_sound; ++ case VK_DEAD_SEMIVOICED_SOUND: ++ return GDK_dead_semivoiced_sound; ++ case VK_AMPERSAND: ++ return GDK_ampersand; ++ case VK_ASTERISK: ++ return GDK_asterisk; ++ case VK_QUOTEDBL: ++ return GDK_quotedbl; ++ case VK_LESS: ++ return GDK_less; ++ case VK_GREATER: ++ return GDK_greater; ++ case VK_BRACELEFT: ++ return GDK_braceleft; ++ case VK_BRACERIGHT: ++ return GDK_braceright; ++ case VK_AT: ++ return GDK_at; ++ case VK_COLON: ++ return GDK_colon; ++ case VK_CIRCUMFLEX: ++ return GDK_asciicircum; ++ case VK_DOLLAR: ++ return GDK_dollar; ++ case VK_EURO_SIGN: ++ return GDK_EuroSign; ++ case VK_EXCLAMATION_MARK: ++ return GDK_exclam; ++ case VK_INVERTED_EXCLAMATION_MARK: ++ return GDK_exclamdown; ++ case VK_LEFT_PARENTHESIS: ++ return GDK_parenleft; ++ case VK_NUMBER_SIGN: ++ return GDK_numbersign; ++ case VK_PLUS: ++ return GDK_plus; ++ case VK_RIGHT_PARENTHESIS: ++ return GDK_parenright; ++ case VK_UNDERSCORE: ++ return GDK_underscore; ++ /* ++ case VK_FINAL: ++ case VK_CONVERT: ++ case VK_NONCONVERT: ++ case VK_ACCEPT: ++ */ ++ case VK_MODECHANGE: ++ return GDK_Mode_switch; ++ /* ++ case VK_KANA: ++ */ ++ case VK_KANJI: ++ return GDK_Kanji; ++ /* ++ case VK_ALPHANUMERIC: ++ */ ++ case VK_KATAKANA: ++ return GDK_Katakana; ++ case VK_HIRAGANA: ++ return GDK_Hiragana; ++ /* ++ case VK_FULL_WIDTH: ++ case VK_HALF_WIDTH: ++ case VK_ROMAN_CHARACTERS: ++ case VK_ALL_CANDIDATES: ++ */ ++ case VK_PREVIOUS_CANDIDATE: ++ return GDK_PreviousCandidate; ++ case VK_CODE_INPUT: ++ return GDK_Codeinput; ++ /* ++ case VK_JAPANESE_KATAKANA: ++ case VK_JAPANESE_HIRAGANA: ++ case VK_JAPANESE_ROMAN: ++ */ ++ case VK_KANA_LOCK: ++ return GDK_Kana_Lock; ++ /* ++ case VK_INPUT_METHOD_ON_OFF: ++ case VK_CUT: ++ case VK_COPY: ++ case VK_PASTE: ++ case VK_UNDO: ++ case VK_AGAIN: ++ case VK_FIND: ++ case VK_PROPS: ++ case VK_STOP: ++ case VK_COMPOSE: ++ case VK_ALT_GRAPH: ++ */ ++ default: ++ return GDK_VoidSymbol; ++ } + } + ++ + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor + (JNIEnv *env, jobject obj, jint type) +@@ -128,7 +472,65 @@ + gdk_threads_leave (); + } + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_requestFocus ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent ++ (JNIEnv *env, jobject obj, jobject parent) ++{ ++ void *ptr; ++ void *parent_ptr; ++ GtkWidget *widget; ++ GtkWidget *parent_widget; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ parent_ptr = NSA_GET_PTR (env, parent); ++ ++ gdk_threads_enter (); ++ ++ widget = GTK_WIDGET (ptr); ++ parent_widget = GTK_WIDGET (parent_ptr); ++ ++ if (GTK_IS_WINDOW (parent_widget)) ++ { ++ GList *children = gtk_container_children ++ (GTK_CONTAINER (GTK_BIN (parent_widget)->child)); ++ ++ if (GTK_IS_MENU_BAR (children->data)) ++ gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0); ++ else ++ gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0); ++ } ++ else ++ if (GTK_IS_SCROLLED_WINDOW (parent_widget)) ++ { ++ gtk_scrolled_window_add_with_viewport ++ (GTK_SCROLLED_WINDOW (parent_widget), widget); ++ gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent), ++ GTK_SHADOW_NONE); ++ ++ } ++ else ++ gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive ++ (JNIEnv *env, jobject obj, jboolean sensitive) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ gtk_widget_set_sensitive (GTK_WIDGET (ptr), sensitive); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus + (JNIEnv *env, jobject obj) + { + void *ptr; +@@ -141,6 +543,126 @@ + } + + /* ++ * Translate a Java KeyEvent object into a GdkEventKey event, then ++ * pass it to the GTK main loop for processing. ++ */ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent ++ (JNIEnv *env, jobject obj, jint id, jlong when, jint mods, ++ jint keyCode, jint keyLocation) ++{ ++ void *ptr; ++ GdkEvent *event = NULL; ++ GdkKeymapKey *keymap_keys = NULL; ++ gint n_keys = 0; ++ guint lookup_keyval = 0; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ if (id == AWT_KEY_PRESSED) ++ event = gdk_event_new (GDK_KEY_PRESS); ++ else if (id == AWT_KEY_RELEASED) ++ event = gdk_event_new (GDK_KEY_RELEASE); ++ else ++ { ++ gdk_threads_leave (); ++ /* Don't send AWT KEY_TYPED events to GTK. */ ++ return; ++ } ++ ++ if (GTK_IS_BUTTON (ptr)) ++ event->key.window = GTK_BUTTON (ptr)->event_window; ++ else if (GTK_IS_SCROLLED_WINDOW (ptr)) ++ event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child)->window; ++ else ++ event->key.window = GTK_WIDGET (ptr)->window; ++ ++ event->key.send_event = 0; ++ event->key.time = (guint32) when; ++ ++ if (mods & AWT_SHIFT_DOWN_MASK) ++ event->key.state |= GDK_SHIFT_MASK; ++ if (mods & AWT_CTRL_DOWN_MASK) ++ event->key.state |= GDK_CONTROL_MASK; ++ if (mods & AWT_ALT_DOWN_MASK) ++ event->key.state |= GDK_MOD1_MASK; ++ ++ /* This hack is needed because the AWT has no notion of num lock. ++ It infers numlock state from the only Java virtual keys that are ++ affected by it. */ ++ if (keyCode == VK_NUMPAD9 ++ || keyCode == VK_NUMPAD8 ++ || keyCode == VK_NUMPAD7 ++ || keyCode == VK_NUMPAD6 ++ || keyCode == VK_NUMPAD5 ++ || keyCode == VK_NUMPAD4 ++ || keyCode == VK_NUMPAD3 ++ || keyCode == VK_NUMPAD2 ++ || keyCode == VK_NUMPAD1 ++ || keyCode == VK_NUMPAD0 ++ || keyCode == VK_DECIMAL) ++ event->key.state |= GDK_MOD2_MASK; ++ ++ /* These values don't need to be filled in since GTK doesn't use ++ them. */ ++ event->key.length = 0; ++ event->key.string = NULL; ++ ++ lookup_keyval = awt_keycode_to_keysym (keyCode, keyLocation); ++ ++ if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), ++ lookup_keyval, ++ &keymap_keys, ++ &n_keys)) ++ { ++ /* No matching keymap entry was found. */ ++ g_printerr ("No matching keymap entries were found\n"); ++ gdk_threads_leave (); ++ return; ++ } ++ ++ /* Note: if n_keys > 1 then there are multiple hardware keycodes ++ that translate to lookup_keyval. We arbitrarily choose the first ++ hardware keycode from the list returned by ++ gdk_keymap_get_entries_for_keyval. */ ++ ++ event->key.hardware_keycode = keymap_keys[0].keycode; ++ event->key.group = keymap_keys[0].group; ++ ++ g_free (keymap_keys); ++ ++ if (!gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (), ++ event->key.hardware_keycode, ++ event->key.state, ++ event->key.group, ++ &event->key.keyval, ++ NULL, NULL, NULL)) ++ { ++ /* No matching keyval was found. */ ++ g_printerr ("No matching keyval was found\n"); ++ gdk_threads_leave (); ++ return; ++ } ++ ++ /* keyevent = (GdkEventKey *) event; */ ++ /* g_printerr ("generated event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */ ++ ++ /* We already received the original key event on the window itself, ++ so we don't want to resend it. */ ++ if (!GTK_IS_WINDOW (ptr)) ++ { ++ if (GTK_IS_SCROLLED_WINDOW (ptr)) ++ gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child), event); ++ else ++ gtk_widget_event (GTK_WIDGET (ptr), event); ++ } ++ ++ gdk_threads_leave (); ++} ++ ++/* + * Find the origin of a widget's window. + */ + JNIEXPORT void JNICALL +@@ -215,38 +737,39 @@ + + gdk_threads_enter (); + +- /* Save the widget's current size request. */ +- gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req); ++ /* Widgets that extend GtkWindow such as GtkFileChooserDialog may have ++ a default size. These values seem more useful then the natural ++ requisition values, particularly for GtkFileChooserDialog. */ ++ if (GTK_IS_WINDOW (ptr)) ++ { ++ gint width, height; ++ gtk_window_get_default_size (GTK_WINDOW (ptr), &width, &height); + +- /* Get the widget's "natural" size request. */ +- gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1); +- gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req); +- +- /* Reset the widget's size request. */ +- gtk_widget_set_size_request (GTK_WIDGET (ptr), +- current_req.width, current_req.height); ++ dims[0] = width; ++ dims[1] = height; ++ } ++ else ++ { ++ /* Save the widget's current size request. */ ++ gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req); + +- dims[0] = natural_req.width; +- dims[1] = natural_req.height; ++ /* Get the widget's "natural" size request. */ ++ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1); ++ gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req); ++ ++ /* Reset the widget's size request. */ ++ gtk_widget_set_size_request (GTK_WIDGET (ptr), ++ current_req.width, current_req.height); ++ ++ dims[0] = natural_req.width; ++ dims[1] = natural_req.height; ++ } + + gdk_threads_leave (); + + (*env)->ReleaseIntArrayElements (env, jdims, dims, 0); + } + +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetUsize (JNIEnv *env, +- jobject obj, jint w, jint h) +-{ +- void *ptr; +- +- ptr = NSA_GET_PTR (env, obj); +- +- gdk_threads_enter (); +- gtk_widget_set_usize (GTK_WIDGET (ptr), w, h); +- gdk_threads_leave (); +-} +- + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds + (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) + { +@@ -258,13 +781,17 @@ + gdk_threads_enter (); + + widget = GTK_WIDGET (ptr); ++ ++ /* We assume that -1 is a width or height and not a request for the ++ widget's natural size. */ ++ width = width < 0 ? 0 : width; ++ height = height < 0 ? 0 : height; ++ + if (GTK_IS_VIEWPORT (widget->parent)) +- { +- gtk_widget_set_usize (widget, width, height); +- } ++ gtk_widget_set_size_request (widget, width, height); + else + { +- gtk_widget_set_usize (widget, width, height); ++ gtk_widget_set_size_request (widget, width, height); + gtk_layout_move (GTK_LAYOUT (widget->parent), widget, x, y); + } + +@@ -380,36 +907,66 @@ + gdk_threads_leave (); + } + +-void +-set_visible (GtkWidget *widget, jboolean visible) ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont ++ (JNIEnv *env, jobject obj, jstring name, jint style, jint size) + { +- if (visible) +- gtk_widget_show (widget); +- else +- gtk_widget_hide (widget); ++ const char *font_name; ++ void *ptr; ++ PangoFontDescription *font_desc; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ font_name = (*env)->GetStringUTFChars (env, name, NULL); ++ ++ gdk_threads_enter(); ++ ++ font_desc = pango_font_description_from_string (font_name); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); ++ ++ gtk_widget_modify_font (GTK_WIDGET(ptr), font_desc); ++ ++ pango_font_description_free (font_desc); ++ ++ gdk_threads_leave(); ++ ++ (*env)->ReleaseStringUTFChars (env, name, font_name); + } + +-GtkLayout * +-find_gtk_layout (GtkWidget *parent) ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show ++ (JNIEnv *env, jobject obj) + { +- if (GTK_IS_WINDOW (parent)) +- { +- GList *children = gtk_container_children +- (GTK_CONTAINER (GTK_BIN (parent)->child)); ++ void *ptr; + +- if (GTK_IS_MENU_BAR (children->data)) +- return GTK_LAYOUT (children->next->data); +- else /* GTK_IS_LAYOUT (children->data) */ +- return GTK_LAYOUT (children->data); +- } ++ ptr = NSA_GET_PTR (env, obj); + +- return NULL; ++ gdk_threads_enter(); ++ gtk_widget_show (GTK_WIDGET (ptr)); ++ gdk_threads_leave(); + } + +-#define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass) ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkComponentPeer_hide ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter(); ++ gtk_widget_hide (GTK_WIDGET (ptr)); ++ gdk_threads_leave(); ++} + +-void +-set_parent (GtkWidget *widget, GtkContainer *parent) ++GtkLayout * ++find_gtk_layout (GtkWidget *parent) + { + if (GTK_IS_WINDOW (parent)) + { +@@ -417,32 +974,12 @@ + (GTK_CONTAINER (GTK_BIN (parent)->child)); + + if (GTK_IS_MENU_BAR (children->data)) +- gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0); ++ return GTK_LAYOUT (children->next->data); + else /* GTK_IS_LAYOUT (children->data) */ +- gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0); ++ return GTK_LAYOUT (children->data); + } +- else +- if (GTK_IS_SCROLLED_WINDOW (parent)) +- { +-/* if (WIDGET_CLASS (widget)->set_scroll_adjustments_signal) */ +-/* gtk_container_add (GTK_CONTAINER (parent), widget); */ +-/* else */ +-/* { */ +- gtk_scrolled_window_add_with_viewport +- (GTK_SCROLLED_WINDOW (parent), widget); +- gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent), +- GTK_SHADOW_NONE); +-/* } */ + +- } +-/* gtk_layout_put */ +-/* (GTK_LAYOUT (GTK_BIN (parent)->child), widget, 0, 0); */ +- +-/* if (GTK_IS_SCROLLED_WINDOW (parent)) */ +-/* gtk_layout_put */ +-/* (GTK_LAYOUT (GTK_BIN (GTK_BIN (parent)->child)->child), widget, 0, 0); */ +- else +- gtk_layout_put (GTK_LAYOUT (parent), widget, 0, 0); ++ return NULL; + } + + JNIEXPORT jboolean JNICALL +@@ -476,103 +1013,159 @@ + return retval; + } + +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_String_2 +- (JNIEnv *env, jobject obj, jstring jname, jstring jvalue) ++static gboolean ++filter_expose_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) + { +- const char *name; +- const char *value; +- void *ptr; +- +- ptr = NSA_GET_PTR (env, obj); +- name = (*env)->GetStringUTFChars (env, jname, NULL); +- value = (*env)->GetStringUTFChars (env, jvalue, NULL); +- +- gdk_threads_enter(); +- g_object_set(ptr, name, value, NULL); +- gdk_threads_leave(); +- +- (*env)->ReleaseStringUTFChars (env, jname, name); +- (*env)->ReleaseStringUTFChars (env, jvalue, value); ++ /* ++ * Prevent the default event handler from getting this signal if applicable ++ * FIXME: I came up with these filters by looking for patterns in the unwanted ++ * expose events that are fed back to us from gtk/X. Perhaps there is ++ * a way to prevent them from occuring in the first place. ++ */ ++ if (event->type == GDK_EXPOSE && (!GTK_IS_LAYOUT(widget) ++ || event->any.window != widget->window)) ++ { ++ g_signal_stop_emission_by_name(GTK_OBJECT(widget), "event"); ++ return FALSE; ++ } ++ else ++ { ++ /* There may be non-expose events that are triggered while we're ++ painting a heavyweight peer. */ ++ return pre_event_handler(widget, event, peer); ++ } + } + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Z +- (JNIEnv *env, jobject obj, jstring jname, jboolean value) ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter ++ (JNIEnv *env, jobject obj) + { +- const char *name; +- void *ptr; ++ GtkObject *filterobj; ++ GtkWidget *vbox, *layout; ++ GList *children; ++ void *ptr = NSA_GET_PTR (env, obj); ++ jobject *gref = NSA_GET_GLOBAL_REF (env, obj); ++ gulong hid; + +- ptr = NSA_GET_PTR (env, obj); ++ g_assert (gref); + +- name = (*env)->GetStringUTFChars (env, jname, NULL); ++ gdk_threads_enter (); + +- gdk_threads_enter(); +- g_object_set(ptr, name, value, NULL); +- gdk_threads_leave(); ++ /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. ++ Events go to the GtkLayout layer, so we filter them there. */ ++ if (GTK_IS_WINDOW(ptr)) ++ { ++ children = gtk_container_get_children(GTK_CONTAINER(ptr)); ++ vbox = children->data; ++ g_assert (GTK_IS_VBOX(vbox)); ++ ++ children = gtk_container_get_children(GTK_CONTAINER(vbox)); ++ do ++ { ++ layout = children->data; ++ children = children->next; ++ } ++ while (!GTK_IS_LAYOUT (layout) && children != NULL); ++ g_assert (GTK_IS_LAYOUT(layout)); ++ ++ filterobj = GTK_OBJECT(layout); ++ } ++ else if (GTK_IS_SCROLLED_WINDOW(ptr)) ++ { ++ /* The event will go to the parent GtkLayout. */ ++ filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); ++ } ++ else ++ { ++ filterobj = GTK_OBJECT(ptr); ++ } ++ hid = g_signal_handler_find(filterobj, ++ G_SIGNAL_MATCH_FUNC, ++ 0, 0, NULL, *pre_event_handler, NULL); ++ if (hid > 0) ++ { ++ g_signal_handler_block(filterobj, hid); ++ } ++ g_signal_connect( filterobj, "event", ++ G_CALLBACK(filter_expose_event_handler), *gref); + +- (*env)->ReleaseStringUTFChars (env, jname, name); ++ gdk_threads_leave (); + } + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2I +- (JNIEnv *env, jobject obj, jstring jname, jint value) ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter ++ (JNIEnv *env, jobject obj) + { +- const char *name; +- void *ptr; ++ GtkObject *filterobj; ++ GtkWidget *vbox, *layout; ++ GList *children; ++ void *ptr = NSA_GET_PTR (env, obj); ++ jobject *gref = NSA_GET_GLOBAL_REF (env, obj); ++ gulong hid; + +- ptr = NSA_GET_PTR (env, obj); +- name = (*env)->GetStringUTFChars (env, jname, NULL); ++ g_assert (gref); + +- gdk_threads_enter(); +- g_object_set(ptr, name, value, NULL); +- gdk_threads_leave(); ++ gdk_threads_enter (); + +- (*env)->ReleaseStringUTFChars (env, jname, name); +-} ++ /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. ++ Events go to the GtkLayout layer, so we filter them there. */ ++ if (GTK_IS_WINDOW(ptr)) ++ { ++ children = gtk_container_get_children(GTK_CONTAINER(ptr)); ++ vbox = children->data; ++ g_assert (GTK_IS_VBOX(vbox)); + +-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2F +- (JNIEnv *env, jobject obj, jstring jname, jfloat value) +-{ +- const char *name; +- void *ptr; ++ children = gtk_container_get_children(GTK_CONTAINER(vbox)); ++ do ++ { ++ layout = children->data; ++ children = children->next; ++ } ++ while (!GTK_IS_LAYOUT (layout) && children != NULL); ++ g_assert (GTK_IS_LAYOUT(layout)); + +- ptr = NSA_GET_PTR (env, obj); +- name = (*env)->GetStringUTFChars (env, jname, NULL); ++ filterobj = GTK_OBJECT(layout); ++ } ++ else if (GTK_IS_SCROLLED_WINDOW(ptr)) ++ { ++ /* The event will go to the parent GtkLayout. */ ++ filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); ++ } ++ else ++ { ++ filterobj = GTK_OBJECT(ptr); ++ } + +- gdk_threads_enter(); +- g_object_set(ptr, name, value, NULL); +- gdk_threads_leave(); ++ g_signal_handlers_disconnect_by_func (filterobj, ++ *filter_expose_event_handler, *gref); ++ hid = g_signal_handler_find(filterobj, ++ G_SIGNAL_MATCH_FUNC, ++ 0, 0, NULL, *pre_event_handler, NULL); ++ if (hid > 0) ++ { ++ g_signal_handler_unblock(filterobj, hid); ++ } + +- (*env)->ReleaseStringUTFChars (env, jname, name); ++ gdk_threads_leave (); + } + +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_Object_2 +- (JNIEnv *env, jobject obj1, jstring jname, jobject obj2) ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetQueueDrawArea ++ (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) + { +- const char *name; +- void *ptr1, *ptr2; ++ GdkRectangle rect; ++ void *ptr; + +- ptr1 = NSA_GET_PTR (env, obj1); +- ptr2 = NSA_GET_PTR (env, obj2); +- +- name = (*env)->GetStringUTFChars (env, jname, NULL); ++ ptr = NSA_GET_PTR (env, obj); + +- /* special case to catch where we need to set the parent */ +- if (!strcmp (name, "parent")) +- { +- gdk_threads_enter (); +- set_parent (GTK_WIDGET (ptr1), GTK_CONTAINER (ptr2)); +- gdk_threads_leave (); ++ rect.x = x + GTK_WIDGET(ptr)->allocation.x; ++ rect.y = y + GTK_WIDGET(ptr)->allocation.y; ++ rect.width = width; ++ rect.height = height; + +- (*env)->ReleaseStringUTFChars (env, jname, name); +- return; +- } ++ gdk_threads_enter (); + +- gdk_threads_enter(); +- g_object_set(ptr1, name, ptr2, NULL); +- gdk_threads_leave(); ++ gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0); ++ gdk_window_process_all_updates(); + +- (*env)->ReleaseStringUTFChars (env, jname, name); ++ gdk_threads_leave (); + } + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject +@@ -613,6 +1206,12 @@ + g_signal_connect (GTK_OBJECT (ptr), "event", + G_CALLBACK (pre_event_handler), *gref); + ++ g_signal_connect (G_OBJECT (ptr), "focus-in-event", ++ G_CALLBACK (focus_in_cb), *gref); ++ ++ g_signal_connect (G_OBJECT (ptr), "focus-out-event", ++ G_CALLBACK (focus_out_cb), *gref); ++ + gdk_threads_leave (); + } + +@@ -621,7 +1220,9 @@ + { + GtkWidget *fg_color_widget; + +- if (GTK_IS_EVENT_BOX (widget)) ++ if (GTK_IS_EVENT_BOX (widget) ++ || (GTK_IS_BUTTON (widget) ++ && !GTK_IS_OPTION_MENU (widget))) + fg_color_widget = gtk_bin_get_child (GTK_BIN(widget)); + else + fg_color_widget = widget; +@@ -651,3 +1252,26 @@ + return bg_color_widget; + } + ++static gboolean ++focus_in_cb (GtkWidget *widget __attribute((unused)), ++ GdkEventFocus *event __attribute((unused)), ++ jobject peer) ++{ ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postFocusEventID, ++ AWT_FOCUS_GAINED, ++ JNI_FALSE); ++ return FALSE; ++} ++ ++static gboolean ++focus_out_cb (GtkWidget *widget __attribute((unused)), ++ GdkEventFocus *event __attribute((unused)), ++ jobject peer) ++{ ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postFocusEventID, ++ AWT_FOCUS_LOST, ++ JNI_FALSE); ++ return FALSE; ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v +retrieving revision 1.17 +diff -u -r1.17 gnu_java_awt_peer_gtk_GtkEvents.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 13 Jan 2004 20:54:46 -0000 1.17 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 6 Sep 2004 16:36:13 -0000 +@@ -1,5 +1,5 @@ + /* gtkevents.c -- GDK/GTK event handlers +- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -58,11 +58,11 @@ + switch (button) + { + case 1: +- return AWT_BUTTON1_MASK; ++ return AWT_BUTTON1_DOWN_MASK; + case 2: +- return AWT_BUTTON2_MASK; ++ return AWT_BUTTON2_DOWN_MASK; + case 3: +- return AWT_BUTTON3_MASK; ++ return AWT_BUTTON3_DOWN_MASK; + } + + return 0; +@@ -74,11 +74,32 @@ + jint result = 0; + + if (state & GDK_SHIFT_MASK) +- result |= AWT_SHIFT_MASK; ++ result |= AWT_SHIFT_DOWN_MASK; + if (state & GDK_CONTROL_MASK) +- result |= AWT_CTRL_MASK; ++ result |= AWT_CTRL_DOWN_MASK; + if (state & GDK_MOD1_MASK) +- result |= AWT_ALT_MASK; ++ result |= AWT_ALT_DOWN_MASK; ++ ++ return result; ++} ++ ++static jint ++state_to_awt_mods_with_button_states (guint state) ++{ ++ jint result = 0; ++ ++ if (state & GDK_SHIFT_MASK) ++ result |= AWT_SHIFT_DOWN_MASK; ++ if (state & GDK_CONTROL_MASK) ++ result |= AWT_CTRL_DOWN_MASK; ++ if (state & GDK_MOD1_MASK) ++ result |= AWT_ALT_DOWN_MASK; ++ if (state & GDK_BUTTON1_MASK) ++ result |= AWT_BUTTON1_DOWN_MASK; ++ if (state & GDK_BUTTON2_MASK) ++ result |= AWT_BUTTON2_DOWN_MASK; ++ if (state & GDK_BUTTON3_MASK) ++ result |= AWT_BUTTON3_DOWN_MASK; + + return result; + } +@@ -103,29 +124,29 @@ + + if (event->key.keyval == GDK_Shift_L + || event->key.keyval == GDK_Shift_R) +- result |= AWT_SHIFT_MASK; ++ result |= AWT_SHIFT_DOWN_MASK; + else + { + if (state & GDK_SHIFT_MASK) +- result |= AWT_SHIFT_MASK; ++ result |= AWT_SHIFT_DOWN_MASK; + } + + if (event->key.keyval == GDK_Control_L + || event->key.keyval == GDK_Control_R) +- result |= AWT_CTRL_MASK; ++ result |= AWT_CTRL_DOWN_MASK; + else + { + if (state & GDK_CONTROL_MASK) +- result |= AWT_CTRL_MASK; ++ result |= AWT_CTRL_DOWN_MASK; + } + + if (event->key.keyval == GDK_Alt_L + || event->key.keyval == GDK_Alt_R) +- result |= AWT_ALT_MASK; ++ result |= AWT_ALT_DOWN_MASK; + else + { + if (state & GDK_MOD1_MASK) +- result |= AWT_ALT_MASK; ++ result |= AWT_ALT_DOWN_MASK; + } + } + else if (event->type == GDK_KEY_RELEASE) +@@ -136,20 +157,20 @@ + && event->key.keyval != GDK_Shift_R) + { + if (state & GDK_SHIFT_MASK) +- result |= AWT_SHIFT_MASK; ++ result |= AWT_SHIFT_DOWN_MASK; + } + if (event->key.keyval != GDK_Control_L + && event->key.keyval != GDK_Control_R) + { + if (state & GDK_CONTROL_MASK) +- result |= AWT_CTRL_MASK; ++ result |= AWT_CTRL_DOWN_MASK; + } + + if (event->key.keyval != GDK_Alt_L + && event->key.keyval != GDK_Alt_R) + { + if (state & GDK_MOD1_MASK) +- result |= AWT_ALT_MASK; ++ result |= AWT_ALT_DOWN_MASK; + } + } + +@@ -785,31 +806,6 @@ + } + } + +-/* Checks if keyval triggers a KEY_TYPED event on the source widget. +- This function identifies special keyvals that don't trigger +- GtkIMContext "commit" signals, but that do trigger Java KEY_TYPED +- events. */ +-static int +-generates_key_typed_event (GdkEvent *event, GtkWidget *source) +-{ +- guint keyval; +- +- if (!GTK_IS_ENTRY (source) +- && !GTK_IS_TEXT_VIEW (source)) +- return event->key.length ? 1 : 0; +- +- keyval = event->key.keyval; +- +- return (keyval == GDK_Escape +- || keyval == GDK_BackSpace +- || keyval == GDK_Delete +- || keyval == GDK_KP_Delete +- || keyval == GDK_Return +- || keyval == GDK_KP_Enter +- || (keyval == GDK_Tab +- && GTK_IS_TEXT_VIEW(source))) ? 1 : 0; +-} +- + void + awt_event_handler (GdkEvent *event) + { +@@ -830,6 +826,7 @@ + static GdkWindow *button_window = NULL; + static guint button_number = -1; + static jint click_count = 1; ++ static int hasBeenDragged; + + /* If it is not a focus change event, the widget must be realized already. + If not, ignore the event (Gtk+ will do the same). */ +@@ -888,13 +885,14 @@ + postMouseEventID, + AWT_MOUSE_PRESSED, + (jlong)event->button.time, +- state_to_awt_mods (event->button.state) | +- button_to_awt_mods (event->button.button), ++ state_to_awt_mods (event->button.state) ++ | button_to_awt_mods (event->button.button), + (jint)event->button.x, + (jint)event->button.y, + click_count, + (event->button.button == 3) ? JNI_TRUE : + JNI_FALSE); ++ hasBeenDragged = FALSE; + break; + case GDK_BUTTON_RELEASE: + { +@@ -904,17 +902,19 @@ + postMouseEventID, + AWT_MOUSE_RELEASED, + (jlong)event->button.time, +- state_to_awt_mods (event->button.state) | +- button_to_awt_mods (event->button.button), ++ state_to_awt_mods (event->button.state) ++ | button_to_awt_mods (event->button.button), + (jint)event->button.x, + (jint)event->button.y, + click_count, + JNI_FALSE); + +- /* check to see if the release occured in the window it was pressed +- in, and if so, generate an AWT click event */ ++ /* Generate an AWT click event only if the release occured in the ++ window it was pressed in, and the mouse has not been dragged since ++ the last time it was pressed. */ + gdk_window_get_size (event->any.window, &width, &height); +- if (event->button.x >= 0 ++ if (! hasBeenDragged ++ && event->button.x >= 0 + && event->button.y >= 0 + && event->button.x <= width + && event->button.y <= height) +@@ -923,8 +923,8 @@ + postMouseEventID, + AWT_MOUSE_CLICKED, + (jlong)event->button.time, +- state_to_awt_mods (event->button.state) | +- button_to_awt_mods (event->button.button), ++ state_to_awt_mods (event->button.state) ++ | button_to_awt_mods (event->button.button), + (jint)event->button.x, + (jint)event->button.y, + click_count, +@@ -933,15 +933,6 @@ + } + break; + case GDK_MOTION_NOTIFY: +- (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, +- AWT_MOUSE_MOVED, +- (jlong)event->motion.time, +- state_to_awt_mods (event->motion.state), +- (jint)event->motion.x, +- (jint)event->motion.y, +- 0, +- JNI_FALSE); +- + if (event->motion.state & (GDK_BUTTON1_MASK + | GDK_BUTTON2_MASK + | GDK_BUTTON3_MASK +@@ -952,30 +943,45 @@ + postMouseEventID, + AWT_MOUSE_DRAGGED, + (jlong)event->motion.time, +- state_to_awt_mods (event->motion.state), ++ state_to_awt_mods_with_button_states (event->motion.state), + (jint)event->motion.x, + (jint)event->motion.y, + 0, + JNI_FALSE); ++ hasBeenDragged = TRUE; + } ++ else ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, ++ AWT_MOUSE_MOVED, ++ (jlong)event->motion.time, ++ state_to_awt_mods (event->motion.state), ++ (jint)event->motion.x, ++ (jint)event->motion.y, ++ 0, ++ JNI_FALSE); + break; + case GDK_ENTER_NOTIFY: +- (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, +- AWT_MOUSE_ENTERED, +- (jlong)event->crossing.time, +- state_to_awt_mods (event->crossing.state), +- (jint)event->crossing.x, +- (jint)event->crossing.y, +- 0, +- JNI_FALSE); ++ /* We are not interested in enter events that are due to ++ grab/ungrab and not to actually crossing boundaries */ ++ if (event->crossing.mode == GDK_CROSSING_NORMAL) ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, ++ AWT_MOUSE_ENTERED, ++ (jlong)event->crossing.time, ++ state_to_awt_mods_with_button_states (event->crossing.state), ++ (jint)event->crossing.x, ++ (jint)event->crossing.y, ++ 0, ++ JNI_FALSE); + break; + case GDK_LEAVE_NOTIFY: ++ /* We are not interested in leave events that are due to ++ grab/ungrab and not to actually crossing boundaries */ + if (event->crossing.mode == GDK_CROSSING_NORMAL) + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_EXITED, + (jlong)event->crossing.time, +- state_to_awt_mods (event->crossing.state), ++ state_to_awt_mods_with_button_states (event->crossing.state), + (jint)event->crossing.x, + (jint)event->crossing.y, + 0, +@@ -983,11 +989,9 @@ + break; + case GDK_CONFIGURE: + { +- /* GtkWidget *widget; +- +- gdk_window_get_user_data (event->any.window, (void **) &widget); */ +- +- if (widget && GTK_WIDGET_TOPLEVEL (widget)) ++ /* Only send configure events to visible top-level windows. */ ++ if (widget && GTK_WIDGET_TOPLEVEL (widget) ++ && GTK_WIDGET_VISIBLE (widget)) + { + /* Configure events are not posted to the AWT event + queue, and as such, the gdk/gtk peer functions will +@@ -1007,112 +1011,70 @@ + break; + case GDK_EXPOSE: + { +- (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postExposeEventID, +- (jint)event->expose.area.x, +- (jint)event->expose.area.y, +- (jint)event->expose.area.width, +- (jint)event->expose.area.height); ++ /* This filters out unwanted feedback expose events from gtk/X ++ when we explictly invalidate and update heavyweight components, ++ thus avoiding an infinite loop. ++ FIXME: I'm not quite sure why we're getting these expose events. ++ Maybe there is a way to avoid them? */ ++ if((event->any.window == widget->window && event->any.send_event) ++ || GTK_IS_LAYOUT(widget)) ++ { ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postExposeEventID, ++ (jint)event->expose.area.x, ++ (jint)event->expose.area.y, ++ (jint)event->expose.area.width, ++ (jint)event->expose.area.height); ++ } + } + break; ++ + case GDK_FOCUS_CHANGE: + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postFocusEventID, +- (jint) (event->focus_change.in) ? ++ (jint) (event->focus_change.in) ? + AWT_FOCUS_GAINED : AWT_FOCUS_LOST, + JNI_FALSE); + break; + case GDK_KEY_PRESS: +- case GDK_KEY_RELEASE: +- { +- GdkWindow *obj_window; +- jobject *focus_obj_ptr = NULL; +- int generates_key_typed = 0; +- +- /* A widget with a grab will get key events */ +- if (!GTK_IS_WINDOW (widget)) +- focus_obj_ptr = &peer; +- else +- { +- GtkWindow *window; +- +- /* Check if we have an enabled focused widget in this window. +- If not don't handle the event. */ +- window = GTK_WINDOW (widget); +- if (!window->focus_widget +- || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget) +- || !window->focus_widget->window) +- return FALSE; +- +- /* TextArea peers are attached to the scrolled window +- that contains the GtkTextView, not to the text view +- itself. Same for List. */ +- if (GTK_IS_TEXT_VIEW (window->focus_widget) +- || GTK_IS_CLIST (window->focus_widget)) +- { +- obj_window = gtk_widget_get_parent (window->focus_widget)->window; +- } +- else if (GTK_IS_BUTTON (window->focus_widget)) +- /* GtkButton events go to the "event_window" and this is what +- we registered when the button was created. */ +- obj_window = GTK_BUTTON (window->focus_widget)->event_window; +- else +- obj_window = window->focus_widget->window; +- +- gdk_property_get (obj_window, +- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), +- gdk_atom_intern ("CARDINAL", FALSE), +- 0, +- sizeof (jobject), +- FALSE, +- NULL, +- NULL, +- NULL, +- (guchar **)&focus_obj_ptr); +- +- /* If the window has no jobject attached we can't send anything */ +- if (!focus_obj_ptr) +- return FALSE; +- +- /* Should we generate an AWT_KEY_TYPED event? */ +- generates_key_typed = generates_key_typed_event (event, window->focus_widget); +- } ++ if (GTK_IS_WINDOW (widget)) ++ { ++ /* GdkEventKey *keyevent = (GdkEventKey *) event; */ ++ /* g_printerr ("key press event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */ + +- if (event->type == GDK_KEY_PRESS) +- { +- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, +- postKeyEventID, +- (jint) AWT_KEY_PRESSED, +- (jlong) event->key.time, ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postKeyEventID, ++ (jint) AWT_KEY_PRESSED, ++ (jlong) event->key.time, + keyevent_state_to_awt_mods (event), + keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); +- +- if (generates_key_typed) +- { +- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, +- postKeyEventID, +- (jint) AWT_KEY_TYPED, +- (jlong) event->key.time, +- state_to_awt_mods (event->key.state), +- VK_UNDEFINED, +- keyevent_to_awt_keychar (event), +- AWT_KEY_LOCATION_UNKNOWN); +- } ++ /* FIXME: generation of key typed events needs to be moved ++ to GtkComponentPeer.postKeyEvent. If the key in a key ++ press event is not an "action" key ++ (KeyEvent.isActionKey) and is not a modifier key, then ++ it should generate a key typed event. */ ++ return TRUE; + } +- else /* GDK_KEY_RELEASE */ +- { +- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, +- postKeyEventID, +- (jint) AWT_KEY_RELEASED, +- (jlong) event->key.time, +- keyevent_state_to_awt_mods (event), +- keysym_to_awt_keycode (event), ++ else ++ return FALSE; ++ break; ++ case GDK_KEY_RELEASE: ++ if (GTK_IS_WINDOW (widget)) ++ { ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postKeyEventID, ++ (jint) AWT_KEY_RELEASED, ++ (jlong) event->key.time, ++ keyevent_state_to_awt_mods (event), ++ keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); +- } +- } ++ return TRUE; ++ } ++ else ++ return FALSE; + break; + default: + break; +@@ -1141,7 +1103,6 @@ + | GDK_KEY_PRESS_MASK + | GDK_FOCUS_CHANGE_MASK); + +- // g_print("storing obj %p property on window %p\n", obj, window); + gdk_property_change (window, + addr_atom, + type_atom, +@@ -1156,10 +1117,8 @@ + { + va_list ap; + jobject *obj; +- //void *ptr = NSA_GET_PTR (env, peer_obj); + + obj = NSA_GET_GLOBAL_REF (env, peer_obj); +- //g_print("Connection obj %s\n", gtk_widget_get_name (GTK_WIDGET (ptr))); + g_assert (obj); + + va_start (ap, nwindows); +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 8 Jan 2004 21:12:25 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -1,5 +1,5 @@ + /* gtkfiledialogpeer.c -- Native implementation of GtkFileDialogPeer +- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -40,13 +40,9 @@ + #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + #include "gnu_java_awt_peer_gtk_GtkFileDialogPeer.h" + +-static void window_closed (GtkDialog *dialog, ++static void handle_response (GtkDialog *dialog, + gint responseId, + jobject peer_obj); +-static void ok_clicked (GtkButton *button, +- jobject peer_obj); +-static void cancel_clicked (GtkButton *button, +- jobject peer_obj); + + /* + * Make a new file selection dialog +@@ -54,16 +50,28 @@ + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create +- (JNIEnv *env, jobject obj) ++ (JNIEnv *env, jobject obj, jobject parent) + { ++ void *parentp; + gpointer widget; + + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + ++ parentp = NSA_GET_PTR(env, parent); ++ + gdk_threads_enter (); + +- widget = gtk_file_selection_new (""); ++ widget = gtk_file_chooser_dialog_new("", ++ GTK_WINDOW(parentp), ++ GTK_FILE_CHOOSER_ACTION_OPEN, ++ GTK_STOCK_OK, GTK_RESPONSE_OK, ++ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, ++ NULL); ++ ++ /* GtkFileChooser doesn't show hidden files by default. */ ++ g_object_set(GTK_FILE_CHOOSER(widget), "show_hidden", TRUE); ++ + /* GtkFileSelect is not modal by default */ + gtk_window_set_modal (GTK_WINDOW (widget), TRUE); + +@@ -103,19 +111,9 @@ + + gtk_widget_realize (GTK_WIDGET (ptr)); + +- /* connect buttons to handlers */ +- + g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)), + "response", +- GTK_SIGNAL_FUNC (window_closed), *gref); +- +- g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (ptr)->ok_button), +- "clicked", +- GTK_SIGNAL_FUNC (ok_clicked), *gref); +- +- g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (ptr)->cancel_button), +- "clicked", +- GTK_SIGNAL_FUNC (cancel_clicked), *gref); ++ GTK_SIGNAL_FUNC (handle_response), *gref); + + gdk_threads_leave (); + +@@ -123,120 +121,171 @@ + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + } + +-/* +- * Set the filename in the file selection dialog. +- */ +- +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile +- (JNIEnv *env, jobject obj, jstring filename) ++JNIEXPORT jstring JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeGetDirectory ++ (JNIEnv *env, jobject obj) + { + void *ptr; + const char *str; + + ptr = NSA_GET_PTR (env, obj); + +- str = (*env)->GetStringUTFChars (env, filename, 0); +- + gdk_threads_enter (); + +- gtk_file_selection_set_filename (GTK_FILE_SELECTION (ptr), str); ++ str = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(ptr)); + + gdk_threads_leave (); + +- (*env)->ReleaseStringUTFChars (env, filename, str); ++ return (*env)->NewStringUTF(env, str); + } + +-static void +-window_closed (GtkDialog *dialog __attribute__((unused)), +- gint responseId, +- jobject peer_obj) +-{ +- static int isIDSet = 0; +- static jmethodID disposeID; +- void *ptr; + +- // We only need this for the case when the user closed the window +- if (responseId != GTK_RESPONSE_DELETE_EVENT) +- return; ++/* This function interfaces with the Java callback method of the same name. ++ This function extracts the filename from the GtkFileFilterInfo object, ++ and passes it to the Java method. The Java method will call the filter's ++ accept() method and will give back the return value. */ ++gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, ++ gpointer obj) ++{ ++ gchar* dirname; ++ jclass cx; ++ jmethodID id; ++ jstring *filename; ++ gboolean accepted; ++ ++ cx = (*gdk_env)->GetObjectClass (gdk_env, (jobject) obj); ++ id = (*gdk_env)->GetMethodID (gdk_env, cx, "filenameFilterCallback", ++ "(Ljava/lang/String;)Z"); + +- ptr = NSA_GET_PTR (gdk_env, peer_obj); ++ filename = (*gdk_env)->NewStringUTF(gdk_env, filter_info->filename); + +- if (!isIDSet) ++ gdk_threads_leave(); ++ accepted = (*gdk_env)->CallBooleanMethod(gdk_env, obj, id, filename); ++ gdk_threads_enter(); ++ ++ return accepted; ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFilenameFilter ++ (JNIEnv *env, jobject obj, jobject filter_obj) + { +- jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj); +- disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V"); +- isIDSet = 1; ++ void *ptr; ++ GtkFileFilter *filter; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ filter = gtk_file_filter_new(); ++ gtk_file_filter_add_custom(filter, ++ GTK_FILE_FILTER_FILENAME, ++ G_CALLBACK(filenameFilterCallback), ++ obj, ++ NULL); ++ ++ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter); ++ ++ gdk_threads_leave (); + } + ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetDirectory ++ (JNIEnv *env, jobject obj, jstring directory) ++{ ++ void *ptr; ++ const char *str; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ str = (*env)->GetStringUTFChars (env, directory, 0); ++ ++ gdk_threads_enter (); ++ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(ptr), str); + gdk_threads_leave (); + +- /* We can dispose of the dialog now (and unblock show) */ +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID); ++ (*env)->ReleaseStringUTFChars (env, directory, str); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile ++ (JNIEnv *env, jobject obj, jstring filename) ++{ ++ void *ptr; ++ const char *str; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ str = (*env)->GetStringUTFChars (env, filename, 0); + + gdk_threads_enter (); ++ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ptr), str); ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseStringUTFChars (env, filename, str); + } + + static void +-ok_clicked (GtkButton *button __attribute__((unused)), ++handle_response (GtkDialog *dialog __attribute__((unused)), ++ gint responseId, + jobject peer_obj) + { ++ static int isDisposeIDSet = 0; + static int isIDSet = 0; + static jmethodID gtkSetFilenameID; + static jmethodID hideID; ++ static jmethodID disposeID; + void *ptr; + G_CONST_RETURN gchar *fileName; ++ jstring str_fileName; + +- ptr = NSA_GET_PTR (gdk_env, peer_obj); ++ /* We only need this for the case when the user closed the window, ++ or clicked ok or cancel. */ ++ if (responseId != GTK_RESPONSE_DELETE_EVENT ++ && responseId != GTK_RESPONSE_OK ++ && responseId != GTK_RESPONSE_CANCEL) ++ return; + +- fileName = gtk_file_selection_get_filename ( +- GTK_FILE_SELECTION (GTK_WIDGET (ptr))); ++ ptr = NSA_GET_PTR (gdk_env, peer_obj); + +- if (!isIDSet) ++ if (responseId == GTK_RESPONSE_DELETE_EVENT) ++ { ++ if (!isDisposeIDSet) + { + jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj); +- hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V"); +- gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx, +- "gtkSetFilename", "(Ljava.lang.String;)V"); +- isIDSet = 1; ++ disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V"); ++ isDisposeIDSet = 1; + } + + gdk_threads_leave (); + +- /* Set the Java object field 'file' with this value. */ +- jstring str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName); +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName); +- +- /* We can hide the dialog now (and unblock show) */ +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID); ++ /* We can dispose of the dialog now (and unblock show) */ ++ (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID); + + gdk_threads_enter (); ++ return; + } + +-static void +-cancel_clicked (GtkButton *button __attribute__((unused)), +- jobject peer_obj) +-{ +- static int isIDSet = 0; +- static jmethodID gtkSetFilenameID; +- static jmethodID hideID; +- void *ptr; +- +- ptr = NSA_GET_PTR (gdk_env, peer_obj); ++ if (responseId == GTK_RESPONSE_OK) { ++ fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); ++ str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName); ++ } else if (responseId == GTK_RESPONSE_CANCEL) { ++ str_fileName = NULL; ++ } + + if (!isIDSet) + { + jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj); + hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V"); + gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx, +- "gtkSetFilename", "(Ljava.lang.String;)V"); ++ "gtkSetFilename", "(Ljava/lang/String;)V"); + isIDSet = 1; + } + + gdk_threads_leave (); + +- /* Set the Java object field 'file' with the null value. */ +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, NULL); ++ /* Set the Java object field 'file' with this value. */ ++ (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName); + + /* We can hide the dialog now (and unblock show) */ + (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID); +@@ -244,4 +293,3 @@ + gdk_threads_enter (); + } + +- +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c +=================================================================== +RCS file: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c +diff -N jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -0,0 +1,59 @@ ++/* gtkgenericpeer.c -- Native implementation of GtkGenericPeer ++ Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++#include "gtkpeer.h" ++#include "gnu_java_awt_peer_gtk_GtkGenericPeer.h" ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ ++ /* Remove entries from state tables */ ++ NSA_DEL_GLOBAL_REF (env, obj); ++ ptr = NSA_DEL_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ /* For now the native state for any object must be a widget. ++ However, a subclass could override dispose() if required. */ ++ gtk_widget_destroy (GTK_WIDGET (ptr)); ++ ++ gdk_threads_leave (); ++} ++ +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GtkImagePainter.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c 8 Oct 2003 15:49:33 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c 6 Sep 2004 16:36:13 -0000 +@@ -58,6 +58,9 @@ + + g = (struct graphics *) NSA_GET_PTR (env, gc_obj); + ++ if (!jpixels) ++ return; ++ + elems = (*env)->GetIntArrayElements (env, jpixels, NULL); + num_pixels = (*env)->GetArrayLength (env, jpixels); + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v +retrieving revision 1.6 +diff -u -r1.6 gnu_java_awt_peer_gtk_GtkLabelPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 13 Dec 2003 01:15:47 -0000 1.6 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -54,7 +54,7 @@ + str = (*env)->GetStringUTFChars (env, text, 0); + + gdk_threads_enter (); +- ++ + ebox = gtk_event_box_new (); + ebox_container = GTK_CONTAINER (ebox); + label = gtk_label_new (str); +@@ -70,6 +70,44 @@ + } + + JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkSetFont ++ (JNIEnv *env, jobject obj, jstring name, jint style, jint size) ++{ ++ const char *font_name; ++ void *ptr; ++ GtkWidget *label; ++ PangoFontDescription *font_desc; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ font_name = (*env)->GetStringUTFChars (env, name, NULL); ++ ++ gdk_threads_enter (); ++ ++ label = gtk_bin_get_child (GTK_BIN (ptr)); ++ ++ if (!label) ++ return; ++ ++ font_desc = pango_font_description_from_string (font_name); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); ++ ++ gtk_widget_modify_font (GTK_WIDGET (label), font_desc); ++ ++ pango_font_description_free (font_desc); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseStringUTFChars (env, name, font_name); ++} ++ ++JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText + (JNIEnv *env, jobject obj, jstring text) + { +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v +retrieving revision 1.7 +diff -u -r1.7 gnu_java_awt_peer_gtk_GtkListPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 13 Dec 2003 01:15:47 -0000 1.7 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -1,76 +1,116 @@ + /* gtklistpeer.c -- Native implementation of GtkListPeer +- Copyright (C) 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc. + +-This file is part of GNU Classpath. +- +-GNU Classpath is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-GNU Classpath is distributed in the hope that it will be useful, but +-WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with GNU Classpath; see the file COPYING. If not, write to the +-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +-02111-1307 USA. +- +-Linking this library statically or dynamically with other modules is +-making a combined work based on this library. Thus, the terms and +-conditions of the GNU General Public License cover the whole +-combination. +- +-As a special exception, the copyright holders of this library give you +-permission to link this library with independent modules to produce an +-executable, regardless of the license terms of these independent +-modules, and to copy and distribute the resulting executable under +-terms of your choice, provided that you also meet, for each linked +-independent module, the terms and conditions of the license of that +-module. An independent module is a module which is not derived from +-or based on this library. If you modify this library, you may extend +-this exception to your version of the library, but you are not +-obligated to do so. If you do not wish to do so, delete this +-exception statement from your version. */ ++ This file is part of GNU Classpath. + ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ + + #include "gtkpeer.h" +-#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + #include "gnu_java_awt_peer_gtk_GtkListPeer.h" + +-static void item_select (GtkCList *list __attribute__((unused)), +- int row, int col __attribute__((unused)), +- GdkEventButton *event __attribute__((unused)), +- jobject peer_obj); +-static void item_unselect (GtkCList *list __attribute__((unused)), +- int row, +- int col __attribute__((unused)), +- GdkEventButton *event __attribute__((unused)), +- jobject peer_obj); ++enum ++ { ++ COLUMN_STRING, ++ N_COLUMNS ++ }; ++ ++gboolean item_highlighted (GtkTreeSelection *selection, ++ GtkTreeModel *model, ++ GtkTreePath *path, ++ gboolean path_currently_selected, ++ jobject peer); + +-#define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child)) + +-JNIEXPORT void JNICALL ++#define TREE_VIEW_FROM_SW(obj) \ ++ (GTK_TREE_VIEW (GTK_SCROLLED_WINDOW (obj)->container.child)) ++ ++JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkListPeer_create +- (JNIEnv *env, jobject obj) ++ (JNIEnv *env, jobject obj, jint rows) + { +- GtkWidget *list, *sw; ++ GtkWidget *sw; ++ GtkWidget *list; ++ GtkCellRenderer *renderer; ++ GtkTreeViewColumn *column; ++ GtkListStore *list_store; ++ GtkTreeIter iter; ++ GtkRequisition req; ++ gint i; + + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); +- +- list = gtk_clist_new (1); +- gtk_widget_show (list); ++ ++ list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING); ++ /* Add the number of rows so that we can calculate the tree view's ++ size request. */ ++ for (i = 0; i < rows; i++) ++ { ++ gtk_list_store_append (list_store, &iter); ++ gtk_list_store_set (list_store, &iter, ++ COLUMN_STRING, "", ++ -1); ++ } ++ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store)); ++ renderer = gtk_cell_renderer_text_new (); ++ column = gtk_tree_view_column_new_with_attributes (NULL, ++ renderer, ++ "text", ++ COLUMN_STRING, ++ NULL); ++ + sw = gtk_scrolled_window_new (NULL, NULL); +- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), ++ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); ++ ++ gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); ++ ++ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (list), FALSE); ++ ++ gtk_widget_size_request (GTK_WIDGET (list), &req); ++ ++ gtk_widget_set_size_request (GTK_WIDGET (list), req.width, req.height); ++ + gtk_container_add (GTK_CONTAINER (sw), list); + ++ /* Remove the blank rows. */ ++ gtk_list_store_clear (list_store); ++ ++ gtk_widget_show (list); ++ gtk_widget_show (sw); ++ + gdk_threads_leave (); + + NSA_SET_PTR (env, obj, sw); +@@ -87,7 +127,6 @@ + gdk_threads_enter (); + + gtk_widget_realize (GTK_WIDGET (ptr)); +- + connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + + gdk_threads_leave (); +@@ -97,50 +136,105 @@ + Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals + (JNIEnv *env, jobject obj) + { +- GtkCList *list; +- void *ptr = NSA_GET_PTR (env, obj); +- jobject *gref = NSA_GET_GLOBAL_REF (env, obj); +- g_assert (gref); ++ void *ptr; ++ jobject *gref; ++ GtkTreeView *list; ++ GtkTreeSelection *selection; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ gref = NSA_GET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); + ++ g_assert (gref); ++ + gtk_widget_realize (GTK_WIDGET (ptr)); + +- /* connect selectable hook */ +- +- list = CLIST_FROM_SW (ptr); ++ list = TREE_VIEW_FROM_SW (ptr); + +- g_signal_connect (G_OBJECT (list), "select_row", +- GTK_SIGNAL_FUNC (item_select), *gref); ++ g_signal_connect (G_OBJECT (list), "event", ++ G_CALLBACK (pre_event_handler), *gref); + +- g_signal_connect (G_OBJECT (list), "unselect_row", +- GTK_SIGNAL_FUNC (item_unselect), *gref); ++ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list)); ++ gtk_tree_selection_set_select_function (selection, item_highlighted, ++ *gref, NULL); + +- /* Connect the superclass signals. */ +- /* FIXME: Cannot do that here or it will get the sw and not the list. +- We must a generic way of doing this. */ +- /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */ +- g_signal_connect (GTK_OBJECT (list), "event", +- G_CALLBACK (pre_event_handler), *gref); ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkSetFont ++ (JNIEnv *env, jobject obj, jstring name, jint style, jint size) ++{ ++ const char *font_name; ++ void *ptr; ++ GtkWidget *list; ++ PangoFontDescription *font_desc; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter(); ++ ++ list = GTK_WIDGET (TREE_VIEW_FROM_SW (ptr)); ++ ++ font_name = (*env)->GetStringUTFChars (env, name, NULL); ++ ++ font_desc = pango_font_description_from_string (font_name); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); ++ ++ if (style & AWT_STYLE_BOLD) ++ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); ++ ++ if (style & AWT_STYLE_ITALIC) ++ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); ++ ++ gtk_widget_modify_font (GTK_WIDGET (list), font_desc); ++ ++ pango_font_description_free (font_desc); ++ ++ (*env)->ReleaseStringUTFChars (env, name, font_name); ++ ++ gdk_threads_leave(); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetRequestFocus ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ GtkWidget *list; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ list = GTK_WIDGET (TREE_VIEW_FROM_SW (ptr)); ++ gtk_widget_grab_focus (list); + + gdk_threads_leave (); + } + +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkListPeer_append ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkListPeer_append + (JNIEnv *env, jobject obj, jobjectArray items) + { + void *ptr; +- GtkCList *list; +- jint count, i; ++ GtkTreeView *list; ++ GtkTreeIter iter; ++ GtkTreeModel *list_store; ++ jint count; ++ jint i; + + ptr = NSA_GET_PTR (env, obj); + + count = (*env)->GetArrayLength (env, items); + + gdk_threads_enter (); +- list = CLIST_FROM_SW (ptr); +- for (i = 0; i < count; i++) ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ list_store = gtk_tree_view_get_model (list); ++ ++ for (i = 0; i < count; i++) + { + const char *text; + jobject item; +@@ -148,11 +242,13 @@ + item = (*env)->GetObjectArrayElement (env, items, i); + + text = (*env)->GetStringUTFChars (env, item, NULL); +- gtk_clist_append (list, (char **)&text); ++ gtk_list_store_append (GTK_LIST_STORE (list_store), &iter); ++ gtk_list_store_set (GTK_LIST_STORE (list_store), &iter, ++ COLUMN_STRING, text, ++ -1); + (*env)->ReleaseStringUTFChars (env, item, text); + } + +- gtk_clist_columns_autosize (list); + gdk_threads_leave (); + } + +@@ -162,12 +258,26 @@ + { + void *ptr; + const char *str; +- ++ GtkTreeView *list; ++ GtkTreeIter iter; ++ GtkTreeModel *list_store; ++ + ptr = NSA_GET_PTR (env, obj); + str = (*env)->GetStringUTFChars (env, text, NULL); + + gdk_threads_enter (); +- gtk_clist_insert (CLIST_FROM_SW (ptr), index, (char **)&str); ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ list_store = gtk_tree_view_get_model (list); ++ ++ if (index == -1) ++ gtk_list_store_append (GTK_LIST_STORE (list_store), &iter); ++ else ++ gtk_list_store_insert (GTK_LIST_STORE (list_store), &iter, index); ++ ++ gtk_list_store_set (GTK_LIST_STORE (list_store), &iter, ++ COLUMN_STRING, str, -1); ++ + gdk_threads_leave (); + + (*env)->ReleaseStringUTFChars (env, text, str); +@@ -179,22 +289,32 @@ + (JNIEnv *env, jobject obj, jint start, jint end) + { + void *ptr; +- GtkCList *list; ++ GtkTreeView *list; ++ GtkTreeIter iter; ++ GtkTreeModel *list_store; + jint i; ++ jint num_items; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- list = CLIST_FROM_SW (ptr); + +- if (end == -1) /* special case for removing all rows */ +- gtk_clist_clear (list); ++ list = TREE_VIEW_FROM_SW (ptr); ++ list_store = gtk_tree_view_get_model (list); ++ ++ /* Special case: remove all rows. */ ++ if (end == -1) ++ gtk_list_store_clear (GTK_LIST_STORE (list_store)); + else + { +- gtk_clist_freeze (list); +- for (i = end; i >= start; i--) +- gtk_clist_remove (list, i); +- gtk_clist_thaw (list); ++ i = 0; ++ num_items = end - start + 1; ++ gtk_tree_model_iter_nth_child (list_store, &iter, NULL, start); ++ while (i < num_items) ++ { ++ gtk_list_store_remove (GTK_LIST_STORE (list_store), &iter); ++ i++; ++ } + } + + gdk_threads_leave (); +@@ -205,11 +325,17 @@ + (JNIEnv *env, jobject obj, jint index) + { + void *ptr; ++ GtkTreeView *list; ++ GtkTreePath *path; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gtk_clist_select_row (CLIST_FROM_SW (ptr), index, 0); ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ path = gtk_tree_path_new_from_indices (index, -1); ++ gtk_tree_view_set_cursor (list, path, NULL, FALSE); ++ + gdk_threads_leave (); + } + +@@ -218,40 +344,61 @@ + (JNIEnv *env, jobject obj, jint index) + { + void *ptr; ++ GtkTreeView *list; ++ GtkTreeSelection *selection; ++ GtkTreePath *path; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gtk_clist_unselect_row (CLIST_FROM_SW (ptr), index, 0); ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ selection = gtk_tree_view_get_selection (list); ++ path = gtk_tree_path_new_from_indices (index, -1); ++ gtk_tree_selection_unselect_path (selection, path); ++ + gdk_threads_leave (); + } + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize +- (JNIEnv *env, jobject obj, jint rows, jintArray jdims) ++ (JNIEnv *env, jobject obj, jint rows, jint visible_rows, jintArray jdims) + { + void *ptr; + jint *dims; +- GtkWidget *list; +- GtkScrolledWindow *sw; +- GtkRequisition myreq; ++ GtkRequisition current_req; ++ GtkRequisition natural_req; + + dims = (*env)->GetIntArrayElements (env, jdims, NULL); + dims[0] = dims[1] = 0; + +- if (rows < 3) +- rows = 3; +- + ptr = NSA_GET_PTR (env, obj); ++ + gdk_threads_enter (); + +- list = GTK_WIDGET (CLIST_FROM_SW (ptr)); +- sw = GTK_SCROLLED_WINDOW (ptr); ++ /* Save the widget's current size request. */ ++ gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req); ++ ++ /* Get the widget's "natural" size request. */ ++ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1); ++ gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req); ++ ++ /* Reset the widget's size request. */ ++ gtk_widget_set_size_request (GTK_WIDGET (ptr), ++ current_req.width, current_req.height); ++ ++ dims[0] = natural_req.width; ++ ++ /* Calculate the final height, by comparing the number of rows ++ in the list to the number of rows requested by the caller. ++ FIXME: Is there a GTK method that counts the number of rows ++ in the list? If so, we don't need to bring visible_rows from ++ the Java peer. */ ++ if (rows == visible_rows) ++ dims[1] = natural_req.height; ++ else ++ dims[1] = natural_req.height / visible_rows * rows; + +- gtk_widget_size_request(GTK_WIDGET(sw), &myreq); +- dims[1]=myreq.height; +- dims[0]=myreq.width; +- + gdk_threads_leave (); + + (*env)->ReleaseIntArrayElements (env, jdims, dims, 0); +@@ -263,31 +410,53 @@ + (JNIEnv *env, jobject obj) + { + void *ptr; +- GtkCList *list; +- jintArray selection; +- jint *sel; +- GList *child; +- jint count, i; ++ GtkTreeView *list; ++ GtkTreeSelection *selection; ++ jintArray result_array; ++ jint *result_array_iter; ++ GList *current_row; ++ GList *rows; ++ gint *indices; ++ jint count; ++ jint i; + + ptr = NSA_GET_PTR (env, obj); ++ + gdk_threads_enter (); + +- list = CLIST_FROM_SW (ptr); +- count = g_list_length (list->selection); ++ list = TREE_VIEW_FROM_SW (ptr); ++ selection = gtk_tree_view_get_selection (list); ++ count = gtk_tree_selection_count_selected_rows (selection); ++ if (count > 0) ++ { ++ current_row = rows = gtk_tree_selection_get_selected_rows (selection, NULL); + +- selection = (*env)->NewIntArray (env, count); +- sel = (*env)->GetIntArrayElements (env, selection, NULL); ++ result_array = (*env)->NewIntArray (env, count); ++ result_array_iter = (*env)->GetIntArrayElements (env, result_array, NULL); + +- for (i = 0, child = list->selection; i < count; i++) +- { +- sel[i] = GPOINTER_TO_INT (child->data); +- child = g_list_next (child); +- } +- gdk_threads_leave (); ++ for (i = 0; i < count; i++) ++ { ++ indices = gtk_tree_path_get_indices (current_row->data); ++ result_array_iter[i] = indices ? indices[0] : -1; ++ current_row = g_list_next (current_row); ++ } ++ ++ if (rows) ++ { ++ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); ++ g_list_free (rows); ++ } ++ ++ gdk_threads_leave (); + +- (*env)->ReleaseIntArrayElements (env, selection, sel, 0); ++ (*env)->ReleaseIntArrayElements (env, result_array, result_array_iter, 0); ++ ++ return result_array; ++ } ++ else ++ gdk_threads_leave (); + +- return selection; ++ return (jintArray) NULL; + } + + JNIEXPORT void JNICALL +@@ -295,11 +464,17 @@ + (JNIEnv *env, jobject obj, jint index) + { + void *ptr; ++ GtkTreeView *list; ++ GtkTreePath *path; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gtk_clist_moveto (CLIST_FROM_SW (ptr), index, 0, 0.5, 0.5); ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ path = gtk_tree_path_new_from_indices (index, -1); ++ gtk_tree_view_scroll_to_cell (list, path, NULL, FALSE, 0.0, 0.0); ++ + gdk_threads_leave (); + } + +@@ -308,40 +483,49 @@ + (JNIEnv *env, jobject obj, jboolean mode) + { + void *ptr; +- ++ GtkTreeView *list; ++ GtkTreeSelection *selection; ++ + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); +- gtk_clist_set_selection_mode (CLIST_FROM_SW (ptr), +- mode ? GTK_SELECTION_MULTIPLE : +- GTK_SELECTION_SINGLE); ++ ++ list = TREE_VIEW_FROM_SW (ptr); ++ selection = gtk_tree_view_get_selection (list); ++ gtk_tree_selection_set_mode (selection, ++ mode ? GTK_SELECTION_MULTIPLE ++ : GTK_SELECTION_SINGLE); ++ + gdk_threads_leave (); + } + +-static void +-item_select (GtkCList *list __attribute__((unused)), +- int row, int col __attribute__((unused)), +- GdkEventButton *event __attribute__((unused)), +- jobject peer_obj) +-{ +- //g_print ("select_row\n"); +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, +- postListItemEventID, +- row, +- (jint) AWT_ITEM_SELECTED); +-} +- +-static void +-item_unselect (GtkCList *list __attribute__((unused)), +- int row, +- int col __attribute__((unused)), +- GdkEventButton *event __attribute__((unused)), +- jobject peer_obj) +-{ +- //g_print ("unselect_row\n"); +- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, +- postListItemEventID, +- row, +- (jint) AWT_ITEM_DESELECTED); +-} ++gboolean ++item_highlighted (GtkTreeSelection *selection __attribute__((unused)), ++ GtkTreeModel *model, ++ GtkTreePath *path, ++ gboolean path_currently_selected, ++ jobject peer) ++{ ++ GtkTreeIter iter; ++ jint row; ++ gint *indices; ++ ++ if (gtk_tree_model_get_iter (model, &iter, path)) ++ { ++ indices = gtk_tree_path_get_indices (path); ++ row = indices ? indices[0] : -1; + ++ if (!path_currently_selected) ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postListItemEventID, ++ row, ++ (jint) AWT_ITEM_SELECTED); ++ else ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postListItemEventID, ++ row, ++ (jint) AWT_ITEM_DESELECTED); ++ } ++ ++ return TRUE; ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v +retrieving revision 1.12 +diff -u -r1.12 gnu_java_awt_peer_gtk_GtkMainThread.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 13 Jan 2004 20:54:46 -0000 1.12 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 6 Sep 2004 16:36:13 -0000 +@@ -63,19 +63,30 @@ + + JNIEnv *gdk_env; + +-#ifdef PORTABLE_NATIVE_SYNC +-JavaVM *gdk_vm; +-#endif +- + GtkWindowGroup *global_gtk_window_group; + ++static void init_glib_threads(JNIEnv *, jint); ++ ++double dpi_conversion_factor; ++ ++static void init_dpi_conversion_factor (); ++static void dpi_changed_cb (GtkSettings *settings, ++ GParamSpec *pspec); ++ + /* + * Call gtk_init. It is very important that this happen before any other + * gtk calls. ++ * ++ * The portableNativeSync argument may have the values: ++ * 1 if the Java property gnu.classpath.awt.gtk.portable.native.sync ++ * is set to "true". ++ * 0 if it is set to "false" ++ * -1 if unset. + */ + + JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) ++Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, ++ jint portableNativeSync) + { + int argc = 1; + char **argv; +@@ -85,23 +96,22 @@ + gtkmenuitempeer, gtktextcomponentpeer, window; + + NSA_INIT (env, clazz); ++ gdk_env = env; + + /* GTK requires a program's argc and argv variables, and requires that they +- be valid. */ +- +- argv = (char **) malloc (sizeof (char *) * 2); +- argv[0] = ""; ++ be valid. Set it up. */ ++ argv = (char **) g_malloc (sizeof (char *) * 2); ++ argv[0] = (char *) g_malloc(1); ++#if 1 ++ strcpy(argv[0], ""); ++#else /* The following is a more efficient alternative, but less intuitively ++ * expresses what we are trying to do. This code is only run once, so ++ * I'm going for intuitive. */ ++ argv[0][0] = '\0'; ++#endif + argv[1] = NULL; + +- /* until we have JDK 1.2 JNI, assume we have a VM with threads that +- match what GLIB was compiled for */ +-#ifdef PORTABLE_NATIVE_SYNC +- (*env)->GetJavaVM( env, &gdk_vm ); +- g_thread_init ( &g_thread_jni_functions ); +- printf("called gthread init\n"); +-#else +- g_thread_init ( NULL ); +-#endif ++ init_glib_threads(env, portableNativeSync); + + /* From GDK 2.0 onwards we have to explicitly call gdk_threads_init */ + gdk_threads_init(); +@@ -116,21 +126,19 @@ + we're shutting down. */ + atexit (gdk_threads_enter); + +- gdk_env = env; + gdk_event_handler_set ((GdkEventFunc)awt_event_handler, NULL, NULL); + + if ((homedir = getenv ("HOME"))) + { +- rcpath = (char *) malloc (strlen (homedir) + strlen (RC_FILE) + 2); ++ rcpath = (char *) g_malloc (strlen (homedir) + strlen (RC_FILE) + 2); + sprintf (rcpath, "%s/%s", homedir, RC_FILE); + } + + gtk_rc_parse ((rcpath) ? rcpath : RC_FILE); + +- if (rcpath) +- free (rcpath); +- +- free (argv); ++ g_free (rcpath); ++ g_free (argv[0]); ++ g_free (argv); + + /* setup cached IDs for posting GTK events to Java */ + /* gtkgenericpeer = (*env)->FindClass (env, */ +@@ -166,7 +174,7 @@ + "postMenuActionEvent", + "()V"); + postMouseEventID = (*env)->GetMethodID (env, gtkcomponentpeer, +- "postMouseEvent", "(IJIIIIZ)V"); ++ "postMouseEvent", "(IJIIIIZ)V"); + postConfigureEventID = (*env)->GetMethodID (env, gtkwindowpeer, + "postConfigureEvent", "(IIII)V"); + postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer, +@@ -194,8 +202,41 @@ + "postTextEvent", + "()V"); + global_gtk_window_group = gtk_window_group_new (); ++ ++ init_dpi_conversion_factor (); + } + ++ ++/** Initialize GLIB's threads properly, based on the value of the ++ gnu.classpath.awt.gtk.portable.native.sync Java system property. If ++ that's unset, use the PORTABLE_NATIVE_SYNC config.h macro. (TODO: ++ In some release following 0.10, that config.h macro will go away.) ++ */ ++static void ++init_glib_threads(JNIEnv *env, jint portableNativeSync) ++{ ++ if (portableNativeSync < 0) ++ { ++#ifdef PORTABLE_NATIVE_SYNC /* Default value, if not set by the Java system ++ property */ ++ portableNativeSync = 1; ++#else ++ portableNativeSync = 0; ++#endif ++ } ++ ++ (*env)->GetJavaVM( env, &the_vm ); ++ if (portableNativeSync) ++ g_thread_init ( &portable_native_sync_jni_functions ); ++ else ++ g_thread_init ( NULL ); ++ ++ /* Debugging progress message; uncomment if needed: */ ++ /* printf("called gthread init\n"); */ ++} ++ ++ ++ + /* + * Run gtk_main and block. + */ +@@ -207,3 +248,45 @@ + gtk_main (); + gdk_threads_leave (); + } ++ ++/* This is a big hack, needed until this pango bug is resolved: ++ http://bugzilla.gnome.org/show_bug.cgi?id=119081. ++ See: http://mail.gnome.org/archives/gtk-i18n-list/2003-August/msg00001.html ++ for details. */ ++static void ++init_dpi_conversion_factor () ++{ ++ GtkSettings *settings = gtk_settings_get_default (); ++ GObjectClass *klass; ++ ++ klass = G_OBJECT_CLASS (GTK_SETTINGS_GET_CLASS (settings)); ++ if (g_object_class_find_property (klass, "gtk-xft-dpi")) ++ { ++ int int_dpi; ++ g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL); ++ /* If int_dpi == -1 gtk-xft-dpi returns the default value. So we ++ have to do approximate calculation here. */ ++ if (int_dpi < 0) ++ dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; ++ else ++ dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); ++ ++ g_signal_connect (settings, "notify::gtk-xft-dpi", ++ G_CALLBACK (dpi_changed_cb), NULL); ++ } ++ else ++ /* Approximate. */ ++ dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; ++} ++ ++static void ++dpi_changed_cb (GtkSettings *settings, ++ GParamSpec *pspec __attribute__((unused))) ++{ ++ int int_dpi; ++ g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL); ++ if (int_dpi < 0) ++ dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; ++ else ++ dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GtkMenuBarPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c 13 Dec 2003 01:15:47 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -66,7 +66,30 @@ + menu = NSA_GET_PTR (env, menupeer); + + gdk_threads_enter (); +- gtk_menu_bar_append (GTK_MENU_BAR (mbar), GTK_WIDGET (menu)); ++ gtk_menu_shell_append (GTK_MENU_SHELL (mbar), GTK_WIDGET (menu)); ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_nativeSetHelpMenu ++ (JNIEnv *env, jobject obj, jobject menupeer) ++{ ++ static void *helpmenu; ++ void *mbar, *menu; ++ GList *list; ++ ++ mbar = NSA_GET_PTR (env, obj); ++ menu = NSA_GET_PTR (env, menupeer); ++ ++ gdk_threads_enter (); ++ if (helpmenu != NULL) ++ { ++ list = gtk_container_children (GTK_CONTAINER (mbar)); ++ while (list != NULL && list->data != helpmenu) ++ list = list->next; ++ if (list != NULL && list->data == helpmenu) ++ gtk_container_remove (GTK_CONTAINER (mbar), GTK_WIDGET (list->data)); ++ } ++ helpmenu = menu; + gdk_threads_leave (); + } + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c +=================================================================== +RCS file: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c +diff -N jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -0,0 +1,56 @@ ++/* gtkmenucomponentpeer.c -- Native implementation of GtkMenuComponentPeer ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++02111-1307 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++#include "gtkpeer.h" ++#include "gnu_java_awt_peer_gtk_GtkMenuComponentPeer.h" ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuComponentPeer_dispose ++ (JNIEnv *env, jobject obj) ++{ ++ /* For MenuComponents and its subclasses, the widgets are ++ automatically destroyed by Gtk when the parent MenuBar ++ is removed from the Frame. So we avoid the widget ++ destruction in GtkGenericPeer dispose() by overriding ++ it here. */ ++ ++ /* However, references to the Java objects still exist in the ++ state tables, so we still have to remove those. */ ++ ++ NSA_DEL_GLOBAL_REF (env, obj); ++ NSA_DEL_PTR (env, obj); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 13 Dec 2003 01:15:47 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -41,18 +41,16 @@ + #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + + static void item_activate (GtkMenuItem *item __attribute__((unused)), +- jobject *peer_obj); ++ jobject peer_obj); + + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create + (JNIEnv *env, jobject obj, jstring label) + { + GtkWidget *widget; + const char *str; +- jobject *gref; + + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); +- gref = NSA_GET_GLOBAL_REF (env, obj); + + str = (*env)->GetStringUTFChars (env, label, NULL); + +@@ -63,10 +61,6 @@ + else + widget = gtk_menu_item_new_with_label (str); + +- /* Connect activate hook */ +- g_signal_connect (G_OBJECT (widget), "activate", +- GTK_SIGNAL_FUNC (item_activate), *gref); +- + gtk_widget_show (widget); + + gdk_threads_leave (); +@@ -76,6 +70,34 @@ + NSA_SET_PTR (env, obj, widget); + } + ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_connectSignals ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr = NSA_GET_PTR (env, obj); ++ jobject *gref = NSA_GET_GLOBAL_REF (env, obj); ++ g_assert (gref); ++ ++ gdk_threads_enter (); ++ ++ g_signal_connect (G_OBJECT (ptr), "activate", ++ G_CALLBACK (item_activate), *gref); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setEnabled ++ (JNIEnv *env, jobject obj, jboolean enabled) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ gtk_widget_set_sensitive (GTK_WIDGET (ptr), enabled); ++ gdk_threads_leave (); ++} ++ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setLabel + (JNIEnv *env, jobject obj, jstring label) + { +@@ -104,9 +126,9 @@ + } + + static void +-item_activate (GtkMenuItem *item __attribute__((unused)), jobject *peer_obj) ++item_activate (GtkMenuItem *item __attribute__((unused)), jobject peer_obj) + { +- (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj, ++ (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, + postMenuActionEventID); + } + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GtkMenuPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 13 Dec 2003 01:15:47 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -1,5 +1,5 @@ + /* gtkmenupeer.c -- Native implementation of GtkMenuPeer +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -39,17 +39,6 @@ + #include "gtkpeer.h" + #include "gnu_java_awt_peer_gtk_GtkMenuPeer.h" + +-static void +-accel_attach (GtkMenuItem *menu_item, +- gpointer *user_data __attribute__((unused))) +-{ +- GtkAccelGroup *accel; +- +- accel = gtk_menu_get_accel_group (GTK_MENU (menu_item->submenu)); +- _gtk_accel_group_attach (accel, +- G_OBJECT (gtk_widget_get_toplevel (GTK_WIDGET(menu_item)))); +-} +- + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup + (JNIEnv *env, jobject obj, jobject parent) + { +@@ -62,14 +51,6 @@ + { + gtk_menu_set_accel_group (GTK_MENU (GTK_MENU_ITEM (ptr1)->submenu), + gtk_accel_group_new ()); +- +- if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1))) +- accel_attach (GTK_MENU_ITEM (ptr1), NULL); +- else +- g_signal_connect (G_OBJECT (ptr1), +- "realize", +- GTK_SIGNAL_FUNC (accel_attach), +- NULL); + } + else + { +@@ -89,7 +70,7 @@ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create + (JNIEnv *env, jobject obj, jstring label) + { +- GtkWidget *menu_title, *menu; ++ GtkWidget *menu_title, *menu, *toplevel; + const char *str; + + /* Create global reference and save it for future use */ +@@ -101,10 +82,21 @@ + + menu = gtk_menu_new (); + +- menu_title = gtk_menu_item_new_with_label (str); ++ if (str != NULL) ++ menu_title = gtk_menu_item_new_with_label (str); ++ else ++ menu_title = gtk_menu_item_new(); ++ + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_title), menu); + +- gtk_widget_show (menu); ++ /* Allow this menu to grab the pointer. */ ++ toplevel = gtk_widget_get_toplevel (menu); ++ if (GTK_IS_WINDOW (toplevel)) ++ { ++ gtk_window_group_add_window (global_gtk_window_group, ++ GTK_WINDOW(toplevel)); ++ } ++ + gtk_widget_show (menu_title); + + NSA_SET_PTR (env, obj, menu_title); +@@ -114,24 +106,42 @@ + (*env)->ReleaseStringUTFChars (env, label, str); + } + ++JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addTearOff ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr1; ++ GtkWidget *menu, *item; ++ ++ ptr1 = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (ptr1)); ++ item = gtk_tearoff_menu_item_new (); ++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); ++ gtk_widget_show (item); ++ ++ gdk_threads_leave (); ++} ++ + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem + (JNIEnv *env, jobject obj, jobject menuitempeer, jint key, jboolean shift) + { + void *ptr1, *ptr2; +- GtkMenu *menu; ++ GtkWidget *menu; + + ptr1 = NSA_GET_PTR (env, obj); + ptr2 = NSA_GET_PTR (env, menuitempeer); + + gdk_threads_enter (); + +- menu = GTK_MENU (GTK_MENU_ITEM (ptr1)->submenu); +- gtk_menu_append (menu, GTK_WIDGET (ptr2)); ++ menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(ptr1)); ++ gtk_menu_shell_append (GTK_MENU_SHELL(menu), GTK_WIDGET (ptr2)); + + if (key) + { + gtk_widget_add_accelerator (GTK_WIDGET (ptr2), "activate", +- gtk_menu_get_accel_group (menu), key, ++ gtk_menu_get_accel_group (GTK_MENU (menu)), key, + (GDK_CONTROL_MASK + | ((shift) ? GDK_SHIFT_MASK : 0)), + GTK_ACCEL_VISIBLE); +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v +retrieving revision 1.4 +diff -u -r1.4 gnu_java_awt_peer_gtk_GtkPanelPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 13 Dec 2003 01:15:47 -0000 1.4 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -53,19 +53,13 @@ + + widget = gtk_layout_new (NULL, NULL); + ++ GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); ++ + gdk_threads_leave (); + + NSA_SET_PTR (env, obj, widget); + } + +-typedef struct _GtkLayoutChild GtkLayoutChild; +- +-struct _GtkLayoutChild { +- GtkWidget *widget; +- gint x; +- gint y; +-}; +- + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject + (JNIEnv *env, jobject obj) +@@ -80,59 +74,3 @@ + + gdk_threads_leave (); + } +- +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals +- (JNIEnv *env, jobject obj) +-{ +- void *ptr = NSA_GET_PTR (env, obj); +- jobject *gref = NSA_GET_GLOBAL_REF (env, obj); +- g_assert (gref); +- +- gdk_threads_enter (); +- gtk_widget_realize (GTK_WIDGET (ptr)); +- +- /* FIXME: If we don't need this then remove this method. */ +-/* g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */ +-/* NULL); */ +- gdk_threads_leave (); +- +- /* Connect the superclass signals. */ +- Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); +-} +- +-/* FIXME: The following doesn't seem to be used. +- Is not declared as a native function in GtkPanelPeer.java */ +-/* +- * Make a new panel. +- */ +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkPanelPeer_gtkPanelNew +- (JNIEnv *env, jobject obj, jobject parent_obj) +-{ +- GtkWidget *layout; +- void *parent; +- +- /* Create global reference and save it for future use */ +- NSA_SET_GLOBAL_REF (env, obj); +- +- parent = NSA_GET_PTR (env, parent_obj); +- +- gdk_threads_enter (); +- +- layout = gtk_layout_new (NULL, NULL); +- +- set_parent (layout, GTK_CONTAINER (parent)); +- +- gtk_widget_realize (layout); +- +- connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window); +- +- set_visible (layout, 1); +- +- gdk_threads_leave (); +- +- NSA_SET_PTR (env, obj, layout); +-} +- +- +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c 8 Oct 2003 15:49:33 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -1,5 +1,5 @@ + /* gtkpopupmenupeer.c -- Native implementation of GtkPopupMenuPeer +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,7 +45,7 @@ + gint y; + }; + +-void ++static void + menu_pos (GtkMenu *menu __attribute__((unused)), + gint *x, gint *y, + gboolean *push_in, +@@ -72,7 +72,7 @@ + + gdk_threads_enter (); + gtk_menu_popup (GTK_MENU (GTK_MENU_ITEM (ptr)->submenu), +- NULL, NULL, menu_pos, p, 3, time); ++ NULL, NULL, menu_pos, p, 0, time); + gdk_threads_leave (); + + g_free (p); +@@ -91,7 +91,10 @@ + gdk_threads_enter (); + menu = GTK_MENU (GTK_MENU_ITEM (ptr1)->submenu); + gtk_menu_set_accel_group (menu, gtk_accel_group_new ()); ++ /* FIXME: update this to use GTK-2.4 GtkActions. */ ++#if 0 + _gtk_accel_group_attach (gtk_menu_get_accel_group (menu), + G_OBJECT (gtk_widget_get_toplevel (ptr2))); ++#endif + gdk_threads_leave (); + } +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v +retrieving revision 1.6 +diff -u -r1.6 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 13 Dec 2003 01:15:47 -0000 1.6 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -40,72 +40,14 @@ + #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + #include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h" + +-struct range_scrollbar +-{ +- GtkRange *range; +- jobject *scrollbar; +-}; +- +-static void +-post_change_event (GtkRange *range, +- struct range_scrollbar *rs) +-{ +- GtkAdjustment *adj; +- adj = gtk_range_get_adjustment (range); +- (*gdk_env)->CallVoidMethod (gdk_env, *(rs->scrollbar), postAdjustmentEventID, +- AWT_ADJUSTMENT_TRACK, (jint) adj->value); +- +-} +- +-static void +-post_adjustment_event (GtkRange *range, GtkScrollType scroll, +- struct range_scrollbar *rs) +-{ +- jint type; +- GtkAdjustment *adj; +- +- adj = gtk_range_get_adjustment (range); +- +- switch (scroll) +- { +- case GTK_SCROLL_STEP_UP: +- case GTK_SCROLL_STEP_RIGHT: +- case GTK_SCROLL_STEP_FORWARD: +- type = AWT_ADJUSTMENT_UNIT_INCREMENT; +- break; +- case GTK_SCROLL_STEP_DOWN: +- case GTK_SCROLL_STEP_LEFT: +- case GTK_SCROLL_STEP_BACKWARD: +- type = AWT_ADJUSTMENT_UNIT_DECREMENT; +- break; +- case GTK_SCROLL_PAGE_UP: +- case GTK_SCROLL_PAGE_RIGHT: +- case GTK_SCROLL_PAGE_FORWARD: +- type = AWT_ADJUSTMENT_BLOCK_INCREMENT; +- break; +- case GTK_SCROLL_PAGE_DOWN: +- case GTK_SCROLL_PAGE_LEFT: +- case GTK_SCROLL_PAGE_BACKWARD: +- type = AWT_ADJUSTMENT_BLOCK_DECREMENT; +- break; +- case GTK_SCROLL_JUMP: +- case GTK_SCROLL_NONE: /* Apparently generated when slider is dragged. */ +- type = AWT_ADJUSTMENT_TRACK; +- break; +- default: /* Can this happen? If so, is this right? */ +- return; +- } +- +- (*gdk_env)->CallVoidMethod (gdk_env, *(rs->scrollbar), postAdjustmentEventID, +- type, (jint) adj->value); +-} ++static void post_change_event (GtkRange *range, jobject peer); + + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create + (JNIEnv *env, jobject obj, jint orientation, jint value, + jint min, jint max, jint step_incr, jint page_incr, jint visible_amount) + { +- GtkWidget *sb; ++ GtkWidget *scrollbar; + GtkObject *adj; + + /* Create global reference and save it for future use */ +@@ -113,16 +55,26 @@ + + gdk_threads_enter (); + +- adj = gtk_adjustment_new (value, min, max, +- step_incr, page_incr, +- visible_amount); ++ adj = gtk_adjustment_new ((gdouble) value, ++ (gdouble) min, ++ (gdouble) max, ++ (gdouble) step_incr, ++ (gdouble) page_incr, ++ (gdouble) visible_amount); + +- sb = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) : ++ scrollbar = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) : + gtk_hscrollbar_new (GTK_ADJUSTMENT (adj)); + ++ GTK_RANGE (scrollbar)->round_digits = 0; ++ /* These calls seem redundant but they are not. They clamp values ++ so that the slider's entirety is always between the two ++ steppers. */ ++ gtk_range_set_range (GTK_RANGE (scrollbar), (gdouble) min, (gdouble) max); ++ gtk_range_set_value (GTK_RANGE (scrollbar), (gdouble) value); ++ + gdk_threads_leave (); + +- NSA_SET_PTR (env, obj, sb); ++ NSA_SET_PTR (env, obj, scrollbar); + } + + JNIEXPORT void JNICALL +@@ -137,7 +89,7 @@ + + gtk_widget_realize (GTK_WIDGET (ptr)); + +- connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range); ++ connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + + gdk_threads_leave (); + } +@@ -146,27 +98,14 @@ + Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals + (JNIEnv *env, jobject obj) + { +- struct range_scrollbar *rs; + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); + +- rs = (struct range_scrollbar *) malloc (sizeof (struct range_scrollbar)); +- + gdk_threads_enter (); + +- gtk_widget_realize (GTK_WIDGET (ptr)); +- +- rs->range = GTK_RANGE (ptr); +- rs->scrollbar = gref; +- +- g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), +- "move-slider", +- GTK_SIGNAL_FUNC (post_adjustment_event), rs); +- +- g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), +- "value-changed", +- GTK_SIGNAL_FUNC (post_change_event), rs); ++ g_signal_connect (G_OBJECT (ptr), "value-changed", ++ G_CALLBACK (post_change_event), *gref); + + gdk_threads_leave (); + +@@ -186,8 +125,8 @@ + + gdk_threads_enter (); + +- adj = GTK_RANGE (ptr)->adjustment; +- adj->step_increment = amount; ++ adj = gtk_range_get_adjustment (GTK_RANGE (ptr)); ++ adj->step_increment = (gdouble) amount; + gtk_adjustment_changed (adj); + + gdk_threads_leave (); +@@ -204,8 +143,8 @@ + + gdk_threads_enter (); + +- adj = GTK_RANGE (ptr)->adjustment; +- adj->page_increment = amount; ++ adj = gtk_range_get_adjustment (GTK_RANGE (ptr)); ++ adj->page_increment = (gdouble) amount; + gtk_adjustment_changed (adj); + + gdk_threads_leave (); +@@ -222,12 +161,22 @@ + + gdk_threads_enter (); + +- adj = GTK_RANGE (ptr)->adjustment; +- adj->value = value; +- adj->page_size = visible; +- adj->lower = min; +- adj->upper = max; ++ adj = gtk_range_get_adjustment (GTK_RANGE (ptr)); ++ adj->page_size = (gdouble) visible; ++ ++ gtk_range_set_range (GTK_RANGE (ptr), (gdouble) min, (gdouble) max); ++ gtk_range_set_value (GTK_RANGE (ptr), (gdouble) value); ++ + gtk_adjustment_changed (adj); + + gdk_threads_leave (); + } ++ ++static void ++post_change_event (GtkRange *range, jobject peer) ++{ ++ GtkAdjustment *adj; ++ adj = gtk_range_get_adjustment (range); ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, postAdjustmentEventID, ++ AWT_ADJUSTMENT_TRACK, (jint) adj->value); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v +retrieving revision 1.11 +diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 13 Jan 2004 20:58:33 -0000 1.11 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -54,6 +54,8 @@ + + text = gtk_text_view_new (); + gtk_widget_set_size_request (text, textview_width, textview_height); ++ gtk_text_view_set_cursor_visible(text, TRUE); ++ + gtk_widget_show (text); + + sw = gtk_scrolled_window_new (NULL, NULL); +@@ -156,7 +158,7 @@ + gdk_threads_enter(); + + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); +@@ -164,7 +166,7 @@ + if (style & AWT_STYLE_ITALIC) + pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + +- gtk_widget_modify_font (GTK_WIDGET(text), font_desc); ++ gtk_widget_modify_font (GTK_WIDGET (text), font_desc); + + pango_font_description_free (font_desc); + +@@ -173,6 +175,24 @@ + (*env)->ReleaseStringUTFChars (env, name, font_name); + } + ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetRequestFocus ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ GtkWidget *text; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ text = GTK_WIDGET (TEXT_FROM_SW (ptr)); ++ ++ gtk_widget_grab_focus (text); ++ ++ gdk_threads_leave (); ++} ++ + JNIEXPORT jint JNICALL + Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight + (JNIEnv *env, jobject obj) +@@ -188,9 +208,12 @@ + gdk_threads_enter (); + sw = GTK_SCROLLED_WINDOW (ptr); + +- gtk_widget_size_request (sw->hscrollbar, &requisition); +- gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL); +- height = requisition.height + spacing; ++ if (sw) ++ { ++ gtk_widget_size_request (sw->hscrollbar, &requisition); ++ gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL); ++ height = requisition.height + spacing; ++ } + + gdk_threads_leave (); + +@@ -212,9 +235,12 @@ + gdk_threads_enter (); + sw = GTK_SCROLLED_WINDOW (ptr); + +- gtk_widget_size_request (sw->vscrollbar, &requisition); +- gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL); +- width = requisition.width + spacing; ++ if (sw) ++ { ++ gtk_widget_size_request (sw->vscrollbar, &requisition); ++ gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL); ++ width = requisition.width + spacing; ++ } + + gdk_threads_leave (); + +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v +retrieving revision 1.11 +diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 13 Dec 2003 01:15:47 -0000 1.11 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -1,5 +1,5 @@ + /* gtktextcomponentpeer.c -- Native implementation of GtkTextComponentPeer +- Copyright (C) 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -40,10 +40,6 @@ + #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" + #include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h" + +-static void textcomponent_commit_cb (GtkIMContext *context, +- const gchar *str, +- jobject peer); +- + static void textcomponent_changed_cb (GtkEditable *editable, + jobject peer); + +@@ -61,9 +57,6 @@ + + if (GTK_IS_ENTRY(ptr)) + { +- g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit", +- G_CALLBACK (textcomponent_commit_cb), *gref); +- + g_signal_connect (GTK_EDITABLE (ptr), "changed", + G_CALLBACK (textcomponent_changed_cb), *gref); + +@@ -85,9 +78,6 @@ + + if (text) + { +- g_signal_connect (text->im_context, "commit", +- G_CALLBACK (textcomponent_commit_cb), *gref); +- + buf = gtk_text_view_get_buffer (text); + if (buf) + g_signal_connect (buf, "changed", +@@ -112,8 +102,8 @@ + { + void *ptr; + int pos = 0; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextMark *mark; + GtkTextIter iter; +@@ -157,10 +147,13 @@ + (JNIEnv *env, jobject obj, jint pos) + { + void *ptr; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextIter iter; ++ GtkTextMark *oldmark; ++ GtkTextIter olditer; ++ int oldpos; + + ptr = NSA_GET_PTR (env, obj); + +@@ -184,8 +177,24 @@ + if (text) + { + buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); ++ ++ /* Save old position. */ ++ oldmark = gtk_text_buffer_get_insert (buf); ++ gtk_text_buffer_get_iter_at_mark (buf, &olditer, oldmark); ++ oldpos = gtk_text_iter_get_offset (&olditer); ++ ++ /* Move to new position. */ + gtk_text_buffer_get_iter_at_offset (buf, &iter, pos); + gtk_text_buffer_place_cursor (buf, &iter); ++ ++ /* Scroll to new position. Alignment is determined ++ comparing the new position to the old position. */ ++ if (oldpos > pos) ++ gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (text), ++ &iter, 0, TRUE, 0, 0); ++ else if (oldpos < pos) ++ gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (text), ++ &iter, 0, TRUE, 1, 1); + } + } + +@@ -198,8 +207,8 @@ + { + void *ptr; + int pos = 0; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextIter start; + GtkTextIter end; +@@ -255,8 +264,8 @@ + { + void *ptr; + int pos = 0; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextIter start; + GtkTextIter end; +@@ -311,8 +320,8 @@ + (JNIEnv *env, jobject obj, jint start, jint end) + { + void *ptr; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextIter iter; + +@@ -357,8 +366,8 @@ + (JNIEnv *env, jobject obj, jboolean state) + { + void *ptr; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + + ptr = NSA_GET_PTR (env, obj); + +@@ -396,8 +405,8 @@ + void *ptr; + char *contents = NULL; + jstring jcontents; +- GtkEditable *editable; // type of GtkEntry (TextField) +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkEditable *editable; ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + GtkTextIter start, end; + +@@ -444,7 +453,7 @@ + { + void *ptr; + const char *str; +- GtkWidget *text = NULL; // type of GtkTextView (TextArea) ++ GtkWidget *text = NULL; + GtkTextBuffer *buf; + + ptr = NSA_GET_PTR (env, obj); +@@ -480,28 +489,6 @@ + } + + static void +-textcomponent_commit_cb (GtkIMContext *context __attribute__((unused)), +- const gchar *str, +- jobject peer) +-{ +- /* str is a \0-terminated UTF-8 encoded character. */ +- gunichar2 *jc = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL); +- GdkEvent *event = gtk_get_current_event (); +- +- if (jc) +- (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postKeyEventID, +- (jint) AWT_KEY_TYPED, +- (jlong) event->key.time, +- keyevent_state_to_awt_mods (event), +- VK_UNDEFINED, +- (jchar) jc[0], +- AWT_KEY_LOCATION_UNKNOWN); +- g_free (jc); +- gdk_event_free (event); +-} +- +-static void + textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)), + jobject peer) + { +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v +retrieving revision 1.9 +diff -u -r1.9 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 13 Dec 2003 01:15:47 -0000 1.9 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 6 Sep 2004 16:36:13 -0000 +@@ -39,48 +39,115 @@ + #include "gtkpeer.h" + #include "gnu_java_awt_peer_gtk_GtkTextFieldPeer.h" + ++static jint ++get_border_width (GtkWidget *entry); ++ + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create +- (JNIEnv *env, jobject obj) ++ (JNIEnv *env, jobject obj, jint text_width) + { +- GtkWidget *widget; ++ GtkWidget *entry; + + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); +- +- widget = gtk_entry_new (); ++ ++ entry = gtk_entry_new (); ++ gtk_widget_set_size_request (entry, ++ text_width + 2 * get_border_width (entry), -1); + + gdk_threads_leave (); + +- NSA_SET_PTR (env, obj, widget); ++ NSA_SET_PTR (env, obj, entry); + } + + JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetSize +- (JNIEnv *env, jobject obj, jintArray jdims) ++Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetSetBackground ++ (JNIEnv *env, jobject obj, jint red, jint green, jint blue) + { ++ GdkColor color; + void *ptr; +- jint *dims; +- GtkRequisition myreq; +- GtkWidget *entry; +- ++ + ptr = NSA_GET_PTR (env, obj); +- dims = (*env)->GetIntArrayElements (env, jdims, 0); +- ++ ++ color.red = (red / 255.0) * 65535; ++ color.green = (green / 255.0) * 65535; ++ color.blue = (blue / 255.0) * 65535; ++ + gdk_threads_enter (); +- +- entry = GTK_WIDGET (ptr); +- gtk_widget_size_request(entry, &myreq); +- dims[0]=myreq.width; +- dims[1]=myreq.height; +- ++ ++ gtk_widget_modify_base (GTK_WIDGET (ptr), GTK_STATE_NORMAL, &color); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetSetForeground ++ (JNIEnv *env, jobject obj, jint red, jint green, jint blue) ++{ ++ GdkColor color; ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ color.red = (red / 255.0) * 65535; ++ color.green = (green / 255.0) * 65535; ++ color.blue = (blue / 255.0) * 65535; ++ ++ gdk_threads_enter (); ++ ++ gtk_widget_modify_text (GTK_WIDGET (ptr), GTK_STATE_NORMAL, &color); ++ gtk_widget_modify_base (GTK_WIDGET (ptr), GTK_STATE_SELECTED, &color); ++ + gdk_threads_leave (); +- +- (*env)->ReleaseIntArrayElements (env, jdims, dims, 0); + } + ++JNIEXPORT jint JNICALL ++Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetBorderWidth ++ (JNIEnv *env, jobject obj) ++{ ++ void *ptr; ++ int border_width = 0; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ border_width = get_border_width (GTK_WIDGET (ptr)); ++ ++ gdk_threads_leave (); ++ ++ return border_width; ++} ++ ++/* GTK hard-codes this value. It is the space between a GtkEntry's ++ frame and its text. */ ++#define INNER_BORDER 2 ++ ++static jint ++get_border_width (GtkWidget *entry) ++{ ++ gint focus_width; ++ gboolean interior_focus; ++ int x_border_width = INNER_BORDER; ++ ++ gtk_widget_style_get (entry, ++ "interior-focus", &interior_focus, ++ "focus-line-width", &focus_width, ++ NULL); ++ ++ if (GTK_ENTRY (entry)->has_frame) ++ x_border_width += entry->style->xthickness; ++ ++ if (!interior_focus) ++ x_border_width += focus_width; ++ ++ return x_border_width; ++} ++ ++#undef INNER_BORDER ++ + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar + (JNIEnv *env, jobject obj, jchar c) +@@ -93,10 +160,12 @@ + gdk_threads_enter (); + + entry = GTK_ENTRY (ptr); +- +- if (c!=0) ++ ++ if (c != 0) + { +-/* gtk_entry_set_echo_char (entry, c); */ ++ /* FIXME: use gtk_entry_set_invisible_char (GtkEntry *entry, ++ gunichar ch) here. That means we must convert from jchar ++ (utf16) to gunichar (ucs4). */ + gtk_entry_set_visibility (entry, FALSE); + } + else +@@ -122,7 +191,7 @@ + gdk_threads_enter(); + + font_desc = pango_font_description_from_string (font_name); +- pango_font_description_set_size (font_desc, size * PANGO_SCALE); ++ pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c,v +retrieving revision 1.2 +diff -u -r1.2 gnu_java_awt_peer_gtk_GtkToolkit.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c 8 Oct 2003 15:49:33 -0000 1.2 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c 6 Sep 2004 16:36:13 -0000 +@@ -39,6 +39,8 @@ + #include "gtkpeer.h" + #include "gnu_java_awt_peer_gtk_GtkToolkit.h" + ++static jint gdk_color_to_java_color (GdkColor color); ++ + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkToolkit_beep + (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))) +@@ -88,3 +90,70 @@ + return res; + } + ++#define CONVERT(type, state) \ ++ gdk_color_to_java_color (style->type[GTK_STATE_ ## state]) ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkToolkit_loadSystemColors ++ (JNIEnv *env, jobject obj __attribute__((unused)), ++ jintArray jcolors) ++{ ++ jint *colors; ++ GtkStyle *style; ++ ++ colors = (*env)->GetIntArrayElements (env, jcolors, 0); ++ ++ gdk_threads_enter (); ++ ++ style = gtk_widget_get_default_style (); ++ ++ colors[AWT_DESKTOP] = CONVERT (bg, SELECTED); ++ colors[AWT_ACTIVE_CAPTION] = CONVERT (bg, SELECTED); ++ colors[AWT_ACTIVE_CAPTION_TEXT] = CONVERT (text, SELECTED); ++ colors[AWT_ACTIVE_CAPTION_BORDER] = CONVERT (fg, NORMAL); ++ colors[AWT_INACTIVE_CAPTION] = CONVERT (base, INSENSITIVE); ++ colors[AWT_INACTIVE_CAPTION_TEXT] = CONVERT (fg, INSENSITIVE); ++ colors[AWT_INACTIVE_CAPTION_BORDER] = CONVERT (fg, INSENSITIVE); ++ colors[AWT_WINDOW] = CONVERT (bg, NORMAL); ++ colors[AWT_WINDOW_BORDER] = CONVERT (fg, NORMAL); ++ colors[AWT_WINDOW_TEXT] = CONVERT (fg, NORMAL); ++ colors[AWT_MENU] = CONVERT (bg, NORMAL); ++ colors[AWT_MENU_TEXT] = CONVERT (fg, NORMAL); ++ colors[AWT_TEXT] = CONVERT (bg, NORMAL); ++ colors[AWT_TEXT_TEXT] = CONVERT (fg, NORMAL); ++ colors[AWT_TEXT_HIGHLIGHT] = CONVERT (bg, SELECTED); ++ colors[AWT_TEXT_HIGHLIGHT_TEXT] = CONVERT (fg, SELECTED); ++ colors[AWT_TEXT_INACTIVE_TEXT] = CONVERT (bg, INSENSITIVE); ++ colors[AWT_CONTROL] = CONVERT (bg, NORMAL); ++ colors[AWT_CONTROL_TEXT] = CONVERT (fg, NORMAL); ++ colors[AWT_CONTROL_HIGHLIGHT] = CONVERT (base, ACTIVE); ++ colors[AWT_CONTROL_LT_HIGHLIGHT] = CONVERT (bg, PRELIGHT); ++ colors[AWT_CONTROL_SHADOW] = CONVERT (bg, ACTIVE); ++ colors[AWT_CONTROL_DK_SHADOW] = CONVERT (fg, INSENSITIVE); ++ colors[AWT_SCROLLBAR] = CONVERT (base, INSENSITIVE); ++ colors[AWT_INFO] = CONVERT (bg, NORMAL); ++ colors[AWT_INFO_TEXT] = CONVERT (fg, NORMAL); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseIntArrayElements(env, jcolors, colors, 0); ++} ++ ++#undef CONVERT ++ ++static jint ++gdk_color_to_java_color (GdkColor gdk_color) ++{ ++ guchar red; ++ guchar green; ++ guchar blue; ++ float factor; ++ ++ factor = 255.0 / 65535.0; ++ ++ red = (float) gdk_color.red * factor; ++ green = (float) gdk_color.green * factor; ++ blue = (float) gdk_color.blue * factor; ++ ++ return (jint) (0xff000000 | (red << 16) | (green << 8) | blue); ++} +Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v +retrieving revision 1.12 +diff -u -r1.12 gnu_java_awt_peer_gtk_GtkWindowPeer.c +--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 13 Jan 2004 20:54:46 -0000 1.12 ++++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 6 Sep 2004 16:36:14 -0000 +@@ -44,27 +44,39 @@ + #include + #include + ++/* FIXME: we're currently seeing the double-activation that occurs ++ with metacity and GTK. See ++ http://bugzilla.gnome.org/show_bug.cgi?id=140977 for details. */ ++ + static void window_get_frame_extents (GtkWidget *window, + int *top, int *left, + int *bottom, int *right); + + static void request_frame_extents (GtkWidget *window); + +-static int property_notify_predicate (Display *xdisplay, +- XEvent *event, +- XPointer window_id); ++static Bool property_notify_predicate (Display *display, ++ XEvent *xevent, ++ XPointer arg); ++ ++static GtkLayout *find_layout (GtkWindow *window); + + static void window_delete_cb (GtkWidget *widget, GdkEvent *event, + jobject peer); + static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, + jobject peer); + static void window_show_cb (GtkWidget *widget, jobject peer); ++static void window_active_state_change_cb (GtkWidget *widget, ++ GParamSpec *pspec, ++ jobject peer); ++static void window_focus_state_change_cb (GtkWidget *widget, ++ GParamSpec *pspec, ++ jobject peer); + static gboolean window_focus_in_cb (GtkWidget * widget, +- GdkEventFocus *event, +- jobject peer); ++ GdkEventFocus *event, ++ jobject peer); + static gboolean window_focus_out_cb (GtkWidget * widget, +- GdkEventFocus *event, +- jobject peer); ++ GdkEventFocus *event, ++ jobject peer); + static gboolean window_window_state_cb (GtkWidget *widget, + GdkEvent *event, + jobject peer); +@@ -73,10 +85,6 @@ + GdkEventProperty *event, + jobject peer); + +-/* +- * Make a new window. +- */ +- + JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create + (JNIEnv *env, jobject obj, jint type, jboolean decorated, +@@ -96,7 +104,6 @@ + insets = (*env)->GetIntArrayElements (env, jinsets, 0); + insets[0] = insets[1] = insets[2] = insets[3] = 0; + +- /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); +@@ -155,6 +162,56 @@ + } + + JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetTitle ++ (JNIEnv *env, jobject obj, jstring title) ++{ ++ const char *c_title; ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ c_title = (*env)->GetStringUTFChars (env, title, NULL); ++ ++ gdk_threads_enter (); ++ ++ gtk_window_set_title (GTK_WINDOW (ptr), c_title); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseStringUTFChars (env, title, c_title); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetResizable ++ (JNIEnv *env, jobject obj, jboolean resizable) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ gtk_window_set_policy (GTK_WINDOW (ptr), resizable, resizable, FALSE); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetModal ++ (JNIEnv *env, jobject obj, jboolean modal) ++{ ++ void *ptr; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ gtk_window_set_modal (GTK_WINDOW (ptr), modal); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible + (JNIEnv *env, jobject obj, jboolean visible) + { +@@ -179,39 +236,22 @@ + (JNIEnv *env, jobject obj) + { + void *ptr; +- GtkWidget* vbox, *layout; +- GList* children; ++ GtkLayout *layout; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + +- children = gtk_container_get_children(GTK_CONTAINER(ptr)); +- vbox = children->data; +- +- if(!GTK_IS_VBOX(vbox)) +- { +- printf("*** this is not a vbox\n"); +- } +- children = gtk_container_get_children(GTK_CONTAINER(vbox)); +- layout = children->data; ++ layout = find_layout (GTK_WINDOW (ptr)); + +- if(!GTK_IS_LAYOUT(layout)) +- { +- printf("*** widget is not a layout ***"); +- } ++ gtk_widget_realize (GTK_WIDGET (layout)); + +- gtk_widget_realize (layout); +- +- connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window); ++ connect_awt_hook (env, obj, 1, layout->bin_window); + + gtk_widget_realize (ptr); + + connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + +- g_signal_connect (G_OBJECT (ptr), "property-notify-event", +- G_CALLBACK (window_property_changed_cb), obj); +- + gdk_threads_leave (); + } + +@@ -219,14 +259,24 @@ + Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals + (JNIEnv *env, jobject obj) + { +- void *ptr = NSA_GET_PTR (env, obj); +- jobject *gref = NSA_GET_GLOBAL_REF (env, obj); +- g_assert (gref); ++ void *ptr; ++ jobject *gref; ++ GtkLayout *layout; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gref = NSA_GET_GLOBAL_REF (env, obj); + + gdk_threads_enter (); + + gtk_widget_realize (ptr); + ++ /* Receive events from the GtkLayout too */ ++ layout = find_layout (GTK_WINDOW (ptr)); ++ ++ g_signal_connect (G_OBJECT (layout), "event", ++ G_CALLBACK (pre_event_handler), *gref); ++ + /* Connect signals for window event support. */ + g_signal_connect (G_OBJECT (ptr), "delete-event", + G_CALLBACK (window_delete_cb), *gref); +@@ -237,15 +287,24 @@ + g_signal_connect (G_OBJECT (ptr), "show", + G_CALLBACK (window_show_cb), *gref); + ++ g_signal_connect (G_OBJECT (ptr), "notify::is-active", ++ G_CALLBACK (window_active_state_change_cb), *gref); ++ ++ g_signal_connect (G_OBJECT (ptr), "notify::has-toplevel-focus", ++ G_CALLBACK (window_focus_state_change_cb), *gref); ++ + g_signal_connect (G_OBJECT (ptr), "focus-in-event", +- G_CALLBACK (window_focus_in_cb), *gref); ++ G_CALLBACK (window_focus_in_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "focus-out-event", +- G_CALLBACK (window_focus_out_cb), *gref); ++ G_CALLBACK (window_focus_out_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "window-state-event", + G_CALLBACK (window_window_state_cb), *gref); + ++ g_signal_connect (G_OBJECT (ptr), "property-notify-event", ++ G_CALLBACK (window_property_changed_cb), *gref); ++ + gdk_threads_leave (); + + /* Connect the superclass signals. */ +@@ -253,28 +312,6 @@ + } + + /* +- * Set a frame's title +- */ +- +-JNIEXPORT void JNICALL +-Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setTitle +- (JNIEnv *env, jobject obj, jstring title) +-{ +- void *ptr; +- const char *str; +- +- ptr = NSA_GET_PTR (env, obj); +- +- str = (*env)->GetStringUTFChars (env, title, NULL); +- +- gdk_threads_enter (); +- gtk_window_set_title (GTK_WINDOW (ptr), str); +- gdk_threads_leave (); +- +- (*env)->ReleaseStringUTFChars (env, title, str); +-} +- +-/* + * Lower the z-level of a window. + */ + +@@ -348,6 +385,20 @@ + + gdk_threads_enter (); + gtk_window_move (GTK_WINDOW(ptr), x, y); ++ /* The call to gdk_window_move is needed in addition to the call to ++ gtk_window_move. If gdk_window_move isn't called, then the ++ following set of operations doesn't give the expected results: ++ ++ 1. show a window ++ 2. manually move it to another position on the screen ++ 3. hide the window ++ 4. reposition the window with Component.setLocation ++ 5. show the window ++ ++ Instead of being at the position set by setLocation, the window ++ is reshown at the position to which it was moved manually. */ ++ gdk_window_move (GTK_WIDGET (ptr)->window, x, y); ++ + /* Need to change the widget's request size. */ + gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); + /* Also need to call gtk_window_resize. If the resize is requested +@@ -358,46 +409,196 @@ + } + + JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer ++ (JNIEnv *env, jobject obj) ++{ ++ void *wptr; ++ GtkWidget *box; ++ GtkWidget *mptr; ++ GList* children; ++ ++ wptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ box = GTK_BIN (wptr)->child; ++ ++ children = gtk_container_get_children (GTK_CONTAINER (box)); ++ ++ while (children != NULL && !GTK_IS_MENU_SHELL (children->data)) ++ { ++ children = children->next; ++ } ++ ++ /* If there isn't a MenuBar in this Frame's list of children ++ then we can just return. */ ++ if (!GTK_IS_MENU_SHELL (children->data)) ++ return; ++ else ++ mptr = children->data; ++ ++ /* This will actually destroy the MenuBar. By removing it from ++ its parent, the reference count for the MenuBar widget will ++ decrement to 0. The widget will be automatically destroyed ++ by Gtk. */ ++ gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr)); ++ ++ gdk_threads_leave(); ++} ++ ++JNIEXPORT void JNICALL + Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer + (JNIEnv *env, jobject obj, jobject menubar) + { +- void *wptr, *mptr; +- GtkBox *box; +- +- if (!menubar) return; ++ void *wptr; ++ GtkWidget *mptr; ++ GtkWidget *box; + + wptr = NSA_GET_PTR (env, obj); + mptr = NSA_GET_PTR (env, menubar); ++ ++ gdk_threads_enter (); + +- if (!mptr) return; /* this case should remove a menu */ ++ box = GTK_BIN (wptr)->child; ++ gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0); ++ ++ gtk_widget_show (mptr); + +- gdk_threads_enter (); +- box = GTK_BOX (GTK_BIN (wptr)->child); +- gtk_box_pack_start (box, GTK_WIDGET (mptr), 0, 0, 0); ++ + gdk_threads_leave (); + } + + JNIEXPORT jint JNICALL + Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight +- (JNIEnv *env, jobject obj) ++ (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar) ++{ ++ GtkWidget *ptr; ++ jint height; ++ GtkRequisition gtkreq; ++ ++ ptr = NSA_GET_PTR (env, menubar); ++ ++ gdk_threads_enter (); ++ gtk_widget_size_request (ptr, >kreq); ++ ++ height = gtkreq.height; ++ gdk_threads_leave (); ++ return height; ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFramePeer_moveLayout ++ (JNIEnv *env, jobject obj, jint offset) ++{ ++ void* ptr; ++ GList* children; ++ GtkLayout* layout; ++ GtkWidget* widget; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ layout = find_layout (GTK_WINDOW (ptr)); ++ ++ children = gtk_container_get_children (GTK_CONTAINER (layout)); ++ ++ while (children != NULL) ++ { ++ widget = children->data; ++ gtk_layout_move (layout, widget, widget->allocation.x, ++ widget->allocation.y+offset); ++ children = children->next; ++ } ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible ++ (JNIEnv *env, jobject obj, jboolean visible) ++{ ++ void* ptr; ++ GtkLayout* layout; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ gdk_threads_enter (); ++ ++ layout = find_layout (GTK_WINDOW (ptr)); ++ ++ if (visible) ++ gtk_widget_show (GTK_WIDGET (layout)); ++ else ++ gtk_widget_hide (GTK_WIDGET (layout)); ++ ++ gdk_threads_leave (); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder ++ (JNIEnv *env, jobject obj, jobject decoder) + { + void *ptr; +- GList *children; +- jint height = 0; ++ GdkPixbufLoader *loader = NULL; ++ GdkPixbuf *pixbuf = NULL; + + ptr = NSA_GET_PTR (env, obj); + ++ loader = NSA_GET_PB_PTR (env, decoder); ++ g_assert (loader != NULL); ++ + gdk_threads_enter (); +- children = gtk_container_children (GTK_CONTAINER (GTK_BIN (ptr)->child)); +- if (g_list_length (children) == 2) +- { +- GtkWidget *menubar = GTK_WIDGET (children->data); +- height = menubar->allocation.height; + +- } ++ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); ++ g_assert (pixbuf != NULL); ++ ++ gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); ++ + gdk_threads_leave (); ++} + +- return height; ++void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused))) ++{ ++ free(pixels); ++} ++ ++JNIEXPORT void JNICALL ++Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData ++ (JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height) ++{ ++ void *ptr; ++ GdkPixbuf *pixbuf; ++ jint *pixels; ++ int pixels_length, i; ++ guchar *data; ++ ++ ptr = NSA_GET_PTR (env, obj); ++ ++ pixels = (*env)->GetIntArrayElements (env, pixelArray, 0); ++ pixels_length = (*env)->GetArrayLength (env, pixelArray); ++ ++ data = malloc (sizeof (guchar) * pixels_length); ++ for (i = 0; i < pixels_length; i++) ++ data[i] = (guchar) pixels[i]; ++ ++ gdk_threads_enter (); ++ ++ pixbuf = gdk_pixbuf_new_from_data (data, ++ GDK_COLORSPACE_RGB, ++ TRUE, ++ 8, ++ width, ++ height, ++ width*4, ++ free_pixbuf_data, ++ NULL); ++ ++ gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); ++ ++ gdk_threads_leave (); ++ ++ (*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0); + } + + static void +@@ -491,7 +692,7 @@ + } + } + +-static int ++static Bool + property_notify_predicate (Display *xdisplay __attribute__((unused)), + XEvent *event, + XPointer window_id) +@@ -502,7 +703,7 @@ + && event->xany.window == *window + && event->xproperty.atom == extents_atom) + return True; +- ++ else + return False; + } + +@@ -538,40 +739,65 @@ + (jobject) NULL, (jint) 0); + } + ++static void ++window_active_state_change_cb (GtkWidget *widget, ++ GParamSpec *pspec, ++ jobject peer) ++{ ++ /* FIXME: not sure if this is needed or not. */ ++#if 0 ++ if (GTK_WINDOW (widget)->is_active) ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postWindowEventID, ++ (jint) AWT_WINDOW_GAINED_FOCUS, ++ (jobject) NULL, (jint) 0); ++ else ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postWindowEventID, ++ (jint) AWT_WINDOW_DEACTIVATED, ++ (jobject) NULL, (jint) 0); ++#endif ++ } ++ ++static void ++window_focus_state_change_cb (GtkWidget *widget, ++ GParamSpec *pspec, ++ jobject peer) ++ { ++ if (GTK_WINDOW (widget)->has_toplevel_focus) ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postWindowEventID, ++ (jint) AWT_WINDOW_ACTIVATED, ++ (jobject) NULL, (jint) 0); ++ else ++ (*gdk_env)->CallVoidMethod (gdk_env, peer, ++ postWindowEventID, ++ (jint) AWT_WINDOW_DEACTIVATED, ++ (jobject) NULL, (jint) 0); ++ } ++ + static gboolean +-window_focus_in_cb (GtkWidget * widget __attribute__((unused)), +- GdkEventFocus *event __attribute__((unused)), +- jobject peer) ++window_focus_in_cb (GtkWidget * widget, ++ GdkEventFocus *event, ++ jobject peer) + { +- /* FIXME: when hiding then showing, we get two sets of +- (LOST_FOCUS/DEACTIVATED, ACTIVATED/GAINED_FOCUS) events. */ + (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postWindowEventID, +- (jint) AWT_WINDOW_ACTIVATED, +- (jobject) NULL, (jint) 0); +- +- (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postWindowEventID, +- (jint) AWT_WINDOW_GAINED_FOCUS, +- (jobject) NULL, (jint) 0); +- return TRUE; ++ postWindowEventID, ++ (jint) AWT_WINDOW_GAINED_FOCUS, ++ (jobject) NULL, (jint) 0); ++ return FALSE; + } + + static gboolean +-window_focus_out_cb (GtkWidget * widget __attribute__((unused)), +- GdkEventFocus *event __attribute__((unused)), +- jobject peer) ++window_focus_out_cb (GtkWidget * widget, ++ GdkEventFocus *event, ++ jobject peer) + { + (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postWindowEventID, +- (jint) AWT_WINDOW_LOST_FOCUS, +- (jobject) NULL, (jint) 0); +- +- (*gdk_env)->CallVoidMethod (gdk_env, peer, +- postWindowEventID, +- (jint) AWT_WINDOW_DEACTIVATED, +- (jobject) NULL, (jint) 0); +- return TRUE; ++ postWindowEventID, ++ (jint) AWT_WINDOW_LOST_FOCUS, ++ (jobject) NULL, (jint) 0); ++ return FALSE; + } + + static gboolean +@@ -675,6 +901,7 @@ + gtkwindowpeer, + "postInsetsChangedEvent", + "(IIII)V"); ++ id_set = 1; + } + + if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom +@@ -697,3 +924,26 @@ + + return FALSE; + } ++ ++static GtkLayout * ++find_layout (GtkWindow *window) ++{ ++ GList* children; ++ GtkBox* vbox; ++ GtkLayout* layout; ++ ++ children = gtk_container_get_children (GTK_CONTAINER (window)); ++ vbox = children->data; ++ g_assert (GTK_IS_VBOX (vbox)); ++ ++ children = gtk_container_get_children (GTK_CONTAINER (vbox)); ++ do ++ { ++ layout = children->data; ++ children = children->next; ++ } ++ while (!GTK_IS_LAYOUT (layout) && children != NULL); ++ g_assert (GTK_IS_LAYOUT (layout)); ++ ++ return layout; ++} +Index: jni/gtk-peer/gthread-jni.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gthread-jni.c,v +retrieving revision 1.3 +diff -u -r1.3 gthread-jni.c +--- jni/gtk-peer/gthread-jni.c 8 Oct 2003 15:49:33 -0000 1.3 ++++ jni/gtk-peer/gthread-jni.c 6 Sep 2004 16:36:14 -0000 +@@ -1,5 +1,5 @@ + /* gthread-jni.c -- JNI threading routines for GLIB +- Copyright (C) 1998 Free Software Foundation, Inc. ++ Copyright (C) 1998, 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -40,130 +40,1166 @@ + /************************************************************************/ + + /* +- * Julian Dolby (dolby@us.ibm.com) +- * February 7, 2003 ++ * @author Julian Dolby (dolby@us.ibm.com) ++ * @date February 7, 2003 implemented for GLIB v.1 ++ * ++ * ++ * @author Steven Augart ++ * , ++ * @date April 30, 2004 -- May 10 2004: Support new functions for Glib v.2, ++ * fix cond_wait to free and re-acquire the mutex, ++ * replaced trylock stub implementation with a full one. + * + * This code implements the GThreadFunctions interface for GLIB using + * Java threading primitives. All of the locking and conditional variable + * functionality required by GThreadFunctions is implemented using the + * monitor and wait/notify functionality of Java objects. The thread- +- * local fucntionality uses the java.lang.ThreadLocal class. ++ * local functionality uses the java.lang.ThreadLocal class. ++ * ++ * Classpath's AWT support uses GTK+ peers. GTK+ uses GLIB. GLIB by default ++ * uses the platform's native threading model -- pthreads in most cases. If ++ * the Java runtime doesn't use the native threading model, then it needs this ++ * code in order to use Classpath's (GTK+-based) AWT routines. + * +- * This code is designed to be portable in that it makes no assumptions ++ * This code should be portable; I believe it makes no assumptions + * about the underlying VM beyond that it implements the JNI functionality + * that this code uses. + * +- * The one piece that does not really work is trylock for mutexes. The +- * Java locking model does not include such functionality, and I do not +- * see how to implement it without knowing something about how the VM +- * implements locking. ++ * Currently, use of this code is governed by the configuration option ++ * --enable-portable-native-sync. We will soon add a VM hook so the VM can ++ * select which threading model it wants to use at run time; at that point, ++ * the configuration option will go away. ++ * ++ * The code in this file uses only JNI 1.1, except for one JNI 1.2 function: ++ * GetEnv, in the JNI Invocation API. (There seems to be no way around using ++ * GetEnv). ++ * ++ * ACKNOWLEDGEMENT: ++ * ++ * I would like to thank Mark Wielaard for his kindness in spending at least ++ * six hours of his own time in reviewing this code and correcting my GNU ++ * coding and commenting style. --Steve Augart ++ * + * + * NOTES: + * +- * I have tested it only on JikesRVM---the CVS head as of early February +- * 2003. ++ * This code has been tested with Jikes RVM and with Kaffe. + * +- * Currently, use of this code is governed by the configuration option +- * --enable-portable-native-sync ++ * This code should have proper automated unit tests. I manually tested it ++ * by running an application that uses AWT. --Steven Augart + * ++ * MINOR NIT: ++ * ++ * - Using a jboolean in the arglist to "throw()" and "rethrow()" ++ * triggers many warnings from GCC's -Wconversion operation, because that ++ * is not the same as the conversion (upcast to an int) that would occur in ++ * the absence of a prototype. ++ * ++ * It would be very slightly more efficient to just pass the jboolean, but ++ * is not worth the clutter of messages. The right solution would be to ++ * turn off the -Wconversion warning for just this file, *except* that ++ * -Wconversion also warns you against constructs such as: ++ * unsigned u = -1; ++ * and that is a useful warning. So I went from a "jboolean" to a ++ * "gboolean" (-Wconversion is not enabled by default for GNU Classpath, ++ * but it is in my own CFLAGS, which, for gcc 3.3.3, read: -pipe -ggdb3 -W ++ * -Wall -Wbad-function-cast -Wcast-align -Wpointer-arith -Wcast-qual ++ * -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations ++ * -fkeep-static-consts -fkeep-inline-functions -Wundef -Wwrite-strings ++ * -Wno-aggregate-return -Wmissing-noreturn -Wnested-externs -Wtrigraphs ++ * -Wconversion -Wsign-compare -Wno-float-equal -Wmissing-format-attribute ++ * -Wno-unreachable-code -Wdisabled-optimization ) + */ + ++#include ++ ++/************************************************************************/ ++/* Configuration */ ++/************************************************************************/ ++ ++/** Tracing and Reporting **/ ++#define TRACE_API_CALLS 0 /* announce entry and exit into each method, ++ by printing to stderr. */ ++ ++#define TRACE_MONITORS 0 /* Every enterMonitor() and exitMonitor() goes ++ to stderr. */ ++ ++/** Trouble handling. There is a discussion below of this. **/ ++#define EXPLAIN_TROUBLE 1 /* Describe any unexpected trouble that ++ happens. This is a superset ++ of EXPLAIN_BROKEN, and if set trumps an ++ unset EXPLAIN_BROKEN. It is not a strict ++ superset, since at the moment there is no ++ TROUBLE that is not also BROKEN. ++ ++ Use criticalMsg() to describe the problem. ++ */ ++ ++#define EXPLAIN_BROKEN 1 /* Describe trouble that is serious enough to ++ be BROKEN. (Right now all trouble is at ++ least BROKEN.) */ ++ ++/* There is no EXPLAIN_BADLY_BROKEN definition. We always explain ++ BADLY_BROKEN trouble, since there is no other way to report it. */ ++ ++ ++/** Error Handling **/ ++#define DIE_IF_BROKEN 1 /* Dies if serious trouble happens. There is ++ really no non-serious trouble, except ++ possibly problems that arise during ++ pthread_create, which are reported by a ++ GError. ++ ++ If you do not set DIE_IF_BROKEN, then ++ trouble will raise a Java RuntimeException. ++ We probably do want to die right away, ++ since anything that's BROKEN really ++ indicates a programming error or a ++ system-wide error, and that's what the glib ++ documentation says you should do in case of ++ that kind of error in a glib-style ++ function. But it does work to turn this ++ off. */ ++ ++#if DIE_IF_BROKEN ++#define DIE_IF_BADLY_BROKEN 1 /* DIE_IF_BROKEN implies DIE_IF_BADLY_BROKEN */ ++#else ++#define DIE_IF_BADLY_BROKEN 1 /* Die if the system is badly broken -- ++ that is, if we have further trouble while ++ attempting to throw an exception ++ upwards, or if we are unable to generate ++ one of the classes we'll need in order to ++ throw wrapped exceptions upward. ++ ++ If unset, we will print a warning message, ++ and limp along anyway. Not that the system ++ is likely to work. */ ++#endif ++ ++/** Performance tuning parameters **/ ++ ++#define ENABLE_EXPENSIVE_ASSERTIONS 0 /* Enable expensive assertions? */ ++ ++#define DELETE_LOCAL_REFS 1 /* Whether to delete local references. ++ ++ JNI only guarantees that there wil be 16 ++ available. (Jikes RVM provides an number ++ only limited by VM memory.) ++ ++ Jikes RVM will probably perform faster if ++ this is turned off, but other VMs may need ++ this to be turned on in order to perform at ++ all, or might need it if things change. ++ ++ Remember, we don't know how many of those ++ local refs might have already been used up ++ by higher layers of JNI code that end up ++ calling g_thread_self(), ++ g_thread_set_private(), and so on. ++ ++ We set this to 1 for GNU Classpath, since ++ one of our principles is "always go for the ++ most robust implementation" */ ++ ++#define HAVE_JNI_VERSION_1_2 0 /* Assume we don't. We could ++ dynamically check for this. We will ++ assume JNI 1.2 in later versions of ++ Classpath. ++ ++ As it stands, the code in this file ++ already needs one JNI 1.2 function: ++ GetEnv, in the JNI Invocation API. ++ ++ TODO This code hasn't been tested yet. ++ And really hasn't been implemented yet. ++ */ + + /************************************************************************/ + /* Global data */ + /************************************************************************/ + ++#if defined HAVE_STDINT_H ++#include /* provides intptr_t */ ++#elif defined HAVE_INTTYPES_H ++#include ++#endif ++#include /* snprintf */ ++#include /* va_list */ + #include "gthread-jni.h" ++#include /* assert() */ ++ ++/* For Java thread priority constants. */ ++#include ++ ++/* Since not all JNI header generators actually define constants we ++ define them here explicitly. */ ++#ifndef gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MIN_PRIORITY ++#define gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MIN_PRIORITY 1 ++#endif ++#ifndef gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_NORM_PRIORITY ++#define gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_NORM_PRIORITY 5 ++#endif ++#ifndef gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MAX_PRIORITY ++#define gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MAX_PRIORITY 10 ++#endif ++ ++/* The VM handle. This is set in ++ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit */ ++JavaVM *the_vm; + +-/* The VM handle. This is set in GtkToolkitMain.gtkInit */ +-JavaVM *gdk_vm; ++/* Unions used for type punning. */ ++union env_union ++{ ++ void **void_env; ++ JNIEnv **jni_env; ++}; ++ ++union func_union ++{ ++ void *void_func; ++ GThreadFunc g_func; ++}; ++ ++/* Forward Declarations for Functions */ ++static int threadObj_set_priority (JNIEnv * env, jobject threadObj, ++ GThreadPriority gpriority); ++static void fatalMsg (const char fmt[], ...) ++ __attribute__ ((format (printf, 1, 2))) ++ __attribute__ ((noreturn)); ++ ++static void criticalMsg (const char fmt[], ...) ++ __attribute__ ((format (printf, 1, 2))); + ++static void tracing (const char fmt[], ...) ++ __attribute__ ((format (printf, 1, 2))); ++ ++static jint javaPriorityLevel (GThreadPriority priority) ++ __attribute__ ((const)); + + /************************************************************************/ +-/* Utilities to reflect exceptions back to the VM */ ++/* Trouble-handling, including utilities to reflect exceptions */ ++/* back to the VM. Also some status reporting. */ + /************************************************************************/ + +-/* This function checks for a pending exception, and rethrows it with ++/* How are we going to handle problems? ++ ++ There are several approaches: ++ ++ 1) Report them with the GError mechanism. ++ ++ (*thread_create)() is the only one of these functions that takes a ++ GError pointer. And the only G_THREAD error defined maps onto EAGAIN. ++ We don't have any errors in our (*thread_create)() implementation that ++ can be mapped to EAGAIN. So this idea is a non-starter. ++ ++ 2) Reflect the exception back to the VM, wrapped in a RuntimeException. ++ This will fail sometimes, if we're so broken (BADLY_BROKEN) that we ++ fail to throw the exception. ++ ++ 3) Abort execution. This is what the glib functions themselves do for ++ errors that they can't report via GError. ++ ++ Enable DIE_IF_BROKEN and/or DIE_IF_BADLY_BROKEN to ++ make this the default for BROKEN and/or BADLY_BROKEN trouble. ++ ++ 4) Display messages to stderr. We always do this for BADLY_BROKEN ++ trouble. The glib functions do that for errors they can't report via ++ GError. ++ ++ There are some complications. ++ ++ When I attempted to report a problem in g_thread_self() using g_critical (a ++ macro around g_log(), I found that g_log in turn looks for thread-private ++ data and calls g_thread_self() again. ++ ++ We got a segfault, probably due to stack overflow. So, this code doesn't ++ use the g_critical() and g_error() functions any more. Nor do we use ++ g_assert(); we use the C library's assert() instead. ++*/ ++ ++ ++#define WHERE __FILE__ ":" G_STRINGIFY(__LINE__) ": " ++ ++/* This is portable to older compilers that lack variable-argument macros. ++ This used to be just g_critical(), but then we ran into the error reporting ++ problem discussed above. ++*/ ++static void ++fatalMsg (const char fmt[], ...) ++{ ++ va_list ap; ++ va_start (ap, fmt); ++ vfprintf (stderr, fmt, ap); ++ va_end (ap); ++ fputs ("\nAborting execution\n", stderr); ++ abort (); ++} ++ ++ ++static void ++criticalMsg (const char fmt[], ...) ++{ ++ va_list ap; ++ va_start (ap, fmt); ++ vfprintf (stderr, fmt, ap); ++ va_end (ap); ++ putc ('\n', stderr); ++} ++ ++/* Unlike the other two, this one does not append a newline. This is only ++ used if one of the TRACE_ macros is defined. */ ++static void ++tracing (const char fmt[], ...) ++{ ++ va_list ap; ++ va_start (ap, fmt); ++ vfprintf (stderr, fmt, ap); ++ va_end (ap); ++} ++ ++#define assert_not_reached() \ ++ do \ ++ { \ ++ fputs(WHERE "You should never get here. Aborting execution.\n", \ ++ stderr); \ ++ abort(); \ ++ } \ ++ while(0) ++ ++ ++#if DIE_IF_BADLY_BROKEN ++#define BADLY_BROKEN fatalMsg ++#else ++#define BADLY_BROKEN criticalMsg ++/* So, the user may still attempt to recover, even though we do not advise ++ this. */ ++#endif ++ ++/* I find it so depressing to have to use C without varargs macros. */ ++#define BADLY_BROKEN_MSG WHERE "Something fundamental" \ ++ " to GNU Classpath's AWT JNI broke while we were trying to pass up a Java error message" ++ ++#define BADLY_BROKEN0() \ ++ BADLY_BROKEN(BADLY_BROKEN_MSG); ++#define BADLY_BROKEN1(msg) \ ++ BADLY_BROKEN(BADLY_BROKEN_MSG ": " msg) ++#define BADLY_BROKEN2(msg, arg) \ ++ BADLY_BROKEN(BADLY_BROKEN_MSG ": " msg, arg) ++#define BADLY_BROKEN3(msg, arg, arg2) \ ++ BADLY_BROKEN(BADLY_BROKEN_MSG ": " msg, arg1, arg2) ++#define BADLY_BROKEN4(msg, arg, arg2, arg3) \ ++ BADLY_BROKEN(BADLY_BROKEN_MSG ": " msg, arg1, arg2, arg3) ++ ++#define DELETE_LOCAL_REF(env, ref) \ ++ do \ ++ { \ ++ if ( DELETE_LOCAL_REFS ) \ ++ { \ ++ (*env)->DeleteLocalRef (env, ref); \ ++ (ref) = NULL; \ ++ } \ ++ } \ ++ while(0) ++ ++/* Cached info for Exception-wrapping */ ++ ++jclass runtimeException_class; /* java.lang.RuntimeException */ ++jmethodID runtimeException_ctor; /* constructor for it */ ++ ++ ++/* Throw a new RuntimeException. It may wrap around an existing exception. ++ 1 if we did rethrow, -1 if we had trouble while rethrowing. ++ isBroken is always true in this case. */ ++static int ++throw (JNIEnv * env, jthrowable cause, const char *message, ++ gboolean isBroken, const char *file, int line) ++{ ++ jstring jmessage; ++ gboolean describedException = FALSE; /* Did we already describe the ++ exception to stderr or the ++ equivalent? */ ++ jthrowable wrapper; ++ ++ /* allocate local message in Java */ ++ const char fmt[] = "In AWT JNI, %s (at %s:%d)"; ++ size_t len = strlen (message) + strlen (file) + sizeof fmt + 25; ++ char *buf; ++ ++ if (EXPLAIN_TROUBLE || (isBroken && EXPLAIN_BROKEN)) ++ { ++ criticalMsg ("%s:%d: AWT JNI failure%s: %s\n", file, line, ++ isBroken ? " (BROKEN)" : "", message); ++ if (cause) ++ { ++ jthrowable currentException = (*env)->ExceptionOccurred (env); ++ ++ if (cause == currentException) ++ { ++ criticalMsg ("Description follows to System.err:"); ++ (*env)->ExceptionDescribe (env); ++ /* ExceptionDescribe has the side-effect of clearing the pending ++ exception; relaunch it. */ ++ describedException = TRUE; ++ ++ if ((*env)->Throw (env, cause)) ++ { ++ BADLY_BROKEN1 ++ ("Relaunching an exception with Throw failed."); ++ return -1; ++ } ++ } ++ else ++ { ++ DELETE_LOCAL_REF (env, currentException); ++ criticalMsg (WHERE ++ "currentException != cause; something else happened" ++ " while handling an exception."); ++ } ++ } ++ } /* if (EXPLAIN_TROUBLE) */ ++ ++ if (isBroken && DIE_IF_BROKEN) ++ fatalMsg ("%s:%d: Aborting execution; BROKEN: %s\n", file, line, message); ++ ++ if ((buf = malloc (len))) ++ { ++ memset (buf, 0, len); ++ snprintf (buf, len, fmt, message, file, line); ++ jmessage = (*env)->NewStringUTF (env, buf); ++ free (buf); ++ } ++ else ++ { ++ jmessage = NULL; ++ } ++ ++ /* Create the RuntimeException wrapper object and throw it. It is OK for ++ CAUSE to be NULL. */ ++ wrapper = (jthrowable) (*env)->NewObject ++ (env, runtimeException_class, runtimeException_ctor, jmessage, cause); ++ DELETE_LOCAL_REF (env, jmessage); ++ ++ if (!wrapper) ++ { ++ /* I think this should only happen: ++ - if there are bugs in my JNI code, or ++ - if the VM is broken, or ++ - if we run out of memory. ++ */ ++ if (EXPLAIN_TROUBLE) ++ { ++ criticalMsg (WHERE "GNU Classpath: JNI NewObject() could not create" ++ " a new java.lang.RuntimeException."); ++ criticalMsg ("We were trying to warn about the following" ++ " previous failure:"); ++ criticalMsg ("%s:%d: %s", file, line, message); ++ criticalMsg ("The latest (NewObject()) exception's description" ++ " follows, to System.err:"); ++ (*env)->ExceptionDescribe (env); ++ } ++ BADLY_BROKEN1 ("Failure of JNI NewObject()" ++ " to make a java.lang.RuntimeException"); ++ return -1; ++ } ++ ++ ++ /* throw it */ ++ if ((*env)->Throw (env, wrapper)) ++ { ++ /* Throw() should just never fail, unless we're in such severe trouble ++ that we might as well die. */ ++ BADLY_BROKEN1 ++ ("GNU Classpath: Failure of JNI Throw to report an Exception"); ++ return -1; ++ } ++ ++ DELETE_LOCAL_REF (env, wrapper); ++ return 1; ++} ++ ++ ++ ++/* Rethrow an exception we received, wrapping it with a RuntimeException. 1 ++ if we did rethrow, -1 if we had trouble while rethrowing. ++ CAUSE should be identical to the most recent exception that happened, so ++ that ExceptionDescribe will work. (Otherwise nix.) */ ++static int ++rethrow (JNIEnv * env, jthrowable cause, const char *message, ++ gboolean isBroken, const char *file, int line) ++{ ++ assert (cause); ++ return throw (env, cause, message, isBroken, file, line); ++} ++ ++ ++/* This function checks for a pending exception, and rethrows it with + * a wrapper RuntimeException to deal with possible type problems (in + * case some calling piece of code does not expect the exception being + * thrown) and to include the given extra message. ++ * ++ * Returns 0 if no problems found (so no exception thrown), 1 if we rethrew an ++ * exception. Returns -1 on failure. + */ +-static void maybe_rethrow(JNIEnv *gdk_env, char *message, char *file, int line) { +- jthrowable cause; ++static int ++maybe_rethrow (JNIEnv * env, const char *message, gboolean isBroken, ++ const char *file, int line) ++{ ++ jthrowable cause = (*env)->ExceptionOccurred (env); ++ int ret = 0; + + /* rethrow if an exception happened */ +- if ((cause = (*gdk_env)->ExceptionOccurred(gdk_env)) != NULL) { +- jstring jmessage; +- jclass obj_class; +- jobject obj; +- jmethodID ctor; +- +- /* allocate local message in Java */ +- int len = strlen(message) + strlen(file) + 25; +- char buf[ len ]; +- bzero(buf, len); +- sprintf(buf, "%s (at %s:%d)", message, file, line); +- jmessage = (*gdk_env)->NewStringUTF(gdk_env, buf); +- +- /* create RuntimeException wrapper object */ +- obj_class = (*gdk_env)->FindClass (gdk_env, "java/lang/RuntimeException"); +- ctor = (*gdk_env)->GetMethodID(gdk_env, obj_class, "", "(Ljava/langString;Ljava/lang/Throwable)V"); +- obj = (*gdk_env)->NewObject (gdk_env, obj_class, ctor, jmessage, cause); +- +- /* throw it */ +- (*gdk_env)->Throw(gdk_env, (jthrowable)obj); ++ if (cause) ++ { ++ ret = rethrow (env, cause, message, isBroken, file, line); ++ DELETE_LOCAL_REF (env, cause); ++ } ++ ++ return 0; ++} ++ ++/* MAYBE_TROUBLE() is used to include a source location in the exception ++ message. Once we have run maybe_rethrow, if there WAS trouble, ++ return TRUE, else FALSE. ++ ++ MAYBE_TROUBLE() is actually never used; all problems that throw exceptions ++ are BROKEN, at least. Nothing is recoverable :(. See the discussion of ++ possible errors at thread_create_jni_impl(). */ ++#define MAYBE_TROUBLE(_env, _message) \ ++ maybe_rethrow(_env, _message, FALSE, __FILE__, __LINE__) ++ ++/* MAYBE_TROUBLE(), but something would be BROKEN if it were true. */ ++#define MAYBE_BROKEN(_env, _message) \ ++ maybe_rethrow(_env, _message, TRUE, __FILE__, __LINE__) ++ ++/* Like MAYBE_TROUBLE(), TROUBLE() is never used. */ ++#define TROUBLE(_env, _message) \ ++ rethrow(_env, (*env)->ExceptionOccurred (env), _message, FALSE, \ ++ __FILE__, __LINE__) ++ ++#define BROKEN(_env, _message) \ ++ rethrow (_env, (*env)->ExceptionOccurred (env), _message, TRUE, \ ++ __FILE__, __LINE__) ++ ++/* Like MAYBE_TROUBLE(), NEW_TROUBLE() is never used. */ ++#define NEW_TROUBLE(_env, _message) \ ++ throw (_env, NULL, _message, FALSE, __FILE__, __LINE__) ++ ++#define NEW_BROKEN(_env, _message) \ ++ throw (_env, NULL, _message, TRUE, __FILE__, __LINE__) ++ ++/* Like MAYBE_TROUBLE(), RETHROW_CAUSE() is never used. */ ++#define RETHROW_CAUSE(_env, _cause, _message) \ ++ rethrow (_env, _cause, _message, FALSE, __FILE__, __LINE__) ++ ++#define BROKEN_CAUSE(_env, _cause, _message) \ ++ rethrow (_env, _cause, _message, TRUE, __FILE__, __LINE__) ++ ++/* Macros to handle the possibility that someone might have called one of the ++ GThreadFunctions API functions with a Java exception pending. It is ++ generally discouraged to continue to use JNI after a Java exception has ++ been raised. Sun's JNI book advises that one trap JNI errors immediately ++ and not continue with an exception pending. ++ ++ These are #if'd out for these reasons: ++ ++ 1) They do not work in the C '89 subset that Classpath is currently ++ (2004 May 10) sticking to; HIDE_OLD_TROUBLE() includes a declaration ++ that should be in scope for the rest of the function, so it needs a ++ language version that lets you mix declarations and statements. (This ++ could be worked around if it were important.) ++ ++ 2) They chew up more time and resources. ++ ++ 3) There does not ever seem to be old trouble -- the assertion in ++ HIDE_OLD_TROUBLE never goes off. ++ ++ You will want to re-enable them if this code needs to be used in a context ++ where old exceptions might be pending when the GThread functions are ++ called. ++ ++ The implementations in this file are responsible for skipping around calls ++ to SHOW_OLD_TROUBLE() if they've raised exceptions during the call. So, if ++ we reach SHOW_OLD_TROUBLE, we are guaranteed that there are no exceptions ++ pending. */ ++#if 1 ++#define HIDE_OLD_TROUBLE(env) \ ++ assert ( NULL == (*env)->ExceptionOccurred (env) ) ++ ++#define SHOW_OLD_TROUBLE() \ ++ assert ( NULL == (*env)->ExceptionOccurred (env) ) ++#else /* 0 */ ++#define HIDE_OLD_TROUBLE(env) \ ++ jthrowable savedTrouble = (*env)->ExceptionOccurred (env); \ ++ (*env)->ExceptionClear (env); ++ ++#define SHOW_OLD_TROUBLE() do \ ++{ \ ++ assert ( NULL == (*env)->ExceptionOccurred (env) ) \ ++ if (savedTrouble) \ ++ { \ ++ if ((*env)->Throw (env, savedTrouble)) \ ++ BADLY_BROKEN ("ReThrowing the savedTrouble failed"); \ ++ } \ ++ DELETE_LOCAL_REF (env, savedTrouble); \ ++} while(0) ++ ++#endif /* 0 */ ++ ++/* Set up the cache of jclass and jmethodID primitives we need ++ in order to throw new exceptions and rethrow exceptions. We do this ++ independently of the other caching. We need to have this cache set up ++ first, so that we can then report errors properly. ++ ++ If any errors while setting up the error cache, the world is BADLY_BROKEN. ++ ++ May be called more than once. ++ ++ Returns -1 if the cache was not initialized properly, 1 if it was. ++*/ ++static int ++setup_exception_cache (JNIEnv * env) ++{ ++ static int exception_cache_initialized = 0; /* -1 for trouble, 1 for proper ++ init. */ ++ ++ jclass lcl_class; /* a class used for local refs */ ++ ++ if (exception_cache_initialized) ++ return exception_cache_initialized; ++ lcl_class = (*env)->FindClass (env, "java/lang/RuntimeException"); ++ if ( ! lcl_class ) ++ { ++ BADLY_BROKEN1 ("Broken Class library or VM?" ++ " Couldn't find java/lang/RuntimeException"); ++ return exception_cache_initialized = -1; ++ } ++ /* Pin it down. */ ++ runtimeException_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!runtimeException_class) ++ { ++ BADLY_BROKEN1 ("Serious trouble: could not turn" ++ " java.lang.RuntimeException into a global reference"); ++ return exception_cache_initialized = -1; ++ } ++ ++ runtimeException_ctor = ++ (*env)->GetMethodID (env, runtimeException_class, "", ++ "(Ljava/lang/String;Ljava/lang/Throwable;)V"); ++ if ( ! runtimeException_ctor ) ++ { ++ BADLY_BROKEN1 ("Serious trouble: classpath couldn't find a" ++ " two-arg constructor for java/lang/RuntimeException"); ++ return exception_cache_initialized = -1; ++ } ++ ++ return exception_cache_initialized = 1; ++} ++ ++ ++/**********************************************************/ ++/***** The main cache *************************************/ ++/**********************************************************/ ++ ++/** This is a cache of all classes, methods, and field IDs that we use during ++ the run. We maintain a permanent global reference to each of the classes ++ we cache, since otherwise the (local) jclass that refers to that class ++ would go out of scope and possibly be reused in further calls. ++ ++ The permanent global reference also achieves the secondary goal of ++ protecting the validity of the methods and field IDs in case the classes ++ were otherwise unloaded and then later loaded again. Obviously, this will ++ never happen to classes such as java.lang.Thread and java.lang.Object, but ++ the primary reason for maintaining permanent global refs is sitll valid. ++ ++ The code in jnilink.c has a similar objective. TODO: Consider using that ++ code instead. ++ ++ --Steven Augart ++*/ ++ ++/* All of these are cached classes and method IDs: */ ++/* java.lang.Object */ ++static jclass obj_class; /* java.lang.Object */ ++static jmethodID obj_ctor; /* no-arg Constructor for java.lang.Object */ ++static jmethodID obj_notify_mth; /* java.lang.Object.notify() */ ++static jmethodID obj_notifyall_mth; /* java.lang.Object.notifyall() */ ++static jmethodID obj_wait_mth; /* java.lang.Object.wait() */ ++static jmethodID obj_wait_nanotime_mth; /* java.lang.Object.wait(JI) */ ++ ++/* GThreadMutex and its methods */ ++static jclass mutex_class; ++static jmethodID mutex_ctor; ++static jfieldID mutex_lockForPotentialLockers_fld; ++static jfieldID mutex_potentialLockers_fld; ++ ++/* java.lang.Thread and its methods*/ ++static jclass thread_class; /* java.lang.Thread */ ++static jmethodID thread_current_mth; /* Thread.currentThread() */ ++static jmethodID thread_equals_mth; /* Thread.equals() */ ++static jmethodID thread_join_mth; /* Thread.join() */ ++static jmethodID thread_setPriority_mth; /* Thread.setPriority() */ ++static jmethodID thread_stop_mth; /* Thread.stop() */ ++static jmethodID thread_yield_mth; /* Thread.yield() */ ++ ++/* java.lang.ThreadLocal and its methods */ ++static jclass threadlocal_class; /* java.lang.ThreadLocal */ ++static jmethodID threadlocal_ctor; /* Its constructor */ ++static jmethodID threadlocal_set_mth; /* ThreadLocal.set() */ ++static jmethodID threadlocal_get_mth; /* ThreadLocal.get() */ ++ ++/* java.lang.Long and its methods */ ++static jclass long_class; /* java.lang.Long */ ++static jmethodID long_ctor; /* constructor for it: (J) */ ++static jmethodID long_longValue_mth; /* longValue()J */ ++ ++ ++/* GThreadNativeMethodRunner */ ++static jclass runner_class; ++static jmethodID runner_ctor; ++static jmethodID runner_threadToThreadID_mth; ++static jmethodID runner_threadIDToThread_mth; ++static jmethodID runner_deRegisterJoinable_mth; ++static jmethodID runner_start_mth; /* Inherited Thread.start() */ ++ ++ ++/* java.lang.InterruptedException */ ++static jclass interrupted_exception_class; ++ ++ ++ ++ ++/* Returns a negative value if there was trouble during initialization. ++ Returns a positive value of the cache was initialized correctly. ++ Never returns zero. */ ++static int ++setup_cache (JNIEnv * env) ++{ ++ jclass lcl_class; ++ static int initialized = 0; /* 1 means initialized, 0 means uninitialized, ++ -1 means mis-initialized */ ++ ++ if (initialized) ++ return initialized; ++ ++ /* make sure we can report on trouble */ ++ if (setup_exception_cache (env) < 0) ++ return initialized = -1; ++ ++#ifdef JNI_VERSION_1_2 ++ if (HAVE_JNI_VERSION_1_2) ++ assert ( ! (*env)->ExceptionCheck (env)); ++ else ++#endif ++ assert ( ! (*env)->ExceptionOccurred (env)); ++ ++ /* java.lang.Object and its methods */ ++ lcl_class = (*env)->FindClass (env, "java/lang/Object"); ++ if (!lcl_class) ++ { ++ BROKEN (env, "cannot find java.lang.Object"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ obj_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!obj_class) ++ { ++ BROKEN (env, "Cannot get a global reference to java.lang.Object"); ++ return initialized = -1; ++ } ++ ++ obj_ctor = (*env)->GetMethodID (env, obj_class, "", "()V"); ++ if (!obj_ctor) ++ { ++ BROKEN (env, "cannot find constructor for java.lang.Object"); ++ return initialized = -1; ++ } ++ ++ obj_notify_mth = (*env)->GetMethodID (env, obj_class, "notify", "()V"); ++ if ( ! obj_notify_mth ) ++ { ++ BROKEN (env, "cannot find java.lang.Object.notify()V"); ++ return initialized = -1; ++ } ++ ++ obj_notifyall_mth = ++ (*env)->GetMethodID (env, obj_class, "notifyAll", "()V"); ++ if ( ! obj_notifyall_mth) ++ { ++ BROKEN (env, "cannot find java.lang.Object.notifyall()V"); ++ return initialized = -1; ++ } ++ ++ obj_wait_mth = (*env)->GetMethodID (env, obj_class, "wait", "()V"); ++ if ( ! obj_wait_mth ) ++ { ++ BROKEN (env, "cannot find Object."); ++ return initialized = -1; ++ } ++ ++ obj_wait_nanotime_mth = ++ (*env)->GetMethodID (env, obj_class, "wait", "(JI)V"); ++ if ( ! obj_wait_nanotime_mth ) ++ { ++ BROKEN (env, "cannot find Object."); ++ return initialized = -1; ++ } ++ ++ /* GThreadMutex and its methods */ ++ lcl_class = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GThreadMutex"); ++ if ( ! lcl_class) ++ { ++ BROKEN (env, "cannot find gnu.java.awt.peer.gtk.GThreadMutex"); ++ return initialized = -1; ++ } ++ /* Pin it down. */ ++ mutex_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if ( ! mutex_class) ++ { ++ BROKEN (env, "Cannot get a global reference to GThreadMutex"); ++ return initialized = -1; ++ } ++ ++ mutex_ctor = (*env)->GetMethodID (env, mutex_class, "", "()V"); ++ if ( ! mutex_ctor) ++ { ++ BROKEN (env, "cannot find zero-arg constructor for GThreadMutex"); ++ return initialized = -1; ++ } ++ ++ mutex_potentialLockers_fld = (*env)->GetFieldID ++ (env, mutex_class, "potentialLockers", "I"); ++ if ( ! mutex_class ) ++ { ++ BROKEN (env, "cannot find GThreadMutex.potentialLockers"); ++ return initialized = -1; ++ } ++ ++ if (! (mutex_lockForPotentialLockers_fld = (*env)->GetFieldID ++ (env, mutex_class, "lockForPotentialLockers", "Ljava/lang/Object;"))) ++ { ++ BROKEN (env, "cannot find GThreadMutex.lockForPotentialLockers"); ++ return initialized = -1; ++ } ++ ++ ++ /* java.lang.Thread */ ++ if (! (lcl_class = (*env)->FindClass (env, "java/lang/Thread"))) ++ { ++ BROKEN (env, "cannot find java.lang.Thread"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ thread_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!thread_class) ++ { ++ BROKEN (env, "Cannot get a global reference to java.lang.Thread"); ++ return initialized = -1; ++ } ++ ++ thread_current_mth = ++ (*env)->GetStaticMethodID (env, thread_class, "currentThread", ++ "()Ljava/lang/Thread;"); ++ if (!thread_current_mth) ++ { ++ BROKEN (env, "cannot find Thread.currentThread() method"); ++ return initialized = -1; ++ } ++ ++ thread_equals_mth = ++ (*env)->GetMethodID (env, thread_class, "equals", "(Ljava/lang/Object;)Z"); ++ if (!thread_equals_mth) ++ { ++ BROKEN (env, "cannot find Thread.equals() method"); ++ return initialized = -1; ++ } ++ ++ thread_join_mth = (*env)->GetMethodID (env, thread_class, "join", "()V"); ++ if (!thread_join_mth) ++ { ++ BROKEN (env, "cannot find Thread.join() method"); ++ return initialized = -1; ++ } ++ ++ thread_stop_mth = (*env)->GetMethodID (env, thread_class, "stop", "()V"); ++ if ( ! thread_stop_mth ) ++ { ++ BROKEN (env, "cannot find Thread.stop() method"); ++ return initialized = -1; ++ } ++ ++ thread_setPriority_mth = ++ (*env)->GetMethodID (env, thread_class, "setPriority", "(I)V"); ++ if ( ! thread_setPriority_mth ) ++ { ++ BROKEN (env, "cannot find Thread.setPriority() method"); ++ return initialized = -1; ++ } ++ ++ thread_yield_mth = ++ (*env)->GetStaticMethodID (env, thread_class, "yield", "()V"); ++ if ( ! thread_yield_mth ) ++ { ++ BROKEN (env, "cannot find Thread.yield() method"); ++ return initialized = -1; ++ } ++ ++ /* java.lang.ThreadLocal */ ++ lcl_class = (*env)->FindClass (env, "java/lang/ThreadLocal"); ++ if ( ! lcl_class ) ++ { ++ BROKEN (env, "cannot find class java.lang.ThreadLocal"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ threadlocal_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if ( ! threadlocal_class ) ++ { ++ BROKEN (env, "Cannot get a global reference to java.lang.ThreadLocal"); ++ return initialized = -1; ++ } ++ ++ threadlocal_ctor = (*env)->GetMethodID (env, threadlocal_class, ++ "", "()V"); ++ if ( ! threadlocal_ctor ) ++ { ++ BROKEN (env, "cannot find ThreadLocal.()V"); ++ return initialized = -1; ++ } ++ ++ threadlocal_get_mth = (*env)->GetMethodID (env, threadlocal_class, ++ "get", "()Ljava/lang/Object;"); ++ if ( ! threadlocal_get_mth ) ++ { ++ BROKEN (env, "cannot find java.lang.ThreadLocal.get()Object"); ++ return initialized = -1; + } ++ ++ threadlocal_set_mth = (*env)->GetMethodID (env, threadlocal_class, ++ "set", "(Ljava/lang/Object;)V"); ++ if ( ! threadlocal_set_mth ) ++ { ++ BROKEN (env, "cannot find ThreadLocal.set(Object)V"); ++ return initialized = -1; ++ } ++ ++ /* java.lang.Long */ ++ lcl_class = (*env)->FindClass (env, "java/lang/Long"); ++ if ( ! lcl_class ) ++ { ++ BROKEN (env, "cannot find class java.lang.Long"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ long_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!long_class) ++ { ++ BROKEN (env, "Cannot get a global reference to java.lang.Long"); ++ return initialized = -1; ++ } ++ ++ long_ctor = (*env)->GetMethodID (env, long_class, "", "(J)V"); ++ if (!long_ctor) ++ { ++ BROKEN (env, "cannot find method java.lang.Long.(J)V"); ++ return initialized = -1; ++ } ++ ++ long_longValue_mth = ++ (*env)->GetMethodID (env, long_class, "longValue", "()J"); ++ if (!long_longValue_mth) ++ { ++ BROKEN (env, "cannot find method java.lang.Long.longValue()J"); ++ return initialized = -1; ++ } ++ ++ ++ /* GThreadNativeMethodRunner */ ++ lcl_class = ++ (*env)->FindClass (env, ++ "gnu/java/awt/peer/gtk/GThreadNativeMethodRunner"); ++ if ( ! lcl_class ) ++ { ++ BROKEN (env, ++ "cannot find gnu.java.awt.peer.gtk.GThreadNativeMethodRunner"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ runner_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!runner_class) ++ { ++ BROKEN (env, ++ "Cannot get a global reference to the class GThreadNativeMethodRunner"); ++ return initialized = -1; ++ } ++ ++ runner_ctor = (*env)->GetMethodID (env, runner_class, "", "(JJZ)V"); ++ if ( ! runner_ctor ) ++ { ++ BROKEN (env, ++ "cannot find method GThreadNativeMethodRunner.(JJZ)"); ++ return initialized = -1; ++ } ++ ++ runner_start_mth = (*env)->GetMethodID (env, runner_class, "start", "()V"); ++ if ( ! runner_start_mth ) ++ { ++ BROKEN (env, "cannot find method GThreadNativeMethodRunner.start()V"); ++ return initialized = -1; ++ } ++ ++ ++ runner_threadToThreadID_mth = ++ (*env)->GetStaticMethodID (env, runner_class, ++ "threadToThreadID", "(Ljava/lang/Thread;)I"); ++ if ( ! runner_threadToThreadID_mth ) ++ { ++ BROKEN (env, ++ "cannot find method GThreadNativeMethodRunner.threadToThreadID(java.lang.Thread)I"); ++ return initialized = -1; ++ } ++ ++ ++ runner_threadIDToThread_mth = ++ (*env)->GetStaticMethodID (env, runner_class, ++ "threadIDToThread", "(I)Ljava/lang/Thread;"); ++ if ( ! runner_threadIDToThread_mth ) ++ { ++ BROKEN (env, ++ "cannot find method GThreadNativeMethodRunner.threadIDToThread(I)java.lang.Thread"); ++ return initialized = -1; ++ } ++ ++ ++ runner_deRegisterJoinable_mth = ++ (*env)->GetStaticMethodID (env, runner_class, "deRegisterJoinable", ++ "(Ljava/lang/Thread;)V"); ++ if (!runner_deRegisterJoinable_mth) ++ { ++ BROKEN (env, ++ "cannot find method GThreadNativeMethodRunner.deRegisterJoinable(java.lang.Thread)V"); ++ return initialized = -1; ++ } ++ ++ ++ /* java.lang.InterruptedException */ ++ lcl_class = (*env)->FindClass (env, "java/lang/InterruptedException"); ++ if ( ! lcl_class ) ++ { ++ BROKEN (env, "cannot find class java.lang.InterruptedException"); ++ return initialized = -1; ++ } ++ ++ /* Pin it down. */ ++ interrupted_exception_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); ++ DELETE_LOCAL_REF (env, lcl_class); ++ if (!interrupted_exception_class) ++ { ++ BROKEN (env, "Cannot make a global reference" ++ " to java.lang.InterruptedException"); ++ return initialized = -1; ++ } ++ ++#ifdef JNI_VERSION_1_2 ++ if (HAVE_JNI_VERSION_1_2) ++ assert ( ! (*env)->ExceptionCheck (env)); ++ else ++#endif ++ assert ( ! (*env)->ExceptionOccurred (env)); ++ ++ ++ return initialized = 1; + } + +-/* This macro is used to include a source location in the exception message */ +-#define MAYBE_RETHROW(_class, _message) \ +-maybe_rethrow(_class, _message, __FILE__, __LINE__) ++ ++ + + + /************************************************************************/ + /* Utilities to allocate and free java.lang.Objects */ + /************************************************************************/ + +-/* Both the mutexes and the condition variables are java.lang.Object objects, ++/* The condition variables are java.lang.Object objects, + * which this method allocates and returns a global ref. Note that global + * refs must be explicitly freed (isn't C fun?). + */ +-static jobject *allocatePlainObject() { +- jclass obj_class; +- jobject *obj; +- JNIEnv *gdk_env; +- jmethodID ctor; +- +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); +- +- obj_class = (*gdk_env)->FindClass (gdk_env, "java/lang/Object"); +- MAYBE_RETHROW(gdk_env, "cannot find Object"); +- +- ctor = (*gdk_env)->GetMethodID(gdk_env, obj_class, "", "()V"); +- MAYBE_RETHROW(gdk_env, "cannot find constructor"); +- +- obj = (jobject *) g_malloc (sizeof (jobject)); +- *obj = (*gdk_env)->NewObject (gdk_env, obj_class, ctor); +- MAYBE_RETHROW(gdk_env, "cannot allocate object"); +- +- *obj = (*gdk_env)->NewGlobalRef (gdk_env, *obj); +- MAYBE_RETHROW(gdk_env, "cannot make global ref"); ++static jobject ++allocatePlainObject (JNIEnv * env) ++{ ++ jobject lcl_obj, global_obj; ++ ++ lcl_obj = (*env)->NewObject (env, obj_class, obj_ctor); ++ if (!lcl_obj) ++ { ++ BROKEN (env, "cannot allocate object"); ++ return NULL; ++ } + +- return obj; ++ global_obj = (*env)->NewGlobalRef (env, lcl_obj); ++ DELETE_LOCAL_REF (env, lcl_obj); ++ if (!global_obj) ++ { ++ NEW_BROKEN (env, "cannot make global ref for a new plain Java object"); ++ /* Deliberate fall-through */ ++ } ++ ++ return global_obj; + } + +-/* Frees a Java object given a global ref (isn't C fun?) */ +-static void freePlainObject(jobject *obj) { +- JNIEnv *gdk_env; ++/* Frees any Java object given a global ref (isn't C fun?) */ ++static void ++freeObject (JNIEnv * env, jobject obj) ++{ ++ if (obj) ++ { ++ (*env)->DeleteGlobalRef (env, obj); ++ /* DeleteGlobalRef can never fail */ ++ } ++} + +- if (obj) { +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); + +- (*gdk_env)->DeleteGlobalRef (gdk_env, *obj); +- MAYBE_RETHROW(gdk_env, "cannot delete global ref"); +- +- g_free (obj); +- } ++/************************************************************************/ ++/* Utilities to allocate and free Java mutexes */ ++/************************************************************************/ ++ ++/* The mutexes are gnu.java.awt.peer.gtk.GThreadMutex objects, ++ * which this method allocates and returns a global ref. Note that global ++ * refs must be explicitly freed (isn't C fun?). ++ * ++ * Free this with freeObject() ++ */ ++static jobject ++allocateMutexObject (JNIEnv * env) ++{ ++ jobject lcl_obj, global_obj; ++ ++ lcl_obj = (*env)->NewObject (env, mutex_class, mutex_ctor); ++ if (!lcl_obj) ++ { ++ BROKEN (env, "cannot allocate a GThreadMutex"); ++ return NULL; ++ } ++ ++ global_obj = (*env)->NewGlobalRef (env, lcl_obj); ++ DELETE_LOCAL_REF (env, lcl_obj); ++ if (!global_obj) ++ { ++ NEW_BROKEN (env, "cannot make global ref"); ++ /* Deliberate fallthrough */ ++ } ++ ++ return global_obj; + } + + +@@ -172,195 +1208,746 @@ + /************************************************************************/ + + /* Lock a Java object */ +-static void takeLock(JNIEnv *gdk_env, void *mutex) { +- (*gdk_env)->MonitorEnter (gdk_env, *((jobject *)mutex)); +- MAYBE_RETHROW(gdk_env, "cannot get lock"); ++#define ENTER_MONITOR(env, m) \ ++ enterMonitor(env, m, G_STRINGIFY(m)) ++ ++/* Return -1 on failure, 0 on success. */ ++static int ++enterMonitor (JNIEnv * env, jobject monitorObj, const char monName[]) ++{ ++ if (TRACE_MONITORS) ++ tracing (" ", monName); ++ assert (monitorObj); ++ if ((*env)->MonitorEnter (env, monitorObj) < 0) ++ { ++ BROKEN (env, "cannot enter monitor"); ++ return -1; ++ } ++ return 0; + } + ++ + /* Unlock a Java object */ +-static void releaseLock(JNIEnv *gdk_env, void *mutex) { +- (*gdk_env)->MonitorExit (gdk_env, *((jobject *)mutex)); +- MAYBE_RETHROW(gdk_env, "cannot release lock"); ++#define EXIT_MONITOR(env, m) \ ++ exitMonitor(env, m, G_STRINGIFY(m)) ++ ++static int ++exitMonitor (JNIEnv * env, jobject mutexObj, const char monName[]) ++{ ++ if (TRACE_MONITORS) ++ tracing (" ", monName); ++ assert (mutexObj); ++ if ((*env)->MonitorExit (env, mutexObj) < 0) ++ { ++ BROKEN (env, "cannot exit monitor "); ++ return -1; ++ } ++ return 0; ++} ++ ++ ++/************************************************************************/ ++/* Miscellaneous utilities */ ++/************************************************************************/ ++ ++/* Get the Java Thread object that corresponds to a particular thread ID. ++ A negative thread Id gives us a null object. ++ ++ Returns a local reference. ++*/ ++static jobject ++getThreadFromThreadID (JNIEnv * env, gpointer gThreadID) ++{ ++ jint threadNum = (jint) gThreadID; ++ jobject thread; ++ ++ if (threadNum < 0) ++ { ++ NEW_BROKEN (env, "getThreadFromThreadID asked to look up" ++ " a negative thread index"); ++ return NULL; ++ } ++ ++ thread = (*env)->CallStaticObjectMethod ++ (env, runner_class, runner_threadIDToThread_mth, threadNum); ++ ++ if (MAYBE_BROKEN (env, "cannot get Thread for threadID ")) ++ return NULL; ++ ++ return thread; ++} ++ ++/** Return the unique threadID of THREAD. ++ ++ Error handling: Return (gpointer) -1 on all failures, ++ and propagate an exception. ++*/ ++static gpointer ++getThreadIDFromThread (JNIEnv * env, jobject thread) ++{ ++ jint threadNum; ++ ++ if (ENABLE_EXPENSIVE_ASSERTIONS) ++ assert ((*env)->IsInstanceOf (env, thread, thread_class)); ++ ++ HIDE_OLD_TROUBLE (env); ++ ++ threadNum = (*env)->CallStaticIntMethod ++ (env, runner_class, runner_threadToThreadID_mth, thread); ++ ++ if (MAYBE_BROKEN (env, "cannot get ThreadID for a Thread ")) ++ { ++ threadNum = -1; ++ goto done; ++ } ++ ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ return (gpointer) threadNum; ++} ++ ++ ++/************************************************************************/ ++/* The Actual JNI functions that we pass to the function vector. */ ++/************************************************************************/ ++ ++ ++/************************************************************************/ ++/* Mutex Functions */ ++/************************************************************************/ ++ ++/*** Mutex Utilities ****/ ++struct mutexObj_cache ++{ ++ jobject lockForPotentialLockersObj; /* Lock for the potentialLockers ++ field. Local reference. */ ++ jobject lockObj; /* The real lock we use. This is a GLOBAL ++ reference and must not be freed. */ ++}; ++ ++/* Initialize the cache of sub-locks for a particular mutex object. ++ ++ -1 on error, 0 on success. The caller is not responsible for freeing the ++ partially-populated cache in case of failure (but in practice does anyway) ++ (This actually never fails, though, since GetObjectField allegedly never ++ fails.) ++ ++ Guaranteed to leave all fields of the cache initialized, even if only to ++ zero. ++*/ ++static int ++populate_mutexObj_cache (JNIEnv * env, jobject mutexObj, ++ struct mutexObj_cache *mcache) ++{ ++ mcache->lockObj = mutexObj; /* the mutexObj is its own lock. */ ++ assert (mcache->lockObj); ++ ++ mcache->lockForPotentialLockersObj = (*env)->GetObjectField ++ (env, mutexObj, mutex_lockForPotentialLockers_fld); ++ /* GetObjectField can never fail. */ ++ ++ /* Retrieving a NULL object could only happen if we somehow got a ++ a mutex object that was not properly intialized. */ ++ assert (mcache->lockForPotentialLockersObj); ++ ++ return 0; + } + +-/* Create a mutex, which is a java.lang.Object for us */ +-static GMutex *g_mutex_new_jni_impl (void) { +- return (GMutex*) allocatePlainObject(); ++ ++/* Clean out the mutexObj_cache, even if it was never populated. */ ++static void ++clean_mutexObj_cache (JNIEnv * env, struct mutexObj_cache *mcache) ++{ ++ /* OK to pass NULL refs to DELETE_LOCAL_REF */ ++ DELETE_LOCAL_REF (env, mcache->lockForPotentialLockersObj); ++ /* mcache->lockObj is a GLOBAL reference. */ ++ mcache->lockObj = NULL; ++} ++ ++/* -1 on failure, 0 on success. ++ The mutexObj_cache is already populated for this particular object. */ ++static int ++mutexObj_lock (JNIEnv * env, jobject mutexObj, struct mutexObj_cache *mcache) ++{ ++ jint potentialLockers; ++ ++ if (ENTER_MONITOR (env, mcache->lockForPotentialLockersObj)) ++ return -1; ++ ++ assert(mutexObj); ++ potentialLockers = ++ (*env)->GetIntField (env, mutexObj, mutex_potentialLockers_fld); ++ /* GetIntField() never fails. */ ++ ++ ++potentialLockers; ++ ++ (*env)->SetIntField ++ (env, mutexObj, mutex_potentialLockers_fld, potentialLockers); ++ ++ if (EXIT_MONITOR (env, mcache->lockForPotentialLockersObj)) ++ return -1; ++ ++ if (ENTER_MONITOR (env, mcache->lockObj)) ++ return -1; ++ ++ SHOW_OLD_TROUBLE (); ++ ++ return 0; ++} ++ ++/* Unlock a GMutex, once we're already in JNI and have already gotten the ++ mutexObj for it. This skips the messages that TRACE_API_CALLS would ++ print. ++ ++ Returns -1 on error, 0 on success. */ ++static int ++mutexObj_unlock (JNIEnv * env, jobject mutexObj, ++ struct mutexObj_cache *mcache) ++{ ++ jint potentialLockers; ++ int ret = -1; /* assume failure until we suceed. */ ++ ++ /* Free the lock first, so that someone waiting for the lock can get it ++ ASAP. */ ++ /* This is guaranteed not to block. */ ++ if (EXIT_MONITOR (env, mcache->lockObj) < 0) ++ goto done; ++ ++ /* Kick down potentialLockers by one. We do this AFTER we free the lock, so ++ that we hold it no longer than necessary. */ ++ if (ENTER_MONITOR (env, mcache->lockForPotentialLockersObj) < 0) ++ goto done; ++ ++ potentialLockers = (*env)->GetIntField ++ (env, mutexObj, mutex_potentialLockers_fld); ++ /* GetIntField never fails */ ++ ++ assert (potentialLockers >= 1); ++ --potentialLockers; ++ ++ (*env)->SetIntField ++ (env, mutexObj, mutex_potentialLockers_fld, potentialLockers); ++ /* Never fails, so the JNI book says. */ ++ ++ /* Clean up. */ ++ if (EXIT_MONITOR (env, mcache->lockForPotentialLockersObj) < 0) ++ goto done; ++ ret = 0; ++ ++done: ++ return ret; ++} ++ ++/*** Mutex Implementations ****/ ++ ++/* Create a mutex, which is a java.lang.Object for us. ++ In case of failure, we'll return NULL. Which will implicitly ++ cause future calls to fail. */ ++static GMutex * ++mutex_new_jni_impl (void) ++{ ++ jobject mutexObj; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("mutex_new_jni_impl()"); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ if (setup_cache (env) < 0) ++ { ++ mutexObj = NULL; ++ goto done; ++ } ++ ++ mutexObj = allocateMutexObject (env); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> %p \n", mutexObj); ++ ++ return (GMutex *) mutexObj; ++ + } + + /* Lock a mutex. */ +-static void g_mutex_lock_jni_impl (GMutex *mutex __attribute__((unused))) { +- JNIEnv *gdk_env; ++static void ++mutex_lock_jni_impl (GMutex * mutex) ++{ ++ struct mutexObj_cache mcache; ++ jobject mutexObj = (jobject) mutex; ++ JNIEnv *env; ++ union env_union e; + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++ if (TRACE_API_CALLS) ++ tracing ("mutex_lock_jni_impl( mutexObj = %p )", mutexObj); + +- takeLock(gdk_env, mutex); ++ assert (mutexObj); ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ if (setup_cache (env) < 0) ++ goto done; ++ ++ HIDE_OLD_TROUBLE (env); ++ ++ if (populate_mutexObj_cache (env, mutexObj, &mcache) < 0) ++ goto done; ++ ++ mutexObj_lock (env, mutexObj, &mcache); ++ /* No need to error check; we've already reported it in any case. */ ++ ++done: ++ clean_mutexObj_cache (env, &mcache); ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID \n"); + } + +-/* Try to lock a mutex. Actually, do not try because Java objects +- * do not provide such an interface. To be at least minimally correct, +- * pretend we tried and failed. +- */ +-static gboolean g_mutex_trylock_jni_impl +- (GMutex *mutex __attribute__((unused))) ++ ++/* Try to lock a mutex. Return TRUE if we succeed, FALSE if we fail. ++ FALSE on error. */ ++static gboolean ++mutex_trylock_jni_impl (GMutex * gmutex) + { +- // Shall we implement this in a JikesRVM-specific way under a flag? +- return FALSE; ++ jobject mutexObj = (jobject) gmutex; ++ jint potentialLockers; ++ gboolean ret = FALSE; ++ JNIEnv *env; ++ union env_union e; ++ struct mutexObj_cache mcache; ++ ++ if (TRACE_API_CALLS) ++ tracing ("mutex_trylock_jni_impl(mutexObj=%p)", mutexObj); ++ ++ assert (mutexObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ if (populate_mutexObj_cache (env, mutexObj, &mcache) < 0) ++ goto done; ++ ++ if (ENTER_MONITOR (env, mcache.lockForPotentialLockersObj)) ++ goto done; ++ ++ potentialLockers = (*env)->GetIntField ++ (env, mutexObj, mutex_potentialLockers_fld); ++ ++ assert (potentialLockers >= 0); ++ ++ if (potentialLockers) ++ { ++ /* Already locked. Clean up and leave. */ ++ EXIT_MONITOR (env, mcache.lockForPotentialLockersObj); ++ /* Ignore any error code from EXIT_MONITOR; there's nothing we could do ++ at this level, in any case. */ ++ goto done; ++ } ++ ++ /* Guaranteed not to block. */ ++ if (ENTER_MONITOR (env, mcache.lockObj)) ++ { ++ /* Clean up the existing lock. */ ++ EXIT_MONITOR (env, mcache.lockForPotentialLockersObj); ++ /* Ignore any error code from EXIT_MONITOR; there's nothing we could do ++ at this level, in any case. */ ++ goto done; ++ } ++ ++ ++ /* We have the monitor. Record that fact. */ ++ potentialLockers = 1; ++ (*env)->SetIntField ++ (env, mutexObj, mutex_potentialLockers_fld, potentialLockers); ++ /* Set*Field() never fails */ ++ ++ ret = TRUE; /* We have the lock. */ ++ ++ /* Clean up. */ ++ if (EXIT_MONITOR (env, mcache.lockForPotentialLockersObj)) ++ goto done; /* If we fail at this point, still keep the ++ main lock. */ ++ ++ SHOW_OLD_TROUBLE (); ++done: ++ clean_mutexObj_cache (env, &mcache); ++ if (TRACE_API_CALLS) ++ tracing (" ==> %s\n", ret ? "TRUE" : "FALSE"); ++ return ret; + } + ++ + /* Unlock a mutex. */ +-static void g_mutex_unlock_jni_impl (GMutex *mutex) { +- JNIEnv *gdk_env; ++static void ++mutex_unlock_jni_impl (GMutex * gmutex) ++{ ++ jobject mutexObj = (jobject) gmutex; ++ struct mutexObj_cache mcache; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("mutex_unlock_jni_impl(mutexObj=%p)", mutexObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ assert (mutexObj); ++ ++ if ( populate_mutexObj_cache (env, mutexObj, &mcache) < 0) ++ goto done; ++ ++ (void) mutexObj_unlock (env, mutexObj, &mcache); + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++ SHOW_OLD_TROUBLE (); + +- releaseLock(gdk_env, mutex); ++done: ++ clean_mutexObj_cache (env, &mcache); ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + +-/* Free a mutex (isn't C fun?) */ +-static void g_mutex_free_jni_impl (GMutex *mutex) ++ ++ ++/* Free a mutex (isn't C fun?). OK this time for it to be NULL. ++ No failure conditions, for a change. */ ++static void ++mutex_free_jni_impl (GMutex * mutex) + { +- freePlainObject( (jobject*)mutex ); ++ jobject mutexObj = (jobject) mutex; ++ JNIEnv *env; ++ union env_union e; ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ if (TRACE_API_CALLS) ++ tracing ("mutex_free_jni_impl(%p)", mutexObj); ++ ++ freeObject (env, mutexObj); ++ ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + + ++ ++ + /************************************************************************/ + /* Condition variable code */ + /************************************************************************/ + + /* Create a new condition variable. This is a java.lang.Object for us. */ +-static GCond *g_cond_new_jni_impl () { +- return (GCond*)allocatePlainObject(); ++static GCond * ++cond_new_jni_impl (void) ++{ ++ jobject condObj; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("mutex_free_jni_impl()"); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ condObj = allocatePlainObject (env); ++ ++ if (TRACE_API_CALLS) ++ tracing (" ==> %p\n", condObj); ++ ++ return (GCond *) condObj; + } + + /* Signal on a condition variable. This is simply calling Object.notify + * for us. + */ +-static void g_cond_signal_jni_impl (GCond *cond) { +- jclass lcl_class; +- jmethodID signal_mth; +- JNIEnv *gdk_env; ++static void ++cond_signal_jni_impl (GCond * gcond) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject condObj = (jobject) gcond; ++ ++ if (TRACE_API_CALLS) ++ tracing ("cond_signal_jni_impl(condObj = %p)", condObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); +- +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object"); +- MAYBE_RETHROW(gdk_env, "cannot find Object"); +- +- signal_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "notify", "()V"); +- MAYBE_RETHROW(gdk_env, "cannot find Object."); ++ assert (condObj); + + /* Must have locked an object to call notify */ +- takeLock(gdk_env, cond); ++ if (ENTER_MONITOR (env, condObj)) ++ goto done; ++ ++ (*env)->CallVoidMethod (env, condObj, obj_notify_mth); ++ if (MAYBE_BROKEN (env, "cannot signal mutex with Object.notify()")) ++ { ++ if (EXIT_MONITOR (env, condObj)) ++ BADLY_BROKEN1 ("Failed to unlock a monitor; the VM may deadlock."); ++ goto done; ++ } + +- (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, signal_mth); +- MAYBE_RETHROW(gdk_env, "cannot signal mutex"); ++ EXIT_MONITOR (env, condObj); + +- releaseLock(gdk_env, cond); ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + + /* Broadcast to all waiting on a condition variable. This is simply + * calling Object.notifyAll for us. + */ +-static void g_cond_broadcast_jni_impl (GCond *cond) { +- jclass lcl_class; +- jmethodID bcast_mth; +- JNIEnv *gdk_env; ++static void ++cond_broadcast_jni_impl (GCond * gcond) ++{ ++ jobject condObj = (jobject) gcond; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("cond_broadcast_jni_impl(condObj=%p)", condObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++ assert (condObj); ++ /* Must have locked an object to call notifyAll */ ++ if (ENTER_MONITOR (env, condObj)) ++ goto done; + +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object"); +- MAYBE_RETHROW(gdk_env, "cannot find Object"); +- +- bcast_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "notifyAll", "()V"); +- MAYBE_RETHROW(gdk_env, "cannot find Object."); ++ (*env)->CallVoidMethod (env, condObj, obj_notifyall_mth); ++ if (MAYBE_BROKEN (env, "cannot broadcast to mutex with Object.notify()")) ++ { ++ EXIT_MONITOR (env, condObj); ++ goto done; ++ } + +- /* Must have locked an object to call notifyAll */ +- takeLock(gdk_env, cond); ++ EXIT_MONITOR (env, condObj); + +- (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, bcast_mth); +- MAYBE_RETHROW(gdk_env, "cannot broadcast to mutex"); ++ SHOW_OLD_TROUBLE (); + +- releaseLock(gdk_env, cond); ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + + +-/* Wait on a condition variable. For us, this simply means call ++/* Wait on a condition variable. For us, this simply means calling + * Object.wait. ++ * ++ * Throws a Java exception on trouble; may leave the mutexes set arbitrarily. ++ * XXX TODO: Further improve error recovery. + */ +-static void g_cond_wait_jni_impl +- (GCond *cond, GMutex *mutex __attribute__((unused))) ++static void ++cond_wait_jni_impl (GCond * gcond, GMutex * gmutex) + { +- jclass lcl_class; +- jmethodID wait_mth; +- JNIEnv *gdk_env; +- +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); +- +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object"); +- MAYBE_RETHROW(gdk_env, "cannot find Object"); +- +- wait_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "wait", "()V"); +- MAYBE_RETHROW(gdk_env, "cannot find Object."); +- +- /* Must have locked an object to call wait */ +- takeLock(gdk_env, cond); +- +- (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, wait_mth); +- MAYBE_RETHROW(gdk_env, "cannot wait on mutex"); ++ struct mutexObj_cache cache; ++ jobject condObj = (jobject) gcond; ++ jobject mutexObj = (jobject) gmutex; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("cond_wait_jni_impl(condObj=%p, mutexObj=%p)", ++ condObj, mutexObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ assert (condObj); ++ assert (mutexObj); ++ /* Must have locked a Java object to call wait on it */ ++ if (ENTER_MONITOR (env, condObj) < 0) ++ goto done; ++ ++ /* Our atomicity is now guaranteed; we're protected by the Java monitor on ++ condObj. Unlock the GMutex. */ ++ if (mutexObj_unlock (env, mutexObj, &cache)) ++ goto done; ++ ++ (*env)->CallVoidMethod (env, condObj, obj_wait_mth); ++ if (MAYBE_BROKEN (env, "cannot wait on condObj")) ++ { ++ EXIT_MONITOR (env, condObj); /* ignore err checking */ ++ goto done; ++ } + +- releaseLock(gdk_env, cond); ++ /* Re-acquire the lock on the GMutex. Do this while we're protected by the ++ Java monitor on condObj. */ ++ if (mutexObj_lock (env, mutexObj, &cache)) ++ goto done; ++ ++ EXIT_MONITOR (env, condObj); ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + +-/* Wait on a condition vairable until a timeout. This is a little tricky ++ ++/** Wait on a condition variable until a timeout. This is a little tricky + * for us. We first call Object.wait(J) giving it the appropriate timeout + * value. On return, we check whether an InterruptedException happened. If +- * so, that is Java-speak for wait timing out. ++ * so, that is Java-speak for wait timing out. ++ * ++ * We return FALSE if we timed out. Return TRUE if the condition was ++ * signalled first, before we timed out. ++ * ++ * In case of trouble we throw a Java exception. Whether we return FALSE or ++ * TRUE depends upon whether the condition was raised before the trouble ++ * happened. ++ * ++ * I believe that this function goes to the proper lengths to try to unlock ++ * all of the locked mutexes and monitors, as appropriate, and that it further ++ * tries to make sure that the thrown exception is the current one, not any ++ * future cascaded one from something like a failure to unlock the monitors. + */ + static gboolean +-g_cond_timed_wait_jni_impl +- (GCond *cond, GMutex *mutex __attribute__((unused)), +- GTimeVal *end_time) ++cond_timed_wait_jni_impl (GCond * gcond, GMutex * gmutex, GTimeVal * end_time) + { +- jclass lcl_class; +- jmethodID wait_mth; +- JNIEnv *gdk_env; +- jlong time; ++ JNIEnv *env; ++ union env_union e; ++ jlong time_millisec; ++ jint time_nanosec; + jthrowable cause; ++ jobject condObj = (jobject) gcond; ++ jobject mutexObj = (jobject) gmutex; ++ gboolean condRaised = FALSE; /* Condition has not been raised yet. */ ++ struct mutexObj_cache cache; ++ gboolean interrupted; ++ ++ if (TRACE_API_CALLS) ++ { ++ tracing ("cond_timed_wait_jni_impl(cond=%p, mutex=%p," ++ " end_time=< sec=%lu, usec=%lu >)", condObj, mutexObj, ++ (unsigned long) end_time->tv_sec, ++ (unsigned long) end_time->tv_usec); ++ } + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); + +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object"); +- MAYBE_RETHROW(gdk_env, "cannot find Object"); +- +- wait_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "wait", "(J)V"); +- MAYBE_RETHROW(gdk_env, "cannot find Object."); +- +- time = end_time->tv_sec*1000; +- time += end_time->tv_usec/1000; ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ time_millisec = end_time->tv_sec * 1000 + end_time->tv_usec / 1000; ++ time_nanosec = 1000 * (end_time->tv_usec % 1000); + + /* Must have locked an object to call wait */ +- takeLock(gdk_env, cond); ++ if (ENTER_MONITOR (env, condObj) < 0) ++ goto done; ++ ++ if (mutexObj_unlock (env, mutexObj, &cache) < 0) ++ { ++ if (EXIT_MONITOR (env, condObj) < 0) ++ criticalMsg ++ ("Unable to unlock an existing lock on a condition; your proram may deadlock"); ++ goto done; ++ } ++ ++ ++ (*env)->CallVoidMethod (env, condObj, obj_wait_nanotime_mth, ++ time_millisec, time_nanosec); ++ ++ /* If there was trouble, save that fact, and the reason for the trouble. We ++ want to respond to this condition as fast as possible. */ ++ cause = (*env)->ExceptionOccurred (env); ++ ++ if ( ! cause ) ++ { ++ condRaised = TRUE; /* condition was signalled */ ++ } ++ else if ((*env)->IsInstanceOf (env, cause, interrupted_exception_class)) ++ { ++ condRaised = FALSE; /* Condition was not raised before timeout. ++ (This is redundant with the initialization ++ of condRaised above) */ ++ (*env)->ExceptionClear (env); /* Clear the InterruptedException. */ ++ cause = NULL; /* no pending cause now. */ ++ } ++ else ++ { ++ interrupted = FALSE; /* Trouble, but not because of ++ InterruptedException. Assume the condition ++ was not raised. */ ++ /* Leave condRaised set to FALSE */ ++ } ++ ++ /* Irrespective of whether there is a pending problem to report, go ahead ++ and try to clean up. This may end up throwing an exception that is ++ different from the one that was thrown by the call to Object.wait(). ++ So we will override it with the first exception (don't want to have ++ cascading problems). */ ++ if (mutexObj_lock (env, mutexObj, &cache) && !cause) ++ { ++ cause = (*env)->ExceptionOccurred (env); ++ assert (cause); ++ } + +- (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, wait_mth, time); ++ if (EXIT_MONITOR (env, condObj) && !cause) ++ { ++ cause = (*env)->ExceptionOccurred (env); ++ assert (cause); ++ } + +- if ((cause = (*gdk_env)->ExceptionOccurred(gdk_env)) != NULL) { +- jclass intr = (*gdk_env)->FindClass (gdk_env, "java.lang.InterruptedException"); +- if ( (*gdk_env)->IsInstanceOf(gdk_env, cause, intr) ) { +- releaseLock(gdk_env, cond); +- return FALSE; +- } else { +- MAYBE_RETHROW(gdk_env, "error in timed wait"); ++ if (cause) /* Raise the first cause. */ ++ { ++ BROKEN_CAUSE (env, cause, "error in timed wait or during its cleanup"); ++ goto done; + } +- } + +- releaseLock(gdk_env, cond); ++ SHOW_OLD_TROUBLE (); + +- return TRUE; ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> condRaised = %s\n", condRaised ? "TRUE" : "FALSE"); ++ return condRaised; + } + +-/* Free a condition variable. (isn't C fun?) */ +-static void g_cond_free_jni_impl (GCond *cond) { +- freePlainObject( (jobject*)cond ); ++ ++/* Free a condition variable. (isn't C fun?). Can not fail. */ ++static void ++cond_free_jni_impl (GCond * cond) ++{ ++ jobject condObj = (jobject) cond; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("cond_free_jni_impl(condObj = %p)", condObj); ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ freeObject (env, condObj); ++ ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); + } + + +@@ -368,132 +1955,638 @@ + /* Thread-local data code */ + /************************************************************************/ + +-/* Create a new thread-local key. We use java.lang.ThreadLocal objects +- * for this. ++/* Create a new thread-local key. We use java.lang.ThreadLocal objects ++ * for this. This returns the pointer representation of a Java global ++ * reference. ++ * ++ * We will throw a Java exception and return NULL in case of failure. + */ +-static GPrivate *g_private_new_jni_impl +- (GDestroyNotify notify __attribute__((unused))) ++static GPrivate * ++private_new_jni_impl (GDestroyNotify notify __attribute__ ((unused))) + { +- jclass lcl_class; +- jobject *local; +- JNIEnv *gdk_env; +- jmethodID ctor; +- +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++ JNIEnv *env; ++ union env_union e; ++ jobject lcl_key; ++ jobject global_key; ++ GPrivate *gkey = NULL; /* Error return code */ ++ ++ if (TRACE_API_CALLS) ++ tracing ("private_new_jni_impl()"); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ lcl_key = (*env)->NewObject (env, threadlocal_class, threadlocal_ctor); ++ if ( ! lcl_key ) ++ { ++ BROKEN (env, "cannot allocate a ThreadLocal"); ++ goto done; ++ } + +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal"); ++ global_key = ((*env)->NewGlobalRef (env, lcl_key)); ++ DELETE_LOCAL_REF (env, lcl_key); ++ if ( ! global_key) ++ { ++ NEW_BROKEN (env, "cannot create a GlobalRef to a new ThreadLocal"); ++ goto done; ++ } + +- ctor = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "", "()V"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal."); ++ gkey = (GPrivate *) global_key; ++ SHOW_OLD_TROUBLE (); + +- local = (jobject *) g_malloc (sizeof (jobject)); +- *local = (*gdk_env)->NewObject(gdk_env, lcl_class, ctor); +- MAYBE_RETHROW(gdk_env, "cannot allocate a ThreadLocal"); +- +- *local = ((*gdk_env)->NewGlobalRef (gdk_env, *local)); +- MAYBE_RETHROW(gdk_env, "cannot create a GlobalRef"); ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> %p\n", (void *) gkey); + +- return (GPrivate*) local; ++ return gkey; + } + + /* Get this thread's value for a thread-local key. This is simply +- * ThreadLocal.get for us. ++ * ThreadLocal.get for us. Return NULL if no value. (I can't think of ++ * anything else to do.) + */ +-static gpointer g_private_get_jni_impl (GPrivate *private) { +- jclass lcl_class; +- jobject lcl_obj; +- JNIEnv *gdk_env; +- jmethodID get_mth; +- jclass int_class; +- jmethodID val_mth; +- jint int_val; +- +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++static gpointer ++private_get_jni_impl (GPrivate * gkey) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject val_wrapper; ++ jobject keyObj = (jobject) gkey; ++ gpointer thread_specific_data = NULL; /* Init to the error-return value */ ++ ++ jlong val; ++ ++ if (TRACE_API_CALLS) ++ tracing ("private_get_jni_impl(keyObj=%p)", keyObj); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ val_wrapper = (*env)->CallObjectMethod (env, keyObj, threadlocal_get_mth); ++ if (MAYBE_BROKEN (env, "cannot find thread-local object")) ++ goto done; ++ ++ if (! val_wrapper ) ++ { ++ /* It's Java's "null" object. No ref found. This is OK; we must never ++ have set a value in this thread. Note that this next statement is ++ not necessary, strictly speaking, since we're already initialized to ++ NULL. A good optimizing C compiler will detect that and optimize out ++ this statement. */ ++ thread_specific_data = NULL; ++ goto done; ++ } + +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal"); ++ val = (*env)->CallLongMethod (env, val_wrapper, long_longValue_mth); + +- get_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "get", "()Ljava/lang/Object;"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal."); ++ if (MAYBE_BROKEN (env, "cannot get thread local value")) ++ goto done; + +- lcl_obj = (*gdk_env)->CallObjectMethod(gdk_env, *(jobject*)private, get_mth); +- MAYBE_RETHROW(gdk_env, "cannot find thread-local object"); ++ thread_specific_data = (gpointer) (intptr_t) val; + +- int_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Integer"); +- MAYBE_RETHROW(gdk_env, "cannot find Integer"); ++ /* Only re-raise the old pending exception if a new one hasn't come along to ++ supersede it. */ ++ SHOW_OLD_TROUBLE (); + +- val_mth = (*gdk_env)->GetMethodID(gdk_env, int_class, "intValue", "()I"); +- MAYBE_RETHROW(gdk_env, "cannot find Integer."); ++done: + +- int_val = (*gdk_env)->CallIntMethod(gdk_env, lcl_obj, val_mth); +- MAYBE_RETHROW(gdk_env, "cannot get thread local value"); ++ if (TRACE_API_CALLS) ++ tracing (" ==> %p\n", thread_specific_data); + +- return (gpointer) int_val; ++ return thread_specific_data; + } + +-/* Set this thread's value for a thread-local key. This is simply +- * ThreadLocal.set for us. ++/* Set this thread's value for a thread-local key. This is simply ++ * ThreadLocal.set() for us. + */ +-static void g_private_set_jni_impl (GPrivate *private, gpointer data) { +- jclass lcl_class, int_class; +- jobject lcl_obj; +- JNIEnv *gdk_env; +- jmethodID new_int, set_mth; ++static void ++private_set_jni_impl (GPrivate * gkey, gpointer thread_specific_data) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject val_wrapper; ++ jobject keyObj = (jobject) gkey; ++ ++ ++ if (TRACE_API_CALLS) ++ tracing ("private_set_jni_impl(keyObj=%p, thread_specific_data=%p)", ++ keyObj, thread_specific_data); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ /* We are just going to always use a Java long to represent a C pointer. ++ Otherwise all of the code would end up being conditionalized for various ++ pointer sizes, and that seems like too much of a hassle, in order to save ++ a paltry few bytes, especially given the horrendous overhead of JNI in ++ any case. ++ */ ++ ++ val_wrapper = (*env)->NewObject (env, long_class, long_ctor, ++ (jlong) (intptr_t) thread_specific_data); ++ if ( ! val_wrapper ) ++ { ++ BROKEN (env, "cannot create a java.lang.Long"); ++ goto done; ++ } ++ ++ /* At this point, we now have set lcl_obj as a numeric class that wraps ++ around the thread-specific data we were given. */ ++ (*env)->CallVoidMethod (env, keyObj, threadlocal_set_mth, val_wrapper); ++ if (MAYBE_BROKEN (env, "cannot set thread local value")) ++ goto done; ++ ++ SHOW_OLD_TROUBLE (); ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); ++} ++ ++ ++/** Create an object of type gnu.java.awt.peer.gtk.GThreadNativeMethodRunner. ++ Run it. ++ ++ We need to create joinable threads. We handle the notion of a joinable ++ thread by determining whether or not we are going to maintain a permanent ++ hard reference to it until it croaks. ++ ++ Posix does not appear to have a Java-like concept of daemon threads, where ++ the JVM will exit when there are only daemon threads running. ++ ++ Error handling: ++ ++ To quote from the glib guide: ++ "GError should only be used to report recoverable runtime errors, never ++ to report programming errors." ++ ++ So how do we consider the failure to create a thread? Well, each of the ++ failure cases in this function are discussed, and none of them are really ++ recoverable. ++ ++ The glib library is really designed so that you should fail ++ catastrophically in case of "programming errors". The only error defined ++ for the GThread functions is G_THREAD_ERROR_AGAIN, and that for ++ thread_create. ++ ++ Most of these GThread functions could fail if we run out of memory, for ++ example, but the only one capable of reporting that fact is ++ thread_create. */ ++static void ++thread_create_jni_impl (GThreadFunc func, ++ gpointer data, ++ gulong stack_size __attribute__((unused)), ++ gboolean joinable, ++ gboolean bound __attribute__((unused)), ++ GThreadPriority gpriority, ++ /* This prototype is horrible. threadIDp is actually ++ a gpointer to the thread's thread-ID. Which is, ++ of course, itself a gpointer-typed value. Ouch. */ ++ gpointer threadIDp, ++ /* Do not touch the GError stuff unless you have ++ RECOVERABLE trouble. There is no recoverable ++ trouble in this implementation. */ ++ GError **errorp __attribute__((unused))) ++{ ++ JNIEnv *env; ++ union env_union e; ++ union func_union f; ++ jboolean jjoinable = joinable; ++ jobject newThreadObj; ++ gpointer threadID; /* to be filled in */ ++ ++ if (TRACE_API_CALLS) ++ { ++ f.g_func = func; ++ tracing ("thread_create_jni_impl(func=%p, data=%p, joinable=%s," ++ " threadIDp=%p, *(int *) threadIDp = %d)", ++ f.void_func, data, joinable ? "TRUE" : "FALSE", ++ threadIDp, *(int *) threadIDp); ++ } + +- (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1); ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ { ++ /* The failed call to setup the cache is certainly not recoverable; ++ not appropriate for G_THREAD_ERROR_AGAIN. */ ++ *(gpointer *) threadIDp = NULL; ++ goto done; ++ } ++ HIDE_OLD_TROUBLE (env); + +- int_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Integer"); +- MAYBE_RETHROW(gdk_env, "cannot find Integer"); ++ /* If a thread is joinable, then notify its constructor. The constructor ++ will enter a hard reference for it, and the hard ref. won't go away until ++ the thread has been joined. */ ++ newThreadObj = ++ (*env)->NewObject (env, runner_class, runner_ctor, ++ (jlong) (intptr_t) func, (jlong) (intptr_t) data, ++ jjoinable); ++ if ( ! newThreadObj ) ++ { ++ BROKEN (env, "creating a new thread failed in the constructor"); ++ *(gpointer *) threadIDp = NULL; ++ /* The failed call to the constructor does not throw any errors such ++ that G_THREAD_ERROR_AGAIN is appropriate. No other recoverable ++ errors defined. Once again, we go back to the VM. */ ++ goto done; ++ } + +- new_int = (*gdk_env)->GetMethodID(gdk_env, int_class, "", "(I)V"); +- MAYBE_RETHROW(gdk_env, "cannot find Integer."); ++ if (threadObj_set_priority (env, newThreadObj, gpriority) < 0) ++ { ++ *(gpointer *) threadIDp = NULL; ++ /* None of these possible exceptions from Thread.setPriority() are ++ recoverable, so they are not appropriate for EAGAIN. So we should ++ fail. */ ++ goto done; ++ } ++ ++ (*env)->CallVoidMethod (env, runner_class, runner_start_mth); + +- lcl_obj = (*gdk_env)->NewObject(gdk_env, int_class, new_int, (jint)data); +- MAYBE_RETHROW(gdk_env, "cannot create an Integer"); ++ if (MAYBE_BROKEN (env, "starting a new thread failed")) ++ { ++ *(gpointer *) threadIDp = NULL; ++ /* The only exception Thread.start() throws is ++ IllegalStateException. And that would indicate a programming error. ++ ++ So there are no situations such that G_THREAD_ERROR_AGAIN would be ++ OK. ++ ++ So, we don't use g_set_error() here to perform any error reporting. ++ */ ++ goto done; ++ } + +- lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal"); ++ threadID = getThreadIDFromThread (env, newThreadObj); + +- set_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "set", "(Ljava/lang/Object;)V"); +- MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal."); ++ *(gpointer *) threadIDp = threadID; ++ SHOW_OLD_TROUBLE (); + +- (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)private, set_mth, lcl_obj); +- MAYBE_RETHROW(gdk_env, "cannot set thread local value"); ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> (threadID = %p) \n", threadID); + } + + ++/* Wraps a call to g_thread_yield. */ ++static void ++thread_yield_jni_impl (void) ++{ ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("thread_yield_jni_impl()"); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ (*env)->CallStaticVoidMethod (env, thread_class, thread_yield_mth); ++ if (MAYBE_BROKEN (env, "Thread.yield() failed")) ++ goto done; ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); ++} ++ ++ ++static void ++thread_join_jni_impl (gpointer threadID) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject threadObj = NULL; ++ ++ if ( TRACE_API_CALLS ) ++ tracing ("thread_join_jni_impl(threadID=%p) ", threadID); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ HIDE_OLD_TROUBLE (env); ++ ++ threadObj = getThreadFromThreadID (env, threadID); ++ if ( ! threadObj ) /* Already reported with BROKEN */ ++ goto done; ++ ++ (*env)->CallVoidMethod (env, threadObj, thread_join_mth); ++ if (MAYBE_BROKEN (env, "Thread.join() failed")) ++ goto done; ++ ++ ++ (*env)->CallStaticVoidMethod ++ (env, runner_class, runner_deRegisterJoinable_mth, threadObj); ++ if (MAYBE_BROKEN (env, "Thread.deRegisterJoinableThread() failed")) ++ goto done; ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ DELETE_LOCAL_REF (env, threadObj); ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID \n"); ++} ++ ++/* Terminate the current thread. Unlike pthread_exit(), here we do not need ++ to bother with a return value or exit value for the thread which is about ++ to croak. (The gthreads abstraction doesn't use it.) However, we *do* ++ need to bail immediately. We handle this with Thread.stop(), which is ++ a deprecated method. ++ ++ It's deprecated since we might leave objects protected by monitors in ++ half-constructed states on the way out -- Thread.stop() throws a ++ ThreadDeath exception, which is usually unchecked. There is no good ++ solution that I can see. */ ++static void ++thread_exit_jni_impl (void) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject this_thread; ++ ++ if (TRACE_API_CALLS) ++ tracing ("thread_exit_jni_impl() "); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ goto done; ++ ++ HIDE_OLD_TROUBLE (env); ++ ++ this_thread = (*env)-> ++ CallStaticObjectMethod (env, thread_class, thread_current_mth); ++ ++ if ( ! this_thread ) ++ { ++ BROKEN (env, "cannot get current thread"); ++ goto done; ++ } ++ ++ (*env)->CallVoidMethod (env, this_thread, thread_stop_mth); ++ if (MAYBE_BROKEN (env, "cannot call Thread.stop() on current thread")) ++ goto done; ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID \n"); ++} ++ ++ ++/* Translate a GThreadPriority to a Java priority level. */ ++static jint ++javaPriorityLevel (GThreadPriority priority) ++{ ++ /* We have these fields in java.lang.Thread to play with: ++ ++ static int MIN_PRIORITY The minimum priority that a thread can have. ++ static int NORM_PRIORITY The default priority that is assigned to a ++ thread. ++ static int MAX_PRIORITY The maximum priority that a thread can have. ++ ++ We get these from the header file generated by javah, even though they're ++ documented as being 1, 5, and 10. ++ */ ++ static const jint minJPri = ++ gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MIN_PRIORITY; ++ static const jint normJPri = ++ gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_NORM_PRIORITY; ++ static const jint maxJPri = ++ gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_MAX_PRIORITY; ++ ++ switch (priority) ++ { ++ case G_THREAD_PRIORITY_LOW: ++ return minJPri; ++ break; ++ ++ default: ++ assert_not_reached (); ++ /* Deliberate fall-through if assertions are turned off; also shuts up ++ GCC warnings if they're turned on. */ ++ case G_THREAD_PRIORITY_NORMAL: ++ return normJPri; ++ break; ++ ++ case G_THREAD_PRIORITY_HIGH: ++ return (normJPri + maxJPri) / 2; ++ break; ++ ++ case G_THREAD_PRIORITY_URGENT: ++ return maxJPri; ++ break; ++ } ++} ++ ++ ++/** It would be safe not to implement this, according to the JNI docs, since ++ not all platforms do thread priorities. However, we might as well ++ provide the hint for those who want it. ++*/ ++static void ++thread_set_priority_jni_impl (gpointer gThreadID, GThreadPriority gpriority) ++{ ++ jobject threadObj = NULL; ++ JNIEnv *env; ++ union env_union e; ++ ++ if (TRACE_API_CALLS) ++ tracing ("thread_set_priority_jni_impl(gThreadID=%p, gpriority = %u) ", ++ gThreadID, gpriority); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ if (setup_cache (env) < 0) ++ goto done; ++ ++ HIDE_OLD_TROUBLE (env); ++ ++ ++ threadObj = getThreadFromThreadID (env, gThreadID); ++ if ( ! threadObj) /* Reported with BROKEN already. */ ++ goto done; ++ ++ if (threadObj_set_priority (env, threadObj, gpriority)) ++ goto done; ++ ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ DELETE_LOCAL_REF (env, threadObj); ++ ++ if (TRACE_API_CALLS) ++ tracing (" ==> VOID\n"); ++} ++ ++ ++/** It would be safe not to implement this, according to the JNI docs, since ++ not all platforms do thread priorities. However, we might as well ++ provide the hint for those who want it. ++ ++ -1 on failure, 0 on success. */ ++static int ++threadObj_set_priority (JNIEnv * env, jobject threadObj, ++ GThreadPriority gpriority) ++{ ++ jint javaPriority = javaPriorityLevel (gpriority); ++ (*env)->CallVoidMethod (env, threadObj, thread_setPriority_mth, ++ javaPriority); ++ return MAYBE_BROKEN (env, "Thread.setPriority() failed"); ++} ++ ++ ++/** Return the result of Thread.currentThread(), a static method. */ ++static void ++thread_self_jni_impl (/* Another confusing glib prototype. This is ++ actually a gpointer to the thread's thread-ID. ++ Which is, of course, a gpointer. */ ++ gpointer my_thread_IDp) ++{ ++ JNIEnv *env; ++ union env_union e; ++ jobject this_thread; ++ gpointer my_threadID; ++ ++ if (TRACE_API_CALLS) ++ tracing ("thread_self_jni_impl(my_thread_IDp=%p)", my_thread_IDp); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ ++ if (setup_cache (env) < 0) ++ return; ++ ++ HIDE_OLD_TROUBLE (env); ++ ++ this_thread = (*env)-> ++ CallStaticObjectMethod (env, thread_class, thread_current_mth); ++ if (! this_thread ) ++ { ++ BROKEN (env, "cannot get current thread"); ++ my_threadID = NULL; ++ goto done; ++ } ++ ++ my_threadID = getThreadIDFromThread (env, this_thread); ++ SHOW_OLD_TROUBLE (); ++ ++done: ++ if (TRACE_API_CALLS) ++ tracing (" ==> (my_threadID = %p) \n", my_threadID); ++ ++ *(gpointer *) my_thread_IDp = my_threadID; ++} ++ ++ ++static gboolean ++thread_equal_jni_impl (gpointer thread1, gpointer thread2) ++{ ++ JNIEnv *env; ++ union env_union e; ++ ++ gpointer threadID1 = *(gpointer *) thread1; ++ gpointer threadID2 = *(gpointer *) thread2; ++ ++ jobject thread1_obj = NULL; ++ jobject thread2_obj = NULL; ++ gboolean ret; ++ ++ if (TRACE_API_CALLS) ++ tracing ("thread_equal_jni_impl(threadID1=%p, threadID2=%p)", ++ threadID1, threadID2); ++ ++ e.jni_env = &env; ++ (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); ++ if (setup_cache (env) < 0) ++ { ++ ret = FALSE; /* what is safer? We really don't ever want ++ to return from here. */ ++ goto done; ++ } ++ ++ HIDE_OLD_TROUBLE (env); ++ thread1_obj = getThreadFromThreadID (env, threadID1); ++ thread2_obj = getThreadFromThreadID (env, threadID2); ++ ++ ret = (*env)->CallBooleanMethod (env, thread1_obj, ++ thread_equals_mth, thread2_obj); ++ ++ if (MAYBE_BROKEN (env, "Thread.equals() failed")) ++ { ++ ret = FALSE; ++ goto done; ++ } ++ ++ SHOW_OLD_TROUBLE (); ++ ++ ++done: ++ DELETE_LOCAL_REF (env, thread1_obj); ++ DELETE_LOCAL_REF (env, thread2_obj); ++ ++ if (TRACE_API_CALLS) ++ tracing (" ==> %s\n", ret ? "TRUE" : "FALSE"); ++ ++ return ret; ++} ++ ++ ++ ++ + /************************************************************************/ + /* GLIB interface */ + /************************************************************************/ + + /* set of function pointers to give to glib. */ +-GThreadFunctions g_thread_jni_functions = +-{ +- g_mutex_new_jni_impl, /* mutex_new */ +- g_mutex_lock_jni_impl, /* mutex_lock */ +- g_mutex_trylock_jni_impl, /* mutex_try_lock */ +- g_mutex_unlock_jni_impl, /* mutex_unlock */ +- g_mutex_free_jni_impl, /* mutex_free */ +- g_cond_new_jni_impl, /* cond_new */ +- g_cond_signal_jni_impl, /* cond_signal */ +- g_cond_broadcast_jni_impl, /* cond_broadcast */ +- g_cond_wait_jni_impl, /* cond_wait */ +- g_cond_timed_wait_jni_impl, /* cond_timed_wait */ +- g_cond_free_jni_impl, /* cond_free */ +- g_private_new_jni_impl, /* private_new */ +- g_private_get_jni_impl, /* private_get */ +- g_private_set_jni_impl, /* private_set */ +- NULL, +- NULL, +- NULL, +- NULL, +- NULL, +- NULL, +- NULL ++GThreadFunctions portable_native_sync_jni_functions = { ++ mutex_new_jni_impl, /* mutex_new */ ++ mutex_lock_jni_impl, /* mutex_lock */ ++ mutex_trylock_jni_impl, /* mutex_trylock */ ++ mutex_unlock_jni_impl, /* mutex_unlock */ ++ mutex_free_jni_impl, /* mutex_free */ ++ cond_new_jni_impl, /* cond_new */ ++ cond_signal_jni_impl, /* cond_signal */ ++ cond_broadcast_jni_impl, /* cond_broadcast */ ++ cond_wait_jni_impl, /* cond_wait */ ++ cond_timed_wait_jni_impl, /* cond_timed_wait */ ++ cond_free_jni_impl, /* cond_free */ ++ private_new_jni_impl, /* private_new */ ++ private_get_jni_impl, /* private_get */ ++ private_set_jni_impl, /* private_set */ ++ thread_create_jni_impl, /* thread_create */ ++ thread_yield_jni_impl, /* thread_yield */ ++ thread_join_jni_impl, /* thread_join */ ++ thread_exit_jni_impl, /* thread_exit */ ++ thread_set_priority_jni_impl, /* thread_set_priority */ ++ thread_self_jni_impl, /* thread_self */ ++ thread_equal_jni_impl, /* thread_equal */ + }; ++ + +-/* ??? */ +-void gdk_threads_wake () { +- +-} ++/* Keep c-font-lock-extra-types in alphabetical order. */ ++/* Local Variables: */ ++/* c-file-style: "gnu" */ ++/* c-font-lock-extra-types: ("\\sw+_t" "gboolean" "GError" "gpointer" ++ "GPrivate" "GThreadFunc" "GThreadFunctions" "GThreadPriority" ++ "gulong" ++ "JNIEnv" ++ "jboolean" "jclass" "jfieldID" "jint" "jlong" "jmethodID" "jobject" "jstring" "jthrowable" ) */ ++/* End: */ +Index: jni/gtk-peer/gthread-jni.h +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gthread-jni.h,v +retrieving revision 1.2 +diff -u -r1.2 gthread-jni.h +--- jni/gtk-peer/gthread-jni.h 30 Jun 2003 23:53:29 -0000 1.2 ++++ jni/gtk-peer/gthread-jni.h 6 Sep 2004 16:36:15 -0000 +@@ -42,7 +42,7 @@ + #include + #include "gtkpeer.h" + +-extern GThreadFunctions g_thread_jni_functions; +-extern JavaVM *gdk_vm; ++extern GThreadFunctions portable_native_sync_jni_functions; ++extern JavaVM *the_vm; + + #endif /* __GTHREADJNI_H__ */ +Index: jni/gtk-peer/gtkcairopeer.h +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkcairopeer.h,v +retrieving revision 1.1 +diff -u -r1.1 gtkcairopeer.h +--- jni/gtk-peer/gtkcairopeer.h 31 Dec 2003 08:58:31 -0000 1.1 ++++ jni/gtk-peer/gtkcairopeer.h 6 Sep 2004 16:36:15 -0000 +@@ -71,7 +71,8 @@ + GdkWindow *win; + GdkPixbuf *drawbuf; + char *pattern_pixels; +- cairo_surface_t *pattern; ++ cairo_surface_t *pattern_surface; ++ cairo_pattern_t *pattern; + gboolean debug; + }; + +Index: jni/gtk-peer/gtkpeer.h +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v +retrieving revision 1.12 +diff -u -r1.12 gtkpeer.h +--- jni/gtk-peer/gtkpeer.h 23 Dec 2003 19:24:00 -0000 1.12 ++++ jni/gtk-peer/gtkpeer.h 6 Sep 2004 16:36:15 -0000 +@@ -91,6 +91,20 @@ + (*env)->DeleteGlobalRef (env, *globRefPtr); \ + free (globRefPtr);} while (0) + ++extern struct state_table *native_pixbufdecoder_state_table; ++ ++#define NSA_PB_INIT(env, clazz) \ ++ native_pixbufdecoder_state_table = init_state_table (env, clazz) ++ ++#define NSA_GET_PB_PTR(env, obj) \ ++ get_state (env, obj, native_pixbufdecoder_state_table) ++ ++#define NSA_SET_PB_PTR(env, obj, ptr) \ ++ set_state (env, obj, native_pixbufdecoder_state_table, (void *)ptr) ++ ++#define NSA_DEL_PB_PTR(env, obj) \ ++ remove_state_slot (env, obj, native_pixbufdecoder_state_table) ++ + #endif /* JVM_SUN */ + + struct graphics +@@ -118,14 +132,14 @@ + + #define SYNTHETIC_EVENT_MASK (1 << 10) + +-#define AWT_SHIFT_MASK (1 << 0) +-#define AWT_CTRL_MASK (1 << 1) +-#define AWT_META_MASK (1 << 2) +-#define AWT_ALT_MASK (1 << 3) +- +-#define AWT_BUTTON1_MASK (1 << 4) +-#define AWT_BUTTON2_MASK AWT_ALT_MASK +-#define AWT_BUTTON3_MASK AWT_META_MASK ++#define AWT_SHIFT_DOWN_MASK (1 << 6) ++#define AWT_CTRL_DOWN_MASK (1 << 7) ++#define AWT_META_DOWN_MASK (1 << 8) ++#define AWT_ALT_DOWN_MASK (1 << 9) ++ ++#define AWT_BUTTON1_DOWN_MASK (1 << 10) ++#define AWT_BUTTON2_DOWN_MASK (1 << 11) ++#define AWT_BUTTON3_DOWN_MASK (1 << 12) + + #define MULTI_CLICK_TIME 250 + /* as opposed to a MULTI_PASS_TIME :) */ +@@ -361,8 +375,8 @@ + #define VK_ALT_GRAPH 65406 + #define VK_UNDEFINED 0 + +-#define AWT_FOCUS_LOST 1004 +-#define AWT_FOCUS_GAINED 1005 ++#define AWT_FOCUS_GAINED 1004 ++#define AWT_FOCUS_LOST 1005 + + #define AWT_WINDOW_OPENED 200 + #define AWT_WINDOW_CLOSING 201 +@@ -385,6 +399,35 @@ + #define AWT_STYLE_BOLD 1 + #define AWT_STYLE_ITALIC 2 + ++/* From java.awt.SystemColor */ ++#define AWT_DESKTOP 0 ++#define AWT_ACTIVE_CAPTION 1 ++#define AWT_ACTIVE_CAPTION_TEXT 2 ++#define AWT_ACTIVE_CAPTION_BORDER 3 ++#define AWT_INACTIVE_CAPTION 4 ++#define AWT_INACTIVE_CAPTION_TEXT 5 ++#define AWT_INACTIVE_CAPTION_BORDER 6 ++#define AWT_WINDOW 7 ++#define AWT_WINDOW_BORDER 8 ++#define AWT_WINDOW_TEXT 9 ++#define AWT_MENU 10 ++#define AWT_MENU_TEXT 11 ++#define AWT_TEXT 12 ++#define AWT_TEXT_TEXT 13 ++#define AWT_TEXT_HIGHLIGHT 14 ++#define AWT_TEXT_HIGHLIGHT_TEXT 15 ++#define AWT_TEXT_INACTIVE_TEXT 16 ++#define AWT_CONTROL 17 ++#define AWT_CONTROL_TEXT 18 ++#define AWT_CONTROL_HIGHLIGHT 19 ++#define AWT_CONTROL_LT_HIGHLIGHT 20 ++#define AWT_CONTROL_SHADOW 21 ++#define AWT_CONTROL_DK_SHADOW 22 ++#define AWT_SCROLLBAR 23 ++#define AWT_INFO 24 ++#define AWT_INFO_TEXT 25 ++#define AWT_NUM_COLORS 26 ++ + extern jmethodID setBoundsCallbackID; + + extern jmethodID postActionEventID; +@@ -406,6 +449,8 @@ + extern jmethodID gdkColorID; + extern JNIEnv *gdk_env; + ++extern double dpi_conversion_factor; ++ + extern GtkWindowGroup *global_gtk_window_group; + + void awt_event_handler (GdkEvent *event); +@@ -428,4 +473,19 @@ + const char *label; + }; + ++#define DEBUG_LOCKING 0 ++ ++#if DEBUG_LOCKING ++#define gdk_threads_enter() \ ++{ \ ++ g_print ("lock: %s, %d\n", __FILE__, __LINE__); \ ++ gdk_threads_enter (); \ ++} ++#define gdk_threads_leave() \ ++{ \ ++ g_print ("unlock: %s, %d\n", __FILE__, __LINE__); \ ++ gdk_threads_leave (); \ ++} ++#endif ++ + #endif /* __GTKPEER_H */ --- gcc-3.4-3.4.2.orig/debian/patches/hppa-libjava-update.dpatch +++ gcc-3.4-3.4.2/debian/patches/hppa-libjava-update.dpatch @@ -0,0 +1,255 @@ +#! /bin/sh -e + +# DP: MD_FALLBACK_FRAME_STATE_FOR definition for pa32-linux + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libjava && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +From: "John David Anglin" +Sender: gcc-patches-owner@gcc.gnu.org +To: randolph@tausq.org +Cc: gcc-patches@gcc.gnu.org +Subject: Re: [patch/hppa-linux] MD_FALLBACK_FRAME_STATE_FOR definition +Date: Thu, 8 Jul 2004 23:44:54 -0400 (EDT) + +I committed the following, slightly revised version, of your patch. +The libjava portion was previously approved. + +Tested on hppa-unknown-linux-gnu. Installed to trunk. + +Thanks, +Dave +-- +J. David Anglin dave.anglin@nrc-cnrc.gc.ca +National Research Council of Canada (613) 990-0752 (FAX: 952-6602) + +2004-07-08 Randolph Chung + + * gcc/config/pa/pa32-linux.h (MD_FALLBACK_FRAME_STATE_FOR): Define. + + * libjava/configure.in (SIGNAL_HANDLER): Use pa-signal.h for hppa. + * libjava/configure: Regenerate. + * libjava/configure.host: Set can_unwind_signal for hppa*-linux. + * libjava/pa-signal.h: New file. + +Index: gcc/config/pa/pa32-linux.h +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/pa/pa32-linux.h,v +retrieving revision 1.12 +diff -u -3 -p -r1.12 pa32-linux.h +--- gcc/config/pa/pa32-linux.h 23 Aug 2003 01:32:59 -0000 1.12 ++++ gcc/config/pa/pa32-linux.h 9 Jul 2004 03:12:51 -0000 +@@ -35,3 +35,97 @@ Boston, MA 02111-1307, USA. */ + __attribute__ ((__unused__, section(".ctors"), \ + aligned(sizeof(func_ptr)))) \ + = { (func_ptr) (-1) } ++ ++/* Do code reading to identify a signal frame, and set the frame ++ state data appropriately. See unwind-dw2.c for the structs. */ ++ ++#ifdef IN_LIBGCC2 ++#include ++#include ++ ++/* Unfortunately, because of various bugs and changes to the kernel, ++ we have several cases to deal with. ++ ++ In 2.4, the signal trampoline is 4 words, and (CONTEXT)->ra should ++ point directly at the beginning of the trampoline and struct rt_sigframe. ++ ++ In <= 2.6.5-rc2-pa3, the signal trampoline is 9 words, and ++ (CONTEXT)->ra points at the 4th word in the trampoline structure. This ++ is wrong, it should point at the 5th word. This is fixed in 2.6.5-rc2-pa4. ++ ++ To detect these cases, we first take (CONTEXT)->ra, align it to 64-bytes ++ to get the beginning of the signal frame, and then check offsets 0, 4 ++ and 5 to see if we found the beginning of the trampoline. This will ++ tell us how to locate the sigcontext structure. ++ ++ Note that with a 2.4 64-bit kernel, the signal context is not properly ++ passed back to userspace so the unwind will not work correctly. */ ++#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ ++ do { \ ++ unsigned long sp = (unsigned long)(CONTEXT)->ra & ~63; \ ++ unsigned int *pc = (unsigned int *)sp; \ ++ unsigned long off; \ ++ _Unwind_Ptr new_cfa; \ ++ int i; \ ++ struct sigcontext *sc; \ ++ struct rt_sigframe { \ ++ struct siginfo info; \ ++ struct ucontext uc; \ ++ } *frame; \ ++ \ ++ /* rt_sigreturn trampoline: \ ++ 3419000x ldi 0, %r25 or ldi 1, %r25 (x = 0 or 2) \ ++ 3414015a ldi __NR_rt_sigreturn, %r20 \ ++ e4008200 be,l 0x100(%sr2, %r0), %sr0, %r31 \ ++ 08000240 nop */ \ ++ \ ++ if (pc[0] == 0x34190000 || pc[0] == 0x34190002) \ ++ off = 4*4; \ ++ else if (pc[4] == 0x34190000 || pc[4] == 0x34190002) \ ++ { \ ++ pc += 4; \ ++ off = 10 * 4; \ ++ } \ ++ else if (pc[5] == 0x34190000 || pc[5] == 0x34190002) \ ++ { \ ++ pc += 5; \ ++ off = 10 * 4; \ ++ } \ ++ else \ ++ break; \ ++ if (pc[1] != 0x3414015a \ ++ || pc[2] != 0xe4008200 \ ++ || pc[3] != 0x08000240) \ ++ break; \ ++ \ ++ frame = (struct rt_sigframe *)(sp + off); \ ++ sc = &frame->uc.uc_mcontext; \ ++ \ ++ new_cfa = sc->sc_gr[30]; \ ++ (FS)->cfa_how = CFA_REG_OFFSET; \ ++ (FS)->cfa_reg = 30; \ ++ (FS)->cfa_offset = new_cfa - (long) (CONTEXT)->cfa; \ ++ for (i = 1; i <= 31; i++) \ ++ { \ ++ (FS)->regs.reg[i].how = REG_SAVED_OFFSET; \ ++ (FS)->regs.reg[i].loc.offset = (long)&sc->sc_gr[i] - new_cfa; \ ++ } \ ++ for (i = 4; i <= 31; i++) \ ++ { \ ++ /* FP regs have left and right halves */ \ ++ (FS)->regs.reg[2*i+24].how = REG_SAVED_OFFSET; \ ++ (FS)->regs.reg[2*i+24].loc.offset \ ++ = (long)&sc->sc_fr[i] - new_cfa; \ ++ (FS)->regs.reg[2*i+24+1].how = REG_SAVED_OFFSET; \ ++ (FS)->regs.reg[2*i+24+1].loc.offset \ ++ = (long)&sc->sc_fr[i] + 4 - new_cfa; \ ++ } \ ++ (FS)->regs.reg[88].how = REG_SAVED_OFFSET; \ ++ (FS)->regs.reg[88].loc.offset = (long) &sc->sc_sar - new_cfa; \ ++ (FS)->regs.reg[2].how = REG_SAVED_OFFSET; \ ++ (FS)->regs.reg[2].loc.offset = (long) &sc->sc_iaoq[0] - new_cfa; \ ++ (FS)->retaddr_column = 2; \ ++ goto SUCCESS; \ ++ } while (0) ++ ++#endif /* IN_LIBGCC2 */ +Index: libjava/configure.host +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/configure.host,v +retrieving revision 1.59 +diff -u -3 -p -r1.59 configure.host +--- libjava/configure.host 7 Jul 2004 18:23:59 -0000 1.59 ++++ libjava/configure.host 9 Jul 2004 03:12:51 -0000 +@@ -169,6 +169,7 @@ case "${host}" in + sparc*-linux* | \ + ia64-* | \ + x86_64*-linux* | \ ++ hppa*-linux* | \ + sh-linux* | sh[34]*-linux*) + can_unwind_signal=yes + if test x$slow_pthread_self = xyes \ +Index: libjava/configure.in +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/configure.in,v +retrieving revision 1.186 +diff -u -3 -p -r1.186 configure.in +--- libjava/configure.in 1 Jul 2004 04:09:07 -0000 1.186 ++++ libjava/configure.in 9 Jul 2004 03:12:51 -0000 +@@ -1177,6 +1177,9 @@ case "${host}" in + # SYSDEP_SOURCES=sysdep/ia64.c + # test -d sysdep || mkdir sysdep + # ;; ++ hppa*-*-linux*) ++ SIGNAL_HANDLER=include/pa-signal.h ++ ;; + ia64-*-linux*) + SIGNAL_HANDLER=include/dwarf2-signal.h + ;; +--- libjava/include/pa-signal.h 2004-05-04 13:30:25.000000000 -0700 ++++ libjava/include/pa-signal.h 2004-05-04 13:30:25.000000000 -0700 +@@ -0,0 +1,61 @@ ++// pa-signal.h - Catch runtime signals and turn them into exceptions. ++ ++/* Copyright (C) 1998, 1999, 2000 Free Software Foundation ++ ++ This file is part of libgcj. ++ ++This software is copyrighted work licensed under the terms of the ++Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ++details. */ ++ ++#ifndef JAVA_SIGNAL_H ++#define JAVA_SIGNAL_H 1 ++ ++#include ++#include ++#include ++ ++#define HANDLE_SEGV 1 ++#define HANDLE_FPE 1 ++ ++#define SIGNAL_HANDLER(_name) \ ++static void _Jv_##_name (int _dummy, siginfo_t *_info, void *arg) ++ ++#define MAKE_THROW_FRAME(_exception) \ ++do \ ++{ \ ++ struct ucontext *uc = (struct ucontext *)arg; \ ++ struct sigcontext *sc = &uc->uc_mcontext; \ ++ (void)_dummy; \ ++ (void)_info; \ ++ /* Advance the program counter so that it is after the start \ ++ of the instruction: the exception handler expects \ ++ the PC to point to the instruction after a call. */ \ ++ sc->sc_iaoq[0] = sc->sc_iaoq[1]; \ ++ sc->sc_iaoq[1] += 4; \ ++} \ ++while (0) ++ ++#define INIT_SEGV \ ++do \ ++ { \ ++ struct sigaction act; \ ++ act.sa_sigaction = _Jv_catch_segv; \ ++ sigemptyset (&act.sa_mask); \ ++ act.sa_flags = SA_SIGINFO; \ ++ syscall (SYS_rt_sigaction, SIGSEGV, &act, NULL, _NSIG / 8); \ ++ } \ ++while (0) ++ ++#define INIT_FPE \ ++do \ ++ { \ ++ struct sigaction act; \ ++ act.sa_sigaction = _Jv_catch_fpe; \ ++ sigemptyset (&act.sa_mask); \ ++ act.sa_flags = SA_SIGINFO; \ ++ syscall (SYS_rt_sigaction, SIGFPE, &act, NULL, _NSIG / 8); \ ++ } \ ++while (0) ++ ++#endif /* JAVA_SIGNAL_H */ --- gcc-3.4-3.4.2.orig/debian/patches/powerpc-biarch.dpatch +++ gcc-3.4-3.4.2/debian/patches/powerpc-biarch.dpatch @@ -0,0 +1,76 @@ +#! /bin/sh -e + +# DP: enable biarch for 32 bit compiler + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config.gcc~ 2004-04-03 08:54:33.000000000 +0200 ++++ gcc/config.gcc 2004-04-03 09:24:44.000000000 +0200 +@@ -1760,8 +1760,8 @@ + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; + powerpc-*-linux*) +- tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" +- tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" ++ tm_file="rs6000/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux64.h" ++ tmake_file="t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; + powerpc-*-gnu-gnualtivec*) + tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h" +--- gcc/config/rs6000/t-linux64~ 2004-03-17 22:18:42.000000000 +0100 ++++ gcc/config/rs6000/t-linux64 2004-04-03 09:26:04.000000000 +0200 +@@ -8,30 +8,10 @@ + + SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc64.ver + +-MULTILIB_OPTIONS = m64/m32 msoft-float +-MULTILIB_DIRNAMES = 64 32 nof ++MULTILIB_OPTIONS = m64/m32 ++MULTILIB_DIRNAMES = 64 32 + MULTILIB_EXTRA_OPTS = fPIC mstrict-align +-MULTILIB_EXCEPTIONS = m64/msoft-float +-MULTILIB_EXCLUSIONS = m64/!m32/msoft-float +-MULTILIB_OSDIRNAMES = ../lib64 ../lib nof +-MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) +- +-# We want fine grained libraries, so use the new code to build the +-# floating point emulation libraries. +-# fp-bit is only to be used by 32-bit multilibs +-FPBIT = fp-bit32.c +-DPBIT = dp-bit32.c +- +-dp-bit32.c: $(srcdir)/config/fp-bit.c +- ( echo '#ifndef __powerpc64__'; \ +- cat $(srcdir)/config/fp-bit.c; \ +- echo '#endif' ) > dp-bit32.c +- +-fp-bit32.c: $(srcdir)/config/fp-bit.c +- ( echo '#ifndef __powerpc64__'; \ +- echo '#define FLOAT'; \ +- cat $(srcdir)/config/fp-bit.c; \ +- echo '#endif' ) > fp-bit32.c ++MULTILIB_OSDIRNAMES = ../lib64 ../lib + + # Hack to use -mlong-double-128 just for compiling 64 bit libgcc + mklibgcc: bispecs --- gcc-3.4-3.4.2.orig/debian/patches/gpc-no-gpidump.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-no-gpidump.dpatch @@ -0,0 +1,42 @@ +#! /bin/sh -e + +# DP: Do not build gpidump due to PR optimization/9279. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/p/utils/Makefile~ 2003-02-26 23:28:45.000000000 +0100 ++++ gcc/p/utils/Makefile 2003-02-26 23:29:38.000000000 +0100 +@@ -41,9 +41,9 @@ + + # Internal variables + PFLAGS1=--executable-path=. --unit-path=$(GCC_DIR)/p/rts --unit-path=$(GCC_DIR)/p/units +-EXE=binobj$(exeext) gpidump$(exeext) +-EXE2=binobj gpidump +-DOC=binobj.1 gpidump.1 ++EXE=binobj$(exeext) #gpidump$(exeext) ++EXE2=binobj #gpidump ++DOC=binobj.1 #gpidump.1 + PC_WITH_FLAGS=$(PC) --automake --executable-file-name $(UTILS_WARN) $(CFLAGS) $(PFLAGS) $(PFLAGS1) `cat needed-options` + + all: $(EXE) $(DOC) --- gcc-3.4-3.4.2.orig/debian/patches/cvs-updates.dpatch +++ gcc-3.4-3.4.2/debian/patches/cvs-updates.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: CVS updates from the 3.4 branch upto XXXXXXXXX + +last_updated() +{ + cat > ${dir}LAST_UPDATED <&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + last_updated + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +cvs -z9 -q diff -uN -r gcc_3_4_2_release -r gcc-3_4-branch + --- gcc-3.4-3.4.2.orig/debian/patches/libffi-mips.dpatch +++ gcc-3.4-3.4.2/debian/patches/libffi-mips.dpatch @@ -0,0 +1,94 @@ +#! /bin/sh -e + +# DP: libffi mips update + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/libffi/src/mips/ffi.c.old 2004-05-12 21:41:01.000000000 +0200 ++++ src/libffi/src/mips/ffi.c 2004-05-12 21:42:52.000000000 +0200 +@@ -27,6 +27,7 @@ + #include + + #include ++#include + + #if _MIPS_SIM == _ABIN32 + #define FIX_ARGP \ +@@ -91,7 +92,7 @@ static void ffi_prep_args(char *stack, + FIX_ARGP; + } + +-#if _MIPS_SIM == _ABIO32 ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + #define OFFSET 0 + #else + #define OFFSET sizeof(int) +@@ -145,7 +146,7 @@ static void ffi_prep_args(char *stack, + } + else + { +-#if _MIPS_SIM == _ABIO32 ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + memcpy(argp, *p_argv, z); + #else + { +@@ -266,7 +267,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif + { + cif->flags = 0; + +-#if _MIPS_SIM == _ABIO32 ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + /* Set the flags necessary for O32 processing */ + + if (cif->rtype->type != FFI_TYPE_STRUCT) +@@ -440,7 +441,7 @@ void ffi_call(ffi_cif *cif, void (*fn)() + + switch (cif->abi) + { +-#if _MIPS_SIM == _ABIO32 ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + case FFI_O32: + ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); +--- src/libffi/src/mips/ffitarget.h.old 2004-05-12 21:39:33.000000000 +0200 ++++ src/libffi/src/mips/ffitarget.h 2004-05-12 21:40:33.000000000 +0200 +@@ -26,9 +26,7 @@ + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + +-#ifndef LIBFFI_ASM + #include +-#endif + + #if !defined(_MIPS_SIM) + -- something is very wrong -- +@@ -36,7 +34,7 @@ + # if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) + # define FFI_MIPS_N32 + # else +-# if _MIPS_SIM==_ABIO32 && defined(_ABIO32) ++# if _MIPS_SIM==_MIPS_SIM_ABI32 + # define FFI_MIPS_O32 + # else + -- this is an unsupported platform -- --- gcc-3.4-3.4.2.orig/debian/patches/gpc-profiled.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-profiled.dpatch @@ -0,0 +1,53 @@ +#! /bin/sh -e + +# DP: Do not build the gpc runtime using -fprofile-generate/-use. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +--- gcc/p/rts/Makefile.in~ 2004-05-16 17:27:49.000000000 +0200 ++++ gcc/p/rts/Makefile.in 2004-05-16 18:24:47.000000000 +0200 +@@ -33,6 +33,7 @@ + CC=@CC@ + PC=`echo $(CC) | $(GCC2GPC)` + CFLAGS=-O2 ++override CFLAGS := $(shell echo $(CFLAGS) | sed 's/-fprofile[a-z-]*//') + PFLAGS= + AR=@AR@ + AR_FLAGS=rc + +--- gcc/p/Make-lang.in~ 2004-05-16 17:27:49.000000000 +0200 ++++ gcc/p/Make-lang.in 2004-05-16 18:43:14.000000000 +0200 +@@ -1180,6 +1180,10 @@ + $(srcdir)/p/script/mkdir-p stage4/p/rts + -mv $(GPCSTAGESTUFF) stage4/p + -mv $(RTSSTAGESTUFF) stage4/p/rts ++pascal.stageprofile: stageprofile-start ++ -mv p/*$(objext) stageprofile/p ++pascal.stagefeedback: stageprofile-start ++ -mv p/*$(objext) stagefeedback/p + + # Maintenance hooks: + --- gcc-3.4-3.4.2.orig/debian/patches/fastjar-update.dpatch +++ gcc-3.4-3.4.2/debian/patches/fastjar-update.dpatch @@ -0,0 +1,1181 @@ +#! /bin/sh -e + +# DP: Implement fastjar -u (PR 7854). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN fastjar.old/Makefile.am fastjar/Makefile.am +--- fastjar.old/Makefile.am 2004-04-15 01:49:37.000000000 +0200 ++++ fastjar/Makefile.am 2004-05-30 17:30:34.000000000 +0200 +@@ -46,10 +46,11 @@ + LIBIBERTY = ../libiberty/libiberty.a + + bin_PROGRAMS = jar grepjar +-jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h \ +-zipfile.h dostime.h compress.h pushback.h ++jar_SOURCES = jartool.c dostime.c compress.c pushback.c shift.c jartool.h \ ++zipfile.h dostime.h compress.h pushback.h shift.h + jar_LDADD = $(ZLIBS) $(LIBIBERTY) + jar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) ++jar_CPPFLAGS = $(AM_CPPFLAGS) -DWITH_SHIFT_DOWN + + grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h \ + zipfile.h dostime.h compress.h pushback.h +diff -urN fastjar.old/Makefile.in fastjar/Makefile.in +--- fastjar.old/Makefile.in 2004-04-19 04:23:04.000000000 +0200 ++++ fastjar/Makefile.in 2004-05-30 17:33:00.000000000 +0200 +@@ -165,11 +165,12 @@ + LIBIBERTY = ../libiberty/libiberty.a + + bin_PROGRAMS = jar grepjar +-jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h \ +-zipfile.h dostime.h compress.h pushback.h ++jar_SOURCES = jartool.c dostime.c compress.c pushback.c shift.c jartool.h \ ++zipfile.h dostime.h compress.h pushback.h shift.h + + jar_LDADD = $(ZLIBS) $(LIBIBERTY) + jar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) ++jar_CPPFLAGS = -DWITH_SHIFT_DOWN + + grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h \ + zipfile.h dostime.h compress.h pushback.h +@@ -217,8 +218,9 @@ + compress.$(OBJEXT) pushback.$(OBJEXT) + grepjar_OBJECTS = $(am_grepjar_OBJECTS) + grepjar_LDFLAGS = +-am_jar_OBJECTS = jartool.$(OBJEXT) dostime.$(OBJEXT) compress.$(OBJEXT) \ +- pushback.$(OBJEXT) ++am_jar_OBJECTS = jar-jartool.$(OBJEXT) jar-dostime.$(OBJEXT) \ ++ jar-compress.$(OBJEXT) jar-pushback.$(OBJEXT) \ ++ jar-shift.$(OBJEXT) + jar_OBJECTS = $(am_jar_OBJECTS) + jar_LDFLAGS = + +@@ -329,6 +331,36 @@ + .c.obj: + $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` + ++jar-jartool.o: jartool.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-jartool.o `test -f 'jartool.c' || echo '$(srcdir)/'`jartool.c ++ ++jar-jartool.obj: jartool.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-jartool.obj `if test -f 'jartool.c'; then $(CYGPATH_W) 'jartool.c'; else $(CYGPATH_W) '$(srcdir)/jartool.c'; fi` ++ ++jar-dostime.o: dostime.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-dostime.o `test -f 'dostime.c' || echo '$(srcdir)/'`dostime.c ++ ++jar-dostime.obj: dostime.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-dostime.obj `if test -f 'dostime.c'; then $(CYGPATH_W) 'dostime.c'; else $(CYGPATH_W) '$(srcdir)/dostime.c'; fi` ++ ++jar-compress.o: compress.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-compress.o `test -f 'compress.c' || echo '$(srcdir)/'`compress.c ++ ++jar-compress.obj: compress.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-compress.obj `if test -f 'compress.c'; then $(CYGPATH_W) 'compress.c'; else $(CYGPATH_W) '$(srcdir)/compress.c'; fi` ++ ++jar-pushback.o: pushback.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-pushback.o `test -f 'pushback.c' || echo '$(srcdir)/'`pushback.c ++ ++jar-pushback.obj: pushback.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-pushback.obj `if test -f 'pushback.c'; then $(CYGPATH_W) 'pushback.c'; else $(CYGPATH_W) '$(srcdir)/pushback.c'; fi` ++ ++jar-shift.o: shift.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-shift.o `test -f 'shift.c' || echo '$(srcdir)/'`shift.c ++ ++jar-shift.obj: shift.c ++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(jar_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jar-shift.obj `if test -f 'shift.c'; then $(CYGPATH_W) 'shift.c'; else $(CYGPATH_W) '$(srcdir)/shift.c'; fi` ++ + .texi.info: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9] + $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ +diff -urN fastjar.old/compress.c fastjar/compress.c +--- fastjar.old/compress.c 2002-01-03 05:57:56.000000000 +0100 ++++ fastjar/compress.c 2004-05-30 17:30:34.000000000 +0200 +@@ -74,6 +74,7 @@ + /* + compress.c - code for handling deflation + Copyright (C) 1999 Bryan Burns ++ Copyright (C) 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +@@ -109,8 +110,12 @@ + #include "jartool.h" + #include "pushback.h" + #include "compress.h" ++#include "shift.h" ++ ++int write_data (int, void *, size_t, struct zipentry *); + + extern int seekable; ++extern off_t end_of_entries; + + static z_stream zs; + +@@ -133,7 +138,36 @@ + } + } + +-int compress_file(int in_fd, int out_fd, struct zipentry *ze){ ++int ++write_data (int fd, void *buf, size_t len, struct zipentry *ze) ++{ ++#ifdef WITH_SHIFT_DOWN ++ struct zipentry *next = NULL; ++ off_t here = lseek (fd, 0, SEEK_CUR); ++ /* ++ * If we are updating and there is not enough space before the next ++ * entry, expand the file. ++ */ ++ if (ze) ++ { ++ next = ze->next_entry; ++ if (next && here + len >= next->offset) ++ { ++ if (shift_down (fd, next->offset, (here + len) - next->offset, next)) ++ { ++ perror ("can't expand file"); ++ exit (1); ++ } ++ } ++ } ++#endif /* WITH_SHIFT_DOWN */ ++ ++ return write (fd, buf, len); ++} ++ ++int compress_file(int in_fd, int out_fd, struct zipentry *ze, ++ struct zipentry *existing) ++{ + Bytef in_buff[RDSZ]; + Bytef out_buff[RDSZ]; + unsigned int rdamt, wramt; +@@ -183,10 +217,11 @@ + /* If the output buffer is full, dump it to disk */ + if(zs.avail_out == 0){ + +- if(write(out_fd, out_buff, RDSZ) != RDSZ){ +- perror("write"); +- exit(1); +- } ++ if (write_data (out_fd, out_buff, RDSZ, existing) != RDSZ) ++ { ++ perror("write"); ++ exit(1); ++ } + + /* clear the output buffer */ + zs.next_out = out_buff; +@@ -201,10 +236,11 @@ + + wramt = RDSZ - zs.avail_out; + +- if(write(out_fd, out_buff, wramt) != (int)wramt){ +- perror("write"); +- exit(1); +- } ++ if (write_data (out_fd, out_buff, wramt, existing) != (int)wramt) ++ { ++ perror("write"); ++ exit(1); ++ } + /* clear the output buffer */ + zs.next_out = out_buff; + zs.avail_out = (uInt)RDSZ; +@@ -215,10 +251,11 @@ + while(deflate(&zs, Z_FINISH) == Z_OK){ + wramt = RDSZ - zs.avail_out; + +- if(write(out_fd, out_buff, wramt) != (int)wramt){ +- perror("write"); +- exit(1); +- } ++ if (write_data (out_fd, out_buff, wramt, existing) != (int)wramt) ++ { ++ perror("write"); ++ exit(1); ++ } + + zs.next_out = out_buff; + zs.avail_out = (uInt)RDSZ; +@@ -228,10 +265,11 @@ + if(zs.avail_out != RDSZ){ + wramt = RDSZ - zs.avail_out; + +- if(write(out_fd, out_buff, wramt) != (int)wramt){ +- perror("write"); +- exit(1); +- } ++ if (write_data (out_fd, out_buff, wramt, existing) != (int)wramt) ++ { ++ perror("write"); ++ exit(1); ++ } + } + + /* update fastjar's entry information */ +diff -urN fastjar.old/compress.h fastjar/compress.h +--- fastjar.old/compress.h 2000-12-14 19:45:35.000000000 +0100 ++++ fastjar/compress.h 2004-05-30 17:30:34.000000000 +0200 +@@ -46,7 +46,7 @@ + void init_compression(void); + + /* Compresses the file specified by in_fd and appends it to out_fd */ +-int compress_file(int in_fd, int out_fd, struct zipentry *ze); ++int compress_file(int, int, struct zipentry *, struct zipentry *); + + /* Frees memory used by compression function */ + void end_compression(void); +diff -urN fastjar.old/fastjar.texi fastjar/fastjar.texi +--- fastjar.old/fastjar.texi 2003-08-13 23:04:12.000000000 +0200 ++++ fastjar/fastjar.texi 2004-05-30 17:32:33.000000000 +0200 +@@ -125,8 +125,7 @@ + Extract named (or all) files from archive. + + @item -u +-Update existing archive. This option is disabled due to bugs (currently +-fails with exit status 1 and does nothing). ++Update existing archive. + + @end table + +diff -urN fastjar.old/jartool.c fastjar/jartool.c +--- fastjar.old/jartool.c 2004-01-07 19:46:04.000000000 +0100 ++++ fastjar/jartool.c 2004-05-30 17:30:34.000000000 +0200 +@@ -1,6 +1,6 @@ + /* + jartool.c - main functions for fastjar utility +- Copyright (C) 2002 Free Software Foundation ++ Copyright (C) 2002, 2004 Free Software Foundation + Copyright (C) 1999, 2000, 2001 Bryan Burns + + This program is free software; you can redistribute it and/or +@@ -238,6 +238,7 @@ + #include "dostime.h" + #include "pushback.h" + #include "compress.h" ++#include "shift.h" + + /* Some systems have mkdir that takes a single argument. */ + #ifdef MKDIR_TAKES_ONE_ARG +@@ -273,15 +274,18 @@ + int consume(pb_file *, int); + int list_jar(int, char**, int); + int extract_jar(int, char**, int); +-int add_file_to_jar(int, int, const char*, struct stat*); +-int add_to_jar(int, const char*); +-int add_to_jar_with_dir(int, const char*, const char*); ++int add_file_to_jar(int, int, const char*, struct stat*, int); ++int add_to_jar(int, const char*, int); ++int add_to_jar_with_dir(int, const char*, const char*, int); + int create_central_header(int); +-int make_manifest(int, const char*); ++int make_manifest(int, const char*, int); ++int read_entries (int); + static void init_args(char **, int); + static char *get_next_arg (void); + static char *jt_strdup (char*); + static void expand_options (int *argcp, char ***argvp); ++static inline struct zipentry *find_entry (const char *); ++static inline int looks_like_dir (const char *); + + /* global variables */ + ub1 file_header[30]; +@@ -305,6 +309,12 @@ + + int number_of_entries; /* number of entries in the linked list */ + ++/* What we go by. */ ++const char *progname; ++ ++/* The offset of the end of the last zip entry. */ ++ub4 end_of_entries; ++ + /* This is used to mark options with no short value. */ + #define LONG_OPT(Num) ((Num) + 128) + +@@ -340,6 +350,8 @@ + int new_argc; + char **new_argv; + ++ progname = argv[0]; ++ + do_compress = TRUE; + verbose = FALSE; + +@@ -418,15 +430,11 @@ + new_argv[new_argc] = NULL; + + if(action == ACTION_NONE){ +- fprintf(stderr, "One of options -{ctxu} must be specified.\n"); ++ fprintf(stderr, "%s: one of options -{ctxu} must be specified.\n", ++ progname); + usage(argv[0]); + } + +- if(action == ACTION_UPDATE){ +- fprintf(stderr, "%s: `-u' mode unimplemented.\n", argv[0]); +- exit(1); +- } +- + /* Verify unsupported combinations and warn of the use of non + standard features */ + if(verbose && use_explicit_list_only) +@@ -435,7 +443,8 @@ + fprintf (stderr, "Warning: using non standard '-@' option\n"); + if(read_names_from_stdin + && (action != ACTION_CREATE && action != ACTION_UPDATE)){ +- fprintf(stderr, "Option '-@' is supported only with '-c' or '-u'.\n"); ++ fprintf(stderr, "%s: option '-@' is supported only with '-c' or '-u'.\n", ++ progname); + usage(argv[0]); + } + +@@ -445,8 +454,8 @@ + jarfd = open(jarfile, O_CREAT | O_BINARY | O_WRONLY | O_TRUNC, 0666); + + if(jarfd < 0){ +- fprintf(stderr, "Error opening %s for writing!\n", jarfile); +- perror(jarfile); ++ fprintf(stderr, "%s: error opening %s for writing: %s\n", progname, ++ jarfile, strerror (errno)); + exit(1); + } + +@@ -470,8 +479,8 @@ + jarfd = open(jarfile, O_RDONLY | O_BINARY); + + if(jarfd < 0){ +- fprintf(stderr, "Error opening %s for reading!\n", jarfile); +- perror(jarfile); ++ fprintf(stderr, "%s: error opening %s for reading: %s\n", progname, ++ jarfile, strerror (errno)); + exit(1); + } + +@@ -484,28 +493,51 @@ + } + } + ++ if (action == ACTION_UPDATE) ++ { ++ if (!jarfile) ++ { ++ fprintf (stderr, "%s: `-u' mode requires a file name\n", ++ argv[0]); ++ exit (1); ++ } ++ ++ if ((jarfd = open (jarfile, O_RDWR | O_BINARY)) < 0) ++ { ++ fprintf (stderr, "Error opening %s for reading!\n", jarfile); ++ perror (jarfile); ++ exit (1); ++ } ++ ++ /* Assert that jarfd is seekable. */ ++ if (lseek (jarfd, 0, SEEK_CUR) == -1) ++ { ++ fprintf (stderr, "%s: %s is not seekable\n", argv[0], jarfile); ++ exit (1); ++ } ++ ++ seekable = TRUE; ++ } ++ + if(action == ACTION_CREATE || action == ACTION_UPDATE){ + const char *arg; + init_headers(); + +- if((action == ACTION_UPDATE) && jarfile) { +- if((jarfd = open(jarfile, O_RDWR | O_BINARY)) < 0) { +- fprintf(stderr, "Error opening %s for reading!\n", jarfile); +- perror(jarfile); +- exit(1); +- } +- } +- + if(do_compress) + init_compression(); +- ++ ++ if (action == ACTION_UPDATE) ++ { ++ if (read_entries (jarfd)) ++ exit (1); ++ } + + /* Add the META-INF/ directory and the manifest */ + if(manifest && mfile) +- make_manifest(jarfd, mfile); +- else if(manifest) +- make_manifest(jarfd, NULL); +- ++ make_manifest(jarfd, mfile, action == ACTION_UPDATE); ++ else if(manifest && action == ACTION_CREATE) ++ make_manifest(jarfd, NULL, FALSE); ++ + init_args (new_argv, 0); + /* now we add the files to the archive */ + while ((arg = get_next_arg ())){ +@@ -514,17 +546,19 @@ + const char *dir_to_change = get_next_arg (); + const char *file_to_add = get_next_arg (); + if (!dir_to_change || !file_to_add) { +- fprintf(stderr, "Error: missing argument for -C.\n"); +- exit(1); +- } +- if (add_to_jar_with_dir(jarfd, dir_to_change, file_to_add)) { +- fprintf(stderr, +- "Error adding %s (in directory %s) to jar archive!\n", +- file_to_add, dir_to_change); ++ fprintf(stderr, "%s: error: missing argument for -C.\n", progname); + exit(1); + } ++ if (add_to_jar_with_dir(jarfd, dir_to_change, file_to_add, ++ action == ACTION_UPDATE)) ++ { ++ fprintf(stderr, ++ "Error adding %s (in directory %s) to jar archive!\n", ++ file_to_add, dir_to_change); ++ exit(1); ++ } + } else { +- if(add_to_jar(jarfd, arg)){ ++ if(add_to_jar(jarfd, arg, action == ACTION_UPDATE)){ + fprintf(stderr, "Error adding %s to jar archive!\n", arg); + exit(1); + } +@@ -533,11 +567,20 @@ + /* de-initialize the compression DS */ + if(do_compress) + end_compression(); ++ ++ if (action == ACTION_UPDATE) ++ lseek (jarfd, end_of_entries, SEEK_SET); + + create_central_header(jarfd); +- +- if (close(jarfd) != 0) { +- fprintf(stderr, "Error closing jar archive!\n"); ++ ++ /* Check if the file shrunk when we updated it. */ ++ if (action == ACTION_UPDATE) ++ ftruncate (jarfd, lseek (jarfd, 0, SEEK_CUR)); ++ ++ if (jarfd != STDIN_FILENO && close(jarfd) != 0) { ++ fprintf(stderr, "%s: error closing jar archive: %s\n", ++ progname, strerror (errno)); ++ exit (1); + } + } else if(action == ACTION_LIST){ + list_jar(jarfd, &new_argv[0], new_argc); +@@ -688,7 +731,175 @@ + number_of_entries++; + } + +-int make_manifest(int jfd, const char *mf_name){ ++static inline struct zipentry * ++find_entry (const char *fname) ++{ ++ struct zipentry *ze; ++ ++ for (ze = ziptail; ze; ze = ze->next_entry) ++ { ++ if (!strcmp (ze->filename, fname)) ++ return ze; ++ } ++ return NULL; ++} ++ ++ ++static inline int ++looks_like_dir (const char *fname) ++{ ++ struct zipentry *ze; ++ size_t len = strlen (fname); ++ ++ for (ze = ziptail; ze; ze = ze->next_entry) ++ { ++ if (strlen (ze->filename) > len ++ && !strncmp (fname, ze->filename, len) ++ && ze->filename[len] == '/') ++ return 1; ++ } ++ return 0; ++} ++ ++ ++/* ++ * Read the zip entries of an existing file, building `ziplist' as we go. ++ */ ++int read_entries (int fd) ++{ ++ struct zipentry *ze; ++ ub1 intbuf[4]; ++ ub1 header[46]; ++ ub2 len; ++ ub2 count, i; ++ off_t offset; ++ ++ if (lseek (fd, -22, SEEK_END) == -1) ++ { ++ fprintf (stderr, "%s: %s: can't seek file\n", progname, jarfile); ++ return 1; ++ } ++ ++ if (read (fd, intbuf, 4) < 4) ++ { ++ perror (progname); ++ return 1; ++ } ++ /* Is there a zipfile comment? */ ++ while (UNPACK_UB4(intbuf, 0) != 0x06054b50) ++ { ++ if (lseek (fd, -5, SEEK_CUR) == -1 || ++ read (fd, intbuf, 4) != 4) ++ { ++ fprintf (stderr, "%s: can't find end of central directory: %s\n", ++ progname, strerror (errno)); ++ return 1; ++ } ++ } ++ ++ /* Skip disk numbers. */ ++ if (lseek (fd, 6, SEEK_CUR) == -1) ++ { ++ perror (progname); ++ return 1; ++ } ++ ++ /* Number of entries in the central directory. */ ++ if (read (fd, intbuf, 2) != 2) ++ { ++ perror (progname); ++ return 1; ++ } ++ count = UNPACK_UB2(intbuf, 0); ++ ++ if (lseek (fd, 4, SEEK_CUR) == -1) ++ { ++ perror (progname); ++ return 1; ++ } ++ ++ /* Offset where the central directory begins. */ ++ if (read (fd, intbuf, 4) != 4) ++ { ++ perror (progname); ++ return 1; ++ } ++ offset = UNPACK_UB4(intbuf, 0); ++ end_of_entries = offset; ++ ++ if (lseek (fd, offset, SEEK_SET) != offset) ++ { ++ perror (progname); ++ return 1; ++ } ++ ++ if (read (fd, header, 46) != 46) ++ { ++ fprintf (stderr, "%s: %s: unexpected end of file\n", ++ progname, jarfile); ++ return 1; ++ } ++ ++ for (i = 0; i < count; i++) ++ { ++ if (UNPACK_UB4(header, 0) != 0x02014b50) ++ { ++ fprintf (stderr, "%s: can't find central directory header\n", ++ progname); ++ return 1; ++ } ++ ze = (struct zipentry *) malloc (sizeof (struct zipentry)); ++ if (!ze) ++ { ++ perror (progname); ++ return 1; ++ } ++ memset (ze, 0, sizeof (struct zipentry)); ++ ze->flags = UNPACK_UB2(header, CEN_FLAGS); ++ ze->mod_time = UNPACK_UB2(header, CEN_MODTIME); ++ ze->mod_date = UNPACK_UB2(header, CEN_MODDATE); ++ ze->crc = UNPACK_UB4(header, CEN_CRC); ++ ze->usize = UNPACK_UB4(header, CEN_USIZE); ++ ze->csize = UNPACK_UB4(header, CEN_CSIZE); ++ ze->offset = UNPACK_UB4(header, CEN_OFFSET); ++ ze->compressed = (header[CEN_COMP] || header[CEN_COMP+1]); ++ len = UNPACK_UB2(header, CEN_FNLEN); ++ ze->filename = (char *) malloc ((len+1) * sizeof (char)); ++ if (!ze->filename) ++ { ++ perror (progname); ++ return 1; ++ } ++ if (read (fd, ze->filename, len) != len) ++ { ++ fprintf (stderr, "%s: %s: unexpected end of file\n", ++ progname, jarfile); ++ return 1; ++ } ++ len = UNPACK_UB4(header, CEN_EFLEN); ++ len += UNPACK_UB4(header, CEN_COMLEN); ++ if (lseek (fd, len, SEEK_CUR) == -1) ++ { ++ perror (progname); ++ return 1; ++ } ++ add_entry (ze); ++ if (i < count - 1) ++ { ++ if (read (fd, header, 46) != 46) ++ { ++ fprintf (stderr, "%s: %s: unexpected end of file\n", ++ progname, jarfile); ++ return 1; ++ } ++ } ++ } ++ ++ lseek (fd, 0, SEEK_SET); ++ return 0; ++} ++ ++int make_manifest(int jfd, const char *mf_name, int updating){ + time_t current_time; + int nlen; /* length of file name */ + int mod_time; /* file modification time */ +@@ -812,7 +1023,7 @@ + exit(1); + } + +- if(add_file_to_jar(jfd, mfd, "META-INF/MANIFEST.MF", &statbuf)){ ++ if(add_file_to_jar(jfd, mfd, "META-INF/MANIFEST.MF", &statbuf, updating)){ + perror("error writing to jar"); + exit(1); + } +@@ -823,9 +1034,16 @@ + } + + /* Implements -C by wrapping add_to_jar. new_dir is the directory +- to switch to. */ ++ to switch to. ++ ++ `updating', if nonzero, will indicate that we are updating an ++ existing file, and will need to take special care. If set, we will ++ also expect that the linked list of zip entries will be filled in ++ with the jar file's current contents. ++ */ + int +-add_to_jar_with_dir (int fd, const char* new_dir, const char* file) ++add_to_jar_with_dir (int fd, const char* new_dir, const char* file, ++ const int updating) + { + int retval; + char old_dir[MAXPATHLEN]; +@@ -837,7 +1055,7 @@ + perror(new_dir); + return 1; + } +- retval=add_to_jar(fd, file); ++ retval=add_to_jar(fd, file, updating); + if (chdir(old_dir) == -1) { + perror(old_dir); + return 1; +@@ -846,11 +1064,13 @@ + } + + int +-add_to_jar (int fd, const char *file) { ++add_to_jar (int fd, const char *file, const int updating) ++{ + struct stat statbuf; + DIR *dir; + struct dirent *de; + zipentry *ze; ++ zipentry *existing = NULL; + int stat_return; + + /* This is a quick compatibility fix -- Simon Weijgers +@@ -917,9 +1137,6 @@ + PACK_UB2(file_header, LOC_FNLEN, nlen); + PACK_UB4(file_header, LOC_MODTIME, mod_time); + +- if(verbose) +- printf("adding: %s (in=%d) (out=%d) (stored 0%%)\n", fullname, 0, 0); +- + ze = (zipentry*)malloc(sizeof(zipentry)); + if(ze == NULL){ + perror("malloc"); +@@ -936,10 +1153,36 @@ + ze->mod_date = (ub2)((mod_time & 0xffff0000) >> 16); + ze->compressed = FALSE; + +- add_entry(ze); ++ if (updating) ++ { ++ if ((existing = find_entry (ze->filename)) != NULL) ++ { ++ if (existing->usize != 0) ++ { ++ /* XXX overwriting non-directory with directory? */ ++ fprintf (stderr, "%s: %s: can't overwrite non-directory with directory\n", ++ progname, fullname); ++ return 1; ++ } ++ } ++ if (lseek (fd, end_of_entries, SEEK_SET) == -1) ++ { ++ fprintf (stderr, "%s %d\n", __FILE__, __LINE__); ++ perror ("lseek"); ++ return 1; ++ } ++ } ++ ++ if (!existing) ++ { ++ add_entry (ze); ++ write (fd, file_header, 30); ++ write (fd, fullname, nlen); ++ end_of_entries = lseek (fd, 0, SEEK_CUR); + +- write(fd, file_header, 30); +- write(fd, fullname, nlen); ++ if (verbose) ++ printf ("adding: %s (in=%d) (out=%d) (stored 0%%)\n", fullname, 0, 0); ++ } + + while(!use_explicit_list_only && (de = readdir(dir)) != NULL){ + if(de->d_name[0] == '.') +@@ -953,7 +1196,7 @@ + + strcpy(t_ptr, de->d_name); + +- if (add_to_jar(fd, fullname)) { ++ if (add_to_jar(fd, fullname, updating)) { + fprintf(stderr, "Error adding file to jar!\n"); + return 1; + } +@@ -971,7 +1214,7 @@ + return 1; + } + +- if(add_file_to_jar(fd, add_fd, file, &statbuf)){ ++ if(add_file_to_jar(fd, add_fd, file, &statbuf, updating)){ + fprintf(stderr, "Error adding file to jar!\n"); + return 1; + } +@@ -982,8 +1225,9 @@ + return 0; + } + +-int add_file_to_jar(int jfd, int ffd, const char *fname, struct stat *statbuf){ +- ++int add_file_to_jar(int jfd, int ffd, const char *fname, struct stat *statbuf, ++ const int updating) ++{ + unsigned short file_name_length; + unsigned long mod_time; + ub1 rd_buff[RDSZ]; +@@ -991,6 +1235,18 @@ + off_t offset = 0; + int rdamt; + struct zipentry *ze; ++ struct zipentry *existing = NULL; ++ ++ if (updating) ++ { ++ existing = find_entry (fname); ++ if (existing && looks_like_dir (fname)) ++ { ++ fprintf (stderr, "%s: %s is a directory in the archive\n", ++ progname, fname); ++ return 1; ++ } ++ } + + mod_time = unix2dostime(&(statbuf->st_mtime)); + file_name_length = strlen(fname); +@@ -1045,13 +1301,29 @@ + + ze->csize = statbuf->st_size; + ze->usize = ze->csize; +- ze->offset = lseek(jfd, 0, SEEK_CUR); ++ ++ if (existing) ++ ze->offset = existing->offset; ++ else if (updating) ++ ze->offset = end_of_entries; ++ else ++ ze->offset = lseek(jfd, 0, SEEK_CUR); ++ + if(do_compress) + ze->compressed = TRUE; + else + ze->compressed = FALSE; +- +- add_entry(ze); ++ ++ if (!existing) ++ add_entry(ze); ++ if (updating && lseek (jfd, ze->offset, SEEK_SET) < 0) ++ { ++ perror ("lseek"); ++ return 1; ++ } ++ ++ /* We can safely write the header here, since it will be the same size ++ as before */ + + /* Write the local header */ + write(jfd, file_header, 30); +@@ -1061,14 +1333,31 @@ + + + if(verbose){ +- printf("adding: %s ", fname); ++ if (existing) ++ printf ("updating: %s ", fname); ++ else ++ printf("adding: %s ", fname); + fflush(stdout); + } + + if(do_compress){ + /* compress the file */ +- compress_file(ffd, jfd, ze); ++ compress_file(ffd, jfd, ze, existing); + } else { ++ /* If we are not writing the last entry, make space for it. */ ++ if (existing && existing->next_entry) ++ { ++ if (ze->usize > existing->usize) ++ { ++ if (shift_down (jfd, existing->next_entry->offset, ++ ze->usize - existing->usize, existing->next_entry)) ++ { ++ fprintf (stderr, "%s: %s\n", progname, strerror (errno)); ++ return 1; ++ } ++ } ++ } ++ + /* Write the contents of the file (uncompressed) to the zip file */ + /* calculate the CRC as we go along */ + ze->crc = crc32(0L, Z_NULL, 0); +@@ -1112,12 +1401,42 @@ + /* Sun's jar tool will only allow a data descriptor if the entry is + compressed, but we'll save 16 bytes/entry if we only use it when + we can't seek back on the file */ ++ /* Technically, you CAN'T have a data descriptor unless the data ++ part has an obvious end, which DEFLATED does. Otherwise, there ++ would not be any way to determine where the data descriptor is. ++ Store an uncompressed file that ends with 0x504b0708, and see. ++ -- csm */ + + if(write(jfd, data_descriptor, 16) != 16){ + perror("write"); + return 0; + } + } ++ ++ if (existing) ++ { ++ int dd = (existing->flags & (1 << 3)) ? 12 : 0; ++ if (existing->next_entry && ze->csize < existing->csize + dd) ++ { ++ if (shift_up (jfd, existing->next_entry->offset, ++ existing->csize + dd - ze->csize, ++ existing->next_entry)) ++ { ++ perror (progname); ++ return 1; ++ } ++ } ++ /* Replace the existing entry data with this entry's. */ ++ existing->csize = ze->csize; ++ existing->usize = ze->usize; ++ existing->crc = ze->crc; ++ existing->mod_time = ze->mod_time; ++ existing->mod_date = ze->mod_date; ++ free (ze->filename); ++ free (ze); ++ } ++ else if (updating) ++ end_of_entries = lseek (jfd, 0, SEEK_CUR); + + if(verbose) + printf("(in=%d) (out=%d) (%s %d%%)\n", +@@ -1890,7 +2209,7 @@ + { + printf("jar (%s) %s\n\n", PACKAGE, VERSION); + printf("Copyright 1999, 2000, 2001 Bryan Burns\n"); +- printf("Copyright 2002 Free Software Foundation\n"); ++ printf("Copyright 2002, 2004 Free Software Foundation\n"); + printf("\ + This is free software; see the source for copying conditions. There is NO\n\ + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); +diff -urN fastjar.old/jartool.h fastjar/jartool.h +--- fastjar.old/jartool.h 2000-12-09 04:08:23.000000000 +0100 ++++ fastjar/jartool.h 2004-05-30 17:30:34.000000000 +0200 +@@ -52,6 +52,10 @@ + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + ++#ifndef __FASTJAR_JARTOOL_H__ ++#define __FASTJAR_JARTOOL_H__ ++ ++#include + #include "config.h" + + #define ACTION_NONE 0 +@@ -104,9 +108,12 @@ + ub4 usize; + ub4 offset; + ub1 compressed; ++ ub2 flags; + char *filename; + + struct zipentry *next_entry; + }; + + typedef struct zipentry zipentry; ++ ++#endif /* __FASTJAR_JARTOOL_H__ */ +diff -urN fastjar.old/shift.c fastjar/shift.c +--- fastjar.old/shift.c 1970-01-01 01:00:00.000000000 +0100 ++++ fastjar/shift.c 2004-05-30 17:30:34.000000000 +0200 +@@ -0,0 +1,166 @@ ++/* shift.c -- utilities to move regions of data in a file. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This program is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2 of the License, or (at ++your option) any later version. ++ ++This program is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++USA. */ ++ ++ ++#include ++#include ++#include ++#include "jartool.h" ++#include "shift.h" ++ ++#define BUFFER_SIZE 1024 ++ ++#define MIN(a, b) ((a) < (b) ? (a) : (b)) ++ ++/* ++ * Shift the contents of a file up by `amount' bytes, starting at `begin'. ++ * The file is not truncated, data from `amount' to `begin - amount' is ++ * overwritten. The current file pointer of `fd' is preserved. Note that ++ * this might be past the new "end" of the file. ++ * ++ * If this function is passed a `struct zipentry', then all `offset' ++ * fields from that entry down the list that are greater than or equal ++ * to `begin' will be decreased by `amount'. ++ * ++ * fd - The file descriptor. ++ * begin - The offset of the first byte that should be shifted. ++ * amount - The number of bytes to shift by. ++ * ze - A pointer into a list of zip entries that should be updated ++ * to reflect the modified offset. ++ */ ++int ++shift_up (int fd, off_t begin, off_t amount, struct zipentry *ze) ++{ ++ extern off_t end_of_entries; ++ int len, moved = 0; ++ ub1 buffer[BUFFER_SIZE]; ++ off_t where, end, save; ++ ++ if (amount <= 0) ++ return 0; ++ ++ if ((save = lseek (fd, 0, SEEK_CUR)) == -1) ++ return 1; ++ if ((end = lseek (fd, 0, SEEK_END)) == -1) ++ return 1; ++ if (end < begin) ++ return 0; ++ ++ where = begin; ++ ++ do ++ { ++ if (lseek (fd, where, SEEK_SET) < 0) ++ return 1; ++ if ((len = read (fd, buffer, BUFFER_SIZE)) < 0) ++ return 1; ++ if (len == 0) ++ break; ++ if (lseek (fd, where - amount, SEEK_SET) < 0) ++ return 1; ++ if (write (fd, buffer, len) < 0) ++ return 1; ++ where += len; ++ } ++ while (where < end); ++ ++ for (; ze; ze = ze->next_entry) ++ { ++ if (ze->offset >= begin) ++ { ++ ze->offset -= amount; ++ moved = 1; ++ } ++ } ++ if (moved) ++ end_of_entries -= amount; ++ ++ if (lseek (fd, save, SEEK_SET) == -1) ++ return 1; ++ return 0; ++} ++ ++/* ++ * Shift the contents of this file down by `amount' bytes, extending the ++ * end of file, starting at `begin'. This function will preserve the ++ * current file pointer of `fd'. Naturally, this function will fail if ++ * `fd' is not seekable. ++ * ++ * If this function is passed a `struct zipentry', then all `offset' ++ * fields from that entry down the list that are greater than or equal ++ * to `begin' will be increased by `amount'. ++ * ++ * fd - The file descriptor. ++ * begin - The offset of the first byte that should be shifted. ++ * amount - The number of bytes to shift by. ++ * ze - A pointer into a list of zip entries that should be updated ++ * to reflect the modified offset. ++ */ ++int ++shift_down (int fd, off_t begin, off_t amount, struct zipentry *ze) ++{ ++ extern off_t end_of_entries; ++ int off, len, moved = 0; ++ ub1 buffer[BUFFER_SIZE]; ++ off_t where, save; ++ ++ if (amount <= 0) ++ return 0; ++ ++ if ((save = lseek (fd, 0, SEEK_CUR)) == -1) ++ return 1; ++ if ((where = lseek (fd, 0, SEEK_END)) == -1) ++ return 1; ++ if (where < begin) ++ return 0; ++ off = (where - begin) % BUFFER_SIZE; ++ if (off == 0) ++ where -= BUFFER_SIZE; ++ else ++ where -= off; ++ ++ do ++ { ++ if (lseek (fd, where, SEEK_SET) < 0) ++ return 1; ++ if ((len = read (fd, buffer, BUFFER_SIZE)) < 0) ++ return 1; ++ if (lseek (fd, where + amount, SEEK_SET) < 0) ++ return 1; ++ if (write (fd, buffer, len) < 0) ++ return 1; ++ where -= BUFFER_SIZE; ++ } ++ while (where >= begin); ++ ++ for (; ze; ze = ze->next_entry) ++ { ++ if (ze->offset >= begin) ++ { ++ ze->offset += amount; ++ moved = 1; ++ } ++ } ++ if (moved) ++ end_of_entries += amount; ++ ++ if (lseek (fd, save, SEEK_SET) == -1) ++ return 1; ++ ++ return 0; ++} +diff -urN fastjar.old/shift.h fastjar/shift.h +--- fastjar.old/shift.h 1970-01-01 01:00:00.000000000 +0100 ++++ fastjar/shift.h 2004-05-30 17:30:34.000000000 +0200 +@@ -0,0 +1,29 @@ ++/* shift.h -- utilities to move regions of data in a file. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ ++This program is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2 of the License, or (at ++your option) any later version. ++ ++This program is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++USA. */ ++ ++ ++#ifndef __FASTJAR_SHIFT_H__ ++#define __FASTJAR_SHIFT_H__ ++ ++#include ++#include "jartool.h" ++ ++int shift_down (int, off_t, off_t, struct zipentry *); ++int shift_up (int, off_t, off_t, struct zipentry *); ++ ++#endif /* __FASTJAR_SHIFT_H__ */ +diff -urN fastjar.old/zipfile.h fastjar/zipfile.h +--- fastjar.old/zipfile.h 2000-12-09 04:08:23.000000000 +0100 ++++ fastjar/zipfile.h 2004-05-30 17:30:34.000000000 +0200 +@@ -47,6 +47,7 @@ + #define LOC_FNLEN 26 /* filename length */ + #define LOC_EFLEN 28 /* extra-field length */ + ++#define CEN_FLAGS 8 + #define CEN_COMP 10 /* compression method */ + #define CEN_MODTIME 12 + #define CEN_MODDATE 14 --- gcc-3.4-3.4.2.orig/debian/patches/kbsd-gnu.dpatch +++ gcc-3.4-3.4.2/debian/patches/kbsd-gnu.dpatch @@ -0,0 +1,470 @@ +#! /bin/sh -e + +# Description: GNU/k*BSD support +# Author: Robert Millan +# Status: libtool bits are merged in upstream 3.5 branch, rest is pending. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + for i in libffi libf2c libjava/libltdl libobjc libstdc++-v3 zlib; do + (set -x ; cd ${dir}/${i} ; autoreconf --force) + done + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +diff -Nur src.old/gcc/config/i386/kfreebsd-gnu.h src/gcc/config/i386/kfreebsd-gnu.h +--- src.old/gcc/config/i386/kfreebsd-gnu.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/gcc/config/i386/kfreebsd-gnu.h 2004-05-22 02:37:45.000000000 +0200 +@@ -0,0 +1,26 @@ ++/* Definitions for Intel 386 running kFreeBSD-based GNU systems with ELF format ++ Copyright (C) 2004 ++ Free Software Foundation, Inc. ++ Contributed by Robert Millan. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++#undef LINK_EMULATION ++#define LINK_EMULATION "elf_i386_fbsd" ++#undef REG_NAME ++#define REG_NAME(reg) sc_ ## reg +diff -Nur src.old/gcc/config/i386/knetbsd-gnu.h src/gcc/config/i386/knetbsd-gnu.h +--- src.old/gcc/config/i386/knetbsd-gnu.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/gcc/config/i386/knetbsd-gnu.h 2004-05-22 02:37:45.000000000 +0200 +@@ -0,0 +1,24 @@ ++/* Definitions for Intel 386 running kNetBSD-based GNU systems with ELF format ++ Copyright (C) 2004 ++ Free Software Foundation, Inc. ++ Contributed by Robert Millan. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++#undef REG_NAME ++#define REG_NAME(reg) sc_ ## reg +diff -Nur src.old/gcc/config/i386/linux.h src/gcc/config/i386/linux.h +--- src.old/gcc/config/i386/linux.h 2003-11-29 04:08:10.000000000 +0100 ++++ src/gcc/config/i386/linux.h 2004-05-22 02:37:45.000000000 +0200 +@@ -108,24 +108,30 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifndef LINK_EMULATION ++# define LINK_EMULATION "elf_i386" ++#endif ++#ifndef DYNAMIC_LINKER ++# ifdef USE_GNULIBC_1 ++# define DYNAMIC_LINKER "/lib/ld-linux.so.1" ++# else ++# define DYNAMIC_LINKER "/lib/ld-linux.so.2" ++# endif ++#endif ++ ++#undef SUBTARGET_EXTRA_SPECS ++#define SUBTARGET_EXTRA_SPECS \ ++ { "link_emulation", LINK_EMULATION },\ ++ { "dynamic_linker", DYNAMIC_LINKER } ++ + #undef LINK_SPEC +-#ifdef USE_GNULIBC_1 +-#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ +- %{!shared: \ +- %{!ibcs: \ +- %{!static: \ +- %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ +- %{static:-static}}}" +-#else +-#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker %(dynamic_linker)}} \ + %{static:-static}}}" +-#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +@@ -217,6 +223,8 @@ + #include + #include + ++#define REG_NAME(reg) reg ++ + #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ + do { \ + unsigned char *pc_ = (CONTEXT)->ra; \ +@@ -245,28 +253,28 @@ + else \ + break; \ + \ +- new_cfa_ = sc_->esp; \ ++ new_cfa_ = sc_->REG_NAME(esp); \ + (FS)->cfa_how = CFA_REG_OFFSET; \ + (FS)->cfa_reg = 4; \ + (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \ + \ + /* The SVR4 register numbering macros aren't usable in libgcc. */ \ + (FS)->regs.reg[0].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[0].loc.offset = (long)&sc_->eax - new_cfa_; \ ++ (FS)->regs.reg[0].loc.offset = (long)&sc_->REG_NAME(eax) - new_cfa_; \ + (FS)->regs.reg[3].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[3].loc.offset = (long)&sc_->ebx - new_cfa_; \ ++ (FS)->regs.reg[3].loc.offset = (long)&sc_->REG_NAME(ebx) - new_cfa_; \ + (FS)->regs.reg[1].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[1].loc.offset = (long)&sc_->ecx - new_cfa_; \ ++ (FS)->regs.reg[1].loc.offset = (long)&sc_->REG_NAME(ecx) - new_cfa_; \ + (FS)->regs.reg[2].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[2].loc.offset = (long)&sc_->edx - new_cfa_; \ ++ (FS)->regs.reg[2].loc.offset = (long)&sc_->REG_NAME(edx) - new_cfa_; \ + (FS)->regs.reg[6].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[6].loc.offset = (long)&sc_->esi - new_cfa_; \ ++ (FS)->regs.reg[6].loc.offset = (long)&sc_->REG_NAME(esi) - new_cfa_; \ + (FS)->regs.reg[7].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[7].loc.offset = (long)&sc_->edi - new_cfa_; \ ++ (FS)->regs.reg[7].loc.offset = (long)&sc_->REG_NAME(edi) - new_cfa_; \ + (FS)->regs.reg[5].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[5].loc.offset = (long)&sc_->ebp - new_cfa_; \ ++ (FS)->regs.reg[5].loc.offset = (long)&sc_->REG_NAME(ebp) - new_cfa_; \ + (FS)->regs.reg[8].how = REG_SAVED_OFFSET; \ +- (FS)->regs.reg[8].loc.offset = (long)&sc_->eip - new_cfa_; \ ++ (FS)->regs.reg[8].loc.offset = (long)&sc_->REG_NAME(eip) - new_cfa_; \ + (FS)->retaddr_column = 8; \ + goto SUCCESS; \ + } while (0) +diff -Nur src.old/gcc/config/kfreebsd-gnu.h src/gcc/config/kfreebsd-gnu.h +--- src.old/gcc/config/kfreebsd-gnu.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/gcc/config/kfreebsd-gnu.h 2004-05-22 02:37:45.000000000 +0200 +@@ -0,0 +1,36 @@ ++/* Definitions for kFreeBSD-based GNU systems with ELF format ++ Copyright (C) 2004 ++ Free Software Foundation, Inc. ++ Contributed by Robert Millan. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++#undef LINUX_TARGET_OS_CPP_BUILTINS ++#define LINUX_TARGET_OS_CPP_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("__FreeBSD_kernel__"); \ ++ builtin_define ("__GLIBC__"); \ ++ builtin_define_std ("unix"); \ ++ builtin_assert ("system=unix"); \ ++ builtin_assert ("system=posix"); \ ++ } \ ++ while (0) ++ ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld.so.1" +diff -Nur src.old/gcc/config/knetbsd-gnu.h src/gcc/config/knetbsd-gnu.h +--- src.old/gcc/config/knetbsd-gnu.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/gcc/config/knetbsd-gnu.h 2004-05-22 02:37:45.000000000 +0200 +@@ -0,0 +1,36 @@ ++/* Definitions for kNetBSD-based GNU systems with ELF format ++ Copyright (C) 2004 ++ Free Software Foundation, Inc. ++ Contributed by Robert Millan. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++#undef LINUX_TARGET_OS_CPP_BUILTINS ++#define LINUX_TARGET_OS_CPP_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("__NetBSD_kernel__"); \ ++ builtin_define ("__GLIBC__"); \ ++ builtin_define_std ("unix"); \ ++ builtin_assert ("system=unix"); \ ++ builtin_assert ("system=posix"); \ ++ } \ ++ while (0) ++ ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld.so.1" +diff -Nur src.old/gcc/config/linux.h src/gcc/config/linux.h +--- src.old/gcc/config/linux.h 2003-11-29 04:08:10.000000000 +0100 ++++ src/gcc/config/linux.h 2004-05-22 02:37:45.000000000 +0200 +@@ -97,6 +97,7 @@ + %{!p:%{!pg:%{!g*:-lc} %{g*:-lg}}}}" + #endif + ++#ifndef LINUX_TARGET_OS_CPP_BUILTINS + #define LINUX_TARGET_OS_CPP_BUILTINS() \ + do { \ + builtin_define ("__gnu_linux__"); \ +@@ -106,6 +107,7 @@ + builtin_assert ("system=unix"); \ + builtin_assert ("system=posix"); \ + } while (0) ++#endif + + #if !defined(USE_GNULIBC_1) && defined(HAVE_LD_EH_FRAME_HDR) + #define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " +diff -Nur src.old/gcc/config.gcc src/gcc/config.gcc +--- src.old/gcc/config.gcc 2004-05-22 01:09:22.000000000 +0200 ++++ src/gcc/config.gcc 2004-05-22 02:41:54.000000000 +0200 +@@ -428,21 +428,10 @@ + esac + fbsd_tm_file="${fbsd_tm_file} freebsd-spec.h freebsd.h" + ;; +-*-*-kfreebsd*-gnu) +- # Must come before *-*-gnu* +- xm_defines=POSIX # needed for cross-compiling from FreeBSD? +- extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o" +- # GNU tools are the only tools. +- gas=yes +- gnu_ld=yes +- case ${enable_threads} in +- "" | yes | posix) thread_file='posix' ;; +- esac +- ;; + *-*-linux*libc1* | *-*-linux*aout*) + # Avoid the generic linux case. + ;; +-*-*-linux*) ++*-*-linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu) + # Must come before *-*-gnu* (because of *-*-linux-gnu* systems). + extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o" + gas=yes +@@ -988,23 +977,21 @@ + thread_file='single' + fi + ;; +-i[34567]86-*-linux*) # Intel 80386's running GNU/Linux ++i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu) ++ # Intel 80386's running GNU/* + # with ELF format using glibc 2 +- # aka GNU/Linux C library 6 + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" + tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff" ++ case ${target} in ++ i[34567]86-*-knetbsd*-gnu) tm_file="${tm_file} knetbsd-gnu.h i386/knetbsd-gnu.h" ;; ++ i[34567]86-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;; ++ esac + ;; + x86_64-*-linux*) + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h \ + i386/x86-64.h i386/linux64.h" + tmake_file="t-slibgcc-elf-ver t-linux i386/t-linux64" + ;; +-i[34567]86-*-kfreebsd*-gnu) # must be before i[34567]86-*-gnu* +- tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h kfreebsdgnu.h i386/kfreebsdgnu.h" +- tmake_file="t-slibgcc-elf-ver t-kfreebsd-gnu i386/t-crtstuff" +- float_format=i386 +- use_fixproto=no +- ;; + i[34567]86-*-gnu*) + ;; + i[34567]86-pc-msdosdjgpp*) +diff -Nur src.old/libtool.m4 src/libtool.m4 +--- src.old/libtool.m4 2003-11-19 06:29:32.000000000 +0100 ++++ src/libtool.m4 2004-05-22 02:37:46.000000000 +0200 +@@ -621,7 +621,7 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-freebsd* ) ++freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) +@@ -689,7 +689,7 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +-netbsd*) ++netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] + else +diff -Nur src.old/ltcf-c.sh src/ltcf-c.sh +--- src.old/ltcf-c.sh 2003-11-19 06:29:32.000000000 +0100 ++++ src/ltcf-c.sh 2004-05-22 02:37:46.000000000 +0200 +@@ -175,7 +175,7 @@ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + +- netbsd*) ++ netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= +@@ -442,7 +442,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd*) ++ freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes +@@ -489,7 +489,7 @@ + link_all_deplibs=yes + ;; + +- netbsd*) ++ netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else +diff -Nur src.old/ltcf-cxx.sh src/ltcf-cxx.sh +--- src.old/ltcf-cxx.sh 2003-11-19 06:29:32.000000000 +0100 ++++ src/ltcf-cxx.sh 2004-05-22 02:37:46.000000000 +0200 +@@ -289,7 +289,7 @@ + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs=no + ;; +- freebsd*) ++ freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs=yes +@@ -449,7 +449,7 @@ + ;; + esac + ;; +- netbsd*) ++ netbsd* | knetbsd*-gnu) + # NetBSD uses g++ - do we need to do anything? + ;; + osf3*) +@@ -804,7 +804,7 @@ + ;; + esac + ;; +- freebsd*) ++ freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + gnu*) +diff -Nur src.old/ltcf-gcj.sh src/ltcf-gcj.sh +--- src.old/ltcf-gcj.sh 2003-11-19 06:29:32.000000000 +0100 ++++ src/ltcf-gcj.sh 2004-05-22 02:37:46.000000000 +0200 +@@ -178,7 +178,7 @@ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + +- netbsd*) ++ netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= +@@ -445,7 +445,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd*) ++ freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes +@@ -476,7 +476,7 @@ + link_all_deplibs=yes + ;; + +- netbsd*) ++ netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else +diff -Nur src.old/ltconfig src/ltconfig +--- src.old/ltconfig 2004-03-05 22:05:41.000000000 +0100 ++++ src/ltconfig 2004-05-22 02:37:46.000000000 +0200 +@@ -1168,6 +1168,17 @@ + hardcode_into_libs=yes + ;; + ++kfreebsd*-gnu | knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' ++ soname_spec='${libname}${release}.so$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. --- gcc-3.4-3.4.2.orig/debian/patches/link-libs.dpatch +++ gcc-3.4-3.4.2/debian/patches/link-libs.dpatch @@ -0,0 +1,134 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -u ./gcc/config/t-slibgcc-elf-ver~ ./gcc/config/t-slibgcc-elf-ver +--- ./gcc/config/t-slibgcc-elf-ver~ 2003-01-26 12:35:07.000000000 +0100 ++++ ./gcc/config/t-slibgcc-elf-ver 2004-05-28 17:23:02.856048856 +0200 +@@ -13,6 +13,7 @@ + SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ + -Wl,--soname=$(SHLIB_SONAME) \ + -Wl,--version-script=$(SHLIB_MAP) \ ++ -Wl,-O1 \ + -o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \ + rm -f $(SHLIB_SOLINK) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK) +diff -u ./libf2c/Makefile.in~ ./libf2c/Makefile.in +--- ./libf2c/Makefile.in~ 2003-07-04 21:53:54.000000000 +0200 ++++ ./libf2c/Makefile.in 2004-05-28 17:17:35.334839648 +0200 +@@ -154,6 +154,7 @@ + $(LIBTOOL) --mode=link $(CC) -o $@ \ + -version-info $(VERSION_MAJOR):$(VERSION_MINOR):$(VERSION_SUB) \ + -rpath $(glibcpp_toolexeclibdir) \ ++ -Wl,-O1 \ + -objectlist s-libe77 \ + -objectlist s-libf77 \ + -objectlist s-libi77 \ +diff -u ./libffi/Makefile.am~ ./libffi/Makefile.am +--- ./libffi/Makefile.am~ 2004-05-23 13:59:17.000000000 +0200 ++++ ./libffi/Makefile.am 2004-05-28 17:18:54.254841984 +0200 +@@ -179,7 +179,7 @@ + + AM_CFLAGS = -fexceptions + +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + + INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + +diff -u ./libffi/Makefile.in~ ./libffi/Makefile.in +--- ./libffi/Makefile.in~ 2004-05-23 13:59:17.000000000 +0200 ++++ ./libffi/Makefile.in 2004-05-28 17:19:33.776833728 +0200 +@@ -223,7 +223,7 @@ + + AM_CFLAGS = -fexceptions + +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + + INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +diff -u ./libjava/Makefile.in~ ./libjava/Makefile.in +--- ./libjava/Makefile.in~ 2004-05-23 13:59:17.000000000 +0200 ++++ ./libjava/Makefile.in 2004-05-28 17:14:23.595988384 +0200 +@@ -162,7 +162,7 @@ + + GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fclasspath= -fbootclasspath=$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c + GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ +-LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ ++LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -Wl,-O1 -o $@ + + LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) + +diff -u ./libjava/Makefile.am~ ./libjava/Makefile.am +--- ./libjava/Makefile.am~ 2004-05-23 13:59:17.000000000 +0200 ++++ ./libjava/Makefile.am 2004-05-28 17:13:58.076867880 +0200 +@@ -67,7 +67,7 @@ + + GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fclasspath= -fbootclasspath=$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c + GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ +-LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ ++LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -Wl,-O1 -o $@ + + ## We define this because otherwise libtool can be run with different + ## values of `CXX' and will then get confused and fail to work. So, +diff -u ./libobjc/Makefile.in~ ./libobjc/Makefile.in +--- ./libobjc/Makefile.in~ 2004-05-23 13:59:17.000000000 +0200 ++++ ./libobjc/Makefile.in 2004-05-28 17:16:18.398535744 +0200 +@@ -264,11 +264,13 @@ + libobjc.la: $(OBJS) + $(LIBTOOL_LINK) $(CC) -o $@ $(OBJS) \ + -rpath $(glibcpp_toolexeclibdir) \ ++ -Wl,-O1 \ + -version-info $(LIBOBJC_VERSION) + + libobjc_gc.la: $(OBJS_GC) + $(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) \ + -rpath $(glibcpp_toolexeclibdir) \ ++ -Wl,-O1 \ + -version-info $(LIBOBJC_GC_VERSION) + + # +diff -u ./libstdc++-v3/src/Makefile.am~ ./libstdc++-v3/src/Makefile.am +--- ./libstdc++-v3/src/Makefile.am~ 2004-05-28 13:18:10.000000000 +0200 ++++ ./libstdc++-v3/src/Makefile.am 2004-05-28 13:19:11.000000000 +0200 +@@ -148,6 +148,7 @@ + libstdc___la_DEPENDENCIES = ${version_dep} $(libstdc___la_LIBADD) + + libstdc___la_LDFLAGS = \ ++ -Wl,-O1 \ + -version-info $(libtool_VERSION) ${version_arg} -lm + + +diff -u ./libstdc++-v3/src/Makefile.in~ ./libstdc++-v3/src/Makefile.in +--- ./libstdc++-v3/src/Makefile.in~ 2004-05-28 13:18:10.000000000 +0200 ++++ ./libstdc++-v3/src/Makefile.in 2004-05-28 13:19:55.000000000 +0200 +@@ -305,6 +305,7 @@ + libstdc___la_DEPENDENCIES = ${version_dep} $(libstdc___la_LIBADD) + + libstdc___la_LDFLAGS = \ ++ -Wl,-O1 \ + -version-info $(libtool_VERSION) ${version_arg} -lm + + --- gcc-3.4-3.4.2.orig/debian/patches/gccbug-posix.dpatch +++ gcc-3.4-3.4.2/debian/patches/gccbug-posix.dpatch @@ -0,0 +1,86 @@ +#! /bin/sh -e + +# DP: Make gccbug POSIX compliant (patch by David Weinehall) +# DP: http://www.opengroup.org/onlinepubs/009695399/utilities/test.html + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/gccbug.in~ 2004-06-15 04:43:16.000000000 +0200 ++++ gcc/gccbug.in 2004-07-04 23:51:38.000000000 +0200 +@@ -165,7 +165,7 @@ + ;; + -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi + shift ; IN_FILE="$1" +- if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then ++ if [ "$IN_FILE" != "-" ] && [ ! -r "$IN_FILE" ]; then + echo "$COMMAND: cannot read $IN_FILE" + $REMOVE_TEMP + exit 1 +@@ -237,7 +237,7 @@ + # Catch some signals. ($xs kludge needed by Sun /bin/sh) + xs=0 + trap '$REMOVE_TEMP; exit $xs' 0 +-trap 'echo "$COMMAND: Aborting ..."; $REMOVE_TEMP; xs=1; exit' 1 3 13 15 ++trap 'echo "$COMMAND: Aborting ..."; $REMOVE_TEMP; xs=1; exit' HUP QUIT PIPE TERM + + # If they told us to use a specific file, then do so. + if [ -n "$IN_FILE" ]; then +@@ -258,16 +258,16 @@ + fi + else + +- if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then ++ if [ -n "$PR_FORM" ] && [ -z "$PRINT_INTERN" ]; then + # If their PR_FORM points to a bogus entry, then bail. +- if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then ++ if [ ! -f "$PR_FORM" ] || [ ! -r "$PR_FORM" ] || [ ! -s "$PR_FORM" ]; then + echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM" + sleep 1 + PRINT_INTERN=bad_prform + fi + fi + +- if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then ++ if [ -n "$PR_FORM" ] && [ -z "$PRINT_INTERN" ]; then + cp $PR_FORM $TEMP || + ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit ) + else +@@ -359,7 +359,7 @@ + done + fi + +- if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then ++ if [ "$PRINT" = true ] || [ "$PRINT_INTERN" = true ]; then + cat $TEMP + xs=0; exit + fi +@@ -467,7 +467,7 @@ + CNT=`expr $CNT + 1` + fi + +- [ $CNT -lt 6 -a -z "$BATCH" ] && ++ [ $CNT -lt 6 ] && [ -z "$BATCH" ] && + echo "Errors were found with the problem report." + + while true; do --- gcc-3.4-3.4.2.orig/debian/patches/autoreconf.dpatch +++ gcc-3.4-3.4.2/debian/patches/autoreconf.dpatch @@ -0,0 +1,26 @@ +#! /bin/sh -e + +# DP: autoreconf several directories for proper mipsen libtool support + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + for i in libf2c libjava/libltdl libobjc libstdc++-v3 zlib; do + (cd ${dir}/${i} ; autoreconf --force) + done + ;; + -unpatch) + echo unable to unpatch autoreconf. + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 --- gcc-3.4-3.4.2.orig/debian/patches/libjava-mips.dpatch +++ gcc-3.4-3.4.2/debian/patches/libjava-mips.dpatch @@ -0,0 +1,40 @@ +#! /bin/sh -e + +# DP: libjava-mips patch from Thiemo Seufer + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +--- libjava/include/mips-signal.h.old 2003-10-22 18:35:16.000000000 +0200 ++++ libjava/include/mips-signal.h 2003-12-13 18:29:53.000000000 +0100 +@@ -80,7 +80,7 @@ + kact.k_sa_handler = catch_segv; \ + kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ + sigemptyset (&kact.k_sa_mask); \ +- syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ ++ syscall (__NR_sigaction, SIGSEGV, &kact, NULL); \ + } \ + while (0) + --- gcc-3.4-3.4.2.orig/debian/patches/multiarch-include.dpatch +++ gcc-3.4-3.4.2/debian/patches/multiarch-include.dpatch @@ -0,0 +1,107 @@ +#! /bin/sh -e + +# DP: multiarch-include.dpatch by Stephen Frost +# DP: updated for gcc-3.4 by Matthias Klose +# DP: +# DP: Adds the multiarch include directory (/usr/include/TARGET_ALIAS) +# DP: to the system include paths. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc.old/Makefile.in gcc/Makefile.in +--- gcc.old/Makefile.in 2004-06-17 23:56:58.000000000 +0200 ++++ gcc/Makefile.in 2004-07-10 01:44:11.000000000 +0200 +@@ -2324,6 +2324,7 @@ + -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \ + -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \ + -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \ ++ -DTARGET_MACHINE=\"$(target_alias)\" \ + @TARGET_SYSTEM_ROOT_DEFINE@ + + LIBCPP_OBJS = cpplib.o cpplex.o cppmacro.o cppexp.o cppfiles.o cpptrad.o \ +diff -urN gcc.old/config/i386/t-linux64 gcc/config/i386/t-linux64 +--- gcc.old/config/i386/t-linux64 2002-11-28 15:47:02.000000000 +0100 ++++ gcc/config/i386/t-linux64 2004-07-10 01:44:11.000000000 +0200 +@@ -6,7 +6,7 @@ + + MULTILIB_OPTIONS = m64/m32 + MULTILIB_DIRNAMES = 64 32 +-MULTILIB_OSDIRNAMES = ../lib64 ../lib ++MULTILIB_OSDIRNAMES = x86_64-linux i486-linux + + LIBGCC = stmp-multilib + INSTALL_LIBGCC = install-multilib +diff -urN gcc.old/config/t-linux gcc/config/t-linux +--- gcc.old/config/t-linux 2003-09-23 20:55:57.000000000 +0200 ++++ gcc/config/t-linux 2004-07-10 01:48:41.000000000 +0200 +@@ -11,3 +11,10 @@ + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c + LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c gthr-gnat.c ++ ++MULTILIB_OPTIONS = m32 ++MULTILIB_DIRNAMES = 32 ++MULTILIB_OSDIRNAMES = $TARGET_ARCH ++ ++LIBGCC = stmp-multilib ++INSTALL_LIBGCC = install-multilib +diff -urN gcc.old/cppdefault.c gcc/cppdefault.c +--- gcc.old/cppdefault.c 2003-03-01 15:31:12.000000000 +0100 ++++ gcc/cppdefault.c 2004-07-10 01:46:34.000000000 +0200 +@@ -29,6 +29,14 @@ + #define STANDARD_INCLUDE_DIR "/usr/include" + #endif + ++#ifndef MULTIARCH_STANDARD_INCLUDE_DIR ++#define MULTIARCH_STANDARD_INCLUDE_DIR STANDARD_INCLUDE_DIR "/" TARGET_MACHINE ++#endif ++ ++#ifndef MULTIARCH_LOCAL_INCLUDE_DIR ++#define MULTIARCH_LOCAL_INCLUDE_DIR LOCAL_INCLUDE_DIR "/" TARGET_MACHINE ++#endif ++ + #ifndef STANDARD_INCLUDE_COMPONENT + #define STANDARD_INCLUDE_COMPONENT 0 + #endif +@@ -62,6 +70,10 @@ + /* /usr/local/include comes before the fixincluded header files. */ + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1 }, + #endif ++#ifdef MULTIARCH_LOCAL_INCLUDE_DIR ++ /* /usr/local/include/$target_alias comes before the fixincluded header files. */ ++ { MULTIARCH_LOCAL_INCLUDE_DIR, 0, 0, 1, 1 }, ++#endif + #ifdef PREFIX_INCLUDE_DIR + { PREFIX_INCLUDE_DIR, 0, 0, 1, 0 }, + #endif +@@ -81,6 +93,9 @@ + /* Some systems have an extra dir of include files. */ + { SYSTEM_INCLUDE_DIR, 0, 0, 0, 1 }, + #endif ++#ifdef MULTIARCH_STANDARD_INCLUDE_DIR ++ { MULTIARCH_STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1 }, ++#endif + #ifdef STANDARD_INCLUDE_DIR + /* /usr/include comes dead last. */ + { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1 }, --- gcc-3.4-3.4.2.orig/debian/patches/arm-libstdc++-soname.dpatch +++ gcc-3.4-3.4.2/debian/patches/arm-libstdc++-soname.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +# DP: on amd64 and arm, change libstdc++'s soname. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libstdc++-v3/configure.ac~ 2004-07-17 10:57:12.000000000 +0200 ++++ libstdc++-v3/configure.ac 2004-07-17 14:00:41.000000000 +0200 +@@ -13,7 +13,7 @@ + ### am handles this now? ORIGINAL_LD_FOR_MULTILIBS=$LD + + # For libtool versioning info, format is CURRENT:REVISION:AGE +-libtool_VERSION=6:2:0 ++libtool_VERSION=60:2:0 + AC_SUBST(libtool_VERSION) + + # Find the rest of the source tree framework. +--- libstdc++-v3/configure~ 2004-07-17 10:57:12.000000000 +0200 ++++ libstdc++-v3/configure 2004-07-17 14:01:13.000000000 +0200 +@@ -1340,7 +1340,7 @@ + ### am handles this now? ORIGINAL_LD_FOR_MULTILIBS=$LD + + # For libtool versioning info, format is CURRENT:REVISION:AGE +-libtool_VERSION=6:2:0 ++libtool_VERSION=60:2:0 + + + # Find the rest of the source tree framework. --- gcc-3.4-3.4.2.orig/debian/patches/gcc-textdomain.dpatch +++ gcc-3.4-3.4.2/debian/patches/gcc-textdomain.dpatch @@ -0,0 +1,60 @@ +#! /bin/sh -e + +# DP: Set gettext's domain and textdomain to the versioned package name. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/Makefile.in~ 2004-07-21 22:42:58.000000000 +0200 ++++ gcc/Makefile.in 2004-07-21 22:43:37.000000000 +0200 +@@ -2311,6 +2311,7 @@ + intl.o: intl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h Makefile + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ + -DLOCALEDIR=\"$(localedir)\" \ ++ -DPACKAGE=\"$(PACKAGE)\" \ + -c $(srcdir)/intl.c $(OUTPUT_OPTION) + + # +@@ -3848,7 +3848,7 @@ + GMSGFMT = @GMSGFMT@ + MSGMERGE = msgmerge + +-PACKAGE = @PACKAGE@ ++PACKAGE = $(shell echo @PACKAGE@|sed '$(program_transform_name)') + CATALOGS = @CATALOGS@ + + .PHONY: build- install- build-po install-po update-po +--- gcc/intl.c~ 2004-07-21 22:42:58.000000000 +0200 ++++ gcc/intl.c 2004-07-21 22:43:37.000000000 +0200 +@@ -41,8 +41,8 @@ + setlocale (LC_ALL, ""); + #endif + +- (void) bindtextdomain ("gcc", LOCALEDIR); +- (void) textdomain ("gcc"); ++ (void) bindtextdomain (PACKAGE, LOCALEDIR); ++ (void) textdomain (PACKAGE); + } + + #if defined HAVE_WCHAR_H && defined HAVE_WORKING_MBSTOWCS && defined HAVE_WCSWIDTH --- gcc-3.4-3.4.2.orig/debian/patches/gcc-3.4.diff8 +++ gcc-3.4-3.4.2/debian/patches/gcc-3.4.diff8 @@ -0,0 +1,580 @@ +diff -ru gcc-3.4.0.orig/gcc/config/sol2.h gcc-3.4.0/gcc/config/sol2.h +--- gcc-3.4.0.orig/gcc/config/sol2.h 2004-05-19 22:01:51.000000000 +0200 ++++ gcc-3.4.0/gcc/config/sol2.h 2004-05-19 22:04:45.000000000 +0200 +@@ -203,7 +203,7 @@ + long size = getpagesize (); \ + long mask = ~(size-1); \ + char *page = (char *) (((long) addr) & mask); \ +- char *end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \ ++ char *end = (char *) ((((long) (addr + TRAMPOLINE_SIZE-1)) & mask) + size); \ + \ + if (mprotect (page, end - page, 7 /* STACK_PROT_RWX */) < 0) \ + perror ("mprotect of trampoline code"); \ +Only in gcc-3.4.0/gcc/config: sol2.h~ +diff -ru gcc-3.4.0.orig/gcc/dbxout.c gcc-3.4.0/gcc/dbxout.c +--- gcc-3.4.0.orig/gcc/dbxout.c 2004-05-19 22:09:33.000000000 +0200 ++++ gcc-3.4.0/gcc/dbxout.c 2004-05-19 22:12:41.000000000 +0200 +@@ -1462,7 +1462,7 @@ + fputs ("@s", asmfile); + CHARS (2); + print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type)); +- fputs (";-20;", asmfile); ++ fputs (";-20", asmfile); + CHARS (4); + } + else +@@ -1484,7 +1484,7 @@ + fputs ("@s", asmfile); + CHARS (2); + print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type)); +- fputs (";-16;", asmfile); ++ fputs (";-16", asmfile); + CHARS (4); + } + else /* Define as enumeral type (False, True) */ +Only in gcc-3.4.0/gcc: dbxout.c~ +diff -ru gcc-3.4.0.orig/gcc/dwarf2out.c gcc-3.4.0/gcc/dwarf2out.c +--- gcc-3.4.0.orig/gcc/dwarf2out.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/dwarf2out.c 2004-05-19 22:03:12.000000000 +0200 +@@ -8607,6 +8607,9 @@ + case VIEW_CONVERT_EXPR: + case SAVE_EXPR: + case MODIFY_EXPR: ++#ifdef GPC ++ case UNSAVE_EXPR: ++#endif + return loc_descriptor_from_tree (TREE_OPERAND (loc, 0), addressp); + + case COMPONENT_REF: +@@ -8809,6 +8812,15 @@ + add_loc_descr (&ret, new_loc_descr (op, 0, 0)); + break; + ++#ifdef GPC ++ case MIN_EXPR: ++ loc = build (COND_EXPR, TREE_TYPE (loc), ++ build (GT_EXPR, integer_type_node, ++ TREE_OPERAND (loc, 0), TREE_OPERAND (loc, 1)), ++ TREE_OPERAND (loc, 1), TREE_OPERAND (loc, 0)); ++ goto cond_expr; ++#endif ++ + case MAX_EXPR: + loc = build (COND_EXPR, TREE_TYPE (loc), + build (LT_EXPR, integer_type_node, +@@ -8818,6 +8830,9 @@ + /* ... fall through ... */ + + case COND_EXPR: ++#ifdef GPC ++ cond_expr: ++#endif + { + dw_loc_descr_ref lhs + = loc_descriptor_from_tree (TREE_OPERAND (loc, 1), 0); +@@ -8848,6 +8863,21 @@ + } + break; + ++#ifdef GPC ++ case REAL_CST: ++ case FLOAT_EXPR: ++ case FIX_TRUNC_EXPR: ++ case FIX_CEIL_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_ROUND_EXPR: ++ case RDIV_EXPR: ++ /* In Pascal it's possible for array bounds to contain floating point ++ expressions (e.g., p/test/emil11c.pas). I don't know if it's ++ possible to represent them in dwarf2, but it doesn't seem terribly ++ important since this occurs quite rarely. -- Frank */ ++ return 0; ++#endif ++ + case EXPR_WITH_FILE_LOCATION: + return loc_descriptor_from_tree (EXPR_WFL_NODE (loc), addressp); + +diff -ru gcc-3.4.0.orig/gcc/expr.c gcc-3.4.0/gcc/expr.c +--- gcc-3.4.0.orig/gcc/expr.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/expr.c 2004-05-19 22:03:12.000000000 +0200 +@@ -19,6 +19,9 @@ + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + ++ ++/* @@ PATCHED FOR GPC @@ */ ++ + #include "config.h" + #include "system.h" + #include "coretypes.h" +@@ -5077,13 +5080,36 @@ + return; + } + ++#ifndef GPC + domain_min = convert (sizetype, TYPE_MIN_VALUE (domain)); + domain_max = convert (sizetype, TYPE_MAX_VALUE (domain)); ++#else /* GPC */ ++ domain_min = convert (sbitsizetype, TYPE_MIN_VALUE (domain)); ++ domain_max = convert (sbitsizetype, TYPE_MAX_VALUE (domain)); ++ ++ /* Align the set. */ ++ if (set_alignment) ++ domain_min = size_binop (BIT_AND_EXPR, domain_min, sbitsize_int (-(int) set_alignment)); ++ ++#endif /* GPC */ + bitlength = size_binop (PLUS_EXPR, +- size_diffop (domain_max, domain_min), ++ size_binop (MINUS_EXPR, domain_max, domain_min), ++#ifndef GPC + ssize_int (1)); +- ++#else /* GPC */ ++ sbitsize_int (1)); ++#endif /* GPC */ ++ ++#ifdef GPC ++ if (TREE_INT_CST_HIGH (bitlength)) { ++ error ("set size too big for host integers"); ++ return; ++ } ++#endif /* GPC */ + nbits = tree_low_cst (bitlength, 1); ++#ifdef GPC ++ bitlength = convert (sizetype, bitlength); ++#endif /* GPC */ + + /* For "small" sets, or "medium-sized" (up to 32 bytes) sets that + are "complicated" (more than one range), initialize (the +@@ -5091,7 +5117,9 @@ + if (GET_MODE (target) != BLKmode || nbits <= 2 * BITS_PER_WORD + || (nbytes <= 32 && TREE_CHAIN (elt) != NULL_TREE)) + { ++#ifndef GPC + unsigned int set_word_size = TYPE_ALIGN (TREE_TYPE (exp)); ++#endif /* not GPC */ + enum machine_mode mode = mode_for_size (set_word_size, MODE_INT, 1); + char *bit_buffer = alloca (nbits); + HOST_WIDE_INT word = 0; +@@ -5104,10 +5132,14 @@ + { + if (bit_buffer[ibit]) + { ++#ifndef GPC + if (BYTES_BIG_ENDIAN) +- word |= (1 << (set_word_size - 1 - bit_pos)); ++#else /* GPC */ ++ if (set_words_big_endian) ++#endif /* GPC */ ++ word |= (((HOST_WIDE_INT)1) << (set_word_size - 1 - bit_pos)); + else +- word |= 1 << bit_pos; ++ word |= ((HOST_WIDE_INT)1) << bit_pos; + } + + bit_pos++; ibit++; +@@ -5169,13 +5201,23 @@ + endbit = startbit; + } + ++#ifndef GPC + startbit = convert (sizetype, startbit); + endbit = convert (sizetype, endbit); ++#endif /* not GPC */ + if (! integer_zerop (domain_min)) + { ++#ifdef GPC ++ startbit = convert (sbitsizetype, startbit); ++ endbit = convert (sbitsizetype, endbit); ++#endif /* GPC */ + startbit = size_binop (MINUS_EXPR, startbit, domain_min); + endbit = size_binop (MINUS_EXPR, endbit, domain_min); + } ++#ifdef GPC ++ startbit = convert (sizetype, startbit); ++ endbit = convert (sizetype, endbit); ++#endif /* GPC */ + startbit_rtx = expand_expr (startbit, NULL_RTX, MEM, + EXPAND_CONST_ADDRESS); + endbit_rtx = expand_expr (endbit, NULL_RTX, MEM, +@@ -5541,8 +5583,18 @@ + index, then convert to sizetype and multiply by the size of the + array element. */ + if (low_bound != 0 && ! integer_zerop (low_bound)) ++#ifdef GPC ++ /* I think that address arithmetic should always be done on sizetype or ++ its variants -- for Pascal signed seems to be the correct choice (and ++ generates slightly better code). -- Waldek */ ++ index = convert (sizetype, convert (bitsizetype, ++ size_binop (MINUS_EXPR, ++ convert (sbitsizetype, index), ++ convert (sbitsizetype, low_bound)))); ++#else + index = fold (build (MINUS_EXPR, TREE_TYPE (index), + index, low_bound)); ++#endif + + /* If the index has a self-referential type, pass it to a + WITH_RECORD_EXPR; if the component size is, pass our +diff -ru gcc-3.4.0.orig/gcc/fold-const.c gcc-3.4.0/gcc/fold-const.c +--- gcc-3.4.0.orig/gcc/fold-const.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/fold-const.c 2004-05-19 22:03:12.000000000 +0200 +@@ -19,6 +19,9 @@ + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + ++ ++/* @@ PATCHED FOR GPC @@ */ ++ + /*@@ This file should be rewritten to use an arbitrary precision + @@ representation for "struct tree_int_cst" and "struct tree_real_cst". + @@ Perhaps the routines could also be used for bc/dc, and made a lib. +@@ -225,6 +228,17 @@ + && TYPE_IS_SIZETYPE (TREE_TYPE (t)))) + return overflow; + ++#ifdef GPC ++ /* Sign extension for unsigned types (sizetype) seems quite wrong. ++ Though the previous comment says otherwise, but according to the ++ GCC ChangeLog entry of 2000-10-20, I suppose it was meant only ++ to allow for overflows, not to sign extension, for sizetypes. ++ The problem shows, e.g., when converting a bitsizetype to ++ sizetype where the value doesn't fit in ssizetype. -- Frank */ ++ if (!TREE_UNSIGNED (TREE_TYPE (t))) ++ { ++#endif ++ + /* If the value's sign bit is set, extend the sign. */ + if (prec != 2 * HOST_BITS_PER_WIDE_INT + && (prec > HOST_BITS_PER_WIDE_INT +@@ -247,6 +261,10 @@ + } + } + ++#ifdef GPC ++ } ++#endif ++ + /* Return nonzero if signed overflow occurred. */ + return + ((overflow | (low ^ TREE_INT_CST_LOW (t)) | (high ^ TREE_INT_CST_HIGH (t))) +@@ -1343,10 +1361,14 @@ + } + + TREE_OVERFLOW (t) ++#ifndef GPC + = ((notrunc + ? (!uns || is_sizetype) && overflow + : (force_fit_type (t, (!uns || is_sizetype) && overflow) + && ! no_overflow)) ++#else /* GPC */ ++ = ((notrunc ? overflow : force_fit_type (t, overflow)) ++#endif /* GPC */ + | TREE_OVERFLOW (arg1) + | TREE_OVERFLOW (arg2)); + +diff -ru gcc-3.4.0.orig/gcc/function.c gcc-3.4.0/gcc/function.c +--- gcc-3.4.0.orig/gcc/function.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/function.c 2004-05-19 22:08:25.000000000 +0200 +@@ -38,6 +38,8 @@ + This function changes the DECL_RTL to be a stack slot instead of a reg + then scans all the RTL instructions so far generated to correct them. */ + ++/* @@ PATCHED FOR GPC @@ */ ++ + #include "config.h" + #include "system.h" + #include "coretypes.h" +@@ -6962,8 +6964,13 @@ + tramp = round_trampoline_addr (XEXP (tramp, 0)); + #ifdef TRAMPOLINE_TEMPLATE + blktramp = replace_equiv_address (initial_trampoline, tramp); ++#ifndef GPC + emit_block_move (blktramp, initial_trampoline, + GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL); ++#else ++ emit_block_move (blktramp, initial_trampoline, ++ GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NO_LIBCALL); ++#endif + #endif + trampolines_created = 1; + INITIALIZE_TRAMPOLINE (tramp, XEXP (DECL_RTL (function), 0), context); +Only in gcc-3.4.0/gcc: function.c~ +diff -ru gcc-3.4.0.orig/gcc/integrate.c gcc-3.4.0/gcc/integrate.c +--- gcc-3.4.0.orig/gcc/integrate.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/integrate.c 2004-05-19 22:03:12.000000000 +0200 +@@ -1341,6 +1341,30 @@ + { + rtx copy, pattern, set; + ++#ifdef GPC ++ /* CALL_PLACEHOLDERs within inline functions seem to cause ++ trouble in Pascal (fjf709.pas). References to formal ++ parameters of the inline function might get confused. So ++ replace the CALL_PLACEHOLDER by the normal calling code ++ here, at the cost of avoiding this particular combination ++ of optimizations (inlining and tail recursion/sibling ++ calls) -- though I'm not actually sure if it should be done ++ at all; the C frontend also seems to do only inlining in a ++ similar situation, and this might be good enough already. ++ ++ I don't understand all the backend does here, and I'm not ++ even sure if the real bug is in the fontend or backend, or ++ whether this is a fix or a work-around ... -- Frank */ ++ if (GET_CODE (insn) == CALL_INSN ++ && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER) ++ { ++ rtx tmp = PREV_INSN (insn); ++ replace_call_placeholder (insn, sibcall_use_normal); ++ insn = tmp; ++ continue; ++ } ++#endif ++ + map->orig_asm_operands_vector = 0; + + switch (GET_CODE (insn)) +diff -ru gcc-3.4.0.orig/gcc/stor-layout.c gcc-3.4.0/gcc/stor-layout.c +--- gcc-3.4.0.orig/gcc/stor-layout.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/stor-layout.c 2004-05-19 22:38:36.000000000 +0200 +@@ -20,6 +20,8 @@ + 02111-1307, USA. */ + + ++/* @@ PATCHED FOR GPC 20040512 @@ */ ++ + #include "config.h" + #include "system.h" + #include "coretypes.h" +@@ -59,6 +61,20 @@ + called only by a front end. */ + static int reference_types_internal = 0; + ++#ifdef GPC ++/* The word size of a bitstring or (power-)set value, in bits. ++ Must be non-zero. ++ May be overridden by front-ends. */ ++unsigned int set_word_size = BITS_PER_UNIT; ++ ++/* If non-zero, bits in (power-)sets start with the highest bit. ++ May be overridden by front-ends. ++ In order to be backward-compatible, the Chill frontend should ++ initialize this to BYTES_BIG_ENDIAN. */ ++unsigned int set_words_big_endian = 0; ++ ++#endif /* GPC */ ++ + static void finalize_record_size (record_layout_info); + static void finalize_type_size (tree); + static void place_union_field (record_layout_info, tree); +@@ -1655,7 +1671,11 @@ + + if (maxvalue - minvalue == 1 + && (maxvalue == 1 || maxvalue == 0)) ++#ifndef GPC + element_size = integer_one_node; ++#else /* GPC */ ++ element_size = bitsize_int(1); ++#endif /* GPC */ + } + + /* If neither bound is a constant and sizetype is signed, make +@@ -1760,6 +1780,7 @@ + abort (); + else + { ++#ifndef GPC + #ifndef SET_WORD_SIZE + #define SET_WORD_SIZE BITS_PER_WORD + #endif +@@ -1778,9 +1799,47 @@ + + TYPE_SIZE (type) = bitsize_int (rounded_size); + TYPE_SIZE_UNIT (type) = size_int (rounded_size / BITS_PER_UNIT); ++#else /* GPC */ ++ int alignment = set_alignment ? set_alignment : set_word_size; ++ tree lower_bound = convert (sbitsizetype, ++ TYPE_MIN_VALUE (TYPE_DOMAIN (type))); ++ tree upper_bound = convert (sbitsizetype, ++ TYPE_MAX_VALUE (TYPE_DOMAIN (type))); ++ tree size_in_bits, rounded_size; ++ if (set_alignment) ++ { ++ lower_bound = round_down (lower_bound, alignment); ++ } ++ size_in_bits = size_binop (PLUS_EXPR, ++ size_binop (MINUS_EXPR, ++ upper_bound, ++ lower_bound), ++ sbitsize_int(1)); ++ rounded_size = round_up (size_in_bits, alignment); ++ ++ if ( TREE_INT_CST_HIGH (rounded_size) ++ || TREE_INT_CST_LOW (rounded_size) > (unsigned) alignment) ++ { ++ TYPE_MODE (type) = BLKmode; ++ } ++ else ++ { ++ TYPE_MODE (type) = mode_for_size (alignment, MODE_INT, 1); ++ } ++ ++ TYPE_SIZE (type) = convert (bitsizetype, rounded_size); ++ TYPE_SIZE_UNIT (type) = convert (sizetype, ++ size_binop ( CEIL_DIV_EXPR, ++ rounded_size, ++ sbitsize_int (BITS_PER_UNIT))); ++#endif /* GPC */ + TYPE_ALIGN (type) = alignment; + TYPE_USER_ALIGN (type) = 0; ++#ifndef GPC + TYPE_PRECISION (type) = size_in_bits; ++#else /* GPC */ ++ TYPE_PRECISION (type) = TREE_INT_CST_LOW (size_in_bits); ++#endif /* GPC */ + } + break; + +Only in gcc-3.4.0/gcc: stor-layout.c~ +diff -ru gcc-3.4.0.orig/gcc/tree.c gcc-3.4.0/gcc/tree.c +--- gcc-3.4.0.orig/gcc/tree.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/tree.c 2004-05-19 22:03:12.000000000 +0200 +@@ -19,6 +19,8 @@ + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + ++/* @@ PATCHED FOR GPC @@ */ ++ + /* This file contains the low level primitives for operating on tree nodes, + including allocation, list operations, interning of identifiers, + construction of data type nodes and statement nodes, +@@ -4649,10 +4651,18 @@ + = tree_low_cst (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (init))), 0); + tree non_const_bits = NULL_TREE; + ++#ifdef GPC ++ /* Align the set. */ ++ if (set_alignment) ++ /* Note: `domain_min -= domain_min % set_alignment' would be wrong for negative ++ numbers (rounding towards 0, while we have to round towards -inf). */ ++ domain_min &= -(int) set_alignment; ++#endif /* GPC */ ++ + for (i = 0; i < bit_size; i++) + buffer[i] = 0; + +- for (vals = TREE_OPERAND (init, 1); ++ for (vals = CONSTRUCTOR_ELTS (init); + vals != NULL_TREE; vals = TREE_CHAIN (vals)) + { + if (!host_integerp (TREE_VALUE (vals), 0) +@@ -4670,7 +4680,10 @@ + + if (lo_index < 0 || lo_index >= bit_size + || hi_index < 0 || hi_index >= bit_size) +- abort (); ++ { ++ error ("invalid set initializer"); ++ return NULL_TREE; ++ } + for (; lo_index <= hi_index; lo_index++) + buffer[lo_index] = 1; + } +@@ -4681,7 +4694,7 @@ + = tree_low_cst (TREE_VALUE (vals), 0) - domain_min; + if (index < 0 || index >= bit_size) + { +- error ("invalid initializer for bit string"); ++ error ("invalid set initializer"); + return NULL_TREE; + } + buffer[index] = 1; +@@ -4699,9 +4712,14 @@ + get_set_constructor_bytes (tree init, unsigned char *buffer, int wd_size) + { + int i; ++#ifdef GPC ++ int bit_size = wd_size * BITS_PER_UNIT; ++ unsigned int bit_pos = 0; ++#else /* not GPC */ + int set_word_size = BITS_PER_UNIT; + int bit_size = wd_size * set_word_size; + int bit_pos = 0; ++#endif /* not GPC */ + unsigned char *bytep = buffer; + char *bit_buffer = alloca (bit_size); + tree non_const_bits = get_set_constructor_bits (init, bit_buffer, bit_size); +@@ -4711,6 +4729,24 @@ + + for (i = 0; i < bit_size; i++) + { ++#ifdef GPC ++ if (bit_buffer[i]) ++ { ++ int k = bit_pos / BITS_PER_UNIT; ++ if (WORDS_BIG_ENDIAN) ++ k = set_word_size / BITS_PER_UNIT - 1 - k; ++ if (set_words_big_endian) ++ bytep[k] |= (1 << (BITS_PER_UNIT - 1 - bit_pos % BITS_PER_UNIT)); ++ else ++ bytep[k] |= (1 << (bit_pos % BITS_PER_UNIT)); ++ } ++ bit_pos++; ++ if (bit_pos >= set_word_size) ++ { ++ bit_pos = 0; ++ bytep += set_word_size / BITS_PER_UNIT; ++ } ++#else /* not GPC */ + if (bit_buffer[i]) + { + if (BYTES_BIG_ENDIAN) +@@ -4721,6 +4757,7 @@ + bit_pos++; + if (bit_pos >= set_word_size) + bit_pos = 0, bytep++; ++#endif /* not GPC */ + } + return non_const_bits; + } +Only in gcc-3.4.0/gcc: tree.def~ +diff -ru gcc-3.4.0.orig/gcc/tree.h gcc-3.4.0/gcc/tree.h +--- gcc-3.4.0.orig/gcc/tree.h 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/tree.h 2004-05-19 22:03:12.000000000 +0200 +@@ -22,6 +22,9 @@ + #ifndef GCC_TREE_H + #define GCC_TREE_H + ++ ++/* @@ PATCHED FOR GPC @@ */ ++ + #include "machmode.h" + #include "version.h" + #include "input.h" +@@ -2463,6 +2466,14 @@ + + /* If nonzero, the alignment of a bitstring or (power-)set value, in bits. */ + extern unsigned int set_alignment; ++#ifdef GPC ++ ++/* The word size of a bitstring or (power-)set value, in bits. */ ++extern unsigned int set_word_size; ++ ++/* If non-zero, bits in (power-)sets start with the highest bit. */ ++extern unsigned int set_words_big_endian; ++#endif /* GPC */ + + /* Concatenate two lists (chains of TREE_LIST nodes) X and Y + by making the last node in X point to Y. +diff -ru gcc-3.4.0.orig/gcc/version.c gcc-3.4.0/gcc/version.c +--- gcc-3.4.0.orig/gcc/version.c 2004-05-19 21:59:36.000000000 +0200 ++++ gcc-3.4.0/gcc/version.c 2004-05-19 22:03:12.000000000 +0200 +@@ -14,4 +14,8 @@ + forward us bugs reported to you, if you determine that they are + not bugs in your modifications.) */ + ++#ifdef GPC ++const char bug_report_url[] = ""; ++#else + const char bug_report_url[] = ""; ++#endif --- gcc-3.4-3.4.2.orig/debian/patches/gpc-update27i.diff +++ gcc-3.4-3.4.2/debian/patches/gpc-update27i.diff @@ -0,0 +1,8255 @@ +diff -ru gpc-20040516.orig/p/config-lang.in gpc-20040516/p/config-lang.in +--- gpc-20040516.orig/p/config-lang.in 2004-05-13 00:48:32.000000000 +0200 ++++ gpc-20040516/p/config-lang.in 2004-07-06 19:08:51.000000000 +0200 +@@ -28,19 +28,50 @@ + stagestuff="gpc\$(exeext) gpc-cross\$(exeext) gpc1\$(exeext) gpcpp\$(exeext) libgpc.a" + gtfiles="\$(srcdir)/p/gpc.h \$(srcdir)/p/declarations.c \$(srcdir)/p/module.c \$(srcdir)/p/predef.c" + ++echo "in p/config-lang.in" ++echo "srcdir=$srcdir" ++echo "pwd=`pwd`" ++ ++( ++if [ -f "$srcdir/version.c" ] ++then ++ MY_SRCDIR="$srcdir" ++ gcc_version_h="gcc-version.h" ++else ++ MY_SRCDIR="$srcdir/gcc" ++ gcc_version_h="gcc/gcc-version.h" ++ [ -d gcc ] || mkdir gcc ++fi ++ ++# Check if running first time ++if [ -r "$gcc_version_h" ] ; then ++ echo "Not first time" ++ exit ++fi ++echo "First time" ++ ++srcdir="$MY_SRCDIR" ++ + version=`grep version_string "$srcdir/version.c" | sed -e 's/[^"]*"//;s/[ "].*//'` + mainversion="$version" + gcc3=n + if echo $version | grep '2\.9' > /dev/null || echo $version | grep '3\.[1-9]' > /dev/null; then +- echo '#define EGCS' > gcc-version.h ++ echo '#define EGCS' > "$gcc_version_h" + if echo $version | grep '2\.95\.[3-9]' > /dev/null || echo $version | grep '3\.[1-9]' > /dev/null; then +- echo '#define GCC_2_95_3' >> gcc-version.h ++ echo '#define GCC_2_95_3' >> "$gcc_version_h" + fi + if echo $version | grep '2\.9[6-9]' > /dev/null || echo $version | grep '3\.[1-9]' > /dev/null; then + gcc3=y +- echo '#define EGCS97' >> gcc-version.h ++ echo '#define EGCS97' >> "$gcc_version_h" + if echo $version | grep '3\.[3-9]' > /dev/null; then +- echo '#define GCC_3_3' >> gcc-version.h ++ echo '#define GCC_3_3' >> "$gcc_version_h" ++ if echo $version | grep '^3\.[4-9]' > /dev/null; then ++ echo '#define GCC_3_4' >> "$gcc_version_h" ++ if echo $version | grep '^3\.[5-9]' > /dev/null; then ++ echo '#define GCC_3_5' >> "$gcc_version_h" ++ fi ++ fi ++ + # echo "" >&2 + # echo "***" >&2 + # echo "*** Detected GCC version $mainversion." >&2 +@@ -56,7 +87,7 @@ + fi + fi + else +- echo "/* empty */" > gcc-version.h ++ echo "/* empty */" > "$gcc_version_h" + fi + + for x in 2.95.1 2.95.2 2.95.3 2.95.3-5 2.95.3-6 2.95.3-8 2.95.4; do +@@ -119,3 +150,5 @@ + echo "# empty" > "$srcdir/p/Makefile.in" + fi + fi ++) || exit 1 ++ +diff -ru gpc-20040516.orig/p/cpp_predef.h gpc-20040516/p/cpp_predef.h +--- gpc-20040516.orig/p/cpp_predef.h 2004-07-06 19:20:30.000000000 +0200 ++++ gpc-20040516/p/cpp_predef.h 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1 @@ ++#define GPC_CPP_PREDEFINES CPP_PREDEFINES +diff -ru gpc-20040516.orig/p/declarations.c gpc-20040516/p/declarations.c +--- gpc-20040516.orig/p/declarations.c 2004-05-12 02:39:11.000000000 +0200 ++++ gpc-20040516/p/declarations.c 2004-07-06 19:12:30.000000000 +0200 +@@ -214,13 +214,14 @@ + static tree shadow_one_level PARAMS ((tree, tree)); + static int resolve_forward_decl PARAMS ((tree)); + static tree get_parm_info PARAMS ((tree, int)); +-static tree lookup_name_current_level PARAMS ((tree)); + static tree lookup_c_type PARAMS ((const char *)); + static tree make_real PARAMS ((double)); + static tree gpc_builtin_function PARAMS ((const char *, const char *, int, tree, tree)); + #if defined (EGCS97) && !defined (GCC_3_3) + static void mark_binding_level PARAMS ((void *)); + #endif ++static tree mangle_name PARAMS ((tree)); ++static int same_imported PARAMS ((tree, tree)); + + /* Nonzero if we are currently in the global binding level. */ + int +@@ -228,7 +229,7 @@ + { + if (size_volatile) + return -1; +- return current_binding_level == global_binding_level; ++ return pascal_global_bindings_p (); + } + + int +@@ -479,6 +480,36 @@ + return get_identifier (copy); + } + ++static tree ++mangle_name (name) ++ tree name; ++{ ++ assert (current_module); ++ return pascal_mangle_names(NULL, IDENTIFIER_POINTER (name)); ++} ++ ++tree ++pascal_mangle_names(object_name, name) ++ const char * object_name; ++ const char * name; ++{ ++ static long serial_no = 0; ++ char serial_str[22]; ++ const char * object_sep; ++ const char * mn = IDENTIFIER_POINTER (current_module->assembler_name); ++ sprintf(serial_str, "%ld", serial_no++); ++ if (!object_name) ++ { ++ object_name = ""; ++ object_sep = ""; ++ } ++ else ++ object_sep = "_"; ++ return get_identifier (ACONCAT (( ++ mn, "_S", serial_str, object_sep, object_name, "_", ++ name, NULL))); ++} ++ + /* Parameters. */ + + tree +@@ -766,17 +797,60 @@ + return error_mark_node; + } + ++int ++same_imported (x, y) ++ tree x, y; ++{ ++ tree tx = TREE_TYPE (x); ++ tree ty = TREE_TYPE (y); ++ if (TREE_CODE (x) != TREE_CODE (y)) ++ return 0; ++ if (TREE_CODE (x) != CONST_DECL && ++ TYPE_MAIN_VARIANT (tx) != TYPE_MAIN_VARIANT (ty)) ++ return 0; ++ switch (TREE_CODE (x)) ++ { ++ case TYPE_DECL: ++ if (PASCAL_TYPE_BINDABLE (tx) != PASCAL_TYPE_BINDABLE (ty)) ++ return 0; ++ /* FALLTHROUGH */ ++ case CONST_DECL: ++ /* @@@@@@@ We should really compare _values_ -- below we ++ check if we have the same expression */ ++ if (DECL_INITIAL (x) == DECL_INITIAL (y)) ++ return 1; ++ break; ++ case FUNCTION_DECL: ++ case VAR_DECL: ++ /* @@ Not clear what to do if user specifies the same linker ++ name for two objects (different normal Pascal declarations ++ never give the same linker name). */ ++ if (DECL_EXTERNAL (x) && DECL_EXTERNAL (y) && ++ DECL_ASSEMBLER_NAME (x) == DECL_ASSEMBLER_NAME (y)) ++ return 1; ++ break; ++ default: ++ return 0; ++ } ++ return 0; ++} ++ + /* Record a decl-node X as belonging to the current lexical scope. + Check for errors (such as redeclarations in the same scope). + Returns either X or a forward decl. If a forward decl is returned, + it may have been smashed to agree with what X says. */ ++ ++ + tree + pushdecl (x) + tree x; + { +- tree t, name = DECL_NAME (x); +- ++ tree t; ++ tree name = DECL_NAME (x); ++ int weak = 0; + CHK_EM (TREE_TYPE (x)); ++ assert (!PASCAL_DECL_WEAK (x)); ++ assert (!PASCAL_DECL_IMPORTED (x)); + + /* @@ Can happen when called from the backend. */ + if (!name) +@@ -795,12 +869,17 @@ + warning ("local external declaration of `%s'", IDENTIFIER_NAME (name)); + + t = lookup_name_current_level (name); +- + /* Overloading an operator is ok. The decl is a dummy placeholder. + No need to replace it with another one. */ + if (t && TREE_CODE (t) == OPERATOR_DECL && TREE_CODE (x) == OPERATOR_DECL) + return t; + ++ if (t && PASCAL_DECL_WEAK (t)) ++ { ++ t = NULL_TREE; ++ weak = 1; ++ } ++ + if (t && (TREE_CODE (t) != FUNCTION_DECL || TREE_CODE (x) != FUNCTION_DECL + || DECL_INITIAL (t) || !comptypes (TREE_TYPE (x), TREE_TYPE (t)))) + { +@@ -867,6 +946,7 @@ + } + + /* Install the new declaration. */ ++ if (!weak) + t = IDENTIFIER_VALUE (name); + IDENTIFIER_VALUE (name) = x; + +@@ -894,6 +974,61 @@ + return x; + } + ++tree ++pushdecl_import (x, is_weak) ++ tree x; ++ int is_weak; ++{ ++ tree name = DECL_NAME (x); ++ tree old = lookup_name_current_level (name); ++ int old_weak = 0; ++ assert (!PASCAL_DECL_WEAK (x)); ++ ++ if (old && PASCAL_DECL_WEAK (old)) ++ { ++ old = 0; ++ old_weak = 1; ++ } ++ ++ /* `uses' do not override declarations from current module/unit */ ++ if (old && is_weak) ++ return old; ++ ++ /* Overloading an operator is ok. The decl is a dummy placeholder. ++ No need to replace it with another one. */ ++ if (old && TREE_CODE (old) == OPERATOR_DECL && TREE_CODE (x) == OPERATOR_DECL) ++ return old; ++ ++ /* If the same thing is imported multiple times we just ignore ++ second declaration, unless it is principal identifier of ++ a constant */ ++ if (old && PASCAL_DECL_IMPORTED (old) && same_imported (old, x)) ++ { ++ if (TREE_CODE (x) == CONST_DECL && PASCAL_CST_PRINCIPAL_ID (x)) ++ { ++ old = 0; ++ old_weak = 1; ++ } ++ else ++ return old; ++ } ++ ++ if (old) ++ { ++ error_with_decl (x, "redeclaration of `%s'"); ++ error_with_decl (old, " previous declaration"); ++ return old; ++ } ++ ++ if (!old_weak) ++ old = IDENTIFIER_VALUE (name); ++ if (old) ++ current_binding_level->shadowed = ++ tree_cons (name, old, current_binding_level->shadowed); ++ PASCAL_DECL_WEAK (x) = is_weak; ++ return pushdecl_nocheck (x); ++} ++ + /* Record a decl-node X as belonging to the current lexical scope + uncondionally and without any errors etc. (unlike pushdecl). + For module imports and implicit declarations. */ +@@ -1043,7 +1178,7 @@ + } + + /* Similar to `lookup_name' but look only at current scope. */ +-static tree ++tree + lookup_name_current_level (name) + tree name; + { +@@ -1078,9 +1213,19 @@ + return; + if (co->warn_id_case && IDENTIFIER_SPELLING_FILE (id)) + { ++#ifndef GCC_3_4 + warning_with_file_and_line (filename, line, "capitalisation of `%s' doesn't match", spelling); + warning_with_file_and_line (IDENTIFIER_SPELLING_FILE (id), IDENTIFIER_SPELLING_LINENO (id), + " previous capitalisation `%s'", IDENTIFIER_SPELLING (id)); ++#else ++ location_t loc_aux; ++ loc_aux.file = filename; ++ loc_aux.line = line; ++ warning ("%Hcapitalisation of identifier `%s' doesn't match", &loc_aux, spelling); ++ loc_aux.file = IDENTIFIER_SPELLING_FILE (id); ++ loc_aux.line = IDENTIFIER_SPELLING_LINENO (id); ++ warning ("%H previous capitalisation `%s'", &loc_aux, IDENTIFIER_SPELLING (id)); ++#endif + } + } + IDENTIFIER_SPELLING (id) = PERMANENT_STRING (spelling); +@@ -1168,6 +1313,33 @@ + } + + tree ++build_qualified_id (interface_id, id) ++ tree interface_id, id; ++{ ++ tree qid = get_identifier (ACONCAT ( ++ (IDENTIFIER_POINTER (interface_id), ++ ".", ++ (IDENTIFIER_POINTER (id)), ++ NULL))); ++ PASCAL_QUALIFIED_ID (qid) = 1; ++ return qid; ++} ++ ++tree ++build_qualified_or_component_acces (id1, id2) ++ tree id1, id2; ++{ ++ tree decl = lookup_name (id1); ++ if (decl && (TREE_CODE (decl) != NAMESPACE_DECL)) ++ { ++ decl = check_identifier(id1); ++ return build_component_ref (undo_schema_dereference (decl), id2); ++ } ++ else ++ return check_identifier (build_qualified_id (id1, id2)); ++} ++ ++tree + check_identifier (id) + tree id; + { +@@ -1300,6 +1472,11 @@ + { + tree endlink; + ++#ifndef EGCS97 ++ /* Make identifier nodes long enough for the language-specific slots. */ ++ set_identifier_size (sizeof (struct lang_identifier)); ++#endif ++ + #if defined (EGCS97) && !defined (GCC_3_3) + ggc_add_tree_root (pascal_global_trees, PTI_MAX); + ggc_add_root (¤t_binding_level, 1, sizeof (current_binding_level), mark_binding_level); +@@ -2056,7 +2233,7 @@ + else if (DECL_EXTERNAL (d)) + SET_DECL_ASSEMBLER_NAME (d, de_capitalize (name)); + else +- SET_DECL_ASSEMBLER_NAME (d, name); ++ SET_DECL_ASSEMBLER_NAME (d, mangle_name (name)); + + rest_of_decl_compilation (d, 0, !DECL_CONTEXT (d), 1 /* for GPC */); + +@@ -2233,12 +2410,12 @@ + + /* Compare two routine declarations. If arguments is NULL_TREE, it is not checked. */ + void +-check_routine_decl (arguments, restype, resvar, structor, old, filename, lineno) ++check_routine_decl (arguments, restype, resvar, structor, old, filename, line) + tree arguments, restype, resvar; + int structor; + tree old; + filename_t filename; +- int lineno; ++ int line; + { + int mismatch = 0; + if (arguments) +@@ -2267,7 +2444,15 @@ + { + /* Say `routine' since there might be a mismatch in whether it's + supposed to be a procedure, function or structor. */ +- error_with_file_and_line (filename, lineno, "routine definition does not match previous declaration"); ++#ifndef GCC_3_4 ++ error_with_file_and_line (filename, line, "routine definition does not match previous declaration"); ++#else ++ location_t loc_aux; ++ loc_aux.file = filename; ++ loc_aux.line = line; ++ error ("%Hroutine definition does not match previous declaration", ++ &loc_aux); ++#endif + error_with_decl (old, " previous declaration"); + } + } +@@ -2313,11 +2498,14 @@ + + if (old && (!was_forward || TREE_CODE (old) != FUNCTION_DECL || DECL_INITIAL (old))) + { ++ if (!PASCAL_DECL_WEAK (old)) ++ { + error ("redeclaration of `%s'", IDENTIFIER_NAME (name)); + error_with_decl (old, " previous declaration"); +- old = NULL_TREE; + redeclaration = 1; + } ++ old = NULL_TREE; ++ } + + if (old) + { +@@ -2390,7 +2578,7 @@ + if (!PASCAL_METHOD_HEADING (foobar) /*&& !current_module->main_program*/ + && !(old && DECL_EXTERNAL (old))) + TREE_PUBLIC (decl) = 0; +- SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl)); ++ SET_DECL_ASSEMBLER_NAME (decl, mangle_name (DECL_NAME (decl))); + } + + if (is_extern && local) +@@ -2421,7 +2609,13 @@ + SET_DECL_LANG_OPERATOR_DECL (decl, operator_decl); + + if (local) ++ { ++#ifdef GCC_3_4 ++ DECL_CONTEXT (decl) = current_function_decl; ++ SET_DECL_ASSEMBLER_NAME (decl, NULL); ++#endif + push_function_context (); ++ } + + current_function_decl = decl; + +@@ -2456,7 +2650,11 @@ + DECL_ARGUMENTS (decl) = getdecls (); + + /* Initialize the RTL code for the function. */ ++#ifndef GCC_3_4 + init_function_start (decl, input_filename, lineno); ++#else ++ init_function_start (decl) ; ++#endif + + /* Set up parameters and prepare for return. */ + expand_function_start (decl, 0); +@@ -2549,7 +2747,11 @@ + #else + make_decl_rtl (decl, NULL); + #endif ++#ifndef GCC_3_4 + init_function_start (decl, input_filename, lineno); ++#else ++ init_function_start (decl); ++#endif + #ifndef EGCS97 + /* To avoid crashing when compiling a unit with `-O3', see obstack_empty_p in tree.c:restore_tree_status() */ + preserve_initializer (); +@@ -2598,7 +2800,11 @@ + } + + /* Generate rtl for function exit. */ ++#ifndef GCC_3_4 + expand_function_end (input_filename, lineno, 0); ++#else ++ expand_function_end (); ++#endif + + #ifndef EGCS97 + /* So we can tell if jump_optimize sets it to 1. */ +@@ -2659,7 +2865,9 @@ + tree v = convert (r, build_int_2 (c, 0)); + PASCAL_TREE_FRESH_CST (v) = 1; + DECL_INITIAL (decl) = TREE_VALUE (id) = v; ++ PASCAL_CST_PRINCIPAL_ID (decl) = 1; + pushdecl (decl); ++ handle_autoexport (TREE_PURPOSE (id)); + if (!TREE_CHAIN (id)) + TYPE_MAX_VALUE (r) = v; + } +@@ -2860,7 +3068,9 @@ + tree list; + { + for (; list; list = TREE_CHAIN (list)) ++ { + IDENTIFIER_VALUE (TREE_PURPOSE (list)) = TREE_VALUE (list); ++ } + } + + tree +@@ -3081,17 +3291,37 @@ + TREE_STATIC (d) = !!(qualifiers & VQ_STATIC); + if (TREE_STATIC (d) + DECL_EXTERNAL (d) + DECL_REGISTER (d) > 1) + error ("multiple storage classes in variable declaration"); ++ { ++ tree assembler_name0 = 0; + if (pascal_global_bindings_p ()) + { +- TREE_PUBLIC (d) = !TREE_STATIC (d) && !DECL_REGISTER (d) && +- (DECL_EXTERNAL (d) || !current_module->implementation || assembler_name); ++ TREE_PUBLIC (d) = !TREE_STATIC (d) && !DECL_REGISTER (d) ++ && (DECL_EXTERNAL (d) || !current_module->implementation ++ || assembler_name); ++ if (TREE_PUBLIC (d) && !assembler_name && !DECL_EXTERNAL (d)) ++ assembler_name0 = mangle_name(TREE_VALUE (v)); + TREE_STATIC (d) = !DECL_EXTERNAL (d); + } + else + TREE_PUBLIC (d) = DECL_EXTERNAL (d); + DECL_COMMON (d) = !TREE_PUBLIC (d); +- SET_DECL_ASSEMBLER_NAME (d, assembler_name ? check_assembler_name (assembler_name) +- : (qualifiers & VQ_EXTERNAL) ? de_capitalize (TREE_VALUE (v)) : TREE_VALUE (v)); ++ if (assembler_name0) ++ SET_DECL_ASSEMBLER_NAME (d, assembler_name0); ++ else ++ { ++ tree new_name = assembler_name; ++ if (new_name) ++ new_name = check_assembler_name (new_name); ++ else if (qualifiers & VQ_EXTERNAL) ++ new_name = de_capitalize (TREE_VALUE (v)); ++ else ++#ifdef GCC_3_4 ++ if (pascal_global_bindings_p ()) ++#endif ++ new_name = TREE_VALUE (v); ++ SET_DECL_ASSEMBLER_NAME (d, new_name); ++ } ++ } + pascal_decl_attributes (&d, attributes); + if (DECL_EXTERNAL (d) || TREE_STATIC (d)) + { +diff -ru gpc-20040516.orig/p/expressions.c gpc-20040516/p/expressions.c +--- gpc-20040516.orig/p/expressions.c 2004-05-12 01:37:37.000000000 +0200 ++++ gpc-20040516/p/expressions.c 2004-07-06 19:08:51.000000000 +0200 +@@ -855,7 +855,7 @@ + build_array_ref (sval, build_binary_op (PLUS_EXPR, len1, integer_one_node, 0)), NOP_EXPR, exp2)); + else + expand_expr_stmt (build_memcpy ( +- build (PLUS_EXPR, cstring_type_node, str_addr, len1, 0), ++ build (PLUS_EXPR, cstring_type_node, str_addr, len1), + build1 (ADDR_EXPR, cstring_type_node, PASCAL_STRING_VALUE (exp2)), len2)); + + /* Save the combined length of strings */ +@@ -1438,10 +1438,17 @@ + if (TREE_CODE (factor) == STRING_CST) + { + tree length = build_int_2 (TREE_STRING_LENGTH (factor) - 1, 0); ++#ifndef GCC_3_4 + factor = build (CONSTRUCTOR, build_pascal_string_schema (length), NULL_TREE, + tree_cons (NULL_TREE, length, + tree_cons (NULL_TREE, length, + build_tree_list (NULL_TREE, factor)))); ++#else ++ factor = build_constructor (build_pascal_string_schema (length), ++ tree_cons (NULL_TREE, length, ++ tree_cons (NULL_TREE, length, ++ build_tree_list (NULL_TREE, factor)))); ++#endif + /* Make this a valid lvalue for taking addresses. */ + TREE_CONSTANT (factor) = 1; + TREE_STATIC (factor) = 1; +@@ -1867,7 +1874,9 @@ + case NEGATE_EXPR: + case ABS_EXPR: + case FLOAT_EXPR: ++#ifndef GCC_3_4 + case FFS_EXPR: ++#endif + /* These don't change whether an object is non-zero or zero. */ + return truthvalue_conversion (TREE_OPERAND (expr, 0)); + +@@ -2108,7 +2117,9 @@ + break; + + case BIT_AND_EXPR: ++#ifndef GCC_3_4 + case BIT_ANDTC_EXPR: ++#endif + case BIT_IOR_EXPR: + case BIT_XOR_EXPR: + if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) +@@ -3121,14 +3132,20 @@ + return error_mark_node; + } + if (TREE_CODE (pointer) == ADDR_EXPR ++#ifndef GCC_3_4 + && !flag_volatile ++#endif + && (TREE_TYPE (TREE_OPERAND (pointer, 0)) == t)) + return TREE_OPERAND (pointer, 0); + + ref = build1 (INDIRECT_REF, t, pointer); + TREE_READONLY (ref) = TYPE_READONLY (t); + TREE_THIS_VOLATILE (ref) = TYPE_VOLATILE (t); +- TREE_SIDE_EFFECTS (ref) = TYPE_VOLATILE (t) || TREE_SIDE_EFFECTS (pointer) || flag_volatile; ++ TREE_SIDE_EFFECTS (ref) = TYPE_VOLATILE (t) || TREE_SIDE_EFFECTS (pointer) ++#ifndef GCC_3_4 ++ || flag_volatile ++#endif ++ ; + prediscriminate_schema (ref); + return ref; + } +diff -ru gpc-20040516.orig/p/gbe.h gpc-20040516/p/gbe.h +--- gpc-20040516.orig/p/gbe.h 2004-04-08 14:30:41.000000000 +0200 ++++ gpc-20040516/p/gbe.h 2004-07-06 19:08:51.000000000 +0200 +@@ -102,6 +102,17 @@ + #endif + + #include "system.h" ++#ifdef GCC_3_4 ++#define CONCAT2(a,b) a##b ++#define STRINGX(s) #s ++#define lineno input_line ++#define warning_with_decl(x, y) (warning ("%H" y, &DECL_SOURCE_LOCATION (x), \ ++ DECL_NAME (x)?IDENTIFIER_POINTER (DECL_NAME (x)):0)) ++#define error_with_decl(x, y) (error("%H" y, &DECL_SOURCE_LOCATION (x), \ ++ DECL_NAME (x)?IDENTIFIER_POINTER (DECL_NAME (x)):0)) ++#include "coretypes.h" ++#include "tm.h" ++#endif + #include + #include "tree.h" + #ifdef EGCS97 +diff -ru gpc-20040516.orig/p/gpc.c gpc-20040516/p/gpc.c +--- gpc-20040516.orig/p/gpc.c 2004-01-01 00:25:07.000000000 +0100 ++++ gpc-20040516/p/gpc.c 2004-07-06 19:08:51.000000000 +0200 +@@ -95,6 +95,13 @@ + #endif + #include "config.h" + #include "system.h" ++#ifdef GCC_3_4 ++#include "coretypes.h" ++#include "multilib.h" /* before tm.h */ ++#include "tm.h" ++#else ++#include "multilib.h" ++#endif + #include + #if ! defined( SIGCHLD ) && defined( SIGCLD ) + # define SIGCHLD SIGCLD +@@ -161,6 +168,16 @@ + + #define lang_specific_extra_outfiles 0 + ++#ifndef EGCS97 ++#undef bool ++#define bool int ++#undef false ++#define false 0 ++#undef true ++#define true 1 ++#define ISIDNUM(c) (isalnum(c)||(c) == '_') ++#endif ++ + extern int lang_specific_pre_link PARAMS ((void)); + int + lang_specific_pre_link () +@@ -234,7 +251,7 @@ + #include + #endif + #if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE +-extern int getrusage PARAMS ((int, struct rusage *)); ++extern int getrusage (int, struct rusage *); + #endif + + #ifdef EGCS97 +@@ -335,6 +352,14 @@ + + #endif + ++#ifndef GCC_3_4 ++static const struct { ++ const char *name, *value; ++} configure_default_options[1] = { {NULL, NULL} }; ++#define IS_ABSOLUTE_PATH(STR) IS_ABSOLUTE_PATHNAME (STR) ++#endif ++ ++ + #ifndef VMS + /* FIXME: the location independence code for VMS is hairier than this, + and hasn't been written. */ +@@ -345,8 +370,10 @@ + + static const char dir_separator_str[] = { DIR_SEPARATOR, 0 }; + ++#ifndef GCC_3_3 + #define obstack_chunk_alloc xmalloc + #define obstack_chunk_free free ++#endif + + #ifndef GET_ENVIRONMENT + #define GET_ENVIRONMENT(VAR,NAME) do { (VAR) = getenv (NAME); } while (0) +@@ -434,11 +461,37 @@ + + static int report_times; + ++/* Nonzero means place this string before uses of /, so that include ++ and library files can be found in an alternate location. */ ++ ++#ifdef TARGET_SYSTEM_ROOT ++static const char *target_system_root = TARGET_SYSTEM_ROOT; ++#else ++static const char *target_system_root = 0; ++#endif ++ ++/* Nonzero means pass the updated target_system_root to the compiler. */ ++ ++static int target_system_root_changed; ++ ++/* Nonzero means append this string to target_system_root. */ ++ ++static const char *target_sysroot_suffix = 0; ++ ++/* Nonzero means append this string to target_system_root for headers. */ ++ ++static const char *target_sysroot_hdrs_suffix = 0; ++ + /* Nonzero means write "temp" files in source directory + and use the source file's name in them, and don't delete them. */ + + static int save_temps_flag; + ++/* Nonzero means use pipes to communicate between subprocesses. ++ Overridden by either of the above two flags. */ ++ ++static int use_pipes; ++ + /* The compiler version. */ + + static const char *compiler_version; +@@ -503,74 +556,79 @@ + /* Forward declaration for prototypes. */ + struct path_prefix; + +-static void init_spec PARAMS ((void)); ++static void init_spec (void); + #if !defined (GCC_3_3) && !defined (VMS) +-static char **split_directories PARAMS ((const char *, int *)); +-static void free_split_directories PARAMS ((char **)); +-static char *make_relative_prefix PARAMS ((const char *, const char *, const char *)); +-#endif +-static void store_arg PARAMS ((const char *, int, int)); +-static char *load_specs PARAMS ((const char *)); +-static void read_specs PARAMS ((const char *, int)); +-static void set_spec PARAMS ((const char *, const char *)); +-static struct compiler *lookup_compiler PARAMS ((const char *, size_t, const char *)); +-static char *build_search_list PARAMS ((struct path_prefix *, const char *, int)); +-static void putenv_from_prefixes PARAMS ((struct path_prefix *, const char *)); +-static int access_check PARAMS ((const char *, int)); +-static char *find_a_file PARAMS ((struct path_prefix *, const char *, +- int, int)); +-static void add_prefix PARAMS ((struct path_prefix *, const char *, +- const char *, int, int, int *, int)); +-static void translate_options PARAMS ((int *, const char *const **)); +-static char *skip_whitespace PARAMS ((char *)); +-static void delete_if_ordinary PARAMS ((const char *)); +-static void delete_temp_files PARAMS ((void)); +-static void delete_failure_queue PARAMS ((void)); +-static void clear_failure_queue PARAMS ((void)); +-static int check_live_switch PARAMS ((int, int)); +-static const char *handle_braces PARAMS ((const char *)); +-static const struct spec_function *lookup_spec_function PARAMS ((const char *)); +-static const char *eval_spec_function PARAMS ((const char *, const char *)); +-static const char *handle_spec_function PARAMS ((const char *)); +-static char *save_string PARAMS ((const char *, int)); +-static void set_collect_gcc_options PARAMS ((void)); +-static int do_spec_1 PARAMS ((const char *, int, const char *)); +-static int do_spec_2 PARAMS ((const char *)); +-static void do_self_spec PARAMS ((const char *)); +-static const char *find_file PARAMS ((const char *)); +-static int is_directory PARAMS ((const char *, const char *, int)); +-static void validate_switches PARAMS ((const char *)); +-static void validate_all_switches PARAMS ((void)); +-static void give_switch PARAMS ((int, int, int)); +-static int used_arg PARAMS ((const char *, int)); +-static int default_arg PARAMS ((const char *, int)); +-static void set_multilib_dir PARAMS ((void)); +-static void print_multilib_info PARAMS ((void)); +-static void perror_with_name PARAMS ((const char *)); +-static void pfatal_pexecute PARAMS ((const char *, const char *)) +- ATTRIBUTE_NORETURN; +-static void notice PARAMS ((const char *, ...)) +- ATTRIBUTE_PRINTF_1; +-static void display_help PARAMS ((void)); +-static void add_preprocessor_option PARAMS ((const char *, int)); +-static void add_assembler_option PARAMS ((const char *, int)); +-static void add_linker_option PARAMS ((const char *, int)); +-static void process_command PARAMS ((int, const char *const *)); +-static int execute PARAMS ((void)); +-static void alloc_args PARAMS ((void)); +-static void clear_args PARAMS ((void)); +-static void fatal_error PARAMS ((int)); ++static char **split_directories (const char *, int *); ++static void free_split_directories (char **); ++static char *make_relative_prefix (const char *, const char *, const char *); ++#endif ++static void store_arg (const char *, int, int); ++static char *load_specs (const char *); ++static void read_specs (const char *, int); ++static void set_spec (const char *, const char *); ++static struct compiler *lookup_compiler (const char *, size_t, const char *); ++static char *build_search_list (struct path_prefix *, const char *, int); ++static void putenv_from_prefixes (struct path_prefix *, const char *); ++static int access_check (const char *, int); ++static char *find_a_file (struct path_prefix *, const char *, int, int); ++static void add_prefix (struct path_prefix *, const char *, const char *, ++ int, int, int *, int); ++static void add_sysrooted_prefix (struct path_prefix *, const char *, ++ const char *, int, int, int *, int); ++static void translate_options (int *, const char *const **); ++static char *skip_whitespace (char *); ++static void delete_if_ordinary (const char *); ++static void delete_temp_files (void); ++static void delete_failure_queue (void); ++static void clear_failure_queue (void); ++static int check_live_switch (int, int); ++static const char *handle_braces (const char *); ++static inline bool input_suffix_matches (const char *, const char *); ++static inline bool switch_matches (const char *, const char *, int); ++static inline void mark_matching_switches (const char *, const char *, int); ++static inline void process_marked_switches (void); ++static const char *process_brace_body (const char *, const char *, const char *, int, int); ++static const struct spec_function *lookup_spec_function (const char *); ++static const char *eval_spec_function (const char *, const char *); ++static const char *handle_spec_function (const char *); ++static char *save_string (const char *, int); ++static void set_collect_gcc_options (void); ++static int do_spec_1 (const char *, int, const char *); ++static int do_spec_2 (const char *); ++static void do_option_spec (const char *, const char *); ++static void do_self_spec (const char *); ++static const char *find_file (const char *); ++static int is_directory (const char *, const char *, int); ++static const char *validate_switches (const char *); ++static void validate_all_switches (void); ++static inline void validate_switches_from_spec (const char *); ++static void give_switch (int, int); ++static int used_arg (const char *, int); ++static int default_arg (const char *, int); ++static void set_multilib_dir (void); ++static void print_multilib_info (void); ++static void perror_with_name (const char *); ++static void pfatal_pexecute (const char *, const char *) ATTRIBUTE_NORETURN; ++static void notice (const char *, ...) ATTRIBUTE_PRINTF_1; ++static void display_help (void); ++static void add_preprocessor_option (const char *, int); ++static void add_assembler_option (const char *, int); ++static void add_linker_option (const char *, int); ++static void process_command (int, const char **); ++static int execute (void); ++static void alloc_args (void); ++static void clear_args (void); ++static void fatal_error (int); + #ifdef ENABLE_SHARED_LIBGCC +-static void init_gcc_specs PARAMS ((struct obstack *, +- const char *, const char *, +- const char *)); ++static void init_gcc_specs (struct obstack *, const char *, const char *, ++ const char *); + #endif + #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX) +-static const char *convert_filename PARAMS ((const char *, int, int)); ++static const char *convert_filename (const char *, int, int); + #endif + +-static const char *if_exists_spec_function PARAMS ((int, const char **)); +-static const char *if_exists_else_spec_function PARAMS ((int, const char **)); ++static const char *if_exists_spec_function (int, const char **); ++static const char *if_exists_else_spec_function (int, const char **); + + /* The Specs Language + +@@ -605,6 +663,12 @@ + with a file name chosen once per compilation, without regard + to any appended suffix (which was therefore treated just like + ordinary text), making such attacks more likely to succeed. ++ %|SUFFIX ++ like %g, but if -pipe is in effect, expands simply to "-". ++ %mSUFFIX ++ like %g, but if -pipe is in effect, expands to nothing. (We have both ++ %| and %m to accommodate differences between system assemblers; see ++ the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.) + %uSUFFIX + like %g, but generates a new temporary file name even if %uSUFFIX + was already seen. +@@ -633,6 +697,7 @@ + %w marks the argument containing or following the %w as the + "output file" of this compilation. This puts the argument + into the sequence of arguments that %o will substitute later. ++ %V indicates that this compilation produces no "output file". + %W{...} + like %{...} but mark last argument supplied within + as a file to be deleted on failure. +@@ -651,12 +716,9 @@ + except that %g, %u, and %U do not currently support additional + SUFFIX characters following %O as they would following, for + example, `.o'. +- %p substitutes the standard macro predefinitions for the +- current target machine. Use this when running cpp. +- %P like %p, but puts `__' before and after the name of each macro. +- (Except macros that already have __.) +- This is for ANSI C. +- %I Substitute a -iprefix option made from GCC_EXEC_PREFIX. ++ %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot ++ (made from TARGET_SYSTEM_ROOT), and -isystem (made from COMPILER_PATH ++ and -B options) as necessary. + %s current argument is the name of a library or startup file of some sort. + Search for that file in a standard list of directories + and substitute the full name found. +@@ -667,12 +729,6 @@ + %X Output the accumulated linker options specified by compilations. + %Y Output the accumulated assembler options specified by compilations. + %Z Output the accumulated preprocessor options specified by compilations. +- %v1 Substitute the major version number of GCC. +- (For version 2.5.3, this is 2.) +- %v2 Substitute the minor version number of GCC. +- (For version 2.5.3, this is 5.) +- %v3 Substitute the patch level number of GCC. +- (For version 2.5.3, this is 3.) + %a process ASM_SPEC as a spec. + This allows config.h to specify part of the spec for running as. + %A process ASM_FINAL_SPEC as a spec. A capital A is actually +@@ -690,10 +746,15 @@ + %C process CPP_SPEC as a spec. + %1 process CC1_SPEC as a spec. + %2 process CC1PLUS_SPEC as a spec. +- %| output "-" if the input for the current command is coming from a pipe. + %* substitute the variable part of a matched option. (See below.) + Note that each comma in the substituted string is replaced by + a single space. ++ %= 0; i--) + { +@@ -1895,7 +2040,12 @@ + #endif + , + "-lgcc", +- "-lgcc_eh"); ++ "-lgcc_eh" ++#ifdef USE_LIBUNWIND_EXCEPTIONS ++ " -lunwind" ++#endif ++ ); ++ + p += 5; + in_sep = 0; + } +@@ -1911,7 +2061,11 @@ + #endif + , + "libgcc.a%s", +- "libgcc_eh.a%s"); ++ "libgcc_eh.a%s" ++#ifdef USE_LIBUNWIND_EXCEPTIONS ++ " -lunwind" ++#endif ++ ); + p += 10; + in_sep = 0; + } +@@ -1951,9 +2105,7 @@ + current spec. */ + + static void +-set_spec (name, spec) +- const char *name; +- const char *spec; ++set_spec (const char *name, const char *spec) + { + struct spec_list *sl; + const char *old_spec; +@@ -1981,7 +2133,7 @@ + if (!sl) + { + /* Not found - make it. */ +- sl = (struct spec_list *) xmalloc (sizeof (struct spec_list)); ++ sl = xmalloc (sizeof (struct spec_list)); + sl->name = xstrdup (name); + sl->name_len = name_len; + sl->ptr_spec = &sl->ptr; +@@ -2003,7 +2155,7 @@ + + /* Free the old spec. */ + if (old_spec && sl->alloc_p) +- free ((PTR) old_spec); ++ free ((void *) old_spec); + + sl->alloc_p = 1; + } +@@ -2050,16 +2202,16 @@ + /* Allocate the argument vector. */ + + static void +-alloc_args () ++alloc_args (void) + { + argbuf_length = 10; +- argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *)); ++ argbuf = xmalloc (argbuf_length * sizeof (const char *)); + } + + /* Clear out the vector of arguments (after a command is executed). */ + + static void +-clear_args () ++clear_args (void) + { + argbuf_index = 0; + } +@@ -2072,14 +2224,10 @@ + and the file should be deleted if this compilation fails. */ + + static void +-store_arg (arg, delete_always, delete_failure) +- const char *arg; +- int delete_always, delete_failure; ++store_arg (const char *arg, int delete_always, int delete_failure) + { + if (argbuf_index + 1 == argbuf_length) +- argbuf +- = (const char **) xrealloc (argbuf, +- (argbuf_length *= 2) * sizeof (const char *)); ++ argbuf = xrealloc (argbuf, (argbuf_length *= 2) * sizeof (const char *)); + + argbuf[argbuf_index++] = arg; + argbuf[argbuf_index] = 0; +@@ -2093,8 +2241,7 @@ + a single \n. */ + + static char * +-load_specs (filename) +- const char *filename; ++load_specs (const char *filename) + { + int desc; + int readlen; +@@ -2158,9 +2305,7 @@ + Anything invalid in the file is a fatal error. */ + + static void +-read_specs (filename, main_p) +- const char *filename; +- int main_p; ++read_specs (const char *filename, int main_p) + { + char *buffer; + char *p; +@@ -2302,7 +2447,7 @@ + + set_spec (p2, *(sl->ptr_spec)); + if (sl->alloc_p) +- free ((PTR) *(sl->ptr_spec)); ++ free ((void *) *(sl->ptr_spec)); + + *(sl->ptr_spec) = ""; + sl->alloc_p = 0; +@@ -2372,9 +2517,8 @@ + { + /* Add this pair to the vector. */ + compilers +- = ((struct compiler *) +- xrealloc (compilers, +- (n_compilers + 2) * sizeof (struct compiler))); ++ = xrealloc (compilers, ++ (n_compilers + 2) * sizeof (struct compiler)); + + compilers[n_compilers].suffix = suffix; + compilers[n_compilers].spec = spec; +@@ -2430,10 +2574,7 @@ + otherwise delete it in any case. */ + + void +-record_temp_file (filename, always_delete, fail_delete) +- const char *filename; +- int always_delete; +- int fail_delete; ++record_temp_file (const char *filename, int always_delete, int fail_delete) + { + char *const name = xstrdup (filename); + +@@ -2444,7 +2585,7 @@ + if (! strcmp (name, temp->name)) + goto already1; + +- temp = (struct temp_file *) xmalloc (sizeof (struct temp_file)); ++ temp = xmalloc (sizeof (struct temp_file)); + temp->next = always_delete_queue; + temp->name = name; + always_delete_queue = temp; +@@ -2459,7 +2600,7 @@ + if (! strcmp (name, temp->name)) + goto already2; + +- temp = (struct temp_file *) xmalloc (sizeof (struct temp_file)); ++ temp = xmalloc (sizeof (struct temp_file)); + temp->next = failure_delete_queue; + temp->name = name; + failure_delete_queue = temp; +@@ -2471,8 +2612,7 @@ + /* Delete all the temporary files whose names we previously recorded. */ + + static void +-delete_if_ordinary (name) +- const char *name; ++delete_if_ordinary (const char *name) + { + struct stat st; + #ifdef DEBUG +@@ -2494,7 +2634,7 @@ + } + + static void +-delete_temp_files () ++delete_temp_files (void) + { + struct temp_file *temp; + +@@ -2524,7 +2664,7 @@ + /* Delete all the files to be deleted on error. */ + + static void +-delete_failure_queue () ++delete_failure_queue (void) + { + struct temp_file *temp; + +@@ -2533,7 +2673,7 @@ + } + + static void +-clear_failure_queue () ++clear_failure_queue (void) + { + failure_delete_queue = 0; + } +@@ -2545,10 +2685,8 @@ + It is also used by the --print-search-dirs flag. */ + + static char * +-build_search_list (paths, prefix, check_dir_p) +- struct path_prefix *paths; +- const char *prefix; +- int check_dir_p; ++build_search_list (struct path_prefix *paths, const char *prefix, ++ int check_dir_p) + { + int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0; + int just_suffix_len +@@ -2607,9 +2745,7 @@ + for collect. */ + + static void +-putenv_from_prefixes (paths, env_var) +- struct path_prefix *paths; +- const char *env_var; ++putenv_from_prefixes (struct path_prefix *paths, const char *env_var) + { + putenv (build_search_list (paths, env_var, 1)); + } +@@ -2858,9 +2994,7 @@ + except that it never considers directories to be executable. */ + + static int +-access_check (name, mode) +- const char *name; +- int mode; ++access_check (const char *name, int mode) + { + if (mode == X_OK) + { +@@ -2879,10 +3013,8 @@ + Return 0 if not found, otherwise return its name, allocated with malloc. */ + + static char * +-find_a_file (pprefix, name, mode, multilib) +- struct path_prefix *pprefix; +- const char *name; +- int mode, multilib; ++find_a_file (struct path_prefix *pprefix, const char *name, int mode, ++ int multilib) + { + char *temp; + const char *const file_suffix = +@@ -2924,7 +3056,7 @@ + + /* Determine the filename to execute (special case for absolute paths). */ + +- if (IS_ABSOLUTE_PATHNAME (name)) ++ if (IS_ABSOLUTE_PATH (name)) + { + if (access (name, mode) == 0) + { +@@ -3042,7 +3174,7 @@ + PREFIX_PRIORITY_LAST + }; + +-/* Add an entry for PREFIX in PLIST. The PLIST is kept in assending ++/* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending + order according to PRIORITY. Within each PRIORITY, new entries are + appended. + +@@ -3057,15 +3189,9 @@ + 2 means try both machine_suffix and just_machine_suffix. */ + + static void +-add_prefix (pprefix, prefix, component, priority, require_machine_suffix, +- warn, os_multilib) +- struct path_prefix *pprefix; +- const char *prefix; +- const char *component; +- /* enum prefix_priority */ int priority; +- int require_machine_suffix; +- int *warn; +- int os_multilib; ++add_prefix (struct path_prefix *pprefix, const char *prefix, ++ const char *component, /* enum prefix_priority */ int priority, ++ int require_machine_suffix, int *warn, int os_multilib) + { + struct prefix_list *pl, **prev; + int len; +@@ -3075,14 +3201,14 @@ + prev = &(*prev)->next) + ; + +- /* Keep track of the longest prefix */ ++ /* Keep track of the longest prefix. */ + + prefix = update_path (prefix, component); + len = strlen (prefix); + if (len > pprefix->max_len) + pprefix->max_len = len; + +- pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list)); ++ pl = xmalloc (sizeof (struct prefix_list)); + pl->prefix = prefix; + pl->require_machine_suffix = require_machine_suffix; + pl->used_flag_ptr = warn; +@@ -3091,11 +3217,36 @@ + if (warn) + *warn = 0; + +- /* Insert after PREV */ ++ /* Insert after PREV. */ + pl->next = (*prev); + (*prev) = pl; + } + ++/* Same as add_prefix, but prepending target_system_root to prefix. */ ++static void ++add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix, ++ const char *component, ++ /* enum prefix_priority */ int priority, ++ int require_machine_suffix, int *warn, int os_multilib) ++{ ++ if (!IS_ABSOLUTE_PATH (prefix)) ++ abort (); ++ ++ if (target_system_root) ++ { ++ if (target_sysroot_suffix) ++ prefix = concat (target_sysroot_suffix, prefix, NULL); ++ prefix = concat (target_system_root, prefix, NULL); ++ ++ /* We have to override this because GCC's notion of sysroot ++ moves along with GCC. */ ++ component = "GCC"; ++ } ++ ++ add_prefix (pprefix, prefix, component, priority, ++ require_machine_suffix, warn, os_multilib); ++} ++ + /* Execute the command specified by the arguments on the current line of spec. + When using pipes, this includes several piped-together commands + with `|' between them. +@@ -3103,7 +3254,7 @@ + Return 0 if successful, -1 if failed. */ + + static int +-execute () ++execute (void) + { + int i; + int n_commands; /* # of command. */ +@@ -3126,7 +3277,7 @@ + n_commands++; + + /* Get storage for each command. */ +- commands = (struct command *) alloca (n_commands * sizeof (struct command)); ++ commands = alloca (n_commands * sizeof (struct command)); + + /* Split argbuf into its separate piped processes, + and record info about each one. +@@ -3196,7 +3347,14 @@ + } + fflush (stderr); + if (verbose_only_flag != 0) ++ { ++ /* verbose_only_flag should act as if the spec was ++ executed, so increment execution_count before ++ returning. This prevents spurious warnings about ++ unused linker input files, etc. */ ++ execution_count++; + return 0; ++ } + #ifdef DEBUG + notice ("\nGo ahead? (y or n) "); + fflush (stderr); +@@ -3211,7 +3369,7 @@ + } + + #ifdef ENABLE_VALGRIND_CHECKING +- /* Run the each command through valgrind. To simplifiy prepending the ++ /* Run the each command through valgrind. To simplify prepending the + path to valgrind and the option "-q" (for quiet operation unless + something triggers), we allocate a separate argv array. */ + +@@ -3259,7 +3417,7 @@ + pfatal_pexecute (errmsg_fmt, errmsg_arg); + + if (string != commands[i].prog) +- free ((PTR) string); ++ free ((void *) string); + } + + execution_count++; +@@ -3361,7 +3519,7 @@ + 0 when initialized + 1 if the switch is true in a conditional spec, + -1 if false (overridden by a later switch) +- -2 if this switch should be ignored (used in %{ Pass comma-separated on to the assembler\n"), stdout); + fputs (_(" -Wp, Pass comma-separated on to the preprocessor\n"), stdout); + fputs (_(" -Wl, Pass comma-separated on to the linker\n"), stdout); ++ fputs (_(" -Xassembler Pass on to the assembler\n"), stdout); ++ fputs (_(" -Xpreprocessor Pass on to the preprocessor\n"), stdout); + fputs (_(" -Xlinker Pass on to the linker\n"), stdout); + fputs (_(" -save-temps Do not delete intermediate files\n"), stdout); + fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout); +@@ -3531,18 +3694,14 @@ + } + + static void +-add_preprocessor_option (option, len) +- const char *option; +- int len; ++add_preprocessor_option (const char *option, int len) + { + n_preprocessor_options++; + + if (! preprocessor_options) +- preprocessor_options +- = (char **) xmalloc (n_preprocessor_options * sizeof (char *)); ++ preprocessor_options = xmalloc (n_preprocessor_options * sizeof (char *)); + else +- preprocessor_options +- = (char **) xrealloc (preprocessor_options, ++ preprocessor_options = xrealloc (preprocessor_options, + n_preprocessor_options * sizeof (char *)); + + preprocessor_options [n_preprocessor_options - 1] = +@@ -3550,36 +3709,28 @@ + } + + static void +-add_assembler_option (option, len) +- const char *option; +- int len; ++add_assembler_option (const char *option, int len) + { + n_assembler_options++; + + if (! assembler_options) +- assembler_options +- = (char **) xmalloc (n_assembler_options * sizeof (char *)); ++ assembler_options = xmalloc (n_assembler_options * sizeof (char *)); + else +- assembler_options +- = (char **) xrealloc (assembler_options, ++ assembler_options = xrealloc (assembler_options, + n_assembler_options * sizeof (char *)); + + assembler_options [n_assembler_options - 1] = save_string (option, len); + } + + static void +-add_linker_option (option, len) +- const char *option; +- int len; ++add_linker_option (const char *option, int len) + { + n_linker_options++; + + if (! linker_options) +- linker_options +- = (char **) xmalloc (n_linker_options * sizeof (char *)); ++ linker_options = xmalloc (n_linker_options * sizeof (char *)); + else +- linker_options +- = (char **) xrealloc (linker_options, ++ linker_options = xrealloc (linker_options, + n_linker_options * sizeof (char *)); + + linker_options [n_linker_options - 1] = save_string (option, len); +@@ -3589,9 +3740,7 @@ + Store its length in `n_switches'. */ + + static void +-process_command (argc, argv) +- int argc; +- const char *const *argv; ++process_command (int argc, const char **argv) + { + int i; + const char *temp; +@@ -3687,34 +3836,55 @@ + /* Set up the default search paths. If there is no GCC_EXEC_PREFIX, + see if we can create it from the pathname specified in argv[0]. */ + ++ gcc_libexec_prefix = standard_libexec_prefix; + #ifndef VMS + /* FIXME: make_relative_prefix doesn't yet work for VMS. */ + if (!gcc_exec_prefix) + { + gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix, + standard_exec_prefix); ++ gcc_libexec_prefix = make_relative_prefix (argv[0], ++ standard_bindir_prefix, ++ standard_libexec_prefix); + if (gcc_exec_prefix) + putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL)); + } ++ else ++ gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix, ++ standard_exec_prefix, ++ standard_libexec_prefix); ++#else + #endif + + if (gcc_exec_prefix) + { + int len = strlen (gcc_exec_prefix); +- ++#ifndef GCC_3_4 + if (len > (int) sizeof ("/lib/gcc-lib/") - 1 ++#else ++ if (len > (int) sizeof ("/lib/gcc/") - 1 ++#endif + && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1]))) + { ++#ifndef GCC_3_4 + temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1; ++#else ++ temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1; ++#endif + if (IS_DIR_SEPARATOR (*temp) + && strncmp (temp + 1, "lib", 3) == 0 +- && IS_DIR_SEPARATOR (temp[4]) ++ && IS_DIR_SEPARATOR (temp[5]) ++#ifndef GCC_3_4 + && strncmp (temp + 5, "gcc-lib", 7) == 0) + len -= sizeof ("/lib/gcc-lib/") - 1; ++#else ++ && strncmp (temp + 5, "gcc", 3) == 0) ++ len -= sizeof ("/lib/gcc/") - 1; ++#endif + } + + set_std_prefix (gcc_exec_prefix, len); +- add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", ++ add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC", + PREFIX_PRIORITY_LAST, 0, NULL, 0); + add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", + PREFIX_PRIORITY_LAST, 0, NULL, 0); +@@ -3727,7 +3897,7 @@ + if (temp) + { + const char *startp, *endp; +- char *nstore = (char *) alloca (strlen (temp) + 3); ++ char *nstore = alloca (strlen (temp) + 3); + + startp = endp = temp; + while (1) +@@ -3762,7 +3932,7 @@ + if (temp && *cross_compile == '0') + { + const char *startp, *endp; +- char *nstore = (char *) alloca (strlen (temp) + 3); ++ char *nstore = alloca (strlen (temp) + 3); + + startp = endp = temp; + while (1) +@@ -3795,7 +3965,7 @@ + if (temp && *cross_compile == '0') + { + const char *startp, *endp; +- char *nstore = (char *) alloca (strlen (temp) + 3); ++ char *nstore = alloca (strlen (temp) + 3); + + startp = endp = temp; + while (1) +@@ -3829,11 +3999,11 @@ + #endif + + /* Convert new-style -- options to old-style. */ +- translate_options (&argc, &argv); ++ translate_options (&argc, (const char *const **) &argv); + + #ifdef LANG_SPECIFIC_DRIVER + /* Do language-specific adjustment/addition of flags. */ +- lang_specific_driver (&argc, &argv, &added_libraries); ++ lang_specific_driver (&argc, (const char *const **) &argv, &added_libraries); + #endif + + /* Scan argv twice. Here, the first time, just count how many switches +@@ -3866,8 +4036,8 @@ + { + /* translate_options () has turned --version into -fversion. */ + printf (_("%s %s, based on gcc-%s\n"), programname, GPC_RELEASE_STRING, version_string); +- fputs (_("Copyright (C) 1987-2004 Free Software Foundation, Inc.\n"), +- stdout); ++ printf ("Copyright %s 2004 Free Software Foundation, Inc.\n", ++ _("(C)")); + fputs (_("This is free software; see the source for copying conditions. There is NO\n\ + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"), + stdout); +@@ -3974,6 +4144,20 @@ + n_infiles++; + i++; + } ++ else if (strcmp (argv[i], "-Xpreprocessor") == 0) ++ { ++ if (i + 1 == argc) ++ fatal ("argument to `-Xpreprocessor' is missing"); ++ ++ add_preprocessor_option (argv[i+1], strlen (argv[i+1])); ++ } ++ else if (strcmp (argv[i], "-Xassembler") == 0) ++ { ++ if (i + 1 == argc) ++ fatal ("argument to `-Xassembler' is missing"); ++ ++ add_assembler_option (argv[i+1], strlen (argv[i+1])); ++ } + else if (strcmp (argv[i], "-l") == 0) + { + if (i + 1 == argc) +@@ -3991,8 +4175,7 @@ + } + else if (strcmp (argv[i], "-specs") == 0) + { +- struct user_specs *user = (struct user_specs *) +- xmalloc (sizeof (struct user_specs)); ++ struct user_specs *user = xmalloc (sizeof (struct user_specs)); + if (++i >= argc) + fatal ("argument to `-specs' is missing"); + +@@ -4006,8 +4189,7 @@ + } + else if (strncmp (argv[i], "-specs=", 7) == 0) + { +- struct user_specs *user = (struct user_specs *) +- xmalloc (sizeof (struct user_specs)); ++ struct user_specs *user = xmalloc (sizeof (struct user_specs)); + if (strlen (argv[i]) == 7) + fatal ("argument to `-specs=' is missing"); + +@@ -4021,6 +4203,13 @@ + } + else if (strcmp (argv[i], "-time") == 0) + report_times = 1; ++ else if (strcmp (argv[i], "-pipe") == 0) ++ { ++ /* -pipe has to go into the switches array as well as ++ setting a flag. */ ++ use_pipes = 1; ++ n_switches++; ++ } + else if (strcmp (argv[i], "-###") == 0) + { + /* This is similar to -v except that there is no execution +@@ -4176,8 +4365,7 @@ + for (j = 0; j < ARRAY_SIZE (modify_target); j++) + if (! strcmp (argv[i], modify_target[j].sw)) + { +- char *new_name +- = (char *) xmalloc (strlen (modify_target[j].str) ++ char *new_name = xmalloc (strlen (modify_target[j].str) + + strlen (spec_machine)); + const char *p, *r; + char *q; +@@ -4223,8 +4411,20 @@ + } + } + +- if (have_c && have_o && lang_n_infiles > 1) +- fatal ("cannot specify -o with -c or -S and multiple compilations"); ++ combine_inputs = (have_c && have_o && lang_n_infiles > 1); ++ ++ if ((save_temps_flag || report_times) && use_pipes) ++ { ++ /* -save-temps overrides -pipe, so that temp files are produced */ ++ if (save_temps_flag) ++ error ("warning: -pipe ignored because -save-temps specified"); ++ /* -time overrides -pipe because we can't get correct stats when ++ multiple children are running at once. */ ++ else if (report_times) ++ error ("warning: -pipe ignored because -time specified"); ++ ++ use_pipes = 0; ++ } + + /* Set up the search paths before we go looking for config files. */ + +@@ -4233,17 +4433,21 @@ + /* Use 2 as fourth arg meaning try just the machine as a suffix, + as well as trying the machine and the version. */ + #ifndef OS2 +- add_prefix (&exec_prefixes, standard_exec_prefix, "GCC", ++ add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC", + PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0); ++ add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS", ++ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0); + add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS", + PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0); + add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS", + PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0); ++ add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS", ++ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0); + #endif + + add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS", + PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0); +- add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS", ++ add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS", + PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0); + + tooldir_prefix = concat (tooldir_base_prefix, spec_machine, +@@ -4256,7 +4460,7 @@ + directories, so that we can search both the user specified directory + and the standard place. */ + +- if (!IS_ABSOLUTE_PATHNAME (tooldir_prefix)) ++ if (!IS_ABSOLUTE_PATH (tooldir_prefix)) + { + if (gcc_exec_prefix) + { +@@ -4286,14 +4490,31 @@ + concat (tooldir_prefix, "lib", dir_separator_str, NULL), + "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1); + ++#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS) ++ /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix, ++ then consider it to relocate with the rest of the GCC installation ++ if GCC_EXEC_PREFIX is set. ++ ``make_relative_prefix'' is not compiled for VMS, so don't call it. */ ++ if (target_system_root && gcc_exec_prefix) ++ { ++ char *tmp_prefix = make_relative_prefix (argv[0], ++ standard_bindir_prefix, ++ target_system_root); ++ if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0) ++ { ++ target_system_root = tmp_prefix; ++ target_system_root_changed = 1; ++ } ++ } ++#endif ++ + /* More prefixes are enabled in main, after we read the specs file + and determine whether this is cross-compilation or not. */ + + /* Then create the space for the vectors and scan again. */ + +- switches = ((struct switchstr *) +- xmalloc ((n_switches + 1) * sizeof (struct switchstr))); +- infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile)); ++ switches = xmalloc ((n_switches + 1) * sizeof (struct switchstr)); ++ infiles = xmalloc ((n_infiles + 1) * sizeof (struct infile)); + n_switches = 0; + n_infiles = 0; + last_language_n_infiles = -1; +@@ -4375,6 +4596,16 @@ + infiles[n_infiles].language = "*"; + infiles[n_infiles++].name = argv[++i]; + } ++ else if (strcmp (argv[i], "-Xassembler") == 0) ++ { ++ infiles[n_infiles].language = "*"; ++ infiles[n_infiles++].name = argv[++i]; ++ } ++ else if (strcmp (argv[i], "-Xpreprocessor") == 0) ++ { ++ infiles[n_infiles].language = "*"; ++ infiles[n_infiles++].name = argv[++i]; ++ } + else if (strcmp (argv[i], "-l") == 0) + { /* POSIX allows separation of -l and the lib arg; + canonicalize by concatenating -l with its arg */ +@@ -4392,17 +4623,6 @@ + ; + else if (strcmp (argv[i], "-time") == 0) + ; +- else if ((save_temps_flag || report_times) +- && strcmp (argv[i], "-pipe") == 0) +- { +- /* -save-temps overrides -pipe, so that temp files are produced */ +- if (save_temps_flag) +- error ("warning: -pipe ignored because -save-temps specified"); +- /* -time overrides -pipe because we can't get correct stats when +- multiple children are running at once. */ +- else if (report_times) +- error ("warning: -pipe ignored because -time specified"); +- } + else if (strcmp (argv[i], "-###") == 0) + ; + else if (argv[i][0] == '-' && argv[i][1] != 0) +@@ -4443,7 +4663,7 @@ + if (i + n_args >= argc) + fatal ("argument to `-%s' is missing", p); + switches[n_switches].args +- = (const char **) xmalloc ((n_args + 1) * sizeof(const char *)); ++ = xmalloc ((n_args + 1) * sizeof(const char *)); + while (j < n_args) + switches[n_switches].args[j++] = argv[++i]; + /* Null-terminate the vector. */ +@@ -4453,13 +4673,12 @@ + { + /* On some systems, ld cannot handle some options without + a space. So split the option from its argument. */ +- char *part1 = (char *) xmalloc (2); ++ char *part1 = xmalloc (2); + part1[0] = c; + part1[1] = '\0'; + + switches[n_switches].part1 = part1; +- switches[n_switches].args +- = (const char **) xmalloc (2 * sizeof (const char *)); ++ switches[n_switches].args = xmalloc (2 * sizeof (const char *)); + switches[n_switches].args[0] = xstrdup (p+1); + switches[n_switches].args[1] = 0; + } +@@ -4469,10 +4688,11 @@ + switches[n_switches].live_cond = SWITCH_OK; + switches[n_switches].validated = 0; + switches[n_switches].ordering = 0; +- /* These are always valid, since gcc.c itself understands it. */ ++ /* These are always valid, since gcc.c itself understands them. */ + if (!strcmp (p, "save-temps") + || !strcmp (p, "static-libgcc") +- || !strcmp (p, "shared-libgcc")) ++ || !strcmp (p, "shared-libgcc") ++ || !strcmp (p, "pipe")) + switches[n_switches].validated = 1; + else + { +@@ -4539,11 +4759,11 @@ + infiles[n_infiles].name = 0; + } + +-/* Store switches not filtered out by %{ 0 && !strcmp (argbuf[argbuf_index - 1], "|")) + { +- for (i = 0; i < n_switches; i++) +- if (!strcmp (switches[i].part1, "pipe")) +- break; +- + /* A `|' before the newline means use a pipe here, + but only if -pipe was specified. + Otherwise, execute now and don't pass the `|' as an arg. */ +- if (i < n_switches) ++ if (use_pipes) + { + input_from_pipe = 1; +- switches[i].validated = 1; + break; + } + else +@@ -4878,7 +5154,7 @@ + { + struct prefix_list *pl = startfile_prefixes.plist; + size_t bufsize = 100; +- char *buffer = (char *) xmalloc (bufsize); ++ char *buffer = xmalloc (bufsize); + int idx; + + for (; pl; pl = pl->next) +@@ -4889,7 +5165,7 @@ + /* Relative directories always come from -B, + and it is better not to use them for searching + at run time. In particular, stage1 loses. */ +- if (!IS_ABSOLUTE_PATHNAME (pl->prefix)) ++ if (!IS_ABSOLUTE_PATH (pl->prefix)) + continue; + #endif + /* Try subdirectory if there is one. */ +@@ -4906,7 +5182,7 @@ + >= bufsize) + bufsize = (strlen (pl->prefix) + + strlen (machine_suffix)) * 2 + 1; +- buffer = (char *) xrealloc (buffer, bufsize); ++ buffer = xrealloc (buffer, bufsize); + strcpy (buffer, pl->prefix); + strcat (buffer, machine_suffix); + if (is_directory (buffer, multilib_dir, 1)) +@@ -4948,7 +5224,7 @@ + /* Remove slash from machine_suffix. */ + if (strlen (machine_suffix) >= bufsize) + bufsize = strlen (machine_suffix) * 2 + 1; +- buffer = (char *) xrealloc (buffer, bufsize); ++ buffer = xrealloc (buffer, bufsize); + strcpy (buffer, machine_suffix); + idx = strlen (buffer); + if (IS_DIR_SEPARATOR (buffer[idx - 1])) +@@ -4969,7 +5245,7 @@ + /* Remove slash from pl->prefix. */ + if (strlen (pl->prefix) >= bufsize) + bufsize = strlen (pl->prefix) * 2 + 1; +- buffer = (char *) xrealloc (buffer, bufsize); ++ buffer = xrealloc (buffer, bufsize); + strcpy (buffer, pl->prefix); + idx = strlen (buffer); + if (IS_DIR_SEPARATOR (buffer[idx - 1])) +@@ -4992,7 +5268,7 @@ + char *buf; + while (*p != 0 && *p != '\n') + p++; +- buf = (char *) alloca (p - q + 1); ++ buf = alloca (p - q + 1); + strncpy (buf, q, p - q); + buf[p - q] = 0; + error ("%s", buf); +@@ -5006,7 +5282,7 @@ + char *buf; + while (*p != 0 && *p != '\n') + p++; +- buf = (char *) alloca (p - q + 1); ++ buf = alloca (p - q + 1); + strncpy (buf, q, p - q); + buf[p - q] = 0; + notice ("%s\n", buf); +@@ -5019,10 +5295,10 @@ + { + struct stat st; + +- /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined, +- and it is not a directory, and it is writable, use it. +- Otherwise, fall through and treat this like any other +- temporary file. */ ++ /* If save_temps_flag is off, and the HOST_BIT_BUCKET is ++ defined, and it is not a directory, and it is ++ writable, use it. Otherwise, treat this like any ++ other temporary file. */ + + if ((!save_temps_flag) + && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode)) +@@ -5035,9 +5311,45 @@ + break; + } + } ++ goto create_temp_file; ++ case '|': ++ if (use_pipes) ++#ifdef GCC_3_4 ++ { ++ obstack_1grow (&obstack, '-'); ++ delete_this_arg = 0; ++ arg_going = 1; ++ ++ /* consume suffix */ ++ while (*p == '.' || ISALPHA ((unsigned char) *p)) ++ p++; ++ if (p[0] == '%' && p[1] == 'O') ++ p += 2; ++ ++ break; ++ } ++ goto create_temp_file; ++#else ++ do_spec_1 ("-", 0, NULL); ++ break; ++#endif ++ ++ case 'm': ++ if (use_pipes) ++ { ++ /* consume suffix */ ++ while (*p == '.' || ISALPHA ((unsigned char) *p)) ++ p++; ++ if (p[0] == '%' && p[1] == 'O') ++ p += 2; ++ ++ break; ++ } ++ goto create_temp_file; + case 'g': + case 'u': + case 'U': ++ create_temp_file: + { + struct temp_name *t; + int suffix_length; +@@ -5058,7 +5370,7 @@ + else + { + saved_suffix +- = (char *) xmalloc (suffix_length ++ = xmalloc (suffix_length + + strlen (TARGET_OBJECT_SUFFIX)); + strncpy (saved_suffix, suffix, suffix_length); + strcpy (saved_suffix + suffix_length, +@@ -5121,7 +5433,7 @@ + for (t = temp_names; t; t = t->next) + if (t->length == suffix_length + && strncmp (t->suffix, suffix, suffix_length) == 0 +- && t->unique == (c != 'g')) ++ && t->unique == (c == 'u' || c == 'U' || c == 'j')) + break; + + /* Make a new association if needed. %u and %j +@@ -5130,7 +5442,7 @@ + { + if (t == 0) + { +- t = (struct temp_name *) xmalloc (sizeof (struct temp_name)); ++ t = xmalloc (sizeof (struct temp_name)); + t->next = temp_names; + temp_names = t; + } +@@ -5142,7 +5454,7 @@ + } + else + t->suffix = save_string (suffix, suffix_length); +- t->unique = (c != 'g'); ++ t->unique = (c == 'u' || c == 'U' || c == 'j'); + temp_filename = make_temp_file (t->suffix); + temp_filename_length = strlen (temp_filename); + t->filename = temp_filename; +@@ -5159,8 +5471,16 @@ + break; + + case 'i': ++ if (combine_inputs) ++ { ++ for (i = 0; (int) i < n_infiles; i++) ++ store_arg (infiles[i].name, 0, 0); ++ } ++ else ++ { + obstack_grow (&obstack, input_filename, input_filename_length); + arg_going = 1; ++ } + break; + + case 'I': +@@ -5176,6 +5496,18 @@ + do_spec_1 (" ", 0, NULL); + } + ++ if (target_system_root_changed || ++ (target_system_root && target_sysroot_hdrs_suffix)) ++ { ++ do_spec_1 ("-isysroot", 1, NULL); ++ /* Make this a separate argument. */ ++ do_spec_1 (" ", 0, NULL); ++ do_spec_1 (target_system_root, 1, NULL); ++ if (target_sysroot_hdrs_suffix) ++ do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL); ++ do_spec_1 (" ", 0, NULL); ++ } ++ + for (; pl; pl = pl->next) + { + do_spec_1 ("-isystem", 1, NULL); +@@ -5207,6 +5539,10 @@ + this_is_library_file = 1; + break; + ++ case 'V': ++ outfiles[input_file_number] = NULL; ++ break; ++ + case 'w': + this_is_output_file = 1; + break; +@@ -5247,6 +5583,18 @@ + p = handle_braces (p + 1); + if (p == 0) + return -1; ++ /* End any pending argument. */ ++ if (arg_going) ++ { ++ obstack_1grow (&obstack, 0); ++ string = obstack_finish (&obstack); ++ if (this_is_library_file) ++ string = find_file (string); ++ store_arg (string, delete_this_arg, this_is_output_file); ++ if (this_is_output_file) ++ outfiles[input_file_number] = string; ++ arg_going = 0; ++ } + /* If any args were output, mark the last one for deletion + on failure. */ + if (argbuf_index != cur_index) +@@ -5555,6 +5903,19 @@ + } + break; + ++ case 'R': ++ /* We assume there is a directory ++ separator at the end of this string. */ ++ if (target_system_root) ++ { ++ obstack_grow (&obstack, target_system_root, ++ strlen (target_system_root)); ++ if (target_sysroot_suffix) ++ obstack_grow (&obstack, target_sysroot_suffix, ++ strlen (target_sysroot_suffix)); ++ } ++ break; ++ + case 'S': + value = do_spec_1 (startfile_spec, 0, NULL); + if (value != 0) +@@ -5590,6 +5951,32 @@ + } + break; + ++ /* Henceforth ignore the option(s) matching the pattern ++ after the %<. */ ++ case '<': ++ { ++ unsigned len = 0; ++ int have_wildcard = 0; ++ int i; ++ ++ while (p[len] && p[len] != ' ' && p[len] != '\t') ++ len++; ++ ++ if (p[len-1] == '*') ++ have_wildcard = 1; ++ ++ for (i = 0; i < n_switches; i++) ++ if (!strncmp (switches[i].part1, p, len - have_wildcard) ++ && (have_wildcard || switches[i].part1[len] == '\0')) ++ { ++ switches[i].live_cond = SWITCH_IGNORE; ++ switches[i].validated = 1; ++ } ++ ++ p += len; ++ } ++ break; ++ + case '*': + if (soft_matched_part) + { +@@ -5645,7 +6032,7 @@ + } + else + { +- char *x = (char *) alloca (strlen (name) * 2 + 1); ++ char *x = alloca (strlen (name) * 2 + 1); + char *buf = x; + const char *y = name; + int flag = 0; +@@ -5748,11 +6135,6 @@ + } + break; + +- case '|': +- if (input_from_pipe) +- do_spec_1 ("-", 0, NULL); +- break; +- + default: + error ("spec failure: unrecognized spec option '%c'", c); + break; +@@ -5763,7 +6145,7 @@ + /* Backslash: treat next character as ordinary. */ + c = *p++; + +- /* fall through */ ++ /* Fall through. */ + default: + /* Ordinary character: put it into the current argument. */ + obstack_1grow (&obstack, c); +@@ -5790,8 +6172,7 @@ + /* Look up a spec function. */ + + static const struct spec_function * +-lookup_spec_function (name) +- const char *name; ++lookup_spec_function (const char *name) + { + static const struct spec_function * const spec_function_tables[] = + { +@@ -5814,8 +6195,7 @@ + /* Evaluate a spec function. */ + + static const char * +-eval_spec_function (func, args) +- const char *func, *args; ++eval_spec_function (const char *func, const char *args) + { + const struct spec_function *sf; + const char *funcval; +@@ -5887,8 +6267,7 @@ + NULL if no processing is required. */ + + static const char * +-handle_spec_function (p) +- const char *p; ++handle_spec_function (const char *p) + { + char *func, *args; + const char *endp, *funcval; +@@ -5943,273 +6322,305 @@ + return p; + } + +-/* Return 0 if we call do_spec_1 and that returns -1. */ ++/* Inline subroutine of handle_braces. Returns true if the current ++ input suffix matches the atom bracketed by ATOM and END_ATOM. */ ++static inline bool ++input_suffix_matches (const char *atom, const char *end_atom) ++{ ++ return (input_suffix ++ && !strncmp (input_suffix, atom, end_atom - atom) ++ && input_suffix[end_atom - atom] == '\0'); ++} + +-static const char * +-handle_braces (p) +- const char *p; ++/* Inline subroutine of handle_braces. Returns true if a switch ++ matching the atom bracketed by ATOM and END_ATOM appeared on the ++ command line. */ ++static inline bool ++switch_matches (const char *atom, const char *end_atom, int starred) + { +- const char *filter, *body = NULL, *endbody = NULL; +- int pipe_p = 0; +- int true_once = 0; /* If, in %{a|b:d}, at least one of a,b was seen. */ +- int negate; +- int suffix; +- int include_blanks = 1; +- int elide_switch = 0; +- int ordered = 0; +- +- if (*p == '^') +- { +- /* A '^' after the open-brace means to not give blanks before args. */ +- include_blanks = 0; +- ++p; +- } +- +- if (*p == '|') +- { +- /* A `|' after the open-brace means, +- if the test fails, output a single minus sign rather than nothing. +- This is used in %{|!pipe:...}. */ +- pipe_p = 1; +- ++p; +- } +- +- if (*p == '<') +- { +- /* A `<' after the open-brace means that the switch should be +- removed from the command-line. */ +- elide_switch = 1; +- ++p; +- } +- +-next_member: +- negate = suffix = 0; ++ int i; ++ int len = end_atom - atom; ++ int plen = starred ? len : -1; + +- if (*p == '!') +- /* A `!' after the open-brace negates the condition: +- succeed if the specified switch is not present. */ +- negate = 1, ++p; ++ for (i = 0; i < n_switches; i++) ++ if (!strncmp (switches[i].part1, atom, len) ++ && (starred || switches[i].part1[len] == '\0') ++ && check_live_switch (i, plen)) ++ return true; ++ ++ return false; ++} ++ ++/* Inline subroutine of handle_braces. Mark all of the switches which ++ match ATOM (extends to END_ATOM; STARRED indicates whether there ++ was a star after the atom) for later processing. */ ++static inline void ++mark_matching_switches (const char *atom, const char *end_atom, int starred) ++{ ++ int i; ++ int len = end_atom - atom; ++ int plen = starred ? len : -1; + +- if (*p == '.') +- /* A `.' after the open-brace means test against the current suffix. */ +- { +- if (pipe_p) +- abort (); ++ for (i = 0; i < n_switches; i++) ++ if (!strncmp (switches[i].part1, atom, len) ++ && (starred || switches[i].part1[len] == '\0') ++ && check_live_switch (i, plen)) ++ switches[i].ordering = 1; ++} + +- suffix = 1; +- ++p; +- } ++/* Inline subroutine of handle_braces. Process all the currently ++ marked switches through give_switch, and clear the marks. */ ++static inline void ++process_marked_switches (void) ++{ ++ int i; + +- if (elide_switch && (negate || pipe_p || suffix)) ++ for (i = 0; i < n_switches; i++) ++ if (switches[i].ordering == 1) + { +- /* It doesn't make sense to mix elision with other flags. We +- could fatal() here, but the standard seems to be to abort. */ +- abort (); ++ switches[i].ordering = 0; ++ give_switch (i, 0); + } ++} + +- next_ampersand: +- filter = p; +- while (*p != ':' && *p != '}' && *p != '|' && *p != '&') +- p++; +- +- if (*p == '|' && (pipe_p || ordered)) +- abort (); ++/* Handle a %{ ... } construct. P points just inside the leading {. ++ Returns a pointer one past the end of the brace block, or 0 ++ if we call do_spec_1 and that returns -1. */ + +- if (!body) +- { +- if (*p != '}' && *p != '&') +- { +- int count = 1; +- const char *q = p; ++static const char * ++handle_braces (const char *p) ++{ ++ const char *atom, *end_atom; ++ const char *d_atom = NULL, *d_end_atom = NULL; + +- while (*q++ != ':') +- continue; +- body = q; ++ bool a_is_suffix; ++ bool a_is_starred; ++ bool a_is_negated; ++ bool a_matched; ++ ++ bool a_must_be_last = false; ++ bool ordered_set = false; ++ bool disjunct_set = false; ++ bool disj_matched = false; ++ bool disj_starred = true; ++ bool n_way_choice = false; ++ bool n_way_matched = false; ++ bool pipe_p = false; + +- while (count > 0) +- { +- if (*q == '{') +- count++; +- else if (*q == '}') +- count--; +- else if (*q == 0) +- fatal ("mismatched braces in specs"); +- q++; +- } +- endbody = q; +- } +- else +- body = p, endbody = p + 1; +- } ++#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0) + +- if (suffix) ++ do + { +- int found = (input_suffix != 0 +- && (long) strlen (input_suffix) == (long) (p - filter) +- && strncmp (input_suffix, filter, p - filter) == 0); +- +- if (body[0] == '}') ++ if (a_must_be_last) ++ abort (); ++ if (*p == '|') ++ { ++ /* A `|' after the open-brace means, if the test fails, ++ output a single minus sign rather than nothing. ++ This is used in %{|!pipe:...}. */ ++ a_must_be_last = pipe_p = true; ++ p++; ++ } ++ ++ /* Scan one "atom" (S in the description above of %{}, possibly ++ with !, ., or * modifiers). */ ++ a_matched = a_is_suffix = a_is_starred = a_is_negated = false; ++ ++ SKIP_WHITE(); ++ if (*p == '!') ++ p++, a_is_negated = true; ++ ++ SKIP_WHITE(); ++ if (*p == '.') ++ p++, a_is_suffix = true; ++ ++ atom = p; ++ while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '=' ++ || *p == ',' || *p == '.' || *p == '@' || *p == '$') ++ p++; ++ end_atom = p; ++ ++ if (*p == '*') ++ p++, a_is_starred = 1; ++ ++ SKIP_WHITE(); ++ if (*p == '&' || *p == '}') ++ { ++ /* Substitute the switch(es) indicated by the current atom. */ ++ ordered_set = true; ++ if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix ++ || atom == end_atom) + abort (); + +- if (negate != found +- && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0) +- return 0; ++ mark_matching_switches (atom, end_atom, a_is_starred); ++ ++ if (*p == '}') ++ process_marked_switches (); + } +- else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&')) ++ else if (*p == '|' || *p == ':') + { +- /* Substitute all matching switches as separate args. */ +- int i; ++ /* Substitute some text if the current atom appears as a switch ++ or suffix. */ ++ disjunct_set = true; ++ if (ordered_set) ++ abort (); + +- for (i = 0; i < n_switches; i++) +- if (!strncmp (switches[i].part1, filter, p - 1 - filter) +- && check_live_switch (i, p - 1 - filter)) +- { +- if (elide_switch) ++ if (atom == end_atom) + { +- switches[i].live_cond = SWITCH_IGNORE; +- switches[i].validated = 1; +- } +- else +- ordered = 1, switches[i].ordering = 1; +- } ++ if (!n_way_choice || disj_matched || *p == '|' ++ || a_is_negated || a_is_suffix || a_is_starred) ++ abort (); ++ ++ /* An empty term may appear as the last choice of an ++ N-way choice set; it means "otherwise". */ ++ a_must_be_last = true; ++ disj_matched = !n_way_matched; ++ disj_starred = false; + } + else + { +- /* Test for presence of the specified switch. */ +- int i; +- int present = 0; ++ if (a_is_suffix && a_is_starred) ++ abort (); + +- /* If name specified ends in *, as in {x*:...}, +- check for %* and handle that case. */ +- if (p[-1] == '*' && !negate) +- { +- int substitution; +- const char *r = body; ++ if (!a_is_starred) ++ disj_starred = false; + +- /* First see whether we have %*. */ +- substitution = 0; +- while (r < endbody) +- { +- if (*r == '%' && r[1] == '*') +- substitution = 1; +- r++; +- } +- /* If we do, handle that case. */ +- if (substitution) +- { +- /* Substitute all matching switches as separate args. +- But do this by substituting for %* +- in the text that follows the colon. */ +- +- unsigned hard_match_len = p - filter - 1; +- char *string = save_string (body, endbody - body - 1); ++ /* Don't bother testing this atom if we already have a ++ match. */ ++ if (!disj_matched && !n_way_matched) ++ { ++ if (a_is_suffix) ++ a_matched = input_suffix_matches (atom, end_atom); ++ else ++ a_matched = switch_matches (atom, end_atom, a_is_starred); + +- for (i = 0; i < n_switches; i++) +- if (!strncmp (switches[i].part1, filter, hard_match_len) +- && check_live_switch (i, -1)) ++ if (a_matched != a_is_negated) + { +- do_spec_1 (string, 0, &switches[i].part1[hard_match_len]); +- /* Pass any arguments this switch has. */ +- give_switch (i, 1, 1); +- suffix_subst = NULL; ++ disj_matched = true; ++ d_atom = atom; ++ d_end_atom = end_atom; + } +- +- /* We didn't match. Try again. */ +- if (*p++ == '|') +- goto next_member; +- return endbody; + } + } + +- /* If name specified ends in *, as in {x*:...}, +- check for presence of any switch name starting with x. */ +- if (p[-1] == '*') ++ if (*p == ':') + { +- for (i = 0; i < n_switches; i++) +- { +- unsigned hard_match_len = p - filter - 1; +- +- if (!strncmp (switches[i].part1, filter, hard_match_len) +- && check_live_switch (i, hard_match_len)) +- { +- present = 1; +- break; ++ /* Found the body, that is, the text to substitute if the ++ current disjunction matches. */ ++ p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred, ++ disj_matched && !n_way_matched); ++ if (p == 0) ++ return 0; ++ ++ /* If we have an N-way choice, reset state for the next ++ disjunction. */ ++ if (*p == ';') ++ { ++ n_way_choice = true; ++ n_way_matched |= disj_matched; ++ disj_matched = false; ++ disj_starred = true; ++ d_atom = d_end_atom = NULL; + } + } + } +- /* Otherwise, check for presence of exact name specified. */ + else ++ abort (); ++ if (pipe_p && /* use_pipes */ ! (n_way_matched || disj_matched) ) + { +- for (i = 0; i < n_switches; i++) +- { +- if (!strncmp (switches[i].part1, filter, p - filter) +- && switches[i].part1[p - filter] == 0 +- && check_live_switch (i, -1)) +- { +- present = 1; +- break; +- } ++ /* Here if a %{|...} conditional fails: output a minus sign, ++ which means "standard output" or "standard input". */ ++ do_spec_1 ("-", 0, NULL); + } + } ++ while (*p++ != '}'); + +- /* If it is as desired (present for %{s...}, absent for %{!s...}) +- then substitute either the switch or the specified +- conditional text. */ +- if (present != negate) +- { +- if (elide_switch) ++ return p; ++ ++#undef SKIP_WHITE ++} ++ ++/* Subroutine of handle_braces. Scan and process a brace substitution body ++ (X in the description of %{} syntax). P points one past the colon; ++ ATOM and END_ATOM bracket the first atom which was found to be true ++ (present) in the current disjunction; STARRED indicates whether all ++ the atoms in the current disjunction were starred (for syntax validation); ++ MATCHED indicates whether the disjunction matched or not, and therefore ++ whether or not the body is to be processed through do_spec_1 or just ++ skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1 ++ returns -1. */ ++ ++static const char * ++process_brace_body (const char *p, const char *atom, const char *end_atom, ++ int starred, int matched) ++{ ++ const char *body, *end_body; ++ unsigned int nesting_level; ++ bool have_subst = false; ++ ++ /* Locate the closing } or ;, honoring nested braces. ++ Trim trailing whitespace. */ ++ body = p; ++ nesting_level = 1; ++ for (;;) + { +- switches[i].live_cond = SWITCH_IGNORE; +- switches[i].validated = 1; +- } +- else if (ordered || *p == '&') +- ordered = 1, switches[i].ordering = 1; ++ if (*p == '{') ++ nesting_level++; + else if (*p == '}') +- give_switch (i, 0, include_blanks); +- else +- /* Even if many alternatives are matched, only output once. */ +- true_once = 1; +- } +- else if (pipe_p) + { +- /* Here if a %{|...} conditional fails: output a minus sign, +- which means "standard output" or "standard input". */ +- do_spec_1 ("-", 0, NULL); +- return endbody; ++ if (!--nesting_level) ++ break; + } +- } ++ else if (*p == ';' && nesting_level == 1) ++ break; ++ else if (*p == '%' && p[1] == '*' && nesting_level == 1) ++ have_subst = true; ++ else if (*p == '\0') ++ abort (); ++ p++; ++ } ++ ++ end_body = p; ++ while (end_body[-1] == ' ' || end_body[-1] == '\t') ++ end_body--; + +- /* We didn't match; try again. */ +- if (*p++ == '|') +- goto next_member; ++ if (have_subst && !starred) ++ abort (); + +- if (p[-1] == '&') ++ if (matched) ++ { ++ /* Copy the substitution body to permanent storage and execute it. ++ If have_subst is false, this is a simple matter of running the ++ body through do_spec_1... */ ++ char *string = save_string (body, end_body - body); ++ if (!have_subst) + { +- body = 0; +- goto next_ampersand; ++ if (do_spec_1 (string, 0, NULL) < 0) ++ return 0; + } +- +- if (ordered) ++ else + { ++ /* ... but if have_subst is true, we have to process the ++ body once for each matching switch, with %* set to the ++ variant part of the switch. */ ++ unsigned int hard_match_len = end_atom - atom; + int i; +- /* Doing this set of switches later preserves their command-line +- ordering. This is needed for e.g. -U, -D and -A. */ ++ + for (i = 0; i < n_switches; i++) +- if (switches[i].ordering == 1) ++ if (!strncmp (switches[i].part1, atom, hard_match_len) ++ && check_live_switch (i, hard_match_len)) + { +- switches[i].ordering = 0; +- give_switch (i, 0, include_blanks); ++ if (do_spec_1 (string, 0, ++ &switches[i].part1[hard_match_len]) < 0) ++ return 0; ++ /* Pass any arguments this switch has. */ ++ give_switch (i, 1); ++ suffix_subst = NULL; + } + } +- /* Process the spec just once, regardless of match count. */ +- else if (true_once) +- { +- if (do_spec_1 (save_string (body, endbody - body - 1), +- 0, NULL) < 0) +- return 0; + } + +- return endbody; ++ return p; + } + + /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch +@@ -6221,9 +6632,7 @@ + with the "no-", similarly for a switch with the "no-" prefix. */ + + static int +-check_live_switch (switchnum, prefix_length) +- int switchnum; +- int prefix_length; ++check_live_switch (int switchnum, int prefix_length) + { + const char *name = switches[switchnum].part1; + int i; +@@ -6294,16 +6703,10 @@ + the vector of switches gcc received, which is `switches'. + This cannot fail since it never finishes a command line. + +- If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. +- +- If INCLUDE_BLANKS is nonzero, then we include blanks before each argument +- of the switch. */ ++ If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */ + + static void +-give_switch (switchnum, omit_first_word, include_blanks) +- int switchnum; +- int omit_first_word; +- int include_blanks; ++give_switch (int switchnum, int omit_first_word) + { + if (switches[switchnum].live_cond == SWITCH_IGNORE) + return; +@@ -6321,7 +6724,6 @@ + { + const char *arg = *p; + +- if (include_blanks) + do_spec_1 (" ", 0, NULL); + if (suffix_subst) + { +@@ -6354,8 +6756,7 @@ + Return the absolute file name found. If nothing is found, return NAME. */ + + static const char * +-find_file (name) +- const char *name; ++find_file (const char *name) + { + char *newname; + +@@ -6380,14 +6781,11 @@ + limit. */ + + static int +-is_directory (path1, path2, linker) +- const char *path1; +- const char *path2; +- int linker; ++is_directory (const char *path1, const char *path2, int linker) + { + int len1 = strlen (path1); + int len2 = strlen (path2); +- char *path = (char *) alloca (3 + len1 + len2); ++ char *path = alloca (3 + len1 + len2); + char *cp; + struct stat st; + +@@ -6425,8 +6823,7 @@ + the input file named FILENAME. */ + + void +-set_input (filename) +- const char *filename; ++set_input (const char *filename) + { + const char *p; + +@@ -6467,8 +6864,7 @@ + /* On fatal signals, delete all the temporary files. */ + + static void +-fatal_error (signum) +- int signum; ++fatal_error (int signum) + { + signal (signum, SIG_DFL); + delete_failure_queue (); +@@ -6478,16 +6874,15 @@ + kill (getpid (), signum); + } + +-extern int main PARAMS ((int, const char *const *)); ++extern int main (int, const char **); + + int +-main (argc, argv) +- int argc; +- const char *const *argv; ++main (int argc, const char **argv) + { + size_t i; + int value; + int linker_was_run = 0; ++ int num_linker_inputs = 0; + char *explicit_link_files; + char *specs_file; + const char *p; +@@ -6598,18 +6993,11 @@ + + process_command (argc, argv); + +- /* Process DRIVER_SELF_SPECS, adding any new options to the end +- of the command line. */ +- +- for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++) +- do_self_spec (driver_self_specs[i]); +- + /* Initialize the vector of specs to just the default. + This means one element containing 0s, as a terminator. */ + +- compilers = (struct compiler *) xmalloc (sizeof default_compilers); +- memcpy ((char *) compilers, (char *) default_compilers, +- sizeof default_compilers); ++ compilers = xmalloc (sizeof default_compilers); ++ memcpy (compilers, default_compilers, sizeof default_compilers); + n_compilers = n_default_compilers; + + /* Read specs from a file if there is one. */ +@@ -6627,9 +7015,8 @@ + + /* We need to check standard_exec_prefix/just_machine_suffix/specs + for any override of as, ld and libraries. */ +- specs_file = (char *) alloca (strlen (standard_exec_prefix) +- + strlen (just_machine_suffix) +- + sizeof ("specs")); ++ specs_file = alloca (strlen (standard_exec_prefix) ++ + strlen (just_machine_suffix) + sizeof ("specs")); + + strcpy (specs_file, standard_exec_prefix); + strcat (specs_file, just_machine_suffix); +@@ -6637,40 +7024,92 @@ + if (access (specs_file, R_OK) == 0) + read_specs (specs_file, TRUE); + ++ /* Process any configure-time defaults specified for the command line ++ options, via OPTION_DEFAULT_SPECS. */ ++ for (i = 0; i < ARRAY_SIZE (option_default_specs); i++) ++ do_option_spec (option_default_specs[i].name, ++ option_default_specs[i].spec); ++ ++ /* Process DRIVER_SELF_SPECS, adding any new options to the end ++ of the command line. */ ++ ++ for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++) ++ do_self_spec (driver_self_specs[i]); ++ + #ifdef GPC + init_automake_temp_file (argc, argv); + check_amtmpfile_switch (); + #endif + +- /* If not cross-compiling, look for startfiles in the standard places. +- Similarly, don't add the standard prefixes if startfile handling +- will be under control of startfile_prefix_spec. */ +- if (*cross_compile == '0' && *startfile_prefix_spec == 0) ++ /* If not cross-compiling, look for executables in the standard ++ places. */ ++ if (*cross_compile == '0') + { + if (*md_exec_prefix) + { + add_prefix (&exec_prefixes, md_exec_prefix, "GCC", + PREFIX_PRIORITY_LAST, 0, NULL, 0); +- add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", +- PREFIX_PRIORITY_LAST, 0, NULL, 0); ++ } + } + +- if (*md_startfile_prefix) +- add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC", ++ /* Process sysroot_suffix_spec. */ ++ if (*sysroot_suffix_spec != 0 ++ && do_spec_2 (sysroot_suffix_spec) == 0) ++ { ++ if (argbuf_index > 1) ++ error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC."); ++ else if (argbuf_index == 1) ++ target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]); ++ } ++ ++ /* Process sysroot_hdrs_suffix_spec. */ ++ if (*sysroot_hdrs_suffix_spec != 0 ++ && do_spec_2 (sysroot_hdrs_suffix_spec) == 0) ++ { ++ if (argbuf_index > 1) ++ error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC."); ++ else if (argbuf_index == 1) ++ target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]); ++ } ++ ++ /* Look for startfiles in the standard places. */ ++ if (*startfile_prefix_spec != 0 ++ && do_spec_2 (startfile_prefix_spec) == 0 ++ && do_spec_1 (" ", 0, NULL) == 0) ++ { ++ int ndx; ++ for (ndx = 0; ndx < argbuf_index; ndx++) ++ add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS", + PREFIX_PRIORITY_LAST, 0, NULL, 1); ++ } ++ /* We should eventually get rid of all these and stick to ++ startfile_prefix_spec exclusively. */ ++ else if (*cross_compile == '0' || target_system_root) ++ { ++ if (*md_exec_prefix) ++ add_sysrooted_prefix (&startfile_prefixes, md_exec_prefix, "GCC", ++ PREFIX_PRIORITY_LAST, 0, NULL, 1); ++ ++ if (*md_startfile_prefix) ++ add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix, ++ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1); + + if (*md_startfile_prefix_1) +- add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC", +- PREFIX_PRIORITY_LAST, 0, NULL, 1); ++ add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1, ++ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1); + + /* If standard_startfile_prefix is relative, base it on + standard_exec_prefix. This lets us move the installed tree + as a unit. If GCC_EXEC_PREFIX is defined, base +- standard_startfile_prefix on that as well. */ +- if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)) +- add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS", ++ standard_startfile_prefix on that as well. ++ ++ If the prefix is relative, only search it for native compilers; ++ otherwise we will search a directory containing host libraries. */ ++ if (IS_ABSOLUTE_PATH (standard_startfile_prefix)) ++ add_sysrooted_prefix (&startfile_prefixes, ++ standard_startfile_prefix, "BINUTILS", + PREFIX_PRIORITY_LAST, 0, NULL, 1); +- else ++ else if (*cross_compile == '0') + { + if (gcc_exec_prefix) + add_prefix (&startfile_prefixes, +@@ -6684,34 +7123,15 @@ + NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1); + } + +- add_prefix (&startfile_prefixes, standard_startfile_prefix_1, ++ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_1, + "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1); +- add_prefix (&startfile_prefixes, standard_startfile_prefix_2, ++ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_2, + "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1); + #if 0 /* Can cause surprises, and one can use -B./ instead. */ + add_prefix (&startfile_prefixes, "./", NULL, + PREFIX_PRIORITY_LAST, 1, NULL, 0); + #endif + } +- else +- { +- if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix) +- && gcc_exec_prefix) +- add_prefix (&startfile_prefixes, +- concat (gcc_exec_prefix, machine_suffix, +- standard_startfile_prefix, NULL), +- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1); +- } +- +- if (*startfile_prefix_spec != 0 +- && do_spec_2 (startfile_prefix_spec) == 0 +- && do_spec_1 (" ", 0, NULL) == 0) +- { +- int ndx; +- for (ndx = 0; ndx < argbuf_index; ndx++) +- add_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS", +- PREFIX_PRIORITY_LAST, 0, NULL, 1); +- } + + /* Process any user specified specs in the order given on the command + line. */ +@@ -6865,14 +7285,35 @@ + + i = n_infiles; + i += lang_specific_extra_outfiles; +- outfiles = (const char **) xcalloc (i, sizeof (char *)); ++ outfiles = xcalloc (i, sizeof (char *)); + + /* Record which files were specified explicitly as link input. */ + + explicit_link_files = xcalloc (1, n_infiles); + ++ if (combine_inputs) ++ { ++ int lang_n_infiles = 0; + for (i = 0; (int) i < n_infiles; i++) + { ++ const char *name = infiles[i].name; ++ struct compiler *compiler ++ = lookup_compiler (name, strlen (name), infiles[i].language); ++ if (compiler == NULL) ++ error ("%s: linker input file unused because linking not done", ++ name); ++ else if (lang_n_infiles > 0 && compiler != input_file_compiler) ++ fatal ("cannot specify -o with -c or -S and multiple languages"); ++ else ++ { ++ lang_n_infiles++; ++ input_file_compiler = compiler; ++ } ++ } ++ } ++ ++ for (i = 0; (int) i < (combine_inputs ? 1 : n_infiles); i++) ++ { + int this_file_error = 0; + + /* Tell do_spec what to substitute for %i. */ +@@ -6886,6 +7327,7 @@ + + /* Figure out which compiler from the file's suffix. */ + ++ if (! combine_inputs) + input_file_compiler + = lookup_compiler (infiles[i].name, input_filename_length, + infiles[i].language); +@@ -6941,9 +7383,15 @@ + error_count++; + } + ++ /* Determine if there are any linker input files. */ ++ num_linker_inputs = 0; ++ for (i = 0; (int) i < n_infiles; i++) ++ if (explicit_link_files[i] || outfiles[i] != NULL) ++ num_linker_inputs++; ++ + /* Run ld to link all the compiler output files. */ + +- if (error_count == 0) ++ if (num_linker_inputs > 0 && error_count == 0) + { + int tmp = execution_count; + +@@ -7000,10 +7448,7 @@ + or 0 if this file is to be passed to the linker. */ + + static struct compiler * +-lookup_compiler (name, length, language) +- const char *name; +- size_t length; +- const char *language; ++lookup_compiler (const char *name, size_t length, const char *language) + { + struct compiler *cp; + +@@ -7069,9 +7514,7 @@ + } + + static char * +-save_string (s, len) +- const char *s; +- int len; ++save_string (const char *s, int len) + { + char *result = xmalloc (len + 1); + +@@ -7081,8 +7524,7 @@ + } + + void +-pfatal_with_name (name) +- const char *name; ++pfatal_with_name (const char *name) + { + perror_with_name (name); + delete_temp_files (); +@@ -7090,16 +7532,13 @@ + } + + static void +-perror_with_name (name) +- const char *name; ++perror_with_name (const char *name) + { + error ("%s: %s", name, xstrerror (errno)); + } + + static void +-pfatal_pexecute (errmsg_fmt, errmsg_arg) +- const char *errmsg_fmt; +- const char *errmsg_arg; ++pfatal_pexecute (const char *errmsg_fmt, const char *errmsg_arg) + { + if (errmsg_arg) + { +@@ -7116,136 +7555,153 @@ + pfatal_with_name (errmsg_fmt); + } + +-/* Output an error message and exit */ ++/* Output an error message and exit. */ + + void +-fancy_abort () ++fancy_abort (void) + { + fatal ("internal gpc abort"); + } + +-/* Output an error message and exit */ ++/* Output an error message and exit. */ + + void +-fatal VPARAMS ((const char *msgid, ...)) ++fatal (const char *msgid, ...) + { +- VA_OPEN (ap, msgid); +- VA_FIXEDARG (ap, const char *, msgid); ++ va_list ap; ++ ++ va_start (ap, msgid); + + fprintf (stderr, "%s: ", programname); + vfprintf (stderr, _(msgid), ap); +- VA_CLOSE (ap); ++ va_end (ap); + fprintf (stderr, "\n"); + delete_temp_files (); + safe_exit (1); + } + + void +-error VPARAMS ((const char *msgid, ...)) ++error (const char *msgid, ...) + { +- VA_OPEN (ap, msgid); +- VA_FIXEDARG (ap, const char *, msgid); ++ va_list ap; + ++ va_start (ap, msgid); + fprintf (stderr, "%s: ", programname); + vfprintf (stderr, _(msgid), ap); +- VA_CLOSE (ap); ++ va_end (ap); + + fprintf (stderr, "\n"); + } + + static void +-notice VPARAMS ((const char *msgid, ...)) ++notice (const char *msgid, ...) + { +- VA_OPEN (ap, msgid); +- VA_FIXEDARG (ap, const char *, msgid); ++ va_list ap; + ++ va_start (ap, msgid); + vfprintf (stderr, _(msgid), ap); +- VA_CLOSE (ap); ++ va_end (ap); ++} ++ ++static inline void ++validate_switches_from_spec (const char *spec) ++{ ++ const char *p = spec; ++ char c; ++ while ((c = *p++)) ++ if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{'))) ++ /* We have a switch spec. */ ++ p = validate_switches (p + 1); + } + + static void +-validate_all_switches () ++validate_all_switches (void) + { + struct compiler *comp; +- const char *p; +- char c; + struct spec_list *spec; + + for (comp = compilers; comp->spec; comp++) +- { +- p = comp->spec; +- while ((c = *p++)) +- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{'))) +- /* We have a switch spec. */ +- validate_switches (p + 1); +- } ++ validate_switches_from_spec (comp->spec); + + /* Look through the linked list of specs read from the specs file. */ + for (spec = specs; spec; spec = spec->next) +- { +- p = *(spec->ptr_spec); +- while ((c = *p++)) +- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{'))) +- /* We have a switch spec. */ +- validate_switches (p + 1); +- } ++ validate_switches_from_spec (*spec->ptr_spec); + +- p = link_command_spec; +- while ((c = *p++)) +- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{'))) +- /* We have a switch spec. */ +- validate_switches (p + 1); ++ validate_switches_from_spec (link_command_spec); + } + + /* Look at the switch-name that comes after START + and mark as valid all supplied switches that match it. */ + +-static void +-validate_switches (start) +- const char *start; ++static const char * ++validate_switches (const char *start) + { + const char *p = start; +- const char *filter; ++ const char *atom; ++ size_t len; + int i; +- int suffix; ++ bool suffix = false; ++ bool starred = false; + +- if (*p == '|') +- ++p; ++#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0) + + next_member: ++ SKIP_WHITE (); ++ + if (*p == '!') +- ++p; ++ p++; + +- suffix = 0; ++ SKIP_WHITE (); + if (*p == '.') +- suffix = 1, ++p; ++ suffix = true, p++; + +- filter = p; +- while (*p != ':' && *p != '}' && *p != '|' && *p != '&') ++ atom = p; ++ while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '=' ++ || *p == ',' || *p == '.' || *p == '@') + p++; ++ len = p - atom; + +- if (suffix) +- ; +- else if (p[-1] == '*') ++ if (*p == '*') ++ starred = true, p++; ++ ++ SKIP_WHITE (); ++ ++ if (!suffix) + { + /* Mark all matching switches as valid. */ + for (i = 0; i < n_switches; i++) +- if (!strncmp (switches[i].part1, filter, p - filter - 1)) ++ if (!strncmp (switches[i].part1, atom, len) ++ && (starred || switches[i].part1[len] == 0)) + switches[i].validated = 1; + } +- else ++ ++ if (*p) p++; ++ if (*p && (p[-1] == '|' || p[-1] == '&')) ++ goto next_member; ++ ++ if (*p && p[-1] == ':') + { +- /* Mark an exact matching switch as valid. */ +- for (i = 0; i < n_switches; i++) ++ while (*p && *p != ';' && *p != '}') + { +- if (!strncmp (switches[i].part1, filter, p - filter) +- && switches[i].part1[p - filter] == 0) +- switches[i].validated = 1; ++ if (*p == '%') ++ { ++ p++; ++ if (*p == '{' || *p == '<') ++ p = validate_switches (p+1); ++ else if (p[0] == 'W' && p[1] == '{') ++ p = validate_switches (p+2); + } ++ else ++ p++; + } + +- if (*p++ == '|' || p[-1] == '&') ++ if (*p) p++; ++ if (*p && p[-1] == ';') + goto next_member; ++ } ++ ++ return p; ++#undef SKIP_WHITE + } + + struct mdswitchstr +@@ -7261,9 +7717,7 @@ + canonicalize the switches to keep only the ones we care about. */ + + static int +-used_arg (p, len) +- const char *p; +- int len; ++used_arg (const char *p, int len) + { + struct mswitchstr + { +@@ -7289,8 +7743,7 @@ + if (*q == ';') + cnt++; + +- matches = +- (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt); ++ matches = alloca ((sizeof (struct mswitchstr)) * cnt); + i = 0; + q = multilib_matches; + while (*q != '\0') +@@ -7322,8 +7775,7 @@ + xmalloc from calling fatal, and prevents us from re-executing this + block of code. */ + mswitches +- = (struct mswitchstr *) +- xmalloc (sizeof (struct mswitchstr) ++ = xmalloc (sizeof (struct mswitchstr) + * (n_mdswitches + (n_switches ? n_switches : 1))); + for (i = 0; i < n_switches; i++) + { +@@ -7401,9 +7853,7 @@ + } + + static int +-default_arg (p, len) +- const char *p; +- int len; ++default_arg (const char *p, int len) + { + int i; + +@@ -7426,7 +7876,7 @@ + will be used. */ + + static void +-set_multilib_dir () ++set_multilib_dir (void) + { + const char *p; + unsigned int this_path_len; +@@ -7452,9 +7902,7 @@ + { + int i = 0; + +- mdswitches +- = (struct mdswitchstr *) xmalloc (sizeof (struct mdswitchstr) +- * n_mdswitches); ++ mdswitches = xmalloc (sizeof (struct mdswitchstr) * n_mdswitches); + for (start = multilib_defaults; *start != '\0'; start = end + 1) + { + while (*start == ' ' || *start == '\t') +@@ -7661,7 +8109,7 @@ + the exclusions. */ + + static void +-print_multilib_info () ++print_multilib_info (void) + { + const char *p = multilib_select; + const char *last_path = 0, *this_path; +@@ -7909,12 +8357,10 @@ + (whose name has been expanded with %s). */ + + static const char * +-if_exists_spec_function (argc, argv) +- int argc; +- const char **argv; ++if_exists_spec_function (int argc, const char **argv) + { + /* Must have only one argument. */ +- if (argc == 1 && IS_ABSOLUTE_PATHNAME (argv[0]) && ! access (argv[0], R_OK)) ++ if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK)) + return argv[0]; + + return NULL; +@@ -7926,15 +8372,13 @@ + is returned if the first argument does not exist. */ + + static const char * +-if_exists_else_spec_function (argc, argv) +- int argc; +- const char **argv; ++if_exists_else_spec_function (int argc, const char **argv) + { + /* Must have exactly two arguments. */ + if (argc != 2) + return NULL; + +- if (IS_ABSOLUTE_PATHNAME (argv[0]) && ! access (argv[0], R_OK)) ++ if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK)) + return argv[0]; + + return argv[1]; +@@ -7978,7 +8422,7 @@ + } + if (!new_argc) + return; +- argv = (const char **) xmalloc ((argc + new_argc + 1) * sizeof (const char *)); ++ argv = (const char **) xmalloc ((argc + new_argc+1) * sizeof (const char *)); + memcpy (argv, *argvp, argc * sizeof (const char *)); + memcpy (argv + argc, new_argv, new_argc * sizeof (const char *)); + argv [argc + new_argc] = NULL; +@@ -8236,7 +8680,7 @@ + { + printf("\ + GNU Pascal version %s, based on gcc-%s.\n\ +-Copyright (C) 1987-2004 Free Software Foundation, Inc.\n\ ++Copyright (C) 1987-2003 Free Software Foundation, Inc.\n\ + \n\ + GNU Pascal is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ +@@ -8359,6 +8803,7 @@ + } + #endif + ++#ifndef GCC_3_4 + #ifndef HAVE_PUTENV + void + putenv (str) +@@ -8398,6 +8843,7 @@ + sizeof (char *) * (num_envs+1)); + } + #endif ++#endif + + #ifndef EGCS + /* We need to provide a type for gcc_uint64_t. */ +diff -ru gpc-20040516.orig/p/gpc.h gpc-20040516/p/gpc.h +--- gpc-20040516.orig/p/gpc.h 2004-05-12 17:05:19.000000000 +0200 ++++ gpc-20040516/p/gpc.h 2004-07-06 19:12:30.000000000 +0200 +@@ -166,10 +166,16 @@ + }; + #undef DEFTREECODE + ++#ifndef GCC_3_4 + #define NUMBER_OF_OPERANDS(code) \ + (((code) == SAVE_EXPR || (code) == WITH_CLEANUP_EXPR) ? 1 \ + : ((code) == METHOD_CALL_EXPR) ? 3 \ + : tree_code_length[(int) (code)]) ++#else ++#define NUMBER_OF_OPERANDS(code) \ ++ (((code) == SAVE_EXPR || (code) == WITH_CLEANUP_EXPR) ? 1 \ ++ : tree_code_length[(int) (code)]) ++#endif + + typedef HOST_WIDE_INT gpi_int; + +@@ -188,9 +194,12 @@ + #define INTERFACE_TABLE(NODE) (AS_INTERFACE_NAME_NODE (NODE)->table) + #define INTERFACE_CHECKSUM(NODE) (AS_INTERFACE_NAME_NODE (NODE)->checksum) + ++typedef enum {IMPORT_USES, IMPORT_QUALIFIED, IMPORT_ISO} import_type; ++ + struct tree_import GTY(()) + { + struct tree_common common; ++ gpi_int qualified; + tree interface; + tree import_qualifier; + tree filename; +@@ -198,6 +207,7 @@ + }; + #define AS_IMPORT_NODE(NODE) ((struct tree_import *) IMPORT_NODE_CHECK (NODE)) + #define IMPORT_INTERFACE(NODE) (AS_IMPORT_NODE (NODE)->interface) ++#define PASCAL_TREE_QUALIFIED(NODE) (AS_IMPORT_NODE (NODE)->qualified) + #define IMPORT_QUALIFIER(NODE) (AS_IMPORT_NODE (NODE)->import_qualifier) + #define IMPORT_FILENAME(NODE) (AS_IMPORT_NODE (NODE)->filename) + +@@ -359,7 +369,7 @@ + #define PASCAL_TREE_IGNORABLE(t) TREE_LANG_FLAG_2 (t) + + /* `Qualified' import. Used in IMPORT_NODE nodes. */ +-#define PASCAL_TREE_QUALIFIED(t) TREE_LANG_FLAG_2 (t) ++/* #define PASCAL_TREE_QUALIFIED(t) TREE_LANG_FLAG_2 (t) */ + + /* Set if the parameter is a value parameter passed by reference. + This is necessary for undiscriminated strings/schemata and +@@ -411,9 +421,19 @@ + /* Set for `const' parameters. Used in *_TYPE and some TREE_LIST nodes. */ + #define PASCAL_CONST_PARM(type) TREE_LANG_FLAG_6 (type) + ++/* Set if identifier is a qualified identifer (only for identifiers) */ ++#define PASCAL_QUALIFIED_ID(id) TREE_LANG_FLAG_6 (id) ++ + /* GPC specific decl node extensions. */ + +-/* Decl flags 0, 1, 2 are still available. */ ++/* Decl flag 0 is still available. */ ++ ++/* Set for declarations imported from other modules/units */ ++#define PASCAL_DECL_IMPORTED(NODE) DECL_LANG_FLAG_1 (NODE) ++ ++/* Set if declaration is imported via `uses' (so it can be ++ overriden). */ ++#define PASCAL_DECL_WEAK(NODE) DECL_LANG_FLAG_2 (NODE) + + /* Borland Pascal allows a "typed constant" to be used as an initialized + variable and does not even warn if a value is written to it (because +@@ -459,6 +479,10 @@ + Used in VAR_DECL nodes. */ + #define PASCAL_FOR_LOOP_COUNTER(decl) DECL_LANG_FLAG_7 (decl) + ++/* Set if a declaration represents principal identifier of a constant ++ (see EP 6.10.2) */ ++#define PASCAL_CST_PRINCIPAL_ID(decl) DECL_LANG_FLAG_7 (decl) ++ + struct lang_decl GTY(()) + { + tree info; +@@ -1021,7 +1045,11 @@ + extern int is_pascal_option PARAMS ((const char *)); + extern int process_pascal_directive PARAMS ((char *, int)); + extern void activate_options PARAMS ((struct options *, int)); ++#ifndef GCC_3_4 + extern void pascal_init_options PARAMS ((void)); ++#else ++extern unsigned int pascal_init_options (unsigned int argc, const char **argv); ++#endif + extern void do_deferred_options PARAMS ((void)); + extern void error_or_warning PARAMS ((int, const char *)); + extern void dialect_msg PARAMS ((int, unsigned long, const char *, const char *, const char *)); +@@ -1096,12 +1124,16 @@ + extern void set_block PARAMS ((tree)); + extern void check_duplicate_id PARAMS ((tree)); + extern tree lookup_name PARAMS ((tree)); ++extern tree lookup_name_current_level PARAMS ((tree)); + extern void set_identifier_spelling PARAMS ((tree, const char *, const char *, int)); + extern tree make_identifier PARAMS ((const char *, int)); + extern tree get_identifier_with_spelling PARAMS ((const char *, const char *)); + extern tree get_unique_identifier PARAMS ((const char *)); ++extern tree build_qualified_id PARAMS ((tree, tree)); ++extern tree build_qualified_or_component_acces PARAMS ((tree, tree)); + extern tree check_identifier PARAMS ((tree)); + extern tree de_capitalize PARAMS ((tree)); ++extern tree pascal_mangle_names PARAMS ((const char *, const char *)); + extern tree build_formal_param PARAMS ((tree, tree, int, int)); + extern tree build_procedural_type PARAMS ((tree, tree)); + extern tree build_formal_param_list PARAMS ((tree)); +@@ -1110,6 +1142,7 @@ + extern void pushlevel_expand PARAMS ((void)); + extern tree poplevel_expand PARAMS ((int, int)); + extern tree pushdecl PARAMS ((tree)); ++extern tree pushdecl_import PARAMS ((tree, int)); + extern tree pushdecl_nocheck PARAMS ((tree)); + extern void pushlevel PARAMS ((int)); + extern tree start_struct PARAMS ((enum tree_code)); +@@ -1233,6 +1266,7 @@ + extern tree check_set_bounds PARAMS ((tree, tree)); + extern tree build_set_type PARAMS ((tree, int)); + extern tree pascal_build_set_type PARAMS ((tree)); ++extern tree build_pascal_pointer_type PARAMS ((tree)); + extern tree convert_to_cstring PARAMS ((tree)); + extern tree string_may_be_char PARAMS ((tree, int)); + extern tree char_may_be_string PARAMS ((tree)); +@@ -1369,7 +1403,7 @@ + extern void start_module_interface PARAMS ((void)); + extern void start_unit_implementation PARAMS ((void)); + extern void finalize_module PARAMS ((int)); +-extern void import_interface PARAMS ((tree, tree, int, tree)); ++extern void import_interface PARAMS ((tree, tree, import_type, tree)); + extern void export_interface PARAMS ((tree, tree)); + extern void do_extra_import PARAMS ((void)); + extern int is_gpi_special_node PARAMS ((tree)); +@@ -1394,9 +1428,13 @@ + extern void yyerror PARAMS ((const char *)); + extern void yyerror_id PARAMS ((tree, const YYLTYPE *)); + extern int peek_token PARAMS ((int)); ++extern void set_old_input_filename PARAMS ((const char *)); + extern int yylex PARAMS ((void)); +-extern void init_lex PARAMS ((void)); ++extern void pascal_init_lex PARAMS ((const char *)); + extern void discard_input PARAMS ((void)); ++#ifdef GCC_3_4 ++extern FILE * finput; ++#endif + + /* Put all global tree node variables here (don't use static ones) */ + +@@ -1405,7 +1443,9 @@ + /* Types */ + #define byte_integer_type_node PGT(0) + #define byte_unsigned_type_node PGT(1) ++#ifndef GCC_3_4 + #define boolean_type_node PGT(2) ++#endif + #define cboolean_type_node PGT(3) + #define byte_boolean_type_node PGT(4) + #define short_boolean_type_node PGT(5) +@@ -1418,7 +1458,9 @@ + #define pascal_size_type_node PGT(12) + #define ptrsize_unsigned_type_node PGT(13) + #define ptrsize_integer_type_node PGT(14) ++#ifndef GCC_3_4 + #define integer_ptr_type_node PGT(15) ++#endif + #define untyped_file_type_node PGT(16) + #define text_type_node PGT(17) + #define any_file_type_node PGT(18) +@@ -1437,8 +1479,10 @@ + + /* Constants */ + #define integer_maxint_node PGT(31) ++#ifndef GCC_3_4 + #define boolean_false_node PGT(32) + #define boolean_true_node PGT(33) ++#endif + #define char_max_node PGT(34) + #define real_max_node PGT(35) + #define real_min_node PGT(36) +diff -ru gpc-20040516.orig/p/gpc-lex.c gpc-20040516/p/gpc-lex.c +--- gpc-20040516.orig/p/gpc-lex.c 2004-05-15 01:43:11.000000000 +0200 ++++ gpc-20040516/p/gpc-lex.c 2004-07-06 19:08:51.000000000 +0200 +@@ -27,10 +27,6 @@ + #include "gpc.h" + #undef FLEX_SCANNER + +-#ifdef MULTIBYTE_CHARS +-#include +-#endif +- + #define LEX_SEMANTIC_VALUES 1 + #define LEX_INVALID (-1) + #define LEX_WHITESPACE (-1) +@@ -211,28 +207,23 @@ + while (getc (finput) != EOF) ; + } + +-/* Initialize the lexical analyzer. */ ++#ifndef EGCS + void + init_lex () + { +-#ifndef EGCS /* otherwise done in lang_init */ +- add_pascal_tree_codes (); +-#endif +- +-#ifndef EGCS97 +- /* Make identifier nodes long enough for the language-specific slots. */ +- set_identifier_size (sizeof (struct lang_identifier)); ++ /* Empty, required by 2.8.1 */ ++} + #endif + ++/* Initialize the lexical analyzer. */ ++void ++pascal_init_lex (filename) ++ const char * filename; ++{ + /* Start it at 0, because check_newline is called at the very beginning + and will increment it to 1. */ + lineno = 0; + +-#ifdef MULTIBYTE_CHARS +- /* Change to the native locale for multibyte conversions. */ +- setlocale (LC_CTYPE, ""); +-#endif +- + #ifdef HAVE_SIGALRM + /* Periodically trigger the output of progress messages. */ + if (flag_progress_messages || flag_progress_bar) +@@ -247,7 +238,7 @@ + } + #endif + +- InitLex ("???", finput, 0); ++ InitLex (filename, finput, 0); + } + + static void +@@ -301,23 +292,40 @@ + process_pascal_directive (s, q - s); + } + ++char * old_input_filename; ++ ++void set_old_input_filename (s) ++ const char * s; ++{ ++ old_input_filename = save_string(s); ++} ++ + void + SetFileName (v) + int v; + { + input_filename = NewPos.SrcName; ++#ifndef EGCS97 + if (!main_input_filename) + main_input_filename = input_filename; ++#endif + if (v == 1) + { + /* Pushing to a new file. */ + struct file_stack *p = (struct file_stack *) xmalloc (sizeof (struct file_stack)); ++#ifndef GCC_3_4 + input_file_stack->line = LexPos.Line; +- p->next = input_file_stack; + p->name = input_filename; ++#else ++ p->location.line = LexPos.Line; ++ p->location.file = old_input_filename; ++#endif ++ p->next = input_file_stack; + input_file_stack = p; + input_file_stack_tick++; + #ifdef EGCS97 ++ /* Can use backend only afer initialization (see err1.pas) */ ++ if (main_input_filename) + (*debug_hooks->start_source_file) (LexPos.Line, input_filename); + #else + debug_start_source_file (input_filename); +@@ -326,26 +334,41 @@ + else if (v == 2) + { + /* Popping out of a file. */ ++#ifndef GCC_3_4 + if (input_file_stack->next) ++#else ++ if (input_file_stack) ++#endif + { + struct file_stack *p = input_file_stack; + input_file_stack = p->next; +- free (p); + input_file_stack_tick++; + #ifdef EGCS97 ++#ifndef GCC_3_4 + (*debug_hooks->end_source_file) (input_file_stack->line); + #else ++ (*debug_hooks->end_source_file) (p->location.line); ++#endif ++#else + debug_end_source_file (input_file_stack->line); + #endif ++ free (p); + } + else + error ("#-lines for entering and leaving files don't match"); + } +- ++#ifdef EGCS97 ++ if (!main_input_filename) ++ main_input_filename = input_filename; ++#endif + /* Now that we've pushed or popped the input stack, + update the name in the top element. */ ++#ifndef GCC_3_4 + if (input_file_stack) + input_file_stack->name = input_filename; ++#else ++ old_input_filename = input_filename; ++#endif + } + + /* Hooks for parse.y: error handling. */ +@@ -356,14 +379,28 @@ + const char *s = LexSem.TokenString; + char buf[200]; + syntax_errors++; ++#ifndef GCC_3_4 + strcpy (buf, string); ++#else ++ strcpy (buf, "%H"); ++ strcat (buf, string); ++#endif + if (!s) + strcat (buf, " at end of input"); + else if (s[0] < 0x20 || (unsigned char) s[0] >= 0x7f) + sprintf (buf + strlen (buf), " before character #%i", (unsigned char) s[0]); + else + strcat (buf, " before `%s'"); ++#ifndef GCC_3_4 + error_with_file_and_line (lexer_filename, lexer_lineno, buf, s); ++#else ++ { ++ location_t loc_aux; ++ loc_aux.file = lexer_filename; ++ loc_aux.line = lexer_lineno; ++ error (buf, &loc_aux, s); ++ } ++#endif + } + + void +@@ -372,8 +409,17 @@ + const YYLTYPE *location; + { + syntax_errors++; ++#ifndef GCC_3_4 + error_with_file_and_line (location->last_file, location->last_line, + "syntax error before `%s'", IDENTIFIER_NAME (id)); ++#else ++ { ++ location_t loc_aux; ++ loc_aux.file = location->last_file; ++ loc_aux.line = location->last_line; ++ error ("%Hsyntax error before `%s'", &loc_aux, IDENTIFIER_NAME (id)); ++ } ++#endif + } + + static int get_token PARAMS ((void)); +diff -ru gpc-20040516.orig/p/gpcpp.c gpc-20040516/p/gpcpp.c +--- gpc-20040516.orig/p/gpcpp.c 2004-01-01 00:07:10.000000000 +0100 ++++ gpc-20040516/p/gpcpp.c 2004-07-06 19:08:51.000000000 +0200 +@@ -5763,16 +5763,10 @@ + + /* Print error message and increment count of errors. */ + static void +-error VPARAMS ((const char *msg, ...)) ++error (const char *msg, ...) + { +-#ifndef ANSI_PROTOTYPES +- const char *msg; +-#endif + va_list args; +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- msg = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + verror (msg, args); + va_end (args); + } +@@ -5818,16 +5812,10 @@ + + /* Print warning. */ + static void +-warning VPARAMS ((const char *msg, ...)) ++warning (const char *msg, ...) + { +-#ifndef ANSI_PROTOTYPES +- const char *msgid; +-#endif + va_list args; +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- msg = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + vwarning (msg, args); + va_end (args); + } +@@ -5857,20 +5845,12 @@ + } + + static void +-error_with_line VPARAMS ((int line, const char *msg, ...)) ++error_with_line (int line, const char *msg, ...) + { + int i; + FILE_BUF *ip = NULL; +-#ifndef ANSI_PROTOTYPES +- int line; +- const char *msgid; +-#endif + va_list args; +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- line = va_arg (ap, int); +- msg = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + print_containing_files (); + for (i = indepth; i >= 0; i--) + if (instack[i].fname != NULL) { +@@ -5887,16 +5867,10 @@ + + /* Print an error or warning message. */ + static void +-pedwarn VPARAMS ((const char *msg, ...)) ++pedwarn (const char *msg, ...) + { +-#ifndef ANSI_PROTOTYPES +- const char *msgid; +-#endif + va_list args; +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- msg = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + if (pedantic_errors) + verror (msg, args); + else +@@ -5907,13 +5881,8 @@ + /* Report a warning (or an error if pedantic_errors) + giving specified file name and line number, not current. */ + static void +-pedwarn_with_file_and_line VPARAMS ((const char *file, int line, const char *msg, ...)) ++pedwarn_with_file_and_line (const char *file, int line, const char *msg, ...) + { +-#ifndef ANSI_PROTOTYPES +- const char *file; +- int line; +- const char *msgid; +-#endif + va_list args; + if (!pedantic_errors && inhibit_warnings) + return; +@@ -5923,12 +5892,7 @@ + errors++; + if (!pedantic_errors) + fprintf (stderr, "warning: "); +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- file = va_arg (ap, const char *); +- line = va_arg (ap, int); +- msg = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + vfprintf (stderr, msg, args); + va_end (args); + fprintf (stderr, "\n"); +@@ -6368,17 +6332,11 @@ + static + #endif + void +-fatal VPARAMS ((const char *msg, ...)) ++fatal (const char *msg, ...) + { + va_list args; +-#ifndef ANSI_PROTOTYPES +- const char *msgid; +-#endif + fprintf (stderr, "%s: ", progname); +- VA_START (args, msg); +-#ifndef ANSI_PROTOTYPES +- msgid = va_arg (ap, const char *); +-#endif ++ va_start (args, msg); + vfprintf (stderr, msg, args); + va_end (args); + fprintf (stderr, "\n"); +diff -ru gpc-20040516.orig/p/lang.c gpc-20040516/p/lang.c +--- gpc-20040516.orig/p/lang.c 2004-05-15 01:37:50.000000000 +0200 ++++ gpc-20040516/p/lang.c 2004-07-06 22:55:02.000000000 +0200 +@@ -201,32 +201,7 @@ + } + } + +-#ifdef GCC_3_3 +-#define error_function_changed() (last_error_function != current_function_decl) +-#define record_last_error_function() (last_error_function = current_function_decl) +-static tree last_error_function = NULL; +-#endif +- + /* Our function to print out name of current routine that caused an error. */ +-#ifdef EGCS97 +- +-/* @@ Why is this function static in ../diagnostic.c? */ +-static void output_buffer_to_stream PARAMS ((output_buffer *)); +-static void +-output_buffer_to_stream (buffer) +- output_buffer *buffer; +-{ +- const char *text = output_finalize_message (buffer); +- fputs (text, output_buffer_attached_stream (buffer)); +- output_clear_message_text (buffer); +-} +- +-static void pascal_print_error_function PARAMS ((diagnostic_context *, const char *)); +-static void +-pascal_print_error_function (context, file) +- diagnostic_context *context; +- const char *file; +-#else + #define error_function_changed() (last_error_function != current_function_decl) + #define record_last_error_function() (last_error_function = current_function_decl) + #define output_add_string(X, S) fprintf (stderr, S) +@@ -236,6 +211,13 @@ + #define _(S) S + #endif + static tree last_error_function = NULL; ++#ifdef EGCS97 ++static void pascal_print_error_function PARAMS ((diagnostic_context *, const char *)); ++static void ++pascal_print_error_function (context, file) ++ diagnostic_context *context; ++ const char *file; ++#else + static void pascal_print_error_function PARAMS ((const char *)); + static void + pascal_print_error_function (file) +@@ -244,17 +226,8 @@ + { + if (error_function_changed ()) + { +-#ifdef EGCS97 +- char *prefix = file ? ACONCAT ((file, ": ", NULL)) : NULL; +-#ifndef GCC_3_3 +- output_state os; +- os = output_buffer_state (context); +-#endif +- output_set_prefix ((output_buffer *) context, prefix); +-#else + if (file) + fprintf (stderr, "%s: ", file); +-#endif + if (!current_function_decl || EM (current_function_decl)) + output_add_string ((output_buffer *) context, _("At top level:")); + else +@@ -297,20 +270,16 @@ + } + output_add_newline ((output_buffer *) context); + record_last_error_function (); +-#ifdef EGCS97 +- output_buffer_to_stream ((output_buffer *) context); +-#ifndef GCC_3_3 +- output_buffer_state (context) = os; +-#endif +-#endif + } + } + ++#ifndef EGCS97 + void + lang_init_options () + { + pascal_init_options (); + } ++#endif + + #ifndef GCC_3_3 + /* Tree code classes. */ +@@ -433,6 +402,29 @@ + fprintf (stderr, "-D%s -D__%s -D__%s__ ", s, s, s); + } + ++int ++c_lex (t) ++ tree * t; ++{ ++ return 0; ++} ++ ++void ++cpp_define (r, s) ++ void * r; ++ const char * s; ++{ ++ builtin_define_std (s); ++} ++ ++void ++cpp_assert (pfile, str) ++ void *pfile; ++ const char *str; ++{ ++} ++ ++ + #define preprocessing_asm_p() 0 + #define preprocessing_trad_p() 0 + #define c_language (-1) +@@ -442,6 +434,80 @@ + #define flag_isoc99 0 + #endif + ++#ifdef GCC_3_4 ++#include "options.h" ++#include "opts.h" ++ ++static int saved_lineno; ++static char * saved_filename = 0; ++ ++bool ++pascal_post_options (const char **pfilename) ++{ ++ char * filename = num_in_fnames>0?in_fnames[0]: 0 /* "-" */; ++#if 1 ++ filename = init_parse (filename); ++ /* The beginning of the file is a new line; check for `#'. ++ With luck, we discover the real source file's name from that ++ and put it in input_filename. */ ++ main_input_filename = 0; ++ lineno = 1; ++ /* With luck, we discover the real source file name from a line directive ++ at the beginning of the file and put it in input_filename. */ ++ set_old_input_filename (filename?filename:"???"); ++ peek_token (0); ++ saved_lineno = lineno; ++ ++ lineno = 0; ++ *pfilename = main_input_filename?main_input_filename:filename; ++#else ++ *pfilename = dump_base_name?dump_base_name:filename; ++#endif ++ saved_filename = filename; ++ return false; ++} ++ ++pascal_handle_option (size_t scode, const char *arg, int value) ++{ ++ enum opt_code code = (enum opt_code) scode; ++ const char * pp[2]; ++ switch (code) ++ { ++ default: ++ break; ++ assert (0); ++#include "handle-opts.c" ++ } ++ return 1; ++} ++ ++static size_t pascal_tree_size (enum tree_code); ++static size_t ++pascal_tree_size (enum tree_code code) ++{ ++ switch (code) ++ { ++ case INTERFACE_NAME_NODE: return sizeof (struct tree_inn); ++ case IMPORT_NODE: return sizeof (struct tree_import); ++ default: ++ assert (0); ++ } ++ /* NOTREACHED */ ++} ++ ++ ++bool ++lang_init_3_4 (void) ++{ ++ if (saved_filename) { ++ lang_init (saved_filename); ++ } else { ++ lang_init (main_input_filename); ++ } ++ return true; ++} ++#endif ++ + #ifdef EGCS97 + const char * + lang_init (filename) +@@ -459,9 +525,17 @@ + So we just turn it off here. */ + debug_no_type_hash = 1; + ++#ifndef EGCS ++ pascal_init_lex (input_filename); ++#endif ++ + #ifdef EGCS97 + init_decl_processing (); ++ ++#ifndef GCC_3_4 + filename = init_parse (filename); ++#endif ++ + #ifndef GCC_3_3 + decl_printable_name = pascal_decl_name; + #endif +@@ -507,9 +581,12 @@ + /* @@ Backend bug: TARGET_OS_CPP_BUILTINS on some targets uses it + though it's a C specific flag. */ + #define flag_iso 1 +- +- TARGET_CPU_CPP_BUILTINS (); +- TARGET_OS_CPP_BUILTINS (); ++ { ++ extern void rs6000_cpu_cpp_builtins PARAMS ((void *)); ++ void * pfile = 0; ++ TARGET_CPU_CPP_BUILTINS (); ++ TARGET_OS_CPP_BUILTINS (); ++ } + #endif + /* The following is no joke! The difference between what the + preprocessor and the compiler think of BYTES_BIG_ENDIAN is +@@ -543,17 +620,15 @@ + } + #endif + +-#ifdef EGCS +- /* In gcc-2.8.1, init_tree_codes() has not been called yet. +- Do it in init_lex instead. */ + #ifndef GCC_3_3 + add_pascal_tree_codes (); + #endif +-#endif + ++#ifndef GCC_3_4 + /* With luck, we discover the real source file name from a line directive + at the beginning of the file and put it in input_filename. */ + peek_token (0); ++#endif + + #ifdef EGCS97 + if (main_input_filename) +@@ -678,7 +753,7 @@ + setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE); + #endif + #endif +- init_lex (); ++ pascal_init_lex (filename); + #if USE_CPPLIB + yy_cur = "\n"; + yy_lim = yy_cur + 1; +@@ -1115,7 +1190,17 @@ + #undef LANG_HOOKS_NAME + #define LANG_HOOKS_NAME "GNU Pascal" + #undef LANG_HOOKS_INIT ++#ifndef GCC_3_4 + #define LANG_HOOKS_INIT lang_init ++#else ++#define LANG_HOOKS_INIT lang_init_3_4 ++#undef LANG_HOOKS_TREE_SIZE ++#define LANG_HOOKS_TREE_SIZE pascal_tree_size ++#undef LANG_HOOKS_HANDLE_OPTION ++#define LANG_HOOKS_HANDLE_OPTION pascal_handle_option ++#undef LANG_HOOKS_POST_OPTIONS ++#define LANG_HOOKS_POST_OPTIONS pascal_post_options ++#endif + #undef LANG_HOOKS_DECODE_OPTION + #define LANG_HOOKS_DECODE_OPTION lang_decode_option + #undef LANG_HOOKS_INIT_OPTIONS +@@ -1157,6 +1242,9 @@ + #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE + #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE gpc_attribute_table + ++#undef LANG_HOOKS_HASH_TYPES ++#define LANG_HOOKS_HASH_TYPES false ++ + static void + pascal_parse (debug) + int debug; +Only in gpc-20040516/p: lang.c.orig +diff -ru gpc-20040516.orig/p/lang.opt gpc-20040516/p/lang.opt +--- gpc-20040516.orig/p/lang.opt 2004-07-06 19:20:23.000000000 +0200 ++++ gpc-20040516/p/lang.opt 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1,474 @@ ++; Options for the Pascal front end. ++; Copyright (C) 2003 Free Software Foundation, Inc. ++; ++; This file is part of GCC. ++; ++; GCC is free software; you can redistribute it and/or modify it under ++; the terms of the GNU General Public License as published by the Free ++; Software Foundation; either version 2, or (at your option) any later ++; version. ++; ++; GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++; WARRANTY; without even the implied warranty of MERCHANTABILITY or ++; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++; for more details. ++; ++; You should have received a copy of the GNU General Public License ++; along with GCC; see the file COPYING. If not, write to the Free ++; Software Foundation, 59 Temple Place - Suite 330, Boston, MA ++; 02111-1307, USA. ++ ++; See c.opt for a description of this file's format. ++ ++; Please try to keep this file in ASCII collating order. ++ ++Language ++Pascal ++ ++famtmpfile= ++Pascal Joined RejectNegative ++(Internal switch used for automake) ++ ++fassertions ++Pascal ++Enable assertion checking (default) ++ ++fautobuild ++Pascal ++Automatically compile all units/modules/`{$L ...}' files and link the object files provided ++ ++fautolink ++Pascal ++Automatically link object files provided by units/modules or `{$L ...}' (default) ++ ++fautomake-gcc= ++Pascal Joined RejectNegative ++Set the C compiler invoked by automake ++ ++fautomake-g++= ++Pascal Joined RejectNegative ++Set the C++ compiler invoked by automake ++ ++fautomake-gpc= ++Pascal Joined RejectNegative ++Set the Pascal compiler invoked by automake ++ ++fautomake ++Pascal ++Automatically compile changed units/modules/`{$L ...}' files and link the object files provided ++ ++fbig-endian ++Pascal RejectNegative ++Tell GPC that the system is big-endian (for those targets where it can vary) ++ ++fborland-pascal ++Pascal RejectNegative ++Try to emulate Borland Pascal, version 7.0 ++ ++fcidefine= ++Pascal Joined RejectNegative ++Define a case-insensitive macro ++ ++fclassic-pascal-level-0 ++Pascal RejectNegative ++Reject conformant arrays and anything besides ISO 7185 Pascal ++ ++fclassic-pascal ++Pascal RejectNegative ++Reject anything besides ISO 7185 Pascal ++ ++fcsdefine= ++Pascal Joined RejectNegative ++Define a case-sensitive macro ++ ++fcstrings-as-strings ++Pascal ++Treat CStrings as strings ++ ++fdebug-automake ++Pascal RejectNegative ++(For GPC developers.) Give additional information about the actions of automake ++ ++fdebug-gpi ++Pascal RejectNegative ++(For GPC developers.) Show what is written to and read from GPI files (huge output!) ++ ++fdebug-info ++Pascal ++Inhibit `-g' options (temporary work-around, this option may disappear in the future) ++ ++fdebug-source ++Pascal RejectNegative ++Output the source while it is processed ++ ++fdebug-tree= ++Pascal Joined RejectNegative ++(For GPC developers.) Show the internal representation of a given tree node (name or address) ++ ++fdefault-paths ++Pascal ++Do not add a default path to the unit and object path ++ ++fdelphi-comments ++Pascal ++Allow Delphi style `//' comments (default) ++ ++fdelphi ++Pascal RejectNegative ++Try to emulate Borland Pascal, version 7.0, with some Delphi extensions ++ ++fdisable-keyword= ++Pascal Joined RejectNegative ++Disable a keyword, independently of dialect defaults ++ ++fdouble-quoted-strings ++Pascal ++Allow strings enclosed in \"\" (default) ++ ++fenable-keyword= ++Pascal Joined RejectNegative ++Enable a keyword, independently of dialect defaults ++ ++fexact-compare-strings ++Pascal ++Do not blank-pad strings for comparisons ++ ++fexecutable-file-name= ++Pascal Joined RejectNegative ++ ++ ++fexecutable-file-name ++Pascal RejectNegative ++Name for the output file, if specified; otherwise derive from main source file name ++ ++fexecutable-path ++Pascal ++Create the executable file in the directory where the main source is (default) ++ ++fexecutable-path= ++Pascal Joined RejectNegative ++Path where to create the executable file ++ ++fextended-pascal ++Pascal RejectNegative ++Reject anything besides ISO 10206 Extended Pascal ++ ++fextended-syntax ++Pascal ++same as `--ignore-function-results --pointer-arithmetic --cstrings-as-strings -Wno-absolute' (same as `{$X+}') ++ ++ffield-widths= ++Pascal Joined RejectNegative ++ ++ ++ffield-widths ++Pascal ++Optional colon-separated list of default field widths for Integer, Real, Boolean, LongInt, LongReal ++ ++fgnu-pascal ++Pascal RejectNegative ++Undo the effect of previous dialect options, allow all features again ++ ++fgpc-main= ++Pascal Joined RejectNegative ++External name for the program's entry point (default ++ `main') ++ ++fgpi-destination-path= ++Pascal Joined RejectNegative ++(Internal switch used for automake) ++ ++fignore-function-results ++Pascal ++Do not complain when a function is called like a procedure ++ ++fignore-garbage-after-dot ++Pascal ++Ignore anything after the terminating `.' (default in `--borland-pascal') ++ ++fignore-packed ++Pascal ++Ignore `packed' in the source code (default in `--borland-pascal') ++ ++fimplementation-only ++Pascal RejectNegative ++Do not produce a GPI file; only compile the implementation part ++ ++finit-modules= ++Pascal Joined RejectNegative ++Initialize the named modules in addition to those imported regularly; kind of a kludge ++ ++finterface-only ++Pascal RejectNegative ++Compile only the interface part of a unit/module and exit (creates `.gpi' file, no `.o' file) ++ ++fio-checking ++Pascal ++Check I/O operations automatically (same as `{$I+}') (default) ++ ++flittle-endian ++Pascal RejectNegative ++Tell GPC that the system is little-endian (for those targets where it can vary) ++ ++flongjmp-all-nonlocal-labels ++Pascal ++Use `longjmp' for all nonlocal labels ++ ++fmac-pascal ++Pascal RejectNegative ++Support (some features of) traditional Macintosh Pascal compilers ++ ++fmacros ++Pascal ++Expand macros (default) ++ ++fmaximum-field-alignment= ++Pascal Joined RejectNegative ++Set the maximum field alignment in bits if `pack-struct' is in effect ++ ++fmethods-always-virtual ++Pascal ++Make all methods virtual (default in `--mac-pascal') ++ ++fmixed-comments ++Pascal ++Allow comments like `{ ... *)' as required in ISO Pascal (default in ISO 7185/10206 Pascal mode) ++ ++fnested-comments ++Pascal ++Allow nested comments like `{ { } }' and `(* (* *) *)' ++ ++fobject-destination-path ++Pascal ++Create additional object files (e.g. of C files, not Pascal units) in the current directory (default) ++ ++fobject-destination-path= ++Pascal Joined RejectNegative ++Path where to create additional object files (e.g. of C files, not Pascal units) ++ ++fobject-pascal ++Pascal RejectNegative ++Reject anything besides (the implemented parts of) ANSI draft Object Pascal ++ ++fobject-path ++Pascal ++Forget about directories where to look for additional object (and source) files ++ ++fobject-path= ++Pascal Joined RejectNegative ++Directories where to look for additional object (and source) files ++ ++fpascal-sc ++Pascal RejectNegative ++Be strict about the implemented Pascal-SC extensions ++ ++fpedantic ++Pascal ++Reject everything not allowed in some dialect, e.g. redefinition of its keywords ++ ++fpointer-arithmetic ++Pascal ++Enable pointer arithmetic ++ ++fprint-needed-options ++Pascal RejectNegative ++Print the needed options ++ ++fprogress-bar ++Pascal ++Output number of processed lines while compiling ++ ++fprogress-messages ++Pascal ++Output source file names and line numbers while compiling ++ ++frange-checking ++Pascal ++Do automatic range checks (same as `{$R+}') (default) ++ ++fread-base-specifier ++Pascal ++In read statements, allow input base specifier `n#' (default) ++ ++fread-hex ++Pascal ++In read statements, allow hexadecimal input with `$' (default) ++ ++fread-white-space ++Pascal ++In read statements, require whitespace after numbers ++ ++fsetlimit= ++Pascal Joined RejectNegative ++Define the range for `set of Integer' etc. ++ ++fshort-circuit ++Pascal ++Guarantee short-circuit Boolean evaluation (default; same as `{$B-}') ++ ++fstack-checking ++Pascal ++Enable stack checking (same as `{$S+}') ++ ++fstandard-pascal-level-0 ++Pascal RejectNegative ++Synonym for `--classic-pascal-level-0' ++ ++fstandard-pascal ++Pascal RejectNegative ++Synonym for `--classic-pascal' ++ ++fsun-pascal ++Pascal RejectNegative ++Support (a few features of) Sun Pascal ++ ++ftransparent-file-names ++Pascal ++Derive external file names from variable names ++ ++ftruncate-strings ++Pascal ++Truncate strings being assigned to other strings of too short capacity. ++ ++ftyped-address ++Pascal ++Make the result of the address operator typed (same as `{$T+}', default) ++ ++fucsd-pascal ++Pascal RejectNegative ++Try to emulate UCSD Pascal ++ ++funit-destination-path ++Pascal ++Create object and GPI files of Pascal units in the current directory (default) ++ ++funit-destination-path= ++Pascal Joined RejectNegative ++Path where to create object and GPI files of Pascal units ++ ++funit-path ++Pascal ++Forget about directories where to look for unit/module sources ++ ++funit-path= ++Pascal Joined RejectNegative ++Directories where to look for unit/module sources ++ ++fuses= ++Pascal Joined RejectNegative ++Add an implicit `uses' clause ++ ++fvax-pascal ++Pascal RejectNegative ++Support (a few features of) VAX Pascal ++ ++fwrite-capital-exponent ++Pascal ++Write real exponents with a capital `E' ++ ++fwrite-clip-strings ++Pascal ++In write statements, truncate strings exceeding their field width (`Write (SomeLongString ++ 3)') ++ ++fwrite-real-blank ++Pascal ++Output a blank in front of positive reals in exponential form (default) ++ ++Wabsolute ++Pascal ++Warn about variables at absolute adresses and `absolute' variable with non-constant addresses (default) ++ ++Wall ++Pascal ++ ++ ++Wcomment ++Pascal ++ ++ ++Wfloat-equal ++Pascal ++Warn about `=' and `<>' comparisons of real numbers ++ ++Widentifier-case-local ++Pascal ++Warn about an identifier written with varying case within one program/module/unit ++ ++Widentifier-case ++Pascal ++Warn about an identifier written with varying case ++ ++Wimplicit-abstract ++Pascal ++Warn when an object type not declared `abstract' contains an abstract method (default) ++ ++Wimplicit-io ++Pascal ++Warn when `Input' or `Output' are used implicitly ++ ++Winherited-abstract ++Pascal ++Warn when an abstract object type inherits from a non-abstract one (default) ++ ++Winterface-file-name ++Pascal ++Warn when a unit/module interface differs from the file name ++ ++Wlocal-external ++Pascal ++Warn about local `external' declarations ++ ++Wmissing-declarations ++Pascal ++ ++ ++Wmissing-prototypes ++Pascal ++ ++ ++Wmixed-comments ++Pascal ++Warn about mixed comments like `{ ... *)' ++ ++Wnear-far ++Pascal ++Warn about use of useless `near' or `far' directives (default) ++ ++Wnested-comments ++Pascal ++Warn about nested comments like `{ { } }' ++ ++Wobject-assignment ++Pascal ++Warn when when assigning objects or declaring them as value parameters or function results (default) ++ ++Wpointer-arith ++Pascal ++ ++ ++Wsemicolon ++Pascal ++Warn about a semicolon after `then', `else' or `do' (default) ++ ++Wtyped-const ++Pascal ++Warn about misuse of typed constants as initialized variables (default) ++ ++Wundef ++Pascal ++ ++ ++Wunderscore ++Pascal ++Warn about double/leading/trailing underscores in identifiers ++ ++Wwarnings ++Pascal ++Enable warnings (same as `{$W+}') ++ ++Wwrite-strings ++Pascal ++ ++ ++; This comment is to ensure we retain the blank line above. +diff -ru gpc-20040516.orig/p/Make-lang.in gpc-20040516/p/Make-lang.in +--- gpc-20040516.orig/p/Make-lang.in 2004-05-14 23:51:21.000000000 +0200 ++++ gpc-20040516/p/Make-lang.in 2004-07-06 22:55:02.000000000 +0200 +@@ -52,7 +52,12 @@ + # `' for gcc-3.x + GPC_GCC_2_=2 + GPC_GCC_28_=8 ++GPC_GCC_34_PPQ_=foo ++GPC_GCC_34_PPP=$(GPC_GCC_34_PPQ_$(target_noncanonical)) ++GPC_GCC_34_PP_=34 ++GPC_GCC_34_=$(GPC_GCC_34_PP_$(GPC_GCC_34_PPP)) + GCC_VERSION_FOR_GPC=$(GPC_GCC_2_$(BACKEND))$(GPC_GCC_28_$(gcc_version)) ++GCC_VERSION_FOR_GPC34=$(GPC_GCC_34_)$(GCC_VERSION_FOR_GPC) + GPC_GCC_VERSION_28=$(version) + GPC_GCC_VERSION_2=$(gcc_version) + GPC_GCC_VERSION_=$(gcc_version) +@@ -91,11 +96,14 @@ + GPC_HOST_28=$(host) + GPC_HOST_2=$(host_canonical) + GPC_HOST_=$(host_canonical) +-GPC_HOST=$(GPC_HOST_$(GCC_VERSION_FOR_GPC)) ++GPC_HOST_34=$(host) ++GPC_HOST=$(GPC_HOST_$(GCC_VERSION_FOR_GPC34)) ++ + GPC_BUILD_28=$(build) + GPC_BUILD_2=$(build_canonical) + GPC_BUILD_=$(build_canonical) +-GPC_BUILD=$(GPC_BUILD_$(GCC_VERSION_FOR_GPC)) ++GPC_BUILD_34=$(build) ++GPC_BUILD=$(GPC_BUILD_$(GCC_VERSION_FOR_GPC34)) + + # gcc<3 doesn't set $(STAMP) and $(man1ext). + # gcc-3 does, but it should not matter to set them here again. +@@ -161,7 +169,11 @@ + GPC_INSTALL_NAME=`t='$(program_transform_name)'; echo gpc | sed $$t` + + # Actual names to use when installing a cross-compiler. +-GPC_CROSS_NAME=`t='$(program_transform_cross_name)'; echo gpc | sed $$t` ++GPC_CROSS_NAME_=`t='$(program_transform_cross_name)'; echo gpc | sed $$t` ++ ++GPC_CROSS_NAME_34=$(target_noncanonical)`t='$(program_transform_name)'; echo gpc | sed $$t` ++ ++GPC_CROSS_NAME=$(GPC_CROSS_NAME_$(GPC_GCC_34_)) + + # The GPC to use for compiling libgpc.a + # Usually the one we just built. +@@ -205,18 +217,32 @@ + HOST="$(GPC_HOST)" + + # Flags to pass when building the RTS. +-RTS_FLAGS_TO_PASS=\ ++RTS_FLAGS_TO_PASS_ALL=\ + GCC_VERSION="$(GPC_GCC_VERSION)" \ + SHELL="$(SHELL)" \ + CFLAGS="$(CFLAGS)" \ + PFLAGS="$(PFLAGS)" \ +- AR="$(AR_FOR_TARGET)" \ + AR_FLAGS="$(AR_FLAGS)" \ +- RANLIB="$(RANLIB_FOR_TARGET)" \ +- RANLIB_TEST="$(RANLIB_TEST_FOR_TARGET)" \ + RTSFLAGS="$(RTSFLAGS)" \ + DESTDIR="../.." + ++RTS_FLAGS_TO_PASS_28=\ ++ AR="$(AR)" \ ++ RANLIB="$(RANLIB)" \ ++ RANLIB_TEST="$(RANLIB_TEST)" ++ ++RTS_FLAGS_TO_PASS_=\ ++ AR="$(AR_FOR_TARGET)" \ ++ RANLIB="$(RANLIB_FOR_TARGET)" \ ++ RANLIB_TEST="$(RANLIB_TEST_FOR_TARGET)" ++ ++RTS_FLAGS_TO_PASS_2=$(RTS_FLAGS_TO_PASS_) ++ ++RTS_FLAGS_TO_PASS_34=$(RTS_FLAGS_TO_PASS_) ++ ++RTS_FLAGS_TO_PASS=$(RTS_FLAGS_TO_PASS_ALL) \ ++ $(RTS_FLAGS_TO_PASS_$(GCC_VERSION_FOR_GPC)) ++ + # Flags to pass when running the test suite. + TEST_FLAGS_TO_PASS=\ + MASK="$(MASK)" \ +@@ -377,8 +403,8 @@ + MAKEINFO_ES=LANG=es_ES LC_ALL=es_ES $(MAKEINFO) $(MAKEINFOFLAGS) $(GPC_DOC_DIRS_ES) + + # Define the names for selecting Pascal in LANGUAGES. +-Pascal pascal: xgpc$(exeext) gpc1$(exeext) gpcpp$(exeext) gpc-run pascal.utils \ +- pascal.rts specs pascal.generated-files pascal.docdemos ++Pascal pascal: xgpc$(exeext) gpc1$(exeext) gpcpp$(exeext) gpc-run \ ++ specs pascal.generated-files pascal.docdemos + + # Tell GNU make to ignore these if they exist. + .PHONY: Pascal pascal +@@ -511,6 +537,10 @@ + + pascal.generated-manpages: + ++pascal.man: ++ ++pascal.srcman: ++ + pascal.docdemos: p/stamp-docdemos + p/stamp-docdemos: $(GPC_TEXI_EN) + rm -rf p/docdemos +@@ -546,7 +576,9 @@ + GPC_GBE_H=$(CONFIG_H) system.h tree.h input.h rtl.h flags.h output.h expr.h \ + except.h function.h convert.h toplev.h $(GPC_GCC_VERSION_H) + P_H=$(GPC_GBE_H) p/gpc.h p/p-tree.def p/predef.h $(srcdir)/p/parse.h p/gbe.h +-ALL_GPC_FLAGS=$(ALL_CFLAGS) $(ALL_CPPFLAGS) $(GPC_ALL_WARNINGS) $(INCLUDES) -DGPC -I$(srcdir)/p ++ALL_GPC_FLAGS=$(ALL_CFLAGS) $(ALL_CPPFLAGS) $(GPC_ALL_WARNINGS) $(INCLUDES) \ ++ -DGPC -DGPC_UNITS_DIR=\"$(libsubdir)/units\" -I$(srcdir)/p ++ + + # Headers and flags for patched backend files. + GPC_BE_H=$(GPC_GBE_H) defaults.h machmode.h machmode.def real.h recog.h \ +@@ -569,7 +601,7 @@ + p/typecheck.o p/types.o p/convert.o p/dbxout.o p/dwarf2out.o \ + p/expr.o p/fold-const.o p/function.o p/integrate.o p/optabs.o \ + p/stor-layout.o p/toplev.o p/tree.o p/stmt.o p/emit-rtl.o \ +- p/version.o ++ p/version.o $(C_TARGET_OBJS) + + # Exclude patched files from language-independent object file list. + # Not necessary for gcc-3 since for a library (libbackend.a), the linker does this automatically. +@@ -607,9 +639,15 @@ + p/gpc-lex.o: p/gpc-lex.c $(srcdir)/p/pascal-lex.c $(P_H) + $(CC) -o $@ -c $(ALL_GPC_FLAGS) $< + +-p/lang.o: p/lang.c $(P_H) ++p/handle-opts.c: $(srcdir)/p/opts.sum $(srcdir)/p/mkopts2.pl ++ perl $(srcdir)/p/mkopts2.pl $(srcdir)/p/opts.sum > "$@" ++ ++p/lang.o: p/lang.c $(P_H) p/handle-opts.c + $(CC) -o $@ -c $(ALL_GPC_FLAGS) $< + ++$(srcdir)/p/lang.opt: $(srcdir)/p/opts.sum $(srcdir)/p/mk_lang_opt ++ $(srcdir)/p/mk_lang_opt < $(srcdir)/p/opts.sum > "$@" ++ + p/module.o: p/module.c $(P_H) p/version.h + $(CC) -o $@ -c $(ALL_GPC_FLAGS) -DTARGET_NAME=\"$(target_alias)\" $< + +@@ -683,6 +721,9 @@ + $(srcdir)/p/pascal-lex.c: $(srcdir)/p/pascal-lex.l + cd $(srcdir)/p && $(GPC_LEX) $(GPC_LEXFLAGS) -opascal-lex.c pascal-lex.l + ++p/version.o: version.c $(GPC_BE_H) ++ $(CC) -o $@ -c $(ALL_GPC_GBE_FLAGS) $< ++ + $(srcdir)/p/parse.c $(srcdir)/p/parse.h: $(srcdir)/p/parse.y + echo "expect 16 shift/reduce and 30 reduce/reduce conflicts" >&2 + cd $(srcdir)/p && $(BISON) $(BISONFLAGS) -o parse.c parse.y +@@ -728,9 +769,9 @@ + # Build hooks: + + pascal.all.build: xgpc$(exeext) +-pascal.all.cross: gpc-cross$(exeext) ++pascal.all.cross: gpc-cross$(exeext) pascal.rts pascal.utils + pascal.start.encap: +-pascal.rest.encap: ++pascal.rest.encap: pascal.rts pascal.utils + + pascal.info: $(srcdir)/p/doc/info/gpc.info \ + $(srcdir)/p/doc/info/gpcs.info \ +@@ -870,6 +911,10 @@ + rm -f $(DESTDIR)$(libsubdir)/gpcpp$(exeext) + $(INSTALL_PROGRAM) gpcpp$(exeext) $(DESTDIR)$(libsubdir)/gpcpp$(exeext) + ++install-gpcpp34: pascal.install-dir gpcpp$(exeext) ++ rm -f $(DESTDIR)$(libexecsubdir)/gpcpp$(exeext) ++ $(INSTALL_PROGRAM) gpcpp$(exeext) $(DESTDIR)$(libexecsubdir)/gpcpp$(exeext) ++ + # Install the driver program as $(target)-gpc + # and also as either gpc (if native) or $(tooldir)/bin/gpc. + pascal.install-common: pascal.install-dir xgpc$(exeext) gpc-run +@@ -897,9 +942,7 @@ + rm -f $(DESTDIR)$(libsubdir)/libgpc.a; \ + $(INSTALL_DATA) libgpc.a $(DESTDIR)$(libsubdir)/libgpc.a && \ + chmod a-x $(DESTDIR)$(libsubdir)/libgpc.a || exit 1; \ +- if $(RANLIB_TEST_FOR_TARGET); then \ +- $(RANLIB_FOR_TARGET) $(DESTDIR)$(libsubdir)/libgpc.a || exit 1; \ +- fi; \ ++ $(RANLIB_FOR_TARGET) $(DESTDIR)$(libsubdir)/libgpc.a; \ + fi + for f in .. $(GPC_EXTRA_INSTALL_LIBS); do \ + if [ x"$$f" != x.. ]; then \ +@@ -1020,6 +1063,8 @@ + done + chmod a-x $(DESTDIR)$(infodir)/gpc-es.info* $(DESTDIR)$(infodir)/gpcs-es.info* + ++pascal.install-compiler34: ++ + # Install gpc1 et.al. + # Do *not* overwrite files if they exist. + pascal.install-compiler: pascal.install-dir pascal +@@ -1046,8 +1091,8 @@ + chmod a-x $(DESTDIR)$(libsubdir)/specs || exit 1; \ + fi; exit 0 + +-pascal.install-normal: pascal.install-common pascal.install-compiler \ +- install-gpcpp pascal.install-utils pascal.install-lib pascal.install-man \ ++pascal.install-normal: pascal.install-common pascal.install-compiler$(GPC_GCC_34_) \ ++ install-gpcpp$(GPC_GCC_34_) pascal.install-utils pascal.install-lib pascal.install-man \ + pascal.install-info pascal.install-units pascal.install-doc + + # This target will install GPC into an existing GCC installation, +@@ -1166,7 +1211,8 @@ + + RTSSTAGESTUFF=p/rts/*.o p/rts/*.lo p/rts/*.gpi p/rts/*.gpd \ + p/rts/config.cache p/rts/config.log p/rts/config.status p/rts/Makefile \ +- p/rts/rts-config.h p/rts/rts-config.inc p/rts/needed-options ++ p/rts/rts-config.h p/rts/rts-config.inc p/rts/needed-options \ ++ p/rts/stamp-error-gpi + + pascal.stage1: + $(srcdir)/p/script/mkdir-p stage1/p/rts +Only in gpc-20040516/p: Make-lang.in.orig +diff -ru gpc-20040516.orig/p/mk_lang_opt gpc-20040516/p/mk_lang_opt +--- gpc-20040516.orig/p/mk_lang_opt 2004-07-06 19:20:15.000000000 +0200 ++++ gpc-20040516/p/mk_lang_opt 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1,34 @@ ++#!/bin/sh ++cat <<'EOF' ++; Options for the Pascal front end. ++; Copyright (C) 2003 Free Software Foundation, Inc. ++; ++; This file is part of GCC. ++; ++; GCC is free software; you can redistribute it and/or modify it under ++; the terms of the GNU General Public License as published by the Free ++; Software Foundation; either version 2, or (at your option) any later ++; version. ++; ++; GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++; WARRANTY; without even the implied warranty of MERCHANTABILITY or ++; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++; for more details. ++; ++; You should have received a copy of the GNU General Public License ++; along with GCC; see the file COPYING. If not, write to the Free ++; Software Foundation, 59 Temple Place - Suite 330, Boston, MA ++; 02111-1307, USA. ++ ++; See c.opt for a description of this file's format. ++ ++; Please try to keep this file in ASCII collating order. ++ ++Language ++Pascal ++ ++EOF ++ ++sed 's,:,:Pascal ,' | tr : '\001' | sort | tr '\001' : | sed 's, :,:,;s,$,:,' | tr : '\n' ++ ++echo "; This comment is to ensure we retain the blank line above." +diff -ru gpc-20040516.orig/p/mkopts2.pl gpc-20040516/p/mkopts2.pl +--- gpc-20040516.orig/p/mkopts2.pl 2004-07-06 19:20:07.000000000 +0200 ++++ gpc-20040516/p/mkopts2.pl 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1,22 @@ ++#!/usr/bin/perl ++ ++while(<>) { ++ chop; ++ s/:.*//; ++ $pl = $_; ++ $ol = $_; ++ $nl = $ol; ++ $nl =~ s/^(.)/\1no-/; ++ $pl =~ tr/+=-/___/; ++ print " case OPT_$pl:\n"; ++ if(/=$/) { ++ print " pp[0] = ACONCAT ((\"-$ol\", arg, NULL));\n"; ++ } else { ++ print " if (value)\n"; ++ print " pp[0] = \"-$ol\";\n"; ++ print " else\n"; ++ print " pp[0] = \"-$nl\";\n"; ++ } ++ print " pascal_decode_option(1, pp);\n"; ++ print " break;\n\n"; ++} +diff -ru gpc-20040516.orig/p/module.c gpc-20040516/p/module.c +--- gpc-20040516.orig/p/module.c 2004-05-12 02:42:02.000000000 +0200 ++++ gpc-20040516/p/module.c 2004-07-06 19:12:30.000000000 +0200 +@@ -114,7 +114,7 @@ + static char *locate_interface_source PARAMS ((const char *, const char *, const char *)); + static MEMFILE *gpi_open PARAMS ((tree, const char *, const char *, int, gpi_int *, gpi_int *, gpi_int *)); + static tree load_gpi_file PARAMS ((tree, const char *, int)); +-static void import_node PARAMS ((tree, tree)); ++static void import_node PARAMS ((tree, tree, tree, import_type)); + static void load_own_interface PARAMS ((int)); + static module_t find_module PARAMS ((tree, int)); + static void module_expand_exported_ranges PARAMS ((tree)); +@@ -124,6 +124,7 @@ + static void start_chunk PARAMS ((FILE *, int, gpi_int)); + static void store_string_chunk PARAMS ((FILE *, int, const char *)); + static inline void store_string PARAMS ((const char *)); ++static tree dequalify_id PARAMS ((tree)); + static void store_tree PARAMS ((tree, FILE *, tree, int)); + static int get_node_id PARAMS ((tree)); + static void store_node PARAMS ((tree)); +@@ -453,6 +454,7 @@ + int kind; + { + const char *n; ++ const char * current_module_name = 0; + if (kind == 1) + chk_dialect ("units are", U_B_D_M_PASCAL); + else if (kind == 2 || kind == 3) +@@ -468,20 +470,16 @@ + id = get_identifier ("noname"); + } + current_module = find_module (id, 1); ++ current_module->assembler_name = NULL; + if (kind == 0) + { + string_list *link_file; + for (link_file = current_module->link_files; link_file; link_file = link_file->next) + add_to_automake_temp_file (link_file->string); +- n = "init_pascal_main_program"; + current_module->main_program = current_module->implementation = 1; ++ current_module_name = "_p__M0"; ++ current_module->assembler_name = get_identifier (current_module_name); + } +- else +- n = ACONCAT (("init_", IDENTIFIER_POINTER (current_module->name), NULL)); +- current_module->initializers = build_tree_list (NULL_TREE, get_identifier (n)); +- n = ACONCAT (("fini_", IDENTIFIER_POINTER (current_module->name), NULL)); +- current_module->finalizer = build_implicit_routine_decl (get_identifier (n), +- void_type_node, build_tree_list (NULL_TREE, void_type_node), ER_STATIC); + if (par) + { + tree t; +@@ -496,13 +494,25 @@ + && TREE_VALUE (t) && list_length (TREE_VALUE (t)) == 1) + { + current_module->assembler_name = check_assembler_name (TREE_VALUE (TREE_VALUE (t))); +- n = ACONCAT (("init_", IDENTIFIER_POINTER (current_module->assembler_name), +- "_", IDENTIFIER_POINTER (current_module->name), NULL)); +- current_module->initializers = build_tree_list (NULL_TREE, get_identifier (n)); ++ current_module_name = IDENTIFIER_POINTER (current_module->assembler_name); + } + else + error ("unknown module attribute `%s'", IDENTIFIER_NAME (TREE_PURPOSE (t))); + } ++ if (!current_module->assembler_name) ++ { ++ char name_len[23]; ++ const char * mname = IDENTIFIER_POINTER (current_module->name); ++ sprintf (name_len, "%ld_", (long)strlen (mname)); ++ current_module_name = ACONCAT (("_p__M", name_len, mname, NULL)); ++ current_module->assembler_name = get_identifier (current_module_name); ++ } ++ n = ACONCAT ((current_module_name, "_init", NULL)); ++ current_module->initializers = build_tree_list (NULL_TREE, get_identifier (n)); ++ n = ACONCAT ((current_module_name, "_fini", NULL)); ++ current_module->finalizer = build_implicit_routine_decl (get_identifier (n), ++ void_type_node, build_tree_list (NULL_TREE, void_type_node), ER_STATIC); ++ + if (kind != 0) + pushlevel (0); + /* Unit autoexport */ +@@ -637,12 +647,22 @@ + + NAME is an IDENTIFIER_NODE of the exported interface name. + +- EXPORT_LIST is a TREE_LIST: ++ EXPORT_LIST is a TREE_LIST containig: ++ export "all" marker (TREE_PURPOSE == NULL_TREE, TREE_VALUE == NULL_TREE) ++ explicit exports ++ end of explictit exports marker (TREE_PURPOSE == integer_zero_node, ++ TREE_VALUE == NULL_TREE) ++ implicit ("all") exports ++ ++ normal export entries: + TREE_READONLY: protected + TREE_PURPOSE: Export renaming (new name) or NULL_TREE. + TREE_VALUE: IDENTIFIER_NODE of the exported name + or TREE_LIST if exporting a range (TREE_PURPOSE..TREE_VALUE) +- or NULL_TREE for "all" */ ++ ++ Later in `module_expand_exported_ranges' we replace TREE_LIST ++ representing range by NULL_TREE and we add entries for values. */ ++ + void + export_interface (name, export_list) + tree name, export_list; +@@ -666,8 +686,14 @@ + So the explicit exports take precendence. This is a bit fragile. */ + for (t = export_list; t && TREE_VALUE (t); t = TREE_CHAIN (t)) ; + if (t) +- current_module->autoexport = chainon (current_module->autoexport, +- build_tree_list (tree_last (export_list), build_tree_list (export_list, name))); ++ { ++ tree last = tree_last (export_list); ++ /* Mark end of explicit exports */ ++ TREE_CHAIN (last) = build_tree_list (integer_zero_node , NULL_TREE); ++ last = TREE_CHAIN (last); ++ current_module->autoexport = chainon (current_module->autoexport, ++ build_tree_list (last, build_tree_list (export_list, name))); ++ } + } + + /* Import module/unit interfaces specified on the command line via `--uses=...'. */ +@@ -715,7 +741,7 @@ + } + else + file_name = NULL_TREE; +- import_interface (interface_name, NULL_TREE, 0, file_name); ++ import_interface (interface_name, NULL_TREE, IMPORT_USES, file_name); + while (*p + && !((*p >= 'A' && *p <= 'Z') + || (*p >= 'a' && *p <= 'z') +@@ -1612,6 +1638,16 @@ + return 0; + } + ++static tree ++dequalify_id (id) ++ tree id; ++{ ++ char * str = IDENTIFIER_POINTER (id); ++ assert (str = strchr (str, '.')); ++ str++; ++ return get_identifier (str); ++} ++ + static void + store_tree (name, s, main_node, autoexport_flag) + tree name; +@@ -1623,6 +1659,7 @@ + gpi_int main_node_id, checksum; + tree main_node_end, t, *tt; + char *main_exported; ++ int autoexporting = 0; + + /* How many nodes will be stored (approx.; will be extended when necessary) */ + wb.size = list_length (main_node) + 1024 + NUM_SPECIAL_NODES; +@@ -1684,8 +1721,8 @@ + t = TREE_CHAIN (t); + } + +- /* Due to the autoexporting of enum type values, the main list may +- contain duplicates. Remove them here. */ ++ /* Due to the autoexporting of enum type values and operators, the main ++ list may contain duplicates. Remove them here. */ + main_exported = alloca (wb.size * sizeof (char)); + memset (main_exported, 0, wb.size * sizeof (char)); + tt = &TREE_CHAIN (main_node); +@@ -1694,12 +1731,17 @@ + int flag = 1; + tree id = TREE_VALUE (*tt), rename = TREE_PURPOSE (*tt); + if (!id) +- flag = 0; ++ { ++ flag = 0; ++ if (rename == integer_zero_node) ++ autoexporting = 1; ++ } + else if (TREE_CODE (id) != IMPORT_NODE) + { + int c1 = get_node_id (id); + int c2 = get_node_id (rename); + assert (TREE_CODE (id) == IDENTIFIER_NODE); ++ assert (!rename || !autoexporting); + if (id) + { + tree value = IDENTIFIER_VALUE (id); +@@ -1712,17 +1754,40 @@ + error ("exporting unknown identifier `%s'", IDENTIFIER_NAME (id)); + } + if (rename) +- TREE_VALUE (*tt) = rename; ++ { ++ TREE_VALUE (*tt) = rename; ++ if (value && TREE_CODE (value) == CONST_DECL ++ && PASCAL_CST_PRINCIPAL_ID (value)) ++ { ++ tree nd = build_decl (CONST_DECL, rename, ++ TREE_TYPE (value)); ++ DECL_INITIAL (nd) = DECL_INITIAL (value); ++ value = nd; ++ get_node_id (value); ++ FLUSH_NODES; ++ } ++ } ++ else if (PASCAL_QUALIFIED_ID (id)) ++ { ++ id = dequalify_id (id); ++ c1 = get_node_id (id); ++ while (wb.count > n) ++ FLUSH_NODES; ++ TREE_VALUE (*tt) = id; ++ } + TREE_PURPOSE (*tt) = value; + } +- if (rename && main_exported[c2]) ++ if (rename && main_exported[c2] == 1) + { + error ("duplicate exported identifier `%s' due to renaming", IDENTIFIER_NAME (rename)); + TREE_VALUE (*tt) = NULL_TREE; + } +- if (!TREE_VALUE (*tt) || !TREE_PURPOSE (*tt) || main_exported[c1]) ++ if (id && !rename && !autoexporting && main_exported[c1] == 1) ++ error ("duplicate exported identifier `%s'", IDENTIFIER_NAME (id)); ++ if (!TREE_VALUE (*tt) || !TREE_PURPOSE (*tt) || ++ (main_exported[c1] && autoexporting)) + flag = 0; +- main_exported[c1] = 1; ++ main_exported[c1] = rename ? 2 : 1; + main_exported[c2] = 1; + } + if (flag) +@@ -1888,6 +1953,8 @@ + else + DECL_EXTERNAL (t) = 1; /* not for module interface so init_any won't ignore it */ + } ++ PASCAL_DECL_WEAK (t) = 0; ++ PASCAL_DECL_IMPORTED (t) = 1; + rest_of_decl_compilation (t, NULL, 1, 1); + } + /* Support `private' for object fields/methods */ +@@ -2082,7 +2149,11 @@ + { + int i, l = NUMBER_OF_OPERANDS (code); + store_node (TREE_TYPE (t)); ++#ifndef GCC_3_4 + for (i = (code == CONSTRUCTOR) ? 1 : 0; i < l; i++) ++#else ++ for (i = 0; i < l; i++) ++#endif + store_node (TREE_OPERAND (t, i)); + class_done = 1; + break; +@@ -2113,10 +2184,14 @@ + break; + + case IMPORT_NODE: ++ { ++ gpi_int q = PASCAL_TREE_QUALIFIED (t); + store_node (IMPORT_INTERFACE (t)); + store_node (IMPORT_QUALIFIER (t)); + store_node (IMPORT_FILENAME (t)); ++ STORE_ANY (q); + break; ++ } + + case TREE_LIST: + { +@@ -2133,23 +2208,6 @@ + } + + case ENUMERAL_TYPE: +- /* For directly or indirectly exported enumerated types, mark their +- values here for exporting in the main list(!), but only in +- autoexported interfaces (EP, 6.11.2, note 2). +- Not storing TYPE_VALUES (t) directly causes the values not be +- connected with the type in an importing interface. Therefore, it +- will not automatically re-export the values again (BP behaves +- the same way). (fjf628.pas) */ +- if (wb.autoexport_flag) +- { +- tree item; +- for (item = TYPE_VALUES (t); item; item = TREE_CHAIN (item)) +- wb.append_additional_globals_to_export = +- TREE_CHAIN (wb.append_additional_globals_to_export) = +- build_tree_list (NULL_TREE, TREE_PURPOSE (item)); +- } +- /* FALLTHROUGH */ +- case VOID_TYPE: + case REAL_TYPE: + case COMPLEX_TYPE: + case BOOLEAN_TYPE: +@@ -2158,6 +2216,12 @@ + store_node (TREE_TYPE (t)); + store_node (TYPE_MIN_VALUE (t)); + store_node (TYPE_MAX_VALUE (t)); ++ if (code == ENUMERAL_TYPE) ++ store_node (TYPE_VALUES (t)); ++ break; ++ ++ case VOID_TYPE: ++ store_node (TREE_TYPE (t)); + break; + + case SET_TYPE: +@@ -2580,7 +2644,11 @@ + { + int i, l = NUMBER_OF_OPERANDS (code); + TREE_TYPE (t) = load_node (); ++#ifndef GCC_3_4 + for (i = (code == CONSTRUCTOR) ? 1 : 0; i < l; i++) ++#else ++ for (i = 0; i < l; i++) ++#endif + TREE_OPERAND (t, i) = load_node (); + break; + } +@@ -2631,10 +2699,15 @@ + } + + case IMPORT_NODE: ++ { ++ gpi_int q; + IMPORT_INTERFACE (t) = load_node (); + IMPORT_QUALIFIER (t) = load_node (); + IMPORT_FILENAME (t) = load_node (); ++ LOAD_ANY (q); ++ PASCAL_TREE_QUALIFIED (t) = q; + break; ++ } + + case TREE_LIST: + { +@@ -2652,7 +2725,6 @@ + break; + } + +- case VOID_TYPE: + case REAL_TYPE: + case COMPLEX_TYPE: + case BOOLEAN_TYPE: +@@ -2663,7 +2735,14 @@ + TYPE_MIN_VALUE (t) = load_node (); + TYPE_MAX_VALUE (t) = load_node (); + if (code == ENUMERAL_TYPE) +- TYPE_STUB_DECL (t) = build_decl (TYPE_DECL, NULL_TREE, t); ++ { ++ TYPE_VALUES (t) = load_node (); ++ TYPE_STUB_DECL (t) = build_decl (TYPE_DECL, NULL_TREE, t); ++ } ++ break; ++ ++ case VOID_TYPE: ++ TREE_TYPE (t) = load_node (); + break; + + case SET_TYPE: +@@ -2853,6 +2932,10 @@ + TREE_TYPE (t) = load_node (); + break; + ++ case OPERATOR_DECL: ++ TREE_TYPE (t) = void_type_node; ++ break; ++ + default: + break; + } +@@ -3458,19 +3541,49 @@ + return temp; + } + ++ + /* Activate a node during import */ + static void +-import_node (item, rename) ++import_node (item, rename, interface, qualified) + tree item, rename; ++ tree interface; ++ import_type qualified; + { + tree value = TREE_PURPOSE (item); ++ int no_principal = (rename && TREE_CODE (value) == CONST_DECL); ++ rename = rename ? rename : TREE_VALUE (item); + if (TREE_CODE (TREE_VALUE (item)) == IMPORT_NODE) + return; + TREE_READONLY (value) |= TREE_READONLY (item); + if (TREE_CODE (value) == FUNCTION_DECL && DECL_LANG_OPERATOR_DECL (value)) + operators_defined = 1; +- pushdecl_nocheck (value); +- IDENTIFIER_VALUE (rename ? rename : TREE_VALUE (item)) = value; ++ if (qualified == IMPORT_ISO || qualified == IMPORT_USES) ++ { ++ tree decl1 = interface ? copy_node (value) : value; ++ DECL_NAME (decl1) = rename; ++ PASCAL_DECL_WEAK (decl1) = 0; ++ PASCAL_DECL_IMPORTED (decl1) = 1; ++ if (no_principal) ++ PASCAL_CST_PRINCIPAL_ID (decl1) = 0; ++ IDENTIFIER_VALUE (rename) = pushdecl_import (decl1, ++ qualified == IMPORT_USES); ++ } ++ if (interface) ++ { ++ tree qdecl = copy_node(value); ++ tree qid = get_identifier (ACONCAT (( ++ IDENTIFIER_POINTER (interface), ++ ".", ++ IDENTIFIER_POINTER (rename), ++ NULL))); ++ PASCAL_DECL_WEAK (qdecl) = 0; ++ PASCAL_DECL_IMPORTED (qdecl) = 1; ++ DECL_NAME (qdecl) = qid; ++ if (no_principal) ++ PASCAL_CST_PRINCIPAL_ID (qdecl) = 0; ++ pushdecl_import (qdecl, 0); ++ IDENTIFIER_VALUE (qid) = qdecl; ++ } + TREE_USED (item) = 1; + } + +@@ -3500,7 +3613,7 @@ + t = TREE_PURPOSE (ename); + if (TREE_CODE (t) == FUNCTION_DECL && PASCAL_FORWARD_DECLARATION (t)) + set_forward_decl (t, 1); +- import_node (ename, NULL_TREE); ++ import_node (ename, NULL_TREE, NULL_TREE, IMPORT_ISO); + } + current_module->initializers = itab_get_initializers (interface_name); /* @@ use any interface name */ + } +@@ -3528,11 +3641,16 @@ + void + import_interface (interface, import_qualifier, qualified, filename) + tree interface, import_qualifier; +- int qualified; ++ import_type qualified; + tree filename; + { + tree exported_name_list, imported, exported, ename, iname; ++ tree import_decl; + struct predef *pd; ++#ifndef EGCS97 ++ struct obstack *ambient_obstack = current_obstack; ++ current_obstack = &permanent_obstack; ++#endif + + if (filename && TREE_CODE (filename) != STRING_CST) + { +@@ -3549,20 +3667,25 @@ + error ("self-dependent module or unit"); + return; + } +- +- for (imported = current_module->imports; imported; imported = TREE_CHAIN (imported)) +- if (interface == IMPORT_INTERFACE (TREE_VALUE (imported))) ++ import_decl = lookup_name_current_level (interface); ++ if (import_decl && TREE_CODE (import_decl) == NAMESPACE_DECL) + { +- error ("interface `%s' has already been imported", IDENTIFIER_NAME (interface)); ++ error ("interface `%s' has already been imported", ++ IDENTIFIER_NAME (interface)); + return; + } ++ import_decl = build_decl(NAMESPACE_DECL, interface, void_type_node); ++ pushdecl (import_decl); ++ for (imported = current_module->imports; imported; imported = TREE_CHAIN (imported)) ++ if (interface == IMPORT_INTERFACE (TREE_VALUE (imported))) ++ break; + + if (!imported) + { + tree t = make_node (IMPORT_NODE); + IMPORT_INTERFACE (t) = interface; + IMPORT_QUALIFIER (t) = import_qualifier; +- PASCAL_TREE_QUALIFIED (t) = !!qualified; ++ PASCAL_TREE_QUALIFIED (t) = qualified; + IMPORT_FILENAME (t) = filename; + imported = build_tree_list (NULL_TREE, t); + current_module->imports = chainon (current_module->imports, imported); +@@ -3590,6 +3713,7 @@ + for (exported = exported_interface_list; exported; exported = TREE_CHAIN (exported)) + if (TREE_VALUE (exported) == interface) + break; ++ + if (!exported) + { + const char *gpi_source; +@@ -3598,14 +3722,11 @@ + else + gpi_source = NULL; + exported = load_gpi_file (interface, gpi_source, 0); +- exported_interface_list = tree_cons (NULL_TREE, interface, exported_interface_list); ++ exported_interface_list = tree_cons (TREE_PURPOSE (exported), interface, exported_interface_list); + } + exported_name_list = TREE_PURPOSE (exported); + } + +- if (qualified) +- warning ("`qualified' not yet supported -- ignored"); +- + for (ename = exported_name_list; ename; ename = TREE_CHAIN (ename)) + TREE_USED (ename) = 0; + if (import_qualifier) +@@ -3616,7 +3737,7 @@ + ename = TREE_CHAIN (ename); + /* Activate this name and resolve possible import renaming. */ + if (ename) +- import_node (ename, TREE_VALUE (iname)); ++ import_node (ename, TREE_VALUE (iname), interface, qualified); + else + error ("interface `%s' does not export `%s'", + IDENTIFIER_NAME (interface), IDENTIFIER_NAME (TREE_PURPOSE (iname))); +@@ -3626,7 +3747,10 @@ + if (!(import_qualifier && TREE_PURPOSE (import_qualifier))) + for (ename = exported_name_list; ename; ename = TREE_CHAIN (ename)) + if (!TREE_USED (ename)) +- import_node (ename, NULL_TREE); ++ import_node (ename, NULL_TREE, interface, qualified); ++#ifndef EGCS97 ++ current_obstack = ambient_obstack; ++#endif + } + + /* Replace the exported TREE_LISTs denoting ranges by the actual identifier +@@ -3658,8 +3782,21 @@ + { + if (tree_int_cst_equal (TREE_VALUE (item), DECL_INITIAL (tlow))) + export_it = 1; +- if (export_it) +- exported = tree_cons (NULL_TREE, TREE_PURPOSE (item), exported); ++ if (export_it) ++ { ++ tree id = TREE_PURPOSE (item); ++ tree tid = lookup_name (id); ++ if ( !tid || TREE_CODE (tid) != CONST_DECL ++ || DECL_INITIAL (tid) != TREE_VALUE (item) ++ || !PASCAL_CST_PRINCIPAL_ID (tid)) ++ { ++ error ("Can not export range value %s", ++ IDENTIFIER_POINTER (id)); ++ error (" principal identifier not in scope"); ++ } ++ else ++ exported = tree_cons (NULL_TREE, id, exported); ++ } + if (tree_int_cst_equal (TREE_VALUE (item), DECL_INITIAL (thigh))) + { + if (!export_it) +diff -ru gpc-20040516.orig/p/objects.c gpc-20040516/p/objects.c +--- gpc-20040516.orig/p/objects.c 2004-05-12 17:08:07.000000000 +0200 ++++ gpc-20040516/p/objects.c 2004-07-06 19:08:51.000000000 +0200 +@@ -385,7 +385,12 @@ + PASCAL_METHOD (method) = 1; + TREE_PROTECTED (method) = protected_private == 1; + TREE_PRIVATE (method) = protected_private == 2; +- SET_DECL_ASSEMBLER_NAME (method, assembler_name ? check_assembler_name (assembler_name) : method_name); ++ if (assembler_name) ++ assembler_name = check_assembler_name (assembler_name); ++ else ++ assembler_name = pascal_mangle_names (object_name, ++ IDENTIFIER_POINTER (name)); ++ SET_DECL_ASSEMBLER_NAME (method, assembler_name); + DECL_LANG_SPECIFIC (method) = allocate_decl_lang_specific (); + DECL_LANG_PARMS (method) = TREE_PURPOSE (TREE_OPERAND (h, 1)); + DECL_LANG_RESULT_VARIABLE (method) = (TREE_CHAIN (heading) && TREE_PRIVATE (TREE_CHAIN (heading))) ? NULL_TREE : TREE_CHAIN (heading); +diff -ru gpc-20040516.orig/p/options.c gpc-20040516/p/options.c +--- gpc-20040516.orig/p/options.c 2004-05-14 16:38:19.000000000 +0200 ++++ gpc-20040516/p/options.c 2004-07-06 19:08:51.000000000 +0200 +@@ -27,6 +27,10 @@ + #include "gpc-options.h" + #include "p/version.h" + ++#ifdef GCC_3_4 ++#include "options.h" ++#endif ++ + /* An array with all long Pascal command-line switches. */ + static const struct + { +@@ -890,8 +894,13 @@ + + /* This initialization is run once per compilation just before command-line + options are processed. */ ++#ifndef GCC_3_4 + void + pascal_init_options () ++#else ++unsigned int ++pascal_init_options (unsigned int argc, const char * * argv) ++#endif + { + const char *const *option; + char *p, *q, *r; +@@ -901,10 +910,14 @@ + version number there, let's at least output it here ... */ + /* Great! toplev.h doesn't even export version_flag, so check for + it again. :-/ At least it exports save_arg[cv] ... */ ++#ifndef GCC_3_4 + int version_flag = 0, i; + for (i = 1; i < save_argc; i++) + if (!strcmp (save_argv[i], "-version")) + version_flag = 1; ++#else ++ const char * * save_argv = argv; ++#endif + if (version_flag) + fprintf (stderr, "GNU Pascal version is actually %s, based on gcc-%s\n", GPC_RELEASE_STRING, version_string); + +@@ -920,6 +933,7 @@ + /* Initialize the default paths, using the directory we are living in. */ + string_append (&default_unit_path, getenv ("GPC_UNIT_PATH"), path_separator_str); + string_append (&default_object_path, getenv ("GPC_OBJECT_PATH"), path_separator_str); ++#ifndef GCC_3_4 + p = save_string (save_argv[0]); + q = p + strlen (p) - 1; + while (q >= p && !IS_DIR_SEPARATOR (*q)) +@@ -933,6 +947,10 @@ + string_append (&default_unit_path, p, path_separator_str); + } + free (p); ++#else ++ string_append (&default_unit_path, GPC_UNITS_DIR, path_separator_str); ++ return CL_Pascal; ++#endif + } + + void +diff -ru gpc-20040516.orig/p/opts.sum gpc-20040516/p/opts.sum +--- gpc-20040516.orig/p/opts.sum 2004-07-06 19:20:03.000000000 +0200 ++++ gpc-20040516/p/opts.sum 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1,111 @@ ++Wall:: ++Wcomment:: ++Wmissing-declarations:: ++Wmissing-prototypes:: ++Wpointer-arith:: ++Wundef:: ++Wwrite-strings:: ++fexecutable-file-name=:Joined RejectNegative: ++ffield-widths=:Joined RejectNegative: ++Wabsolute::Warn about variables at absolute adresses and `absolute' variable with non-constant addresses (default) ++Wfloat-equal::Warn about `=' and `<>' comparisons of real numbers ++Widentifier-case-local::Warn about an identifier written with varying case within one program/module/unit ++Widentifier-case::Warn about an identifier written with varying case ++Wimplicit-abstract::Warn when an object type not declared `abstract' contains an abstract method (default) ++Wimplicit-io::Warn when `Input' or `Output' are used implicitly ++Winherited-abstract::Warn when an abstract object type inherits from a non-abstract one (default) ++Winterface-file-name::Warn when a unit/module interface differs from the file name ++Wlocal-external::Warn about local `external' declarations ++Wmixed-comments::Warn about mixed comments like `{ ... *)' ++Wnear-far::Warn about use of useless `near' or `far' directives (default) ++Wnested-comments::Warn about nested comments like `{ { } }' ++Wobject-assignment::Warn when when assigning objects or declaring them as value parameters or function results (default) ++Wsemicolon::Warn about a semicolon after `then', `else' or `do' (default) ++Wtyped-const::Warn about misuse of typed constants as initialized variables (default) ++Wunderscore::Warn about double/leading/trailing underscores in identifiers ++Wwarnings::Enable warnings (same as `{$W+}') ++fassertions::Enable assertion checking (default) ++fautobuild::Automatically compile all units/modules/`{$L ...}' files and link the object files provided ++fautolink::Automatically link object files provided by units/modules or `{$L ...}' (default) ++fautomake::Automatically compile changed units/modules/`{$L ...}' files and link the object files provided ++fcstrings-as-strings::Treat CStrings as strings ++fdelphi-comments::Allow Delphi style `//' comments (default) ++fdouble-quoted-strings::Allow strings enclosed in \"\" (default) ++fexact-compare-strings::Do not blank-pad strings for comparisons ++fextended-syntax::same as `--ignore-function-results --pointer-arithmetic --cstrings-as-strings -Wno-absolute' (same as `{$X+}') ++ffield-widths::Optional colon-separated list of default field widths for Integer, Real, Boolean, LongInt, LongReal ++fignore-function-results::Do not complain when a function is called like a procedure ++fignore-garbage-after-dot::Ignore anything after the terminating `.' (default in `--borland-pascal') ++fignore-packed::Ignore `packed' in the source code (default in `--borland-pascal') ++fio-checking::Check I/O operations automatically (same as `{$I+}') (default) ++flongjmp-all-nonlocal-labels::Use `longjmp' for all nonlocal labels ++fmacros::Expand macros (default) ++fmethods-always-virtual::Make all methods virtual (default in `--mac-pascal') ++fmixed-comments::Allow comments like `{ ... *)' as required in ISO Pascal (default in ISO 7185/10206 Pascal mode) ++fnested-comments::Allow nested comments like `{ { } }' and `(* (* *) *)' ++fpedantic::Reject everything not allowed in some dialect, e.g. redefinition of its keywords ++fpointer-arithmetic::Enable pointer arithmetic ++fprogress-bar::Output number of processed lines while compiling ++fprogress-messages::Output source file names and line numbers while compiling ++frange-checking::Do automatic range checks (same as `{$R+}') (default) ++fread-base-specifier::In read statements, allow input base specifier `n#' (default) ++fread-hex::In read statements, allow hexadecimal input with `$' (default) ++fread-white-space::In read statements, require whitespace after numbers ++fshort-circuit::Guarantee short-circuit Boolean evaluation (default; same as `{$B-}') ++fstack-checking::Enable stack checking (same as `{$S+}') ++ftransparent-file-names::Derive external file names from variable names ++ftruncate-strings::Truncate strings being assigned to other strings of too short capacity. ++ftyped-address::Make the result of the address operator typed (same as `{$T+}', default) ++fwrite-capital-exponent::Write real exponents with a capital `E' ++fwrite-clip-strings::In write statements, truncate strings exceeding their field width (`Write (SomeLongString : 3)') ++fwrite-real-blank::Output a blank in front of positive reals in exponential form (default) ++fbig-endian:RejectNegative:Tell GPC that the system is big-endian (for those targets where it can vary) ++fborland-pascal:RejectNegative:Try to emulate Borland Pascal, version 7.0 ++fclassic-pascal-level-0:RejectNegative:Reject conformant arrays and anything besides ISO 7185 Pascal ++fclassic-pascal:RejectNegative:Reject anything besides ISO 7185 Pascal ++fdebug-automake:RejectNegative:(For GPC developers.) Give additional information about the actions of automake ++fdebug-gpi:RejectNegative:(For GPC developers.) Show what is written to and read from GPI files (huge output!) ++fdebug-source:RejectNegative:Output the source while it is processed ++fdelphi:RejectNegative:Try to emulate Borland Pascal, version 7.0, with some Delphi extensions ++fexecutable-file-name:RejectNegative:Name for the output file, if specified; otherwise derive from main source file name ++fextended-pascal:RejectNegative:Reject anything besides ISO 10206 Extended Pascal ++fgnu-pascal:RejectNegative:Undo the effect of previous dialect options, allow all features again ++fimplementation-only:RejectNegative:Do not produce a GPI file; only compile the implementation part ++finterface-only:RejectNegative:Compile only the interface part of a unit/module and exit (creates `.gpi' file, no `.o' file) ++flittle-endian:RejectNegative:Tell GPC that the system is little-endian (for those targets where it can vary) ++fmac-pascal:RejectNegative:Support (some features of) traditional Macintosh Pascal compilers ++fdebug-info::Inhibit `-g' options (temporary work-around, this option may disappear in the future) ++fdefault-paths::Do not add a default path to the unit and object path ++fexecutable-path::Create the executable file in the directory where the main source is (default) ++fobject-destination-path::Create additional object files (e.g. of C files, not Pascal units) in the current directory (default) ++fobject-path::Forget about directories where to look for additional object (and source) files ++funit-destination-path::Create object and GPI files of Pascal units in the current directory (default) ++funit-path::Forget about directories where to look for unit/module sources ++fobject-pascal:RejectNegative:Reject anything besides (the implemented parts of) ANSI draft Object Pascal ++fpascal-sc:RejectNegative:Be strict about the implemented Pascal-SC extensions ++fprint-needed-options:RejectNegative:Print the needed options ++fstandard-pascal-level-0:RejectNegative:Synonym for `--classic-pascal-level-0' ++fstandard-pascal:RejectNegative:Synonym for `--classic-pascal' ++fsun-pascal:RejectNegative:Support (a few features of) Sun Pascal ++fucsd-pascal:RejectNegative:Try to emulate UCSD Pascal ++fvax-pascal:RejectNegative:Support (a few features of) VAX Pascal ++famtmpfile=:Joined RejectNegative:(Internal switch used for automake) ++fautomake-g++=:Joined RejectNegative:Set the C++ compiler invoked by automake ++fautomake-gcc=:Joined RejectNegative:Set the C compiler invoked by automake ++fautomake-gpc=:Joined RejectNegative:Set the Pascal compiler invoked by automake ++fcidefine=:Joined RejectNegative:Define a case-insensitive macro ++fcsdefine=:Joined RejectNegative:Define a case-sensitive macro ++fdebug-tree=:Joined RejectNegative:(For GPC developers.) Show the internal representation of a given tree node (name or address) ++fdisable-keyword=:Joined RejectNegative:Disable a keyword, independently of dialect defaults ++fenable-keyword=:Joined RejectNegative:Enable a keyword, independently of dialect defaults ++fexecutable-path=:Joined RejectNegative:Path where to create the executable file ++fgpc-main=:Joined RejectNegative:External name for the program's entry point (default: `main') ++fgpi-destination-path=:Joined RejectNegative:(Internal switch used for automake) ++finit-modules=:Joined RejectNegative:Initialize the named modules in addition to those imported regularly; kind of a kludge ++fmaximum-field-alignment=:Joined RejectNegative:Set the maximum field alignment in bits if `pack-struct' is in effect ++fobject-destination-path=:Joined RejectNegative:Path where to create additional object files (e.g. of C files, not Pascal units) ++fobject-path=:Joined RejectNegative:Directories where to look for additional object (and source) files ++fsetlimit=:Joined RejectNegative:Define the range for `set of Integer' etc. ++funit-destination-path=:Joined RejectNegative:Path where to create object and GPI files of Pascal units ++funit-path=:Joined RejectNegative:Directories where to look for unit/module sources ++fuses=:Joined RejectNegative:Add an implicit `uses' clause +diff -ru gpc-20040516.orig/p/parse.y gpc-20040516/p/parse.y +--- gpc-20040516.orig/p/parse.y 2004-05-12 17:04:56.000000000 +0200 ++++ gpc-20040516/p/parse.y 2004-07-06 19:12:30.000000000 +0200 +@@ -77,6 +77,8 @@ + static int parentheses_count = 0; + static tree iso_no_parentheses PARAMS ((tree)); + ++static int in_uses = 0; ++ + enum { od_none, od_uses, od_label, od_const, od_type, od_var, od_routine }; + static int check_decl_order PARAMS ((int, int)); + +@@ -86,7 +88,17 @@ + union yyGLRStackItem; + static void locations PARAMS ((YYLTYPE *, const union yyGLRStackItem*, int)); + #define YYLLOC_DEFAULT(DEST, SRC, N) locations (&DEST, SRC, N) ++#ifndef GCC_3_4 + #define LOCATION_NOTE(LOC) if (current_function_decl) emit_line_note ((LOC).first_file, (LOC).first_line) ++#else ++#define LOCATION_NOTE(LOC) if (current_function_decl) \ ++ { \ ++ location_t loc_aux; \ ++ loc_aux.file = (LOC).first_file; \ ++ loc_aux.line = (LOC).first_line; \ ++ emit_line_note (loc_aux); \ ++ } ++#endif + #define COPYLOC(D, S) (* (YYLTYPE *) memcpy (&(D), &(S), sizeof (YYLTYPE))) + + #define YYASSERT assert +@@ -113,6 +125,9 @@ + - put all the look-ahead tokens needed in the precedence in one single + `%nonassoc' declaration. */ + ++%nonassoc prec_id ++%nonassoc '.' ++ + /* Dangling else */ + %nonassoc prec_if + +@@ -127,7 +142,8 @@ + p_else + + /* higher than prec_import */ +- p_uses p_implementation p_constructor p_destructor p_operator ++ p_uses p_initialization p_implementation p_constructor p_destructor ++ p_operator + + /* higher than prec_lower_than_error */ + error +@@ -216,6 +232,7 @@ + optional_variable_directive_list subrange_type object_section conformant_array + operator_symbol initializer_expression typename_or_string255 asm_clobbers term + id_list factor attrib id_list_limited id_list1 intconst caret_letter id null ++ qualified_id_access typename_1 new_quid + err + + /* Unimplemented ISO initializers +@@ -368,7 +385,7 @@ + + optional_unit_implementation: + { chk_dialect ("units without `implementation' part are", U_M_PASCAL); } +- | p_implementation declarations_and_uses optional_unit_init_and_final_part { } ++ | p_implementation optional_import_part1 declarations_and_uses optional_unit_init_and_final_part { } + ; + + module: +@@ -543,25 +560,40 @@ + ; + + export_list_item: +- new_identifier optional_rename ++ new_quid optional_rename + { $$ = build_tree_list ($2, $1); } +- | new_identifier LEX_RANGE new_identifier ++ | new_quid LEX_RANGE new_quid + { $$ = build_tree_list (NULL_TREE, build_tree_list ($1, $3)); } +- | i_protected new_identifier optional_rename ++ | i_protected new_quid optional_rename + { $$ = build_tree_list ($3, $2); TREE_READONLY ($$) = 1; } + ; + ++new_quid: ++ new_identifier ++ | new_identifier '.' new_identifier ++ { $$ = build_qualified_id ($1,$3);} ++ ; ++ + optional_rename: + null + | LEX_RENAME new_identifier + { $$ = $2; } + ; + +-optional_import_part: ++ ++extra_import_part: + /* empty */ + { do_extra_import (); } +- | { do_extra_import (); } +- p_import import_specification_list ';' %prec prec_import ++ ; ++ ++optional_import_part1: ++ /* empty */ ++ | ++ p_import { in_uses = 0 } import_specification_list ';' %prec prec_import ++ ; ++ ++optional_import_part: ++ extra_import_part optional_import_part1 + ; + + import_specification_list: +@@ -572,7 +604,7 @@ + ; + + uses_part: +- p_uses uses_list ';' ++ p_uses { in_uses = 1 } uses_list ';' + { $$ = od_uses; } + ; + +@@ -585,7 +617,8 @@ + + import_specification: + new_identifier optional_access_qualifier optional_import_qualifier optional_unit_filename +- { import_interface ($1, $3, $2, $4); } ++ { import_interface ($1, $3, ($2 == 1) ? IMPORT_QUALIFIED : ++ (in_uses ? IMPORT_USES : IMPORT_ISO), $4); } + ; + + optional_access_qualifier: +@@ -829,7 +862,7 @@ + ; + + typename: +- id ++ typename_1 + { + tree decl = lookup_name ($1); + $$ = error_mark_node; +@@ -842,6 +875,12 @@ + } + ; + ++typename_1: ++ id ++ | id '.' id ++ { $$ = build_qualified_id ($1,$3);} ++ ; ++ + actual_schema_discriminants: + '(' discriminant_expression_list ')' + { chk_dialect ("schema/string discriminants are", E_O_PASCAL); $$ = $2; } +@@ -916,15 +955,15 @@ + /* Pointers */ + new_pointer_type: + '@' pointer_domain_type +- { $$ = EM ($2) ? error_mark_node : build_pointer_type ($2); } ++ { $$ = EM ($2) ? error_mark_node : build_pascal_pointer_type ($2); } + | '^' pointer_domain_type +- { $$ = EM ($2) ? error_mark_node : build_pointer_type ($2); } ++ { $$ = EM ($2) ? error_mark_node : build_pascal_pointer_type ($2); } + | LEX_CARET_WHITE pointer_domain_type +- { $$ = EM ($2) ? error_mark_node : build_pointer_type ($2); } ++ { $$ = EM ($2) ? error_mark_node : build_pascal_pointer_type ($2); } + | pointer_char p_const pointer_domain_type + { + chk_dialect ("pointers to `const' types are", GNU_PASCAL); +- $$ = EM ($3) ? error_mark_node : build_pointer_type (p_build_type_variant ($3, 1, TYPE_VOLATILE ($3))); ++ $$ = EM ($3) ? error_mark_node : build_pascal_pointer_type (p_build_type_variant ($3, 1, TYPE_VOLATILE ($3))); + } + ; + +@@ -1551,6 +1590,7 @@ + { declare_routine ($1, $3, 0); } + | routine_or_method_heading ';' optional_routine_directive_list + { $$ = start_routine ($1, $3); } ++ optional_import_part1 + any_declaration_part + { + do_setjmp (); +@@ -2330,8 +2370,14 @@ + | variable_or_routine_access_no_builtin_function + ; + +-variable_or_routine_access_no_builtin_function: ++qualified_id_access: + identifier ++ | id '.' new_identifier ++ { $$ = build_qualified_or_component_acces ($1, $3); } ++ ; ++ ++variable_or_routine_access_no_builtin_function: ++ qualified_id_access + | p_inherited new_identifier + { $$ = build_inherited_method ($2); } + | variable_or_routine_access_no_parentheses '.' new_identifier +@@ -2638,7 +2684,7 @@ + + identifier: + id +- { $$ = check_identifier ($1); } ++ { $$ = check_identifier ($1); } %prec prec_id + ; + + id: +@@ -2809,7 +2855,16 @@ + parser in the right places causes some conflicts (especially assignments + with nontrivial expressions on their left side are problematic). */ + if (current_function_decl) ++#ifndef GCC_3_4 + emit_line_note (dest->first_file, dest->first_line); ++#else ++ { ++ location_t loc_aux; ++ loc_aux.file = dest->first_file; ++ loc_aux.line = dest->first_line; ++ emit_line_note (loc_aux); ++ } ++#endif + } + dest->option_id = 0; + for (i = 1; i <= n; i++) +diff -ru gpc-20040516.orig/p/p-tree.def gpc-20040516/p/p-tree.def +--- gpc-20040516.orig/p/p-tree.def 2004-01-01 00:11:33.000000000 +0100 ++++ gpc-20040516/p/p-tree.def 2004-07-06 19:08:51.000000000 +0200 +@@ -38,4 +38,5 @@ + DEFTREECODE (POWER_EXPR, "power_expr", "2", 2) + DEFTREECODE (POW_EXPR, "pow_expr", "2", 2) + DEFTREECODE (SYMDIFF_EXPR, "symdiff_expr", "2", 2) ++DEFTREECODE (NAMESPACE_DECL, "namespace_decl", "d", 0) + #endif +diff -ru gpc-20040516.orig/p/rts/endian.pas gpc-20040516/p/rts/endian.pas +--- gpc-20040516.orig/p/rts/endian.pas 2004-01-01 00:23:28.000000000 +0100 ++++ gpc-20040516/p/rts/endian.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -30,7 +30,7 @@ + + {$gnu-pascal,I-} + +-unit Endian; attribute (name = 'GPC'); ++unit Endian; attribute (name = '_p__rts_Endian'); + + interface + +diff -ru gpc-20040516.orig/p/rts/error.pas gpc-20040516/p/rts/error.pas +--- gpc-20040516.orig/p/rts/error.pas 2004-05-12 16:31:05.000000000 +0200 ++++ gpc-20040516/p/rts/error.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Error; attribute (name = 'GPC'); ++unit Error; attribute (name = '_p__rts_Error'); + + interface + +diff -ru gpc-20040516.orig/p/rts/filename.pas gpc-20040516/p/rts/filename.pas +--- gpc-20040516.orig/p/rts/filename.pas 2004-05-07 16:48:07.000000000 +0200 ++++ gpc-20040516/p/rts/filename.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit FileName; attribute (name = 'GPC'); ++unit FileName; attribute (name = '_p__rts_FileName'); + + interface + +diff -ru gpc-20040516.orig/p/rts/files.pas gpc-20040516/p/rts/files.pas +--- gpc-20040516.orig/p/rts/files.pas 2004-05-07 16:48:09.000000000 +0200 ++++ gpc-20040516/p/rts/files.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Files; attribute (name = 'GPC'); ++unit Files; attribute (name = '_p__rts_Files'); + + interface + +diff -ru gpc-20040516.orig/p/rts/getopt.pas gpc-20040516/p/rts/getopt.pas +--- gpc-20040516.orig/p/rts/getopt.pas 2004-05-07 16:48:11.000000000 +0200 ++++ gpc-20040516/p/rts/getopt.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -30,7 +30,7 @@ + + {$gnu-pascal,I-} + +-unit GetOpt; attribute (name = 'GPC'); ++unit GetOpt; attribute (name = '_p__rts_GetOpt'); + + interface + +diff -ru gpc-20040516.orig/p/rts/heap.pas gpc-20040516/p/rts/heap.pas +--- gpc-20040516.orig/p/rts/heap.pas 2004-04-08 14:34:05.000000000 +0200 ++++ gpc-20040516/p/rts/heap.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Heap; attribute (name = 'GPC'); ++unit Heap; attribute (name = '_p__rts_Heap'); + + interface + +diff -ru gpc-20040516.orig/p/rts/init.pas gpc-20040516/p/rts/init.pas +--- gpc-20040516.orig/p/rts/init.pas 2004-05-07 16:48:14.000000000 +0200 ++++ gpc-20040516/p/rts/init.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -30,7 +30,7 @@ + + {$gnu-pascal,I-} + +-unit Init; attribute (name = 'GPC'); ++unit Init; attribute (name = '_p__rts_Init'); + + interface + +@@ -264,7 +264,7 @@ + if InitProc <> nil then InitProc^ + end; + +-procedure InitInit; external name 'init_GPC_Init'; ++procedure InitInit; external name '_p__rts_Init_init'; + + procedure GPC_Initialize (ArgumentCount: Integer; Arguments, StartEnvironment: PCStrings; Options: Integer); + begin +diff -ru gpc-20040516.orig/p/rts/Makefile.in gpc-20040516/p/rts/Makefile.in +--- gpc-20040516.orig/p/rts/Makefile.in 2004-05-13 15:56:28.000000000 +0200 ++++ gpc-20040516/p/rts/Makefile.in 2004-07-06 19:08:51.000000000 +0200 +@@ -190,7 +190,7 @@ + $(GPCLIB): $(OBJS) + -rm -f $(GPCLIB) + $(AR) $(AR_FLAGS) $(GPCLIB) $(OBJS) +- if $(RANLIB_TEST); then $(RANLIB) $(GPCLIB); else true; fi ++ -$(RANLIB) $(GPCLIB) + + # That's a way to do an `if' that even a stupid make understands ... + sharedlib. sharedlib.no sharedlib.@with_shared$(DUMMY)@: +diff -ru gpc-20040516.orig/p/rts/math.pas gpc-20040516/p/rts/math.pas +--- gpc-20040516.orig/p/rts/math.pas 2004-05-12 16:47:11.000000000 +0200 ++++ gpc-20040516/p/rts/math.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -33,7 +33,7 @@ + + {$gnu-pascal,I-} + +-unit Math; attribute (name = 'GPC'); ++unit Math; attribute (name = '_p__rts_Math'); + + interface + +diff -ru gpc-20040516.orig/p/rts/move.pas gpc-20040516/p/rts/move.pas +--- gpc-20040516.orig/p/rts/move.pas 2004-01-01 00:23:08.000000000 +0100 ++++ gpc-20040516/p/rts/move.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Move; attribute (name = 'GPC'); ++unit Move; attribute (name = '_p__rts_Move'); + + interface + +diff -ru gpc-20040516.orig/p/rts/numtodec.pas gpc-20040516/p/rts/numtodec.pas +--- gpc-20040516.orig/p/rts/numtodec.pas 2004-01-01 00:23:06.000000000 +0100 ++++ gpc-20040516/p/rts/numtodec.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -33,7 +33,7 @@ + + {$gnu-pascal,I-} + +-unit NumToDec; attribute (name = 'GPC'); ++unit NumToDec; attribute (name = '_p__rts_NumToDec'); + + interface + +diff -ru gpc-20040516.orig/p/rts/random.pas gpc-20040516/p/rts/random.pas +--- gpc-20040516.orig/p/rts/random.pas 2004-05-08 14:34:20.000000000 +0200 ++++ gpc-20040516/p/rts/random.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Random; attribute (name = 'GPC'); ++unit Random; attribute (name = '_p__rts_Random'); + + interface + +diff -ru gpc-20040516.orig/p/rts/rtsc.pas gpc-20040516/p/rts/rtsc.pas +--- gpc-20040516.orig/p/rts/rtsc.pas 2004-05-15 21:54:02.000000000 +0200 ++++ gpc-20040516/p/rts/rtsc.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -40,7 +40,7 @@ + + {$gnu-pascal,I-} + +-unit RTSC; attribute (name = 'GPC'); ++unit RTSC; attribute (name = '_p__rts_RTSC'); + + interface + +diff -ru gpc-20040516.orig/p/rts/sets.pas gpc-20040516/p/rts/sets.pas +--- gpc-20040516.orig/p/rts/sets.pas 2004-01-01 00:22:52.000000000 +0100 ++++ gpc-20040516/p/rts/sets.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -40,7 +40,7 @@ + + {$gnu-pascal,I-} { @@ $R- } + +-unit Sets; attribute (name = 'GPC'); ++unit Sets; attribute (name = '_p__rts_Sets'); + + interface + +diff -ru gpc-20040516.orig/p/rts/string1.pas gpc-20040516/p/rts/string1.pas +--- gpc-20040516.orig/p/rts/string1.pas 2004-05-07 16:47:39.000000000 +0200 ++++ gpc-20040516/p/rts/string1.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -32,7 +32,7 @@ + + {$gnu-pascal,I-} + +-unit String1; attribute (name = 'GPC'); ++unit String1; attribute (name = '_p__rts_String1'); + + interface + +diff -ru gpc-20040516.orig/p/rts/string2.pas gpc-20040516/p/rts/string2.pas +--- gpc-20040516.orig/p/rts/string2.pas 2004-05-07 16:48:19.000000000 +0200 ++++ gpc-20040516/p/rts/string2.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit String2; attribute (name = 'GPC'); ++unit String2; attribute (name = '_p__rts_String2'); + + interface + +diff -ru gpc-20040516.orig/p/rts/time.pas gpc-20040516/p/rts/time.pas +--- gpc-20040516.orig/p/rts/time.pas 2004-05-07 16:48:27.000000000 +0200 ++++ gpc-20040516/p/rts/time.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -31,7 +31,7 @@ + + {$gnu-pascal,I-} + +-unit Time; attribute (name = 'GPC'); ++unit Time; attribute (name = '_p__rts_Time'); + + interface + +diff -ru gpc-20040516.orig/p/statements.c gpc-20040516/p/statements.c +--- gpc-20040516.orig/p/statements.c 2004-05-12 02:43:34.000000000 +0200 ++++ gpc-20040516/p/statements.c 2004-07-06 19:08:51.000000000 +0200 +@@ -89,7 +89,16 @@ + /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of OUTPUTS + some trees for where the values were actually stored. */ + if (outputs || inputs || clobbers) ++#ifndef GCC_3_4 + expand_asm_operands (string, outputs, inputs, clobbers, vol, input_filename, lineno); ++#else ++ { ++ location_t loc_aux; ++ loc_aux.file = input_filename; ++ loc_aux.line = lineno; ++ expand_asm_operands (string, outputs, inputs, clobbers, vol, loc_aux); ++ } ++#endif + else + /* @@ GCC since 20021213 wants: + expand_asm (string, vol); +@@ -103,7 +112,7 @@ + for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++) + if (o[i] != TREE_VALUE (tail)) + { +- expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)), 0, VOIDmode, 0); ++ expand_expr_stmt (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail))); + free_temp_slots (); + } + +@@ -814,7 +823,11 @@ + } + + if (TREE_CODE (thing) == VAR_DECL && !DECL_ARTIFICIAL (thing)) ++#ifndef GCC_3_4 + emit_line_note (DECL_SOURCE_FILE (thing), DECL_SOURCE_LINE (thing)); ++#else ++ emit_line_note (DECL_SOURCE_LOCATION (thing)); ++#endif + switch (TREE_CODE (type)) + { + case ARRAY_TYPE: +@@ -1392,9 +1405,19 @@ + check_forward_decls (1); + check_external_objects (current_module->parms); + /* According to the standard the program name is in a separate name +- space, so we use the special name `pascal_main_program'. */ ++ space, so we build a special name for main program. */ ++ /* Does not work when compiled by 2.95.3 + start_implicit_routine (NULL_TREE, get_identifier_with_spelling +- ("pascal_main_program", "main program"), void_type_node, NULL_TREE); ++ (ACONCAT ((IDENTIFIER_POINTER (current_module->assembler_name), ++ "_main_program", NULL)), ++ "main program"), void_type_node, NULL_TREE); ++*/ ++ { ++ char * n = ACONCAT ((IDENTIFIER_POINTER (current_module->assembler_name), ++ "_main_program", NULL)); ++ start_implicit_routine (NULL_TREE, get_identifier_with_spelling ++ (n, "main program"), void_type_node, NULL_TREE); ++ } + do_setjmp (); + } + +@@ -1475,7 +1498,9 @@ + call_no_args (TREE_VALUE (current_module->initializers), 1); + + /* Call the Pascal main program. */ +- call_no_args (get_identifier ("pascal_main_program"), 0); ++ call_no_args (get_identifier ( ACONCAT (( ++ IDENTIFIER_POINTER (current_module->assembler_name), ++ "_main_program" , NULL))), 0); + + /* Call the RTS finalization routine. */ + call_no_args (get_identifier ("_p_finalize"), 1); +@@ -1521,20 +1546,69 @@ + initializers; initializers = TREE_CHAIN (initializers)) + call_no_args (TREE_VALUE (initializers), 1); + ++#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0) ++ ++#ifndef EGCS97 ++#define ISIDNUM(c) (isalnum(c)||(c) == '_') ++#endif ++ + if (extra_inits) + { + char *buffer = alloca (strlen (extra_inits) + 1), *p = extra_inits; ++ char module_name_len[23]; + while (*p) + { + char *q = buffer, *name; + tree t; +- while (*p && *p != ',' && *p != ':') ++ SKIP_WHITE(); ++ if (*p == '\'') ++ { ++ p++; ++ while (*p) ++ { ++ if (*p == '\'') ++ { ++ if (*(p+1) == '\'') ++ p++; ++ else ++ break; ++ } ++ *q++ = *p++; ++ } ++ *q = 0; ++ if (*p != '\'') ++ error ("unterminated string in `--init-modules'"); ++ else ++ { ++ p++; ++ } ++ name = ACONCAT ((buffer, "_init", NULL)); ++ } ++ else ++ { ++ while (*p && ISIDNUM (*p)) ++ { + if (q == buffer) ++ { ++ if (*p <= '9' && *p >= '0') ++ error("invalid char in name in `--init-modules'"); + *q++ = TOUPPER (*p++); ++ } + else + *q++ = TOLOWER (*p++); ++ } + *q = 0; +- name = ACONCAT (("init_", buffer, NULL)); ++ sprintf(module_name_len, "%ld_", (long)strlen(buffer)); ++ name = ACONCAT (("_p__M", module_name_len, buffer, "_init", NULL)); ++ } ++ SKIP_WHITE (); ++ if (*p && *p != ',' && *p != ':') ++ { ++ error ("invalid char in name in `--init-modules'"); ++ while (*p && *p != ',' && *p != ':') p++; ++ } ++ if (*p) ++ p++; + /* Don't call our own constructor recursively. This check + is redundant currently, since the run_condition flag + prevents the recursion, anyway, but relying on this +@@ -1545,8 +1619,6 @@ + t = TREE_CHAIN (t); + if (!t) + call_no_args (get_identifier (name), 1); +- if (*p) +- p++; + } + } + extra_inits_used = 1; +diff -ru gpc-20040516.orig/p/test/chief18.pas gpc-20040516/p/test/chief18.pas +--- gpc-20040516.orig/p/test/chief18.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/chief18.pas 2002-11-16 21:36:27.000000000 +0100 +@@ -0,0 +1,14 @@ ++{ Qualified identifiers } ++ ++Program Chief18; ++ ++uses ++ one in 'chief18u.pas', ++ two in 'chief18v.pas'; ++ ++begin ++ if positive ( 42 ) and neutral ( 0 ) and negative ( -137 ) then ++ writeln ( 'OK' ) ++ else ++ writeln ( 'failed' ) ++end. +diff -ru gpc-20040516.orig/p/test/dialec5.pas gpc-20040516/p/test/dialec5.pas +--- gpc-20040516.orig/p/test/dialec5.pas 2004-05-14 23:56:16.000000000 +0200 ++++ gpc-20040516/p/test/dialec5.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -8,7 +8,8 @@ + GPC; + {$ifdef HAVE_CRT} + CRT; +- Turbo3; { uses CRT } ++ Turbo3(LowVideo => Turbo3_LowVideo, ++ HighVideo => Turbo3_HighVideo); { uses CRT } + {$endif} + Dos; + DosUnix; +@@ -33,10 +34,14 @@ + {$endif} + Strings; + StringUtils; +- System; ++ System (MaxLongInt => System_MaxLongInt, ++ MemAvail => System_MemAvail, { Memavail is in Turbo3 } ++ MaxAvail => System_MaxAvail); { ditto } + TFDD; + Trap; +- WinDos; ++ WinDos (FindFirst => WinDos_FindFirst, ++ FindNext => WinDos_FindNext, ++ FindClose => WinDos_FindClose); + Dialec5u; + + begin +diff -ru gpc-20040516.orig/p/test/err1.pas gpc-20040516/p/test/err1.pas +--- gpc-20040516.orig/p/test/err1.pas 2004-07-06 19:19:33.000000000 +0200 ++++ gpc-20040516/p/test/err1.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -0,0 +1,3 @@ ++# 1 "error1.pas" 1 ++{ FLAG -x Preprocessed-Pascal } ++{ WRONG } +diff -ru gpc-20040516.orig/p/test/fjf260a.pas gpc-20040516/p/test/fjf260a.pas +--- gpc-20040516.orig/p/test/fjf260a.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf260a.pas 2002-11-16 21:32:20.000000000 +0100 +@@ -0,0 +1,14 @@ ++{ Qualified identifiers } ++ ++program fjf260a; ++ ++uses fjf260u; ++ ++procedure foo; ++begin ++ writeln ('OK') ++end; ++ ++begin ++ foo ++end. +diff -ru gpc-20040516.orig/p/test/fjf260b.pas gpc-20040516/p/test/fjf260b.pas +--- gpc-20040516.orig/p/test/fjf260b.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf260b.pas 2002-11-16 21:32:17.000000000 +0100 +@@ -0,0 +1,9 @@ ++{ Qualified identifiers } ++ ++program fjf260b; ++ ++uses fjf260v, fjf260w; ++ ++begin ++ foo ++end. +diff -ru gpc-20040516.orig/p/test/fjf561.pas gpc-20040516/p/test/fjf561.pas +--- gpc-20040516.orig/p/test/fjf561.pas 2002-09-23 09:39:12.000000000 +0200 ++++ gpc-20040516/p/test/fjf561.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -3,5 +3,5 @@ + uses fjf561u; + + begin +- WriteLn (fjf561u) ++ WriteLn (fjf561u) { WRONG } + end. +diff -ru gpc-20040516.orig/p/test/fjf561u.pas gpc-20040516/p/test/fjf561u.pas +--- gpc-20040516.orig/p/test/fjf561u.pas 2002-09-23 09:39:12.000000000 +0200 ++++ gpc-20040516/p/test/fjf561u.pas 2004-07-06 19:08:51.000000000 +0200 +@@ -3,7 +3,7 @@ + interface + + const +- fjf561u = 'OK'; ++ fjf561u = 'failed'; + + implementation + +diff -ru gpc-20040516.orig/p/test/fjf921a.pas gpc-20040516/p/test/fjf921a.pas +--- gpc-20040516.orig/p/test/fjf921a.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921a.pas 2004-04-07 20:14:29.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921a; ++ ++import fjf921m; { WRONG } ++ ++begin ++ ++end. +diff -ru gpc-20040516.orig/p/test/fjf921b.pas gpc-20040516/p/test/fjf921b.pas +--- gpc-20040516.orig/p/test/fjf921b.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921b.pas 2004-04-07 20:41:25.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921b; ++ ++import fjf921n; ++ ++begin ++ WriteLn (a) ++end. +diff -ru gpc-20040516.orig/p/test/fjf921c2.pas gpc-20040516/p/test/fjf921c2.pas +--- gpc-20040516.orig/p/test/fjf921c2.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921c2.pas 2004-04-07 20:39:00.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921c2; ++ ++import fjf921o; ++ ++begin ++ WriteLn ('failed ', a) { WRONG } ++end. +diff -ru gpc-20040516.orig/p/test/fjf921c.pas gpc-20040516/p/test/fjf921c.pas +--- gpc-20040516.orig/p/test/fjf921c.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921c.pas 2004-04-07 20:38:36.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921c; ++ ++import fjf921o; ++ ++begin ++ if b = c then WriteLn (b) else WriteLn ('failed') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921d.pas gpc-20040516/p/test/fjf921d.pas +--- gpc-20040516.orig/p/test/fjf921d.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921d.pas 2004-04-13 19:26:42.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921d; ++ ++import fjf921p; ++ ++begin ++ if b = a then WriteLn (b) else WriteLn ('failed') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921e2.pas gpc-20040516/p/test/fjf921e2.pas +--- gpc-20040516.orig/p/test/fjf921e2.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921e2.pas 2004-04-15 03:23:38.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921e2; ++ ++import fjf921q; ++ ++begin ++ WriteLn ('failed ', a) { WRONG } ++end. +diff -ru gpc-20040516.orig/p/test/fjf921e.pas gpc-20040516/p/test/fjf921e.pas +--- gpc-20040516.orig/p/test/fjf921e.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921e.pas 2004-04-15 03:23:26.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921e; ++ ++import fjf921q; ++ ++begin ++ WriteLn (b) ++end. +diff -ru gpc-20040516.orig/p/test/fjf921f.pas gpc-20040516/p/test/fjf921f.pas +--- gpc-20040516.orig/p/test/fjf921f.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921f.pas 2004-05-05 11:36:35.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921f; ++ ++import fjf921r2; ++ ++begin ++ if b = Succ (a) then WriteLn ('OK') else WriteLn ('failed') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921g2.pas gpc-20040516/p/test/fjf921g2.pas +--- gpc-20040516.orig/p/test/fjf921g2.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921g2.pas 2004-05-05 11:29:44.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921g2; ++ ++import fjf921s2; ++ ++begin ++ WriteLn ('failed ', Ord (c)) { WRONG } ++end. +diff -ru gpc-20040516.orig/p/test/fjf921g.pas gpc-20040516/p/test/fjf921g.pas +--- gpc-20040516.orig/p/test/fjf921g.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921g.pas 2004-05-05 11:29:28.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921g; ++ ++import fjf921s2; ++ ++begin ++ if b = Succ (a) then WriteLn ('OK') else WriteLn ('failed') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921h.pas gpc-20040516/p/test/fjf921h.pas +--- gpc-20040516.orig/p/test/fjf921h.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921h.pas 2004-05-05 11:31:16.000000000 +0200 +@@ -0,0 +1,6 @@ ++program fjf921h; ++ ++import fjf921t2; { WRONG } ++ ++begin ++end. +diff -ru gpc-20040516.orig/p/test/fjf921i2.pas gpc-20040516/p/test/fjf921i2.pas +--- gpc-20040516.orig/p/test/fjf921i2.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921i2.pas 2004-07-06 19:59:23.000000000 +0200 +@@ -0,0 +1,8 @@ ++{ FLAG --extended-pascal } ++program fjf921i2; ++ ++import fjf921u; ++ ++begin ++ WriteLn ('failed') { WRONG since `Output' is not implicitly accessble } ++end. +Only in gpc-20040516/p/test: fjf921i2.pas~ +diff -ru gpc-20040516.orig/p/test/fjf921i.pas gpc-20040516/p/test/fjf921i.pas +--- gpc-20040516.orig/p/test/fjf921i.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921i.pas 2004-05-05 11:32:32.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921i; ++ ++import fjf921u; ++ ++begin ++ WriteLn (Output, 'OK') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921j2.pas gpc-20040516/p/test/fjf921j2.pas +--- gpc-20040516.orig/p/test/fjf921j2.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921j2.pas 2004-07-06 20:11:03.000000000 +0200 +@@ -0,0 +1,8 @@ ++{ FLAG --extended-pascal } ++program fjf921j2; ++ ++import fjf921v; ++ ++begin ++ WriteLn (Output, 'failed') { WRONG } ++end. +Only in gpc-20040516/p/test: fjf921j2.pas~ +diff -ru gpc-20040516.orig/p/test/fjf921j3.pas gpc-20040516/p/test/fjf921j3.pas +--- gpc-20040516.orig/p/test/fjf921j3.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921j3.pas 2004-07-06 20:00:03.000000000 +0200 +@@ -0,0 +1,8 @@ ++{ FLAG --extended-pascal } ++program fjf921j3; ++ ++import fjf921v; ++ ++begin ++ WriteLn ('failed') { WRONG since `Output' is not implicitly accessble } ++end. +Only in gpc-20040516/p/test: fjf921j3.pas~ +diff -ru gpc-20040516.orig/p/test/fjf921j.pas gpc-20040516/p/test/fjf921j.pas +--- gpc-20040516.orig/p/test/fjf921j.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921j.pas 2004-05-05 11:33:32.000000000 +0200 +@@ -0,0 +1,7 @@ ++program fjf921j; ++ ++import fjf921v; ++ ++begin ++ WriteLn (Foo, 'OK') ++end. +diff -ru gpc-20040516.orig/p/test/fjf921k.pas gpc-20040516/p/test/fjf921k.pas +--- gpc-20040516.orig/p/test/fjf921k.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/fjf921k.pas 2004-05-05 11:35:00.000000000 +0200 +@@ -0,0 +1,6 @@ ++program fjf921k; ++ ++import fjf921w; { WRONG } ++ ++begin ++end. +diff -ru gpc-20040516.orig/p/test/gpcu_c_c.c gpc-20040516/p/test/gpcu_c_c.c +--- gpc-20040516.orig/p/test/gpcu_c_c.c 2004-03-23 09:04:32.000000000 +0100 ++++ gpc-20040516/p/test/gpcu_c_c.c 2004-07-06 19:08:51.000000000 +0200 +@@ -32,7 +32,7 @@ + + /* External declarations we use from the Pascal code */ + +-extern void init_Gpcu_c_unit (); ++extern void _p__M11_Gpcu_c_unit_init (); + + extern int pascal_unit_variable; + extern void pascal_unit_routine (); +@@ -56,7 +56,7 @@ + + printf ("Calling the Pascal initializers.\n"); + fflush (stdout); +- init_Gpcu_c_unit (); ++ _p__M11_Gpcu_c_unit_init (); + + printf ("Back in C `main'.\n"); + printf ("Incrementing pascal_unit_variable.\n"); +diff -ru gpc-20040516.orig/p/test/grp1.pas gpc-20040516/p/test/grp1.pas +--- gpc-20040516.orig/p/test/grp1.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/grp1.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,12 @@ ++{$extended-pascal} ++program grp1(input, output); ++ ++{Undetected import error. Type identifer 't1' imported through grp1b ++does not denote the same type as type identifier 't1' imported through ++grp1a.} ++ ++import grp1a; grp1b; { WRONG } ++ ++begin ++writeln('FAIL'); ++end. +diff -ru gpc-20040516.orig/p/test/kurzw1.pas gpc-20040516/p/test/kurzw1.pas +--- gpc-20040516.orig/p/test/kurzw1.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/kurzw1.pas 2002-11-16 21:31:15.000000000 +0100 +@@ -0,0 +1,19 @@ ++{ Qualified identifiers } ++ ++program kurzw1; ++ ++uses kurzw1u; ++ ++procedure foo (i : integer); ++begin ++ if i = 42 then WriteLn ('OK') else WriteLn ('failed') ++end; ++ ++procedure bar; ++begin ++ foo (42) ++end; ++ ++begin ++ bar ++end. +diff -ru gpc-20040516.orig/p/test/mod10.pas gpc-20040516/p/test/mod10.pas +--- gpc-20040516.orig/p/test/mod10.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/mod10.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,10 @@ ++program Test(output); ++ ++import ++ ModT10A qualified in 'mod10a.pas'; ++ ModT10B qualified in 'mod10b.pas'; { `qualified' not yet supported } ++ ++begin ++ i := -9; { WRONG } ++ writeln('failed'); ++end. +diff -ru gpc-20040516.orig/p/test/mod13.pas gpc-20040516/p/test/mod13.pas +--- gpc-20040516.orig/p/test/mod13.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod13.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,16 @@ ++program qualid1(Output); ++import mod13u; mod13v; ++var fail : boolean; ++begin ++ fail := false; ++ if (v1 <> 1) or (v2 <> 2) then begin ++ writeln('failed1'); ++ fail := true; ++ end; ++ if f1 or f2 then begin ++ writeln('failed2'); ++ fail := true; ++ end; ++ if not fail then writeln('OK') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod13u1.pas gpc-20040516/p/test/mod13u1.pas +--- gpc-20040516.orig/p/test/mod13u1.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod13u1.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,13 @@ ++module mod13u1; ++export mod13u1=(v2, f2); ++var v2 : integer; ++function f2: boolean; ++end; ++function f2: boolean; ++begin ++ f2 := true ++end; ++to begin do ++ v2 := 12; ++end. ++ +diff -ru gpc-20040516.orig/p/test/mod13u.pas gpc-20040516/p/test/mod13u.pas +--- gpc-20040516.orig/p/test/mod13u.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod13u.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,14 @@ ++module mod13u; ++export mod13u=(v1, f1); ++var v1 : integer; ++function f1: boolean; ++end; ++import mod13u1; ++function f1: boolean; ++begin ++ f1 := (not f2) or (v2<>12) ++end; ++to begin do ++ v1 := 1; ++end. ++ +diff -ru gpc-20040516.orig/p/test/mod13v1.pas gpc-20040516/p/test/mod13v1.pas +--- gpc-20040516.orig/p/test/mod13v1.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod13v1.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,13 @@ ++module mod13v1; ++export mod13v1=(v1, f1); ++var v1 : integer; ++function f1: boolean; ++end; ++function f1: boolean; ++begin ++ f1:= true ++end; ++to begin do ++ v1:=11; ++end. ++ +diff -ru gpc-20040516.orig/p/test/mod13v.pas gpc-20040516/p/test/mod13v.pas +--- gpc-20040516.orig/p/test/mod13v.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod13v.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,14 @@ ++module mod13v; ++export mod13v=(v2, f2); ++var v2 : integer; ++function f2: boolean; ++end; ++import mod13v1; ++function f2: boolean; ++begin ++ f2:= (not f1) or (v1<>11) ++end; ++to begin do ++ v2:=2; ++end. ++ +diff -ru gpc-20040516.orig/p/test/mod14.pas gpc-20040516/p/test/mod14.pas +--- gpc-20040516.orig/p/test/mod14.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod14.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,64 @@ ++program mod14(Output); ++{ FLAG -Wno-warnings } ++import mod14u; ++procedure p0; external name '_p__M6_Mod14v_S0_Pf'; ++procedure p1; external name '_p__M6_Mod14v_S1_myob1_Pb'; ++procedure p2; external name '_p__M6_Mod14v_S2_myob1_P'; ++procedure p3; external name '_p__M6_Mod14v_S3_myob1_Q'; ++function f5 (u, v: integer): integer; ++ external name '_p__M6_Mod14v_S5_Foo_op_Integer_Integer'; ++function f6 (u: integer; v: integer): integer; ++ external name '_p__M6_Mod14v_S6_Foo_op_Myob1_Integer'; ++var ++v7: integer; external name '_p__M6_Mod14v_S7_Ob1a'; ++v8: integer; external name '_p__M6_Mod14v_S8_Ob1b'; ++v9: integer; external name '_p__M6_Mod14v_S9_Ob1c'; ++v10: integer; external name '_p__M6_Mod14v_S10_Va'; ++v11: integer; external name '_p__M6_Mod14v_S11_Vb'; ++v12: integer; external name '_p__M6_Mod14v_S12_Vc'; ++ ++procedure p14; external name '_p__M6_Mod14v_S14_myob2_R'; ++procedure p15; external name '_p__M6_Mod14v_S15_myob2_Q'; ++procedure p16; external name '_p__M6_Mod14v_S16_myob2_P'; ++procedure p17; external name '_p__M6_Mod14v_S17_myob2_S'; ++ ++procedure p19; external name '_p__M6_Mod14v_S19_myob3_P0'; ++procedure p20; external name '_p__M6_Mod14v_S20_myob3_P'; ++procedure p21; external name '_p__M6_Mod14v_S21_myob3_Q'; ++procedure p22; external name '_p__M6_Mod14v_S22_myob3_R'; ++procedure p23; external name '_p__M6_Mod14v_S23_myob3_S'; ++ ++function f25 (u, v: integer): integer; ++ external name '_p__M6_Mod14v_S25_Foo_op_Myob2_Myob3'; ++ ++procedure p26 (function f(u, v: integer): integer); ++ external name '_p__M6_Mod14v_S26_Take'; ++ ++begin ++p26(f25); ++p26(f6); ++p26(f5); ++p23; ++p22; ++p21; ++p20; ++p19; ++p17; ++p16; ++p15; ++p14; ++p3; ++p2; ++p1; ++p0; ++v10 := 5; ++v11 := f5 (v7, v10); ++v12 := f5 (v8, v11); ++v10 := f5 (v9, 7); ++if (v10 = 7) and (v12 = 5) then ++ writeln('OK') ++else ++ writeln('failed') ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod14u.pas gpc-20040516/p/test/mod14u.pas +--- gpc-20040516.orig/p/test/mod14u.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod14u.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,7 @@ ++module mod14u; ++export mod14u=(dummy); ++const dummy = 'dummy'; ++end; ++import mod14v; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod14v.pas gpc-20040516/p/test/mod14v.pas +--- gpc-20040516.orig/p/test/mod14v.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod14v.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,102 @@ ++module mod14v; ++export mod14v=(dummy2); ++const dummy2='dummy2'; ++procedure pf; forward; ++type ++myob1 = object ++ procedure pb; ++ procedure p; virtual; ++ procedure q; virtual; ++end; ++ ++operator foo_op (u, v: integer) w : integer; ++ ++operator foo_op (u: myob1; v: integer) w : integer; ++ ++var ob1a, ob1b, ob1c : myob1; ++ ++var va, vb , vc : integer; ++ ++type ++myob2 = object (myob1) ++ ptr : ^myob3; ++ procedure p0; ++ procedure r; virtual; ++ procedure q; virtual; ++ procedure p; virtual; ++ procedure s; ++end; ++myob3 = object (myob2) ++ procedure p0; ++ procedure p; virtual; ++ procedure q; virtual; ++ procedure r; virtual; ++ procedure s; ++end; ++ ++operator foo_op (u: myob2; v: myob3) w : myob3; ++ ++procedure take(procedure p); ++end; ++{ implementation } ++procedure take(procedure p); ++begin ++end; ++operator foo_op (u: myob2; v : myob3) w : myob3; ++begin ++ w := u.ptr^ ++end; ++operator foo_op (u: myob1; v: integer) w : integer; ++begin ++ w := v ++end; ++operator foo_op (u, v: integer) w : integer; ++begin ++ w := v ++end; ++procedure pf; ++begin ++end; ++procedure myob1.pb; ++begin ++end; ++procedure myob1.p; ++begin ++end; ++procedure myob1.q; ++begin ++end; ++procedure myob2.p0; ++begin ++end; ++procedure myob2.p; ++begin ++end; ++procedure myob2.q; ++begin ++end; ++procedure myob2.s; ++begin ++end; ++procedure myob2.r; ++begin ++end; ++ ++procedure myob3.p0; ++begin ++end; ++procedure myob3.p; ++begin ++end; ++procedure myob3.q; ++begin ++end; ++procedure myob3.s; ++begin ++end; ++procedure myob3.r; ++begin ++end; ++ ++end ++. +diff -ru gpc-20040516.orig/p/test/mod15a.pas gpc-20040516/p/test/mod15a.pas +--- gpc-20040516.orig/p/test/mod15a.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15a.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,8 @@ ++program mod15a; ++ import e1 qualified in 'mod15m.pas'; ++var x : integer; ++begin ++ x := 1; ++ writeln('OK') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod15b.pas gpc-20040516/p/test/mod15b.pas +--- gpc-20040516.orig/p/test/mod15b.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15b.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,7 @@ ++program mod15b; ++ import e1 qualified in 'mod15m.pas'; ++begin ++ e1.x := 1; ++ e1.f(1) ++end ++. +diff -ru gpc-20040516.orig/p/test/mod15c.pas gpc-20040516/p/test/mod15c.pas +--- gpc-20040516.orig/p/test/mod15c.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15c.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,13 @@ ++program mod15c; ++const x = 'OK'; ++procedure p1; ++ import e1 in 'mod15m.pas'; ++begin ++ x := 1; ++ f(1) ++end; ++begin ++ writeln(x) ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15d.pas gpc-20040516/p/test/mod15d.pas +--- gpc-20040516.orig/p/test/mod15d.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15d.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,14 @@ ++program mod15d; ++const x = 'OK'; ++procedure p1; ++ import e1 in 'mod15m.pas'; ++begin ++ x := 1; ++ f(2) ++end; ++begin ++ p1; ++ e1.x := 3; { WRONG } ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15e.pas gpc-20040516/p/test/mod15e.pas +--- gpc-20040516.orig/p/test/mod15e.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15e.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,18 @@ ++program mod15e; ++const x = 'Dummy'; ++procedure p1; ++ import e1 in 'mod15m.pas'; ++begin ++ x := 1; ++end; ++procedure p2; ++ import e1 in 'mod15m.pas'; ++begin ++ f(1) ++end; ++begin ++ p1; ++ p2 ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15f.pas gpc-20040516/p/test/mod15f.pas +--- gpc-20040516.orig/p/test/mod15f.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15f.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,8 @@ ++program mod15f; ++ import e1 qualified in 'mod15m.pas'; ++var e1 : integer; { WRONG } ++begin ++ writeln('failed') ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15g.pas gpc-20040516/p/test/mod15g.pas +--- gpc-20040516.orig/p/test/mod15g.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15g.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,8 @@ ++program mod15g; ++ import e1 qualified in 'mod15m.pas'; ++begin ++ e1 := 1; { WRONG } ++ writeln('failed') ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15h.pas gpc-20040516/p/test/mod15h.pas +--- gpc-20040516.orig/p/test/mod15h.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15h.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,8 @@ ++program mod1; ++ import e1 only(x) in 'mod15m.pas'; ++begin ++ x := 1; ++ e1.f(2) { WRONG } ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod15m.pas gpc-20040516/p/test/mod15m.pas +--- gpc-20040516.orig/p/test/mod15m.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod15m.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,15 @@ ++module m15m; ++ export e1 = (x, f); ++ var x : integer; ++ procedure f(y : integer); ++end; ++procedure f(y : integer); ++begin ++ if x = y then ++ writeln('OK') ++ else ++ writeln('failed') ++end; ++end ++. ++ +diff -ru gpc-20040516.orig/p/test/mod16a.pas gpc-20040516/p/test/mod16a.pas +--- gpc-20040516.orig/p/test/mod16a.pas 2004-07-06 19:17:58.000000000 +0200 ++++ gpc-20040516/p/test/mod16a.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod16a(output); ++import mod16m; mod16m1; ++begin ++ writeln('OK') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16b.pas gpc-20040516/p/test/mod16b.pas +--- gpc-20040516.orig/p/test/mod16b.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16b.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod16b(output); ++import mod16m; mod16m1 only (ci => ce); { WRONG } ++begin ++ writeln('failed') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16c.pas gpc-20040516/p/test/mod16c.pas +--- gpc-20040516.orig/p/test/mod16c.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16c.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod16c(output); ++import mod16m; mod16m1 only (te => ts); { WRONG } ++begin ++ writeln('failed') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16d.pas gpc-20040516/p/test/mod16d.pas +--- gpc-20040516.orig/p/test/mod16d.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16d.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod16d(output); ++import mod16m; mod16m1 only (ve => vs); { WRONG } ++begin ++ writeln('failed') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16e.pas gpc-20040516/p/test/mod16e.pas +--- gpc-20040516.orig/p/test/mod16e.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16e.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod16e(output); ++import mod16m; mod16m1 only (pe => ps); { WRONG } ++begin ++ writeln('failed') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16m1.pas gpc-20040516/p/test/mod16m1.pas +--- gpc-20040516.orig/p/test/mod16m1.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16m1.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod16m1; ++ export mod16m1 = (ci, ce, te, ts, ve, vs, pe, ps); ++ import mod16m; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod16m.pas gpc-20040516/p/test/mod16m.pas +--- gpc-20040516.orig/p/test/mod16m.pas 2004-07-06 19:18:40.000000000 +0200 ++++ gpc-20040516/p/test/mod16m.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,19 @@ ++module mod16m; ++ export mod16m = (ci, ce, te, ts, ve, vs, pe, ps); ++type te = (a, b, c, d); ++ tc = (ca, ce, cf); ++ ts = set of tc; ++const ci = 15; ++var ve : te; ++ vs : ts; ++procedure pe (x : te); ++procedure ps (x : ts); ++end; ++procedure pe; ++begin ++end; ++procedure ps; ++begin ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17a.pas gpc-20040516/p/test/mod17a.pas +--- gpc-20040516.orig/p/test/mod17a.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17a.pas 2004-05-24 18:07:41.000000000 +0200 +@@ -0,0 +1,5 @@ ++program mod17a; ++ import mod17v2; {WRONG} ++begin ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17b.pas gpc-20040516/p/test/mod17b.pas +--- gpc-20040516.orig/p/test/mod17b.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17b.pas 2004-05-24 19:29:05.000000000 +0200 +@@ -0,0 +1,5 @@ ++program mod17b; ++ import mod17v4; {WRONG} ++begin ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17c.pas gpc-20040516/p/test/mod17c.pas +--- gpc-20040516.orig/p/test/mod17c.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17c.pas 2004-05-24 19:28:55.000000000 +0200 +@@ -0,0 +1,5 @@ ++program mod17c; ++ import mod17v6; {WRONG} ++begin ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17d.pas gpc-20040516/p/test/mod17d.pas +--- gpc-20040516.orig/p/test/mod17d.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17d.pas 2004-05-24 20:09:57.000000000 +0200 +@@ -0,0 +1,6 @@ ++program mod17c (Output); ++ import mod17w3; ++begin ++ writeln ('OK') ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v1.pas gpc-20040516/p/test/mod17v1.pas +--- gpc-20040516.orig/p/test/mod17v1.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v1.pas 2004-05-24 18:35:32.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod17v1; ++ export mod17v1 = (a => a, b); ++ type t = (a, b); ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v2.pas gpc-20040516/p/test/mod17v2.pas +--- gpc-20040516.orig/p/test/mod17v2.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v2.pas 2004-05-24 18:35:16.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod17v2; ++ export mod17v2 = (a .. b); { WRONG } ++ import mod17v1; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v3.pas gpc-20040516/p/test/mod17v3.pas +--- gpc-20040516.orig/p/test/mod17v3.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v3.pas 2004-05-24 18:39:14.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod17v3; ++ export mod17v3 = (a => c, b => d); ++ type t = (a, b); ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v4.pas gpc-20040516/p/test/mod17v4.pas +--- gpc-20040516.orig/p/test/mod17v4.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v4.pas 2004-05-24 18:38:54.000000000 +0200 +@@ -0,0 +1,8 @@ ++module mod17v2; ++ export mod17v4 = (a .. b); { WRONG } ++ import mod17v3; ++ const a = c; ++ b = d; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v5.pas gpc-20040516/p/test/mod17v5.pas +--- gpc-20040516.orig/p/test/mod17v5.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v5.pas 2004-05-24 19:27:30.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod17v5; ++ export mod17v5 = (a, b); ++ type t = (a, b); ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17v6.pas gpc-20040516/p/test/mod17v6.pas +--- gpc-20040516.orig/p/test/mod17v6.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17v6.pas 2004-05-24 19:28:17.000000000 +0200 +@@ -0,0 +1,6 @@ ++module mod17v6; ++ export mod17v6 = (mod17v5.a .. mod17v5.b); { WRONG } ++ import qualified mod17v5; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17w1.pas gpc-20040516/p/test/mod17w1.pas +--- gpc-20040516.orig/p/test/mod17w1.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17w1.pas 2004-05-24 20:26:24.000000000 +0200 +@@ -0,0 +1,10 @@ ++module mod17w1; ++ export mod17w1 = (wa => wa, wb); ++ w1i2 = (mod17v5.a, mod17v5.b); ++ w1i3 = (wa); ++ w1i4 = (wb => bb); ++ import mod17v5 qualified; ++ type t = (wa, wb); ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17w2.pas gpc-20040516/p/test/mod17w2.pas +--- gpc-20040516.orig/p/test/mod17w2.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17w2.pas 2004-05-24 20:08:58.000000000 +0200 +@@ -0,0 +1,9 @@ ++module mod17w2; ++ export mod17w2 = (wa .. wb); ++ w2i2 = (a .. b); ++ w2i3 = (wb); ++ w2i4 = (wa => a, wb => b); ++ import mod17w1; w1i2 in 'mod17w1.pas'; w1i3 in 'mod17w1.pas'; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod17w3.pas gpc-20040516/p/test/mod17w3.pas +--- gpc-20040516.orig/p/test/mod17w3.pas 2004-07-06 23:01:29.000000000 +0200 ++++ gpc-20040516/p/test/mod17w3.pas 2004-05-24 20:08:38.000000000 +0200 +@@ -0,0 +1,8 @@ ++module mod17w3; ++ export mod17w3 = (wa => foo); ++ w3i2 = (a .. b); ++ import w1i3 in 'mod17w1.pas'; w2i3 in 'mod17w2.pas'; ++ w2i4 in 'mod17w2.pas'; ++end; ++end ++. +diff -ru gpc-20040516.orig/p/test/mod9.pas gpc-20040516/p/test/mod9.pas +--- gpc-20040516.orig/p/test/mod9.pas 2004-07-06 19:16:15.000000000 +0200 ++++ gpc-20040516/p/test/mod9.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -0,0 +1,9 @@ ++program Test(output); ++ ++import ++ ModT9A in 'mod9a.pas'; ++ ModT9B in 'mod9b.pas'; { WRONG: `i' declared two times. } ++ ++begin ++ writeln('failed'); ++end. +diff -ru gpc-20040516.orig/p/test/pipetes2.pas gpc-20040516/p/test/pipetes2.pas +--- gpc-20040516.orig/p/test/pipetes2.pas 2004-05-14 23:56:23.000000000 +0200 ++++ gpc-20040516/p/test/pipetes2.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -28,7 +28,7 @@ + if Copy (s, Length (s) - 3) = '.out' then s := Copy (s, 1, Length (s) - 4) + '.exe'; + {$endif} + {$local I-} +- Pipe (ToInput, f, f, s, Parameters, GetCEnvironment, Process, nil); ++ MakePipe (ToInput, f, f, s, Parameters, GetCEnvironment, Process, nil); + {$endlocal} + if InOutRes <> 0 then + begin +diff -ru gpc-20040516.orig/p/test/pipetest.pas gpc-20040516/p/test/pipetest.pas +--- gpc-20040516.orig/p/test/pipetest.pas 2004-05-14 23:56:32.000000000 +0200 ++++ gpc-20040516/p/test/pipetest.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -67,7 +67,7 @@ + {$endif} + + {$local I-} +- Pipe (ToInput, FromOutput, FromStdErr, '', Null, GetCEnvironment, Process, DemoProcedure); ++ MakePipe (ToInput, FromOutput, FromStdErr, '', Null, GetCEnvironment, Process, DemoProcedure); + {$endlocal} + if InOutRes <> 0 then + begin +diff -ru gpc-20040516.orig/p/test/test_run gpc-20040516/p/test/test_run +--- gpc-20040516.orig/p/test/test_run 2004-05-15 20:44:11.000000000 +0200 ++++ gpc-20040516/p/test/test_run 2004-07-06 19:11:13.000000000 +0200 +@@ -89,7 +89,7 @@ + exit 1 + fi + +-echo "program Dummy; begin WriteLn ('1723') end." > dummy.pas ++echo "program Dummy(Output); begin WriteLn ('1723') end." > dummy.pas + NEEDED_OPTIONS="`$PC $PFLAGS --print-needed-options dummy.pas 3>&2 2>&1 1>&3`" + if $echon "$NEEDED_OPTIONS" | grep '^[^-]' > /dev/null; then + echo "$0: fatal: \`--print-needed-options' yields:" >&2 +Only in gpc-20040516.orig/p/test/todo: chief18.pas +diff -ru gpc-20040516.orig/p/test/todo/contourbug.pas gpc-20040516/p/test/todo/contourbug.pas +--- gpc-20040516.orig/p/test/todo/contourbug.pas 2002-11-16 21:35:42.000000000 +0100 ++++ gpc-20040516/p/test/todo/contourbug.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -4,7 +4,7 @@ + + program CountourBug; + +-{ Running this program with the command line: ++(* Running this program with the command line: + + gpc --gnu-pascal --stack-checking -S contourbug.pas + +@@ -41,7 +41,7 @@ + to the `goto' and to what GPC does internally with strings. It can + be reproduced in C, using local variables of variable size and a + certain way of using `{ ... }' groups. +-} ++*) + + + procedure p (str: string); +Only in gpc-20040516.orig/p/test/todo: fjf260a.pas +Only in gpc-20040516.orig/p/test/todo: fjf260b.pas +Only in gpc-20040516.orig/p/test/todo: fjf921a.pas +Only in gpc-20040516.orig/p/test/todo: fjf921b.pas +Only in gpc-20040516.orig/p/test/todo: fjf921c2.pas +Only in gpc-20040516.orig/p/test/todo: fjf921c.pas +Only in gpc-20040516.orig/p/test/todo: fjf921d.pas +Only in gpc-20040516.orig/p/test/todo: fjf921e2.pas +Only in gpc-20040516.orig/p/test/todo: fjf921e.pas +Only in gpc-20040516.orig/p/test/todo: fjf921f.pas +Only in gpc-20040516.orig/p/test/todo: fjf921g2.pas +Only in gpc-20040516.orig/p/test/todo: fjf921g.pas +Only in gpc-20040516.orig/p/test/todo: fjf921h.pas +Only in gpc-20040516.orig/p/test/todo: fjf921i2.pas +Only in gpc-20040516.orig/p/test/todo: fjf921i.pas +Only in gpc-20040516.orig/p/test/todo: fjf921j2.pas +Only in gpc-20040516.orig/p/test/todo: fjf921j3.pas +Only in gpc-20040516.orig/p/test/todo: fjf921j.pas +Only in gpc-20040516.orig/p/test/todo: fjf921k.pas +Only in gpc-20040516.orig/p/test/todo: grp1.pas +Only in gpc-20040516.orig/p/test/todo: kurzw1.pas +Only in gpc-20040516.orig/p/test/todo: mod10.pas +Only in gpc-20040516.orig/p/test/todo: mod9.pas +diff -ru gpc-20040516.orig/p/typecheck.c gpc-20040516/p/typecheck.c +--- gpc-20040516.orig/p/typecheck.c 2004-05-12 01:50:17.000000000 +0200 ++++ gpc-20040516/p/typecheck.c 2004-07-06 19:11:13.000000000 +0200 +@@ -1595,8 +1595,9 @@ + && PASCAL_TYPE_DISCRIMINATED_STRING (TREE_TYPE (TREE_OPERAND (TREE_VALUE (init), 0)))) + { + int constant = TREE_CONSTANT (TREE_VALUE (init)); +- TREE_VALUE (init) = build1 (ADDR_EXPR, cstring_type_node, TREE_VALUE ( +- TREE_CHAIN (TREE_CHAIN (TREE_OPERAND (TREE_OPERAND (TREE_VALUE (init), 0), 1))))); ++ tree t = CONSTRUCTOR_ELTS (TREE_OPERAND (TREE_VALUE (init), 0)); ++ TREE_VALUE (init) = build1 (ADDR_EXPR, cstring_type_node, ++ TREE_VALUE ( TREE_CHAIN (TREE_CHAIN (t)))); + TREE_CONSTANT (TREE_VALUE (init)) = constant; + return 0; + } +@@ -1742,7 +1743,11 @@ + { + int i = 0, l = NUMBER_OF_OPERANDS (code); + if (code == CONSTRUCTOR) ++#ifndef GCC_3_4 + i = 1 + !TREE_OPERAND (type_or_expr, 1); ++#else ++ i = !TREE_OPERAND (type_or_expr, 0); ++#endif + for (; i < l; i++) + if (contains_discriminant (TREE_OPERAND (type_or_expr, i), fields)) + return 1; +@@ -1819,7 +1824,7 @@ + tree t; + expr = copy_node (expr); + TREE_OPERAND (expr, 0) = re_fold (TREE_OPERAND (expr, 0), fields, &foreign_discr); +- for (t = TREE_OPERAND (expr, 0); t; t = TREE_CHAIN (t)) ++ for (t = TREE_OPERAND (expr, 1); t; t = TREE_CHAIN (t)) + TREE_VALUE (t) = re_fold (TREE_VALUE (t), fields, &foreign_discr); + if (!foreign_discr) + return fold (expr); +@@ -1834,10 +1839,15 @@ + { + int i = 0, l = tree_code_length[(int) code]; + expr = copy_node (expr); ++#ifndef GCC_3_4 + if (code == METHOD_CALL_EXPR) + l = 3; + else if (code == CONSTRUCTOR) + i = 1 + !TREE_OPERAND (expr, 1); ++#else ++ if (code == CONSTRUCTOR) ++ i = !TREE_OPERAND (expr, 0); ++#endif + for (; i < l; i++) + TREE_OPERAND (expr, i) = re_fold (TREE_OPERAND (expr, i), fields, &foreign_discr); + if (!foreign_discr) +@@ -3289,7 +3299,11 @@ + && TREE_CODE (constructor_max_index) == INTEGER_CST + && !tree_int_cst_lt (constructor_max_index, constructor_unfilled_index)) + error_or_warning (co->pascal_dialect & E_O_PASCAL, "too few initializers for array"); ++#ifndef GCC_3_4 + constructor = build (CONSTRUCTOR, constructor_type, NULL_TREE, nreverse (constructor_elements)); ++#else ++ constructor = build_constructor (constructor_type, nreverse (constructor_elements)); ++#endif + if (constructor_constant) + TREE_CONSTANT (constructor) = 1; + if (constructor_constant && constructor_simple) +diff -ru gpc-20040516.orig/p/types.c gpc-20040516/p/types.c +--- gpc-20040516.orig/p/types.c 2004-05-16 15:52:02.000000000 +0200 ++++ gpc-20040516/p/types.c 2004-07-06 19:11:13.000000000 +0200 +@@ -764,6 +764,18 @@ + return expr; + } + ++/* Since pascal declaration gives a new type we have to defeat ++ caching in `build_pointer_type' */ ++ ++tree ++build_pascal_pointer_type (to_type) ++ tree to_type; ++{ ++ if (TYPE_POINTER_TO (to_type)) ++ to_type = build_type_copy (to_type); ++ return build_pointer_type (to_type); ++} ++ + /* Each variable length string looks like: + + String = record +@@ -950,7 +962,11 @@ + { + int i = 0, l = NUMBER_OF_OPERANDS (code); + if (code == CONSTRUCTOR) ++#ifndef GCC_3_4 + i = 1 + !TREE_OPERAND (expr, 1); ++#else ++ i = !TREE_OPERAND (expr, 0); ++#endif + for (; i < l; i++) + TREE_OPERAND (expr, i) = maybe_schema_discriminant (TREE_OPERAND (expr, i)); + } +diff -ru gpc-20040516.orig/p/units/dos.pas gpc-20040516/p/units/dos.pas +--- gpc-20040516.orig/p/units/dos.pas 2004-01-01 00:09:21.000000000 +0100 ++++ gpc-20040516/p/units/dos.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -62,7 +62,7 @@ + get the built-in meaning by using `GPC_AnyFile'. } + export Dos = all (DosAnyFile => AnyFile, FSearch, FExpand, FSplit, GetEnv); + +-import GPC; System; ++import GPC (MaxLongInt => Orig_GPC_Maxlongint); System; + + type + GPC_AnyFile = AnyFile; +diff -ru gpc-20040516.orig/p/units/gpc-in-c.h gpc-20040516/p/units/gpc-in-c.h +--- gpc-20040516.orig/p/units/gpc-in-c.h 2004-03-23 09:05:25.000000000 +0100 ++++ gpc-20040516/p/units/gpc-in-c.h 2004-07-06 19:11:13.000000000 +0200 +@@ -66,7 +66,8 @@ + and run the constructors of the mentioned unit/module and all + units/modules used by it. + */ +-extern void init_pascal_main_program (); ++#define init_pascal_main_program() _p__M0_init () ++extern void _p__M0_init (); + + /* + _p_finalize() (also part of GPC's Run Time System) should be +diff -ru gpc-20040516.orig/p/units/pipes.pas gpc-20040516/p/units/pipes.pas +--- gpc-20040516.orig/p/units/pipes.pas 2004-05-14 23:54:25.000000000 +0200 ++++ gpc-20040516/p/units/pipes.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -142,7 +142,7 @@ + IOSelectRead) while writing the Input data (under Dos, there + simply won't be any data then, but checking for data doesn't do + any harm). Please see pipedemo.pas for an example. } +-procedure Pipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); attribute (iocritical); ++procedure MakePipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); attribute (iocritical); + + { Waits for a process created by Pipe as determined in the Process + record. (Process is Dispose'd of afterwards.) Returns True if +@@ -317,7 +317,7 @@ + SetTFDD (f, OpenProc, SelectFunc, SelectProc, ReadFunc, WriteFunc, FlushProc, PipeTFDDClose, DoneProc, p) + end; + +-procedure Pipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); ++procedure MakePipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); + var + ParameterCount, i: Cardinal; + PipeStdIn, PipeStdOut, PipeStdErr: Integer; +@@ -542,7 +542,7 @@ + Reset (f) + end; + +-procedure Pipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); ++procedure MakePipe (var ToInputFile, FromOutputFile, FromStdErrFile: AnyFile; const ProcessName: String; protected var Parameters: TPStrings; ProcessEnvironment: PCStrings; var Process: PPipeProcess; ChildProc: TProcedure); + var + i: Cardinal; + PipeData: PPipeData; +diff -ru gpc-20040516.orig/p/units/printer.pas gpc-20040516/p/units/printer.pas +--- gpc-20040516.orig/p/units/printer.pas 2004-05-14 23:55:01.000000000 +0200 ++++ gpc-20040516/p/units/printer.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -126,7 +126,7 @@ + begin + { @@ Check status in Close } + WritePrinter := 0; +- Pipe (Data.f^, Data.SpoolerOutput^, Data.SpoolerOutput^, PrinterCommand^, PrinterArguments^, GetCEnvironment, Process, nil); { this also makes sure this function won't be called again for this file } ++ MakePipe (Data.f^, Data.SpoolerOutput^, Data.SpoolerOutput^, PrinterCommand^, PrinterArguments^, GetCEnvironment, Process, nil); { this also makes sure this function won't be called again for this file } + if InOutRes <> 0 then Exit; + Process^.Signal := PrinterPipeSignal; + Process^.Seconds := PrinterPipeSeconds; +diff -ru gpc-20040516.orig/p/units/turbo3.pas gpc-20040516/p/units/turbo3.pas +--- gpc-20040516.orig/p/units/turbo3.pas 2004-01-01 00:08:10.000000000 +0100 ++++ gpc-20040516/p/units/turbo3.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -43,8 +43,7 @@ + + interface + +-import GPC; +- System (MemAvail => System_MemAvail, ++import System (MemAvail => System_MemAvail, + MaxAvail => System_MaxAvail); + CRT (LowVideo => CRT_LowVideo, + HighVideo => CRT_HighVideo); +@@ -63,6 +62,7 @@ + procedure HighVideo; attribute (name = '_p_HighVideo3'); + + implementation ++import GPC only (AssignTFDD); + + function Kbd_Read (var PrivateData; var Buffer; Size: SizeType) = BytesRead: SizeType; + var +diff -ru gpc-20040516.orig/p/units/windos.pas gpc-20040516/p/units/windos.pas +--- gpc-20040516.orig/p/units/windos.pas 2004-01-01 00:08:07.000000000 +0100 ++++ gpc-20040516/p/units/windos.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -74,10 +74,10 @@ + {$endif} + CStringGetEnv => GetEnvVar); + +-import GPC; System; Dos (FindFirst => Dos_FindFirst, ++import GPC(MaxLongInt => Orig_GPC_Maxlongint); System; ++ Dos (FindFirst => Dos_FindFirst, + FindNext => Dos_FindNext, + FindClose => Dos_FindClose); +- + const + { File attribute constants } + faReadOnly = ReadOnly; +diff -ru gpc-20040516.orig/p/utils/gpidump.pas gpc-20040516/p/utils/gpidump.pas +--- gpc-20040516.orig/p/utils/gpidump.pas 2004-05-12 12:03:06.000000000 +0200 ++++ gpc-20040516/p/utils/gpidump.pas 2004-07-06 19:11:13.000000000 +0200 +@@ -26,7 +26,7 @@ + + program GPIDump; + +-uses GPC, StringUtils; ++import GPC; StringUtils; + + var + Verbose, Hex: Boolean; +@@ -752,7 +752,9 @@ + case TreeCode of + SAVE_EXPR, + WITH_CLEANUP_EXPR: a := 1; ++ {$ifndef GCC_3_4} + METHOD_CALL_EXPR: a := 3; ++ {$endif} + else a := TreeCodes[TreeCode].Arguments + end; + for i := 1 + Ord (TreeCode = CONSTRUCTOR) to a do +@@ -779,7 +781,8 @@ + IMPORT_NODE: begin + Ref ('interface'); + OptRef ('qualifier'); +- OptRef ('filename') ++ OptRef ('filename'); ++ var qualifued : Integer = GetNumber (Pos1); + end; + TREE_LIST: for i := 1 to GetNumber (Pos1) do + begin +diff -ru gpc-20040516.orig/p/utils/mk-t-inc gpc-20040516/p/utils/mk-t-inc +--- gpc-20040516.orig/p/utils/mk-t-inc 2004-01-01 00:07:59.000000000 +0100 ++++ gpc-20040516/p/utils/mk-t-inc 2004-07-06 19:11:13.000000000 +0200 +@@ -71,6 +71,9 @@ + echo '{$define EGCS97}' + if echo $version | grep '3\.[3-9]' > /dev/null; then + echo '{$define GCC_3_3}' ++ if echo $version | grep '3\.[4-9]' > /dev/null; then ++ echo '{$define GCC_3_4}' ++ fi + fi + fi + fi --- gcc-3.4-3.4.2.orig/debian/patches/ada-gcc-lib.dpatch +++ gcc-3.4-3.4.2/debian/patches/ada-gcc-lib.dpatch @@ -0,0 +1,43 @@ +#! /bin/sh -e + +# DP: Change /usr/lib/gcc-lib to /usr/lib/gcc so that the compiler +# DP: finds symboloc links to shared libraries. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/ada/Makefile.adalib~ 2004-07-25 19:59:36.000000000 +0200 ++++ gcc/ada/Makefile.adalib 2004-07-25 19:59:44.000000000 +0200 +@@ -53,9 +53,9 @@ + + target = $(shell $(CC) -dumpmachine) + version = $(shell $(CC) -dumpversion) +-ADA_INCLUDE_PATH = $(GNAT_ROOT)lib/gcc-lib/$(target)/$(version)/adainclude/ +-GCC_INCLUDE_PATH = $(GNAT_ROOT)lib/gcc-lib/$(target)/$(version)/gcc-include/ +-ADA_OBJECTS_PATH = $(GNAT_ROOT)lib/gcc-lib/$(target)/$(version)/adalib/ ++ADA_INCLUDE_PATH = $(GNAT_ROOT)lib/gcc/$(target)/$(version)/adainclude/ ++GCC_INCLUDE_PATH = $(GNAT_ROOT)lib/gcc/$(target)/$(version)/gcc-include/ ++ADA_OBJECTS_PATH = $(GNAT_ROOT)lib/gcc/$(target)/$(version)/adalib/ + + vpath %.adb $(ADA_INCLUDE_PATH) + vpath %.ads $(ADA_INCLUDE_PATH) + --- gcc-3.4-3.4.2.orig/debian/patches/gpc-lang-update.dpatch +++ gcc-3.4-3.4.2/debian/patches/gpc-lang-update.dpatch @@ -0,0 +1,52 @@ +#! /bin/sh -e + +# DP: Hack p/lang.c to work around bootstrap failures on alpha and mips. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/p/lang.c.old 2004-07-30 06:00:30.000000000 +0000 ++++ gcc/p/lang.c 2004-07-30 15:01:48.000000000 +0000 +@@ -34,6 +34,22 @@ + #include "gtype-p.h" + #endif + ++#ifdef GCC_3_4 ++#ifndef c_dialect_cxx ++/* mips and alpha use these macros ... */ ++typedef enum c_language_kind ++{ ++ clk_c = 0, /* C90, C94 or C99 */ ++ clk_objc = 1, /* clk_c with ObjC features. */ ++ clk_cxx = 2, /* ANSI/ISO C++ */ ++ clk_objcxx = 3 /* clk_cxx with ObjC features. */ ++} ++c_language_kind; ++#define c_dialect_cxx() (c_language & clk_cxx) ++#define c_dialect_objc() (c_language & clk_objc) ++#endif ++#endif ++ + /* The following functions are not called from GPC, but needed by + the backend. Depending on the GCC version, they're simply called + as extern, so we can't make them static (yet). */ --- gcc-3.4-3.4.2.orig/debian/patches/cross-configure.dpatch +++ gcc-3.4-3.4.2/debian/patches/cross-configure.dpatch @@ -0,0 +1,48 @@ +#! /bin/sh -e + +# DP: fix configure script to handle both --program-prefix and --program-suffix +# DP: and not to override binutils detected by autoconf + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- configure.in.orig 2004-02-06 10:03:08.000000000 +0300 ++++ configure.in 2004-03-10 00:39:05.000000000 +0300 +@@ -2103,7 +2103,10 @@ + AC_SUBST(RAW_CXX_FOR_TARGET_FOR_RECURSIVE_MAKE) + + # Fix up target tools. +-if test "x${build}" = "x${host}" ; then ++# This is not needed for Debian: binutils are built separately, and ++# USUAL_*_FOR_TARGET macros do cause problems for cross-compiler build ++#if test "x${build}" = "x${host}" ; then ++if false; then + # In this case, the newly built tools can and should be used, + # so we override the results of the autoconf tests. + # This should really only happen when the tools are actually being built, +--- configure.orig 2004-02-06 10:03:08.000000000 +0300 ++++ configure 2004-03-10 00:39:18.000000000 +0300 +@@ -4006,7 +4006,10 @@ + + + # Fix up target tools. +-if test "x${build}" = "x${host}" ; then ++# This is not needed for Debian: binutils are built separately, and ++# USUAL_*_FOR_TARGET macros do cause problems for cross-compiler build ++#if test "x${build}" = "x${host}" ; then ++if false; then + # In this case, the newly built tools can and should be used, + # so we override the results of the autoconf tests. + # This should really only happen when the tools are actually being built, --- gcc-3.4-3.4.2.orig/debian/patches/i386-biarch.dpatch +++ gcc-3.4-3.4.2/debian/patches/i386-biarch.dpatch @@ -0,0 +1,386 @@ +#! /bin/sh -e + +# DP: biarch patches for i386/x86_64 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + cd ${dir}libjava && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +diff -Nurp src.orig/gcc/config/i386/biarch.h src/gcc/config/i386/biarch.h +--- src.orig/gcc/config/i386/biarch.h 1969-12-31 19:00:00.000000000 -0500 ++++ src/gcc/config/i386/biarch.h 2004-08-03 22:01:00.000000000 -0400 +@@ -0,0 +1,26 @@ ++/* Make configure files to produce biarch compiler defaulting to 32bit mode. ++ This file must be included very first, while the OS specific file later ++ to overwrite otherwise wrong defaults. ++ Copyright (C) 2001, 2004 Free Software Foundation, Inc. ++ Contributed by Bo Thorsen . ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++#define TARGET_64BIT_DEFAULT 0 ++#define TARGET_BI_ARCH 1 ++#define DRIVER_SELF_SPECS "%{m64:%{!mtune:-mtune=x86-64}}" +diff -Nurp src.orig/gcc/config/i386/linux.h src/gcc/config/i386/linux.h +--- src.orig/gcc/config/i386/linux.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/gcc/config/i386/linux.h 2004-08-03 22:01:00.000000000 -0400 +@@ -182,6 +182,7 @@ Boston, MA 02111-1307, USA. */ + } \ + } while (0) + ++#ifdef __i386__ + /* Used by crtstuff.c to initialize the base of data-relative relocations. + These are GOT relative on x86, so return the pic register. */ + #ifdef __PIC__ +@@ -201,6 +202,7 @@ Boston, MA 02111-1307, USA. */ + "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \ + : "=d"(BASE)) + #endif ++#endif + + #undef NEED_INDICATE_EXEC_STACK + #define NEED_INDICATE_EXEC_STACK 1 +diff -Nurp src.orig/gcc/config/i386/linux64.h src/gcc/config/i386/linux64.h +--- src.orig/gcc/config/i386/linux64.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/gcc/config/i386/linux64.h 2004-08-03 22:09:04.000000000 -0400 +@@ -19,8 +19,11 @@ along with GCC; see the file COPYING. I + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++#ifndef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (x86-64 Linux/ELF)"); ++#endif + ++#undef TARGET_OS_CPP_BUILTINS + #define TARGET_OS_CPP_BUILTINS() \ + do \ + { \ +@@ -55,6 +58,7 @@ Boston, MA 02111-1307, USA. */ + done. */ + + #undef LINK_SPEC ++#if TARGET_64BIT_DEFAULT + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ +@@ -63,8 +67,22 @@ Boston, MA 02111-1307, USA. */ + %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ + %{static:-static}}" ++#else ++#define LINK_SPEC "%{m64:-m elf_x86_64} %{!m64:-m elf_i386} \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!m64:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{m64:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{static:-static}}" ++#endif + ++#if TARGET_64BIT_DEFAULT + #define MULTILIB_DEFAULTS { "m64" } ++#else ++#define MULTILIB_DEFAULTS { "m32" } ++#endif + + #undef NEED_INDICATE_EXEC_STACK + #define NEED_INDICATE_EXEC_STACK 1 +@@ -79,6 +97,7 @@ Boston, MA 02111-1307, USA. */ + #include + #endif + ++#undef MD_FALLBACK_FRAME_STATE_FOR + #ifdef __x86_64__ + #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ + do { \ +diff -Nurp src.orig/gcc/config/i386/x86-64.h src/gcc/config/i386/x86-64.h +--- src.orig/gcc/config/i386/x86-64.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/gcc/config/i386/x86-64.h 2004-08-03 22:01:00.000000000 -0400 +@@ -47,9 +47,15 @@ Boston, MA 02111-1307, USA. */ + #undef CC1_SPEC + #define CC1_SPEC "%(cc1_cpu) %{profile:-p}" + ++#if TARGET_64BIT_DEFAULT + #undef ASM_SPEC + #define ASM_SPEC "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \ + %{Wa,*:%*} %{m32:--32} %{!m32:--64}" ++#else ++#undef ASM_SPEC ++#define ASM_SPEC "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \ ++ %{Wa,*:%*} %{!m64:--32} %{m64:--64}" ++#endif + + #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ + asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) +diff -Nurp src.orig/gcc/config.gcc src/gcc/config.gcc +--- src.orig/gcc/config.gcc 2004-08-03 22:07:21.000000000 -0400 ++++ src/gcc/config.gcc 2004-08-03 22:07:53.000000000 -0400 +@@ -991,8 +991,10 @@ i[34567]86-*-linux*libc1) # Intel 80386' + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +- tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" +- tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff" ++ tm_file="i386/biarch.h ${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h \ ++ svr4.h linux.h i386/linux.h i386/x86-64.h i386/linux64.h" ++ tmake_file="t-slibgcc-elf-ver t-linux i386/t-linux64" ++ need_64bit_hwint=yes + ;; + x86_64-*-linux*) + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h \ +diff -Nurp src.orig/libffi/Makefile.am src/libffi/Makefile.am +--- src.orig/libffi/Makefile.am 2004-08-03 22:07:21.000000000 -0400 ++++ src/libffi/Makefile.am 2004-08-03 22:01:00.000000000 -0400 +@@ -90,7 +90,7 @@ noinst_LTLIBRARIES = libffi_convenience. + + TARGET_SRC_MIPS_IRIX = src/mips/ffi.c src/mips/o32.S src/mips/n32.S + TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S +-TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_X86 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S + TARGET_SRC_SPARC = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S + TARGET_SRC_ALPHA = src/alpha/ffi.c src/alpha/osf.S +diff -Nurp src.orig/libffi/Makefile.in src/libffi/Makefile.in +--- src.orig/libffi/Makefile.in 2004-08-03 22:07:21.000000000 -0400 ++++ src/libffi/Makefile.in 2004-08-03 22:01:00.000000000 -0400 +@@ -174,7 +174,7 @@ noinst_LTLIBRARIES = libffi_convenience. + + TARGET_SRC_MIPS_IRIX = src/mips/ffi.c src/mips/o32.S src/mips/n32.S + TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S +-TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_X86 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S + TARGET_SRC_SPARC = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S + TARGET_SRC_ALPHA = src/alpha/ffi.c src/alpha/osf.S +@@ -301,7 +301,7 @@ libffi_convenience_la_LIBADD = + @MIPS_IRIX_TRUE@src/mips/n32.lo + @X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo ++@X86_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo src/x86/sysv.lo + @IA64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo +@@ -357,8 +357,8 @@ libffi_la_LIBADD = + @MIPS_IRIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @MIPS_IRIX_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo + @X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ +-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ +-@X86_TRUE@src/x86/sysv.lo ++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \ ++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo + @IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo +diff -Nurp src.orig/libffi/Makefile.am src/libffi/Makefile.am +--- src.orig/libffi/src/x86/ffitarget.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/libffi/src/x86/ffitarget.h 2004-08-03 22:01:00.000000000 -0400 +@@ -33,6 +33,11 @@ + #define X86 + #endif + ++#if defined (X86) && defined (__x86_64__) ++#undef X86 ++#define X86_64 ++#endif ++ + /* ---- Generic type definitions ----------------------------------------- */ + + #ifndef LIBFFI_ASM +diff -Nurp src.orig/libjava/configure.in src/libjava/configure.in +--- src.orig/libjava/configure.in 2004-08-03 22:07:21.000000000 -0400 ++++ src/libjava/configure.in 2004-08-03 22:01:00.000000000 -0400 +@@ -674,16 +674,17 @@ else + AC_DEFINE(HAVE_DLADDR, 1, [Define if you have dladdr()]) + fi + ]) +- if test x"$build" = x"$host"; then +- AC_CHECK_FILES(/proc/self/exe, [ +- AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe])]) +- else +- case $host in +- *-linux*) +- AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe]) +- ;; +- esac +- fi ++ case $host in ++ *-linux*) ++ AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe]) ++ ;; ++ *) ++ if test x"$build" = x"$host"; then ++ AC_CHECK_FILES(/proc/self/exe, [ ++ AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe])]) ++ fi ++ ;; ++ esac + + AM_ICONV + AM_LC_MESSAGES +diff -Nurp src.orig/libjava/include/i386-signal.h src/libjava/include/i386-signal.h +--- src.orig/libjava/include/i386-signal.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/libjava/include/i386-signal.h 2004-08-03 22:01:00.000000000 -0400 +@@ -11,6 +11,10 @@ details. */ + + + #ifndef JAVA_SIGNAL_H ++#ifdef __x86_64__ ++#include "x86_64-signal.h" ++#else ++ + #define JAVA_SIGNAL_H 1 + + #include +@@ -163,6 +167,6 @@ while (0) + * Also, there is at the present time no unwind info in the + * linuxthreads library's signal handlers and so we can't unwind + * through them anyway. */ +- ++#endif /* ! __x86_64__ */ + #endif /* JAVA_SIGNAL_H */ + +diff -Nurp src.orig/libjava/sysdep/i386/locks.h src/libjava/sysdep/i386/locks.h +--- src.orig/libjava/sysdep/i386/locks.h 2004-08-03 22:07:21.000000000 -0400 ++++ src/libjava/sysdep/i386/locks.h 2004-08-03 22:01:00.000000000 -0400 +@@ -24,10 +24,17 @@ compare_and_swap(volatile obj_addr_t *ad + obj_addr_t new_val) + { + char result; +- __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1" +- : "=m"(*addr), "=q"(result) ++#ifdef __x86_64__ ++ __asm__ __volatile__("lock; cmpxchgq %2, %0; setz %1" ++ : "=m"(*(addr)), "=q"(result) + : "r" (new_val), "a"(old), "m"(*addr) + : "memory"); ++#else ++ __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1" ++ : "=m"(*(addr)), "=q"(result) ++ : "r" (new_val), "a"(old), "m"(*addr) ++ : "memory"); ++#endif + return (bool) result; + } + +diff -Nurp src.orig/libtool.m4 src/libtool.m4 +--- src.orig/libtool.m4 2004-08-03 22:07:21.000000000 -0400 ++++ src/libtool.m4 2004-08-03 22:01:00.000000000 -0400 +@@ -189,14 +189,14 @@ ia64-*-hpux*) + rm -rf conftest* + ;; + +-x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ++i[[3456]]86-*-linux*|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in +- x86_64-*linux*) ++ i[[3456]]86-*-linux*|x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) +@@ -212,7 +212,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*li + ;; + *64-bit*) + case $host in +- x86_64-*linux*) ++ i[[3456]]86-*-linux*|x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) +--- src/config-ml.in.orig 2004-08-04 16:21:33.000000000 -0400 ++++ src/config-ml.in 2004-08-04 16:26:39.000000000 -0400 +@@ -296,6 +296,31 @@ + done + fi + ;; ++i[34567]86-*-*) ++ case " $multidirs " in ++ *" 64 "*) ++ ac_configure_args="${ac_configure_args} --host=x86_64-linux" ++ # Setting $host this late is a hack. Some directories can't ++ # handle it, so disable them for now. ++ old_multidirs="${multidirs}" ++ multidirs="" ++ for x in ${old_multidirs}; do ++ case "$x" in ++ *64* ) case ${ml_realsrcdir} in ++ *"libstdc++-v3" ) multidirs="${multidirs} ${x}" ;; ++ *"libf2c" ) multidirs="${multidirs} ${x}" ;; ++ *"libobjc" ) multidirs="${multidirs} ${x}" ;; ++ *"libiberty" ) multidirs="${multidirs} ${x}" ;; ++ *"zlib" ) multidirs="${multidirs} ${x}" ;; ++ *) : ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++ done ++ ;; ++ esac ++ ;; + m68*-*-*) + if [ x$enable_softfloat = xno ] + then +@@ -858,9 +883,20 @@ + fi + fi + ++ ml_configure_args= ++ for arg in ${ac_configure_args} ++ do ++ case $arg in ++ *CC=*) ml_configure_args=${ml_config_env} ;; ++ *CXX=*) ml_configure_args=${ml_config_env} ;; ++ *GCJ=*) ml_configure_args=${ml_config_env} ;; ++ *) ;; ++ esac ++ done ++ + if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \ + --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ +- ${ac_configure_args} ${ml_srcdiroption} ; then ++ ${ac_configure_args} ${ml_configure_args} ${ml_srcdiroption} ; then + true + else + exit 1 --- gcc-3.4-3.4.2.orig/debian/patches/cxx-abi-version-1.dpatch +++ gcc-3.4-3.4.2/debian/patches/cxx-abi-version-1.dpatch @@ -0,0 +1,37 @@ +#! /bin/sh -e + +# DP: set the C++ ABI version to 1 (compatible with gcc-3.3) + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/toplev.c~ 2004-08-19 12:08:25.000000000 +0200 ++++ gcc/toplev.c 2004-08-19 16:53:06.000000000 +0200 +@@ -1014,7 +1014,7 @@ + Additional positive integers will be assigned as new versions of + the ABI become the default version of the ABI. */ + +-int flag_abi_version = 2; ++int flag_abi_version = 1; + + /* The user symbol prefix after having resolved same. */ + const char *user_label_prefix; --- gcc-3.4-3.4.2.orig/debian/patches/libltdl.dpatch +++ gcc-3.4-3.4.2/debian/patches/libltdl.dpatch @@ -0,0 +1,182 @@ +#! /bin/sh -e + +# DP: * libltdl.dpatch: Search the versioned extension, when loading a shared +# DP: library (i.e. gij looks for .so.5 for loading additional libraries +# DP: like the GTK based AWT peers. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: libltdl/acinclude.m4 +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/libltdl/acinclude.m4,v +retrieving revision 1.4.8.1 +diff -u -r1.4.8.1 acinclude.m4 +--- libjava/libltdl/acinclude.m4 24 Jun 2004 05:31:44 -0000 1.4.8.1 ++++ libjava/libltdl/acinclude.m4 7 Sep 2004 18:14:54 -0000 +@@ -6091,6 +6091,9 @@ + if test -n "$libltdl_cv_shlibext"; then + AC_DEFINE_UNQUOTED(LTDL_SHLIB_EXT, "$libltdl_cv_shlibext", + [Define to the extension used for shared libraries, say, ".so".]) ++ libltdl_cv_shlibversionext=.so.`grep -v '^\#' ${srcdir}/../libtool-version | awk -F: '{ print $'1' }'` ++ AC_DEFINE_UNQUOTED(LTDL_SHLIB_VERSION_EXT, "$libltdl_cv_shlibversionext", ++ [Define to the versioned extension used for shared libraries, say, ".so.5".]) + fi + ])# AC_LTDL_SHLIBEXT + +Index: libltdl/config-h.in +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/libltdl/config-h.in,v +retrieving revision 1.3.16.1 +diff -u -r1.3.16.1 config-h.in +--- libjava/libltdl/config-h.in 24 Jun 2004 05:31:45 -0000 1.3.16.1 ++++ libjava/libltdl/config-h.in 7 Sep 2004 18:14:54 -0000 +@@ -158,6 +158,10 @@ + /* Define to the extension used for shared libraries, say, ".so". */ + #undef LTDL_SHLIB_EXT + ++/* Define to the versioned extension used for shared libraries, say, ".so.5". ++ */ ++#undef LTDL_SHLIB_VERSION_EXT ++ + /* Define to the system default library search path. */ + #undef LTDL_SYSSEARCHPATH + +Index: libltdl/configure +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/libltdl/configure,v +retrieving revision 1.10.8.1 +diff -u -r1.10.8.1 configure +--- libjava/libltdl/configure 24 Jun 2004 05:31:46 -0000 1.10.8.1 ++++ libjava/libltdl/configure 7 Sep 2004 18:15:01 -0000 +@@ -19623,6 +19623,12 @@ + #define LTDL_SHLIB_EXT "$libltdl_cv_shlibext" + _ACEOF + ++ libltdl_cv_shlibversionext=.so.`grep -v '^\#' ${srcdir}/../libtool-version | awk -F: '{ print $'1' }'` ++ ++cat >>confdefs.h <<_ACEOF ++#define LTDL_SHLIB_VERSION_EXT "$libltdl_cv_shlibversionext" ++_ACEOF ++ + fi + + +Index: libltdl/ltdl.c +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/libltdl/ltdl.c,v +retrieving revision 1.7 +diff -u -r1.7 ltdl.c +--- libjava/libltdl/ltdl.c 25 Dec 2003 19:33:06 -0000 1.7 ++++ libjava/libltdl/ltdl.c 7 Sep 2004 18:15:02 -0000 +@@ -859,6 +859,7 @@ + static const char objdir[] = LTDL_OBJDIR; + static const char archive_ext[] = LTDL_ARCHIVE_EXT; + #ifdef LTDL_SHLIB_EXT ++static const char shlib_version_ext[] = LTDL_SHLIB_VERSION_EXT; + static const char shlib_ext[] = LTDL_SHLIB_EXT; + #endif + #ifdef LTDL_SYSSEARCHPATH +@@ -2388,17 +2389,14 @@ + cur = *handle; + if (filename) + { +- /* Comment out the check of file permissions using access. +- This call seems to always return -1 with error EACCES. +- */ + /* We need to catch missing file errors early so that +- file_not_found() can detect what happened. ++ file_not_found() can detect what happened. */ + if (access (filename, R_OK) != 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + ++errors; + goto done; +- } */ ++ } + + cur->info.filename = lt_estrdup (filename); + if (!cur->info.filename) +@@ -3425,10 +3423,11 @@ + return 0; + } + +-/* If FILENAME has an ARCHIVE_EXT or SHLIB_EXT extension, try to +- open the FILENAME as passed. Otherwise try appending ARCHIVE_EXT, +- and if a file is still not found try again with SHLIB_EXT appended +- instead. */ ++/* If FILENAME has an ARCHIVE_EXT, SHLIB_VERSION_EXT or SHLIB_EXT ++ extension, try to open the FILENAME as passed. Otherwise try ++ appending ARCHIVE_EXT, and if a file is still not found try again ++ with SHLIB_VERSION_EXT appended. If the file is still not found, ++ try again with SHLIB_EXT appended. */ + lt_dlhandle + lt_dlopenext (filename) + const char *filename; +@@ -3453,6 +3452,7 @@ + to try appending additional extensions. */ + if (ext && ((strcmp (ext, archive_ext) == 0) + #ifdef LTDL_SHLIB_EXT ++ || (strcmp (ext, shlib_version_ext) == 0) + || (strcmp (ext, shlib_ext) == 0) + #endif + )) +@@ -3460,6 +3460,29 @@ + return lt_dlopen (filename); + } + ++#ifdef LTDL_SHLIB_EXT ++ /* First try appending SHLIB_VERSION_EXT. */ ++ tmp = LT_EMALLOC (char, len + LT_STRLEN (shlib_version_ext) + 1); ++ if (!tmp) ++ return 0; ++ ++ strcpy (tmp, filename); ++ strcat(tmp, shlib_version_ext); ++ errors = try_dlopen (&handle, tmp); ++ ++ /* As before, if the file was found but loading failed, return now ++ with the current error message. */ ++ if (handle || ((errors > 0) && !file_not_found ())) ++ { ++ LT_DLFREE (tmp); ++ return handle; ++ } ++ else ++ { ++ LT_DLFREE (tmp); ++ } ++#endif ++ + /* First try appending ARCHIVE_EXT. */ + tmp = LT_EMALLOC (char, len + LT_STRLEN (archive_ext) + 1); + if (!tmp) +@@ -3482,7 +3505,7 @@ + + #ifdef LTDL_SHLIB_EXT + /* Try appending SHLIB_EXT. */ +- if (LT_STRLEN (shlib_ext) > LT_STRLEN (archive_ext)) ++ if (LT_STRLEN (shlib_ext) > LT_STRLEN (shlib_version_ext)) + { + LT_DLFREE (tmp); + tmp = LT_EMALLOC (char, len + LT_STRLEN (shlib_ext) + 1); --- gcc-3.4-3.4.2.orig/debian/patches/pr17186.dpatch +++ gcc-3.4-3.4.2/debian/patches/pr17186.dpatch @@ -0,0 +1,60 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: 2004-09-08 Richard Henderson +# DP: +# DP: PR rtl-opt/17186 +# DP: * function.c (expand_function_end): Have fall-off-the-end +# DP: return path jump around return register setup. + +Index: gcc/function.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/function.c,v +retrieving revision 1.483.4.16 +retrieving revision 1.483.4.17 +diff -u -r1.483.4.16 -r1.483.4.17 +--- gcc/function.c 22 Jun 2004 23:54:02 -0000 1.483.4.16 ++++ gcc/function.c 8 Sep 2004 19:35:42 -0000 1.483.4.17 +@@ -7217,6 +7217,7 @@ + + start_sequence (); + clobber_return_register (); ++ expand_naked_return (); + seq = get_insns (); + end_sequence (); + +@@ -7226,10 +7227,8 @@ + cfun->x_clobber_return_insn = after; + } + +- /* Output the label for the naked return from the function, if one is +- expected. This is currently used only by __builtin_return. */ +- if (naked_return_label) +- emit_label (naked_return_label); ++ /* Output the label for the naked return from the function. */ ++ emit_label (naked_return_label); + + /* ??? This should no longer be necessary since stupid is no longer with + us, but there are some parts of the compiler (eg reload_combine, and --- gcc-3.4-3.4.2.orig/debian/gij-wrapper +++ gcc-3.4-3.4.2/debian/gij-wrapper @@ -0,0 +1,88 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java interpreter. +# +# Command-line arguments should be in the style of Sun's Java runtime; +# these will be converted to gij arguments before being passed to the +# gij itself. +# +# The Debian JNI module directory and any other specified JNI +# directories will be included on the JNI search path. +# +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gij-wrapper-3.2 shell script. + +use strict; + +# The real Java runtime: +my $javaRuntime = '/usr/bin/gij-3.4'; + +# The debian JNI module directory: +my $debianJNIDir = '/usr/lib/jni'; + +# The command-line arguments to pass to the real Java runtime: +my @commandLine; + +# The full JNI search path to use: +my $JNIPath = ''; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; +foreach my $arg (@ARGV) { + if (not $parsingOptions) { + # We're done parsing options; just copy all remaining arguments directly. + push @commandLine, $arg; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-cp' or $arg eq '--cp') { + push @commandLine, '-cp'; + } elsif ($arg eq '-classpath' or $arg eq '--classpath') { + push @commandLine, '-classpath'; + } elsif ($arg =~ /^-Djava.library.path=(.+)$/) { + # A component of the JNI search path has been given. + if ($JNIPath) { + $JNIPath = $JNIPath . ':' . $1; + } else { + $JNIPath = $1; + } + } elsif ($arg eq '-jar' or $arg =~ /^-D/) { + # Copy the argument directly. + push @commandLine, $arg; + } elsif ($arg =~ /^-/) { + # An unrecognised option has been passed - just drop it. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Add the debian JNI module directory to the JNI search path if it's not +# already there. +if ($JNIPath !~ /(^|:)$debianJNIDir($|:)/) { + if ($JNIPath) { + $JNIPath = $JNIPath . ':' . $debianJNIDir; + } else { + $JNIPath = $debianJNIDir; + } +} + +# Use environment variable $LTDL_LIBRARY_PATH to store the JNI path, +# since gij uses libltdl to dlopen JNI modules. +if ($ENV{LTDL_LIBRARY_PATH}) { + $ENV{LTDL_LIBRARY_PATH} = $ENV{LTDL_LIBRARY_PATH} . ':' . $JNIPath; +} else { + $ENV{LTDL_LIBRARY_PATH} = $JNIPath; +} + +# Call the real Java runtime. +my @fullCommandLine = ( $javaRuntime ); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-3.4-3.4.2.orig/debian/README.Bugs +++ gcc-3.4-3.4.2/debian/README.Bugs @@ -0,0 +1,304 @@ +Reporting Bugs in the Debian/GNU GNU Compiler Setup +=================================================== + +Before reporting a bug, please +------------------------------ + +- Check that the behaviour really is a bug. Have a look into some + ANSI standards document. + +- Check the list of well known bugs: http://gcc.gnu.org/bugs.html#known + +- Try to reproduce the bug with a current GCC development snapshot. For + Debian GNU/Linux you can get a recent development snapshot from the + gcc-snapshot package in the unstable distribution. + See: http://packages.debian.org/gcc-snapshot + +- Try to find out if the bug is a regression (an older GCC version does + not show the bug). + +- Check if the bug is already reported in the bug tracking systems. + + Debian: http://bugs.debian.org/debian-gcc@lists.debian.org + Upstream: http://gcc.gnu.org/bugzilla/ + + +Where to report a bug +--------------------- + +Report bugs found in the packaging of GCC to the Debian bug tracking system. +See http://www.debian.org/Bugs/ for instructions (or use the reportbug +script). + +Debian's current policy is to closely follow the upstream development and +only apply a minimal set of patches (which are summarized in the README.Debian +document). + +If you think you have found an upstream bug, you did check the section +above ("Before reporting a bug") and are able to provide a complete bug +report (see below "How to report a bug"), then you may help the Debian +GCC package maintainers, if you report the bug upstream and then submit +a bug report to the Debian BTS and tell us the upstream report number. +This way you are able to follow the upstream bug handling as well. If in +doubt, report the bug to the Debian BTS (but read "How to report a bug" +below. + + +How to report a bug +------------------- + +There are complete instructions in the gcc info manual (found in the +gcc-doc package), section Bugs. + +The manual can be read using `M-x info' in Emacs, or if the GNU info +program is installed on your system by `info --node "(gcc)Bugs"'. Or see +the file BUGS included with the gcc source code. + +Online bug reporting instructions can be found at + + http://gcc.gnu.org/bugs.html + +[Some paragraphs taken from the above URL] + +The main purpose of a bug report is to enable us to fix the bug. The +most important prerequisite for this is that the report must be +complete and self-contained, which we explain in detail below. + +Before you report a bug, please check the list of well-known bugs and, +if possible in any way, try a current development snapshot. + +Summarized bug reporting instructions +------------------------------------- + +What we need + +Please include in your bug report all of the following items, the +first three of which can be obtained from the output of gcc -v: + + * the exact version of GCC; + * the system type; + * the options given when GCC was configured/built; + * the complete command line that triggers the bug; + * the compiler output (error messages, warnings, etc.); and + * the preprocessed file (*.i*) that triggers the bug, generated by + adding -save-temps to the complete compilation command, or, in + the case of a bug report for the GNAT front end, a complete set + of source files (see below). + +What we do not want + + * A source file that #includes header files that are left out + of the bug report (see above) + * That source file and a collection of header files. + * An attached archive (tar, zip, shar, whatever) containing all + (or some :-) of the above. + * A code snippet that won't cause the compiler to produce the + exact output mentioned in the bug report (e.g., a snippet with + just a few lines around the one that apparently triggers the + bug, with some pieces replaced with ellipses or comments for + extra obfuscation :-) + * The location (URL) of the package that failed to build (we won't + download it, anyway, since you've already given us what we need + to duplicate the bug, haven't you? :-) + * An error that occurs only some of the times a certain file is + compiled, such that retrying a sufficient number of times + results in a successful compilation; this is a symptom of a + hardware problem, not of a compiler bug (sorry) + * E-mail messages that complement previous, incomplete bug + reports. Post a new, self-contained, full bug report instead, if + possible as a follow-up to the original bug report + * Assembly files (*.s) produced by the compiler, or any binary files, + such as object files, executables, core files, or precompiled + header files + * Duplicate bug reports, or reports of bugs already fixed in the + development tree, especially those that have already been + reported as fixed last week :-) + * Bugs in the assembler, the linker or the C library. These are + separate projects, with separate mailing lists and different bug + reporting procedures + * Bugs in releases or snapshots of GCC not issued by the GNU + Project. Report them to whoever provided you with the release + * Questions about the correctness or the expected behavior of + certain constructs that are not GCC extensions. Ask them in + forums dedicated to the discussion of the programming language + + +Known Bugs and Non-Bugs +----------------------- + +[Please see /usr/share/doc/gcc/FAQ or http://gcc.gnu.org/faq.html first] + + +C++ exceptions don't work with C libraries +------------------------------------------ + +[Taken from the closed bug report #22769] C++ exceptions don't work +with C libraries, if the C code wasn't designed to be thrown through. +A solution could be to translate all C libraries with -fexceptions. +Mostly trying to throw an exception in a callback function (qsort, +Tcl command callbacks, etc ...). Example: + + #include + #include + + class A {}; + + static + int SortCondition(void const*, void const*) + { + printf("throwing 'sortcondition' exception\n"); + throw A(); + } + + int main(int argc, char *argv[]) + { + int list[2]; + + try { + SortCondition(NULL,NULL); + } catch (A) { + printf("caught test-sortcondition exception\n"); + } + try { + qsort(&list, sizeof(list)/sizeof(list[0]),sizeof(list[0]), + &SortCondition); + } catch (A) { + printf("caught real-sortcondition exception\n"); + } + return 0; +} + +Andrew Macleod responded: + +When compiled with the table driven exception handling, exception can only +be thrown through functions which have been compiled with the table driven EH. +If a function isn't compiled that way, then we do not have the frame +unwinding information required to restore the registers when unwinding. + +I believe the setjmp/longjmp mechanism will throw through things like this, +but its produces much messier code. (-fsjlj-exceptions) + +The C compiler does support exceptions, you just have to turn them on +with -fexceptions. + +Your main options are to: + a) Don't use callbacks, or at least don't throw through them. + b) Get the source and compile the library with -fexceptions (You have to + explicitly turn on exceptions in the C compiler) + c) always use -fsjlj-exceptions (boo, bad choice :-) + + +g++: "undefined reference" to static const array in class +--------------------------------------------------------- + +The following code compiles under GNU C++ 2.7.2 with correct results, +but produces the same linker error with GNU C++ 2.95.2. +Alexandre Oliva responded: + +All of them are correct. A static data member *must* be defined +outside the class body even if it is initialized within the class +body, but no diagnostic is required if the definition is missing. It +turns out that some releases do emit references to the missing symbol, +while others optimize it away. + +#include + +class Test +{ + public: + Test(const char *q); + protected: + static const unsigned char Jam_signature[4] = "JAM"; +}; + +Test::Test(const char *q) +{ + if (memcmp(q, Jam_signature, sizeof(Jam_signature)) != 0) + cerr << "Hello world!\n"; +} + +int main(void) +{ + Test::Test("JAM"); + return 0; +} + +g++: g++ causes passing non const ptr to ptr to a func with const arg + to cause an error (not a bug) +--------------------------------------------------------------------- + +Example: + +#include +void test(const char **b){ + printf ("%s\n",*b); +} +int main(void){ + char *test1="aoeu"; + test(&test1); +} + +make const +g++ const.cc -o const +const.cc: In function `int main()': +const.cc:7: passing `char **' as argument 1 of `test(const char **)' adds cv-quals without intervening `const' +make: *** [const] Error 1 + +Answer from "Martin v. Loewis" : + +> ok... maybe I missed something.. I haven't really kept up with the latest in +> C++ news. But I've never heard anything even remotly close to passing a non +> const var into a const arg being an error before. + +Thanks for your bug report. This is a not a bug in the compiler, but +in your code. The standard, in 4.4/4, puts it that way + +# A conversion can add cv-qualifiers at levels other than the first in +# multi-level pointers, subject to the following rules: +# Two pointer types T1 and T2 are similar if there exists a type T and +# integer n > 0 such that: +# T1 is cv(1,0) pointer to cv(1,1) pointer to ... cv(1,n-1) +# pointer to cv(1,n) T +# and +# T2 is cv(2,0) pointer to cv(2,1) pointer to ... cv(2,n-1) +# pointer to cv(2,n) T +# where each cv(i,j) is const, volatile, const volatile, or +# nothing. The n-tuple of cv-qualifiers after the first in a pointer +# type, e.g., cv(1,1) , cv(1,2) , ... , cv(1,n) in the pointer type +# T1, is called the cv-qualification signature of the pointer type. An +# expression of type T1 can be converted to type T2 if and only if the +# following conditions are satisfied: +# - the pointer types are similar. +# - for every j > 0, if const is in cv(1,j) then const is in cv(2,j) , +# and similarly for volatile. +# - if the cv(1,j) and cv(2,j) are different, then const is in every +# cv(2,k) for 0 < k < j. + +It is the last rule that your code violates. The standard gives then +the following example as a rationale: + +# [Note: if a program could assign a pointer of type T** to a pointer +# of type const T** (that is, if line //1 below was allowed), a +# program could inadvertently modify a const object (as it is done on +# line //2). For example, +# int main() { +# const char c = 'c'; +# char* pc; +# const char** pcc = &pc; //1: not allowed +# *pcc = &c; +# *pc = 'C'; //2: modifies a const object +# } +# - end note] + +If you question this line of reasoning, please discuss it in one of +the public C++ fora first, eg. comp.lang.c++.moderated, or +comp.std.c++. + + +cpp removes blank lines +----------------------- + +With the new cpp, you need to add -traditional to the "cpp -P" args, else +blank lines get removed. + +[EDIT ME: scan Debian bug reports and write some nice summaries ...] --- gcc-3.4-3.4.2.orig/debian/README.treelang +++ gcc-3.4-3.4.2/debian/README.treelang @@ -0,0 +1,11 @@ +Treelang documentation +====================== + +The treelang compiler is called via the `gcc-3.4' command (or via +`gcc', when `gcc-3.4' is the default gcc compiler). + +Documentation for treelang is provided in info format only. You +can read docs in the info format with emacs, xemacs or the info +command: + + info treelang-3.4 --- gcc-3.4-3.4.2.orig/debian/README.libstdc++-baseline.in +++ gcc-3.4-3.4.2/debian/README.libstdc++-baseline.in @@ -0,0 +1,2 @@ +The libstdc++ baseline file is a list of symbols exported by the +libstdc++ library. --- gcc-3.4-3.4.2.orig/debian/README +++ gcc-3.4-3.4.2/debian/README @@ -0,0 +1,58 @@ + The Debian GNU Compiler Collection setup + ======================================== + +Please see the README.Debian in /usr/share/doc/gcc, contained in the +gcc package for a description of the setup of the different compiler +versions. + + +Notes on GCC 3.4 in the sarge distribution +------------------------------------------ + +[package maintainers: when using GCC 3.4 for package building, please + check that your packages still work on platforms with GCC changes + specific for these platforms (hppa, m68k, mips, mipsel, sparc). ] + +GCC 3.4 is included in sarge as a newer compiler version, the system +compiler for sarge is GCC 3.3 (the transition to a newer system compiler +is a post sarge issue). Due to some incompatibilities between +3.3 and 3.4 care should be taken, when some code built by both versions +is linked together (most likely linking against a shared library found +in Debian): + +- C++ code compiled by g++-3.3 and g++-3.4 is not compatible. Applications + using C++ libraries have to make sure that these libraries are rebuilt. + +- On hppa and m68k the exception handling changed from SJLJ to Dwarf2 based + exception handling. This affects C++ and code, which implements it's own + handling. If a library or binary ends up linked against libgcc1 _and_ + libgcc2, something probably won't work. + +- The implementation of the MIPS ABIs has changed. As a result, the code + generated for certain MIPS targets will not be binary compatible with + earlier releases. See http://gcc.gnu.org/gcc-3.4/mips-abi.html + +- The implementation of the SPARC ABIs has changed. As a result, the code + generated will not be binary compatible with earlier releases in certain + cases. See http://gcc.gnu.org/gcc-3.4/sparc-abi.html + + +Maintainers of these packages +----------------------------- + +Matthias Klose +Ray Dassen +Jeff Bailey (hurd-i386) +Joel Baker (netbsd-i386) +Philip Blundell (arm-linux) +Ben Collins (sparc-linux) +Randolph Chung (ia64-linux) +Falk Hueffner (alpha-linux) +Dan Jacobowitz (powerpc-linux) +Ryan Murray (mips*-linux) +Matt Taggart (hppa-linux) +Gerhard Tonn (s390-linux) +Roman Zippel (m68k-linux) +Ludovic Brenta (gnat) + +=============================================================================== --- gcc-3.4-3.4.2.orig/debian/dummy-man.1 +++ gcc-3.4-3.4.2/debian/dummy-man.1 @@ -0,0 +1,29 @@ +.TH @NAME@ 1 "May 24, 2003" @name@ "Debian Free Documentation" +.SH NAME +@name@ \- A program with a man page covered by the GFDL with invariant sections +.SH SYNOPSIS +@name@ [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fB@name@\fR is documented by a man page, which is covered by the "GNU +Free Documentation License" (GFDL) containing invariant sections. +.P +In November 2002, version 1.2 of the GNU Free Documentation License (GNU +FDL) was released by the Free Software Foundation after a long period +of consultation. Unfortunately, some concerns raised by members of the +Debian Project were not addressed, and as such the GNU FDL can apply +to works that do not pass the Debian Free Software Guidelines (DFSG), +and may thus only be included in the non-free component of the Debian +archive, not the Debian distribution itself. + +.SH "SEE ALSO" +.BR http://gcc.gnu.org/onlinedocs/ +for the complete documentation, +.BR http://lists.debian.org/debian-legal/2003/debian-legal-200304/msg00307.html +for a proposed statement of Debian with respect to the GFDL, +.BR gfdl(7) + +.SH AUTHOR +This manual page was written by the Debian GCC maintainers, +for the Debian GNU/Linux system. --- gcc-3.4-3.4.2.orig/debian/TODO +++ gcc-3.4-3.4.2/debian/TODO @@ -0,0 +1,19 @@ +#94955: recheck on mips and 3.3 +#177303: clarify and forward +#180486: update info for 3.3.1 and 3.4 and forward + +- Clean up the sprawl of debian/rules. I'm sure there are neater + ways to do some of it; perhaps split it up into some more files? + Partly done. + +- Build the shared Ada libraries. Be sure, that you they can be used at all... + +- Link the Ada tools with the shared Ada library. + +- The following bugs are still open; please step forward and have a look + at http://bugs.debian.org/debian-gcc@lists.debian.org + Never finished. + +Help needed for the following reports: + +[Needs to be updated] --- gcc-3.4-3.4.2.orig/debian/locale-gen +++ gcc-3.4-3.4.2/debian/locale-gen @@ -0,0 +1,43 @@ +#!/bin/sh + +LOCPATH=`pwd`/locales +export LOCPATH + +[ -d $LOCPATH ] || mkdir -p $LOCPATH + +umask 022 + +echo "Generating locales..." +while read locale charset; do + case $locale in \#*) continue;; esac + [ -n "$locale" -a -n "$charset" ] || continue + echo -n " `echo $locale | sed 's/\([^.\@]*\).*/\1/'`" + echo -n ".$charset" + echo -n `echo $locale | sed 's/\([^\@]*\)\(\@.*\)*/\2/'` + echo -n '...' + if [ -f $LOCPATH/$locale ]; then + input=$locale + else + input=`echo $locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'` + fi + localedef -i $input -c -f $charset $LOCPATH/$locale #-A /etc/locale.alias + echo ' done'; \ +done <= 2.3.2.ds1-13ubuntu1) --- gcc-3.4-3.4.2.orig/debian/gcc-cross.postinst +++ gcc-3.4-3.4.2/debian/gcc-cross.postinst @@ -0,0 +1,7 @@ +#!/bin/sh + +update-alternatives --quiet \ + --install /usr/bin/cross-gcc cross-gcc /usr/bin/cross-gcc-ver 15 \ + --slave /usr/share/man/man1/cross-gcc.1.gz cross-gcc.1.gz /usr/share/man/man1/cross-gcc-ver.1.gz + +exit 0 --- gcc-3.4-3.4.2.orig/debian/copyright +++ gcc-3.4-3.4.2/debian/copyright @@ -0,0 +1,523 @@ +This is the Debian GNU/Linux prepackaged version of the GCC compiler +collection, containing C, C++, Objective-C, Fortran-77, Java, Chill +and Pascal compilers, and the libstdc++ support library. + +The compilers are split into several binary packages: gcc (which has +support for C, g++ (which supports C++), gobjc (which supports +Objective C), g77 (supports Fortran77), gij, gcj (supports Java), chill +(supports Chill) and gpc (supports Pascal). A version of libstdc++-v3 +is also provided. + +Documentation is provided in the packages cpp-3.4-doc, gcc-3.4-doc, +gcj-3.4-doc, g77-3.4-doc and gpc-2.1-3.4-doc. + +This package was put together by the Debian GCC maintainers +, with sources obtained from: + + [NOTE: the current prereleases obtained from the CVS archive] + ftp://gcc.gnu.org/pub/gcc/releases/gcc-3.4.0.tar.bz2 + + http://gnu-pascal.de/alpha/ + +Changes: See changelog.Debian.gz + +GCC is Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, +1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. + +The libstdc++-v3 library is licensed under the terms of the GNU General +Public License, with this special exception: + + As a special exception, you may use this file as part of a free software + library without restriction. Specifically, if other files instantiate + templates or use macros or inline functions from this file, or you compile + this file and link it with other files to produce an executable, this + file does not by itself cause the resulting executable to be covered by + the GNU General Public License. This exception does not however + invalidate any other reasons why the executable file might be covered by + the GNU General Public License. + +gpc is copyright Free Software Foundation, and is licensed under the +GNU General Public License which on Debian GNU/Linux systems can be +found as `/usr/share/common-licenses/GPL'. + +The libgcj library is licensed under the terms of the GNU General +Public License, with this special exception: + + As a special exception, if you link this library with other files + to produce an executable, this library does not by itself cause + the resulting executable to be covered by the GNU General Public + License. This exception does not however invalidate any other + reasons why the executable file might be covered by the GNU + General Public License. + +gcc/libgcc2.c (source for libgcc) has the following addition: + + In addition to the permissions in the GNU General Public License, + the Free Software Foundation gives you unlimited permission to + link the compiled version of this file into combinations with + other programs, and to distribute those combinations without any + restriction coming from the use of this file. (The General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into a combine executable.) + +gcc/unwind-libunwind.c (source for libgcc) has the following addition: + + As a special exception, if you link this library with other files, + some of which are compiled with GCC, to produce an executable, + this library does not by itself cause the resulting executable to + be covered by the GNU General Public License. This exception does + not however invalidate any other reasons why the executable file + might be covered by the GNU General Public License. + + +The documentation is licensed under the GNU Free Documentation License +(v1.2), appended at the end of this file. + + +GNU Free Documentation License +****************************** + + Version 1.2, November 2002 + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it + can be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You + accept the license if you copy, modify or distribute the work in a + way requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. If a section does not fit the above definition of + Secondary then it is not allowed to be designated as Invariant. + The Document may contain zero Invariant Sections. If the Document + does not identify any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup, or absence of + markup, has been arranged to thwart or discourage subsequent + modification by readers is not Transparent. An image format is + not Transparent if used for any substantial amount of text. A + copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML, PostScript or PDF designed for + human modification. Examples of transparent image formats include + PNG, XCF and JPG. Opaque formats include proprietary formats that + can be read and edited only by proprietary word processors, SGML or + XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML, PostScript or PDF + produced by some word processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a computer-network location from + which the general network-using public has access to download + using public-standard network protocols a complete Transparent + copy of the Document, free of added material. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section Entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the + section all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warrany Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided for under this License. Any other + attempt to copy, modify, sublicense or distribute the Document is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. + +ADDENDUM: How to use this License for your documents +==================================================== + + To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. --- gcc-3.4-3.4.2.orig/debian/cpp-BV-doc.postinst +++ gcc-3.4-3.4.2/debian/cpp-BV-doc.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + install-info --quiet --section "Development" "Development" \ + /usr/share/info/cpp-@BV@.info.gz + + install-info --quiet --section "Development" "Development" \ + /usr/share/info/cppinternals-@BV@.info.gz +esac + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/cpp-BV-doc.prerm +++ gcc-3.4-3.4.2/debian/cpp-BV-doc.prerm @@ -0,0 +1,6 @@ +#! /bin/sh -e + +install-info --quiet --remove cpp-@BV@ +install-info --quiet --remove cppinternals-@BV@ + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/g77-BV-doc.doc-base +++ gcc-3.4-3.4.2/debian/g77-BV-doc.doc-base @@ -0,0 +1,14 @@ +Document: g77-@BV@ +Title: The GNU Fortran 77 Compiler +Author: Various +Abstract: This manual documents how to run, install and port `g77', as well as + its new features and incompatibilities, and how to report bugs. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/fortran/g77.html +Files: /usr/share/doc/gcc-@BV@-base/fortran/g77.html + +Format: info +Index: /usr/share/info/g77-@BV@.info.gz +Files: /usr/share/info/g77-@BV@* --- gcc-3.4-3.4.2.orig/debian/g77-BV-doc.postinst +++ gcc-3.4-3.4.2/debian/g77-BV-doc.postinst @@ -0,0 +1,10 @@ +#! /bin/sh -e + +case "$1" in + configure) + install-info --quiet --section "Development" "Development" \ + --description="The GNU Fortran 77 compiler (Version @BV@)." \ + /usr/share/info/g77-@BV@.info +esac + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/g77-BV-doc.prerm +++ gcc-3.4-3.4.2/debian/g77-BV-doc.prerm @@ -0,0 +1,5 @@ +#! /bin/sh -e + +install-info --quiet --remove g77-@BV@ + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcc-BV-doc.postinst +++ gcc-3.4-3.4.2/debian/gcc-BV-doc.postinst @@ -0,0 +1,9 @@ +#! /bin/sh -e + +install-info --quiet --section "Development" "Development" \ + /usr/share/info/gcc-@BV@.info.gz + +install-info --quiet --section "Development" "Development" \ + /usr/share/info/gccint-@BV@.info.gz + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcc-BV-doc.prerm +++ gcc-3.4-3.4.2/debian/gcc-BV-doc.prerm @@ -0,0 +1,6 @@ +#! /bin/sh -e + +install-info --quiet --remove gcc-@BV@ +install-info --quiet --remove gccint-@BV@ + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcj-BV.postinst +++ gcc-3.4-3.4.2/debian/gcj-BV.postinst @@ -0,0 +1,20 @@ +#! /bin/sh -e + +update-alternatives --quiet \ + --install /usr/bin/javac javac /usr/bin/gcj-wrapper-@BV@ 33 \ + --slave /usr/share/man/man1/javac.1.gz \ + javac.1.gz /usr/share/man/man1/gcj-wrapper-@BV@.1.gz \ + --slave /usr/bin/javah javah /usr/bin/gcjh-wrapper-@BV@ \ + --slave /usr/share/man/man1/javah.1.gz javah.1.gz \ + /usr/share/man/man1/gcjh-wrapper-@BV@.1.gz \ +|| true + +if [ -f /usr/share/info/gcj-@BV@.info.gz ]; then + install-info --quiet --section "Development" "Development" \ + /usr/share/info/gcj-@BV@.info.gz +else + # GFDL invariant free + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gcj-BV.prerm +++ gcc-3.4-3.4.2/debian/gcj-BV.prerm @@ -0,0 +1,13 @@ +#! /bin/sh -e + +update-alternatives --remove javac /usr/bin/gcj-wrapper-@BV@ >/dev/null 2>&1 \ + || true + +if [ -f /usr/share/info/gcj-@BV@.info.gz ]; then + install-info --quiet --remove gcj-@BV@ +else + # GFDL invariant free + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gij-BV.postinst +++ gcc-3.4-3.4.2/debian/gij-BV.postinst @@ -0,0 +1,10 @@ +#! /bin/sh -e + +update-alternatives --quiet \ + --install /usr/bin/java java /usr/bin/gij-wrapper-@BV@ 33 \ + --slave /usr/share/man/man1/java.1.gz java.1.gz /usr/share/man/man1/gij-wrapper-@BV@.1.gz \ +|| true + +#DEBHELPER# + +exit 0 --- gcc-3.4-3.4.2.orig/debian/gij-BV.prerm +++ gcc-3.4-3.4.2/debian/gij-BV.prerm @@ -0,0 +1,7 @@ +#! /bin/sh -e + +update-alternatives --remove java /usr/bin/gij-wrapper-@BV@ >/dev/null 2>&1 || true + +#DEBHELPER# + +exit 0 --- gcc-3.4-3.4.2.orig/debian/gnat-BV-doc.postinst +++ gcc-3.4-3.4.2/debian/gnat-BV-doc.postinst @@ -0,0 +1,16 @@ +#! /bin/sh -e + +case "$1" in + configure) + install-info --quiet --section "Development" "Development" \ + --description="GNAT (GNU Ada) User's Guide for Unix Platforms." \ + /usr/share/info/gnat_ugn_unw-@BV@.info + install-info --quiet --section "Development" "Development" \ + --description="GNAT (GNU Ada) Reference Manual." \ + /usr/share/info/gnat_rm-@BV@.info + install-info --quiet --section "Development" "Development" \ + --description="GNAT Coding Style." \ + /usr/share/info/gnat-style-@BV@.info +esac + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gnat-BV-doc.prerm +++ gcc-3.4-3.4.2/debian/gnat-BV-doc.prerm @@ -0,0 +1,7 @@ +#! /bin/sh -e + +install-info --quiet --remove gnat_ugn_unw-@BV@ +install-info --quiet --remove gnat_rm-@BV@ +install-info --quiet --remove gnat-style-@BV@ + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gpc-PV-BV-doc.postinst +++ gcc-3.4-3.4.2/debian/gpc-PV-BV-doc.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +if [ -f /usr/share/info/gpc-@PV@-@BV@.info.gz ]; then + install-info --quiet --section "Development" "Development" \ + --description="The GNU Pascal compiler." \ + /usr/share/info/gpc-@PV@-@BV@.info +else + # GFDL invariant free + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/gpc-PV-BV-doc.prerm +++ gcc-3.4-3.4.2/debian/gpc-PV-BV-doc.prerm @@ -0,0 +1,10 @@ +#! /bin/sh -e + +if [ -f /usr/share/info/gpc-@PV@-@BV@.info.gz ]; then + install-info --quiet --remove gpc-@PV@-@BV@ +else + # GFDL invariant free + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/treelang-BV.doc-base +++ gcc-3.4-3.4.2/debian/treelang-BV.doc-base @@ -0,0 +1,15 @@ +Document: treelang-@BV@ +Title: The GNU Treelang Compiler +Author: Tim Josling +Abstract: This file documents the use and the internals of the GNU Treelang + compiler. At the moment this manual is not incorporated into the main + GCC manual as it is too incomplete. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/treelang/treelang.html +Files: /usr/share/doc/gcc-@BV@-base/treelang/treelang.html + +Format: info +Index: /usr/share/info/treelang-@BV@.info.gz +Files: /usr/share/info/treelang-@BV@* --- gcc-3.4-3.4.2.orig/debian/treelang-BV.postinst +++ gcc-3.4-3.4.2/debian/treelang-BV.postinst @@ -0,0 +1,15 @@ +#! /bin/sh -e + +case "$1" in + configure) + if [ -f /usr/share/info/treelang-@BV@.info.gz ]; then + install-info --quiet --section "Development" "Development" \ + --description="The GNU Treelang compiler." \ + /usr/share/info/treelang-@BV@.info + else + # GFDL invariant free + true + fi +esac + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/treelang-BV.prerm +++ gcc-3.4-3.4.2/debian/treelang-BV.prerm @@ -0,0 +1,10 @@ +#! /bin/sh -e + +if [ -f /usr/share/info/treelang-@BV@.info.gz ]; then + install-info --quiet --remove treelang-@BV@ +else + # GFDL invariant free + true +fi + +#DEBHELPER# --- gcc-3.4-3.4.2.orig/debian/cpp-BV-doc.doc-base.cpp +++ gcc-3.4-3.4.2/debian/cpp-BV-doc.doc-base.cpp @@ -0,0 +1,16 @@ +Document: cpp-@BV@ +Title: The GNU C preprocessor +Author: Various +Abstract: The C preprocessor is a "macro processor" that is used automatically + by the C compiler to transform your program before actual compilation. + It is called a macro processor because it allows you to define "macros", + which are brief abbreviations for longer constructs. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/cpp.html +Files: /usr/share/doc/gcc-@BV@-base/cpp.html + +Format: info +Index: /usr/share/info/cpp-@BV@.info.gz +Files: /usr/share/info/cpp-@BV@* --- gcc-3.4-3.4.2.orig/debian/cpp-BV-doc.doc-base.cppint +++ gcc-3.4-3.4.2/debian/cpp-BV-doc.doc-base.cppint @@ -0,0 +1,17 @@ +Document: cppinternals-@BV@ +Title: The GNU C preprocessor (internals) +Author: Various +Abstract: This brief manual documents the internals of cpplib, and + explains some of the tricky issues. It is intended that, along with + the comments in the source code, a reasonably competent C programmer + should be able to figure out what the code is doing, and why things + have been implemented the way they have. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/cppinternals.html +Files: /usr/share/doc/gcc-@BV@-base/cppinternals.html + +Format: info +Index: /usr/share/info/cppinternals-@BV@.info.gz +Files: /usr/share/info/cppinternals-@BV@* --- gcc-3.4-3.4.2.orig/debian/gcc-BV-doc.doc-base.gcc +++ gcc-3.4-3.4.2/debian/gcc-BV-doc.doc-base.gcc @@ -0,0 +1,14 @@ +Document: gcc-@BV@ +Title: The GNU C and C++ compiler +Author: Various +Abstract: This manual documents how to run, install and port the GNU compiler, + as well as its new features and incompatibilities, and how to report bugs. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/gcc.html +Files: /usr/share/doc/gcc-@BV@-base/gcc.html + +Format: info +Index: /usr/share/info/gcc-@BV@.info.gz +Files: /usr/share/info/gcc-@BV@* --- gcc-3.4-3.4.2.orig/debian/gcc-BV-doc.doc-base.gccint +++ gcc-3.4-3.4.2/debian/gcc-BV-doc.doc-base.gccint @@ -0,0 +1,17 @@ +Document: gccint-@BV@ +Title: Internals of the GNU C and C++ compiler +Author: Various +Abstract: This manual documents the internals of the GNU compilers, + including how to port them to new targets and some information about + how to write front ends for new languages. It corresponds to GCC + version @BV@.x. The use of the GNU compilers is documented in a + separate manual. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/gccint.html +Files: /usr/share/doc/gcc-@BV@-base/gccint.html + +Format: info +Index: /usr/share/info/gccint-@BV@.info.gz +Files: /usr/share/info/gccint-@BV@* --- gcc-3.4-3.4.2.orig/debian/gcj-BV.doc-base +++ gcc-3.4-3.4.2/debian/gcj-BV.doc-base @@ -0,0 +1,15 @@ +Document: gcj-@BV@ +Title: The GNU Ahead-of-time Compiler for the Java Language +Author: Various +Abstract: This manual describes how to use gcj, the GNU compiler for + the Java programming language. gcj can generate both .class files and + object files, and it can read both Java source code and .class files. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/java/gcj.html +Files: /usr/share/doc/gcc-@BV@-base/java/gcj.html + +Format: info +Index: /usr/share/info/gcj-@BV@.info.gz +Files: /usr/share/info/gcj-@BV@* --- gcc-3.4-3.4.2.orig/debian/gnat-BV-doc.doc-base.rm +++ gcc-3.4-3.4.2/debian/gnat-BV-doc.doc-base.rm @@ -0,0 +1,16 @@ +Document: gnat_rm-@BV@ +Title: GNAT (GNU Ada) Reference Manual +Author: Various +Abstract: This manual contains useful information in writing programs + using the GNAT compiler. It includes information on implementation + dependent characteristics of GNAT, including all the information + required by Annex M of the standard. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/Ada/gnat_rm.html +Files: /usr/share/doc/gcc-@BV@-base/Ada/gnat_rm.html + +Format: info +Index: /usr/share/info/gnat_rm-@BV@.info.gz +Files: /usr/share/info/gnat_rm-@BV@* --- gcc-3.4-3.4.2.orig/debian/gnat-BV-doc.doc-base.style +++ gcc-3.4-3.4.2/debian/gnat-BV-doc.doc-base.style @@ -0,0 +1,16 @@ +Document: gnat-style-@BV@ +Title: GNAT Coding Style +Author: Various +Abstract: Most of GNAT is written in Ada using a consistent style to + ensure readability of the code. This document has been written to + help maintain this consistent style, while having a large group of + developers work on the compiler. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/Ada/gnat-style.html +Files: /usr/share/doc/gcc-@BV@-base/Ada/gnat-style.html + +Format: info +Index: /usr/share/info/gnat-style-@BV@.info.gz +Files: /usr/share/info/gnat-style-@BV@* --- gcc-3.4-3.4.2.orig/debian/gnat-BV-doc.doc-base.ug +++ gcc-3.4-3.4.2/debian/gnat-BV-doc.doc-base.ug @@ -0,0 +1,16 @@ +Document: gnat_ugn_unw-@BV@ +Title: GNAT User's Guide for Unix Platforms +Author: Various +Abstract: This guide describes the use of GNAT, a compiler and + software development toolset for the full Ada 95 programming language. + It describes the features of the compiler and tools, and details how + to use them to build Ada 95 applications. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/Ada/gnat_ugn_unw.html +Files: /usr/share/doc/gcc-@BV@-base/Ada/gnat_ugn_unw.html + +Format: info +Index: /usr/share/info/gnat_ugn_unw-@BV@.info.gz +Files: /usr/share/info/gnat_ugn_unw-@BV@* --- gcc-3.4-3.4.2.orig/debian/gpc-PV-BV-doc.doc-base.gpc +++ gcc-3.4-3.4.2/debian/gpc-PV-BV-doc.doc-base.gpc @@ -0,0 +1,15 @@ +Document: gpc-@PV@-@BV@-doc +Title: The GNU Pascal Compiler +Author: Various +Abstract: This manual documents how to run, install and maintain the + GNU Pascal compiler (GPC), as well as its new features and + incompatibilities, and how to report bugs. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/pascal/gpc.html +Files: /usr/share/doc/gcc-@BV@-base/pascal/gpc.html + +Format: info +Index: /usr/share/info/gpc-@PV@-@BV@.info.gz +Files: /usr/share/info/gpc-@PV@-@BV@* --- gcc-3.4-3.4.2.orig/debian/gpc-PV-BV-doc.doc-base.gpcs +++ gcc-3.4-3.4.2/debian/gpc-PV-BV-doc.doc-base.gpcs @@ -0,0 +1,23 @@ +Document: gpcs-@PV@-@BV@-doc +Title: The GNU Pascal Coding Standards +Author: Various +Abstract: The GNU Pascal Coding Standards were designed by a group of + GNU Pascal project volunteers. The aim of this document is extending + the GNU Coding Standards with specific information relating Pascal + programming. As a matter of fact, the information contained in the + GNU Coding Standards mainly pertains to programs written in the C + language. On the other hand, they also explain many of the rules and + principles that are useful for writing portable, robust and reliable + programs. Most of those general topics could be shared with this + document with just a few specific notes, thus cross references are + provided which will lead you to the more extensive information + contained in the GNU Coding Standards. +Section: Apps/Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/pascal/gpcs.html +Files: /usr/share/doc/gcc-@BV@-base/pascal/gpcs.html + +Format: info +Index: /usr/share/info/gpcs-@PV@-@BV@.info.gz +Files: /usr/share/info/gpcs-@PV@-@BV@* --- gcc-3.4-3.4.2.orig/debian/README.Debian +++ gcc-3.4-3.4.2/debian/README.Debian @@ -0,0 +1,164 @@ + The Debian GNU Compiler Collection setup + ======================================== + +Please see the README.Debian in /usr/share/doc/gcc, contained in the +gcc package for a description of the setup of the different compiler +versions. + + +Notes on GCC 3.4 in the sarge distribution +------------------------------------------ + +[package maintainers: when using GCC 3.4 for package building, please + check that your packages still work on platforms with GCC changes + specific for these platforms (hppa, m68k, mips, mipsel, sparc). ] + +GCC 3.4 is included in sarge as a newer compiler version, the system +compiler for sarge is GCC 3.3 (the transition to a newer system compiler +is a post sarge issue). Due to some incompatibilities between +3.3 and 3.4 care should be taken, when some code built by both versions +is linked together (most likely linking against a shared library found +in Debian): + +- C++ code compiled by g++-3.3 and g++-3.4 is not compatible. Applications + using C++ libraries have to make sure that these libraries are rebuilt. + +- On hppa and m68k the exception handling changed from SJLJ to Dwarf2 based + exception handling. This affects C++ and code, which implements it's own + handling. If a library or binary ends up linked against libgcc1 _and_ + libgcc2, something probably won't work. + +- The implementation of the MIPS ABIs has changed. As a result, the code + generated for certain MIPS targets will not be binary compatible with + earlier releases. See http://gcc.gnu.org/gcc-3.4/mips-abi.html + +- The implementation of the SPARC ABIs has changed. As a result, the code + generated will not be binary compatible with earlier releases in certain + cases. See http://gcc.gnu.org/gcc-3.4/sparc-abi.html + + +Maintainers of these packages +----------------------------- + +Matthias Klose +Ray Dassen +Jeff Bailey (hurd-i386) +Joel Baker (netbsd-i386) +Philip Blundell (arm-linux) +Ben Collins (sparc-linux) +Randolph Chung (ia64-linux) +Falk Hueffner (alpha-linux) +Dan Jacobowitz (powerpc-linux) +Ryan Murray (mips*-linux) +Matt Taggart (hppa-linux) +Gerhard Tonn (s390-linux) +Roman Zippel (m68k-linux) +Ludovic Brenta (gnat) + +=============================================================================== + +Patches that Debian applied in this version: + +gcc-version: + Add "(Debian )" to the gcc version string + +gcc-textdomain: + Set gettext's domain and textdomain to the versioned package name. + +rename-info-files: + Allow transformations on info file names. Reference the + transformed info file names in the texinfo files. + +libstdc++-pic: + Build and install libstdc++_pic.a library. + +libstdc++-doclink: + adjust hrefs to point to the local documentation + +amd64-specs: + On x86-64 use 64bits mode assembly except with -m32. + +gccbug: + Use sensible-editor instead of vi as fallback editor + +gccbug-posix: + Make gccbug POSIX compliant (patch by David Weinehall) + http://www.opengroup.org/onlinepubs/009695399/utilities/test.html + +hppa-toplevel: + For hppa-linux enable libgcj and dependent libs in the toplevel directory + +hppa-libffi: + libffi support for hppa + +hppa-libjava: + Enable libjava support for hppa + +hppa-libjava-update: + MD_FALLBACK_FRAME_STATE_FOR definition for pa32-linux + +fastjar-update: + Implement fastjar -u (PR 7854). + +java-gui-branch: + Michael Koch + Backport AWT, Swing and GTK peer from java-gui-branch (20040906). + +libltdl: + * libltdl.dpatch: Search the versioned extension, when loading a shared + library (i.e. gij looks for .so.5 for loading additional libraries + like the GTK based AWT peers. + +pr17186: + 2004-09-08 Richard Henderson + + PR rtl-opt/17186 + * function.c (expand_function_end): Have fall-off-the-end + return path jump around return register setup. + +arm-libstdc++-soname: + on amd64 and arm, change libstdc++'s soname. + +cxx-abi-version-1: + set the C++ ABI version to 1 (compatible with gcc-3.3) + +gcj-without-rpath: + don't define runtime link path for java binaries and libraries + +libffi-soversion: + Install libffi with soversion 3. + +ada-link-lib: + - Install the shared Ada libraries as '.so.1', not '.so' to conform + to the Debian policy. + - Don't include a runtime link path (-rpath), when linking binaries. + - Build the shared libraries on hppa-linux. + +ada-gcc-name: + use gcc-3.4 instead of gcc as the command name. + +gpc-3.x: + The gpc patch from the gpc tarball. + +gpc-updates: + Updates from gpc-20030820. + +gpc-parse: + generated gcc/p/parse.[ch] files (using bison-1.875c). + +gpc-names: + versioned gpc names + +gpc-profiled: + Do not build the gpc runtime using -fprofile-generate/-use. + +gpc-lang-update: + Hack p/lang.c to work around bootstrap failures on alpha and mips. + +amd64-biarch: + biarch patches for i386/x86_64 + +link-libs: + +reporting: + Add Debian URL for bug reporting isntructions. --- gcc-3.4-3.4.2.orig/debian/README.cross +++ gcc-3.4-3.4.2/debian/README.cross @@ -0,0 +1,115 @@ +Building cross-compiler Debian packages +--------------------------------------- + +It is possible to build C and C++ cross compilers and support libraries +from gcc-3.4 source package. This document describes how to do so. +Cross-compiler build support is not perfect yet, please send fixes +and improvements to debian-gcc@lists.debian.org ] + + +0. What's wrong with toolchain-source approach + +Package toolchain-source contains sources for binutils and gcc, as well as +some support scripts to build cross-compiler packages. They seem to work. + +However, there is one fundamental problem with this approach. +Gcc package is actively maintained and frequently updated. These updates +do contain bug fixes and improvements, especially for non-x86 architectures. +Cross-compilers built using toolchain-source will not get those fixes unless +toolchain-source package is updated after each binutils and gcc update. +The later is not hapenning in real life. In fact, currently (Jan 2004) +toolchain-source is still for gcc-3.2, although Debian is already using +gcc-3.3 for many months. + +Keeping toolchain-source package up-to-date requires lots of work, and seems +to be a waste of time. It is much better to build cross-compilers directly +from gcc source package. + + +1. What is needed to build a cross-compiler from gcc-3.4 source + +1.1. dpkg-cross package + +Dpkg-cross package contains several tools to manage cross-compile environment. + +It can convert native debian library and lib-dev packages for the target +architecture to binary-all packages that keep libraries and headers under +/usr/$(TARGET)/. + +Also it contains helper tools for cross-compiling debian packages. Some of +these tools are used while building libgcc1 and libstdc++ library packages. +The resulting library packages follow the same convensions as library packages +converted by dpkg-cross. + +Note that dpkg-shlibdeps wrapper provided by dpkg-cross used to have a bug that +caused cross-compiler build to fail if libgcc1-$(TARGET)-cross package is not +installed. This bug was fixed in (unofficial) version 1.14.5 of dpkg-cross, +currently available from http://zigzag.lvk.cs.msu.su/~nikita/debian/. + +1.2. Packages for the Target architecture + +There are two ways of getting the packages you need for compiling to the +target architecture. The simplest way is to use the Debian 'crosshurd' +package to build a system in a directory. crosshurd is like debootstrap +but cross-arch, and works on the Hurd, Linux and FreeBSD. (The name is +historical). You will then need to fix symlinks in lib and usr/lib to be +relative links instead of absolute ones. + +For example: + +lrwxrwxrwx 1 root root 20 2004-05-06 23:02 libcom_err.so -> /lib/libcom_err.so.2 + +Needs to be changed to: + +lrwxrwxrwx 1 root root 20 2004-05-06 23:02 libcom_err.so -> ../../lib/libcom_err.so.2 + +If you choose this method, set the environment variable 'with_sysroot' to +point to the ABSOLUTE PATH where the crosshurd was done. + +Otherwise... + +1.2.0 kernel-headers package for the target architecture + +It is not recommended to use kernel-headers for the host architecture, +because some constants defined in asm/*.h do differ between architectures. + +The easiest way is to convert kernel-headers debian package for the target +architecture using dpkg-cross, and install the resulting package. +Unfortunately, dpkg-cross versions prior to (unofficial) 1.14.1 failed +to process linux-kernel-headers package, so please use newer versions. + +1.2.1 libc for the target architecture + +Although it is possible to build cross-gcc without having target libc +pre-installed, it is somewhat complex, and is not supported by gcc-3.4 source +package. + +The easiest way is to convert libc6, libc6-dev and libdb1-compat debian +packages for the target architecture using dpkg-cross, and install the +resulting packages. + +1.3. cross-binutils for the target + +It is a good idea to use binutils source package to build cross-binutils. +See debian bug report #231707 for patches that make it possible. + +Alternate way to get cross-binutils package is (still) toolchain-source +package. Install it and read /usr/share/doc/toolchain-source/README for more +information. + + +2. Building cross-compiler packages + +Get gcc-3.4 source package. + +Unpack it using dpkg-source -x, and cd to the package directory. + +Set GCC_TARGET environment variable to the target architectire name. + +Run debian/rules control. This will change debian/control file, adjusting +build-depends. + +Build the package using dpkg-buildpackage. + +-- +Nikita V. Youshchenko --- gcc-3.4-3.4.2.orig/debian/NEWS.gcc +++ gcc-3.4-3.4.2/debian/NEWS.gcc @@ -0,0 +1,1629 @@ + +GCC 3.4 Release Series - Changes, New Features, and Fixes +========================================================= + +The latest release in the 3.4 release series is GCC 3.4.0. + +Caveats +======= + +- GNU Make is now required to build GCC. + +- With -nostdinc the preprocessor used to ignore both standard include + paths and include paths contained in environment variables. It was + neither documented nor intended that environment variable paths be + ignored, so this has been corrected. + +- GCC no longer accepts the options -fvolatile, -fvolatile-global and + -fvolatile-static. It is unlikely that they worked correctly in any + 3.x release. + +- GCC no longer ships . Use instead. + +- Support for all the systems obsoleted in GCC 3.3 has been removed + from GCC 3.4. See below for a list of systems which are obsoleted in + this release. + +- GCC now requires an ISO C90 (ANSI C89) C compiler to build. K&R C + compilers will not work. + +- The implementation of the MIPS ABIs has changed. As a result, the + code generated for certain MIPS targets will not be binary compatible + with earlier releases. + +- In previous releases, the MIPS port had a fake "hilo" register with + the user-visible name accum. This register has been removed. + +- The implementation of the SPARC ABIs has changed. As a result, the + code generated will not be binary compatible with earlier releases in + certain cases. + +- The configure option --enable-threads=pthreads has been removed; use + --enable-threads=posix instead, which should have the same effect. + +- Code size estimates used by inlining heuristics for C, Objective-C, + C++ and Java have been redesigned significantly. As a result the + parameters of -finline-insns, --param max-inline-insns-single and + --param max-inline-insns-auto need to be reconsidered. + +- --param max-inline-slope and --param min-inline-insns have been + removed; they are not needed for the new bottom-up inlining + heuristics. + +- The new unit-at-a-time compilation scheme has several compatibility + issues: + + - The order in which functions, variables, and top-level asm + statements are emitted may have changed. Code relying on some + particular ordering needs to be updated. The majority of such + top-level asm statements can be replaced by section attributes. + + - Unreferenced static variables and functions are removed. This may + result in undefined references when an asm statement refers to the + variable/function directly. In that case either the + variable/function shall be listed in asm statement operand or in the + case of top-level asm statements the attribute used shall be used to + force function/variable to be always output and considered as a + possibly used by unknown code. + + For variables the attribute is accepted only by GCC 3.4 and newer, + while for earlier versions it is sufficient to use unused to silence + warnings about the variables not being referenced. To keep code + portable across different GCC versions, you can use appropriate + preprocessor conditionals. + + - Static functions now can use non-standard passing conventions that + may break asm statements calling functions directly. Again the + attribute used shall be used to prevent this behavior. + + As a temporary workaround, -fno-unit-at-a-time can be used, but this + scheme may not be supported by future releases of GCC. + +- GCC 3.4 automatically places zero-initialized variables in the .bss + section on some operating systems. Versions of GNU Emacs up to (and + including) 21.3 will not work correctly when using this optimization; + you can use -fno-zero-initialized-in-bss to disable it. + + +General Optimizer Improvements +============================== + +- Usability of the profile feedback and coverage testing has been + improved. + + - Performance of profiled programs has been improved by faster + profile merging code. + - Better use of the profile feedback for optimization (loop + unrolling and loop peeling). + - File locking support allowing fork() calls and parallel runs of + profiled programs. + - Coverage file format has been redesigned. + - gcov coverage tool has been improved. + - make profiledbootstrap available to build a faster compiler. + + Experiments made on i386 hardware showed an 11% speedup on -O0 and + a 7.5% speedup on -O2 compilation of a large C++ testcase. + + - New value profiling pass enabled via -fprofile-values + - New value profile transformations pass enabled via -fvpt aims to + optimize some code sequences by exploiting knowledge about value + ranges or other properties of the operands. At the moment a + conversion of expensive divisions into cheaper operations has been + implemented. + - New -fprofile-generate and -fprofile-use command line options to + simplify the use of profile feedback. + +- A new unit-at-a-time compilation scheme for C, Objective-C, C++ and + Java which is enabled via -funit-at-a-time (and implied by -O2). In + this scheme a whole file is parsed first and optimized later. The + following basic inter-procedural optimizations are implemented: + + - Removal of unreachable functions and variables + - Discovery of local functions (functions with static linkage whose + address is never taken) + - On i386, these local functions use register parameter passing + conventions. + - Reordering of functions in topological order of the call graph to + enable better propagation of optimizing hints (such as the stack + alignments needed by functions) in the back end. + - Call graph based out-of-order inlining heuristics which allows to + limit overall compilation unit growth (--param inline-unit-growth). + + Overall, the unit-at-a-time scheme produces a 1.3% improvement for + the SPECint2000 benchmark on the i386 architecture (AMD Athlon CPU). + +- More realistic code size estimates used by inlining for C, + Objective-C, C++ and Java. The growth of large functions can now be + limited via --param large-function-insns and --param + large-function-growth. + +- A new cfg-level loop optimizer pass replaces the old loop unrolling + pass and adds two other loop transformations -- loop peeling and loop + unswitching -- and also uses the profile feedback to limit code + growth. (The three optimizations are enabled by -funroll-loops, + -fpeel-loops and -funswitch-loops flags, respectively). + + The old loop unroller still can be enabled by -fold-unroll-loops and + may produce better code in some cases, especially when the webizer + optimization pass is not run. + +- A new web construction pass enabled via -fweb (and implied by -O3) + improves the quality of register allocation, CSE, first scheduling + pass and some other optimization passes by avoiding re-use of pseudo + registers with non-overlapping live ranges. The pass almost always + improves code quality but does make debugging difficult and thus is + not enabled by default by -O2 + + The pass is especially effective as cleanup after code duplication + passes, such as the loop unroller or the tracer. + +- Experimental implementations of superblock or trace scheduling in + the second scheduling pass can be enabled via -fsched2-use-superblocks + and -fsched2-use-traces, respectively. + + +New Languages and Language specific improvements +================================================ + +Ada +--- + +- The Ada front end has been updated to include numerous bug fixes and + enhancements. These include: + + - Improved project file support + - Additional set of warnings about potential wrong code + - Improved error messages + - Improved code generation + - Improved cross reference information + - Improved inlining + - Better run-time check elimination + - Better error recovery + - More efficient implementation of unbounded strings + - Added features in GNAT.Sockets, + - GNAT.OS_Lib, GNAT.Debug_Pools, ... + - New GNAT.xxxx packages (e.g. GNAT.Strings, + - GNAT.Exception_Action) + - New pragmas + - New -gnatS switch replacing gnatpsta + - Implementation of new Ada features (in particular limited with, + limited aggregates) + + +C/Objective-C/C++ +----------------- + +- Precompiled headers are now supported. Precompiled headers can + dramatically speed up compilation of some projects. There are some + known defects in the current precompiled header implementation that + will result in compiler crashes in relatively rare situations. + Therefore, precompiled headers should be considered a "technology + preview" in this release. Read the manual for details about how to + use precompiled headers. + +- File handling in the preprocessor has been rewritten. GCC no longer + gets confused by symlinks and hardlinks, and now has a correct + implementation of #import and #pragma once. These two directives have + therefore been un-deprecated. + +- The undocumented extension that allowed C programs to have a label + at the end of a compound statement, which has been deprecated since + GCC 3.0, has been removed. + +- The cast-as-lvalue extension has been removed for C++ and deprecated + for C and Objective-C. In particular, code like this: + + int i; + (char) i = 5; + + or this: + + char *p; + ((int *) p)++; + + is no longer accepted for C++ and will not be accepted for C and + Objective-C in a future version. + +- The conditional-expression-as-lvalue extension has been deprecated + for C and Objective-C. In particular, code like this: + + int a, b, c; + (a ? b : c) = 2; + + will not be accepted for C and Objective-C in a future version. + +- The compound-expression-as-lvalue extension has been deprecated for + C and Objective-C. In particular, code like this: + + int a, b; + (a, b) = 2; + + will not be accepted for C and Objective-C in a future version. A + possible non-intrusive workaround is the following: + + (*(a, &b)) = 2; + +- Several built-in functions such as __builtin_popcount for counting + bits, finding the highest and lowest bit in a word, and parity have + been added. + +- The -fwritable-strings option has been deprecated and will be + removed. + +- Many C math library functions are now recognized as built-ins and + optimized. + +- The C, C++, and Objective-C compilers can now handle source files + written in any character encoding supported by the host C library. + The default input character set is taken from the current locale, and + may be overridden with the -finput-charset command line option. In + the future we will add support for inline encoding markers. + + +C++ +--- + +- G++ is now much closer to full conformance to the ISO/ANSI C++ + standard. This means, among other things, that a lot of invalid + constructs which used to be accepted in previous versions will now be + rejected. It is very likely that existing C++ code will need to be + fixed. This document lists some of the most common issues. + +- A hand-written recursive-descent C++ parser has replaced the + YACC-derived C++ parser from previous GCC releases. The new parser + contains much improved infrastructure needed for better parsing of C++ + source codes, handling of extensions, and clean separation (where + possible) between proper semantics analysis and parsing. The new + parser fixes many bugs that were found in the old parser. + +- You must now use the typename and template keywords to disambiguate + dependent names, as required by the C++ standard. + + struct K { + typedef int mytype_t; + }; + + template struct A { + template struct B { + void callme(void); + }; + + template void bar(void) + { + // Use 'typename' to tell the parser that T1::mytype_t names + // a type. This is needed because the name is dependent (in + // this case, on template parameter T1). + typename T1::mytype_t x; + x = 0; + } + }; + + template void template_func(void) + { + // Use 'template' to prefix member templates within + // dependent types (a has type A, which depends on + // the template parameter T). + A a; + a.template bar<0>(); + + // Use 'template' to tell the parser that B is a nested + // template class (dependent on template parameter T), and + // 'typename' because the whole A::B is + // the name of a type (again, dependent). + typename A::template B b; + b.callme(); + } + + void non_template_func(void) + { + // Outside of any template class or function, no names can be + // dependent, so the use of the keyword 'typename' and 'template' + // is not needed (and actually forbidden). + A a; + a.bar<0>(); + A::B b; + b.callme(); + } + +- In a template definition, unqualified names will no longer find + members of a dependent base. For example, + + template struct B { + int m; + int n; + int f (); + int g (); + }; + int n; + int g (); + template struct C : B { + void g () + { + m = 0; // error + f (); // error + n = 0; // ::n is modified + g (); // ::g is called + } + }; + + You must make the names dependent by prefixing them with + this->. Here is the corrected definition of C::g, + + template void C::g () + { + this->m = 0; + this->f (); + this->n = 0 + this->g (); + } + +- In templates, all non-dependent names are now looked up and bound at + definition time (while parsing the code), instead of later when the + template is instantiated. For instance: + + void foo(int); + + template struct A { + static void bar(void) { + foo('a'); + } + }; + + void foo(char); + + int main() + { + A<0>::bar(); // Calls foo(int), used to call foo(char). + } + + +- In an explicit instantiation of a class template, you must use class + or struct before the template-id: + + + template + class A {}; + + template A<0>; // error, not accepted anymore + template class A<0>; // OK + +- The "named return value" and "implicit typename" extensions have + been removed. + +- Default arguments in function types have been deprecated and will be + removed. + +- ARM-style name-injection of friend declarations has been deprecated + and will be removed. For example: + + struct S { + friend void f(); + }; + + void g() { f(); } + + will not be accepted by future versions of G++; instead a + declaration of "f" will need to be present outside of the scope of "S". + +- Covariant returns are implemented for all but varadic functions that + require an adjustment. + +- When -pedantic is used, G++ now issues errors about spurious + semicolons. For example, + + namespace N {}; // Invalid semicolon. + void f() {}; // Invalid semicolon. + +- G++ no longer accepts attributes for a declarator after the + initializer associated with that declarator. For example, + + X x(1) __attribute__((...)); + is no longer accepted. Instead, use: + + X x __attribute__((...)) (1); + +- Inside the scope of a template class, the name of the class itself + can be treated as either a class or a template. So GCC used to accept + the class name as argument of type template, and template template + parameter. However this is not C++ standard compliant. Now the name + is not treated as a valid template template argument unless you + qualify the name by its scope. For example, the code below no longer + compiles. + + template